get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 85808,
    "url": "http://patchwork.dpdk.org/api/patches/85808/?format=api",
    "web_url": "http://patchwork.dpdk.org/project/dpdk/patch/20201228112139.29445-6-haiyue.wang@intel.com/",
    "project": {
        "id": 1,
        "url": "http://patchwork.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": "<20201228112139.29445-6-haiyue.wang@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20201228112139.29445-6-haiyue.wang@intel.com",
    "date": "2020-12-28T11:21:39",
    "name": "[v4,5/5] net/iavf: implement new VLAN capability handling",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "0dc773c9734848842faf896e5bc63c0e0cca4e59",
    "submitter": {
        "id": 1044,
        "url": "http://patchwork.dpdk.org/api/people/1044/?format=api",
        "name": "Wang, Haiyue",
        "email": "haiyue.wang@intel.com"
    },
    "delegate": {
        "id": 1540,
        "url": "http://patchwork.dpdk.org/api/users/1540/?format=api",
        "username": "qzhan15",
        "first_name": "Qi",
        "last_name": "Zhang",
        "email": "qi.z.zhang@intel.com"
    },
    "mbox": "http://patchwork.dpdk.org/project/dpdk/patch/20201228112139.29445-6-haiyue.wang@intel.com/mbox/",
    "series": [
        {
            "id": 14481,
            "url": "http://patchwork.dpdk.org/api/series/14481/?format=api",
            "web_url": "http://patchwork.dpdk.org/project/dpdk/list/?series=14481",
            "date": "2020-12-28T11:21:34",
            "name": "Add AVF & DCF VLAN feaure",
            "version": 4,
            "mbox": "http://patchwork.dpdk.org/series/14481/mbox/"
        }
    ],
    "comments": "http://patchwork.dpdk.org/api/patches/85808/comments/",
    "check": "success",
    "checks": "http://patchwork.dpdk.org/api/patches/85808/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<dev-bounces@dpdk.org>",
        "X-Original-To": "patchwork@inbox.dpdk.org",
        "Delivered-To": "patchwork@inbox.dpdk.org",
        "Received": [
            "from dpdk.org (dpdk.org [92.243.14.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 0D5E2A09FF;\n\tMon, 28 Dec 2020 12:38:26 +0100 (CET)",
            "from [92.243.14.124] (localhost [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id 7D95CCA63;\n\tMon, 28 Dec 2020 12:37:01 +0100 (CET)",
            "from mga03.intel.com (mga03.intel.com [134.134.136.65])\n by dpdk.org (Postfix) with ESMTP id B0DBFCA4E\n for <dev@dpdk.org>; Mon, 28 Dec 2020 12:36:56 +0100 (CET)",
            "from orsmga001.jf.intel.com ([10.7.209.18])\n by orsmga103.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 28 Dec 2020 03:36:56 -0800",
            "from npg-dpdk-haiyue-3.sh.intel.com ([10.67.118.172])\n by orsmga001.jf.intel.com with ESMTP; 28 Dec 2020 03:36:54 -0800"
        ],
        "IronPort-SDR": [
            "\n zYxlU8QegARroWKLD5BiV8wuJsAelWVuL9b7/owt3GsLgta1PAPyLyyU+TksfaEDzd9Z02ObZN\n V1NU55X2NbBQ==",
            "\n Iff99Cs9iv/Aa4KAw4kZoOqh91WhE5xv1l7jUyMOack2xQBOsEtITGo6VGXNUQTCl+3rNRNpeU\n NVmAXXODTb0A=="
        ],
        "X-IronPort-AV": [
            "E=McAfee;i=\"6000,8403,9847\"; a=\"176470309\"",
            "E=Sophos;i=\"5.78,455,1599548400\"; d=\"scan'208\";a=\"176470309\"",
            "E=Sophos;i=\"5.78,455,1599548400\"; d=\"scan'208\";a=\"418776972\""
        ],
        "X-ExtLoop1": "1",
        "From": "Haiyue Wang <haiyue.wang@intel.com>",
        "To": "dev@dpdk.org",
        "Cc": "qiming.yang@intel.com, jingjing.wu@intel.com, qi.z.zhang@intel.com,\n qi.fu@intel.com, Haiyue Wang <haiyue.wang@intel.com>,\n Beilei Xing <beilei.xing@intel.com>",
        "Date": "Mon, 28 Dec 2020 19:21:39 +0800",
        "Message-Id": "<20201228112139.29445-6-haiyue.wang@intel.com>",
        "X-Mailer": "git-send-email 2.29.2",
        "In-Reply-To": "<20201228112139.29445-1-haiyue.wang@intel.com>",
        "References": "<20201214071155.98764-1-haiyue.wang@intel.com>\n <20201228112139.29445-1-haiyue.wang@intel.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [PATCH v4 5/5] net/iavf: implement new VLAN capability\n\thandling",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <dev.dpdk.org>",
        "List-Unsubscribe": "<https://mails.dpdk.org/options/dev>,\n <mailto:dev-request@dpdk.org?subject=unsubscribe>",
        "List-Archive": "<http://mails.dpdk.org/archives/dev/>",
        "List-Post": "<mailto:dev@dpdk.org>",
        "List-Help": "<mailto:dev-request@dpdk.org?subject=help>",
        "List-Subscribe": "<https://mails.dpdk.org/listinfo/dev>,\n <mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "The new VLAN virtchnl opcodes introduce new settings like different TPID\nfiltering, stripping.\n\nQuery the PF's VLAN capabilities based on current device configuration,\nthen set the ethdev VLAN information that the VF can support.\n\nThe VLAN filtering and offload acceleration should be performed on the\nouter VLAN tag when the double VLAN mode is enabled on the PF:\n a). 0x8100\n b). 0x8100 + 0x8100\n c). 0x9100 + 0x8100\n d). 0x88a8 + 0x8100\n\nSigned-off-by: Qiming Yang <qiming.yang@intel.com>\nSigned-off-by: Haiyue Wang <haiyue.wang@intel.com>\n---\n drivers/net/iavf/iavf.h        |  10 +++\n drivers/net/iavf/iavf_ethdev.c | 114 ++++++++++++++++++++++++++\n drivers/net/iavf/iavf_vchnl.c  | 141 +++++++++++++++++++++++++++++++++\n 3 files changed, 265 insertions(+)",
    "diff": "diff --git a/drivers/net/iavf/iavf.h b/drivers/net/iavf/iavf.h\nindex 9754273b2..c5d53bd9c 100644\n--- a/drivers/net/iavf/iavf.h\n+++ b/drivers/net/iavf/iavf.h\n@@ -139,6 +139,7 @@ struct iavf_info {\n \tstruct virtchnl_version_info virtchnl_version;\n \tstruct virtchnl_vf_resource *vf_res; /* VF resource */\n \tstruct virtchnl_vsi_resource *vsi_res; /* LAN VSI */\n+\tstruct virtchnl_vlan_caps vlan_v2_caps;\n \tuint64_t supported_rxdid;\n \tuint8_t *proto_xtr; /* proto xtr type for all queues */\n \tvolatile enum virtchnl_ops pend_cmd; /* pending command not finished */\n@@ -173,6 +174,10 @@ struct iavf_info {\n \tstruct iavf_fdir_info fdir; /* flow director info */\n \t/* indicate large VF support enabled or not */\n \tbool lv_enabled;\n+\n+\t/* used to set the VLAN Ethernet type for virtchnl VLAN V2 */\n+\tuint16_t outer_vlan_tpid;\n+\tuint16_t inner_vlan_tpid;\n };\n \n #define IAVF_MAX_PKT_TYPE 1024\n@@ -297,6 +302,8 @@ int iavf_get_vf_resource(struct iavf_adapter *adapter);\n void iavf_handle_virtchnl_msg(struct rte_eth_dev *dev);\n int iavf_enable_vlan_strip(struct iavf_adapter *adapter);\n int iavf_disable_vlan_strip(struct iavf_adapter *adapter);\n+int iavf_config_vlan_strip_v2(struct iavf_adapter *adapter, uint16_t tpid,\n+\t\t\t      bool enable);\n int iavf_switch_queue(struct iavf_adapter *adapter, uint16_t qid,\n \t\t     bool rx, bool on);\n int iavf_switch_queue_lv(struct iavf_adapter *adapter, uint16_t qid,\n@@ -310,6 +317,7 @@ int iavf_configure_rss_key(struct iavf_adapter *adapter);\n int iavf_configure_queues(struct iavf_adapter *adapter,\n \t\t\tuint16_t num_queue_pairs, uint16_t index);\n int iavf_get_supported_rxdid(struct iavf_adapter *adapter);\n+int iavf_get_vlan_offload_caps_v2(struct iavf_adapter *adapter);\n int iavf_config_irq_map(struct iavf_adapter *adapter);\n int iavf_config_irq_map_lv(struct iavf_adapter *adapter, uint16_t num,\n \t\t\tuint16_t index);\n@@ -323,6 +331,8 @@ int iavf_config_promisc(struct iavf_adapter *adapter, bool enable_unicast,\n int iavf_add_del_eth_addr(struct iavf_adapter *adapter,\n \t\t\t struct rte_ether_addr *addr, bool add);\n int iavf_add_del_vlan(struct iavf_adapter *adapter, uint16_t vlanid, bool add);\n+int iavf_add_del_vlan_v2(struct iavf_adapter *adapter, uint16_t tpid,\n+\t\t\t uint16_t vlanid, bool add);\n int iavf_fdir_add(struct iavf_adapter *adapter, struct iavf_fdir_conf *filter);\n int iavf_fdir_del(struct iavf_adapter *adapter, struct iavf_fdir_conf *filter);\n int iavf_fdir_check(struct iavf_adapter *adapter,\ndiff --git a/drivers/net/iavf/iavf_ethdev.c b/drivers/net/iavf/iavf_ethdev.c\nindex 49e6dd125..944dad75b 100644\n--- a/drivers/net/iavf/iavf_ethdev.c\n+++ b/drivers/net/iavf/iavf_ethdev.c\n@@ -100,6 +100,8 @@ static void iavf_dev_del_mac_addr(struct rte_eth_dev *dev, uint32_t index);\n static int iavf_dev_vlan_filter_set(struct rte_eth_dev *dev,\n \t\t\t\t   uint16_t vlan_id, int on);\n static int iavf_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask);\n+static int iavf_dev_vlan_tpid_set(struct rte_eth_dev *dev,\n+\t\t\t\t  enum rte_vlan_type vlan_type, uint16_t tpid);\n static int iavf_dev_rss_reta_update(struct rte_eth_dev *dev,\n \t\t\t\t   struct rte_eth_rss_reta_entry64 *reta_conf,\n \t\t\t\t   uint16_t reta_size);\n@@ -176,6 +178,7 @@ static const struct eth_dev_ops iavf_eth_dev_ops = {\n \t.mac_addr_remove            = iavf_dev_del_mac_addr,\n \t.set_mc_addr_list\t\t\t= iavf_set_mc_addr_list,\n \t.vlan_filter_set            = iavf_dev_vlan_filter_set,\n+\t.vlan_tpid_set              = iavf_dev_vlan_tpid_set,\n \t.vlan_offload_set           = iavf_dev_vlan_offload_set,\n \t.rx_queue_start             = iavf_dev_rx_queue_start,\n \t.rx_queue_stop              = iavf_dev_rx_queue_stop,\n@@ -326,6 +329,12 @@ iavf_queues_req_reset(struct rte_eth_dev *dev, uint16_t num)\n \treturn 0;\n }\n \n+static __rte_always_inline uint16_t\n+iavf_vlan_tpid_used(struct iavf_info *vf, bool qinq)\n+{\n+\treturn qinq ? vf->outer_vlan_tpid : vf->inner_vlan_tpid;\n+}\n+\n static int\n iavf_dev_configure(struct rte_eth_dev *dev)\n {\n@@ -389,6 +398,17 @@ iavf_dev_configure(struct rte_eth_dev *dev)\n \t\tvf->max_rss_qregion = IAVF_MAX_NUM_QUEUES_DFLT;\n \t}\n \n+\t/* Vlan v2 stripping setting */\n+\tif (vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_VLAN_V2) {\n+\t\tbool qinq = !!(dev_conf->rxmode.offloads &\n+\t\t\t       DEV_RX_OFFLOAD_VLAN_EXTEND);\n+\t\tbool enable = !!(dev_conf->rxmode.offloads &\n+\t\t\t\t DEV_RX_OFFLOAD_VLAN_STRIP);\n+\n+\t\tiavf_config_vlan_strip_v2(ad, iavf_vlan_tpid_used(vf, qinq),\n+\t\t\t\t\t  enable);\n+\t}\n+\n \t/* Vlan stripping setting */\n \tif (vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_VLAN) {\n \t\tif (dev_conf->rxmode.offloads & DEV_RX_OFFLOAD_VLAN_STRIP)\n@@ -784,6 +804,9 @@ iavf_dev_info_get(struct rte_eth_dev *dev, struct rte_eth_dev_info *dev_info)\n \t\tDEV_RX_OFFLOAD_JUMBO_FRAME |\n \t\tDEV_RX_OFFLOAD_VLAN_FILTER |\n \t\tDEV_RX_OFFLOAD_RSS_HASH;\n+\tif (vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_VLAN_V2)\n+\t\tdev_info->rx_offload_capa |= DEV_RX_OFFLOAD_VLAN_EXTEND;\n+\n \tdev_info->tx_offload_capa =\n \t\tDEV_TX_OFFLOAD_VLAN_INSERT |\n \t\tDEV_TX_OFFLOAD_QINQ_INSERT |\n@@ -989,6 +1012,47 @@ iavf_dev_del_mac_addr(struct rte_eth_dev *dev, uint32_t index)\n \tvf->mac_num--;\n }\n \n+static int\n+iavf_dev_vlan_tpid_set(struct rte_eth_dev *dev, enum rte_vlan_type vlan_type,\n+\t\t       uint16_t tpid)\n+{\n+\tstruct iavf_adapter *adapter =\n+\t\tIAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);\n+\tstruct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(adapter);\n+\tbool qinq = !!(dev->data->dev_conf.rxmode.offloads &\n+\t\t       DEV_RX_OFFLOAD_VLAN_EXTEND);\n+\n+\tif (vlan_type != ETH_VLAN_TYPE_INNER &&\n+\t    vlan_type != ETH_VLAN_TYPE_OUTER) {\n+\t\tPMD_DRV_LOG(ERR, \"Unsupported vlan type\");\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tif (!qinq) {\n+\t\tPMD_DRV_LOG(ERR, \"QinQ not enabled\");\n+\t\treturn -EINVAL;\n+\t}\n+\n+\tif (vlan_type == ETH_VLAN_TYPE_OUTER) {\n+\t\tswitch (tpid) {\n+\t\tcase RTE_ETHER_TYPE_QINQ:\n+\t\tcase RTE_ETHER_TYPE_VLAN:\n+\t\tcase RTE_ETHER_TYPE_QINQ1:\n+\t\t\tvf->outer_vlan_tpid = tpid;\n+\t\t\tbreak;\n+\t\tdefault:\n+\t\t\tPMD_DRV_LOG(ERR, \"Invalid TPID: %x\", tpid);\n+\t\t\treturn -EINVAL;\n+\t\t}\n+\t} else {\n+\t\tPMD_DRV_LOG(ERR,\n+\t\t\t    \"Can accelerate only outer vlan in QinQ\");\n+\t\treturn -EINVAL;\n+\t}\n+\n+\treturn 0;\n+}\n+\n static int\n iavf_dev_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on)\n {\n@@ -997,6 +1061,18 @@ iavf_dev_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on)\n \tstruct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(adapter);\n \tint err;\n \n+\tif (vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_VLAN_V2) {\n+\t\tbool qinq = !!(dev->data->dev_conf.rxmode.offloads &\n+\t\t\t       DEV_RX_OFFLOAD_VLAN_EXTEND);\n+\n+\t\terr = iavf_add_del_vlan_v2(adapter,\n+\t\t\t\t\t   iavf_vlan_tpid_used(vf, qinq),\n+\t\t\t\t\t   vlan_id, on);\n+\t\tif (err)\n+\t\t\treturn -EIO;\n+\t\treturn 0;\n+\t}\n+\n \tif (!(vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_VLAN))\n \t\treturn -ENOTSUP;\n \n@@ -1006,6 +1082,31 @@ iavf_dev_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on)\n \treturn 0;\n }\n \n+static int\n+iavf_dev_vlan_offload_set_v2(struct rte_eth_dev *dev, int mask)\n+{\n+\tstruct iavf_adapter *adapter =\n+\t\tIAVF_DEV_PRIVATE_TO_ADAPTER(dev->data->dev_private);\n+\tstruct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(adapter);\n+\tstruct rte_eth_conf *dev_conf = &dev->data->dev_conf;\n+\tuint16_t qinq = !!(dev_conf->rxmode.offloads &\n+\t\t\t   DEV_RX_OFFLOAD_VLAN_EXTEND);\n+\tint err;\n+\n+\tif (mask & ETH_VLAN_STRIP_MASK) {\n+\t\tbool enable = !!(dev_conf->rxmode.offloads &\n+\t\t\t\t DEV_RX_OFFLOAD_VLAN_STRIP);\n+\n+\t\terr = iavf_config_vlan_strip_v2(adapter,\n+\t\t\t\t\t\tiavf_vlan_tpid_used(vf, qinq),\n+\t\t\t\t\t\tenable);\n+\t\tif (err)\n+\t\t\treturn -EIO;\n+\t}\n+\n+\treturn 0;\n+}\n+\n static int\n iavf_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask)\n {\n@@ -1015,6 +1116,9 @@ iavf_dev_vlan_offload_set(struct rte_eth_dev *dev, int mask)\n \tstruct rte_eth_conf *dev_conf = &dev->data->dev_conf;\n \tint err;\n \n+\tif (vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_VLAN_V2)\n+\t\treturn iavf_dev_vlan_offload_set_v2(dev, mask);\n+\n \tif (!(vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_VLAN))\n \t\treturn -ENOTSUP;\n \n@@ -1898,6 +2002,16 @@ iavf_init_vf(struct rte_eth_dev *dev)\n \t\t}\n \t}\n \n+\tif (vf->vf_res->vf_cap_flags & VIRTCHNL_VF_OFFLOAD_VLAN_V2) {\n+\t\tif (iavf_get_vlan_offload_caps_v2(adapter) != 0) {\n+\t\t\tPMD_INIT_LOG(ERR, \"failed to do get VLAN offload v2 capabilities\");\n+\t\t\tgoto err_rss;\n+\t\t}\n+\n+\t\tvf->outer_vlan_tpid = RTE_ETHER_TYPE_VLAN;\n+\t\tvf->inner_vlan_tpid = RTE_ETHER_TYPE_VLAN;\n+\t}\n+\n \tiavf_init_proto_xtr(dev);\n \n \treturn 0;\ndiff --git a/drivers/net/iavf/iavf_vchnl.c b/drivers/net/iavf/iavf_vchnl.c\nindex c33194cdc..b2b5ace31 100644\n--- a/drivers/net/iavf/iavf_vchnl.c\n+++ b/drivers/net/iavf/iavf_vchnl.c\n@@ -174,6 +174,7 @@ iavf_execute_vf_cmd(struct iavf_adapter *adapter, struct iavf_cmd_info *args)\n \tcase VIRTCHNL_OP_VERSION:\n \tcase VIRTCHNL_OP_GET_VF_RESOURCES:\n \tcase VIRTCHNL_OP_GET_SUPPORTED_RXDIDS:\n+\tcase VIRTCHNL_OP_GET_OFFLOAD_VLAN_V2_CAPS:\n \t\t/* for init virtchnl ops, need to poll the response */\n \t\tdo {\n \t\t\tresult = iavf_read_msg_from_pf(adapter, args->out_size,\n@@ -366,6 +367,28 @@ iavf_enable_vlan_strip(struct iavf_adapter *adapter)\n \treturn ret;\n }\n \n+static uint16_t\n+iavf_vc_vlan_tpid_flag(uint16_t tpid)\n+{\n+\tuint16_t flag = VIRTCHNL_VLAN_UNSUPPORTED;\n+\n+\tswitch (tpid) {\n+\tcase RTE_ETHER_TYPE_VLAN:\n+\t\tflag = VIRTCHNL_VLAN_ETHERTYPE_8100;\n+\t\tbreak;\n+\tcase RTE_ETHER_TYPE_QINQ1:\n+\t\tflag = VIRTCHNL_VLAN_ETHERTYPE_9100;\n+\t\tbreak;\n+\tcase RTE_ETHER_TYPE_QINQ:\n+\t\tflag = VIRTCHNL_VLAN_ETHERTYPE_88A8;\n+\t\tbreak;\n+\tdefault:\n+\t\tbreak;\n+\t}\n+\n+\treturn flag;\n+}\n+\n int\n iavf_disable_vlan_strip(struct iavf_adapter *adapter)\n {\n@@ -387,6 +410,52 @@ iavf_disable_vlan_strip(struct iavf_adapter *adapter)\n \treturn ret;\n }\n \n+int\n+iavf_config_vlan_strip_v2(struct iavf_adapter *adapter, uint16_t tpid,\n+\t\t\t  bool enable)\n+{\n+\tstruct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(adapter);\n+\tstruct virtchnl_vlan_strip vlan_strip;\n+\tstruct iavf_cmd_info args;\n+\tu16 stripping_caps;\n+\tu16 vlan_tpid_flag;\n+\tu16 *vlan_setting;\n+\tint ret;\n+\n+\t/* Give priority over outer if it's enabled */\n+\tif (vf->vlan_v2_caps.offloads.outer_stripping) {\n+\t\tstripping_caps = vf->vlan_v2_caps.offloads.outer_stripping;\n+\t\tvlan_setting = &vlan_strip.outer_ethertype_setting;\n+\t} else if (vf->vlan_v2_caps.offloads.inner_stripping) {\n+\t\tstripping_caps = vf->vlan_v2_caps.offloads.inner_stripping;\n+\t\tvlan_setting = &vlan_strip.inner_ethertype_setting;\n+\t} else {\n+\t\treturn -ENOTSUP;\n+\t}\n+\n+\tvlan_tpid_flag = iavf_vc_vlan_tpid_flag(tpid);\n+\tif (!(stripping_caps & vlan_tpid_flag))\n+\t\treturn -EINVAL;\n+\n+\tmemset(&vlan_strip, 0, sizeof(vlan_strip));\n+\tvlan_strip.vsi_id = vf->vsi_res->vsi_id;\n+\t*vlan_setting = vlan_tpid_flag;\n+\n+\targs.ops = enable ? VIRTCHNL_OP_ENABLE_VLAN_STRIPPING_V2 :\n+\t\t\t    VIRTCHNL_OP_DISABLE_VLAN_STRIPPING_V2;\n+\targs.in_args = (uint8_t *)&vlan_strip;\n+\targs.in_args_size = sizeof(vlan_strip);\n+\targs.out_buffer = vf->aq_resp;\n+\targs.out_size = IAVF_AQ_BUF_SZ;\n+\tret = iavf_execute_vf_cmd(adapter, &args);\n+\tif (ret)\n+\t\tPMD_DRV_LOG(ERR, \"fail to execute command %s\",\n+\t\t\t    enable ? \"VIRTCHNL_OP_ENABLE_VLAN_STRIPPING_V2\" :\n+\t\t\t\t     \"VIRTCHNL_OP_DISABLE_VLAN_STRIPPING_V2\");\n+\n+\treturn ret;\n+}\n+\n #define VIRTCHNL_VERSION_MAJOR_START 1\n #define VIRTCHNL_VERSION_MINOR_START 1\n \n@@ -459,6 +528,7 @@ iavf_get_vf_resource(struct iavf_adapter *adapter)\n \t\tVIRTCHNL_VF_OFFLOAD_ADV_RSS_PF |\n \t\tVIRTCHNL_VF_OFFLOAD_REQ_QUEUES |\n \t\tVIRTCHNL_VF_OFFLOAD_CRC |\n+\t\tVIRTCHNL_VF_OFFLOAD_VLAN_V2 |\n \t\tVIRTCHNL_VF_LARGE_NUM_QPAIRS;\n \n \targs.in_args = (uint8_t *)&caps;\n@@ -522,6 +592,31 @@ iavf_get_supported_rxdid(struct iavf_adapter *adapter)\n \treturn 0;\n }\n \n+int\n+iavf_get_vlan_offload_caps_v2(struct iavf_adapter *adapter)\n+{\n+\tstruct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(adapter);\n+\tstruct iavf_cmd_info args;\n+\tint ret;\n+\n+\targs.ops = VIRTCHNL_OP_GET_OFFLOAD_VLAN_V2_CAPS;\n+\targs.in_args = NULL;\n+\targs.in_args_size = 0;\n+\targs.out_buffer = vf->aq_resp;\n+\targs.out_size = IAVF_AQ_BUF_SZ;\n+\n+\tret = iavf_execute_vf_cmd(adapter, &args);\n+\tif (ret) {\n+\t\tPMD_DRV_LOG(ERR,\n+\t\t\t    \"Failed to execute command of VIRTCHNL_OP_GET_OFFLOAD_VLAN_V2_CAPS\");\n+\t\treturn ret;\n+\t}\n+\n+\trte_memcpy(&vf->vlan_v2_caps, vf->aq_resp, sizeof(vf->vlan_v2_caps));\n+\n+\treturn 0;\n+}\n+\n int\n iavf_enable_queues(struct iavf_adapter *adapter)\n {\n@@ -1167,6 +1262,52 @@ iavf_add_del_vlan(struct iavf_adapter *adapter, uint16_t vlanid, bool add)\n \treturn err;\n }\n \n+int\n+iavf_add_del_vlan_v2(struct iavf_adapter *adapter, uint16_t tpid,\n+\t\t     uint16_t vlanid, bool add)\n+{\n+\tstruct iavf_info *vf = IAVF_DEV_PRIVATE_TO_VF(adapter);\n+\tstruct virtchnl_vlan_filter_list_v2 vlan_list;\n+\tstruct virtchnl_vlan *vlan_setting;\n+\tstruct iavf_cmd_info args;\n+\tuint16_t filtering_caps;\n+\tuint16_t vlan_tpid_flag;\n+\tint err;\n+\n+\t/* Give priority over outer if it's enabled */\n+\tif (vf->vlan_v2_caps.filtering.outer) {\n+\t\tfiltering_caps = vf->vlan_v2_caps.filtering.outer;\n+\t\tvlan_setting = &vlan_list.filters[0].outer;\n+\t} else if (vf->vlan_v2_caps.filtering.inner) {\n+\t\tfiltering_caps = vf->vlan_v2_caps.filtering.inner;\n+\t\tvlan_setting = &vlan_list.filters[0].inner;\n+\t} else {\n+\t\treturn -ENOTSUP;\n+\t}\n+\n+\tvlan_tpid_flag = iavf_vc_vlan_tpid_flag(tpid);\n+\tif (!(filtering_caps & vlan_tpid_flag))\n+\t\treturn -EINVAL;\n+\n+\tmemset(&vlan_list, 0, sizeof(vlan_list));\n+\tvlan_list.vport_id = vf->vsi_res->vsi_id;\n+\tvlan_list.num_elements = 1;\n+\tvlan_setting->tci = vlanid;\n+\tvlan_setting->tpid = tpid;\n+\n+\targs.ops = add ? VIRTCHNL_OP_ADD_VLAN_V2 : VIRTCHNL_OP_DEL_VLAN_V2;\n+\targs.in_args = (uint8_t *)&vlan_list;\n+\targs.in_args_size = sizeof(vlan_list);\n+\targs.out_buffer = vf->aq_resp;\n+\targs.out_size = IAVF_AQ_BUF_SZ;\n+\terr = iavf_execute_vf_cmd(adapter, &args);\n+\tif (err)\n+\t\tPMD_DRV_LOG(ERR, \"fail to execute command %s\",\n+\t\t\t    add ? \"OP_ADD_VLAN_V2\" :  \"OP_DEL_VLAN_V2\");\n+\n+\treturn err;\n+}\n+\n int\n iavf_fdir_add(struct iavf_adapter *adapter,\n \tstruct iavf_fdir_conf *filter)\n",
    "prefixes": [
        "v4",
        "5/5"
    ]
}