get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 87393,
    "url": "https://patches.dpdk.org/api/patches/87393/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/20210127052933.2149243-3-zhirun.yan@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": "<20210127052933.2149243-3-zhirun.yan@intel.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20210127052933.2149243-3-zhirun.yan@intel.com",
    "date": "2021-01-27T05:29:32",
    "name": "[v2,2/3] net/ice: refactor flow pattern parser",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "a2ab34d717bcef7153c784fc7398051ea6381f91",
    "submitter": {
        "id": 1154,
        "url": "https://patches.dpdk.org/api/people/1154/?format=api",
        "name": "Yan, Zhirun",
        "email": "zhirun.yan@intel.com"
    },
    "delegate": {
        "id": 1540,
        "url": "https://patches.dpdk.org/api/users/1540/?format=api",
        "username": "qzhan15",
        "first_name": "Qi",
        "last_name": "Zhang",
        "email": "qi.z.zhang@intel.com"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/20210127052933.2149243-3-zhirun.yan@intel.com/mbox/",
    "series": [
        {
            "id": 14967,
            "url": "https://patches.dpdk.org/api/series/14967/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=14967",
            "date": "2021-01-27T05:29:30",
            "name": "Refactor FDIR pattern parser",
            "version": 2,
            "mbox": "https://patches.dpdk.org/series/14967/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/87393/comments/",
    "check": "success",
    "checks": "https://patches.dpdk.org/api/patches/87393/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 mails.dpdk.org (mails.dpdk.org [217.70.189.124])\n\tby inbox.dpdk.org (Postfix) with ESMTP id 020D0A052A;\n\tWed, 27 Jan 2021 06:35:17 +0100 (CET)",
            "from [217.70.189.124] (localhost [127.0.0.1])\n\tby mails.dpdk.org (Postfix) with ESMTP id 5A15F140E0D;\n\tWed, 27 Jan 2021 06:35:04 +0100 (CET)",
            "from mga01.intel.com (mga01.intel.com [192.55.52.88])\n by mails.dpdk.org (Postfix) with ESMTP id A8E91140E02\n for <dev@dpdk.org>; Wed, 27 Jan 2021 06:35:02 +0100 (CET)",
            "from orsmga006.jf.intel.com ([10.7.209.51])\n by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384;\n 26 Jan 2021 21:35:02 -0800",
            "from dpdk-zhirun-dev.sh.intel.com ([10.67.118.176])\n by orsmga006.jf.intel.com with ESMTP; 26 Jan 2021 21:34:59 -0800"
        ],
        "IronPort-SDR": [
            "\n lkWkipITbw62GA0F0SmIhKR8pKoh3i8T4d4NPLR5J61QeYJGEM3T2JyDU2k8tXp/IUp1Yq+6UN\n ZF8hIXdN8Izg==",
            "\n m/EdOz2pEqe1mH+JOWUj37IuAXxcyjCA7Ai9FPsvoi6NNlyzyubjrTX7MsZ5qNvDENwRd2xe1f\n c/FKIx37XjLA=="
        ],
        "X-IronPort-AV": [
            "E=McAfee;i=\"6000,8403,9876\"; a=\"198820624\"",
            "E=Sophos;i=\"5.79,378,1602572400\"; d=\"scan'208\";a=\"198820624\"",
            "E=Sophos;i=\"5.79,378,1602572400\"; d=\"scan'208\";a=\"356953783\""
        ],
        "X-ExtLoop1": "1",
        "From": "Zhirun Yan <zhirun.yan@intel.com>",
        "To": "dev@dpdk.org, qi.z.zhang@intel.com, yahui.cao@intel.com,\n xiao.w.wang@intel.com, junfeng.guo@intel.com",
        "Cc": "simei.su@intel.com, ting.xu@intel.com, yuying.zhang@intel.com,\n xuan.ding@intel.com, Zhirun Yan <zhirun.yan@intel.com>",
        "Date": "Wed, 27 Jan 2021 13:29:32 +0800",
        "Message-Id": "<20210127052933.2149243-3-zhirun.yan@intel.com>",
        "X-Mailer": "git-send-email 2.25.1",
        "In-Reply-To": "<20210127052933.2149243-1-zhirun.yan@intel.com>",
        "References": "<20201221065150.1600719-1-zhirun.yan@intel.com>\n <20210127052933.2149243-1-zhirun.yan@intel.com>",
        "MIME-Version": "1.0",
        "Content-Transfer-Encoding": "8bit",
        "Subject": "[dpdk-dev] [PATCH v2 2/3] net/ice: refactor flow pattern parser",
        "X-BeenThere": "dev@dpdk.org",
        "X-Mailman-Version": "2.1.29",
        "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": "Distinguish inner/outer input_set. And avoid too many nested\nconditionals in each type's parser. input_set_f is used for\nouter fields, input_set_l is used for inner or non-tunnel\nfields.\n\nTo align with shared code behavior, set GTPU as non-tunnel flow.\nIdeally, GTPU packet should be parsed as tunnel and QFI, TEID should\nset into input_set_f.\n\ntodo:\n    1. Distinguish gtpu input set. Put QFI, TEID into input set outer.\n\nSigned-off-by: Zhirun Yan <zhirun.yan@intel.com>\n---\n drivers/net/ice/ice_fdir_filter.c | 478 +++++++++++++++---------------\n 1 file changed, 239 insertions(+), 239 deletions(-)",
    "diff": "diff --git a/drivers/net/ice/ice_fdir_filter.c b/drivers/net/ice/ice_fdir_filter.c\nindex 4e99df1272..83b3a4c547 100644\n--- a/drivers/net/ice/ice_fdir_filter.c\n+++ b/drivers/net/ice/ice_fdir_filter.c\n@@ -1610,7 +1610,9 @@ ice_fdir_parse_pattern(__rte_unused struct ice_adapter *ad,\n \tconst struct rte_flow_item_vxlan *vxlan_spec, *vxlan_mask;\n \tconst struct rte_flow_item_gtp *gtp_spec, *gtp_mask;\n \tconst struct rte_flow_item_gtp_psc *gtp_psc_spec, *gtp_psc_mask;\n-\tuint64_t input_set = ICE_INSET_NONE;\n+\tuint64_t input_set_l = ICE_INSET_NONE; /* non-tunnel and tunnel inner */\n+\tuint64_t input_set_f = ICE_INSET_NONE; /* only for tunnel outer */\n+\tuint64_t *input_set;\n \tuint8_t flow_type = ICE_FLTR_PTYPE_NONF_NONE;\n \tuint8_t  ipv6_addr_mask[16] = {\n \t\t0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,\n@@ -1619,289 +1621,283 @@ ice_fdir_parse_pattern(__rte_unused struct ice_adapter *ad,\n \tuint32_t vtc_flow_cpu;\n \tuint16_t ether_type;\n \tenum rte_flow_item_type next_type;\n+\tbool is_outer = true;\n+\tstruct ice_fdir_extra *p_ext_data;\n+\tstruct ice_fdir_v4 *p_v4 = NULL;\n+\tstruct ice_fdir_v6 *p_v6 = NULL;\n \n+\tfor (item = pattern; item->type != RTE_FLOW_ITEM_TYPE_END; item++) {\n+\t\tif (item->type == RTE_FLOW_ITEM_TYPE_VXLAN)\n+\t\t\ttunnel_type = ICE_FDIR_TUNNEL_TYPE_VXLAN;\n+\t\tif (item->type == RTE_FLOW_ITEM_TYPE_GTPU) {\n+\t\t\ttunnel_type = ICE_FDIR_TUNNEL_TYPE_GTPU;\n+\t\t\tis_outer = false;\n+\t\t}\n+\t\tif (item->type == RTE_FLOW_ITEM_TYPE_GTP_PSC) {\n+\t\t\ttunnel_type = ICE_FDIR_TUNNEL_TYPE_GTPU_EH;\n+\t\t\tis_outer = false;\n+\t\t}\n+\t}\n+\n+\t/* This loop parse flow pattern and distinguish Non-tunnel and tunnel\n+\t * flow. input_set_l is used for non-tunnel and tunnel inner part.\n+\t */\n \tfor (item = pattern; 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\tRTE_FLOW_ERROR_TYPE_ITEM,\n-\t\t\t\t\titem,\n-\t\t\t\t\t\"Not support range\");\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 \n+\t\tinput_set = (tunnel_type && is_outer) ?\n+\t\t\t    &input_set_f : &input_set_l;\n+\n \t\tswitch (item_type) {\n \t\tcase RTE_FLOW_ITEM_TYPE_ETH:\n+\t\t\tflow_type = ICE_FLTR_PTYPE_NON_IP_L2;\n \t\t\teth_spec = item->spec;\n \t\t\teth_mask = item->mask;\n-\t\t\tnext_type = (item + 1)->type;\n \n-\t\t\tif (eth_spec && eth_mask) {\n-\t\t\t\tif (!rte_is_zero_ether_addr(&eth_mask->dst)) {\n-\t\t\t\t\tinput_set |= ICE_INSET_DMAC;\n-\t\t\t\t\trte_memcpy(&filter->input.ext_data.dst_mac,\n-\t\t\t\t\t\t   &eth_spec->dst,\n-\t\t\t\t\t\t   RTE_ETHER_ADDR_LEN);\n-\t\t\t\t}\n+\t\t\tif (!(eth_spec && eth_mask))\n+\t\t\t\tbreak;\n \n-\t\t\t\tif (!rte_is_zero_ether_addr(&eth_mask->src)) {\n-\t\t\t\t\tinput_set |= ICE_INSET_SMAC;\n-\t\t\t\t\trte_memcpy(&filter->input.ext_data.src_mac,\n-\t\t\t\t\t\t   &eth_spec->src,\n-\t\t\t\t\t\t   RTE_ETHER_ADDR_LEN);\n-\t\t\t\t}\n+\t\t\tif (!rte_is_zero_ether_addr(&eth_mask->dst))\n+\t\t\t\t*input_set |= ICE_INSET_DMAC;\n+\t\t\tif (!rte_is_zero_ether_addr(&eth_mask->src))\n+\t\t\t\t*input_set |= ICE_INSET_SMAC;\n \n-\t\t\t\t/* Ignore this field except for ICE_FLTR_PTYPE_NON_IP_L2 */\n-\t\t\t\tif (eth_mask->type == RTE_BE16(0xffff) &&\n-\t\t\t\t    next_type == RTE_FLOW_ITEM_TYPE_END) {\n-\t\t\t\t\tinput_set |= ICE_INSET_ETHERTYPE;\n-\t\t\t\t\tether_type = rte_be_to_cpu_16(eth_spec->type);\n-\n-\t\t\t\t\tif (ether_type == RTE_ETHER_TYPE_IPV4 ||\n-\t\t\t\t\t    ether_type == RTE_ETHER_TYPE_IPV6) {\n-\t\t\t\t\t\trte_flow_error_set(error, EINVAL,\n-\t\t\t\t\t\t\t\t   RTE_FLOW_ERROR_TYPE_ITEM,\n-\t\t\t\t\t\t\t\t   item,\n-\t\t\t\t\t\t\t\t   \"Unsupported ether_type.\");\n-\t\t\t\t\t\treturn -rte_errno;\n-\t\t\t\t\t}\n-\n-\t\t\t\t\trte_memcpy(&filter->input.ext_data.ether_type,\n-\t\t\t\t\t\t   &eth_spec->type,\n-\t\t\t\t\t\t   sizeof(eth_spec->type));\n-\t\t\t\t\tflow_type = ICE_FLTR_PTYPE_NON_IP_L2;\n+\t\t\tnext_type = (item + 1)->type;\n+\t\t\t/* Ignore this field except for ICE_FLTR_PTYPE_NON_IP_L2 */\n+\t\t\tif (eth_mask->type == RTE_BE16(0xffff) &&\n+\t\t\t    next_type == RTE_FLOW_ITEM_TYPE_END) {\n+\t\t\t\t*input_set |= ICE_INSET_ETHERTYPE;\n+\t\t\t\tether_type = rte_be_to_cpu_16(eth_spec->type);\n+\n+\t\t\t\tif (ether_type == RTE_ETHER_TYPE_IPV4 ||\n+\t\t\t\t    ether_type == RTE_ETHER_TYPE_IPV6) {\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   \"Unsupported ether_type.\");\n+\t\t\t\t\treturn -rte_errno;\n \t\t\t\t}\n \t\t\t}\n+\n+\t\t\tp_ext_data = (tunnel_type && is_outer) ?\n+\t\t\t\t     &filter->input.ext_data_outer :\n+\t\t\t\t     &filter->input.ext_data;\n+\t\t\trte_memcpy(&p_ext_data->src_mac,\n+\t\t\t\t   &eth_spec->src, RTE_ETHER_ADDR_LEN);\n+\t\t\trte_memcpy(&p_ext_data->dst_mac,\n+\t\t\t\t   &eth_spec->dst, RTE_ETHER_ADDR_LEN);\n+\t\t\trte_memcpy(&p_ext_data->ether_type,\n+\t\t\t\t   &eth_spec->type, sizeof(eth_spec->type));\n \t\t\tbreak;\n \t\tcase RTE_FLOW_ITEM_TYPE_IPV4:\n+\t\t\tflow_type = ICE_FLTR_PTYPE_NONF_IPV4_OTHER;\n \t\t\tl3 = RTE_FLOW_ITEM_TYPE_IPV4;\n \t\t\tipv4_spec = item->spec;\n \t\t\tipv4_mask = item->mask;\n-\n-\t\t\tif (ipv4_spec && ipv4_mask) {\n-\t\t\t\t/* Check IPv4 mask and update input set */\n-\t\t\t\tif (ipv4_mask->hdr.version_ihl ||\n-\t\t\t\t    ipv4_mask->hdr.total_length ||\n-\t\t\t\t    ipv4_mask->hdr.packet_id ||\n-\t\t\t\t    ipv4_mask->hdr.fragment_offset ||\n-\t\t\t\t    ipv4_mask->hdr.hdr_checksum) {\n-\t\t\t\t\trte_flow_error_set(error, EINVAL,\n+\t\t\tp_v4 = (tunnel_type && is_outer) ?\n+\t\t\t       &filter->input.ip_outer.v4 :\n+\t\t\t       &filter->input.ip.v4;\n+\n+\t\t\tif (!(ipv4_spec && ipv4_mask))\n+\t\t\t\tbreak;\n+\n+\t\t\t/* Check IPv4 mask and update input set */\n+\t\t\tif (ipv4_mask->hdr.version_ihl ||\n+\t\t\t    ipv4_mask->hdr.total_length ||\n+\t\t\t    ipv4_mask->hdr.packet_id ||\n+\t\t\t    ipv4_mask->hdr.fragment_offset ||\n+\t\t\t    ipv4_mask->hdr.hdr_checksum) {\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 mask.\");\n-\t\t\t\t\treturn -rte_errno;\n-\t\t\t\t}\n-\t\t\t\tif (ipv4_mask->hdr.src_addr == UINT32_MAX)\n-\t\t\t\t\tinput_set |= tunnel_type ?\n-\t\t\t\t\t\t     ICE_INSET_TUN_IPV4_SRC :\n-\t\t\t\t\t\t     ICE_INSET_IPV4_SRC;\n-\t\t\t\tif (ipv4_mask->hdr.dst_addr == UINT32_MAX)\n-\t\t\t\t\tinput_set |= tunnel_type ?\n-\t\t\t\t\t\t     ICE_INSET_TUN_IPV4_DST :\n-\t\t\t\t\t\t     ICE_INSET_IPV4_DST;\n-\t\t\t\tif (ipv4_mask->hdr.type_of_service == UINT8_MAX)\n-\t\t\t\t\tinput_set |= ICE_INSET_IPV4_TOS;\n-\t\t\t\tif (ipv4_mask->hdr.time_to_live == UINT8_MAX)\n-\t\t\t\t\tinput_set |= ICE_INSET_IPV4_TTL;\n-\t\t\t\tif (ipv4_mask->hdr.next_proto_id == UINT8_MAX)\n-\t\t\t\t\tinput_set |= ICE_INSET_IPV4_PROTO;\n-\n-\t\t\t\tfilter->input.ip.v4.dst_ip =\n-\t\t\t\t\tipv4_spec->hdr.dst_addr;\n-\t\t\t\tfilter->input.ip.v4.src_ip =\n-\t\t\t\t\tipv4_spec->hdr.src_addr;\n-\t\t\t\tfilter->input.ip.v4.tos =\n-\t\t\t\t\tipv4_spec->hdr.type_of_service;\n-\t\t\t\tfilter->input.ip.v4.ttl =\n-\t\t\t\t\tipv4_spec->hdr.time_to_live;\n-\t\t\t\tfilter->input.ip.v4.proto =\n-\t\t\t\t\tipv4_spec->hdr.next_proto_id;\n+\t\t\t\treturn -rte_errno;\n \t\t\t}\n \n-\t\t\tflow_type = ICE_FLTR_PTYPE_NONF_IPV4_OTHER;\n+\t\t\tif (ipv4_mask->hdr.dst_addr == UINT32_MAX)\n+\t\t\t\t*input_set |= ICE_INSET_IPV4_DST;\n+\t\t\tif (ipv4_mask->hdr.src_addr == UINT32_MAX)\n+\t\t\t\t*input_set |= ICE_INSET_IPV4_SRC;\n+\t\t\tif (ipv4_mask->hdr.time_to_live == UINT8_MAX)\n+\t\t\t\t*input_set |= ICE_INSET_IPV4_TTL;\n+\t\t\tif (ipv4_mask->hdr.next_proto_id == UINT8_MAX)\n+\t\t\t\t*input_set |= ICE_INSET_IPV4_PROTO;\n+\t\t\tif (ipv4_mask->hdr.type_of_service == UINT8_MAX)\n+\t\t\t\t*input_set |= ICE_INSET_IPV4_TOS;\n+\n+\t\t\tp_v4->dst_ip = ipv4_spec->hdr.dst_addr;\n+\t\t\tp_v4->src_ip = ipv4_spec->hdr.src_addr;\n+\t\t\tp_v4->ttl = ipv4_spec->hdr.time_to_live;\n+\t\t\tp_v4->proto = ipv4_spec->hdr.next_proto_id;\n+\t\t\tp_v4->tos = ipv4_spec->hdr.type_of_service;\n \t\t\tbreak;\n \t\tcase RTE_FLOW_ITEM_TYPE_IPV6:\n+\t\t\tflow_type = ICE_FLTR_PTYPE_NONF_IPV6_OTHER;\n \t\t\tl3 = RTE_FLOW_ITEM_TYPE_IPV6;\n \t\t\tipv6_spec = item->spec;\n \t\t\tipv6_mask = item->mask;\n+\t\t\tp_v6 = (tunnel_type && is_outer) ?\n+\t\t\t       &filter->input.ip_outer.v6 :\n+\t\t\t       &filter->input.ip.v6;\n \n-\t\t\tif (ipv6_spec && ipv6_mask) {\n-\t\t\t\t/* Check IPv6 mask and update input set */\n-\t\t\t\tif (ipv6_mask->hdr.payload_len) {\n-\t\t\t\t\trte_flow_error_set(error, EINVAL,\n+\t\t\tif (!(ipv6_spec && ipv6_mask))\n+\t\t\t\tbreak;\n+\n+\t\t\t/* Check IPv6 mask and update input set */\n+\t\t\tif (ipv6_mask->hdr.payload_len) {\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 mask\");\n-\t\t\t\t\treturn -rte_errno;\n-\t\t\t\t}\n-\n-\t\t\t\tif (!memcmp(ipv6_mask->hdr.src_addr,\n-\t\t\t\t\t    ipv6_addr_mask,\n-\t\t\t\t\t    RTE_DIM(ipv6_mask->hdr.src_addr)))\n-\t\t\t\t\tinput_set |= ICE_INSET_IPV6_SRC;\n-\t\t\t\tif (!memcmp(ipv6_mask->hdr.dst_addr,\n-\t\t\t\t\t    ipv6_addr_mask,\n-\t\t\t\t\t    RTE_DIM(ipv6_mask->hdr.dst_addr)))\n-\t\t\t\t\tinput_set |= ICE_INSET_IPV6_DST;\n-\n-\t\t\t\tif ((ipv6_mask->hdr.vtc_flow &\n-\t\t\t\t     rte_cpu_to_be_32(ICE_IPV6_TC_MASK))\n-\t\t\t\t    == rte_cpu_to_be_32(ICE_IPV6_TC_MASK))\n-\t\t\t\t\tinput_set |= ICE_INSET_IPV6_TC;\n-\t\t\t\tif (ipv6_mask->hdr.proto == UINT8_MAX)\n-\t\t\t\t\tinput_set |= ICE_INSET_IPV6_NEXT_HDR;\n-\t\t\t\tif (ipv6_mask->hdr.hop_limits == UINT8_MAX)\n-\t\t\t\t\tinput_set |= ICE_INSET_IPV6_HOP_LIMIT;\n-\n-\t\t\t\trte_memcpy(filter->input.ip.v6.dst_ip,\n-\t\t\t\t\t   ipv6_spec->hdr.dst_addr, 16);\n-\t\t\t\trte_memcpy(filter->input.ip.v6.src_ip,\n-\t\t\t\t\t   ipv6_spec->hdr.src_addr, 16);\n-\n-\t\t\t\tvtc_flow_cpu =\n-\t\t\t\t      rte_be_to_cpu_32(ipv6_spec->hdr.vtc_flow);\n-\t\t\t\tfilter->input.ip.v6.tc =\n-\t\t\t\t\t(uint8_t)(vtc_flow_cpu >>\n-\t\t\t\t\t\t  ICE_FDIR_IPV6_TC_OFFSET);\n-\t\t\t\tfilter->input.ip.v6.proto =\n-\t\t\t\t\tipv6_spec->hdr.proto;\n-\t\t\t\tfilter->input.ip.v6.hlim =\n-\t\t\t\t\tipv6_spec->hdr.hop_limits;\n+\t\t\t\treturn -rte_errno;\n \t\t\t}\n \n-\t\t\tflow_type = ICE_FLTR_PTYPE_NONF_IPV6_OTHER;\n+\t\t\tif (!memcmp(ipv6_mask->hdr.src_addr, ipv6_addr_mask,\n+\t\t\t\t    RTE_DIM(ipv6_mask->hdr.src_addr)))\n+\t\t\t\t*input_set |= ICE_INSET_IPV6_SRC;\n+\t\t\tif (!memcmp(ipv6_mask->hdr.dst_addr, ipv6_addr_mask,\n+\t\t\t\t    RTE_DIM(ipv6_mask->hdr.dst_addr)))\n+\t\t\t\t*input_set |= ICE_INSET_IPV6_DST;\n+\n+\t\t\tif ((ipv6_mask->hdr.vtc_flow &\n+\t\t\t     rte_cpu_to_be_32(ICE_IPV6_TC_MASK))\n+\t\t\t    == rte_cpu_to_be_32(ICE_IPV6_TC_MASK))\n+\t\t\t\t*input_set |= ICE_INSET_IPV6_TC;\n+\t\t\tif (ipv6_mask->hdr.proto == UINT8_MAX)\n+\t\t\t\t*input_set |= ICE_INSET_IPV6_NEXT_HDR;\n+\t\t\tif (ipv6_mask->hdr.hop_limits == UINT8_MAX)\n+\t\t\t\t*input_set |= ICE_INSET_IPV6_HOP_LIMIT;\n+\n+\t\t\trte_memcpy(&p_v6->dst_ip, ipv6_spec->hdr.dst_addr, 16);\n+\t\t\trte_memcpy(&p_v6->src_ip, ipv6_spec->hdr.src_addr, 16);\n+\t\t\tvtc_flow_cpu = rte_be_to_cpu_32(ipv6_spec->hdr.vtc_flow);\n+\t\t\tp_v6->tc = (uint8_t)(vtc_flow_cpu >> ICE_FDIR_IPV6_TC_OFFSET);\n+\t\t\tp_v6->proto = ipv6_spec->hdr.proto;\n+\t\t\tp_v6->hlim = ipv6_spec->hdr.hop_limits;\n \t\t\tbreak;\n \t\tcase RTE_FLOW_ITEM_TYPE_TCP:\n-\t\t\ttcp_spec = item->spec;\n-\t\t\ttcp_mask = item->mask;\n-\n \t\t\tif (l3 == RTE_FLOW_ITEM_TYPE_IPV4)\n \t\t\t\tflow_type = ICE_FLTR_PTYPE_NONF_IPV4_TCP;\n-\t\t\telse if (l3 == RTE_FLOW_ITEM_TYPE_IPV6)\n+\t\t\tif (l3 == RTE_FLOW_ITEM_TYPE_IPV6)\n \t\t\t\tflow_type = ICE_FLTR_PTYPE_NONF_IPV6_TCP;\n \n-\t\t\tif (tcp_spec && tcp_mask) {\n-\t\t\t\t/* Check TCP mask and update input set */\n-\t\t\t\tif (tcp_mask->hdr.sent_seq ||\n-\t\t\t\t    tcp_mask->hdr.recv_ack ||\n-\t\t\t\t    tcp_mask->hdr.data_off ||\n-\t\t\t\t    tcp_mask->hdr.tcp_flags ||\n-\t\t\t\t    tcp_mask->hdr.rx_win ||\n-\t\t\t\t    tcp_mask->hdr.cksum ||\n-\t\t\t\t    tcp_mask->hdr.tcp_urp) {\n-\t\t\t\t\trte_flow_error_set(error, EINVAL,\n+\t\t\ttcp_spec = item->spec;\n+\t\t\ttcp_mask = item->mask;\n+\n+\t\t\tif (!(tcp_spec && tcp_mask))\n+\t\t\t\tbreak;\n+\n+\t\t\t/* Check TCP mask and update input set */\n+\t\t\tif (tcp_mask->hdr.sent_seq ||\n+\t\t\t    tcp_mask->hdr.recv_ack ||\n+\t\t\t    tcp_mask->hdr.data_off ||\n+\t\t\t    tcp_mask->hdr.tcp_flags ||\n+\t\t\t    tcp_mask->hdr.rx_win ||\n+\t\t\t    tcp_mask->hdr.cksum ||\n+\t\t\t    tcp_mask->hdr.tcp_urp) {\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 TCP mask\");\n-\t\t\t\t\treturn -rte_errno;\n-\t\t\t\t}\n+\t\t\t\treturn -rte_errno;\n+\t\t\t}\n \n-\t\t\t\tif (tcp_mask->hdr.src_port == UINT16_MAX)\n-\t\t\t\t\tinput_set |= tunnel_type ?\n-\t\t\t\t\t\t     ICE_INSET_TUN_TCP_SRC_PORT :\n-\t\t\t\t\t\t     ICE_INSET_TCP_SRC_PORT;\n-\t\t\t\tif (tcp_mask->hdr.dst_port == UINT16_MAX)\n-\t\t\t\t\tinput_set |= tunnel_type ?\n-\t\t\t\t\t\t     ICE_INSET_TUN_TCP_DST_PORT :\n-\t\t\t\t\t\t     ICE_INSET_TCP_DST_PORT;\n-\n-\t\t\t\t/* Get filter info */\n-\t\t\t\tif (l3 == RTE_FLOW_ITEM_TYPE_IPV4) {\n-\t\t\t\t\tfilter->input.ip.v4.dst_port =\n-\t\t\t\t\t\ttcp_spec->hdr.dst_port;\n-\t\t\t\t\tfilter->input.ip.v4.src_port =\n-\t\t\t\t\t\ttcp_spec->hdr.src_port;\n-\t\t\t\t} else if (l3 == RTE_FLOW_ITEM_TYPE_IPV6) {\n-\t\t\t\t\tfilter->input.ip.v6.dst_port =\n-\t\t\t\t\t\ttcp_spec->hdr.dst_port;\n-\t\t\t\t\tfilter->input.ip.v6.src_port =\n-\t\t\t\t\t\ttcp_spec->hdr.src_port;\n-\t\t\t\t}\n+\t\t\tif (tcp_mask->hdr.src_port == UINT16_MAX)\n+\t\t\t\t*input_set |= ICE_INSET_TCP_SRC_PORT;\n+\t\t\tif (tcp_mask->hdr.dst_port == UINT16_MAX)\n+\t\t\t\t*input_set |= ICE_INSET_TCP_DST_PORT;\n+\n+\t\t\t/* Get filter info */\n+\t\t\tif (l3 == RTE_FLOW_ITEM_TYPE_IPV4) {\n+\t\t\t\tassert(p_v4);\n+\t\t\t\tp_v4->dst_port = tcp_spec->hdr.dst_port;\n+\t\t\t\tp_v4->src_port = tcp_spec->hdr.src_port;\n+\t\t\t} else if (l3 == RTE_FLOW_ITEM_TYPE_IPV6) {\n+\t\t\t\tassert(p_v6);\n+\t\t\t\tp_v6->dst_port = tcp_spec->hdr.dst_port;\n+\t\t\t\tp_v6->src_port = tcp_spec->hdr.src_port;\n \t\t\t}\n \t\t\tbreak;\n \t\tcase RTE_FLOW_ITEM_TYPE_UDP:\n-\t\t\tudp_spec = item->spec;\n-\t\t\tudp_mask = item->mask;\n-\n \t\t\tif (l3 == RTE_FLOW_ITEM_TYPE_IPV4)\n \t\t\t\tflow_type = ICE_FLTR_PTYPE_NONF_IPV4_UDP;\n-\t\t\telse if (l3 == RTE_FLOW_ITEM_TYPE_IPV6)\n+\t\t\tif (l3 == RTE_FLOW_ITEM_TYPE_IPV6)\n \t\t\t\tflow_type = ICE_FLTR_PTYPE_NONF_IPV6_UDP;\n \n-\t\t\tif (udp_spec && udp_mask) {\n-\t\t\t\t/* Check UDP mask and update input set*/\n-\t\t\t\tif (udp_mask->hdr.dgram_len ||\n-\t\t\t\t    udp_mask->hdr.dgram_cksum) {\n-\t\t\t\t\trte_flow_error_set(error, EINVAL,\n+\t\t\tudp_spec = item->spec;\n+\t\t\tudp_mask = item->mask;\n+\n+\t\t\tif (!(udp_spec && udp_mask))\n+\t\t\t\tbreak;\n+\n+\t\t\t/* Check UDP mask and update input set*/\n+\t\t\tif (udp_mask->hdr.dgram_len ||\n+\t\t\t    udp_mask->hdr.dgram_cksum) {\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 UDP mask\");\n-\t\t\t\t\treturn -rte_errno;\n-\t\t\t\t}\n+\t\t\t\treturn -rte_errno;\n+\t\t\t}\n \n-\t\t\t\tif (udp_mask->hdr.src_port == UINT16_MAX)\n-\t\t\t\t\tinput_set |= tunnel_type ?\n-\t\t\t\t\t\t     ICE_INSET_TUN_UDP_SRC_PORT :\n-\t\t\t\t\t\t     ICE_INSET_UDP_SRC_PORT;\n-\t\t\t\tif (udp_mask->hdr.dst_port == UINT16_MAX)\n-\t\t\t\t\tinput_set |= tunnel_type ?\n-\t\t\t\t\t\t     ICE_INSET_TUN_UDP_DST_PORT :\n-\t\t\t\t\t\t     ICE_INSET_UDP_DST_PORT;\n-\n-\t\t\t\t/* Get filter info */\n-\t\t\t\tif (l3 == RTE_FLOW_ITEM_TYPE_IPV4) {\n-\t\t\t\t\tfilter->input.ip.v4.dst_port =\n-\t\t\t\t\t\tudp_spec->hdr.dst_port;\n-\t\t\t\t\tfilter->input.ip.v4.src_port =\n-\t\t\t\t\t\tudp_spec->hdr.src_port;\n-\t\t\t\t} else if (l3 == RTE_FLOW_ITEM_TYPE_IPV6) {\n-\t\t\t\t\tfilter->input.ip.v6.src_port =\n-\t\t\t\t\t\tudp_spec->hdr.src_port;\n-\t\t\t\t\tfilter->input.ip.v6.dst_port =\n-\t\t\t\t\t\tudp_spec->hdr.dst_port;\n-\t\t\t\t}\n+\t\t\tif (udp_mask->hdr.src_port == UINT16_MAX)\n+\t\t\t\t*input_set |= ICE_INSET_UDP_SRC_PORT;\n+\t\t\tif (udp_mask->hdr.dst_port == UINT16_MAX)\n+\t\t\t\t*input_set |= ICE_INSET_UDP_DST_PORT;\n+\n+\t\t\t/* Get filter info */\n+\t\t\tif (l3 == RTE_FLOW_ITEM_TYPE_IPV4) {\n+\t\t\t\tassert(p_v4);\n+\t\t\t\tp_v4->dst_port = udp_spec->hdr.dst_port;\n+\t\t\t\tp_v4->src_port = udp_spec->hdr.src_port;\n+\t\t\t} else if (l3 == RTE_FLOW_ITEM_TYPE_IPV6) {\n+\t\t\t\tassert(p_v6);\n+\t\t\t\tp_v6->src_port = udp_spec->hdr.src_port;\n+\t\t\t\tp_v6->dst_port = udp_spec->hdr.dst_port;\n \t\t\t}\n \t\t\tbreak;\n \t\tcase RTE_FLOW_ITEM_TYPE_SCTP:\n-\t\t\tsctp_spec = item->spec;\n-\t\t\tsctp_mask = item->mask;\n-\n \t\t\tif (l3 == RTE_FLOW_ITEM_TYPE_IPV4)\n \t\t\t\tflow_type = ICE_FLTR_PTYPE_NONF_IPV4_SCTP;\n-\t\t\telse if (l3 == RTE_FLOW_ITEM_TYPE_IPV6)\n+\t\t\tif (l3 == RTE_FLOW_ITEM_TYPE_IPV6)\n \t\t\t\tflow_type = ICE_FLTR_PTYPE_NONF_IPV6_SCTP;\n \n-\t\t\tif (sctp_spec && sctp_mask) {\n-\t\t\t\t/* Check SCTP mask and update input set */\n-\t\t\t\tif (sctp_mask->hdr.cksum) {\n-\t\t\t\t\trte_flow_error_set(error, EINVAL,\n+\t\t\tsctp_spec = item->spec;\n+\t\t\tsctp_mask = item->mask;\n+\n+\t\t\tif (!(sctp_spec && sctp_mask))\n+\t\t\t\tbreak;\n+\n+\t\t\t/* Check SCTP mask and update input set */\n+\t\t\tif (sctp_mask->hdr.cksum) {\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 UDP mask\");\n-\t\t\t\t\treturn -rte_errno;\n-\t\t\t\t}\n+\t\t\t\treturn -rte_errno;\n+\t\t\t}\n \n-\t\t\t\tif (sctp_mask->hdr.src_port == UINT16_MAX)\n-\t\t\t\t\tinput_set |= tunnel_type ?\n-\t\t\t\t\t\t     ICE_INSET_TUN_SCTP_SRC_PORT :\n-\t\t\t\t\t\t     ICE_INSET_SCTP_SRC_PORT;\n-\t\t\t\tif (sctp_mask->hdr.dst_port == UINT16_MAX)\n-\t\t\t\t\tinput_set |= tunnel_type ?\n-\t\t\t\t\t\t     ICE_INSET_TUN_SCTP_DST_PORT :\n-\t\t\t\t\t\t     ICE_INSET_SCTP_DST_PORT;\n-\n-\t\t\t\t/* Get filter info */\n-\t\t\t\tif (l3 == RTE_FLOW_ITEM_TYPE_IPV4) {\n-\t\t\t\t\tfilter->input.ip.v4.dst_port =\n-\t\t\t\t\t\tsctp_spec->hdr.dst_port;\n-\t\t\t\t\tfilter->input.ip.v4.src_port =\n-\t\t\t\t\t\tsctp_spec->hdr.src_port;\n-\t\t\t\t} else if (l3 == RTE_FLOW_ITEM_TYPE_IPV6) {\n-\t\t\t\t\tfilter->input.ip.v6.dst_port =\n-\t\t\t\t\t\tsctp_spec->hdr.dst_port;\n-\t\t\t\t\tfilter->input.ip.v6.src_port =\n-\t\t\t\t\t\tsctp_spec->hdr.src_port;\n-\t\t\t\t}\n+\t\t\tif (sctp_mask->hdr.src_port == UINT16_MAX)\n+\t\t\t\t*input_set |= ICE_INSET_SCTP_SRC_PORT;\n+\t\t\tif (sctp_mask->hdr.dst_port == UINT16_MAX)\n+\t\t\t\t*input_set |= ICE_INSET_SCTP_DST_PORT;\n+\n+\t\t\t/* Get filter info */\n+\t\t\tif (l3 == RTE_FLOW_ITEM_TYPE_IPV4) {\n+\t\t\t\tassert(p_v4);\n+\t\t\t\tp_v4->dst_port = sctp_spec->hdr.dst_port;\n+\t\t\t\tp_v4->src_port = sctp_spec->hdr.src_port;\n+\t\t\t} else if (l3 == RTE_FLOW_ITEM_TYPE_IPV6) {\n+\t\t\t\tassert(p_v6);\n+\t\t\t\tp_v6->dst_port = sctp_spec->hdr.dst_port;\n+\t\t\t\tp_v6->src_port = sctp_spec->hdr.src_port;\n \t\t\t}\n \t\t\tbreak;\n \t\tcase RTE_FLOW_ITEM_TYPE_VOID:\n@@ -1910,6 +1906,7 @@ ice_fdir_parse_pattern(__rte_unused struct ice_adapter *ad,\n \t\t\tl3 = RTE_FLOW_ITEM_TYPE_END;\n \t\t\tvxlan_spec = item->spec;\n \t\t\tvxlan_mask = item->mask;\n+\t\t\tis_outer = false;\n \n \t\t\tif (vxlan_spec || vxlan_mask) {\n \t\t\t\trte_flow_error_set(error, EINVAL,\n@@ -1919,50 +1916,52 @@ ice_fdir_parse_pattern(__rte_unused struct ice_adapter *ad,\n \t\t\t\treturn -rte_errno;\n \t\t\t}\n \n-\t\t\ttunnel_type = ICE_FDIR_TUNNEL_TYPE_VXLAN;\n \t\t\tbreak;\n \t\tcase RTE_FLOW_ITEM_TYPE_GTPU:\n \t\t\tl3 = RTE_FLOW_ITEM_TYPE_END;\n \t\t\tgtp_spec = item->spec;\n \t\t\tgtp_mask = item->mask;\n+\t\t\tis_outer = false;\n \n-\t\t\tif (gtp_spec && gtp_mask) {\n-\t\t\t\tif (gtp_mask->v_pt_rsv_flags ||\n-\t\t\t\t    gtp_mask->msg_type ||\n-\t\t\t\t    gtp_mask->msg_len) {\n-\t\t\t\t\trte_flow_error_set(error, EINVAL,\n+\t\t\tif (!(gtp_spec && gtp_mask))\n+\t\t\t\tbreak;\n+\n+\t\t\tif (gtp_mask->v_pt_rsv_flags ||\n+\t\t\t    gtp_mask->msg_type ||\n+\t\t\t    gtp_mask->msg_len) {\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 GTP mask\");\n-\t\t\t\t\treturn -rte_errno;\n-\t\t\t\t}\n-\n-\t\t\t\tif (gtp_mask->teid == UINT32_MAX)\n-\t\t\t\t\tinput_set |= ICE_INSET_GTPU_TEID;\n-\n-\t\t\t\tfilter->input.gtpu_data.teid = gtp_spec->teid;\n+\t\t\t\treturn -rte_errno;\n \t\t\t}\n \n-\t\t\ttunnel_type = ICE_FDIR_TUNNEL_TYPE_GTPU;\n+\t\t\t/* To align with shared code behavior, set TEID in input_set_l */\n+\t\t\tif (gtp_mask->teid == UINT32_MAX)\n+\t\t\t\tinput_set_l |= ICE_INSET_GTPU_TEID;\n+\n+\t\t\tfilter->input.gtpu_data.teid = gtp_spec->teid;\n \t\t\tbreak;\n \t\tcase RTE_FLOW_ITEM_TYPE_GTP_PSC:\n \t\t\tgtp_psc_spec = item->spec;\n \t\t\tgtp_psc_mask = item->mask;\n+\t\t\tis_outer = false;\n \n-\t\t\tif (gtp_psc_spec && gtp_psc_mask) {\n-\t\t\t\tif (gtp_psc_mask->qfi == UINT8_MAX)\n-\t\t\t\t\tinput_set |= ICE_INSET_GTPU_QFI;\n+\t\t\tif (!(gtp_psc_spec && gtp_psc_mask))\n+\t\t\t\tbreak;\n \n-\t\t\t\tfilter->input.gtpu_data.qfi =\n-\t\t\t\t\tgtp_psc_spec->qfi;\n-\t\t\t}\n-\t\t\ttunnel_type = ICE_FDIR_TUNNEL_TYPE_GTPU_EH;\n+\t\t\t/* To align with shared code behavior, set TEID in input_set_l */\n+\t\t\tif (gtp_psc_mask->qfi == UINT8_MAX)\n+\t\t\t\tinput_set_l |= ICE_INSET_GTPU_QFI;\n+\n+\t\t\tfilter->input.gtpu_data.qfi =\n+\t\t\t\tgtp_psc_spec->qfi;\n \t\t\tbreak;\n \t\tdefault:\n \t\t\trte_flow_error_set(error, EINVAL,\n-\t\t\t\t   RTE_FLOW_ERROR_TYPE_ITEM,\n-\t\t\t\t   item,\n-\t\t\t\t   \"Invalid pattern item.\");\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 pattern item.\");\n \t\t\treturn -rte_errno;\n \t\t}\n \t}\n@@ -1982,7 +1981,8 @@ ice_fdir_parse_pattern(__rte_unused struct ice_adapter *ad,\n \n \tfilter->tunnel_type = tunnel_type;\n \tfilter->input.flow_type = flow_type;\n-\tfilter->input_set = input_set;\n+\tfilter->input_set = input_set_l;\n+\tfilter->outer_input_set = input_set_f;\n \n \treturn 0;\n }\n",
    "prefixes": [
        "v2",
        "2/3"
    ]
}