summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorXavier Simonart <xavier.simonart@intel.com>2017-12-17 16:46:52 +0100
committerXavier Simonart <xavier.simonart@intel.com>2017-12-18 18:55:34 +0100
commit3fc7bd53eda521cfd428759481964db30883d99f (patch)
tree026f3b9eb09e1767121961f9bcfb7e8b37b4dea4
parent65504ce40edc1a2f5ad154ed7935d93a3650e5b7 (diff)
Add l3 support for tasks without physical tx ports
This adds support for tasks in l3 submode receiving from ports but transmitting to rings. ARP related information is exchanged between tasks through master core. Tasks transmitting to physical ports are responsible to transmit arp related packets. Tasks not transmitting to physical ports (and using rings) should not try to transmit arp packets. Transmitting arp packets through ring would be more complex, as we would need extra information (within the mbuf) to distinguish for instance an arp reply comoing from the network and an arp reply coming from a core (as a reply to an arp request). Change-Id: Ib55dc8c39d5e55703a933faa16bcc008f1274929 Signed-off-by: Xavier Simonart <xavier.simonart@intel.com>
-rw-r--r--VNFs/DPPD-PROX/main.c9
-rw-r--r--VNFs/DPPD-PROX/task_init.c4
2 files changed, 5 insertions, 8 deletions
diff --git a/VNFs/DPPD-PROX/main.c b/VNFs/DPPD-PROX/main.c
index 2c362d6c..2c8517f0 100644
--- a/VNFs/DPPD-PROX/main.c
+++ b/VNFs/DPPD-PROX/main.c
@@ -148,6 +148,7 @@ static void check_missing_rx(void)
if (strcmp(targ->sub_mode_str, "l3") != 0)
continue;
+ PROX_PANIC((targ->nb_rxports == 0) && (targ->nb_txports == 0), "L3 task must have a RX or a TX port\n");
// If the L3 sub_mode receives from a port, check that there is at least one core/task
// transmitting to this port in L3 sub_mode
for (uint8_t i = 0; i < targ->nb_rxports; ++i) {
@@ -155,10 +156,8 @@ static void check_missing_rx(void)
ok = 0;
tx_lconf = NULL;
while (core_targ_next(&tx_lconf, &tx_targ, 0) == 0) {
- port = find_reachable_port(tx_targ);
- if (port == NULL)
+ if ((port_id = tx_targ->tx_port_queue[0].port) == OUT_DISCARD)
continue;
- port_id = port - prox_port_cfg;
if ((rx_port_id == port_id) && (tx_targ->flags & TASK_ARG_L3)){
ok = 1;
break;
@@ -169,10 +168,8 @@ static void check_missing_rx(void)
// If the L3 sub_mode transmits to a port, check that there is at least one core/task
// receiving from that port in L3 sub_mode.
- port = find_reachable_port(targ);
- if (port == NULL)
+ if ((port_id = targ->tx_port_queue[0].port) == OUT_DISCARD)
continue;
- port_id = port - prox_port_cfg;
rx_lconf = NULL;
ok = 0;
plog_info("\tCore %d task %d transmitting to port %d in L3 mode\n", lconf->id, targ->id, port_id);
diff --git a/VNFs/DPPD-PROX/task_init.c b/VNFs/DPPD-PROX/task_init.c
index 2bc83f39..2361d32c 100644
--- a/VNFs/DPPD-PROX/task_init.c
+++ b/VNFs/DPPD-PROX/task_init.c
@@ -350,7 +350,7 @@ struct task_base *init_task_struct(struct task_args *targ)
offset = init_rx_tx_rings_ports(targ, tbase, offset);
tbase->aux = (struct task_base_aux *)(((uint8_t *)tbase) + offset);
- if ((targ->nb_txrings != 0) || (targ->nb_txports != 0)) {
+ if (targ->nb_txports != 0) {
if (targ->flags & TASK_ARG_L3) {
tbase->aux->tx_pkt_l2 = tbase->tx_pkt;
tbase->tx_pkt = tx_pkt_l3;
@@ -373,7 +373,7 @@ struct task_base *init_task_struct(struct task_args *targ)
plog_info("\tTask configured in L3 mode\n");
tbase->l3.ctrl_plane_ring = targ->ctrl_plane_ring;
}
- if ((targ->nb_txrings != 0) || (targ->nb_txports != 0)) {
+ if (targ->nb_txports != 0) {
if (targ->flags & TASK_ARG_L3)
task_init_l3(tbase, targ);
}