summaryrefslogtreecommitdiffstats
path: root/VNFs/DPPD-PROX/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'VNFs/DPPD-PROX/main.c')
-rw-r--r--VNFs/DPPD-PROX/main.c103
1 files changed, 90 insertions, 13 deletions
diff --git a/VNFs/DPPD-PROX/main.c b/VNFs/DPPD-PROX/main.c
index 28533c78..1c4dced9 100644
--- a/VNFs/DPPD-PROX/main.c
+++ b/VNFs/DPPD-PROX/main.c
@@ -46,6 +46,7 @@
#include "thread_generic.h"
#include "thread_pipeline.h"
#include "cqm.h"
+#include "handle_master.h"
#if RTE_VERSION < RTE_VERSION_NUM(1,8,0,0)
#define RTE_CACHE_LINE_SIZE CACHE_LINE_SIZE
@@ -111,12 +112,27 @@ static void check_mixed_normal_pipeline(void)
}
}
-static void check_missing_rx(void)
+static void check_zero_rx(void)
{
struct lcore_cfg *lconf = NULL;
struct task_args *targ;
while (core_targ_next(&lconf, &targ, 0) == 0) {
+ if (targ->nb_rxports != 0) {
+ PROX_PANIC(task_init_flag_set(targ->task_init, TASK_FEATURE_NO_RX),
+ "\tCore %u task %u: rx_ports configured while mode %s does not use it\n", lconf->id, targ->id, targ->task_init->mode_str);
+ }
+ }
+}
+
+static void check_missing_rx(void)
+{
+ struct lcore_cfg *lconf = NULL, *rx_lconf = NULL;
+ struct task_args *targ, *rx_targ = NULL;
+ struct prox_port_cfg *port;
+ uint8_t port_id, rx_port_id, ok;
+
+ while (core_targ_next(&lconf, &targ, 0) == 0) {
PROX_PANIC((targ->flags & TASK_ARG_RX_RING) && targ->rx_rings[0] == 0 && !targ->tx_opt_ring_task,
"Configuration Error - Core %u task %u Receiving from ring, but nobody xmitting to this ring\n", lconf->id, targ->id);
if (targ->nb_rxports == 0 && targ->nb_rxrings == 0) {
@@ -124,11 +140,39 @@ static void check_missing_rx(void)
"\tCore %u task %u: no rx_ports and no rx_rings configured while required by mode %s\n", lconf->id, targ->id, targ->task_init->mode_str);
}
}
+
+ lconf = NULL;
+ while (core_targ_next(&lconf, &targ, 0) == 0) {
+ if (strcmp(targ->task_init->sub_mode_str, "l3") != 0)
+ continue;
+ port = find_reachable_port(targ);
+ if (port == NULL)
+ 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);
+ while (core_targ_next(&rx_lconf, &rx_targ, 0) == 0) {
+ for (uint8_t i = 0; i < rx_targ->nb_rxports; ++i) {
+ rx_port_id = rx_targ->rx_port_queue[i].port;
+ if ((rx_port_id == port_id) && (rx_targ->task_init->flag_features & TASK_FEATURE_L3)){
+ ok = 1;
+ break;
+ }
+ }
+ if (ok == 1) {
+ plog_info("\tCore %d task %d has found core %d task %d receiving from port %d\n", lconf->id, targ->id, rx_lconf->id, rx_targ->id, port_id);
+ break;
+ }
+ }
+ PROX_PANIC(ok == 0, "L3 sub mode for port %d on core %d task %d, but no core/task receiving on that port\n", port_id, lconf->id, targ->id);
+ }
}
static void check_cfg_consistent(void)
{
check_missing_rx();
+ check_zero_rx();
check_mixed_normal_pipeline();
}
@@ -280,11 +324,6 @@ static const char *gen_ring_name(void)
return retval;
}
-static int task_is_master(struct task_args *targ)
-{
- return !targ->lconf;
-}
-
struct ring_init_stats {
uint32_t n_pkt_rings;
uint32_t n_ctrl_rings;
@@ -332,7 +371,7 @@ static struct rte_ring *get_existing_ring(uint32_t lcore_id, uint32_t task_id)
return lconf->targs[task_id].rx_rings[0];
}
-static void init_ring_between_tasks(struct lcore_cfg *lconf, struct task_args *starg,
+static struct rte_ring *init_ring_between_tasks(struct lcore_cfg *lconf, struct task_args *starg,
const struct core_task ct, uint8_t ring_idx, int idx,
struct ring_init_stats *ris)
{
@@ -377,13 +416,15 @@ static void init_ring_between_tasks(struct lcore_cfg *lconf, struct task_args *s
*dring = ring;
if (lconf->id == prox_cfg.master) {
ctrl_rings[ct.core*MAX_TASKS_PER_CORE + ct.task] = ring;
+ } else if (ct.core == prox_cfg.master) {
+ starg->ctrl_plane_ring = ring;
}
plog_info("\t\tCore %u task %u to -> core %u task %u ctrl_ring %s %p %s\n",
lconf->id, starg->id, ct.core, ct.task, ct.type == CTRL_TYPE_PKT?
"pkt" : "msg", ring, ring->name);
ris->n_ctrl_rings++;
- return;
+ return ring;
}
dtarg = &lworker->targs[ct.task];
@@ -393,7 +434,7 @@ static void init_ring_between_tasks(struct lcore_cfg *lconf, struct task_args *s
/* If all the following conditions are met, the ring can be
optimized away. */
- if (!task_is_master(starg) && starg->lconf->id == dtarg->lconf->id &&
+ if (!task_is_master(starg) && !task_is_master(dtarg) && starg->lconf->id == dtarg->lconf->id &&
starg->nb_txrings == 1 && idx == 0 && dtarg->task &&
dtarg->tot_rxrings == 1 && starg->task == dtarg->task - 1) {
plog_info("\t\tOptimizing away ring on core %u from task %u to task %u\n",
@@ -405,7 +446,7 @@ static void init_ring_between_tasks(struct lcore_cfg *lconf, struct task_args *s
dtarg->tx_opt_ring_task = starg;
ris->n_opt_rings++;
++dtarg->nb_rxrings;
- return;
+ return NULL;
}
int ring_created = 1;
@@ -447,6 +488,7 @@ static void init_ring_between_tasks(struct lcore_cfg *lconf, struct task_args *s
lconf->id, starg->id, ring_idx, ct.core, ct.task, dtarg->nb_rxrings, ring, ring->name,
dtarg->nb_slave_threads);
++ris->n_pkt_rings;
+ return ring;
}
static void init_rings(void)
@@ -476,6 +518,22 @@ static void init_rings(void)
ris.n_pkt_rings,
ris.n_ctrl_rings,
ris.n_opt_rings);
+
+ lconf = NULL;
+ struct prox_port_cfg *port;
+ while (core_targ_next(&lconf, &starg, 1) == 0) {
+ if ((starg->task_init) && (starg->task_init->flag_features & TASK_FEATURE_L3)) {
+ struct core_task ct;
+ ct.core = prox_cfg.master;
+ ct.task = 0;
+ ct.type = CTRL_TYPE_PKT;
+ struct rte_ring *rx_ring = init_ring_between_tasks(lconf, starg, ct, 0, 0, &ris);
+
+ ct.core = lconf->id;
+ ct.task = starg->id;;
+ struct rte_ring *tx_ring = init_ring_between_tasks(lcore_cfg, lcore_cfg[prox_cfg.master].targs, ct, 0, 0, &ris);
+ }
+ }
}
static void shuffle_mempool(struct rte_mempool* mempool, uint32_t nb_mbuf)
@@ -691,7 +749,7 @@ static void set_task_lconf(void)
struct lcore_cfg *lconf;
uint32_t lcore_id = -1;
- while(prox_core_next(&lcore_id, 0) == 0) {
+ while(prox_core_next(&lcore_id, 1) == 0) {
lconf = &lcore_cfg[lcore_id];
for (uint8_t task_id = 0; task_id < lconf->n_tasks_all; ++task_id) {
lconf->targs[task_id].lconf = lconf;
@@ -733,11 +791,30 @@ static void setup_all_task_structs(void)
{
struct lcore_cfg *lconf;
uint32_t lcore_id = -1;
+ struct task_base *tmaster = NULL;
- while(prox_core_next(&lcore_id, 0) == 0) {
+ while(prox_core_next(&lcore_id, 1) == 0) {
lconf = &lcore_cfg[lcore_id];
for (uint8_t task_id = 0; task_id < lconf->n_tasks_all; ++task_id) {
- lconf->tasks_all[task_id] = init_task_struct(&lconf->targs[task_id]);
+ if (task_is_master(&lconf->targs[task_id])) {
+ plog_info("\tInitializing MASTER struct for core %d task %d\n", lcore_id, task_id);
+ lconf->tasks_all[task_id] = init_task_struct(&lconf->targs[task_id]);
+ tmaster = lconf->tasks_all[task_id];
+ }
+ }
+ }
+ PROX_PANIC(tmaster == NULL, "Can't initialize master task\n");
+ lcore_id = -1;
+
+ while(prox_core_next(&lcore_id, 1) == 0) {
+ lconf = &lcore_cfg[lcore_id];
+ plog_info("\tInitializing struct for core %d with %d task\n", lcore_id, lconf->n_tasks_all);
+ for (uint8_t task_id = 0; task_id < lconf->n_tasks_all; ++task_id) {
+ if (!task_is_master(&lconf->targs[task_id])) {
+ plog_info("\tInitializing struct for core %d task %d\n", lcore_id, task_id);
+ lconf->targs[task_id].tmaster = tmaster;
+ lconf->tasks_all[task_id] = init_task_struct(&lconf->targs[task_id]);
+ }
}
}
}