get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 21226,
    "url": "https://patches.dpdk.org/api/patches/21226/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/1488525977-15321-1-git-send-email-beilei.xing@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": "<1488525977-15321-1-git-send-email-beilei.xing@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1488525977-15321-1-git-send-email-beilei.xing@intel.com",
    "date": "2017-03-03T07:26:05",
    "name": "[dpdk-dev] MPSL enabling",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "c2faf5f0ebebfe92c0f955324bf0dd11469e72d6",
    "submitter": {
        "id": 410,
        "url": "https://patches.dpdk.org/api/people/410/?format=api",
        "name": "Xing, Beilei",
        "email": "beilei.xing@intel.com"
    },
    "delegate": null,
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/1488525977-15321-1-git-send-email-beilei.xing@intel.com/mbox/",
    "series": [],
    "comments": "https://patches.dpdk.org/api/patches/21226/comments/",
    "check": "fail",
    "checks": "https://patches.dpdk.org/api/patches/21226/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 C8955952;\n\tFri,  3 Mar 2017 08:27:27 +0100 (CET)",
            "from mga03.intel.com (mga03.intel.com [134.134.136.65])\n\tby dpdk.org (Postfix) with ESMTP id E4E9C952\n\tfor <dev@dpdk.org>; Fri,  3 Mar 2017 08:27:24 +0100 (CET)",
            "from fmsmga003.fm.intel.com ([10.253.24.29])\n\tby orsmga103.jf.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384;\n\t02 Mar 2017 23:27:23 -0800",
            "from unknown (HELO dpdk9.sh.intel.com) ([10.239.129.31])\n\tby FMSMGA003.fm.intel.com with ESMTP; 02 Mar 2017 23:27:22 -0800"
        ],
        "X-ExtLoop1": "1",
        "X-IronPort-AV": "E=Sophos;i=\"5.35,235,1484035200\"; d=\"scan'208\";a=\"830441938\"",
        "From": "Beilei Xing <beilei.xing@intel.com>",
        "To": "jingjing.wu@intel.com",
        "Cc": "helin.zhang@intel.com,\n\tdev@dpdk.org",
        "Date": "Fri,  3 Mar 2017 15:26:05 +0800",
        "Message-Id": "<1488525977-15321-1-git-send-email-beilei.xing@intel.com>",
        "X-Mailer": "git-send-email 2.5.5",
        "Subject": "[dpdk-dev] [PATCH] MPSL enabling",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.15",
        "Precedence": "list",
        "List-Id": "DPDK patches and discussions <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": "Signed-off-by: Beilei Xing <beilei.xing@intel.com>\n---\n app/test-pmd/cmdline_flow.c  |  23 ++++\n app/test-pmd/config.c        |   1 +\n drivers/net/i40e/i40e_flow.c | 245 +++++++++++++++++++++++++++++++++++++++++++\n lib/librte_ether/rte_flow.h  |  42 ++++++++\n 4 files changed, 311 insertions(+)",
    "diff": "diff --git a/app/test-pmd/cmdline_flow.c b/app/test-pmd/cmdline_flow.c\nindex ff98690..eee691d 100644\n--- a/app/test-pmd/cmdline_flow.c\n+++ b/app/test-pmd/cmdline_flow.c\n@@ -159,6 +159,8 @@ enum index {\n \tITEM_SCTP_CKSUM,\n \tITEM_VXLAN,\n \tITEM_VXLAN_VNI,\n+\tITEM_MPLS,\n+\tITEM_MPLS_LABEL,\n \n \t/* Validate/create actions. */\n \tACTIONS,\n@@ -432,6 +434,7 @@ static const enum index next_item[] = {\n \tITEM_TCP,\n \tITEM_SCTP,\n \tITEM_VXLAN,\n+\tITEM_MPLS,\n \tZERO,\n };\n \n@@ -538,6 +541,12 @@ static const enum index item_vxlan[] = {\n \tZERO,\n };\n \n+static const enum index item_mpls[] = {\n+\tITEM_MPLS_LABEL,\n+\tITEM_NEXT,\n+\tZERO,\n+};\n+\n static const enum index next_action[] = {\n \tACTION_END,\n \tACTION_VOID,\n@@ -1279,6 +1288,20 @@ static const struct token token_list[] = {\n \t\t.next = NEXT(item_vxlan, NEXT_ENTRY(UNSIGNED), item_param),\n \t\t.args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_vxlan, vni)),\n \t},\n+\t[ITEM_MPLS] = {\n+\t\t.name = \"mpls\",\n+\t\t.help = \"match MPLS header\",\n+\t\t.priv = PRIV_ITEM(MPLS, sizeof(struct rte_flow_item_mpls)),\n+\t\t.next = NEXT(item_mpls),\n+\t\t.call = parse_vc,\n+\t},\n+\t[ITEM_MPLS_LABEL] = {\n+\t\t.name = \"label\",\n+\t\t.help = \"MPLS label\",\n+\t\t.next = NEXT(item_mpls, NEXT_ENTRY(UNSIGNED), item_param),\n+\t\t.args = ARGS(ARGS_ENTRY_HTON(struct rte_flow_item_mpls,\n+\t\t\t\t\t     label_tc_s_ttl)),\n+\t},\n \t/* Validate/create actions. */\n \t[ACTIONS] = {\n \t\t.name = \"actions\",\ndiff --git a/app/test-pmd/config.c b/app/test-pmd/config.c\nindex 80491fc..3c7385a 100644\n--- a/app/test-pmd/config.c\n+++ b/app/test-pmd/config.c\n@@ -963,6 +963,7 @@ static const struct {\n \tMK_FLOW_ITEM(TCP, sizeof(struct rte_flow_item_tcp)),\n \tMK_FLOW_ITEM(SCTP, sizeof(struct rte_flow_item_sctp)),\n \tMK_FLOW_ITEM(VXLAN, sizeof(struct rte_flow_item_vxlan)),\n+\tMK_FLOW_ITEM(MPLS, sizeof(struct rte_flow_item_mpls)),\n };\n \n /** Compute storage space needed by item specification. */\ndiff --git a/drivers/net/i40e/i40e_flow.c b/drivers/net/i40e/i40e_flow.c\nindex 29f9513..1295f3c 100644\n--- a/drivers/net/i40e/i40e_flow.c\n+++ b/drivers/net/i40e/i40e_flow.c\n@@ -57,6 +57,7 @@\n #define I40E_IPV6_FRAG_HEADER\t44\n #define I40E_TENANT_ARRAY_NUM\t3\n #define I40E_TCI_MASK\t\t0xFFFF\n+#define I40E_MPLS_LABEL_MASK\t0xFFFFF\n \n static int i40e_flow_validate(struct rte_eth_dev *dev,\n \t\t\t      const struct rte_flow_attr *attr,\n@@ -114,6 +115,12 @@ static int i40e_flow_parse_vxlan_filter(struct rte_eth_dev *dev,\n \t\t\t\t\tconst struct rte_flow_action actions[],\n \t\t\t\t\tstruct rte_flow_error *error,\n \t\t\t\t\tunion i40e_filter_t *filter);\n+static int i40e_flow_parse_mpls_filter(struct rte_eth_dev *dev,\n+\t\t\t\t       const struct rte_flow_attr *attr,\n+\t\t\t\t       const struct rte_flow_item pattern[],\n+\t\t\t\t       const struct rte_flow_action actions[],\n+\t\t\t\t       struct rte_flow_error *error,\n+\t\t\t\t       union i40e_filter_t *filter);\n static int i40e_flow_destroy_ethertype_filter(struct i40e_pf *pf,\n \t\t\t\t      struct i40e_ethertype_filter *filter);\n static int i40e_flow_destroy_tunnel_filter(struct i40e_pf *pf,\n@@ -278,6 +285,42 @@ static enum rte_flow_item_type pattern_vxlan_4[] = {\n \tRTE_FLOW_ITEM_TYPE_END,\n };\n \n+static enum rte_flow_item_type pattern_mpls_1[] = {\n+\tRTE_FLOW_ITEM_TYPE_ETH,\n+\tRTE_FLOW_ITEM_TYPE_IPV4,\n+\tRTE_FLOW_ITEM_TYPE_UDP,\n+\tRTE_FLOW_ITEM_TYPE_MPLS,\n+\tRTE_FLOW_ITEM_TYPE_ETH,\n+        RTE_FLOW_ITEM_TYPE_END,\n+};\n+\n+static enum rte_flow_item_type pattern_mpls_2[] = {\n+\tRTE_FLOW_ITEM_TYPE_ETH,\n+\tRTE_FLOW_ITEM_TYPE_IPV6,\n+\tRTE_FLOW_ITEM_TYPE_UDP,\n+\tRTE_FLOW_ITEM_TYPE_MPLS,\n+\tRTE_FLOW_ITEM_TYPE_ETH,\n+        RTE_FLOW_ITEM_TYPE_END,\n+};\n+\n+static enum rte_flow_item_type pattern_mpls_3[] = {\n+\tRTE_FLOW_ITEM_TYPE_ETH,\n+\tRTE_FLOW_ITEM_TYPE_IPV4,\n+\tRTE_FLOW_ITEM_TYPE_GRE,\n+\tRTE_FLOW_ITEM_TYPE_MPLS,\n+\tRTE_FLOW_ITEM_TYPE_ETH,\n+        RTE_FLOW_ITEM_TYPE_END,\n+};\n+\n+static enum rte_flow_item_type pattern_mpls_4[] = {\n+\tRTE_FLOW_ITEM_TYPE_ETH,\n+\tRTE_FLOW_ITEM_TYPE_IPV6,\n+\tRTE_FLOW_ITEM_TYPE_GRE,\n+\tRTE_FLOW_ITEM_TYPE_MPLS,\n+\tRTE_FLOW_ITEM_TYPE_ETH,\n+        RTE_FLOW_ITEM_TYPE_END,\n+};\n+\n static struct i40e_valid_pattern i40e_supported_patterns[] = {\n \t/* Ethertype */\n \t{ pattern_ethertype, i40e_flow_parse_ethertype_filter },\n@@ -303,6 +346,11 @@ static struct i40e_valid_pattern i40e_supported_patterns[] = {\n \t{ pattern_vxlan_2, i40e_flow_parse_vxlan_filter },\n \t{ pattern_vxlan_3, i40e_flow_parse_vxlan_filter },\n \t{ pattern_vxlan_4, i40e_flow_parse_vxlan_filter },\n+\t/* MPLSoUDP & MPLSoGRE */\n+\t{ pattern_mpls_1, i40e_flow_parse_mpls_filter },\n+\t{ pattern_mpls_2, i40e_flow_parse_mpls_filter },\n+\t{ pattern_mpls_3, i40e_flow_parse_mpls_filter },\n+\t{ pattern_mpls_4, i40e_flow_parse_mpls_filter },\n };\n \n #define NEXT_ITEM_OF_ACTION(act, actions, index)                        \\\n@@ -1495,6 +1543,203 @@ i40e_flow_parse_vxlan_filter(struct rte_eth_dev *dev,\n \treturn ret;\n }\n \n+/* 1. Last in item should be NULL as range is not supported.\n+ * 2. Supported filter types: MPLS label.\n+ * 3. Mask of fields which need to be matched should be\n+ *    filled with 1.\n+ * 4. Mask of fields which needn't to be matched should be\n+ *    filled with 0.\n+ */\n+static int\n+i40e_flow_parse_mpls_pattern(__rte_unused struct rte_eth_dev *dev,\n+\t\t\t      const struct rte_flow_item *pattern,\n+\t\t\t      struct rte_flow_error *error,\n+\t\t\t      struct rte_eth_tunnel_filter_conf *filter)\n+{\n+\tconst struct rte_flow_item *item = pattern;\n+\tconst struct rte_flow_item_eth *eth_spec;\n+\tconst struct rte_flow_item_eth *eth_mask;\n+\tconst struct rte_flow_item_eth *i_eth_spec = NULL;\n+\tconst struct rte_flow_item_eth *i_eth_mask = NULL;\n+\tconst struct rte_flow_item_mpls *mpls_spec;\n+\tconst struct rte_flow_item_mpls *mpls_mask;\n+\tenum rte_flow_item_type item_type;\n+\tbool mpls_flag = 0;\n+\tuint32_t mpls_cpu;\n+\n+\tfor (; item->type != RTE_FLOW_ITEM_TYPE_END; item++) {\n+\t\tif (item->last) {\n+\t\t\trte_flow_error_set(error, EINVAL,\n+\t\t\t\t\t   RTE_FLOW_ERROR_TYPE_ITEM,\n+\t\t\t\t\t   item,\n+\t\t\t\t\t   \"Not support range\");\n+\t\t\treturn -rte_errno;\n+\t\t}\n+\t\titem_type = item->type;\n+\t\tswitch (item_type) {\n+\t\tcase RTE_FLOW_ITEM_TYPE_ETH:\n+\t\t\teth_spec = (const struct rte_flow_item_eth *)item->spec;\n+\t\t\teth_mask = (const struct rte_flow_item_eth *)item->mask;\n+\n+\t\t\tif ((!eth_spec && eth_mask) ||\n+\t\t\t    (eth_spec && !eth_mask)) {\n+\t\t\t\trte_flow_error_set(error, EINVAL,\n+\t\t\t\t\t\t   RTE_FLOW_ERROR_TYPE_ITEM,\n+\t\t\t\t\t\t   item,\n+\t\t\t\t\t\t   \"Invalid ether spec/mask\");\n+\t\t\t\treturn -rte_errno;\n+\t\t\t}\n+\n+\t\t\tif (eth_spec && eth_mask) {\n+\t\t\t\tif (!mpls_flag) {\n+\t\t\t\t\trte_flow_error_set(error, EINVAL,\n+\t\t\t\t\t\t\t   RTE_FLOW_ERROR_TYPE_ITEM,\n+\t\t\t\t\t\t\t   item,\n+\t\t\t\t\t\t\t   \"Invalid ether spec/mask\");\n+\t\t\t\t\treturn -rte_errno;\n+\t\t\t\t}\n+\t\t\t\t/* DST address of inner MAC shouldn't be masked.\n+\t\t\t\t * SRC address of Inner MAC should be masked.\n+\t\t\t\t */\n+\t\t\t\tif (!is_broadcast_ether_addr(&eth_mask->dst) ||\n+\t\t\t\t    !is_zero_ether_addr(&eth_mask->src) ||\n+\t\t\t\t    eth_mask->type) {\n+\t\t\t\t\trte_flow_error_set(error, EINVAL,\n+\t\t\t\t\t\t   RTE_FLOW_ERROR_TYPE_ITEM,\n+\t\t\t\t\t\t   item,\n+\t\t\t\t\t\t   \"Invalid ether spec/mask\");\n+\t\t\t\t\treturn -rte_errno;\n+\t\t\t\t}\n+\n+\t\t\t\trte_memcpy(&filter->inner_mac,\n+\t\t\t\t\t   &eth_spec->dst,\n+\t\t\t\t\t   ETHER_ADDR_LEN);\n+\n+\t\t\t\ti_eth_spec = eth_spec;\n+\t\t\t\ti_eth_mask = eth_mask;\n+\t\t\t}\n+\t\t\tbreak;\n+\t\tcase RTE_FLOW_ITEM_TYPE_IPV4:\n+\t\t\tfilter->ip_type = RTE_TUNNEL_IPTYPE_IPV4;\n+\t\t\t/* IPv4 is used to describe protocol,\n+\t\t\t * spec amd mask should be NULL.\n+\t\t\t */\n+\t\t\tif (item->spec || item->mask) {\n+\t\t\t\trte_flow_error_set(error, EINVAL,\n+\t\t\t\t\t\t   RTE_FLOW_ERROR_TYPE_ITEM,\n+\t\t\t\t\t\t   item,\n+\t\t\t\t\t\t   \"Invalid IPv4 item\");\n+\t\t\t\treturn -rte_errno;\n+\t\t\t}\n+\t\t\tbreak;\n+\t\tcase RTE_FLOW_ITEM_TYPE_IPV6:\n+\t\t\tfilter->ip_type = RTE_TUNNEL_IPTYPE_IPV6;\n+\t\t\t/* IPv6 is used to describe protocol,\n+\t\t\t * spec amd mask should be NULL.\n+\t\t\t */\n+\t\t\tif (item->spec || item->mask) {\n+\t\t\t\trte_flow_error_set(error, EINVAL,\n+\t\t\t\t\t\t   RTE_FLOW_ERROR_TYPE_ITEM,\n+\t\t\t\t\t\t   item,\n+\t\t\t\t\t\t   \"Invalid IPv6 item\");\n+\t\t\t\treturn -rte_errno;\n+\t\t\t}\n+\t\t\tbreak;\n+\t\tcase RTE_FLOW_ITEM_TYPE_UDP:\n+\t\t\t/* UDP is used to describe protocol,\n+\t\t\t * spec amd mask should be NULL.\n+\t\t\t */\n+\t\t\tif (item->spec || item->mask) {\n+\t\t\t\trte_flow_error_set(error, EINVAL,\n+\t\t\t\t\t   RTE_FLOW_ERROR_TYPE_ITEM,\n+\t\t\t\t\t   item,\n+\t\t\t\t\t   \"Invalid UDP item\");\n+\t\t\t\treturn -rte_errno;\n+\t\t\t}\n+\t\t\tbreak;\n+\t\tcase RTE_FLOW_ITEM_TYPE_GRE:\n+\t\t\t/* GRE is used to describe protocol,\n+\t\t\t * spec amd mask should be NULL.\n+\t\t\t */\n+\t\t\tif (item->spec || item->mask) {\n+\t\t\t\trte_flow_error_set(error, EINVAL,\n+\t\t\t\t\t\t   RTE_FLOW_ERROR_TYPE_ITEM,\n+\t\t\t\t\t\t   item,\n+\t\t\t\t\t\t   \"Invalid GRE item\");\n+\t\t\t\treturn -rte_errno;\n+\t\t\t}\n+\t\t\tbreak;\n+\t\tcase RTE_FLOW_ITEM_TYPE_MPLS:\n+\t\t\tmpls_spec =\n+\t\t\t\t(const struct rte_flow_item_mpls *)item->spec;\n+\t\t\tmpls_mask =\n+\t\t\t\t(const struct rte_flow_item_mpls *)item->mask;\n+\n+\t\t\tif (!mpls_spec || !mpls_mask) {\n+\t\t\t\trte_flow_error_set(error, EINVAL,\n+\t\t\t\t\t   RTE_FLOW_ERROR_TYPE_ITEM,\n+\t\t\t\t\t   item,\n+\t\t\t\t\t   \"Invalid VXLAN item\");\n+\t\t\t\treturn -rte_errno;\n+\t\t\t}\n+\n+\t\t\tif ((mpls_mask->label_tc_s_ttl &\n+\t\t\t     rte_cpu_to_be_32(I40E_MPLS_LABEL_MASK)) !=\n+\t\t\t    rte_cpu_to_be_32(I40E_MPLS_LABEL_MASK)) {\n+\t\t\t\trte_flow_error_set(error, EINVAL,\n+\t\t\t\t\t\t   RTE_FLOW_ERROR_TYPE_ITEM,\n+\t\t\t\t\t\t   item,\n+\t\t\t\t\t\t   \"Invalid VXLAN mask\");\n+\t\t\t\treturn -rte_errno;\n+\t\t\t}\n+\n+\t\t\tmpls_cpu = rte_be_to_cpu_32(mpls_spec->label_tc_s_ttl);\n+\t\t\tfilter->tenant_id = mpls_cpu & I40E_MPLS_LABEL_MASK;\n+\t\t\tmpls_flag = 1;\n+\t\t\tbreak;\n+\t\tdefault:\n+\t\t\tbreak;\n+\t\t}\n+\t}\n+\n+\tif (i_eth_spec && i_eth_mask && mpls_spec && mpls_mask)\n+\t\tfilter->filter_type = RTE_TUNNEL_FILTER_IMAC_TENID;\n+\n+\tfilter->tunnel_type = RTE_TUNNEL_TYPE_VXLAN;\n+\n+\treturn 0;\n+}\n+\n+static int\n+i40e_flow_parse_mpls_filter(struct rte_eth_dev *dev,\n+\t\t\t    const struct rte_flow_attr *attr,\n+\t\t\t    const struct rte_flow_item pattern[],\n+\t\t\t    const struct rte_flow_action actions[],\n+\t\t\t    struct rte_flow_error *error,\n+\t\t\t    union i40e_filter_t *filter)\n+{\n+\tstruct rte_eth_tunnel_filter_conf *tunnel_filter =\n+\t\t&filter->tunnel_filter;\n+\tint ret;\n+\n+\tret = i40e_flow_parse_mpls_pattern(dev, pattern,\n+\t\t\t\t\t   error, tunnel_filter);\n+\tif (ret)\n+\t\treturn ret;\n+\n+\tret = i40e_flow_parse_tunnel_action(dev, actions, error, tunnel_filter);\n+\tif (ret)\n+\t\treturn ret;\n+\n+\tret = i40e_flow_parse_attr(attr, error);\n+\tif (ret)\n+\t\treturn ret;\n+\n+\tcons_filter_type = RTE_ETH_FILTER_TUNNEL;\n+\n+\treturn ret;\n+}\n+\n static int\n i40e_flow_validate(struct rte_eth_dev *dev,\n \t\t   const struct rte_flow_attr *attr,\ndiff --git a/lib/librte_ether/rte_flow.h b/lib/librte_ether/rte_flow.h\nindex 171a569..25d8e3c 100644\n--- a/lib/librte_ether/rte_flow.h\n+++ b/lib/librte_ether/rte_flow.h\n@@ -282,6 +282,20 @@ enum rte_flow_item_type {\n \t * See struct rte_flow_item_nvgre.\n \t */\n \tRTE_FLOW_ITEM_TYPE_NVGRE,\n+\n+\t/**\n+\t * Matches a MPLS header.\n+\t *\n+\t * See struct rte_flow_item_mpls.\n+\t */\n+\tRTE_FLOW_ITEM_TYPE_MPLS,\n+\n+\t/**\n+\t * Matches a GRE header.\n+\t *\n+\t * See struct rte_flow_item_gre.\n+\t */\n+\tRTE_FLOW_ITEM_TYPE_GRE,\n };\n \n /**\n@@ -599,6 +613,34 @@ struct rte_flow_item_nvgre {\n };\n \n /**\n+ * RTE_FLOW_ITEM_TYPE_MPLS.\n+ *\n+ * Matches a MPLS header.\n+ */\n+struct rte_flow_item_mpls {\n+\t/**\n+\t * Lable (20b), TC (3b), Bottom of Stack (1b), TTL (8b).\n+\t */\n+\tuint32_t label_tc_s_ttl;\n+};\n+\n+/**\n+ * RTE_FLOW_ITEM_TYPE_GRE.\n+ *\n+ * Matches a GRE header.\n+ */\n+struct rte_flow_item_gre {\n+\t/**\n+\t * Checksum (1b), reserved 0 (12b), version (3b).\n+\t * Refer to RFC 2784.\n+\t */\n+\tuint16_t c_rsvd0_ver;\n+\tuint16_t protocol; /**< Protocol type. */\n+\tuint16_t checksum;\n+\tuint16_t rsvd1;\n+};\n+\n+/**\n  * Matching pattern item definition.\n  *\n  * A pattern is formed by stacking items starting from the lowest protocol\n",
    "prefixes": [
        "dpdk-dev"
    ]
}