diff options
author | Matias Elo <matias.elo@nokia.com> | 2021-08-18 12:40:00 +0300 |
---|---|---|
committer | Matias Elo <matias.elo@nokia.com> | 2021-08-18 12:40:00 +0300 |
commit | b705c92c55d88a03b0f2f327584c9d8530450032 (patch) | |
tree | a308a2bddbd359b5cf759773fc3b3a9af4f7242d /platform/linux-generic/pktio | |
parent | 6b6de8d7044d7a484b671a80768cf068f5b56814 (diff) | |
parent | 6f0ff9d9ca6a2e1e9e81aa068d86deda79046888 (diff) |
Merge tag 'v1.31.0.0' of https://github.com/OpenDataPlane/odp into odp-dpdk
Signed-off-by: Matias Elo <matias.elo@nokia.com>
Diffstat (limited to 'platform/linux-generic/pktio')
-rw-r--r-- | platform/linux-generic/pktio/dpdk.c | 41 |
1 files changed, 34 insertions, 7 deletions
diff --git a/platform/linux-generic/pktio/dpdk.c b/platform/linux-generic/pktio/dpdk.c index 4841402aa..a98324ee4 100644 --- a/platform/linux-generic/pktio/dpdk.c +++ b/platform/linux-generic/pktio/dpdk.c @@ -116,6 +116,7 @@ ODP_STATIC_ASSERT((DPDK_NB_MBUF % DPDK_MEMPOOL_CACHE_SIZE == 0) && typedef struct { int num_rx_desc; int num_tx_desc; + uint8_t multicast_en; uint8_t rx_drop_en; uint8_t set_flow_hash; } dpdk_opt_t; @@ -227,8 +228,13 @@ static int init_options(pktio_entry_t *pktio_entry, return -1; opt->set_flow_hash = !!val; + if (!lookup_opt("multicast_en", NULL, &val)) + return -1; + opt->multicast_en = !!val; + ODP_DBG("DPDK interface (%s): %" PRIu16 "\n", dev_info->driver_name, pkt_priv(pktio_entry)->port_id); + ODP_DBG(" multicast_en: %d\n", opt->multicast_en); ODP_DBG(" num_rx_desc: %d\n", opt->num_rx_desc); ODP_DBG(" num_tx_desc: %d\n", opt->num_tx_desc); ODP_DBG(" rx_drop_en: %d\n", opt->rx_drop_en); @@ -1669,8 +1675,9 @@ static int dpdk_open(odp_pktio_t id ODP_UNUSED, char pool_name[RTE_MEMPOOL_NAMESIZE]; uint16_t data_room; uint32_t mtu; - int i; + int i, ret; pool_t *pool_entry; + uint16_t port_id; if (disable_pktio) return -1; @@ -1679,8 +1686,15 @@ static int dpdk_open(odp_pktio_t id ODP_UNUSED, return -1; pool_entry = pool_entry_from_hdl(pool); - if (!dpdk_netdev_is_valid(netdev)) { - ODP_ERR("Invalid dpdk netdev: %s\n", netdev); + /* Init pktio entry */ + memset(pkt_dpdk, 0, sizeof(*pkt_dpdk)); + + if (!rte_eth_dev_get_port_by_name(netdev, &port_id)) + pkt_dpdk->port_id = port_id; + else if (dpdk_netdev_is_valid(netdev)) + pkt_dpdk->port_id = atoi(netdev); + else { + ODP_ERR("Invalid DPDK interface name: %s\n", netdev); return -1; } @@ -1691,11 +1705,7 @@ static int dpdk_open(odp_pktio_t id ODP_UNUSED, odp_global_rw->dpdk_initialized = 1; } - /* Init pktio entry */ - memset(pkt_dpdk, 0, sizeof(*pkt_dpdk)); - pkt_dpdk->pool = pool; - pkt_dpdk->port_id = atoi(netdev); /* rte_eth_dev_count() was removed in v18.05 */ #if RTE_VERSION < RTE_VERSION_NUM(18, 5, 0, 0) @@ -1727,6 +1737,23 @@ static int dpdk_open(odp_pktio_t id ODP_UNUSED, promisc_mode_check(pkt_dpdk); +#if RTE_VERSION < RTE_VERSION_NUM(19, 11, 0, 0) + ret = 0; + if (pkt_dpdk->opt.multicast_en) + rte_eth_allmulticast_enable(pkt_dpdk->port_id); + else + rte_eth_allmulticast_disable(pkt_dpdk->port_id); +#else + if (pkt_dpdk->opt.multicast_en) + ret = rte_eth_allmulticast_enable(pkt_dpdk->port_id); + else + ret = rte_eth_allmulticast_disable(pkt_dpdk->port_id); +#endif + + /* Not supported by all PMDs, so ignore the return value */ + if (ret) + ODP_DBG("Configuring multicast reception not supported by the PMD\n"); + /* Drivers requiring minimum burst size. Supports also *_vf versions * of the drivers. */ if (!strncmp(dev_info.driver_name, IXGBE_DRV_NAME, |