Add dpdk per-interface startup config parameter to support rss-flag 52/1552/2
authorSrivatsa Sangli <srivrama@cisco.com>
Tue, 14 Jun 2016 20:10:55 +0000 (13:10 -0700)
committerSrivatsa Sangli <srivrama@cisco.com>
Tue, 14 Jun 2016 23:44:36 +0000 (16:44 -0700)
New parameter allows specifying rss-flag - one or more of following
ipv4-frag ipv4-tcp ipv4-udp ipv4-sctp ipv4-other ipv4
ipv6-tcp-ex ipv6-udp-ex ipv6-frag ipv6-tcp ipv6-udp
ipv6-sctp ipv6-other l2-payload ipv6-ex ipv6

Sample config:

dpdk {
    dev 0000:86:00.0 {
        rss {
            ipv4
            ipv4-tcp
            ipv4-udp
        }
    }
}

Change-Id: I33c047d69ef8710b8ba3c7e1a1964d5d54f6e880
Signed-off-by: Srivatsa Sangli <srivrama@cisco.com>
vnet/vnet/devices/dpdk/dpdk.h
vnet/vnet/devices/dpdk/format.c
vnet/vnet/devices/dpdk/init.c

index eb0a11f..8cd344c 100644 (file)
@@ -315,7 +315,8 @@ typedef struct dpdk_efd_t {
   _ (num_rx_queues) \
   _ (num_tx_queues) \
   _ (num_rx_desc) \
-  _ (num_tx_desc)
+  _ (num_tx_desc) \
+  _ (rss_fn)
 
 typedef struct {
     vlib_pci_addr_t pci_addr;
@@ -617,6 +618,7 @@ format_function_t format_dpdk_rx_dma_trace;
 format_function_t format_dpdk_rte_mbuf;
 format_function_t format_dpdk_rx_rte_mbuf;
 unformat_function_t unformat_socket_mem;
+clib_error_t * unformat_rss_fn(unformat_input_t * input, uword * rss_fn);
 
 
 static inline void
index 6e77746..c9d8636 100644 (file)
   _ (rx_errors, q_errors)
 
 #define foreach_dpdk_rss_hf                    \
-  _(ETH_RSS_IPV4,               "ipv4")        \
   _(ETH_RSS_FRAG_IPV4,          "ipv4-frag")   \
   _(ETH_RSS_NONFRAG_IPV4_TCP,   "ipv4-tcp")    \
   _(ETH_RSS_NONFRAG_IPV4_UDP,   "ipv4-udp")    \
   _(ETH_RSS_NONFRAG_IPV4_SCTP,  "ipv4-sctp")   \
   _(ETH_RSS_NONFRAG_IPV4_OTHER, "ipv4-other")  \
-  _(ETH_RSS_IPV6,               "ipv6")        \
+  _(ETH_RSS_IPV4,               "ipv4")        \
+  _(ETH_RSS_IPV6_TCP_EX,        "ipv6-tcp-ex") \
+  _(ETH_RSS_IPV6_UDP_EX,        "ipv6-udp-ex") \
   _(ETH_RSS_FRAG_IPV6,          "ipv6-frag")   \
   _(ETH_RSS_NONFRAG_IPV6_TCP,   "ipv6-tcp")    \
   _(ETH_RSS_NONFRAG_IPV6_UDP,   "ipv6-udp")    \
@@ -86,8 +87,8 @@
   _(ETH_RSS_NONFRAG_IPV6_OTHER, "ipv6-other")  \
   _(ETH_RSS_L2_PAYLOAD,         "l2-payload")  \
   _(ETH_RSS_IPV6_EX,            "ipv6-ex")     \
-  _(ETH_RSS_IPV6_TCP_EX,        "ipv6-tcp-ex") \
-  _(ETH_RSS_IPV6_UDP_EX,        "ipv6-udp-ex")
+  _(ETH_RSS_IPV6,               "ipv6")
+
 
 #define foreach_dpdk_rx_offload_caps            \
   _(DEV_RX_OFFLOAD_VLAN_STRIP, "vlan-strip")    \
@@ -833,3 +834,27 @@ unformat_socket_mem (unformat_input_t * input, va_list * va)
 done:
   return 1;
 }
+
+clib_error_t *
+unformat_rss_fn (unformat_input_t * input, uword * rss_fn)
+{
+  while (unformat_check_input (input) != UNFORMAT_END_OF_INPUT)
+    {
+      if (0)
+        ;
+#undef _
+#define _(f, s)                                 \
+      else if (unformat (input, s))             \
+        *rss_fn |= f;
+
+      foreach_dpdk_rss_hf
+#undef _
+
+      else
+        {
+          return clib_error_return (0, "unknown input `%U'",
+                                     format_unformat_error, input);
+        }
+    }
+  return 0;
+}
index c685fb4..6661c2a 100644 (file)
@@ -355,7 +355,10 @@ dpdk_lib_init (dpdk_main_t * dm)
         {
           xd->rx_q_used = devconf->num_rx_queues;
           xd->port_conf.rxmode.mq_mode = ETH_MQ_RX_RSS;
-          xd->port_conf.rx_adv_conf.rss_conf.rss_hf = ETH_RSS_IP | ETH_RSS_UDP | ETH_RSS_TCP;
+          if (devconf->rss_fn == 0)
+            xd->port_conf.rx_adv_conf.rss_conf.rss_hf = ETH_RSS_IP | ETH_RSS_UDP | ETH_RSS_TCP;
+          else
+            xd->port_conf.rx_adv_conf.rss_conf.rss_hf = devconf->rss_fn;
         }
       else
         xd->rx_q_used = 1;
@@ -854,6 +857,7 @@ dpdk_device_config (dpdk_config_main_t * conf, vlib_pci_addr_t pci_addr, unforma
   clib_error_t * error = 0;
   uword * p;
   dpdk_device_config_t * devconf;
+  unformat_input_t sub_input;
 
   if (is_default)
     {
@@ -891,6 +895,12 @@ dpdk_device_config (dpdk_config_main_t * conf, vlib_pci_addr_t pci_addr, unforma
       else if (unformat (input, "workers %U", unformat_bitmap_list,
                         &devconf->workers))
        ;
+      else if (unformat (input, "rss %U", unformat_vlib_cli_sub_input, &sub_input))
+        {
+          error = unformat_rss_fn(&sub_input, &devconf->rss_fn);
+          if (error)
+            break;
+        }
       else
        {
          error = clib_error_return (0, "unknown input `%U'",