get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

GET /api/patches/7690/?format=api
HTTP 200 OK
Allow: GET, PUT, PATCH, HEAD, OPTIONS
Content-Type: application/json
Vary: Accept

{
    "id": 7690,
    "url": "https://patches.dpdk.org/api/patches/7690/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/1444989651-6236-2-git-send-email-tomaszx.kulasek@intel.com/",
    "project": {
        "id": 1,
        "url": "https://patches.dpdk.org/api/projects/1/?format=api",
        "name": "DPDK",
        "link_name": "dpdk",
        "list_id": "dev.dpdk.org",
        "list_email": "dev@dpdk.org",
        "web_url": "http://core.dpdk.org",
        "scm_url": "git://dpdk.org/dpdk",
        "webscm_url": "http://git.dpdk.org/dpdk",
        "list_archive_url": "https://inbox.dpdk.org/dev",
        "list_archive_url_format": "https://inbox.dpdk.org/dev/{}",
        "commit_url_format": ""
    },
    "msgid": "<1444989651-6236-2-git-send-email-tomaszx.kulasek@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1444989651-6236-2-git-send-email-tomaszx.kulasek@intel.com",
    "date": "2015-10-16T10:00:43",
    "name": "[dpdk-dev,v6,1/9] bonding: rss dynamic configuration",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "c8d5583759ebbe1e6e47ec55e149141719b10022",
    "submitter": {
        "id": 155,
        "url": "https://patches.dpdk.org/api/people/155/?format=api",
        "name": "Tomasz Kulasek",
        "email": "tomaszx.kulasek@intel.com"
    },
    "delegate": null,
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/1444989651-6236-2-git-send-email-tomaszx.kulasek@intel.com/mbox/",
    "series": [],
    "comments": "https://patches.dpdk.org/api/patches/7690/comments/",
    "check": "pending",
    "checks": "https://patches.dpdk.org/api/patches/7690/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@dpdk.org",
        "Delivered-To": "patchwork@dpdk.org",
        "Received": [
            "from [92.243.14.124] (localhost [IPv6:::1])\n\tby dpdk.org (Postfix) with ESMTP id 0B8C08DA6;\n\tFri, 16 Oct 2015 12:03:54 +0200 (CEST)",
            "from mga09.intel.com (mga09.intel.com [134.134.136.24])\n\tby dpdk.org (Postfix) with ESMTP id D544D8D8C\n\tfor <dev@dpdk.org>; Fri, 16 Oct 2015 12:03:51 +0200 (CEST)",
            "from orsmga002.jf.intel.com ([10.7.209.21])\n\tby orsmga102.jf.intel.com with ESMTP; 16 Oct 2015 03:03:50 -0700",
            "from unknown (HELO Sent) ([10.217.248.129])\n\tby orsmga002.jf.intel.com with SMTP; 16 Oct 2015 03:03:49 -0700",
            "by Sent (sSMTP sendmail emulation); Fri, 16 Oct 2015 12:02:23 +0200"
        ],
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.17,688,1437462000\"; d=\"scan'208\";a=\"828136537\"",
        "From": "Tomasz Kulasek <tomaszx.kulasek@intel.com>",
        "To": "dev@dpdk.org",
        "Date": "Fri, 16 Oct 2015 12:00:43 +0200",
        "Message-Id": "<1444989651-6236-2-git-send-email-tomaszx.kulasek@intel.com>",
        "X-Mailer": "git-send-email 2.1.4",
        "In-Reply-To": "<1444989651-6236-1-git-send-email-tomaszx.kulasek@intel.com>",
        "References": "<1443621905-7872-1-git-send-email-tomaszx.kulasek@intel.com>\n\t<1444989651-6236-1-git-send-email-tomaszx.kulasek@intel.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=UTF-8",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [PATCH v6 1/9] bonding: rss dynamic configuration",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "patches and discussions about DPDK <dev.dpdk.org>",
        "List-Unsubscribe": "<http://dpdk.org/ml/options/dev>,\n\t<mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://dpdk.org/ml/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<http://dpdk.org/ml/listinfo/dev>,\n\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "Bonding device implements independent management of RSS settings. It\nstores its own copies of settings i.e. RETA, RSS hash function and RSS\nkey. It’s required to ensure consistency.\n\n1) RSS hash function set for bonding device is maximal set of RSS hash\nfunctions supported by all bonded devices. That mean, to have RSS support\nfor bonding, all slaves should be RSS-capable.\n\n2) RSS key is propagated over the slaves \"as is\".\n\n3) RETA for bonding is an internal table managed by bonding API, and is\nused as a pattern to set up slaves. Its size is GCD of all RETA sizes, so\nit can be easily used as a pattern providing expected behavior, even if\nslaves RETA sizes are different.\n\nSigned-off-by: Tomasz Kulasek <tomaszx.kulasek@intel.com>\n---\n drivers/net/bonding/rte_eth_bond_api.c     |   28 ++++\n drivers/net/bonding/rte_eth_bond_pmd.c     |  205 ++++++++++++++++++++++++++--\n drivers/net/bonding/rte_eth_bond_private.h |   12 ++\n 3 files changed, 231 insertions(+), 14 deletions(-)",
    "diff": "diff --git a/drivers/net/bonding/rte_eth_bond_api.c b/drivers/net/bonding/rte_eth_bond_api.c\nindex 0681d1a..92073df 100644\n--- a/drivers/net/bonding/rte_eth_bond_api.c\n+++ b/drivers/net/bonding/rte_eth_bond_api.c\n@@ -273,6 +273,9 @@ rte_eth_bond_create(const char *name, uint8_t mode, uint8_t socket_id)\n \tinternals->rx_offload_capa = 0;\n \tinternals->tx_offload_capa = 0;\n \n+\t/* Initially allow to choose any offload type */\n+\tinternals->flow_type_rss_offloads = ETH_RSS_PROTO_MASK;\n+\n \tmemset(internals->active_slaves, 0, sizeof(internals->active_slaves));\n \tmemset(internals->slaves, 0, sizeof(internals->slaves));\n \n@@ -369,6 +372,11 @@ __eth_bond_slave_add_lock_free(uint8_t bonded_port_id, uint8_t slave_port_id)\n \n \trte_eth_dev_info_get(slave_port_id, &dev_info);\n \n+\t/* We need to store slaves reta_size to be able to synchronize RETA for all\n+\t * slave devices even if its sizes are different.\n+\t */\n+\tinternals->slaves[internals->slave_count].reta_size = dev_info.reta_size;\n+\n \tif (internals->slave_count < 1) {\n \t\t/* if MAC is not user defined then use MAC of first slave add to\n \t\t * bonded device */\n@@ -382,9 +390,16 @@ __eth_bond_slave_add_lock_free(uint8_t bonded_port_id, uint8_t slave_port_id)\n \t\t/* Make primary slave */\n \t\tinternals->primary_port = slave_port_id;\n \n+\t\t/* Inherit queues settings from first slave */\n+\t\tinternals->nb_rx_queues = slave_eth_dev->data->nb_rx_queues;\n+\t\tinternals->nb_tx_queues = slave_eth_dev->data->nb_tx_queues;\n+\n+\t\tinternals->reta_size = dev_info.reta_size;\n+\n \t\t/* Take the first dev's offload capabilities */\n \t\tinternals->rx_offload_capa = dev_info.rx_offload_capa;\n \t\tinternals->tx_offload_capa = dev_info.tx_offload_capa;\n+\t\tinternals->flow_type_rss_offloads = dev_info.flow_type_rss_offloads;\n \n \t} else {\n \t\t/* Check slave link properties are supported if props are set,\n@@ -403,8 +418,19 @@ __eth_bond_slave_add_lock_free(uint8_t bonded_port_id, uint8_t slave_port_id)\n \t\t}\n \t\tinternals->rx_offload_capa &= dev_info.rx_offload_capa;\n \t\tinternals->tx_offload_capa &= dev_info.tx_offload_capa;\n+\t\tinternals->flow_type_rss_offloads &= dev_info.flow_type_rss_offloads;\n+\n+\t\t/* RETA size is GCD of all slaves RETA sizes, so, if all sizes will be\n+\t\t * the power of 2, the lower one is GCD\n+\t\t */\n+\t\tif (internals->reta_size > dev_info.reta_size)\n+\t\t\tinternals->reta_size = dev_info.reta_size;\n+\n \t}\n \n+\tbonded_eth_dev->data->dev_conf.rx_adv_conf.rss_conf.rss_hf &=\n+\t\t\tinternals->flow_type_rss_offloads;\n+\n \tinternals->slave_count++;\n \n \t/* Update all slave devices MACs*/\n@@ -531,6 +557,8 @@ __eth_bond_slave_remove_lock_free(uint8_t bonded_port_id, uint8_t slave_port_id)\n \tif (internals->slave_count == 0) {\n \t\tinternals->rx_offload_capa = 0;\n \t\tinternals->tx_offload_capa = 0;\n+\t\tinternals->flow_type_rss_offloads = ETH_RSS_PROTO_MASK;\n+\t\tinternals->reta_size = 0;\n \t}\n \treturn 0;\n }\ndiff --git a/drivers/net/bonding/rte_eth_bond_pmd.c b/drivers/net/bonding/rte_eth_bond_pmd.c\nindex 5cc6372..2880f5c 100644\n--- a/drivers/net/bonding/rte_eth_bond_pmd.c\n+++ b/drivers/net/bonding/rte_eth_bond_pmd.c\n@@ -1310,6 +1310,23 @@ slave_configure(struct rte_eth_dev *bonded_eth_dev,\n \tif (slave_eth_dev->driver->pci_drv.drv_flags & RTE_PCI_DRV_INTR_LSC)\n \t\tslave_eth_dev->data->dev_conf.intr_conf.lsc = 1;\n \n+\t/* If RSS is enabled for bonding, try to enable it for slaves  */\n+\tif (bonded_eth_dev->data->dev_conf.rxmode.mq_mode & ETH_MQ_RX_RSS) {\n+\t\tif (bonded_eth_dev->data->dev_conf.rx_adv_conf.rss_conf.rss_key_len\n+\t\t\t\t!= 0) {\n+\t\t\tslave_eth_dev->data->dev_conf.rx_adv_conf.rss_conf.rss_key_len =\n+\t\t\t\t\tbonded_eth_dev->data->dev_conf.rx_adv_conf.rss_conf.rss_key_len;\n+\t\t\tslave_eth_dev->data->dev_conf.rx_adv_conf.rss_conf.rss_key =\n+\t\t\t\t\tbonded_eth_dev->data->dev_conf.rx_adv_conf.rss_conf.rss_key;\n+\t\t} else {\n+\t\t\tslave_eth_dev->data->dev_conf.rx_adv_conf.rss_conf.rss_key = NULL;\n+\t\t}\n+\n+\t\tslave_eth_dev->data->dev_conf.rx_adv_conf.rss_conf.rss_hf =\n+\t\t\t\tbonded_eth_dev->data->dev_conf.rx_adv_conf.rss_conf.rss_hf;\n+\t\tslave_eth_dev->data->dev_conf.rxmode.mq_mode |= ETH_MQ_RX_RSS;\n+\t}\n+\n \t/* Configure device */\n \terrval = rte_eth_dev_configure(slave_eth_dev->data->port_id,\n \t\t\tbonded_eth_dev->data->nb_rx_queues,\n@@ -1361,6 +1378,30 @@ slave_configure(struct rte_eth_dev *bonded_eth_dev,\n \t\treturn -1;\n \t}\n \n+\t/* If RSS is enabled for bonding, synchronize RETA */\n+\tif (bonded_eth_dev->data->dev_conf.rxmode.mq_mode & ETH_MQ_RX_RSS) {\n+\t\tint i;\n+\t\tstruct bond_dev_private *internals;\n+\n+\t\tinternals = bonded_eth_dev->data->dev_private;\n+\n+\t\tfor (i = 0; i < internals->slave_count; i++) {\n+\t\t\tif (internals->slaves[i].port_id == slave_eth_dev->data->port_id) {\n+\t\t\t\terrval = rte_eth_dev_rss_reta_update(\n+\t\t\t\t\t\tslave_eth_dev->data->port_id,\n+\t\t\t\t\t\t&internals->reta_conf[0],\n+\t\t\t\t\t\tinternals->slaves[i].reta_size);\n+\t\t\t\tif (errval != 0) {\n+\t\t\t\t\tRTE_LOG(WARNING, PMD,\n+\t\t\t\t\t\t\t\"rte_eth_dev_rss_reta_update on slave port %d fails (err %d).\"\n+\t\t\t\t\t\t\t\" RSS Configuration for bonding may be inconsistent.\\n\",\n+\t\t\t\t\t\t\tslave_eth_dev->data->port_id, errval);\n+\t\t\t\t}\n+\t\t\t\tbreak;\n+\t\t\t}\n+\t\t}\n+\t}\n+\n \t/* If lsc interrupt is set, check initial slave's link status */\n \tif (slave_eth_dev->driver->pci_drv.drv_flags & RTE_PCI_DRV_INTR_LSC)\n \t\tbond_ethdev_lsc_event_callback(slave_eth_dev->data->port_id,\n@@ -1596,6 +1637,9 @@ bond_ethdev_info(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)\n \n \tdev_info->rx_offload_capa = internals->rx_offload_capa;\n \tdev_info->tx_offload_capa = internals->tx_offload_capa;\n+\tdev_info->flow_type_rss_offloads = internals->flow_type_rss_offloads;\n+\n+\tdev_info->reta_size = internals->reta_size;\n }\n \n static int\n@@ -1977,21 +2021,132 @@ bond_ethdev_lsc_event_callback(uint8_t port_id, enum rte_eth_event_type type,\n \t}\n }\n \n+static int\n+bond_ethdev_rss_reta_update(struct rte_eth_dev *dev,\n+\t\tstruct rte_eth_rss_reta_entry64 *reta_conf, uint16_t reta_size)\n+{\n+\tunsigned i, j;\n+\tint result = 0;\n+\tint slave_reta_size;\n+\tunsigned reta_count;\n+\tstruct bond_dev_private *internals = dev->data->dev_private;\n+\n+\tif (reta_size != internals->reta_size)\n+\t\treturn -EINVAL;\n+\n+\t /* Copy RETA table */\n+\treta_count = reta_size / RTE_RETA_GROUP_SIZE;\n+\n+\tfor (i = 0; i < reta_count; i++) {\n+\t\tinternals->reta_conf[i].mask = reta_conf[i].mask;\n+\t\tfor (j = 0; j < RTE_RETA_GROUP_SIZE; j++)\n+\t\t\tif ((reta_conf[i].mask >> j) & 0x01)\n+\t\t\t\tinternals->reta_conf[i].reta[j] = reta_conf[i].reta[j];\n+\t}\n+\n+\t/* Fill rest of array */\n+\tfor (; i < RTE_DIM(internals->reta_conf); i += reta_count)\n+\t\tmemcpy(&internals->reta_conf[i], &internals->reta_conf[0],\n+\t\t\t\tsizeof(internals->reta_conf[0]) * reta_count);\n+\n+\t/* Propagate RETA over slaves */\n+\tfor (i = 0; i < internals->slave_count; i++) {\n+\t\tslave_reta_size = internals->slaves[i].reta_size;\n+\t\tresult = rte_eth_dev_rss_reta_update(internals->slaves[i].port_id,\n+\t\t\t\t&internals->reta_conf[0], slave_reta_size);\n+\t\tif (result < 0)\n+\t\t\treturn result;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+bond_ethdev_rss_reta_query(struct rte_eth_dev *dev,\n+\t\tstruct rte_eth_rss_reta_entry64 *reta_conf, uint16_t reta_size)\n+{\n+\tint i, j;\n+\tstruct bond_dev_private *internals = dev->data->dev_private;\n+\n+\tif (reta_size != internals->reta_size)\n+\t\treturn -EINVAL;\n+\n+\t /* Copy RETA table */\n+\tfor (i = 0; i < reta_size / RTE_RETA_GROUP_SIZE; i++)\n+\t\tfor (j = 0; j < RTE_RETA_GROUP_SIZE; j++)\n+\t\t\tif ((reta_conf[i].mask >> j) & 0x01)\n+\t\t\t\treta_conf[i].reta[j] = internals->reta_conf[i].reta[j];\n+\n+\treturn 0;\n+}\n+\n+static int\n+bond_ethdev_rss_hash_update(struct rte_eth_dev *dev,\n+\t\tstruct rte_eth_rss_conf *rss_conf)\n+{\n+\tint i, result = 0;\n+\tstruct bond_dev_private *internals = dev->data->dev_private;\n+\tstruct rte_eth_rss_conf bond_rss_conf;\n+\n+\tmemcpy(&bond_rss_conf, rss_conf, sizeof(struct rte_eth_rss_conf));\n+\n+\tbond_rss_conf.rss_hf &= internals->flow_type_rss_offloads;\n+\n+\tif (bond_rss_conf.rss_hf != 0)\n+\t\tdev->data->dev_conf.rx_adv_conf.rss_conf.rss_hf = bond_rss_conf.rss_hf;\n+\n+\tif (bond_rss_conf.rss_key && bond_rss_conf.rss_key_len <\n+\t\t\tsizeof(internals->rss_key)) {\n+\t\tif (bond_rss_conf.rss_key_len == 0)\n+\t\t\tbond_rss_conf.rss_key_len = 40;\n+\t\tinternals->rss_key_len = bond_rss_conf.rss_key_len;\n+\t\tmemcpy(internals->rss_key, bond_rss_conf.rss_key,\n+\t\t\t\tinternals->rss_key_len);\n+\t}\n+\n+\tfor (i = 0; i < internals->slave_count; i++) {\n+\t\tresult = rte_eth_dev_rss_hash_update(internals->slaves[i].port_id,\n+\t\t\t\t&bond_rss_conf);\n+\t\tif (result < 0)\n+\t\t\treturn result;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+bond_ethdev_rss_hash_conf_get(struct rte_eth_dev *dev,\n+\t\tstruct rte_eth_rss_conf *rss_conf)\n+{\n+\tstruct bond_dev_private *internals = dev->data->dev_private;\n+\n+\trss_conf->rss_hf = dev->data->dev_conf.rx_adv_conf.rss_conf.rss_hf;\n+\trss_conf->rss_key_len = internals->rss_key_len;\n+\tif (rss_conf->rss_key)\n+\t\tmemcpy(rss_conf->rss_key, internals->rss_key, internals->rss_key_len);\n+\n+\treturn 0;\n+}\n+\n struct eth_dev_ops default_dev_ops = {\n-\t\t.dev_start = bond_ethdev_start,\n-\t\t.dev_stop = bond_ethdev_stop,\n-\t\t.dev_close = bond_ethdev_close,\n-\t\t.dev_configure = bond_ethdev_configure,\n-\t\t.dev_infos_get = bond_ethdev_info,\n-\t\t.rx_queue_setup = bond_ethdev_rx_queue_setup,\n-\t\t.tx_queue_setup = bond_ethdev_tx_queue_setup,\n-\t\t.rx_queue_release = bond_ethdev_rx_queue_release,\n-\t\t.tx_queue_release = bond_ethdev_tx_queue_release,\n-\t\t.link_update = bond_ethdev_link_update,\n-\t\t.stats_get = bond_ethdev_stats_get,\n-\t\t.stats_reset = bond_ethdev_stats_reset,\n-\t\t.promiscuous_enable = bond_ethdev_promiscuous_enable,\n-\t\t.promiscuous_disable = bond_ethdev_promiscuous_disable\n+\t\t.dev_start            = bond_ethdev_start,\n+\t\t.dev_stop             = bond_ethdev_stop,\n+\t\t.dev_close            = bond_ethdev_close,\n+\t\t.dev_configure        = bond_ethdev_configure,\n+\t\t.dev_infos_get        = bond_ethdev_info,\n+\t\t.rx_queue_setup       = bond_ethdev_rx_queue_setup,\n+\t\t.tx_queue_setup       = bond_ethdev_tx_queue_setup,\n+\t\t.rx_queue_release     = bond_ethdev_rx_queue_release,\n+\t\t.tx_queue_release     = bond_ethdev_tx_queue_release,\n+\t\t.link_update          = bond_ethdev_link_update,\n+\t\t.stats_get            = bond_ethdev_stats_get,\n+\t\t.stats_reset          = bond_ethdev_stats_reset,\n+\t\t.promiscuous_enable   = bond_ethdev_promiscuous_enable,\n+\t\t.promiscuous_disable  = bond_ethdev_promiscuous_disable,\n+\t\t.reta_update          = bond_ethdev_rss_reta_update,\n+\t\t.reta_query           = bond_ethdev_rss_reta_query,\n+\t\t.rss_hash_update      = bond_ethdev_rss_hash_update,\n+\t\t.rss_hash_conf_get    = bond_ethdev_rss_hash_conf_get\n };\n \n static int\n@@ -2090,6 +2245,28 @@ bond_ethdev_configure(struct rte_eth_dev *dev)\n \tint arg_count;\n \tuint8_t port_id = dev - rte_eth_devices;\n \n+\tstatic const uint8_t default_rss_key[40] = {\n+\t\t0x6D, 0x5A, 0x56, 0xDA, 0x25, 0x5B, 0x0E, 0xC2, 0x41, 0x67, 0x25, 0x3D,\n+\t\t0x43, 0xA3, 0x8F, 0xB0, 0xD0, 0xCA, 0x2B, 0xCB, 0xAE, 0x7B, 0x30, 0xB4,\n+\t\t0x77, 0xCB, 0x2D, 0xA3, 0x80, 0x30, 0xF2, 0x0C, 0x6A, 0x42, 0xB7, 0x3B,\n+\t\t0xBE, 0xAC, 0x01, 0xFA\n+\t};\n+\n+\tunsigned i, j;\n+\n+\t/* If RSS is enabled, fill table and key with default values */\n+\tif (dev->data->dev_conf.rxmode.mq_mode & ETH_MQ_RX_RSS) {\n+\t\tdev->data->dev_conf.rx_adv_conf.rss_conf.rss_key = internals->rss_key;\n+\t\tdev->data->dev_conf.rx_adv_conf.rss_conf.rss_key_len = 0;\n+\t\tmemcpy(internals->rss_key, default_rss_key, 40);\n+\n+\t\tfor (i = 0; i < RTE_DIM(internals->reta_conf); i++) {\n+\t\t\tinternals->reta_conf[i].mask = ~0LL;\n+\t\t\tfor (j = 0; j < RTE_RETA_GROUP_SIZE; j++)\n+\t\t\t\tinternals->reta_conf[i].reta[j] = j % dev->data->nb_rx_queues;\n+\t\t}\n+\t}\n+\n \t/*\n \t * if no kvlist, it means that this bonded device has been created\n \t * through the bonding api.\ndiff --git a/drivers/net/bonding/rte_eth_bond_private.h b/drivers/net/bonding/rte_eth_bond_private.h\nindex 038bca6..e7af809 100644\n--- a/drivers/net/bonding/rte_eth_bond_private.h\n+++ b/drivers/net/bonding/rte_eth_bond_private.h\n@@ -103,6 +103,8 @@ struct bond_slave_details {\n \tuint8_t last_link_status;\n \t/**< Port Id of slave eth_dev */\n \tstruct ether_addr persisted_mac_addr;\n+\n+\tuint16_t reta_size;\n };\n \n \n@@ -155,6 +157,16 @@ struct bond_dev_private {\n \tuint32_t rx_offload_capa;            /** Rx offload capability */\n \tuint32_t tx_offload_capa;            /** Tx offload capability */\n \n+\t/** Bit mask of RSS offloads, the bit offset also means flow type */\n+\tuint64_t flow_type_rss_offloads;\n+\n+\tuint16_t reta_size;\n+\tstruct rte_eth_rss_reta_entry64 reta_conf[ETH_RSS_RETA_SIZE_512 /\n+\t\t\tRTE_RETA_GROUP_SIZE];\n+\n+\tuint8_t rss_key[52];\t\t\t\t/**< 52-byte hash key buffer. */\n+\tuint8_t rss_key_len;\t\t\t\t/**< hash key length in bytes. */\n+\n \tstruct rte_kvargs *kvlist;\n \tuint8_t slave_update_idx;\n };\n",
    "prefixes": [
        "dpdk-dev",
        "v6",
        "1/9"
    ]
}