get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 10747,
    "url": "http://patches.dpdk.org/api/patches/10747/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/1456164127-28072-6-git-send-email-adrien.mazarguil@6wind.com/",
    "project": {
        "id": 1,
        "url": "http://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": "<1456164127-28072-6-git-send-email-adrien.mazarguil@6wind.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1456164127-28072-6-git-send-email-adrien.mazarguil@6wind.com",
    "date": "2016-02-22T18:02:07",
    "name": "[dpdk-dev,v2,5/5] mlx5: add support for RX VLAN stripping",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "936284a83544f32ee8327f51efccb7d21f19b16a",
    "submitter": {
        "id": 165,
        "url": "http://patches.dpdk.org/api/people/165/?format=api",
        "name": "Adrien Mazarguil",
        "email": "adrien.mazarguil@6wind.com"
    },
    "delegate": {
        "id": 10,
        "url": "http://patches.dpdk.org/api/users/10/?format=api",
        "username": "bruce",
        "first_name": "Bruce",
        "last_name": "Richardson",
        "email": "bruce.richardson@intel.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/1456164127-28072-6-git-send-email-adrien.mazarguil@6wind.com/mbox/",
    "series": [],
    "comments": "http://patches.dpdk.org/api/patches/10747/comments/",
    "check": "pending",
    "checks": "http://patches.dpdk.org/api/patches/10747/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 637383237;\n\tMon, 22 Feb 2016 19:02:37 +0100 (CET)",
            "from mail-wm0-f43.google.com (mail-wm0-f43.google.com\n\t[74.125.82.43]) by dpdk.org (Postfix) with ESMTP id 246632C6E\n\tfor <dev@dpdk.org>; Mon, 22 Feb 2016 19:02:36 +0100 (CET)",
            "by mail-wm0-f43.google.com with SMTP id a4so174767792wme.1\n\tfor <dev@dpdk.org>; Mon, 22 Feb 2016 10:02:36 -0800 (PST)",
            "from 6wind.com (guy78-3-82-239-227-177.fbx.proxad.net.\n\t[82.239.227.177]) by smtp.gmail.com with ESMTPSA id\n\tb203sm22147862wmh.8.2016.02.22.10.02.34\n\t(version=TLSv1/SSLv3 cipher=OTHER);\n\tMon, 22 Feb 2016 10:02:35 -0800 (PST)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=6wind-com.20150623.gappssmtp.com; s=20150623;\n\th=from:to:cc:subject:date:message-id:in-reply-to:references;\n\tbh=3yYyCIituQsiN1Ii/MuUjKwvLZ0c76m8KkK0OECwXns=;\n\tb=ga+90DTZuRtbSw9X/g+6Nr0MXfbwoaQ3VXs1v8tqs2xzTbH4zRhnv2oAsbRplcspJh\n\tPMew0aUVMnkWOUTiYgZHUIqiZqXfDHZbyq59ooyPHQuSNKJE1a78ARlHyV/kk3dSD/Yj\n\tReG6Y5Pmbfm46XnUT6AwcM1gDwt5XQgAVk/Yz+VobUXfTJ01ESbj//HubPCbQfBJDqfy\n\tbDvjt0Rr1gYi4VQqF0d//ughkTiHjBnrGF/4tQdWOWOfK0HRuOaH+2Mn+KECwX5EMEUa\n\tj6/q/5UI473arUD78fuLWonsLhYhs9UblGFV7L5ezg73iIJsiRovOLoSHfDQMAf1+0cN\n\tBFSw==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20130820;\n\th=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n\t:references;\n\tbh=3yYyCIituQsiN1Ii/MuUjKwvLZ0c76m8KkK0OECwXns=;\n\tb=BP7a74ofrpgai8R9eXZfE3X4E7yCj3FArsoEpHQRx0ncrcuXi+Osktgsb8wU/s2l10\n\tP6cUvX06EjDxBt/5v49ZJ4PaTTRdR4u9HsG59O+aLGy0w78ZZg6M9tplQ9xFv8rn/Ow1\n\tRjDfAkmJ5qdL1o1rioNxHAFF7CeXf1gsRQcejL4Hy1m3C6xEkqxkYNGOBGTN+T9aHho1\n\tUxiXc3a2U5BffLwZPJ+AiGQg+mGMQhb/03QIjtPIT2igkmr8C1+qonnZibPkl7cHCF/O\n\tGeWkDr5VbKqdM0Zh/6AQWQdWwghsKfHtRnqJkcZTlYARm3bgz3lSMlKfLWgUd4QiZjei\n\tQg2A==",
        "X-Gm-Message-State": "AG10YOSzZBtkllwE02pRQydlbgYZvwhj0JScwcIXCKhxhgdcmksYSWH2Hl3ufSf7ej/rneC7",
        "X-Received": "by 10.28.68.139 with SMTP id r133mr13513439wma.13.1456164156006; \n\tMon, 22 Feb 2016 10:02:36 -0800 (PST)",
        "From": "Adrien Mazarguil <adrien.mazarguil@6wind.com>",
        "To": "dev@dpdk.org",
        "Date": "Mon, 22 Feb 2016 19:02:07 +0100",
        "Message-Id": "<1456164127-28072-6-git-send-email-adrien.mazarguil@6wind.com>",
        "X-Mailer": "git-send-email 2.1.4",
        "In-Reply-To": "<1456164127-28072-1-git-send-email-adrien.mazarguil@6wind.com>",
        "References": "<1454063522-1948-1-git-send-email-adrien.mazarguil@6wind.com>\n\t<1456164127-28072-1-git-send-email-adrien.mazarguil@6wind.com>",
        "Subject": "[dpdk-dev] [PATCH v2 5/5] mlx5: add support for RX VLAN stripping",
        "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": "From: Yaacov Hazan <yaacovh@mellanox.com>\n\nAllows HW to strip the 802.1Q header from incoming frames and report it\nthrough the mbuf structure.\n\nThis feature requires MLNX_OFED >= 3.2.\n\nSigned-off-by: Yaacov Hazan <yaacovh@mellanox.com>\nSigned-off-by: Adrien Mazarguil <adrien.mazarguil@6wind.com>\n---\n doc/guides/nics/mlx5.rst               |   2 +\n doc/guides/rel_notes/release_16_04.rst |   6 ++\n drivers/net/mlx5/mlx5.c                |  16 ++++-\n drivers/net/mlx5/mlx5.h                |   3 +\n drivers/net/mlx5/mlx5_rxq.c            |  17 +++++-\n drivers/net/mlx5/mlx5_rxtx.c           |  27 +++++++++\n drivers/net/mlx5/mlx5_rxtx.h           |   5 ++\n drivers/net/mlx5/mlx5_vlan.c           | 104 +++++++++++++++++++++++++++++++++\n 8 files changed, 178 insertions(+), 2 deletions(-)",
    "diff": "diff --git a/doc/guides/nics/mlx5.rst b/doc/guides/nics/mlx5.rst\nindex 8981068..8422206 100644\n--- a/doc/guides/nics/mlx5.rst\n+++ b/doc/guides/nics/mlx5.rst\n@@ -83,6 +83,7 @@ Features\n - Configurable RETA table.\n - Support for multiple MAC addresses.\n - VLAN filtering.\n+- RX VLAN stripping.\n - Promiscuous mode.\n - Multicast promiscuous mode.\n - Hardware checksum offloads.\n@@ -229,6 +230,7 @@ Currently supported by DPDK:\n     above only:\n \n     - Flow director.\n+    - RX VLAN stripping.\n \n - Minimum firmware version:\n \ndiff --git a/doc/guides/rel_notes/release_16_04.rst b/doc/guides/rel_notes/release_16_04.rst\nindex b3ced63..4d2f76c 100644\n--- a/doc/guides/rel_notes/release_16_04.rst\n+++ b/doc/guides/rel_notes/release_16_04.rst\n@@ -73,6 +73,12 @@ This section should contain new features added in this release. Sample format:\n \n   Only available with Mellanox OFED >= 3.2.\n \n+* **mlx5: RX VLAN stripping support.**\n+\n+  Added support for RX VLAN stripping.\n+\n+  Only available with Mellanox OFED >= 3.2.\n+\n \n Resolved Issues\n ---------------\ndiff --git a/drivers/net/mlx5/mlx5.c b/drivers/net/mlx5/mlx5.c\nindex 43e24ff..575420e 100644\n--- a/drivers/net/mlx5/mlx5.c\n+++ b/drivers/net/mlx5/mlx5.c\n@@ -171,6 +171,10 @@ static const struct eth_dev_ops mlx5_dev_ops = {\n \t.mac_addr_add = mlx5_mac_addr_add,\n \t.mac_addr_set = mlx5_mac_addr_set,\n \t.mtu_set = mlx5_dev_set_mtu,\n+#ifdef HAVE_EXP_DEVICE_ATTR_VLAN_OFFLOADS\n+\t.vlan_strip_queue_set = mlx5_vlan_strip_queue_set,\n+\t.vlan_offload_set = mlx5_vlan_offload_set,\n+#endif /* HAVE_EXP_DEVICE_ATTR_VLAN_OFFLOADS */\n \t.reta_update = mlx5_dev_rss_reta_update,\n \t.reta_query = mlx5_dev_rss_reta_query,\n \t.rss_hash_update = mlx5_rss_hash_update,\n@@ -325,7 +329,11 @@ mlx5_pci_devinit(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev)\n #ifdef HAVE_EXP_QUERY_DEVICE\n \t\texp_device_attr.comp_mask =\n \t\t\tIBV_EXP_DEVICE_ATTR_EXP_CAP_FLAGS |\n-\t\t\tIBV_EXP_DEVICE_ATTR_RX_HASH;\n+\t\t\tIBV_EXP_DEVICE_ATTR_RX_HASH |\n+#ifdef HAVE_EXP_DEVICE_ATTR_VLAN_OFFLOADS\n+\t\t\tIBV_EXP_DEVICE_ATTR_VLAN_OFFLOADS |\n+#endif /* HAVE_EXP_DEVICE_ATTR_VLAN_OFFLOADS */\n+\t\t\t0;\n #endif /* HAVE_EXP_QUERY_DEVICE */\n \n \t\tDEBUG(\"using port %u (%08\" PRIx32 \")\", port, test);\n@@ -396,6 +404,12 @@ mlx5_pci_devinit(struct rte_pci_driver *pci_drv, struct rte_pci_device *pci_dev)\n \t\t\tpriv->ind_table_max_size = RSS_INDIRECTION_TABLE_SIZE;\n \t\tDEBUG(\"maximum RX indirection table size is %u\",\n \t\t      priv->ind_table_max_size);\n+#ifdef HAVE_EXP_DEVICE_ATTR_VLAN_OFFLOADS\n+\t\tpriv->hw_vlan_strip = !!(exp_device_attr.wq_vlan_offloads_cap &\n+\t\t\t\t\t IBV_EXP_RECEIVE_WQ_CVLAN_STRIP);\n+#endif /* HAVE_EXP_DEVICE_ATTR_VLAN_OFFLOADS */\n+\t\tDEBUG(\"VLAN stripping is %ssupported\",\n+\t\t      (priv->hw_vlan_strip ? \"\" : \"not \"));\n \n #else /* HAVE_EXP_QUERY_DEVICE */\n \t\tpriv->ind_table_max_size = RSS_INDIRECTION_TABLE_SIZE;\ndiff --git a/drivers/net/mlx5/mlx5.h b/drivers/net/mlx5/mlx5.h\nindex 8019ee3..8442016 100644\n--- a/drivers/net/mlx5/mlx5.h\n+++ b/drivers/net/mlx5/mlx5.h\n@@ -101,6 +101,7 @@ struct priv {\n \tunsigned int allmulti_req:1; /* All multicast mode requested. */\n \tunsigned int hw_csum:1; /* Checksum offload is supported. */\n \tunsigned int hw_csum_l2tun:1; /* Same for L2 tunnels. */\n+\tunsigned int hw_vlan_strip:1; /* VLAN stripping is supported. */\n \tunsigned int vf:1; /* This is a VF device. */\n \tunsigned int pending_alarm:1; /* An alarm is pending. */\n \t/* RX/TX queues. */\n@@ -211,6 +212,8 @@ void mlx5_stats_reset(struct rte_eth_dev *);\n /* mlx5_vlan.c */\n \n int mlx5_vlan_filter_set(struct rte_eth_dev *, uint16_t, int);\n+void mlx5_vlan_offload_set(struct rte_eth_dev *, int);\n+void mlx5_vlan_strip_queue_set(struct rte_eth_dev *, uint16_t, int);\n \n /* mlx5_trigger.c */\n \ndiff --git a/drivers/net/mlx5/mlx5_rxq.c b/drivers/net/mlx5/mlx5_rxq.c\nindex 093f4e5..573ad8f 100644\n--- a/drivers/net/mlx5/mlx5_rxq.c\n+++ b/drivers/net/mlx5/mlx5_rxq.c\n@@ -1224,6 +1224,8 @@ rxq_setup(struct rte_eth_dev *dev, struct rxq *rxq, uint16_t desc,\n \t      priv->device_attr.max_qp_wr);\n \tDEBUG(\"priv->device_attr.max_sge is %d\",\n \t      priv->device_attr.max_sge);\n+\t/* Configure VLAN stripping. */\n+\ttmpl.vlan_strip = dev->data->dev_conf.rxmode.hw_vlan_strip;\n \tattr.wq = (struct ibv_exp_wq_init_attr){\n \t\t.wq_context = NULL, /* Could be useful in the future. */\n \t\t.wq_type = IBV_EXP_WQT_RQ,\n@@ -1238,8 +1240,18 @@ rxq_setup(struct rte_eth_dev *dev, struct rxq *rxq, uint16_t desc,\n \t\t\t\t MLX5_PMD_SGE_WR_N),\n \t\t.pd = priv->pd,\n \t\t.cq = tmpl.cq,\n-\t\t.comp_mask = IBV_EXP_CREATE_WQ_RES_DOMAIN,\n+\t\t.comp_mask =\n+\t\t\tIBV_EXP_CREATE_WQ_RES_DOMAIN |\n+#ifdef HAVE_EXP_DEVICE_ATTR_VLAN_OFFLOADS\n+\t\t\tIBV_EXP_CREATE_WQ_VLAN_OFFLOADS |\n+#endif /* HAVE_EXP_DEVICE_ATTR_VLAN_OFFLOADS */\n+\t\t\t0,\n \t\t.res_domain = tmpl.rd,\n+#ifdef HAVE_EXP_DEVICE_ATTR_VLAN_OFFLOADS\n+\t\t.vlan_offloads = (tmpl.vlan_strip ?\n+\t\t\t\t  IBV_EXP_RECEIVE_WQ_CVLAN_STRIP :\n+\t\t\t\t  0),\n+#endif /* HAVE_EXP_DEVICE_ATTR_VLAN_OFFLOADS */\n \t};\n \ttmpl.wq = ibv_exp_create_wq(priv->ctx, &attr.wq);\n \tif (tmpl.wq == NULL) {\n@@ -1262,6 +1274,9 @@ rxq_setup(struct rte_eth_dev *dev, struct rxq *rxq, uint16_t desc,\n \tDEBUG(\"%p: RTE port ID: %u\", (void *)rxq, tmpl.port_id);\n \tattr.params = (struct ibv_exp_query_intf_params){\n \t\t.intf_scope = IBV_EXP_INTF_GLOBAL,\n+#ifdef HAVE_EXP_DEVICE_ATTR_VLAN_OFFLOADS\n+\t\t.intf_version = 1,\n+#endif /* HAVE_EXP_DEVICE_ATTR_VLAN_OFFLOADS */\n \t\t.intf = IBV_EXP_INTF_CQ,\n \t\t.obj = tmpl.cq,\n \t};\ndiff --git a/drivers/net/mlx5/mlx5_rxtx.c b/drivers/net/mlx5/mlx5_rxtx.c\nindex fa5e648..7585570 100644\n--- a/drivers/net/mlx5/mlx5_rxtx.c\n+++ b/drivers/net/mlx5/mlx5_rxtx.c\n@@ -62,6 +62,7 @@\n #include \"mlx5.h\"\n #include \"mlx5_utils.h\"\n #include \"mlx5_rxtx.h\"\n+#include \"mlx5_autoconf.h\"\n #include \"mlx5_defs.h\"\n \n /**\n@@ -713,12 +714,19 @@ mlx5_rx_burst_sp(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n)\n \t\tunsigned int seg_headroom = RTE_PKTMBUF_HEADROOM;\n \t\tunsigned int j = 0;\n \t\tuint32_t flags;\n+\t\tuint16_t vlan_tci;\n \n \t\t/* Sanity checks. */\n \t\tassert(elts_head < rxq->elts_n);\n \t\tassert(rxq->elts_head < rxq->elts_n);\n+#ifdef HAVE_EXP_DEVICE_ATTR_VLAN_OFFLOADS\n+\t\tret = rxq->if_cq->poll_length_flags_cvlan(rxq->cq, NULL, NULL,\n+\t\t\t\t\t\t\t  &flags, &vlan_tci);\n+#else /* HAVE_EXP_DEVICE_ATTR_VLAN_OFFLOADS */\n \t\tret = rxq->if_cq->poll_length_flags(rxq->cq, NULL, NULL,\n \t\t\t\t\t\t    &flags);\n+\t\t(void)vlan_tci;\n+#endif /* HAVE_EXP_DEVICE_ATTR_VLAN_OFFLOADS */\n \t\tif (unlikely(ret < 0)) {\n \t\t\tstruct ibv_wc wc;\n \t\t\tint wcs_n;\n@@ -840,6 +848,12 @@ mlx5_rx_burst_sp(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n)\n \t\tPKT_LEN(pkt_buf) = pkt_buf_len;\n \t\tpkt_buf->packet_type = rxq_cq_to_pkt_type(flags);\n \t\tpkt_buf->ol_flags = rxq_cq_to_ol_flags(rxq, flags);\n+#ifdef HAVE_EXP_DEVICE_ATTR_VLAN_OFFLOADS\n+\t\tif (flags & IBV_EXP_CQ_RX_CVLAN_STRIPPED_V1) {\n+\t\t\tpkt_buf->ol_flags |= PKT_RX_VLAN_PKT;\n+\t\t\tpkt_buf->vlan_tci = vlan_tci;\n+\t\t}\n+#endif /* HAVE_EXP_DEVICE_ATTR_VLAN_OFFLOADS */\n \n \t\t/* Return packet. */\n \t\t*(pkts++) = pkt_buf;\n@@ -910,6 +924,7 @@ mlx5_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n)\n \t\tstruct rte_mbuf *seg = elt->buf;\n \t\tstruct rte_mbuf *rep;\n \t\tuint32_t flags;\n+\t\tuint16_t vlan_tci;\n \n \t\t/* Sanity checks. */\n \t\tassert(seg != NULL);\n@@ -921,8 +936,14 @@ mlx5_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n)\n \t\t */\n \t\trte_prefetch0(seg);\n \t\trte_prefetch0(&seg->cacheline1);\n+#ifdef HAVE_EXP_DEVICE_ATTR_VLAN_OFFLOADS\n+\t\tret = rxq->if_cq->poll_length_flags_cvlan(rxq->cq, NULL, NULL,\n+\t\t\t\t\t\t\t  &flags, &vlan_tci);\n+#else /* HAVE_EXP_DEVICE_ATTR_VLAN_OFFLOADS */\n \t\tret = rxq->if_cq->poll_length_flags(rxq->cq, NULL, NULL,\n \t\t\t\t\t\t    &flags);\n+\t\t(void)vlan_tci;\n+#endif /* HAVE_EXP_DEVICE_ATTR_VLAN_OFFLOADS */\n \t\tif (unlikely(ret < 0)) {\n \t\t\tstruct ibv_wc wc;\n \t\t\tint wcs_n;\n@@ -989,6 +1010,12 @@ mlx5_rx_burst(void *dpdk_rxq, struct rte_mbuf **pkts, uint16_t pkts_n)\n \t\tDATA_LEN(seg) = len;\n \t\tseg->packet_type = rxq_cq_to_pkt_type(flags);\n \t\tseg->ol_flags = rxq_cq_to_ol_flags(rxq, flags);\n+#ifdef HAVE_EXP_DEVICE_ATTR_VLAN_OFFLOADS\n+\t\tif (flags & IBV_EXP_CQ_RX_CVLAN_STRIPPED_V1) {\n+\t\t\tseg->ol_flags |= PKT_RX_VLAN_PKT;\n+\t\t\tseg->vlan_tci = vlan_tci;\n+\t\t}\n+#endif /* HAVE_EXP_DEVICE_ATTR_VLAN_OFFLOADS */\n \n \t\t/* Return packet. */\n \t\t*(pkts++) = seg;\ndiff --git a/drivers/net/mlx5/mlx5_rxtx.h b/drivers/net/mlx5/mlx5_rxtx.h\nindex b2f72f8..fde0ca2 100644\n--- a/drivers/net/mlx5/mlx5_rxtx.h\n+++ b/drivers/net/mlx5/mlx5_rxtx.h\n@@ -109,7 +109,11 @@ struct rxq {\n \tstruct ibv_cq *cq; /* Completion Queue. */\n \tstruct ibv_exp_wq *wq; /* Work Queue. */\n \tstruct ibv_exp_wq_family *if_wq; /* WQ burst interface. */\n+#ifdef HAVE_EXP_DEVICE_ATTR_VLAN_OFFLOADS\n+\tstruct ibv_exp_cq_family_v1 *if_cq; /* CQ interface. */\n+#else /* HAVE_EXP_DEVICE_ATTR_VLAN_OFFLOADS */\n \tstruct ibv_exp_cq_family *if_cq; /* CQ interface. */\n+#endif /* HAVE_EXP_DEVICE_ATTR_VLAN_OFFLOADS */\n \tunsigned int port_id; /* Port ID for incoming packets. */\n \tunsigned int elts_n; /* (*elts)[] length. */\n \tunsigned int elts_head; /* Current index in (*elts)[]. */\n@@ -120,6 +124,7 @@ struct rxq {\n \tunsigned int sp:1; /* Use scattered RX elements. */\n \tunsigned int csum:1; /* Enable checksum offloading. */\n \tunsigned int csum_l2tun:1; /* Same for L2 tunnels. */\n+\tunsigned int vlan_strip:1; /* Enable VLAN stripping. */\n \tuint32_t mb_len; /* Length of a mp-issued mbuf. */\n \tstruct mlx5_rxq_stats stats; /* RX queue counters. */\n \tunsigned int socket; /* CPU socket ID for allocations. */\ndiff --git a/drivers/net/mlx5/mlx5_vlan.c b/drivers/net/mlx5/mlx5_vlan.c\nindex 3a07ad1..fa9e3b8 100644\n--- a/drivers/net/mlx5/mlx5_vlan.c\n+++ b/drivers/net/mlx5/mlx5_vlan.c\n@@ -48,6 +48,7 @@\n \n #include \"mlx5_utils.h\"\n #include \"mlx5.h\"\n+#include \"mlx5_autoconf.h\"\n \n /**\n  * Configure a VLAN filter.\n@@ -127,3 +128,106 @@ mlx5_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on)\n \tassert(ret >= 0);\n \treturn -ret;\n }\n+\n+/**\n+ * Set/reset VLAN stripping for a specific queue.\n+ *\n+ * @param priv\n+ *   Pointer to private structure.\n+ * @param idx\n+ *   RX queue index.\n+ * @param on\n+ *   Enable/disable VLAN stripping.\n+ */\n+static void\n+priv_vlan_strip_queue_set(struct priv *priv, uint16_t idx, int on)\n+{\n+\tstruct rxq *rxq = (*priv->rxqs)[idx];\n+#ifdef HAVE_EXP_DEVICE_ATTR_VLAN_OFFLOADS\n+\tstruct ibv_exp_wq_attr mod;\n+\tuint16_t vlan_offloads =\n+\t\t(on ? IBV_EXP_RECEIVE_WQ_CVLAN_STRIP : 0) |\n+\t\t0;\n+\tint err;\n+\n+\tDEBUG(\"set VLAN offloads 0x%x for port %d queue %d\",\n+\t      vlan_offloads, rxq->port_id, idx);\n+\tmod = (struct ibv_exp_wq_attr){\n+\t\t.attr_mask = IBV_EXP_WQ_ATTR_VLAN_OFFLOADS,\n+\t\t.vlan_offloads = vlan_offloads,\n+\t};\n+\n+\terr = ibv_exp_modify_wq(rxq->wq, &mod);\n+\tif (err) {\n+\t\tERROR(\"%p: failed to modified stripping mode: %s\",\n+\t\t      (void *)priv, strerror(err));\n+\t\treturn;\n+\t}\n+\n+#endif /* HAVE_EXP_DEVICE_ATTR_VLAN_OFFLOADS */\n+\n+\t/* Update related bits in RX queue. */\n+\trxq->vlan_strip = !!on;\n+}\n+\n+/**\n+ * Callback to set/reset VLAN stripping for a specific queue.\n+ *\n+ * @param dev\n+ *   Pointer to Ethernet device structure.\n+ * @param queue\n+ *   RX queue index.\n+ * @param on\n+ *   Enable/disable VLAN stripping.\n+ */\n+void\n+mlx5_vlan_strip_queue_set(struct rte_eth_dev *dev, uint16_t queue, int on)\n+{\n+\tstruct priv *priv = dev->data->dev_private;\n+\n+\t/* Validate hw support */\n+\tif (!priv->hw_vlan_strip) {\n+\t\tERROR(\"VLAN stripping is not supported\");\n+\t\treturn;\n+\t}\n+\n+\t/* Validate queue number */\n+\tif (queue >= priv->rxqs_n) {\n+\t\tERROR(\"VLAN stripping, invalid queue number %d\", queue);\n+\t\treturn;\n+\t}\n+\n+\tpriv_lock(priv);\n+\tpriv_vlan_strip_queue_set(priv, queue, on);\n+\tpriv_unlock(priv);\n+}\n+\n+/**\n+ * Callback to set/reset VLAN offloads for a port.\n+ *\n+ * @param dev\n+ *   Pointer to Ethernet device structure.\n+ * @param mask\n+ *   VLAN offload bit mask.\n+ */\n+void\n+mlx5_vlan_offload_set(struct rte_eth_dev *dev, int mask)\n+{\n+\tstruct priv *priv = dev->data->dev_private;\n+\tunsigned int i;\n+\n+\tif (mask & ETH_VLAN_STRIP_MASK) {\n+\t\tint hw_vlan_strip = dev->data->dev_conf.rxmode.hw_vlan_strip;\n+\n+\t\tif (!priv->hw_vlan_strip) {\n+\t\t\tERROR(\"VLAN stripping is not supported\");\n+\t\t\treturn;\n+\t\t}\n+\n+\t\t/* Run on every RX queue and set/reset VLAN stripping. */\n+\t\tpriv_lock(priv);\n+\t\tfor (i = 0; (i != priv->rxqs_n); i++)\n+\t\t\tpriv_vlan_strip_queue_set(priv, i, hw_vlan_strip);\n+\t\tpriv_unlock(priv);\n+\t}\n+}\n",
    "prefixes": [
        "dpdk-dev",
        "v2",
        "5/5"
    ]
}