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 f4a3e2c..3244175 100644
--- a/platform/linux-generic/include/odp_packet_dpdk.h
+++ b/platform/linux-generic/include/odp_packet_dpdk.h
@@ -40,6 +40,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 233c6f8..1ff0927 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,
@@ -729,7 +777,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

Reply via email to