octeon: add option to specify RSS flowkey bitmap 00/43700/3
authorDamjan Marion <[email protected]>
Mon, 15 Sep 2025 13:24:08 +0000 (15:24 +0200)
committerDamjan Marion <[email protected]>
Mon, 15 Sep 2025 18:07:12 +0000 (18:07 +0000)
Type: improvement

Change-Id: I0fa660c96a44ede0fcb435af560544bbc0f8da04
Signed-off-by: Damjan Marion <[email protected]>
Signed-off-by: Monendra Singh Kushwaha <[email protected]>
src/plugins/dev_octeon/init.c
src/plugins/dev_octeon/octeon.h
src/plugins/dev_octeon/port.c

index ad5fca1..acacd9a 100644 (file)
@@ -87,6 +87,15 @@ static vnet_dev_arg_t oct_port_args[] = {
     .type = VNET_DEV_ARG_TYPE_BOOL,
     .default_val.boolean = false,
   },
+  {
+    .id = OCT_PORT_ARG_RSS_FLOW_KEY,
+    .name = "rss_flow_key",
+    .desc = "RSS Flow Key Bitmap, applicable to network devices only",
+    .type = VNET_DEV_ARG_TYPE_UINT32,
+    .default_val.uint32 = FLOW_KEY_TYPE_IPV4 | FLOW_KEY_TYPE_IPV6 |
+                         FLOW_KEY_TYPE_TCP | FLOW_KEY_TYPE_UDP |
+                         FLOW_KEY_TYPE_SCTP,
+  },
   {
     .id = OCT_PORT_ARG_END,
     .name = "end",
index a77dc8a..765cdbb 100644 (file)
@@ -33,6 +33,7 @@ typedef enum
 typedef enum
 {
   OCT_PORT_ARG_EN_ETH_PAUSE_FRAME = 1,
+  OCT_PORT_ARG_RSS_FLOW_KEY = 2,
   OCT_PORT_ARG_END
 } oct_port_args_t;
 
@@ -83,6 +84,7 @@ typedef struct
   u8 q_intr_enabled : 1;
   struct roc_npc npc;
   oct_flow_entry_t *flow_entries;
+  u32 rss_flowkey;
 } oct_port_t;
 
 typedef struct
index d466a1e..091cea5 100644 (file)
@@ -25,10 +25,6 @@ static const u8 default_rss_key[] = {
   0x56, 0xbc, 0x78, 0x9a, 0x9a, 0x78, 0xbc, 0x56, 0xcd, 0x34, 0xef, 0x12
 };
 
-static const u32 default_rss_flowkey =
-  (FLOW_KEY_TYPE_IPV4 | FLOW_KEY_TYPE_IPV6 | FLOW_KEY_TYPE_TCP |
-   FLOW_KEY_TYPE_UDP | FLOW_KEY_TYPE_SCTP);
-
 static const u64 rxq_cfg =
   ROC_NIX_LF_RX_CFG_DIS_APAD | ROC_NIX_LF_RX_CFG_IP6_UDP_OPT |
   ROC_NIX_LF_RX_CFG_L2_LEN_ERR | ROC_NIX_LF_RX_CFG_DROP_RE |
@@ -143,6 +139,8 @@ oct_port_init (vlib_main_t *vm, vnet_dev_port_t *port)
       if (arg->id == OCT_PORT_ARG_EN_ETH_PAUSE_FRAME &&
          vnet_dev_arg_get_bool (arg))
        is_pause_frame_enable = true;
+      else if (arg->id == OCT_PORT_ARG_RSS_FLOW_KEY)
+       cp->rss_flowkey = vnet_dev_arg_get_uint32 (arg);
     }
 
   if ((rrv = roc_nix_lf_alloc (nix, ifs->num_rx_queues, ifs->num_tx_queues,
@@ -186,7 +184,7 @@ oct_port_init (vlib_main_t *vm, vnet_dev_port_t *port)
       return oct_roc_err (dev, rrv, "roc_nix_tm_hierarchy_enable() failed");
     }
 
-  if ((rrv = roc_nix_rss_default_setup (nix, default_rss_flowkey)))
+  if ((rrv = roc_nix_rss_default_setup (nix, cp->rss_flowkey)))
     {
       oct_port_deinit (vm, port);
       return oct_roc_err (dev, rrv, "roc_nix_rss_default_setup() failed");
@@ -623,6 +621,7 @@ oct_port_add_del_eth_addr (vlib_main_t *vm, vnet_dev_port_t *port,
 {
   vnet_dev_t *dev = port->dev;
   oct_device_t *cd = vnet_dev_get_data (dev);
+  oct_port_t *cp = vnet_dev_get_port_data (port);
   struct roc_nix *nix = cd->nix;
   vnet_dev_rv_t rv = VNET_DEV_OK;
   i32 rrv;
@@ -649,7 +648,7 @@ oct_port_add_del_eth_addr (vlib_main_t *vm, vnet_dev_port_t *port,
                }
            }
 
-         rrv = roc_nix_rss_default_setup (nix, default_rss_flowkey);
+         rrv = roc_nix_rss_default_setup (nix, cp->rss_flowkey);
          if (rrv)
            rv = oct_roc_err (dev, rrv, "roc_nix_rss_default_setup() failed");
        }