get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 805964,
    "url": "http://patchwork.ozlabs.org/api/1.2/patches/805964/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/netdev/patch/1503678089-27131-3-git-send-email-u9012063@gmail.com/",
    "project": {
        "id": 7,
        "url": "http://patchwork.ozlabs.org/api/1.2/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": "<1503678089-27131-3-git-send-email-u9012063@gmail.com>",
    "list_archive_url": null,
    "date": "2017-08-25T16:21:28",
    "name": "[net-next,2/3] gre: add collect_md mode to ERSPAN tunnel",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "bc82774d7392feef0be9b4bf22675258c4e79922",
    "submitter": {
        "id": 67856,
        "url": "http://patchwork.ozlabs.org/api/1.2/people/67856/?format=api",
        "name": "William Tu",
        "email": "u9012063@gmail.com"
    },
    "delegate": {
        "id": 34,
        "url": "http://patchwork.ozlabs.org/api/1.2/users/34/?format=api",
        "username": "davem",
        "first_name": "David",
        "last_name": "Miller",
        "email": "davem@davemloft.net"
    },
    "mbox": "http://patchwork.ozlabs.org/project/netdev/patch/1503678089-27131-3-git-send-email-u9012063@gmail.com/mbox/",
    "series": [],
    "comments": "http://patchwork.ozlabs.org/api/patches/805964/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/805964/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=gmail.com header.i=@gmail.com\n\theader.b=\"Ge/T7J7d\"; dkim-atps=neutral"
        ],
        "Received": [
            "from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3xf5yq6XP8z9rxm\n\tfor <patchwork-incoming@ozlabs.org>;\n\tSat, 26 Aug 2017 02:21:55 +1000 (AEST)",
            "(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S934405AbdHYQVx (ORCPT <rfc822;patchwork-incoming@ozlabs.org>);\n\tFri, 25 Aug 2017 12:21:53 -0400",
            "from mail-pg0-f65.google.com ([74.125.83.65]:35209 \"EHLO\n\tmail-pg0-f65.google.com\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n\twith ESMTP id S934275AbdHYQVm (ORCPT\n\t<rfc822;netdev@vger.kernel.org>); Fri, 25 Aug 2017 12:21:42 -0400",
            "by mail-pg0-f65.google.com with SMTP id r133so367417pgr.2\n\tfor <netdev@vger.kernel.org>; Fri, 25 Aug 2017 09:21:42 -0700 (PDT)",
            "from sc9-mailhost2.vmware.com ([208.91.1.34])\n\tby smtp.gmail.com with ESMTPSA id\n\tk197sm1051155pga.78.2017.08.25.09.21.41\n\tfor <netdev@vger.kernel.org>\n\t(version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128);\n\tFri, 25 Aug 2017 09:21:41 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=gmail.com; s=20161025;\n\th=from:to:subject:date:message-id:in-reply-to:references;\n\tbh=SqdAtsJalNOFxpmbhjSzlLp7r97vVSs5l22JpZvHkvE=;\n\tb=Ge/T7J7dAZxVsIV/hmuUoMQXCX5CiYH0PfIJakzBe6JlXvHTrTK4hZ3dr4pD3wrb3n\n\tX+Gl0J32Ad1hhuWMZZrZWFL+Z4HxjZJ++9RSDju6E+wijOXIF+KrnwBzAmdne65+fssl\n\tg809OCRk3Lok0ncMbq2VTWHVI2vQqg6bJU/zk3dNdmJAX1gbuyZ9uGpUvSTOxffdTJKk\n\tGx3PAKB9Y7YyVhPvoRdHvwKR+iFH1AzHkr8QaGWgFXVva2r2m0oxfmQlFzJhXmnLCpAJ\n\tDokusKZLCZE/Y5WG9ZlImzQSJtbcbl3MEgi4oqYKoftO/iAJ/yhNX2jUE0sm6isWt/V9\n\t1+Wg==",
        "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:subject:date:message-id:in-reply-to\n\t:references;\n\tbh=SqdAtsJalNOFxpmbhjSzlLp7r97vVSs5l22JpZvHkvE=;\n\tb=XCoUwqxKI7ZBolBxrLAThTMD6/LsCozcyyUS65kXGHvOjlZDx6Wxkc6wWMyFsJb9vI\n\toiLzfHkmJgKjnmzYcvB85P2PbYmnqZ6TMYgZ2GKLuTLCpjj5WPNuuWcNe3DHTqxcncKk\n\t4xLc7ANjpHIS5wtQ7r9R25SjS4U9bJcv2sOl3ITdvZnULkSO8jyryXGqyRBgBlPL9oZv\n\tCosShe0Dscx54wghiyRxsbUpc3i/zo5GH2xyUJDAR6A6UnMgtaDevzivQ5g0vpwNDMe5\n\tIAqq5raiUDdK4lKnUm60TzjeMtYGuESJANFVhoh5X9oJu2pk5HNpGL2oI+ilbfVL/tjB\n\tmIEg==",
        "X-Gm-Message-State": "AHYfb5j7zMbTjMUQlBKe1tXqXQNw44MO0Iu7saYj3kxfB5APBlqZ6eB6\n\tMK6ywTZtVSx1ieDFjE8=",
        "X-Received": "by 10.101.88.195 with SMTP id e3mr3723361pgu.45.1503678101916;\n\tFri, 25 Aug 2017 09:21:41 -0700 (PDT)",
        "From": "William Tu <u9012063@gmail.com>",
        "To": "netdev@vger.kernel.org",
        "Subject": "[PATCH net-next 2/3] gre: add collect_md mode to ERSPAN tunnel",
        "Date": "Fri, 25 Aug 2017 09:21:28 -0700",
        "Message-Id": "<1503678089-27131-3-git-send-email-u9012063@gmail.com>",
        "X-Mailer": "git-send-email 2.7.4",
        "In-Reply-To": "<1503678089-27131-1-git-send-email-u9012063@gmail.com>",
        "References": "<1503678089-27131-1-git-send-email-u9012063@gmail.com>",
        "Sender": "netdev-owner@vger.kernel.org",
        "Precedence": "bulk",
        "List-ID": "<netdev.vger.kernel.org>",
        "X-Mailing-List": "netdev@vger.kernel.org"
    },
    "content": "Similar to gre, vxlan, geneve, ipip tunnels, allow ERSPAN tunnels to\noperate in 'collect metadata' mode.  bpf_skb_[gs]et_tunnel_key() helpers\ncan make use of it right away.  OVS can use it as well in the future.\n\nSigned-off-by: William Tu <u9012063@gmail.com>\n---\n include/net/ip_tunnels.h |   4 +-\n net/ipv4/ip_gre.c        | 102 +++++++++++++++++++++++++++++++++++++++++++++--\n 2 files changed, 101 insertions(+), 5 deletions(-)",
    "diff": "diff --git a/include/net/ip_tunnels.h b/include/net/ip_tunnels.h\nindex 625c29329372..992652856fe8 100644\n--- a/include/net/ip_tunnels.h\n+++ b/include/net/ip_tunnels.h\n@@ -154,8 +154,10 @@ struct ip_tunnel {\n #define TUNNEL_GENEVE_OPT\t__cpu_to_be16(0x0800)\n #define TUNNEL_VXLAN_OPT\t__cpu_to_be16(0x1000)\n #define TUNNEL_NOCACHE\t\t__cpu_to_be16(0x2000)\n+#define TUNNEL_ERSPAN_OPT\t__cpu_to_be16(0x4000)\n \n-#define TUNNEL_OPTIONS_PRESENT\t(TUNNEL_GENEVE_OPT | TUNNEL_VXLAN_OPT)\n+#define TUNNEL_OPTIONS_PRESENT \\\n+\t\t(TUNNEL_GENEVE_OPT | TUNNEL_VXLAN_OPT | TUNNEL_ERSPAN_OPT)\n \n struct tnl_ptk_info {\n \t__be16 flags;\ndiff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c\nindex 453b7925b940..0162fb955b33 100644\n--- a/net/ipv4/ip_gre.c\n+++ b/net/ipv4/ip_gre.c\n@@ -113,6 +113,8 @@ MODULE_PARM_DESC(log_ecn_error, \"Log packets received with corrupted ECN\");\n \n static struct rtnl_link_ops ipgre_link_ops __read_mostly;\n static int ipgre_tunnel_init(struct net_device *dev);\n+static void erspan_build_header(struct sk_buff *skb,\n+\t\t\t\t__be32 id, u32 index, bool truncate);\n \n static unsigned int ipgre_net_id __read_mostly;\n static unsigned int gre_tap_net_id __read_mostly;\n@@ -287,7 +289,33 @@ static int erspan_rcv(struct sk_buff *skb, struct tnl_ptk_info *tpi,\n \t\t\t\t\t   false, false) < 0)\n \t\t\tgoto drop;\n \n-\t\ttunnel->index = ntohl(index);\n+\t\tif (tunnel->collect_md) {\n+\t\t\tstruct ip_tunnel_info *info;\n+\t\t\tstruct erspan_metadata *md;\n+\t\t\t__be64 tun_id;\n+\t\t\t__be16 flags;\n+\n+\t\t\ttpi->flags |= TUNNEL_KEY;\n+\t\t\tflags = tpi->flags;\n+\t\t\ttun_id = key32_to_tunnel_id(tpi->key);\n+\n+\t\t\ttun_dst = ip_tun_rx_dst(skb, flags,\n+\t\t\t\t\t\ttun_id, sizeof(*md));\n+\t\t\tif (!tun_dst)\n+\t\t\t\treturn PACKET_REJECT;\n+\n+\t\t\tmd = ip_tunnel_info_opts(&tun_dst->u.tun_info);\n+\t\t\tif (!md)\n+\t\t\t\treturn PACKET_REJECT;\n+\n+\t\t\tmd->index = index;\n+\t\t\tinfo = &tun_dst->u.tun_info;\n+\t\t\tinfo->key.tun_flags |= TUNNEL_ERSPAN_OPT;\n+\t\t\tinfo->options_len = sizeof(*md);\n+\t\t} else {\n+\t\t\ttunnel->index = ntohl(index);\n+\t\t}\n+\n \t\tskb_reset_mac_header(skb);\n \t\tip_tunnel_rcv(tunnel, skb, tpi, tun_dst, log_ecn_error);\n \t\treturn PACKET_RCVD;\n@@ -523,6 +551,64 @@ static void gre_fb_xmit(struct sk_buff *skb, struct net_device *dev,\n \tdev->stats.tx_dropped++;\n }\n \n+static void erspan_fb_xmit(struct sk_buff *skb, struct net_device *dev,\n+\t\t\t   __be16 proto)\n+{\n+\tstruct ip_tunnel *tunnel = netdev_priv(dev);\n+\tstruct ip_tunnel_info *tun_info;\n+\tconst struct ip_tunnel_key *key;\n+\tstruct erspan_metadata *md;\n+\tstruct rtable *rt = NULL;\n+\tbool truncate = false;\n+\tstruct flowi4 fl;\n+\tint tunnel_hlen;\n+\t__be16 df;\n+\n+\ttun_info = skb_tunnel_info(skb);\n+\tif (unlikely(!tun_info || !(tun_info->mode & IP_TUNNEL_INFO_TX) ||\n+\t\t     ip_tunnel_info_af(tun_info) != AF_INET))\n+\t\tgoto err_free_skb;\n+\n+\tkey = &tun_info->key;\n+\n+\t/* ERSPAN has fixed 8 byte GRE header */\n+\ttunnel_hlen = 8 + sizeof(struct erspanhdr);\n+\n+\trt = prepare_fb_xmit(skb, dev, &fl, tunnel_hlen);\n+\tif (!rt)\n+\t\treturn;\n+\n+\tif (gre_handle_offloads(skb, false))\n+\t\tgoto err_free_rt;\n+\n+\tif (skb->len > dev->mtu) {\n+\t\tpskb_trim(skb, dev->mtu);\n+\t\ttruncate = true;\n+\t}\n+\n+\tmd = ip_tunnel_info_opts(tun_info);\n+\tif (!md)\n+\t\tgoto err_free_rt;\n+\n+\terspan_build_header(skb, tunnel_id_to_key32(key->tun_id),\n+\t\t\t    ntohl(md->index), truncate);\n+\n+\tgre_build_header(skb, 8, TUNNEL_SEQ,\n+\t\t\t htons(ETH_P_ERSPAN), 0, htonl(tunnel->o_seqno++));\n+\n+\tdf = key->tun_flags & TUNNEL_DONT_FRAGMENT ?  htons(IP_DF) : 0;\n+\n+\tiptunnel_xmit(skb->sk, rt, skb, fl.saddr, key->u.ipv4.dst, IPPROTO_GRE,\n+\t\t      key->tos, key->ttl, df, false);\n+\treturn;\n+\n+err_free_rt:\n+\tip_rt_put(rt);\n+err_free_skb:\n+\tkfree_skb(skb);\n+\tdev->stats.tx_dropped++;\n+}\n+\n static int gre_fill_metadata_dst(struct net_device *dev, struct sk_buff *skb)\n {\n \tstruct ip_tunnel_info *info = skb_tunnel_info(skb);\n@@ -636,6 +722,11 @@ static netdev_tx_t erspan_xmit(struct sk_buff *skb,\n \tstruct ip_tunnel *tunnel = netdev_priv(dev);\n \tbool truncate = false;\n \n+\tif (tunnel->collect_md) {\n+\t\terspan_fb_xmit(skb, dev, skb->protocol);\n+\t\treturn NETDEV_TX_OK;\n+\t}\n+\n \tif (gre_handle_offloads(skb, false))\n \t\tgoto free_skb;\n \n@@ -998,9 +1089,12 @@ static int erspan_validate(struct nlattr *tb[], struct nlattr *data[],\n \t\treturn ret;\n \n \t/* ERSPAN should only have GRE sequence and key flag */\n-\tflags |= nla_get_be16(data[IFLA_GRE_OFLAGS]);\n-\tflags |= nla_get_be16(data[IFLA_GRE_IFLAGS]);\n-\tif (flags != (GRE_SEQ | GRE_KEY))\n+\tif (data[IFLA_GRE_OFLAGS])\n+\t\tflags |= nla_get_be16(data[IFLA_GRE_OFLAGS]);\n+\tif (data[IFLA_GRE_IFLAGS])\n+\t\tflags |= nla_get_be16(data[IFLA_GRE_IFLAGS]);\n+\tif (!data[IFLA_GRE_COLLECT_METADATA] &&\n+\t    flags != (GRE_SEQ | GRE_KEY))\n \t\treturn -EINVAL;\n \n \t/* ERSPAN Session ID only has 10-bit. Since we reuse\n",
    "prefixes": [
        "net-next",
        "2/3"
    ]
}