get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 44456,
    "url": "https://patches.dpdk.org/api/patches/44456/?format=api",
    "web_url": "https://patches.dpdk.org/project/dpdk/patch/1536438666-22184-14-git-send-email-rasesh.mody@cavium.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": "<1536438666-22184-14-git-send-email-rasesh.mody@cavium.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/1536438666-22184-14-git-send-email-rasesh.mody@cavium.com",
    "date": "2018-09-08T20:31:02",
    "name": "[13/17] net/qede: add support for generic flow API",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "d0e7b26a0eb540f9867bcbf0819ed1af42234f13",
    "submitter": {
        "id": 569,
        "url": "https://patches.dpdk.org/api/people/569/?format=api",
        "name": "Mody, Rasesh",
        "email": "rasesh.mody@cavium.com"
    },
    "delegate": {
        "id": 319,
        "url": "https://patches.dpdk.org/api/users/319/?format=api",
        "username": "fyigit",
        "first_name": "Ferruh",
        "last_name": "Yigit",
        "email": "ferruh.yigit@amd.com"
    },
    "mbox": "https://patches.dpdk.org/project/dpdk/patch/1536438666-22184-14-git-send-email-rasesh.mody@cavium.com/mbox/",
    "series": [
        {
            "id": 1239,
            "url": "https://patches.dpdk.org/api/series/1239/?format=api",
            "web_url": "https://patches.dpdk.org/project/dpdk/list/?series=1239",
            "date": "2018-09-08T20:30:49",
            "name": "net/qede: add enhancements and fixes",
            "version": 1,
            "mbox": "https://patches.dpdk.org/series/1239/mbox/"
        }
    ],
    "comments": "https://patches.dpdk.org/api/patches/44456/comments/",
    "check": "warning",
    "checks": "https://patches.dpdk.org/api/patches/44456/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 839675F57;\n\tSat,  8 Sep 2018 22:32:10 +0200 (CEST)",
            "from NAM04-BN3-obe.outbound.protection.outlook.com\n\t(mail-eopbgr680074.outbound.protection.outlook.com [40.107.68.74])\n\tby dpdk.org (Postfix) with ESMTP id 6258A5681\n\tfor <dev@dpdk.org>; Sat,  8 Sep 2018 22:31:56 +0200 (CEST)",
            "from cavium.com (198.186.1.5) by\n\tDM6PR07MB5372.namprd07.prod.outlook.com (2603:10b6:5:44::17) with\n\tMicrosoft SMTP Server (version=TLS1_2,\n\tcipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id\n\t15.20.1101.18; Sat, 8 Sep 2018 20:31:54 +0000"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=CAVIUMNETWORKS.onmicrosoft.com; s=selector1-cavium-com;\n\th=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck;\n\tbh=vYOLyNq7fnv0qc3KYghC6ZIpETLtroQCqajsKv3ZYWA=;\n\tb=JVSs9UNHdABYANxhsXPd3mdjiLI+ikLCmZQLesevLNaNe9dhX4M475nTS+MHor0apEfrPMJLqNTrbXEdAl3bYbxXChMZSTFNMu0YeQc9IlrQ0W7gDJCjbTPggIm+b77uP7YUj3eIGHSw7pOlOac1adSnBpktiP8iXVRwqdnFzeA=",
        "Authentication-Results": "spf=none (sender IP is )\n\tsmtp.mailfrom=Rasesh.Mody@cavium.com; ",
        "From": "Rasesh Mody <rasesh.mody@cavium.com>",
        "To": "dev@dpdk.org",
        "Cc": "Shahed Shaikh <shahed.shaikh@cavium.com>, ferruh.yigit@intel.com,\n\tDept-EngDPDKDev@cavium.com",
        "Date": "Sat,  8 Sep 2018 13:31:02 -0700",
        "Message-Id": "<1536438666-22184-14-git-send-email-rasesh.mody@cavium.com>",
        "X-Mailer": "git-send-email 1.7.10.3",
        "In-Reply-To": "<1536438666-22184-1-git-send-email-rasesh.mody@cavium.com>",
        "References": "<1536438666-22184-1-git-send-email-rasesh.mody@cavium.com>",
        "MIME-Version": "1.0",
        "Content-Type": "text/plain",
        "X-Originating-IP": "[198.186.1.5]",
        "X-ClientProxiedBy": "BYAPR02CA0031.namprd02.prod.outlook.com\n\t(2603:10b6:a02:ee::44) To DM6PR07MB5372.namprd07.prod.outlook.com\n\t(2603:10b6:5:44::17)",
        "X-MS-PublicTrafficType": "Email",
        "X-MS-Office365-Filtering-Correlation-Id": "8573ffb0-aeb7-411e-dd04-08d615ca1df5",
        "X-Microsoft-Antispam": "BCL:0; PCL:0;\n\tRULEID:(7020095)(4652040)(8989137)(4534165)(4627221)(201703031133081)(201702281549075)(8990107)(5600074)(711020)(2017052603328)(7153060)(7193020);\n\tSRVR:DM6PR07MB5372; ",
        "X-Microsoft-Exchange-Diagnostics": [
            "1; DM6PR07MB5372;\n\t3:eDLjoXW02ANKSYu2sZIYaLBxo3Oh8eQpVwoWYpl24m2D+VFZ4TzCKd+DnVlIJoYMIeqIHNb09c0cig0JpH9ScPqVZeDls/AI0fNUJFD5VWFGX+6/cJQau0bQAB6Hh2CmIyE/6CKj9NQB8bWqOrwJ86Ng3kSFP9vjD1FZIvQNnpG8dEsVeO2/uh2nNcSD4OoyroFeBrl/aqkdcOUjO93pExNJZqUBT2OCQKyjOVkezZyJcce8e9/QZUnb+BXdqz+H;\n\t25:02E18aTfbh64ZI+x67s8BvOgwR47VyxJ88j1aPBgWoBj2Hm3ujKEO530b4cx0rdgcbiKBjVx8+51ppzbptIOOhtMSTUDQ1hp31yRXUuuEdSklaIRlv4e9bHSASSYLLLVUe8UV8K/k9PBg+PbwIROvBnGMBQD56PCJSGacIy0s9GgOZjiGQrt7xGkZ/OI5o7MTTp+Y6FRWx27a7XUVX7gucT0IYVJKsnTqs5cWWi7J54TiDKA74Iz/xBEMRzCaTbvUIVRy06/V6cnMQmcA9PIjPqKrky6UAnsGXfnj/PzXbcmqRMdjieF+hDHYlPvQGcO448Stsfl6gEu49xfXrTY+g==;\n\t31:U0AV84O05CEiv/QwBZzacbWIW/zwlOpTB2ySaEtlzBiwMZTefx6bwe92rJ0gLSDI5xzENqRtHu+Tsk3FOdM9Edn7c+ulssXPZvIsqOKirSzea2s1q42t4XpWwMO1C8xRIjMHFaUN8OinDEjDSuDfLyXAhZQHMn0/IQENu0N43WmhWE6JpxLDXqwGpuP0lN2ZPThbYYLI3o6vkKfhbS43yzWtZSu9N+RHSVvALFsXw/g=",
            "1; DM6PR07MB5372;\n\t20:L3WMfcb9q+rOp6A86QU+snJwLWPjhHy6oGzw9+cAR6nvJcpyJXV2TlQJLBYSA9aeRe48JfIeysllibMbUzskjRmIGwatPO1HPyxr3WIa7Z7MuLqyIWDv5GGCAoglIldODFKF9VcHM30hCSWEtg/z4qEHBjolthc5/RDMIH6025oyGFfThL2OXrTkQboeBZCPt0oRM6K0gxh7q5nvSU8FRpWmZgrHmtGeBrxU+9OGHSELAihA2J6XlMrl4R0/vAFNO6jTVTJxU1HxS0LjVogkp9/CbirqyQ0m0bIIa93C3som5Y/oxgjA447+0PGZ1fJuEtyuxDdviuEQ11vbJS7jLxIMSf88VwZwu4/b0gpx0AM+PAI4FOYXE2PKvo+A6FKnTsVBKIheSg5f1A1biVKELaZxel4rT86Dgsa7cOaM2NeJvmJH4CGozYuoJang+yb6U3YpqglaLMwoqaSRzXMg0gshwhA7GnSF/FKAcKhXYn+dHkhQ69ksmGyr88GFsJZe;\n\t4:Zznkmjki+v6mxbet/gR2zjmE7tFPbjyygYxpqBa22kdFquHNbx/ZIYHm+b+1PuRfzOGZWcVL8idIxIty4MwvufOPthQ/dzhI6dyYcR1OGEb95Mx7ZBxvDh/hXoG+/UOoFkg5RsTJEz5NKwVBf3GKgGgCD0ZQ7Nh4VU1pqeDehOMNogn6oOXB9VKUw4XAmcSDW8H44KaqpDW12x4O6NOSXyRo6DV4QN+/nYMac9gx+9shXrzQmRKTxU/Jymc87SF2qu6KzDCbmZBz1QLR/GnS9Q==",
            "=?us-ascii?Q?1; DM6PR07MB5372;\n\t23:6YWVss/oX8L3SxvVrQsNDQXyWNMSlvujU9sr3MFYl?=\n\tM8bvt0PrSKYnMirDGDVP0610czWxZYNFK9wrDcd++CrQZD36MND38Tz7/zYW88kaec/l7W6sUdJfElvfzpmxgJLKexV+aFRF1HIT+49XjqKtzBKXAkmQ1q8JHDcm2F/VQLPQ5S66CmmEyv/CgjVIv29GHOAu2zV84JX1dnB9X9ZcTpiv2rIGZJqSQv7IFZdrmoChbJGQvHdhLT34kr2UGjBBjBSKnw6033LEKemxJy6s6SNBjF7fGt0CZ4KTOafmbaS2U8yMtwS0u8+AkYWx0a/QYcw/QFFS8x5DzENBftP51BzPOXroqkPMaPhXZFMt7nl7R/+Yw1TIW9bL3zS/YpBlmJPtWwJsQYtyivvUXVzatINviyF6dVB82Vjkf+PRbyW2CU+pDE+G+JyDALXPGMdTZZRjmgtQGrwlTnrMRA9uqL4667anx2IIawn/mcfQWqEhO+D48r1JLp0l3J5Znq4P6dJlQcXHjAy3sPxGIProQscp6qZpM96B9iezWx44mhPoiMmu0gM3cmjl934mNnrYcjifGAcBA6g0Gcakcx1VSqiymBrdG2EI0LCPd4rP1iaN+J8aDznhJ8exVdnTPwHrXPZmwI7SZZOTxAf+2Bo811qxOEslIU22Hir9yOaRrKt94wl/3BAM2tgLIfX3ZhTLrvKHGouayOsiVLdeUSTWtzi+DTIpoudOKSwKvlR+nbbCnq3E1hSuYtyXaHYyvXc5RVlGrwCzTsvYBdBS/oLcBr9ldxRsLgsw6x3mL2f3/4eb+pFfUpHzjb8ac3KabC6YNk2DJxa3HllJ+sQ1P4PlqcuFE7qK0yaW8PDQiNGCm5gWhxJCipk0AROvMFzlnc9v29oHbferz4zuvVukjdLXZE+QYIdfRNOndlbA7LyA2Wsif4hbqDc1Yi6LVhYErUZ1spiXZQpcFA8t0uoqp7Nd86ItSettiLejqUOJqRoX7seEDyXxEaNdyXbIeQA72SEpnc+r7mlHw5O8LsdSKsIgHbxlzBuW+YnoIn5fuvw4HwV4bMzrL1GmueqoEErTlzazqVcmJFSSvum8O8gezgYDEleCuD8ACosa6oeqf3lnf4daDxPdTQdZJX9n7tUOaV5jQZcx6UoGbpa+uzlJWPIkJPXbleUVlOHWtKvLpW21oZwVj4rvg7FaK4GAxyPGO66nImX6E9NNSInOGbTD53I249OB/ghOSJr1ZLGS6cgkah1mxPcbnefgqGl4bmfBdpN+w0JrBIMTgcJB1ovNYjEr+U0ybvsUYryxhFSjeh3hhBB+oZNuYnSktmlGGZzW+ehr+KCg/GSzIiIUXmBHFgumUQyRE+uAMO+GOhHv4E5qN8=",
            "1; DM6PR07MB5372;\n\t6:s+S7sG52+c/sHPq+f7mEWTDNhg5MU2ns4236xYrD4EyU5LDZNfKnfXDtXyhe9ag+MjuwG4XXrKvBFEW4DTkLbpmy4ZAT/5ER9Oc70oH05Cgpw2MhYDrqJXmi397hD6fKHtejiHEkWC+tWo6cOD5Jb5WQ2MiGNAf+uVaKPKzgqThTfWj4WcOxMkGTJQTQkBaJLAgikLnf25Hwx0wcwbEWfXhr02d3vkk9s0dmUiJB28Z4AomulYtxvQ54sZL4qSD+vzLOKtnpoFADVYkLcI5VhG3eAODdUnhuGc2RePw8KtGoh5j+CDhFaGbF2LDuObwDKQ7uxpvfaRQKsLWUTLxVAX8i0qPDXRJ1kbZO43FJSoFUcmoN7PO2K+8fW3a3K2CoyAMLJsiELvWmQHVJ6aNMECSL/ohZoA6NgI+KCR3Cm8bumZwnUUuXFy2aHYlyZe1sgGKiuzqV6mUHfwCdPTMtRw==;\n\t5:BwbRGD0oZ+Im+XjFqcK2pCOKsaLB/FuRtbvpx/QQ6DNLCdBWQujguFa7rYI7J5IM3T5G/P33WBO1hIrl8yhtrOypw/WoyfqjQTeq98iElJQXCwIXSNvBmplXsxO1gjkRWYdbqC0d3MzR0G4uFGGsNs6eCEEfS0TBzF7yJwI3/eo=;\n\t7:A23LLI0CbocNKj5IaHpZJajVOHr+KqQ5tDQoQfM9NEfekn8fX4wi62UBRIUC+aFBOC63bFeh7RbMVMOlQIpeuX+gkhHIPdrZnc6gZeP5iEYqoEeYY+mWzS6+Eb1gHNeCGby/RWsYgfeD8orvEql3Q/lIHJs347KzzQ4vMVCVs1HuoCtZltMG39z0F1QzqQKeewn+U/yixD4xmFy5flu/6TxgTleDNalxj/vKIt0ZQwXHxKBiUcEWiTczOIoRyhzd"
        ],
        "X-MS-TrafficTypeDiagnostic": "DM6PR07MB5372:",
        "X-Microsoft-Antispam-PRVS": "<DM6PR07MB5372A054D7E65146A7BE2E279F070@DM6PR07MB5372.namprd07.prod.outlook.com>",
        "X-Exchange-Antispam-Report-Test": "UriScan:;",
        "X-MS-Exchange-SenderADCheck": "1",
        "X-Exchange-Antispam-Report-CFA-Test": "BCL:0; PCL:0;\n\tRULEID:(8211001083)(6040522)(2401047)(5005006)(8121501046)(823301075)(3002001)(10201501046)(3231311)(944501410)(52105095)(93006095)(93001095)(149027)(150027)(6041310)(20161123562045)(20161123564045)(20161123558120)(20161123560045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(201708071742011)(7699050);\n\tSRVR:DM6PR07MB5372; BCL:0; PCL:0; RULEID:; SRVR:DM6PR07MB5372; ",
        "X-Forefront-PRVS": "07891BF289",
        "X-Forefront-Antispam-Report": "SFV:NSPM;\n\tSFS:(10009020)(396003)(366004)(136003)(346002)(376002)(39860400002)(199004)(189003)(51234002)(4720700003)(97736004)(2351001)(106356001)(105586002)(72206003)(66066001)(47776003)(4326008)(50466002)(48376002)(25786009)(305945005)(7736002)(2361001)(8676002)(478600001)(316002)(52116002)(69596002)(107886003)(186003)(50226002)(44832011)(16526019)(486006)(21086003)(2906002)(55016002)(26005)(8936002)(476003)(956004)(81156014)(81166006)(86362001)(5660300001)(6666003)(36756003)(16586007)(11346002)(446003)(2616005)(76176011)(3846002)(6116002)(6916009)(68736007)(14444005)(386003)(51416003)(53936002)(7696005)(41533002);\n\tDIR:OUT; SFP:1101; SCL:1; SRVR:DM6PR07MB5372; H:cavium.com; FPR:;\n\tSPF:None; \n\tLANG:en; PTR:InfoNoRecords; A:1; MX:1; ",
        "Received-SPF": "None (protection.outlook.com: cavium.com does not designate\n\tpermitted sender hosts)",
        "X-Microsoft-Antispam-Message-Info": "DCQ6v/EsTHGtBPSlZnTflE8Y+cJJLsplHsU0eVa9WlSUnLZR89xUwpF2JqSjh1zq4rG3rkuNi0Gki1ky/+Iz2zmBVFS5bu9AnSgXXW/bjjyRo+ecrjafzpl2S6VMHk8Kry/+kgYlhzI6kB7WV4KdgFlQK3jXbacOcfj/zDRPEDYIit4wZ3fM7ELSrS+72Fpt60bcKBp5+SCb+OoZYmJV6lnaTZKsnxQyCWFBKWJGjyXAMcaCSmiFn0A8b5HdaxUUU2Vcv/duGdRHLKjvC4uYzwaq2oefMaOYgaF268FC/9SmoylfTBG0e/gSmmhXI1pGZXHKZI343oTFR2LE1JKR4Edx3sNOU19lU5kDnxevI6E=",
        "SpamDiagnosticOutput": "1:99",
        "SpamDiagnosticMetadata": "NSPM",
        "X-OriginatorOrg": "cavium.com",
        "X-MS-Exchange-CrossTenant-OriginalArrivalTime": "08 Sep 2018 20:31:54.6608\n\t(UTC)",
        "X-MS-Exchange-CrossTenant-Network-Message-Id": "8573ffb0-aeb7-411e-dd04-08d615ca1df5",
        "X-MS-Exchange-CrossTenant-FromEntityHeader": "Hosted",
        "X-MS-Exchange-CrossTenant-Id": "711e4ccf-2e9b-4bcf-a551-4094005b6194",
        "X-MS-Exchange-Transport-CrossTenantHeadersStamped": "DM6PR07MB5372",
        "Subject": "[dpdk-dev] [PATCH 13/17] net/qede: add support for generic flow API",
        "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": "From: Shahed Shaikh <shahed.shaikh@cavium.com>\n\n- Add support for rte_flow_validate(), rte_flow_create() and\n  rte_flow_destroy() APIs\n- This patch adds limited support for the flow items\n  because of the limited filter profiles supported by HW.\n- Only 4 tuples - src and dst IP (v4 or v6) addresses and\n\t\t  src and dst port IDs of TCP or UDP.\n- also, only redirect to queue action is supported.\n\nSigned-off-by: Shahed Shaikh <shahed.shaikh@cavium.com>\n---\n drivers/net/qede/qede_ethdev.h |    5 +\n drivers/net/qede/qede_filter.c |  334 +++++++++++++++++++++++++++++++++++++++-\n 2 files changed, 338 insertions(+), 1 deletion(-)",
    "diff": "diff --git a/drivers/net/qede/qede_ethdev.h b/drivers/net/qede/qede_ethdev.h\nindex 59828f8..8a9df98 100644\n--- a/drivers/net/qede/qede_ethdev.h\n+++ b/drivers/net/qede/qede_ethdev.h\n@@ -184,6 +184,11 @@ struct qede_arfs_entry {\n \tSLIST_ENTRY(qede_arfs_entry) list;\n };\n \n+/* Opaque handle for rte flow managed by PMD */\n+struct rte_flow {\n+\tstruct qede_arfs_entry entry;\n+};\n+\n struct qede_arfs_info {\n \tstruct ecore_arfs_config_params arfs;\n \tuint16_t filter_count;\ndiff --git a/drivers/net/qede/qede_filter.c b/drivers/net/qede/qede_filter.c\nindex bdf2885..5e6571c 100644\n--- a/drivers/net/qede/qede_filter.c\n+++ b/drivers/net/qede/qede_filter.c\n@@ -8,6 +8,7 @@\n #include <rte_tcp.h>\n #include <rte_sctp.h>\n #include <rte_errno.h>\n+#include <rte_flow_driver.h>\n \n #include \"qede_ethdev.h\"\n \n@@ -1159,6 +1160,327 @@ static void qede_get_ecore_tunn_params(uint32_t filter, uint32_t *type,\n \treturn 0;\n }\n \n+static int\n+qede_flow_validate_attr(__attribute__((unused))struct rte_eth_dev *dev,\n+\t\t\tconst struct rte_flow_attr *attr,\n+\t\t\tstruct rte_flow_error *error)\n+{\n+\tif (attr == NULL) {\n+\t\trte_flow_error_set(error, EINVAL,\n+\t\t\t\t   RTE_FLOW_ERROR_TYPE_ATTR, NULL,\n+\t\t\t\t   \"NULL attribute\");\n+\t\treturn -rte_errno;\n+\t}\n+\n+\tif (attr->group != 0) {\n+\t\trte_flow_error_set(error, ENOTSUP,\n+\t\t\t\t   RTE_FLOW_ERROR_TYPE_ATTR_GROUP, attr,\n+\t\t\t\t   \"Groups are not supported\");\n+\t\treturn -rte_errno;\n+\t}\n+\n+\tif (attr->priority != 0) {\n+\t\trte_flow_error_set(error, ENOTSUP,\n+\t\t\t\t   RTE_FLOW_ERROR_TYPE_ATTR_PRIORITY, attr,\n+\t\t\t\t   \"Priorities are not supported\");\n+\t\treturn -rte_errno;\n+\t}\n+\n+\tif (attr->egress != 0) {\n+\t\trte_flow_error_set(error, ENOTSUP,\n+\t\t\t\t   RTE_FLOW_ERROR_TYPE_ATTR_EGRESS, attr,\n+\t\t\t\t   \"Egress is not supported\");\n+\t\treturn -rte_errno;\n+\t}\n+\n+\tif (attr->transfer != 0) {\n+\t\trte_flow_error_set(error, ENOTSUP,\n+\t\t\t\t   RTE_FLOW_ERROR_TYPE_ATTR_TRANSFER, attr,\n+\t\t\t\t   \"Transfer is not supported\");\n+\t\treturn -rte_errno;\n+\t}\n+\n+\tif (attr->ingress == 0) {\n+\t\trte_flow_error_set(error, ENOTSUP,\n+\t\t\t\t   RTE_FLOW_ERROR_TYPE_ATTR_INGRESS, attr,\n+\t\t\t\t   \"Only ingress is supported\");\n+\t\treturn -rte_errno;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+qede_flow_parse_pattern(__attribute__((unused))struct rte_eth_dev *dev,\n+\t\t\tconst struct rte_flow_item pattern[],\n+\t\t\tstruct rte_flow_error *error,\n+\t\t\tstruct rte_flow *flow)\n+{\n+\tbool l3 = false, l4 = false;\n+\n+\tif (pattern == NULL) {\n+\t\trte_flow_error_set(error, EINVAL,\n+\t\t\t\t   RTE_FLOW_ERROR_TYPE_ITEM_NUM, NULL,\n+\t\t\t\t   \"NULL pattern\");\n+\t\treturn -rte_errno;\n+\t}\n+\n+\tfor (; pattern->type != RTE_FLOW_ITEM_TYPE_END; pattern++) {\n+\t\tif (!pattern->spec) {\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   pattern,\n+\t\t\t\t\t   \"Item spec not defined\");\n+\t\t\treturn -rte_errno;\n+\t\t}\n+\n+\t\tif (pattern->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   pattern,\n+\t\t\t\t\t   \"Item last not supported\");\n+\t\t\treturn -rte_errno;\n+\t\t}\n+\n+\t\tif (pattern->mask) {\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   pattern,\n+\t\t\t\t\t   \"Item mask not supported\");\n+\t\t\treturn -rte_errno;\n+\t\t}\n+\n+\t\t/* Below validation is only for 4 tuple flow\n+\t\t * (GFT_PROFILE_TYPE_4_TUPLE)\n+\t\t * - src and dst L3 address (IPv4 or IPv6)\n+\t\t * - src and dst L4 port (TCP or UDP)\n+\t\t */\n+\n+\t\tswitch (pattern->type) {\n+\t\tcase RTE_FLOW_ITEM_TYPE_IPV4:\n+\t\t\tl3 = true;\n+\n+\t\t\tif (flow) {\n+\t\t\t\tconst struct rte_flow_item_ipv4 *spec;\n+\n+\t\t\t\tspec = pattern->spec;\n+\t\t\t\tflow->entry.tuple.src_ipv4 = spec->hdr.src_addr;\n+\t\t\t\tflow->entry.tuple.dst_ipv4 = spec->hdr.dst_addr;\n+\t\t\t\tflow->entry.tuple.eth_proto = ETHER_TYPE_IPv4;\n+\t\t\t}\n+\t\t\tbreak;\n+\n+\t\tcase RTE_FLOW_ITEM_TYPE_IPV6:\n+\t\t\tl3 = true;\n+\n+\t\t\tif (flow) {\n+\t\t\t\tconst struct rte_flow_item_ipv6 *spec;\n+\n+\t\t\t\tspec = pattern->spec;\n+\t\t\t\trte_memcpy(flow->entry.tuple.src_ipv6,\n+\t\t\t\t\t   spec->hdr.src_addr,\n+\t\t\t\t\t   IPV6_ADDR_LEN);\n+\t\t\t\trte_memcpy(flow->entry.tuple.dst_ipv6,\n+\t\t\t\t\t   spec->hdr.dst_addr,\n+\t\t\t\t\t   IPV6_ADDR_LEN);\n+\t\t\t\tflow->entry.tuple.eth_proto = ETHER_TYPE_IPv6;\n+\t\t\t}\n+\t\t\tbreak;\n+\n+\t\tcase RTE_FLOW_ITEM_TYPE_UDP:\n+\t\t\tl4 = true;\n+\n+\t\t\tif (flow) {\n+\t\t\t\tconst struct rte_flow_item_udp *spec;\n+\n+\t\t\t\tspec = pattern->spec;\n+\t\t\t\tflow->entry.tuple.src_port =\n+\t\t\t\t\t\tspec->hdr.src_port;\n+\t\t\t\tflow->entry.tuple.dst_port =\n+\t\t\t\t\t\tspec->hdr.dst_port;\n+\t\t\t\tflow->entry.tuple.ip_proto = IPPROTO_UDP;\n+\t\t\t}\n+\t\t\tbreak;\n+\n+\t\tcase RTE_FLOW_ITEM_TYPE_TCP:\n+\t\t\tl4 = true;\n+\n+\t\t\tif (flow) {\n+\t\t\t\tconst struct rte_flow_item_tcp *spec;\n+\n+\t\t\t\tspec = pattern->spec;\n+\t\t\t\tflow->entry.tuple.src_port =\n+\t\t\t\t\t\tspec->hdr.src_port;\n+\t\t\t\tflow->entry.tuple.dst_port =\n+\t\t\t\t\t\tspec->hdr.dst_port;\n+\t\t\t\tflow->entry.tuple.ip_proto = IPPROTO_TCP;\n+\t\t\t}\n+\n+\t\t\tbreak;\n+\t\tdefault:\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   pattern,\n+\t\t\t\t\t   \"Only 4 tuple (IPV4, IPV6, UDP and TCP) item types supported\");\n+\t\t\treturn -rte_errno;\n+\t\t}\n+\t}\n+\n+\tif (!(l3 && l4)) {\n+\t\trte_flow_error_set(error, EINVAL,\n+\t\t\t\t   RTE_FLOW_ERROR_TYPE_ITEM,\n+\t\t\t\t   pattern,\n+\t\t\t\t   \"Item types need to have both L3 and L4 protocols\");\n+\t\treturn -rte_errno;\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+qede_flow_parse_actions(struct rte_eth_dev *dev,\n+\t\t\tconst struct rte_flow_action actions[],\n+\t\t\tstruct rte_flow_error *error,\n+\t\t\tstruct rte_flow *flow)\n+{\n+\tstruct qede_dev *qdev = QEDE_INIT_QDEV(dev);\n+\tconst struct rte_flow_action_queue *queue;\n+\n+\tif (actions == NULL) {\n+\t\trte_flow_error_set(error, EINVAL,\n+\t\t\t\t   RTE_FLOW_ERROR_TYPE_ACTION_NUM, NULL,\n+\t\t\t\t   \"NULL actions\");\n+\t\treturn -rte_errno;\n+\t}\n+\n+\tfor (; actions->type != RTE_FLOW_ACTION_TYPE_END; actions++) {\n+\t\tswitch (actions->type) {\n+\t\tcase RTE_FLOW_ACTION_TYPE_QUEUE:\n+\t\t\tqueue = actions->conf;\n+\n+\t\t\tif (queue->index >= QEDE_RSS_COUNT(qdev)) {\n+\t\t\t\trte_flow_error_set(error, EINVAL,\n+\t\t\t\t\t\t   RTE_FLOW_ERROR_TYPE_ACTION,\n+\t\t\t\t\t\t   actions,\n+\t\t\t\t\t\t   \"Bad QUEUE action\");\n+\t\t\t\treturn -rte_errno;\n+\t\t\t}\n+\n+\t\t\tif (flow)\n+\t\t\t\tflow->entry.rx_queue = queue->index;\n+\n+\t\t\tbreak;\n+\n+\t\tdefault:\n+\t\t\trte_flow_error_set(error, ENOTSUP,\n+\t\t\t\t\t   RTE_FLOW_ERROR_TYPE_ACTION,\n+\t\t\t\t\t   actions,\n+\t\t\t\t\t   \"Action is not supported - only ACTION_TYPE_QUEUE supported\");\n+\t\t\treturn -rte_errno;\n+\t\t}\n+\t}\n+\n+\treturn 0;\n+}\n+\n+static int\n+qede_flow_parse(struct rte_eth_dev *dev,\n+\t\tconst struct rte_flow_attr *attr,\n+\t\tconst struct rte_flow_item patterns[],\n+\t\tconst struct rte_flow_action actions[],\n+\t\tstruct rte_flow_error *error,\n+\t\tstruct rte_flow *flow)\n+\n+{\n+\tint rc = 0;\n+\n+\trc = qede_flow_validate_attr(dev, attr, error);\n+\tif (rc)\n+\t\treturn rc;\n+\n+\t/* parse and validate item pattern and actions.\n+\t * Given item list and actions will be translate to qede PMD\n+\t * specific arfs structure.\n+\t */\n+\trc = qede_flow_parse_pattern(dev, patterns, error, flow);\n+\tif (rc)\n+\t\treturn rc;\n+\n+\trc = qede_flow_parse_actions(dev, actions, error, flow);\n+\n+\treturn rc;\n+}\n+\n+static int\n+qede_flow_validate(struct rte_eth_dev *dev,\n+\t\t   const struct rte_flow_attr *attr,\n+\t\t   const struct rte_flow_item patterns[],\n+\t\t   const struct rte_flow_action actions[],\n+\t\t   struct rte_flow_error *error)\n+{\n+\treturn qede_flow_parse(dev, attr, patterns, actions, error, NULL);\n+}\n+\n+static struct rte_flow *\n+qede_flow_create(struct rte_eth_dev *dev,\n+\t\t const struct rte_flow_attr *attr,\n+\t\t const struct rte_flow_item pattern[],\n+\t\t const struct rte_flow_action actions[],\n+\t\t struct rte_flow_error *error)\n+{\n+\tstruct rte_flow *flow = NULL;\n+\tint rc;\n+\n+\tflow = rte_zmalloc(\"qede_rte_flow\", sizeof(*flow), 0);\n+\tif (flow == NULL) {\n+\t\trte_flow_error_set(error, ENOMEM,\n+\t\t\t\t   RTE_FLOW_ERROR_TYPE_UNSPECIFIED, NULL,\n+\t\t\t\t   \"Failed to allocate memory\");\n+\t\treturn NULL;\n+\t}\n+\n+\trc = qede_flow_parse(dev, attr, pattern, actions, error, flow);\n+\tif (rc < 0) {\n+\t\trte_free(flow);\n+\t\treturn NULL;\n+\t}\n+\n+\trc = qede_config_arfs_filter(dev, &flow->entry, true);\n+\tif (rc < 0) {\n+\t\trte_flow_error_set(error, rc,\n+\t\t\t\t   RTE_FLOW_ERROR_TYPE_HANDLE, NULL,\n+\t\t\t\t   \"Failed to configure flow filter\");\n+\t\trte_free(flow);\n+\t\treturn NULL;\n+\t}\n+\n+\treturn flow;\n+}\n+\n+static int\n+qede_flow_destroy(struct rte_eth_dev *eth_dev,\n+\t\t  struct rte_flow *flow,\n+\t\t  struct rte_flow_error *error)\n+{\n+\tint rc = 0;\n+\n+\trc = qede_config_arfs_filter(eth_dev, &flow->entry, false);\n+\tif (rc < 0) {\n+\t\trte_flow_error_set(error, rc,\n+\t\t\t\t   RTE_FLOW_ERROR_TYPE_HANDLE, NULL,\n+\t\t\t\t   \"Failed to delete flow filter\");\n+\t\trte_free(flow);\n+\t}\n+\n+\treturn rc;\n+}\n+\n+const struct rte_flow_ops qede_flow_ops = {\n+\t.validate = qede_flow_validate,\n+\t.create = qede_flow_create,\n+\t.destroy = qede_flow_destroy,\n+};\n+\n int qede_dev_filter_ctrl(struct rte_eth_dev *eth_dev,\n \t\t\t enum rte_filter_type filter_type,\n \t\t\t enum rte_filter_op filter_op,\n@@ -1195,6 +1517,17 @@ int qede_dev_filter_ctrl(struct rte_eth_dev *eth_dev,\n \t\treturn qede_fdir_filter_conf(eth_dev, filter_op, arg);\n \tcase RTE_ETH_FILTER_NTUPLE:\n \t\treturn qede_ntuple_filter_conf(eth_dev, filter_op, arg);\n+\tcase RTE_ETH_FILTER_GENERIC:\n+\t\tif (ECORE_IS_CMT(edev)) {\n+\t\t\tDP_ERR(edev, \"flowdir is not supported in 100G mode\\n\");\n+\t\t\treturn -ENOTSUP;\n+\t\t}\n+\n+\t\tif (filter_op != RTE_ETH_FILTER_GET)\n+\t\t\treturn -EINVAL;\n+\n+\t\t*(const void **)arg = &qede_flow_ops;\n+\t\treturn 0;\n \tcase RTE_ETH_FILTER_MACVLAN:\n \tcase RTE_ETH_FILTER_ETHERTYPE:\n \tcase RTE_ETH_FILTER_FLEXIBLE:\n@@ -1211,4 +1544,3 @@ int qede_dev_filter_ctrl(struct rte_eth_dev *eth_dev,\n \treturn 0;\n }\n \n-/* RTE_FLOW */\n",
    "prefixes": [
        "13/17"
    ]
}