get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 41727,
    "url": "http://patches.dpdk.org/api/patches/41727/?format=api",
    "web_url": "http://patches.dpdk.org/project/dpdk/patch/20180627173355.4718-7-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-7-adrien.mazarguil@6wind.com>",
    "list_archive_url": "https://inbox.dpdk.org/dev/20180627173355.4718-7-adrien.mazarguil@6wind.com",
    "date": "2018-06-27T18:08:20",
    "name": "[6/6] net/mlx5: add port ID pattern item to switch flow rules",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "10989b73c2832703edc2bd9ef19e8189fd3be3e9",
    "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-7-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/41727/comments/",
    "check": "fail",
    "checks": "http://patches.dpdk.org/api/patches/41727/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 8132D1C3B3;\n\tWed, 27 Jun 2018 20:08:41 +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 8C8991C3A9\n\tfor <dev@dpdk.org>; Wed, 27 Jun 2018 20:08:37 +0200 (CEST)",
            "by mail-wr0-f196.google.com with SMTP id h10-v6so2938493wrq.8\n\tfor <dev@dpdk.org>; Wed, 27 Jun 2018 11:08:37 -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\t132-v6sm8585086wmr.33.2018.06.27.11.08.36\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);\n\tWed, 27 Jun 2018 11:08:36 -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=xCuhasRte+d2yL53R27rf/D9tYfbWjgCZ9wuVC8rtkQ=;\n\tb=CX0oxoXyeiolrzaosWfX2H3/Mi3gFI6CTj78qeSA6EBzxbLjdJNDqwm9VJpQUNi2W4\n\tovh/3n5qn6XobZ15LwTKMdIlOLmL6zjlOlLJKm0CUo00UUzsQHxzc16yiVx6K0fhwuEZ\n\tGyf0+hnlgDsfo3mjbN76qB3sflLK3iaTpQ27wRcWhPMKExhapiV0uyYbb4kYi6M9bBYB\n\tUBA0vKIHCVgFfYNXBmKAzu+xZxFm2sUFv5GFxtjmhTKWDdZxG94QC/GwriQ2vPMl4eGX\n\tZK7wvpbF/5oCfL1dYOSsUfXlRBDY1aae+kL2UX9LWnfvnb2+CTd+LZdjcS8OhXGzNHFj\n\tWK8Q==",
        "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=xCuhasRte+d2yL53R27rf/D9tYfbWjgCZ9wuVC8rtkQ=;\n\tb=UbT1QMT9ik/7TTXRyurWnMIrANjl7aMNew7bmaAzr4+6DGDbaMgIn/4fw6YvsTf48v\n\tDEzZXnHeGj9HwkRElUDpR2MbritBSLK71vuF4cRyPlNuQ8PgpwXi2z/PUTU3IuCeYZay\n\t1PSEuyUxMkm5b6yETVpV/RtYvqDWUi6F6YkeiTkM/K9Ldi9hjpDoX9Brj66LZAu/7gEU\n\t5Vf3QyJuCLHJZW08dU9NwVsll7ZVU0L9IPoIFk60FanlCM9tsM+UniVXff1py7uMGfQT\n\tFAGJ7zcPd6E5B7e2EmL2hK512Rj+3XAAHekmadogiMEV2yOn/aN6ZQuf4FUbiV13FRLh\n\tMrAg==",
        "X-Gm-Message-State": "APt69E28BxMRCWACKfl6NejXxVGbenjbnAj/V/X9La6dQ1VF6QBafWF5\n\thNvAvzPGGSVRoWPSDISq91QCyu/p",
        "X-Google-Smtp-Source": "AAOMgpdj/lCn4YSy/K9g3K2OJuaijFc5KhMr+6XuooiEaPJCPD9g8G8cTEMj8F/I+QjcL/g/pr86Aw==",
        "X-Received": "by 2002:adf:bbc9:: with SMTP id\n\tz9-v6mr5680604wrg.183.1530122917296; \n\tWed, 27 Jun 2018 11:08:37 -0700 (PDT)",
        "Date": "Wed, 27 Jun 2018 20:08:20 +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-7-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 6/6] net/mlx5: add port ID pattern item to switch\n\tflow 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 match traffic coming from a different DPDK port\nID associated with the device (PORT_ID pattern item), mainly for the\nconvenience of applications that want to deal with a single port ID for all\nflow rules associated with some physical device.\n\nTestpmd example:\n\n- Creating a flow rule on port ID 1 to consume all traffic from port ID 0\n  and direct it to port ID 2:\n\n  flow create 1 ingress transfer pattern port_id id is 0 / end actions\n     port_id id 2 / end\n\nSigned-off-by: Adrien Mazarguil <adrien.mazarguil@6wind.com>\n---\n drivers/net/mlx5/mlx5_nl_flow.c | 57 +++++++++++++++++++++++++++++++++++-\n 1 file changed, 56 insertions(+), 1 deletion(-)",
    "diff": "diff --git a/drivers/net/mlx5/mlx5_nl_flow.c b/drivers/net/mlx5/mlx5_nl_flow.c\nindex a45d94fae..ad7a53d36 100644\n--- a/drivers/net/mlx5/mlx5_nl_flow.c\n+++ b/drivers/net/mlx5/mlx5_nl_flow.c\n@@ -36,6 +36,7 @@ enum mlx5_nl_flow_trans {\n \tATTR,\n \tPATTERN,\n \tITEM_VOID,\n+\tITEM_PORT_ID,\n \tITEM_ETH,\n \tITEM_VLAN,\n \tITEM_IPV4,\n@@ -56,7 +57,7 @@ enum mlx5_nl_flow_trans {\n #define TRANS(...) (const enum mlx5_nl_flow_trans []){ __VA_ARGS__, INVALID, }\n \n #define PATTERN_COMMON \\\n-\tITEM_VOID, ACTIONS\n+\tITEM_VOID, ITEM_PORT_ID, ACTIONS\n #define ACTIONS_COMMON \\\n \tACTION_VOID, ACTION_OF_POP_VLAN, ACTION_OF_PUSH_VLAN, \\\n \tACTION_OF_SET_VLAN_VID, ACTION_OF_SET_VLAN_PCP\n@@ -70,6 +71,7 @@ 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_PORT_ID] = TRANS(BACK),\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@@ -89,6 +91,7 @@ static const enum mlx5_nl_flow_trans *const mlx5_nl_flow_trans[] = {\n \n /** Empty masks for known item types. */\n static const union {\n+\tstruct rte_flow_item_port_id port_id;\n \tstruct rte_flow_item_eth eth;\n \tstruct rte_flow_item_vlan vlan;\n \tstruct rte_flow_item_ipv4 ipv4;\n@@ -99,6 +102,7 @@ static const union {\n \n /** Supported masks for known item types. */\n static const struct {\n+\tstruct rte_flow_item_port_id port_id;\n \tstruct rte_flow_item_eth eth;\n \tstruct rte_flow_item_vlan vlan;\n \tstruct rte_flow_item_ipv4 ipv4;\n@@ -106,6 +110,9 @@ static const struct {\n \tstruct rte_flow_item_tcp tcp;\n \tstruct rte_flow_item_udp udp;\n } mlx5_nl_flow_mask_supported = {\n+\t.port_id = {\n+\t\t.id = 0xffffffff,\n+\t},\n \t.eth = {\n \t\t.type = RTE_BE16(0xffff),\n \t\t.dst.addr_bytes = \"\\xff\\xff\\xff\\xff\\xff\\xff\",\n@@ -260,6 +267,7 @@ mlx5_nl_flow_transpose(void *buf,\n \tconst struct rte_flow_action *action;\n \tunsigned int n;\n \tuint32_t act_index_cur;\n+\tbool in_port_id_set;\n \tbool eth_type_set;\n \tbool vlan_present;\n \tbool vlan_eth_type_set;\n@@ -278,6 +286,7 @@ mlx5_nl_flow_transpose(void *buf,\n \taction = actions;\n \tn = 0;\n \tact_index_cur = 0;\n+\tin_port_id_set = false;\n \teth_type_set = false;\n \tvlan_present = false;\n \tvlan_eth_type_set = false;\n@@ -291,6 +300,7 @@ mlx5_nl_flow_transpose(void *buf,\n trans:\n \tswitch (trans[n++]) {\n \t\tunion {\n+\t\t\tconst struct rte_flow_item_port_id *port_id;\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@@ -392,6 +402,51 @@ mlx5_nl_flow_transpose(void *buf,\n \t\t\tgoto trans;\n \t\t++item;\n \t\tbreak;\n+\tcase ITEM_PORT_ID:\n+\t\tif (item->type != RTE_FLOW_ITEM_TYPE_PORT_ID)\n+\t\t\tgoto trans;\n+\t\tmask.port_id = mlx5_nl_flow_item_mask\n+\t\t\t(item, &rte_flow_item_port_id_mask,\n+\t\t\t &mlx5_nl_flow_mask_supported.port_id,\n+\t\t\t &mlx5_nl_flow_mask_empty.port_id,\n+\t\t\t sizeof(mlx5_nl_flow_mask_supported.port_id), error);\n+\t\tif (!mask.port_id)\n+\t\t\treturn -rte_errno;\n+\t\tif (mask.port_id == &mlx5_nl_flow_mask_empty.port_id) {\n+\t\t\tin_port_id_set = 1;\n+\t\t\t++item;\n+\t\t\tbreak;\n+\t\t}\n+\t\tspec.port_id = item->spec;\n+\t\tif (mask.port_id->id && mask.port_id->id != 0xffffffff)\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.port_id,\n+\t\t\t\t \"no support for partial mask on\"\n+\t\t\t\t \" \\\"id\\\" field\");\n+\t\tif (!mask.port_id->id)\n+\t\t\ti = 0;\n+\t\telse\n+\t\t\tfor (i = 0; ptoi[i].ifindex; ++i)\n+\t\t\t\tif (ptoi[i].port_id == spec.port_id->id)\n+\t\t\t\t\tbreak;\n+\t\tif (!ptoi[i].ifindex)\n+\t\t\treturn rte_flow_error_set\n+\t\t\t\t(error, ENODEV, RTE_FLOW_ERROR_TYPE_ITEM_SPEC,\n+\t\t\t\t spec.port_id,\n+\t\t\t\t \"missing data to convert port ID to ifindex\");\n+\t\ttcm = mnl_nlmsg_get_payload(buf);\n+\t\tif (in_port_id_set &&\n+\t\t    ptoi[i].ifindex != (unsigned int)tcm->tcm_ifindex)\n+\t\t\treturn rte_flow_error_set\n+\t\t\t\t(error, ENOTSUP, RTE_FLOW_ERROR_TYPE_ITEM_SPEC,\n+\t\t\t\t spec.port_id,\n+\t\t\t\t \"cannot match traffic for several port IDs\"\n+\t\t\t\t \" through a single flow rule\");\n+\t\ttcm->tcm_ifindex = ptoi[i].ifindex;\n+\t\tin_port_id_set = 1;\n+\t\t++item;\n+\t\tbreak;\n \tcase ITEM_ETH:\n \t\tif (item->type != RTE_FLOW_ITEM_TYPE_ETH)\n \t\t\tgoto trans;\n",
    "prefixes": [
        "6/6"
    ]
}