diff options
Diffstat (limited to 'VNFs/DPPD-PROX/prox_args.c')
-rw-r--r-- | VNFs/DPPD-PROX/prox_args.c | 48 |
1 files changed, 46 insertions, 2 deletions
diff --git a/VNFs/DPPD-PROX/prox_args.c b/VNFs/DPPD-PROX/prox_args.c index 9e12eb68..cb0dcb31 100644 --- a/VNFs/DPPD-PROX/prox_args.c +++ b/VNFs/DPPD-PROX/prox_args.c @@ -137,6 +137,15 @@ static struct cfg_section core_cfg = { .error = 0 }; +struct deferred_port { + struct task_args *targ; + char name[256]; + uint8_t is_rx_port; +}; + +static struct deferred_port deferred_port[PROX_MAX_PORTS]; +static int n_deferred_ports = 0; + static void set_errf(const char *format, ...) { va_list ap; @@ -901,7 +910,17 @@ static int get_core_cfg(unsigned sindex, char *str, void *data) uint32_t ports[PROX_MAX_PORTS]; if(parse_port_name_list(ports, &n_if, PROX_MAX_PORTS, pkey)) { - return -1; + // Port name not found, but could be a virtual device of a secondary process + // As DPDK not started yet, we can only check the config file to see whether we are a secondary process + if (rte_cfg.eal && + (strstr(rte_cfg.eal, "secondary") || strstr(rte_cfg.eal, "auto")) && + (n_deferred_ports < PROX_MAX_PORTS)) { + prox_strncpy(deferred_port[n_deferred_ports].name, pkey, sizeof(deferred_port[n_deferred_ports].name)); + deferred_port[n_deferred_ports].is_rx_port = 0; + deferred_port[n_deferred_ports++].targ = targ; + return 0; + } else + return -1; } PROX_ASSERT(n_if-1 < PROX_MAX_PORTS); @@ -1111,7 +1130,17 @@ static int get_core_cfg(unsigned sindex, char *str, void *data) uint32_t n_if; if (parse_port_name_list(vals, &n_if, PROX_MAX_PORTS, pkey)) { - return -1; + // Port name not found, but could be a virtual device of a secondary process + // As DPDK not started yet, we can only check the config file to see whether we are a secondary process + if (rte_cfg.eal && + (strstr(rte_cfg.eal, "secondary") || strstr(rte_cfg.eal, "auto")) && + (n_deferred_ports < PROX_MAX_PORTS)) { + prox_strncpy(deferred_port[n_deferred_ports].name, pkey, sizeof(deferred_port[n_deferred_ports].name)); + deferred_port[n_deferred_ports].is_rx_port = 1; + deferred_port[n_deferred_ports++].targ = targ; + return 0; + } else + return -1; } for (uint8_t i = 0; i < n_if; ++i) { @@ -2171,5 +2200,20 @@ int prox_setup_rte(const char *prog_name) return -1; } } + uint16_t port_id; + for (int i = 0; i < n_deferred_ports; i++) { + if (rte_eth_dev_get_port_by_name(deferred_port[i].name, &port_id) != 0) { + plog_err("Did not find port name %s used while reading %s\n", deferred_port[i].name, deferred_port[i].is_rx_port ? "rx port" : "tx_port"); + return -1; + } + plog_info("\tport %s is port id %d\n", deferred_port[i].name, port_id); + if (deferred_port[i].is_rx_port) { + deferred_port[i].targ->rx_port_queue[0].port = port_id; + deferred_port[i].targ->nb_rxports = 1; + } else { + deferred_port[i].targ->tx_port_queue[0].port = port_id; + deferred_port[i].targ->nb_txports = 1; + } + } return 0; } |