Implement odp_pktio_input_queues_config() function and add helper rss_conf_to_hash_proto() for converting odp_pktin_hash_proto_t to struct rte_eth_rss_conf.
Reviewed-by: Petri Savolainen <petri.savolai...@nokia.com> Signed-off-by: Matias Elo <matias....@nokia.com> --- platform/linux-generic/include/odp_packet_dpdk.h | 1 + platform/linux-generic/pktio/dpdk.c | 60 +++++++++++++++++++++--- 2 files changed, 55 insertions(+), 6 deletions(-) diff --git a/platform/linux-generic/include/odp_packet_dpdk.h b/platform/linux-generic/include/odp_packet_dpdk.h index 659f08d..de2b420 100644 --- a/platform/linux-generic/include/odp_packet_dpdk.h +++ b/platform/linux-generic/include/odp_packet_dpdk.h @@ -39,6 +39,7 @@ typedef struct { /** DPDK packet pool name (pktpool_<ifname>) */ char pool_name[IF_NAMESIZE + 8]; uint8_t port_id; /**< DPDK port identifier */ + odp_pktin_hash_proto_t hash; /**< Packet input hash protocol */ odp_bool_t lockless_rx; /**< no locking for rx */ odp_bool_t lockless_tx; /**< no locking for tx */ odp_ticketlock_t rx_lock[PKTIO_MAX_QUEUES]; /**< RX queue locks */ diff --git a/platform/linux-generic/pktio/dpdk.c b/platform/linux-generic/pktio/dpdk.c index 91fa810..96a51d5 100644 --- a/platform/linux-generic/pktio/dpdk.c +++ b/platform/linux-generic/pktio/dpdk.c @@ -151,10 +151,39 @@ static int dpdk_netdev_is_valid(const char *s) return 1; } +static void rss_conf_to_hash_proto(struct rte_eth_rss_conf *rss_conf, + const odp_pktin_hash_proto_t *hash_proto) +{ + memset(rss_conf, 0, sizeof(struct rte_eth_rss_conf)); + + if (hash_proto->proto.ipv4_udp) + rss_conf->rss_hf |= ETH_RSS_NONFRAG_IPV4_UDP; + if (hash_proto->proto.ipv4_tcp) + rss_conf->rss_hf |= ETH_RSS_NONFRAG_IPV4_TCP; + if (hash_proto->proto.ipv4) + rss_conf->rss_hf |= ETH_RSS_IPV4 | ETH_RSS_FRAG_IPV4 | + ETH_RSS_NONFRAG_IPV4_OTHER; + if (hash_proto->proto.ipv6_udp) + rss_conf->rss_hf |= ETH_RSS_NONFRAG_IPV6_UDP | + ETH_RSS_IPV6_UDP_EX; + if (hash_proto->proto.ipv6_tcp) + rss_conf->rss_hf |= ETH_RSS_NONFRAG_IPV6_TCP | + ETH_RSS_IPV6_TCP_EX; + if (hash_proto->proto.ipv6) + rss_conf->rss_hf |= ETH_RSS_IPV6 | ETH_RSS_FRAG_IPV6 | + ETH_RSS_NONFRAG_IPV6_OTHER | + ETH_RSS_IPV6_EX; + rss_conf->rss_key = NULL; +} + static int dpdk_setup_port(pktio_entry_t *pktio_entry) { - pkt_dpdk_t *pkt_dpdk = &pktio_entry->s.pkt_dpdk; int ret; + pkt_dpdk_t *pkt_dpdk = &pktio_entry->s.pkt_dpdk; + struct rte_eth_rss_conf rss_conf; + + rss_conf_to_hash_proto(&rss_conf, &pkt_dpdk->hash); + struct rte_eth_conf port_conf = { .rxmode = { .mq_mode = ETH_MQ_RX_RSS, @@ -167,10 +196,7 @@ static int dpdk_setup_port(pktio_entry_t *pktio_entry) .hw_strip_crc = 0, }, .rx_adv_conf = { - .rss_conf = { - .rss_key = NULL, - .rss_hf = ETH_RSS_IP, - }, + .rss_conf = rss_conf, }, .txmode = { .mq_mode = ETH_MQ_TX_NONE, @@ -304,6 +330,28 @@ int odp_dpdk_pktio_init_local(void) return 0; } +static int dpdk_input_queues_config(pktio_entry_t *pktio_entry, + const odp_pktio_input_queue_param_t *p) +{ + odp_pktio_input_mode_t mode = pktio_entry->s.param.in_mode; + odp_bool_t single_user; + + /** + * Scheduler synchronizes input queue polls. Only single thread + * at a time polls a queue */ + if (mode == ODP_PKTIN_MODE_SCHED) + single_user = 1; + else + single_user = p->single_user; + + if (p->hash_enable && p->num_queues > 1) + pktio_entry->s.pkt_dpdk.hash = p->hash_proto; + + pktio_entry->s.pkt_dpdk.lockless_rx = single_user; + + return 0; +} + static int dpdk_open(odp_pktio_t id ODP_UNUSED, pktio_entry_t *pktio_entry, const char *netdev, @@ -700,7 +748,7 @@ const pktio_if_ops_t dpdk_pktio_ops = { .promisc_mode_get = dpdk_promisc_mode_get, .mac_get = dpdk_mac_addr_get, .capability = dpdk_capability, - .input_queues_config = NULL, + .input_queues_config = dpdk_input_queues_config, .output_queues_config = NULL, .in_queues = dpdk_in_queues, .pktin_queues = dpdk_pktin_queues, -- 1.9.1 _______________________________________________ lng-odp mailing list lng-odp@lists.linaro.org https://lists.linaro.org/mailman/listinfo/lng-odp