get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 41726,
    "url": "http://patches.dpdk.org/api/patches/41726/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20180627173355.4718-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": "<20180627173355.4718-6-adrien.mazarguil@6wind.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20180627173355.4718-6-adrien.mazarguil@6wind.com",
    "date": "2018-06-27T18:08:18",
    "name": "[5/6] net/mlx5: add VLAN item and actions to switch flow rules",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "c8c7b3e5c0cab303d3c04948f0915d875769ddef",
    "submitter": {
        "id": 165,
        "url": "http://patches.dpdk.org/api/people/165/?format=api",
        "name": "Adrien Mazarguil",
        "email": "adrien.mazarguil@6wind.com"
    },
    "delegate": null,
    "mbox": "http://patches.dpdk.org/project/dpdk/patch/20180627173355.4718-6-adrien.mazarguil@6wind.com/mbox/",
    "series": [
        {
            "id": 273,
            "url": "http://patches.dpdk.org/api/series/273/?format=api",
            "web_url": "http://patches.dpdk.org/project/dpdk/list/?series=273",
            "date": "2018-06-27T18:08:08",
            "name": "net/mlx5: add support for switch flow rules",
            "version": 1,
            "mbox": "http://patches.dpdk.org/series/273/mbox/"
        }
    ],
    "comments": "http://patches.dpdk.org/api/patches/41726/comments/",
    "check": "fail",
    "checks": "http://patches.dpdk.org/api/patches/41726/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 713001C3AD;\n\tWed, 27 Jun 2018 20:08:39 +0200 (CEST)",
            "from mail-wr0-f196.google.com (mail-wr0-f196.google.com\n\t[209.85.128.196]) by dpdk.org (Postfix) with ESMTP id AADEA1C3A3\n\tfor <dev@dpdk.org>; Wed, 27 Jun 2018 20:08:35 +0200 (CEST)",
            "by mail-wr0-f196.google.com with SMTP id t6-v6so2927947wrq.13\n\tfor <dev@dpdk.org>; Wed, 27 Jun 2018 11:08:35 -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\tx10-v6sm1141102wrn.25.2018.06.27.11.08.34\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\n\tWed, 27 Jun 2018 11:08:34 -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=tlOZQprMHSS4oKMFSBxBxoJN8XoXR0cB/sZuXI+rrdk=;\n\tb=djNQX6Eswii19x/uzysUox8HAD2mCTjrQ1abCXNs8lthcMP91DInBVbi2LaVczGjmG\n\terQje20xTi3vTPrbsyH2Wivfh313QgLg8gWaRk5hEmOkjKy/7nTvSHM5yXoYLzKFMQN5\n\tnOUF0JtvidfmU/2a1QpcWHPg2s6xWI4uNokgO0TkhK09PfB1Ip/etXGFD59GKMKVD07D\n\tknS3wavCoPbVDo4PxwhCzoP6sp4xVo9bWopWcYhN70OwYbLYMdTiz157v+G9sKLJTHyf\n\ta7PZ8P7XbWuLuGgWtvbVJnQ7PK0EhaVy93MXjQhl0XFpdpmo+yTlMaz6Zl5WAbRvln7i\n\tF9WQ==",
        "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=tlOZQprMHSS4oKMFSBxBxoJN8XoXR0cB/sZuXI+rrdk=;\n\tb=p8cGMRbkMcK1GOuDZ4qTR2r+y9ExZr7rcL/mg6j0iuJ4OUiZw+smQClLo+fEMSe72W\n\tQVxBeCnf4ZKqsuVFq6ruFVEGhdFCgpXlhZN7u5b4xOHSzwFXcp2Egw+MvXncrqNcDyPE\n\t3CWuCnXG/klq9gVYL0W809QIXXQAfCyJlqsQyGlrQebWuzC16LFxj1nsDlyNBOuWOk2l\n\tl7CDVvb7mzNG2io4xH0JJnqRljYeFsYXX2p8QHP6KBzcErJ7J0C1hD9peZtljv/1pL8v\n\tyFyABGWXt7W0Z26GqjT+oHqMXKfDjSR/XSyOHzmddCeLBmp0hKf2cpadhQTqE+XXcP/W\n\triCQ==",
        "X-Gm-Message-State": "APt69E2JCi9fe1gBlRjM8Hlt6P7+UnRkGseq2tZuO+QLrE6PAHIcVCi6\n\tj8g06vlF86++oYRcjb1DzUxZD+KI",
        "X-Google-Smtp-Source": "AAOMgpfqehnd5rXRZ+6refuJqxgsbh9V8mOMVbaUas/1nY0EAjU4eVNVqL12PW88YDuzPfLAA1Eb0w==",
        "X-Received": "by 2002:adf:fa03:: with SMTP id\n\tm3-v6mr1293342wrr.228.1530122915310; \n\tWed, 27 Jun 2018 11:08:35 -0700 (PDT)",
        "Date": "Wed, 27 Jun 2018 20:08:18 +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": "<20180627173355.4718-6-adrien.mazarguil@6wind.com>",
        "References": "<20180627173355.4718-1-adrien.mazarguil@6wind.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain; charset=us-ascii",
        "Content-Disposition": "inline",
        "In-Reply-To": "<20180627173355.4718-1-adrien.mazarguil@6wind.com>",
        "X-Mailer": "git-send-email 2.11.0",
        "Subject": "[dpdk-dev] [PATCH 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 / port_id id 0 / end\n\nSigned-off-by: Adrien Mazarguil <adrien.mazarguil@6wind.com>\n---\n drivers/net/mlx5/mlx5_nl_flow.c | 177 ++++++++++++++++++++++++++++++++++-\n 1 file changed, 173 insertions(+), 4 deletions(-)",
    "diff": "diff --git a/drivers/net/mlx5/mlx5_nl_flow.c b/drivers/net/mlx5/mlx5_nl_flow.c\nindex ad1e001c6..a45d94fae 100644\n--- a/drivers/net/mlx5/mlx5_nl_flow.c\n+++ b/drivers/net/mlx5/mlx5_nl_flow.c\n@@ -13,6 +13,7 @@\n #include <linux/rtnetlink.h>\n #include <linux/tc_act/tc_gact.h>\n #include <linux/tc_act/tc_mirred.h>\n+#include <linux/tc_act/tc_vlan.h>\n #include <netinet/in.h>\n #include <stdalign.h>\n #include <stdbool.h>\n@@ -36,6 +37,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@@ -44,6 +46,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@@ -52,7 +58,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@@ -63,7 +70,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@@ -72,12 +80,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@@ -87,6 +100,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@@ -97,6 +111,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@@ -242,9 +261,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@@ -256,15 +279,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@@ -272,6 +300,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@@ -408,6 +441,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@@ -418,12 +503,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@@ -470,12 +558,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@@ -681,6 +772,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": [
        "5/6"
    ]
}