get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 812868,
    "url": "http://patchwork.ozlabs.org/api/patches/812868/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/netdev/patch/1505226037-2758-3-git-send-email-simon.horman@netronome.com/",
    "project": {
        "id": 7,
        "url": "http://patchwork.ozlabs.org/api/projects/7/?format=api",
        "name": "Linux network development",
        "link_name": "netdev",
        "list_id": "netdev.vger.kernel.org",
        "list_email": "netdev@vger.kernel.org",
        "web_url": null,
        "scm_url": null,
        "webscm_url": null,
        "list_archive_url": "",
        "list_archive_url_format": "",
        "commit_url_format": ""
    },
    "msgid": "<1505226037-2758-3-git-send-email-simon.horman@netronome.com>",
    "list_archive_url": null,
    "date": "2017-09-12T14:20:37",
    "name": "[PATCH/RFC,net-next,2/2] net/sched: allow flower to match tunnel options",
    "commit_ref": null,
    "pull_url": null,
    "state": "rfc",
    "archived": true,
    "hash": "d49d93766c3118f2253880af93d1a5970a87ae27",
    "submitter": {
        "id": 64714,
        "url": "http://patchwork.ozlabs.org/api/people/64714/?format=api",
        "name": "Simon Horman",
        "email": "simon.horman@netronome.com"
    },
    "delegate": {
        "id": 34,
        "url": "http://patchwork.ozlabs.org/api/users/34/?format=api",
        "username": "davem",
        "first_name": "David",
        "last_name": "Miller",
        "email": "davem@davemloft.net"
    },
    "mbox": "http://patchwork.ozlabs.org/project/netdev/patch/1505226037-2758-3-git-send-email-simon.horman@netronome.com/mbox/",
    "series": [
        {
            "id": 2713,
            "url": "http://patchwork.ozlabs.org/api/series/2713/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/netdev/list/?series=2713",
            "date": "2017-09-12T14:20:35",
            "name": "net/sched: support tunnel options in cls_flower and act_tunnel_key",
            "version": 1,
            "mbox": "http://patchwork.ozlabs.org/series/2713/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/812868/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/812868/checks/",
    "tags": {},
    "related": [],
    "headers": {
        "Return-Path": "<netdev-owner@vger.kernel.org>",
        "X-Original-To": "patchwork-incoming@ozlabs.org",
        "Delivered-To": "patchwork-incoming@ozlabs.org",
        "Authentication-Results": [
            "ozlabs.org;\n\tspf=none (mailfrom) smtp.mailfrom=vger.kernel.org\n\t(client-ip=209.132.180.67; helo=vger.kernel.org;\n\tenvelope-from=netdev-owner@vger.kernel.org;\n\treceiver=<UNKNOWN>)",
            "ozlabs.org; dkim=pass (2048-bit key;\n\tunprotected) header.d=netronome-com.20150623.gappssmtp.com\n\theader.i=@netronome-com.20150623.gappssmtp.com\n\theader.b=\"c5fCOILT\"; dkim-atps=neutral"
        ],
        "Received": [
            "from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3xs6SR03dvz9s0Z\n\tfor <patchwork-incoming@ozlabs.org>;\n\tWed, 13 Sep 2017 00:22:15 +1000 (AEST)",
            "(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1751520AbdILOWA (ORCPT <rfc822;patchwork-incoming@ozlabs.org>);\n\tTue, 12 Sep 2017 10:22:00 -0400",
            "from mail-wm0-f51.google.com ([74.125.82.51]:44845 \"EHLO\n\tmail-wm0-f51.google.com\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n\twith ESMTP id S1751460AbdILOVs (ORCPT\n\t<rfc822;netdev@vger.kernel.org>); Tue, 12 Sep 2017 10:21:48 -0400",
            "by mail-wm0-f51.google.com with SMTP id 189so8825wmh.1\n\tfor <netdev@vger.kernel.org>; Tue, 12 Sep 2017 07:21:47 -0700 (PDT)",
            "from reginn.horms.nl (52D9BC73.cm-11-1c.dynamic.ziggo.nl.\n\t[82.217.188.115]) by smtp.gmail.com with ESMTPSA id\n\tx29sm708851eda.51.2017.09.12.07.21.45\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128);\n\tTue, 12 Sep 2017 07:21:46 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=netronome-com.20150623.gappssmtp.com; s=20150623;\n\th=from:to:cc:subject:date:message-id:in-reply-to:references;\n\tbh=bIQ6nu8+9nSd4ErksojjN2jmdfb/b8EB30i+gg86GAY=;\n\tb=c5fCOILTcaNT4TzvUUiC2rfsJpVvuKpSWMxXoPdqRqkRh3AASKsUF50c9bJRFRndbY\n\t+I8ofLUdCNWskLsshZ62HN0ja/J8AoFaxvOboqt616l6EWbnIxChqJ1BGqSi8aGScmma\n\tUg6srUk5crdvSrWEp1YeSa0Hm20+O0w0s+5KOrSW74a4ZFqHXIkOw5xHSpXXeVqlaaty\n\tWY+Q3u9VxAAqHx/7KLKT7Xoq/I1ON8efskA7sxBZgS1BHh5QxA5VTQi6uxGCcx+OVcrR\n\twer0J/ypGP9AIFN8LdrwNj8LdQzyifmpelns3GLLuTI+rcmjGOQcjk1528rKslSi23tm\n\tZtig==",
        "X-Google-DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=1e100.net; s=20161025;\n\th=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to\n\t:references;\n\tbh=bIQ6nu8+9nSd4ErksojjN2jmdfb/b8EB30i+gg86GAY=;\n\tb=TWL1tfb4EHmYYarFwgg4HZ69Idjom14wi+JhRX61zUhFW0rkVDYjVCshm/bj0B5O2Q\n\tHNs2CHGZtLGoF+0wHKc7J3GePV63spOGcD99DmeNuDJAzn9I1WlwpILgvr61taY9g5us\n\t3VNEQWrBuaZZ10nBxM1ZgKv7Mve+g2sl2o6sEQK63xV5wJSkPHrye+3G/gfC6sBVwOqj\n\tp4NXlOoCWNxd5DQ6nw7CP1jZktRQuMI7H9/uI1/xVZ1JckqmIxer4KMWsp2eoDbXRLLT\n\t/b7MfyzZj4QEKVPFmrZzGjJWBmUwhTX7Uztb2MOb7Y+DFVpp1f2VL31yg0OyF1bi0tYG\n\tKBVA==",
        "X-Gm-Message-State": "AHPjjUiviyjsYhmE1JJCXkkeUBuy6jZc9IWAdMa7ic1mLNVuBzV0xrV0\n\tFgJo6h1OTyaNy39Y",
        "X-Google-Smtp-Source": "ADKCNb7tblXiLaptT+rsM5W6PbBMo+O1kEcrk3gHxBq+6iuIHUbQnr8AbbtVkaQjFKOlAeaL8QPWBA==",
        "X-Received": "by 10.80.144.163 with SMTP id c32mr13377165eda.30.1505226106955; \n\tTue, 12 Sep 2017 07:21:46 -0700 (PDT)",
        "From": "Simon Horman <simon.horman@netronome.com>",
        "To": "Jiri Pirko <jiri@mellanox.com>, Jamal Hadi Salim <jhs@mojatatu.com>,\n\tCong Wang <xiyou.wangcong@gmail.com>",
        "Cc": "netdev@vger.kernel.org, oss-drivers@netronome.com,\n\tSimon Horman <simon.horman@netronome.com>",
        "Subject": "[PATCH/RFC net-next 2/2] net/sched: allow flower to match tunnel\n\toptions",
        "Date": "Tue, 12 Sep 2017 16:20:37 +0200",
        "Message-Id": "<1505226037-2758-3-git-send-email-simon.horman@netronome.com>",
        "X-Mailer": "git-send-email 2.1.4",
        "In-Reply-To": "<1505226037-2758-1-git-send-email-simon.horman@netronome.com>",
        "References": "<1505226037-2758-1-git-send-email-simon.horman@netronome.com>",
        "Sender": "netdev-owner@vger.kernel.org",
        "Precedence": "bulk",
        "List-ID": "<netdev.vger.kernel.org>",
        "X-Mailing-List": "netdev@vger.kernel.org"
    },
    "content": "Allow matching on options in tunnel headers.\nThis makes use of existing tunnel metadata support.\n\nOptions are a bytestring of up to 256 bytes.\nTunnel implementations may support less or more options,\nor no options at all.\n\n # ip link add name geneve0 type geneve dstport 0 external\n # tc qdisc add dev eth0 ingress\n # tc qdisc del dev eth0 ingress; tc qdisc add dev eth0 ingress\n # tc filter add dev eth0 protocol ip parent ffff: \\\n     flower indev eth0 \\\n        ip_proto udp \\\n        action tunnel_key \\\n            set src_ip 10.0.99.192 \\\n            dst_ip 10.0.99.193 \\\n            dst_port 4789 \\\n            id 11 \\\n            opts 0102800100800022 \\\n    action mirred egress redirect dev geneve0\n\nSigned-off-by: Simon Horman <simon.horman@netronome.com>\nReviewed-by: Jakub Kicinski <jakub.kicinski@netronome.com>\n---\n include/net/flow_dissector.h | 13 +++++++++++++\n include/uapi/linux/pkt_cls.h |  3 +++\n net/sched/cls_flower.c       | 35 ++++++++++++++++++++++++++++++++++-\n 3 files changed, 50 insertions(+), 1 deletion(-)",
    "diff": "diff --git a/include/net/flow_dissector.h b/include/net/flow_dissector.h\nindex fc3dce730a6b..43f98bf0b349 100644\n--- a/include/net/flow_dissector.h\n+++ b/include/net/flow_dissector.h\n@@ -183,6 +183,18 @@ struct flow_dissector_key_ip {\n \t__u8\tttl;\n };\n \n+/**\n+ * struct flow_dissector_key_enc_opts:\n+ * @data: data\n+ * @len: len\n+ */\n+struct flow_dissector_key_enc_opts {\n+\tu8 data[256];\t/* Using IP_TUNNEL_OPTS_MAX is desired here\n+\t\t\t * but seems difficult to #include\n+\t\t\t */\n+\tu8 len;\n+};\n+\n enum flow_dissector_key_id {\n \tFLOW_DISSECTOR_KEY_CONTROL, /* struct flow_dissector_key_control */\n \tFLOW_DISSECTOR_KEY_BASIC, /* struct flow_dissector_key_basic */\n@@ -205,6 +217,7 @@ enum flow_dissector_key_id {\n \tFLOW_DISSECTOR_KEY_MPLS, /* struct flow_dissector_key_mpls */\n \tFLOW_DISSECTOR_KEY_TCP, /* struct flow_dissector_key_tcp */\n \tFLOW_DISSECTOR_KEY_IP, /* struct flow_dissector_key_ip */\n+\tFLOW_DISSECTOR_KEY_ENC_OPTS, /* struct flow_dissector_key_enc_opts */\n \n \tFLOW_DISSECTOR_KEY_MAX,\n };\ndiff --git a/include/uapi/linux/pkt_cls.h b/include/uapi/linux/pkt_cls.h\nindex d5e2bf68d0d4..7a09a28f21e0 100644\n--- a/include/uapi/linux/pkt_cls.h\n+++ b/include/uapi/linux/pkt_cls.h\n@@ -467,6 +467,9 @@ enum {\n \tTCA_FLOWER_KEY_IP_TTL,\t\t/* u8 */\n \tTCA_FLOWER_KEY_IP_TTL_MASK,\t/* u8 */\n \n+\tTCA_FLOWER_KEY_ENC_OPTS,\n+\tTCA_FLOWER_KEY_ENC_OPTS_MASK,\n+\n \t__TCA_FLOWER_MAX,\n };\n \ndiff --git a/net/sched/cls_flower.c b/net/sched/cls_flower.c\nindex 1a267e77c6de..2a8364ef4fd5 100644\n--- a/net/sched/cls_flower.c\n+++ b/net/sched/cls_flower.c\n@@ -51,6 +51,7 @@ struct fl_flow_key {\n \tstruct flow_dissector_key_mpls mpls;\n \tstruct flow_dissector_key_tcp tcp;\n \tstruct flow_dissector_key_ip ip;\n+\tstruct flow_dissector_key_enc_opts enc_opts;\n } __aligned(BITS_PER_LONG / 8); /* Ensure that we can do comparisons as longs. */\n \n struct fl_flow_mask_range {\n@@ -181,6 +182,11 @@ static int fl_classify(struct sk_buff *skb, const struct tcf_proto *tp,\n \t\tskb_key.enc_key_id.keyid = tunnel_id_to_key32(key->tun_id);\n \t\tskb_key.enc_tp.src = key->tp_src;\n \t\tskb_key.enc_tp.dst = key->tp_dst;\n+\n+\t\tif (info->options_len) {\n+\t\t\tskb_key.enc_opts.len = info->options_len;\n+\t\t\tip_tunnel_info_opts_get(skb_key.enc_opts.data, info);\n+\t\t}\n \t}\n \n \tskb_key.indev_ifindex = skb->skb_iif;\n@@ -421,6 +427,8 @@ static const struct nla_policy fl_policy[TCA_FLOWER_MAX + 1] = {\n \t[TCA_FLOWER_KEY_IP_TOS_MASK]\t= { .type = NLA_U8 },\n \t[TCA_FLOWER_KEY_IP_TTL]\t\t= { .type = NLA_U8 },\n \t[TCA_FLOWER_KEY_IP_TTL_MASK]\t= { .type = NLA_U8 },\n+\t[TCA_FLOWER_KEY_ENC_OPTS]\t= { .type = NLA_BINARY },\n+\t[TCA_FLOWER_KEY_ENC_OPTS_MASK]\t= { .type = NLA_BINARY },\n };\n \n static void fl_set_key_val(struct nlattr **tb,\n@@ -712,6 +720,26 @@ static int fl_set_key(struct net *net, struct nlattr **tb,\n \t\t       &mask->enc_tp.dst, TCA_FLOWER_KEY_ENC_UDP_DST_PORT_MASK,\n \t\t       sizeof(key->enc_tp.dst));\n \n+\tif (tb[TCA_FLOWER_KEY_ENC_OPTS]) {\n+\t\tkey->enc_opts.len = nla_len(tb[TCA_FLOWER_KEY_ENC_OPTS]);\n+\n+\t\tif (key->enc_opts.len > sizeof(key->enc_opts.data))\n+\t\t\treturn -EINVAL;\n+\n+\t\t/* enc_opts is variable length.\n+\t\t * If present ensure the value and mask are the same length.\n+\t\t */\n+\t\tif (tb[TCA_FLOWER_KEY_ENC_OPTS_MASK] &&\n+\t\t    nla_len(tb[TCA_FLOWER_KEY_ENC_OPTS_MASK]) != key->enc_opts.len)\n+\t\t\treturn -EINVAL;\n+\n+\t\tmask->enc_opts.len = key->enc_opts.len;\n+\t\tfl_set_key_val(tb, key->enc_opts.data, TCA_FLOWER_KEY_ENC_OPTS,\n+\t\t\t       mask->enc_opts.data,\n+\t\t\t       TCA_FLOWER_KEY_ENC_OPTS_MASK,\n+\t\t\t       key->enc_opts.len);\n+\t}\n+\n \tif (tb[TCA_FLOWER_KEY_FLAGS])\n \t\tret = fl_set_key_flags(tb, &key->control.flags, &mask->control.flags);\n \n@@ -804,6 +832,8 @@ static void fl_init_dissector(struct cls_fl_head *head,\n \t\t\t   enc_control);\n \tFL_KEY_SET_IF_MASKED(&mask->key, keys, cnt,\n \t\t\t     FLOW_DISSECTOR_KEY_ENC_PORTS, enc_tp);\n+\tFL_KEY_SET_IF_MASKED(&mask->key, keys, cnt,\n+\t\t\t     FLOW_DISSECTOR_KEY_ENC_OPTS, enc_opts);\n \n \tskb_flow_dissector_init(&head->dissector, keys, cnt);\n }\n@@ -1327,7 +1357,10 @@ static int fl_dump(struct net *net, struct tcf_proto *tp, void *fh,\n \t\t\t    TCA_FLOWER_KEY_ENC_UDP_DST_PORT,\n \t\t\t    &mask->enc_tp.dst,\n \t\t\t    TCA_FLOWER_KEY_ENC_UDP_DST_PORT_MASK,\n-\t\t\t    sizeof(key->enc_tp.dst)))\n+\t\t\t    sizeof(key->enc_tp.dst)) ||\n+\t    fl_dump_key_val(skb, key->enc_opts.data, TCA_FLOWER_KEY_ENC_OPTS,\n+\t\t\t    mask->enc_opts.data, TCA_FLOWER_KEY_ENC_OPTS_MASK,\n+\t\t\t    key->enc_opts.len))\n \t\tgoto nla_put_failure;\n \n \tif (fl_dump_key_flags(skb, key->control.flags, mask->control.flags))\n",
    "prefixes": [
        "PATCH/RFC",
        "net-next",
        "2/2"
    ]
}