get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 43010,
    "url": "http://patches.dpdk.org/api/patches/43010/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20180713092910.26276-6-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": "<20180713092910.26276-6-adrien.mazarguil@6wind.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20180713092910.26276-6-adrien.mazarguil@6wind.com",
    "date": "2018-07-13T09:40:45",
    "name": "[v2,5/6] net/mlx5: add VLAN item and actions to switch flow rules",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "27bc7214603653497dc20382ce8d0b644ee169cc",
    "submitter": {
        "id": 165,
        "url": "http://patches.dpdk.org/api/people/165/?format=api",
        "name": "Adrien Mazarguil",
        "email": "adrien.mazarguil@6wind.com"
    },
    "delegate": {
        "id": 6624,
        "url": "http://patches.dpdk.org/api/users/6624/?format=api",
        "username": "shahafs",
        "first_name": "Shahaf",
        "last_name": "Shuler",
        "email": "shahafs@mellanox.com"
    },
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20180713092910.26276-6-adrien.mazarguil@6wind.com/mbox/",
    "series": [
        {
            "id": 558,
            "url": "http://patches.dpdk.org/api/series/558/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=558",
            "date": "2018-07-13T09:40:35",
            "name": "net/mlx5: add support for switch flow rules",
            "version": 2,
            "mbox": "http://patches.dpdk.org/series/558/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/43010/comments/",
    "check": "fail",
    "checks": "http://patches.dpdk.org/api/patches/43010/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 [127.0.0.1])\n\tby dpdk.org (Postfix) with ESMTP id C30B01B440;\n\tFri, 13 Jul 2018 11:41:05 +0200 (CEST)",
            "from mail-wm0-f66.google.com (mail-wm0-f66.google.com\n\t[74.125.82.66]) by dpdk.org (Postfix) with ESMTP id D60B11B1ED\n\tfor <dev@dpdk.org>; Fri, 13 Jul 2018 11:41:02 +0200 (CEST)",
            "by mail-wm0-f66.google.com with SMTP id v128-v6so8148722wme.5\n\tfor <dev@dpdk.org>; Fri, 13 Jul 2018 02:41:02 -0700 (PDT)",
            "from 6wind.com (host.78.145.23.62.rev.coltfrance.com.\n\t[62.23.145.78]) by smtp.gmail.com with ESMTPSA id\n\tw9-v6sm25270158wrr.77.2018.07.13.02.41.01\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\n\tFri, 13 Jul 2018 02:41:01 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=6wind-com.20150623.gappssmtp.com; s=20150623;\n\th=date:from:to:cc:subject:message-id:references:mime-version\n\t:content-disposition:in-reply-to;\n\tbh=ZriIi7q8+0X+xHxRrrmltKYTmSEsABbTIMk8qtNQu7o=;\n\tb=Xs9CiPDbueJsqCKVKTClZhpqhIwJZVYYpwTNOjwec2AZWiZIWy7Gx18nXDrgiruZYN\n\tbwwyjsKcp/rah+h68o0KDCbkM8bGYV1Ic+ioy1zFk3e1zDDe1BjtnQrKXG9+0IEvhxf9\n\t4QpUp8NhgZ82K1+wzIYCByhH+lBr4pTbM+iwZ4VQ9gf1Ak1d/S05OOv5BqFCjqFOO9dT\n\t1/wW8ovJOl14LwsNI8N4z/MJxbd1xceWW8vES+eOwsLAB0VLn3pyD3XUiA5DPG0XFup4\n\tqgk+UsFQ2s4K3vlMsavRear7ZIYVrSWMGTUMkhMzIKB5361Vg3pEVgrCrIN3FzpnyX9g\n\thn6g==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:date:from:to:cc:subject:message-id:references\n\t:mime-version:content-disposition:in-reply-to;\n\tbh=ZriIi7q8+0X+xHxRrrmltKYTmSEsABbTIMk8qtNQu7o=;\n\tb=q6iNSopkkCOt9aXbFmsFq8P//PwxgDFj4JsvR+61RGqfkQfRaad4KEJ9ms/XZ33nYf\n\tJiNIkLuZ7PLLW76uvumnW3HilFQs1CZ+AftbIJusilHcjAhn3/d1yTOWgrdBSQIquP+v\n\tMp4mOumGV5wdvbDCJNHFapBAkbzcg46cnz/kgaFSo9ECyHdlIqFOLlnps2FXRRApFNuy\n\t6Kg8xZ3rjoqBYAljdXVAtR3fJofwvMPge5BVZe7j45xrAnzrPNhv4dvk2RdOskhpuPv/\n\taxiNfIvJuCki5uooCdxo+xhZq7p2CIlA8oJXiav7AgQq6DmYS4rxVXxFBQoQwK+PjB+2\n\tag4A==",
        "X-Gm-Message-State": "AOUpUlGbxqaxhzDpMHAK9f+Mg5xL0ClqbwEVb6pTBB83fSJUqpgSn0RU\n\tgoGe/KC/dgAY8H8i3JgRb2RnhQ==",
        "X-Google-Smtp-Source": "AAOMgpc636KjIvmhJhSeIOphYu4JE1KUhFZXzRM2ir9JkcUV5T9EGbjcSNO0t0hrGS+8ssA+uFPGsQ==",
        "X-Received": "by 2002:a1c:1509:: with SMTP id\n\t9-v6mr3237784wmv.142.1531474862284; \n\tFri, 13 Jul 2018 02:41:02 -0700 (PDT)",
        "Date": "Fri, 13 Jul 2018 11:40:45 +0200",
        "From": "Adrien Mazarguil <adrien.mazarguil@6wind.com>",
        "To": "Shahaf Shuler <shahafs@mellanox.com>",
        "Cc": "Nelio Laranjeiro <nelio.laranjeiro@6wind.com>,\n\tYongseok Koh <yskoh@mellanox.com>, dev@dpdk.org",
        "Message-ID": "<20180713092910.26276-6-adrien.mazarguil@6wind.com>",
        "References": "<20180627173355.4718-1-adrien.mazarguil@6wind.com>\n\t<20180713092910.26276-1-adrien.mazarguil@6wind.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=us-ascii",
        "Content-Disposition": "inline",
        "In-Reply-To": "<20180713092910.26276-1-adrien.mazarguil@6wind.com>",
        "X-Mailer": "git-send-email 2.11.0",
        "Subject": "[dpdk-dev] [PATCH v2 5/6] net/mlx5: add VLAN item and actions to\n\tswitch flow rules",
        "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\t<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\t<mailto:dev-request@dpdk.org?subject=subscribe>",
        "Errors-To": "dev-bounces@dpdk.org",
        "Sender": "\"dev\" <dev-bounces@dpdk.org>"
    },
    "content": "This enables flow rules to explicitly match VLAN traffic (VLAN pattern\nitem) and perform various operations on VLAN headers at the switch level\n(OF_POP_VLAN, OF_PUSH_VLAN, OF_SET_VLAN_VID and OF_SET_VLAN_PCP actions).\n\nTestpmd examples:\n\n- Directing all VLAN traffic received on port ID 1 to port ID 0:\n\n  flow create 1 ingress transfer pattern eth / vlan / end actions\n     port_id id 0 / end\n\n- Adding a VLAN header to IPv6 traffic received on port ID 1 and directing\n  it to port ID 0:\n\n  flow create 1 ingress transfer pattern eth / ipv6 / end actions\n     of_push_vlan ethertype 0x8100 / of_set_vlan_vid vlan_vid 42 /\n     port_id id 0 / end\n\nSigned-off-by: Adrien Mazarguil <adrien.mazarguil@6wind.com>\nAcked-by: Nelio Laranjeiro <nelio.laranjeiro@6wind.com>\nAcked-by: Yongseok Koh <yskoh@mellanox.com>\n--\nv2 changes:\n\n- Yongseok, I chose not to add extra safety to VLAN POP at this point since\n  basic rte_flow_validate() requirements are satisfied: this implementation\n  makes sure that a flow rule is fully understood and can be attempted, it\n  just doesn't perform extra HW-specific checks and leaves them to the\n  kernel. They can be added later if necessary.\n- Added definitions for TC_ACT_VLAN, TCA_FLOWER_KEY_VLAN_ID,\n  TCA_FLOWER_KEY_VLAN_PRIO and TCA_FLOWER_KEY_VLAN_ETH_TYPE in case they\n  are missing from the host system (e.g.  RHEL 7.2).\n---\n drivers/net/mlx5/Makefile       |  20 ++++\n drivers/net/mlx5/mlx5_nl_flow.c | 208 ++++++++++++++++++++++++++++++++++-\n 2 files changed, 224 insertions(+), 4 deletions(-)",
    "diff": "diff --git a/drivers/net/mlx5/Makefile b/drivers/net/mlx5/Makefile\nindex 5e28b4c87..6dd218285 100644\n--- a/drivers/net/mlx5/Makefile\n+++ b/drivers/net/mlx5/Makefile\n@@ -319,6 +319,26 @@ mlx5_autoconf.h.new: $(RTE_SDK)/buildtools/auto-config-h.sh\n \t\tlinux/pkt_cls.h \\\n \t\tenum TCA_FLOWER_KEY_UDP_DST_MASK \\\n \t\t$(AUTOCONF_OUTPUT)\n+\t$Q sh -- '$<' '$@' \\\n+\t\tHAVE_TCA_FLOWER_KEY_VLAN_ID \\\n+\t\tlinux/pkt_cls.h \\\n+\t\tenum TCA_FLOWER_KEY_VLAN_ID \\\n+\t\t$(AUTOCONF_OUTPUT)\n+\t$Q sh -- '$<' '$@' \\\n+\t\tHAVE_TCA_FLOWER_KEY_VLAN_PRIO \\\n+\t\tlinux/pkt_cls.h \\\n+\t\tenum TCA_FLOWER_KEY_VLAN_PRIO \\\n+\t\t$(AUTOCONF_OUTPUT)\n+\t$Q sh -- '$<' '$@' \\\n+\t\tHAVE_TCA_FLOWER_KEY_VLAN_ETH_TYPE \\\n+\t\tlinux/pkt_cls.h \\\n+\t\tenum TCA_FLOWER_KEY_VLAN_ETH_TYPE \\\n+\t\t$(AUTOCONF_OUTPUT)\n+\t$Q sh -- '$<' '$@' \\\n+\t\tHAVE_TC_ACT_VLAN \\\n+\t\tlinux/tc_act/tc_vlan.h \\\n+\t\tenum TCA_VLAN_PUSH_VLAN_PRIORITY \\\n+\t\t$(AUTOCONF_OUTPUT)\n \n # Create mlx5_autoconf.h or update it in case it differs from the new one.\n \ndiff --git a/drivers/net/mlx5/mlx5_nl_flow.c b/drivers/net/mlx5/mlx5_nl_flow.c\nindex 88e7cabd5..6c7bf7119 100644\n--- a/drivers/net/mlx5/mlx5_nl_flow.c\n+++ b/drivers/net/mlx5/mlx5_nl_flow.c\n@@ -27,6 +27,29 @@\n #include <rte_flow.h>\n \n #include \"mlx5.h\"\n+#include \"mlx5_autoconf.h\"\n+\n+#ifdef HAVE_TC_ACT_VLAN\n+\n+#include <linux/tc_act/tc_vlan.h>\n+\n+#else /* HAVE_TC_ACT_VLAN */\n+\n+#define TCA_VLAN_ACT_POP 1\n+#define TCA_VLAN_ACT_PUSH 2\n+#define TCA_VLAN_ACT_MODIFY 3\n+#define TCA_VLAN_PARMS 2\n+#define TCA_VLAN_PUSH_VLAN_ID 3\n+#define TCA_VLAN_PUSH_VLAN_PROTOCOL 4\n+#define TCA_VLAN_PAD 5\n+#define TCA_VLAN_PUSH_VLAN_PRIORITY 6\n+\n+struct tc_vlan {\n+\ttc_gen;\n+\tint v_action;\n+};\n+\n+#endif /* HAVE_TC_ACT_VLAN */\n \n /* Normally found in linux/netlink.h. */\n #ifndef NETLINK_CAP_ACK\n@@ -114,6 +137,15 @@\n #ifndef HAVE_TCA_FLOWER_KEY_UDP_DST_MASK\n #define TCA_FLOWER_KEY_UDP_DST_MASK 38\n #endif\n+#ifndef HAVE_TCA_FLOWER_KEY_VLAN_ID\n+#define TCA_FLOWER_KEY_VLAN_ID 23\n+#endif\n+#ifndef HAVE_TCA_FLOWER_KEY_VLAN_PRIO\n+#define TCA_FLOWER_KEY_VLAN_PRIO 24\n+#endif\n+#ifndef HAVE_TCA_FLOWER_KEY_VLAN_ETH_TYPE\n+#define TCA_FLOWER_KEY_VLAN_ETH_TYPE 25\n+#endif\n \n /** Parser state definitions for mlx5_nl_flow_trans[]. */\n enum mlx5_nl_flow_trans {\n@@ -123,6 +155,7 @@ enum mlx5_nl_flow_trans {\n \tPATTERN,\n \tITEM_VOID,\n \tITEM_ETH,\n+\tITEM_VLAN,\n \tITEM_IPV4,\n \tITEM_IPV6,\n \tITEM_TCP,\n@@ -131,6 +164,10 @@ enum mlx5_nl_flow_trans {\n \tACTION_VOID,\n \tACTION_PORT_ID,\n \tACTION_DROP,\n+\tACTION_OF_POP_VLAN,\n+\tACTION_OF_PUSH_VLAN,\n+\tACTION_OF_SET_VLAN_VID,\n+\tACTION_OF_SET_VLAN_PCP,\n \tEND,\n };\n \n@@ -139,7 +176,8 @@ enum mlx5_nl_flow_trans {\n #define PATTERN_COMMON \\\n \tITEM_VOID, ACTIONS\n #define ACTIONS_COMMON \\\n-\tACTION_VOID\n+\tACTION_VOID, ACTION_OF_POP_VLAN, ACTION_OF_PUSH_VLAN, \\\n+\tACTION_OF_SET_VLAN_VID, ACTION_OF_SET_VLAN_PCP\n #define ACTIONS_FATE \\\n \tACTION_PORT_ID, ACTION_DROP\n \n@@ -150,7 +188,8 @@ static const enum mlx5_nl_flow_trans *const mlx5_nl_flow_trans[] = {\n \t[ATTR] = TRANS(PATTERN),\n \t[PATTERN] = TRANS(ITEM_ETH, PATTERN_COMMON),\n \t[ITEM_VOID] = TRANS(BACK),\n-\t[ITEM_ETH] = TRANS(ITEM_IPV4, ITEM_IPV6, PATTERN_COMMON),\n+\t[ITEM_ETH] = TRANS(ITEM_IPV4, ITEM_IPV6, ITEM_VLAN, PATTERN_COMMON),\n+\t[ITEM_VLAN] = TRANS(ITEM_IPV4, ITEM_IPV6, PATTERN_COMMON),\n \t[ITEM_IPV4] = TRANS(ITEM_TCP, ITEM_UDP, PATTERN_COMMON),\n \t[ITEM_IPV6] = TRANS(ITEM_TCP, ITEM_UDP, PATTERN_COMMON),\n \t[ITEM_TCP] = TRANS(PATTERN_COMMON),\n@@ -159,12 +198,17 @@ static const enum mlx5_nl_flow_trans *const mlx5_nl_flow_trans[] = {\n \t[ACTION_VOID] = TRANS(BACK),\n \t[ACTION_PORT_ID] = TRANS(ACTION_VOID, END),\n \t[ACTION_DROP] = TRANS(ACTION_VOID, END),\n+\t[ACTION_OF_POP_VLAN] = TRANS(ACTIONS_FATE, ACTIONS_COMMON),\n+\t[ACTION_OF_PUSH_VLAN] = TRANS(ACTIONS_FATE, ACTIONS_COMMON),\n+\t[ACTION_OF_SET_VLAN_VID] = TRANS(ACTIONS_FATE, ACTIONS_COMMON),\n+\t[ACTION_OF_SET_VLAN_PCP] = TRANS(ACTIONS_FATE, ACTIONS_COMMON),\n \t[END] = NULL,\n };\n \n /** Empty masks for known item types. */\n static const union {\n \tstruct rte_flow_item_eth eth;\n+\tstruct rte_flow_item_vlan vlan;\n \tstruct rte_flow_item_ipv4 ipv4;\n \tstruct rte_flow_item_ipv6 ipv6;\n \tstruct rte_flow_item_tcp tcp;\n@@ -174,6 +218,7 @@ static const union {\n /** Supported masks for known item types. */\n static const struct {\n \tstruct rte_flow_item_eth eth;\n+\tstruct rte_flow_item_vlan vlan;\n \tstruct rte_flow_item_ipv4 ipv4;\n \tstruct rte_flow_item_ipv6 ipv6;\n \tstruct rte_flow_item_tcp tcp;\n@@ -184,6 +229,11 @@ static const struct {\n \t\t.dst.addr_bytes = \"\\xff\\xff\\xff\\xff\\xff\\xff\",\n \t\t.src.addr_bytes = \"\\xff\\xff\\xff\\xff\\xff\\xff\",\n \t},\n+\t.vlan = {\n+\t\t/* PCP and VID only, no DEI. */\n+\t\t.tci = RTE_BE16(0xefff),\n+\t\t.inner_type = RTE_BE16(0xffff),\n+\t},\n \t.ipv4.hdr = {\n \t\t.next_proto_id = 0xff,\n \t\t.src_addr = RTE_BE32(0xffffffff),\n@@ -329,9 +379,13 @@ mlx5_nl_flow_transpose(void *buf,\n \tunsigned int n;\n \tuint32_t act_index_cur;\n \tbool eth_type_set;\n+\tbool vlan_present;\n+\tbool vlan_eth_type_set;\n \tbool ip_proto_set;\n \tstruct nlattr *na_flower;\n \tstruct nlattr *na_flower_act;\n+\tstruct nlattr *na_vlan_id;\n+\tstruct nlattr *na_vlan_priority;\n \tconst enum mlx5_nl_flow_trans *trans;\n \tconst enum mlx5_nl_flow_trans *back;\n \n@@ -343,15 +397,20 @@ mlx5_nl_flow_transpose(void *buf,\n \tn = 0;\n \tact_index_cur = 0;\n \teth_type_set = false;\n+\tvlan_present = false;\n+\tvlan_eth_type_set = false;\n \tip_proto_set = false;\n \tna_flower = NULL;\n \tna_flower_act = NULL;\n+\tna_vlan_id = NULL;\n+\tna_vlan_priority = NULL;\n \ttrans = TRANS(ATTR);\n \tback = trans;\n trans:\n \tswitch (trans[n++]) {\n \t\tunion {\n \t\t\tconst struct rte_flow_item_eth *eth;\n+\t\t\tconst struct rte_flow_item_vlan *vlan;\n \t\t\tconst struct rte_flow_item_ipv4 *ipv4;\n \t\t\tconst struct rte_flow_item_ipv6 *ipv6;\n \t\t\tconst struct rte_flow_item_tcp *tcp;\n@@ -359,6 +418,11 @@ mlx5_nl_flow_transpose(void *buf,\n \t\t} spec, mask;\n \t\tunion {\n \t\t\tconst struct rte_flow_action_port_id *port_id;\n+\t\t\tconst struct rte_flow_action_of_push_vlan *of_push_vlan;\n+\t\t\tconst struct rte_flow_action_of_set_vlan_vid *\n+\t\t\t\tof_set_vlan_vid;\n+\t\t\tconst struct rte_flow_action_of_set_vlan_pcp *\n+\t\t\t\tof_set_vlan_pcp;\n \t\t} conf;\n \t\tstruct nlmsghdr *nlh;\n \t\tstruct tcmsg *tcm;\n@@ -495,6 +559,58 @@ mlx5_nl_flow_transpose(void *buf,\n \t\t\tgoto error_nobufs;\n \t\t++item;\n \t\tbreak;\n+\tcase ITEM_VLAN:\n+\t\tif (item->type != RTE_FLOW_ITEM_TYPE_VLAN)\n+\t\t\tgoto trans;\n+\t\tmask.vlan = mlx5_nl_flow_item_mask\n+\t\t\t(item, &rte_flow_item_vlan_mask,\n+\t\t\t &mlx5_nl_flow_mask_supported.vlan,\n+\t\t\t &mlx5_nl_flow_mask_empty.vlan,\n+\t\t\t sizeof(mlx5_nl_flow_mask_supported.vlan), error);\n+\t\tif (!mask.vlan)\n+\t\t\treturn -rte_errno;\n+\t\tif (!eth_type_set &&\n+\t\t    !mnl_attr_put_u16_check(buf, size,\n+\t\t\t\t\t    TCA_FLOWER_KEY_ETH_TYPE,\n+\t\t\t\t\t    RTE_BE16(ETH_P_8021Q)))\n+\t\t\tgoto error_nobufs;\n+\t\teth_type_set = 1;\n+\t\tvlan_present = 1;\n+\t\tif (mask.vlan == &mlx5_nl_flow_mask_empty.vlan) {\n+\t\t\t++item;\n+\t\t\tbreak;\n+\t\t}\n+\t\tspec.vlan = item->spec;\n+\t\tif ((mask.vlan->tci & RTE_BE16(0xe000) &&\n+\t\t     (mask.vlan->tci & RTE_BE16(0xe000)) != RTE_BE16(0xe000)) ||\n+\t\t    (mask.vlan->tci & RTE_BE16(0x0fff) &&\n+\t\t     (mask.vlan->tci & RTE_BE16(0x0fff)) != RTE_BE16(0x0fff)) ||\n+\t\t    (mask.vlan->inner_type &&\n+\t\t     mask.vlan->inner_type != RTE_BE16(0xffff)))\n+\t\t\treturn rte_flow_error_set\n+\t\t\t\t(error, ENOTSUP, RTE_FLOW_ERROR_TYPE_ITEM_MASK,\n+\t\t\t\t mask.vlan,\n+\t\t\t\t \"no support for partial masks on\"\n+\t\t\t\t \" \\\"tci\\\" (PCP and VID parts) and\"\n+\t\t\t\t \" \\\"inner_type\\\" fields\");\n+\t\tif (mask.vlan->inner_type) {\n+\t\t\tif (!mnl_attr_put_u16_check\n+\t\t\t    (buf, size, TCA_FLOWER_KEY_VLAN_ETH_TYPE,\n+\t\t\t     spec.vlan->inner_type))\n+\t\t\t\tgoto error_nobufs;\n+\t\t\tvlan_eth_type_set = 1;\n+\t\t}\n+\t\tif ((mask.vlan->tci & RTE_BE16(0xe000) &&\n+\t\t     !mnl_attr_put_u8_check\n+\t\t     (buf, size, TCA_FLOWER_KEY_VLAN_PRIO,\n+\t\t      (rte_be_to_cpu_16(spec.vlan->tci) >> 13) & 0x7)) ||\n+\t\t    (mask.vlan->tci & RTE_BE16(0x0fff) &&\n+\t\t     !mnl_attr_put_u16_check\n+\t\t     (buf, size, TCA_FLOWER_KEY_VLAN_ID,\n+\t\t      spec.vlan->tci & RTE_BE16(0x0fff))))\n+\t\t\tgoto error_nobufs;\n+\t\t++item;\n+\t\tbreak;\n \tcase ITEM_IPV4:\n \t\tif (item->type != RTE_FLOW_ITEM_TYPE_IPV4)\n \t\t\tgoto trans;\n@@ -505,12 +621,15 @@ mlx5_nl_flow_transpose(void *buf,\n \t\t\t sizeof(mlx5_nl_flow_mask_supported.ipv4), error);\n \t\tif (!mask.ipv4)\n \t\t\treturn -rte_errno;\n-\t\tif (!eth_type_set &&\n+\t\tif ((!eth_type_set || !vlan_eth_type_set) &&\n \t\t    !mnl_attr_put_u16_check(buf, size,\n+\t\t\t\t\t    vlan_present ?\n+\t\t\t\t\t    TCA_FLOWER_KEY_VLAN_ETH_TYPE :\n \t\t\t\t\t    TCA_FLOWER_KEY_ETH_TYPE,\n \t\t\t\t\t    RTE_BE16(ETH_P_IP)))\n \t\t\tgoto error_nobufs;\n \t\teth_type_set = 1;\n+\t\tvlan_eth_type_set = 1;\n \t\tif (mask.ipv4 == &mlx5_nl_flow_mask_empty.ipv4) {\n \t\t\t++item;\n \t\t\tbreak;\n@@ -557,12 +676,15 @@ mlx5_nl_flow_transpose(void *buf,\n \t\t\t sizeof(mlx5_nl_flow_mask_supported.ipv6), error);\n \t\tif (!mask.ipv6)\n \t\t\treturn -rte_errno;\n-\t\tif (!eth_type_set &&\n+\t\tif ((!eth_type_set || !vlan_eth_type_set) &&\n \t\t    !mnl_attr_put_u16_check(buf, size,\n+\t\t\t\t\t    vlan_present ?\n+\t\t\t\t\t    TCA_FLOWER_KEY_VLAN_ETH_TYPE :\n \t\t\t\t\t    TCA_FLOWER_KEY_ETH_TYPE,\n \t\t\t\t\t    RTE_BE16(ETH_P_IPV6)))\n \t\t\tgoto error_nobufs;\n \t\teth_type_set = 1;\n+\t\tvlan_eth_type_set = 1;\n \t\tif (mask.ipv6 == &mlx5_nl_flow_mask_empty.ipv6) {\n \t\t\t++item;\n \t\t\tbreak;\n@@ -768,6 +890,84 @@ mlx5_nl_flow_transpose(void *buf,\n \t\tmnl_attr_nest_end(buf, act_index);\n \t\t++action;\n \t\tbreak;\n+\tcase ACTION_OF_POP_VLAN:\n+\t\tif (action->type != RTE_FLOW_ACTION_TYPE_OF_POP_VLAN)\n+\t\t\tgoto trans;\n+\t\tconf.of_push_vlan = NULL;\n+\t\ti = TCA_VLAN_ACT_POP;\n+\t\tgoto action_of_vlan;\n+\tcase ACTION_OF_PUSH_VLAN:\n+\t\tif (action->type != RTE_FLOW_ACTION_TYPE_OF_PUSH_VLAN)\n+\t\t\tgoto trans;\n+\t\tconf.of_push_vlan = action->conf;\n+\t\ti = TCA_VLAN_ACT_PUSH;\n+\t\tgoto action_of_vlan;\n+\tcase ACTION_OF_SET_VLAN_VID:\n+\t\tif (action->type != RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_VID)\n+\t\t\tgoto trans;\n+\t\tconf.of_set_vlan_vid = action->conf;\n+\t\tif (na_vlan_id)\n+\t\t\tgoto override_na_vlan_id;\n+\t\ti = TCA_VLAN_ACT_MODIFY;\n+\t\tgoto action_of_vlan;\n+\tcase ACTION_OF_SET_VLAN_PCP:\n+\t\tif (action->type != RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_PCP)\n+\t\t\tgoto trans;\n+\t\tconf.of_set_vlan_pcp = action->conf;\n+\t\tif (na_vlan_priority)\n+\t\t\tgoto override_na_vlan_priority;\n+\t\ti = TCA_VLAN_ACT_MODIFY;\n+\t\tgoto action_of_vlan;\n+action_of_vlan:\n+\t\tact_index =\n+\t\t\tmnl_attr_nest_start_check(buf, size, act_index_cur++);\n+\t\tif (!act_index ||\n+\t\t    !mnl_attr_put_strz_check(buf, size, TCA_ACT_KIND, \"vlan\"))\n+\t\t\tgoto error_nobufs;\n+\t\tact = mnl_attr_nest_start_check(buf, size, TCA_ACT_OPTIONS);\n+\t\tif (!act)\n+\t\t\tgoto error_nobufs;\n+\t\tif (!mnl_attr_put_check(buf, size, TCA_VLAN_PARMS,\n+\t\t\t\t\tsizeof(struct tc_vlan),\n+\t\t\t\t\t&(struct tc_vlan){\n+\t\t\t\t\t\t.action = TC_ACT_PIPE,\n+\t\t\t\t\t\t.v_action = i,\n+\t\t\t\t\t}))\n+\t\t\tgoto error_nobufs;\n+\t\tif (i == TCA_VLAN_ACT_POP) {\n+\t\t\tmnl_attr_nest_end(buf, act);\n+\t\t\t++action;\n+\t\t\tbreak;\n+\t\t}\n+\t\tif (i == TCA_VLAN_ACT_PUSH &&\n+\t\t    !mnl_attr_put_u16_check(buf, size,\n+\t\t\t\t\t    TCA_VLAN_PUSH_VLAN_PROTOCOL,\n+\t\t\t\t\t    conf.of_push_vlan->ethertype))\n+\t\t\tgoto error_nobufs;\n+\t\tna_vlan_id = mnl_nlmsg_get_payload_tail(buf);\n+\t\tif (!mnl_attr_put_u16_check(buf, size, TCA_VLAN_PAD, 0))\n+\t\t\tgoto error_nobufs;\n+\t\tna_vlan_priority = mnl_nlmsg_get_payload_tail(buf);\n+\t\tif (!mnl_attr_put_u8_check(buf, size, TCA_VLAN_PAD, 0))\n+\t\t\tgoto error_nobufs;\n+\t\tmnl_attr_nest_end(buf, act);\n+\t\tmnl_attr_nest_end(buf, act_index);\n+\t\tif (action->type == RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_VID) {\n+override_na_vlan_id:\n+\t\t\tna_vlan_id->nla_type = TCA_VLAN_PUSH_VLAN_ID;\n+\t\t\t*(uint16_t *)mnl_attr_get_payload(na_vlan_id) =\n+\t\t\t\trte_be_to_cpu_16\n+\t\t\t\t(conf.of_set_vlan_vid->vlan_vid);\n+\t\t} else if (action->type ==\n+\t\t\t   RTE_FLOW_ACTION_TYPE_OF_SET_VLAN_PCP) {\n+override_na_vlan_priority:\n+\t\t\tna_vlan_priority->nla_type =\n+\t\t\t\tTCA_VLAN_PUSH_VLAN_PRIORITY;\n+\t\t\t*(uint8_t *)mnl_attr_get_payload(na_vlan_priority) =\n+\t\t\t\tconf.of_set_vlan_pcp->vlan_pcp;\n+\t\t}\n+\t\t++action;\n+\t\tbreak;\n \tcase END:\n \t\tif (item->type != RTE_FLOW_ITEM_TYPE_END ||\n \t\t    action->type != RTE_FLOW_ACTION_TYPE_END)\n",
    "prefixes": [
        "v2",
        "5/6"
    ]
}