get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 809160,
    "url": "http://patchwork.ozlabs.org/api/patches/809160/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/netdev/patch/20170902214929.2890-19-jiri@resnulli.us/",
    "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": "<20170902214929.2890-19-jiri@resnulli.us>",
    "list_archive_url": null,
    "date": "2017-09-02T21:49:26",
    "name": "[net-next,v2,18/21] mlxsw: spectrum_router: Use existing decap route",
    "commit_ref": null,
    "pull_url": null,
    "state": "accepted",
    "archived": true,
    "hash": "dcb49126acb7255e955ff16740256f3b0e1074ea",
    "submitter": {
        "id": 15321,
        "url": "http://patchwork.ozlabs.org/api/people/15321/?format=api",
        "name": "Jiri Pirko",
        "email": "jiri@resnulli.us"
    },
    "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/20170902214929.2890-19-jiri@resnulli.us/mbox/",
    "series": [
        {
            "id": 1180,
            "url": "http://patchwork.ozlabs.org/api/series/1180/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/netdev/list/?series=1180",
            "date": "2017-09-02T21:49:08",
            "name": "mlxsw: Offloading GRE tunnels",
            "version": 2,
            "mbox": "http://patchwork.ozlabs.org/series/1180/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/809160/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/809160/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=resnulli-us.20150623.gappssmtp.com\n\theader.i=@resnulli-us.20150623.gappssmtp.com\n\theader.b=\"wmnHmGfG\"; dkim-atps=neutral"
        ],
        "Received": [
            "from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3xl8sz1PM7z9s8J\n\tfor <patchwork-incoming@ozlabs.org>;\n\tSun,  3 Sep 2017 07:50:15 +1000 (AEST)",
            "(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1752869AbdIBVuD (ORCPT <rfc822;patchwork-incoming@ozlabs.org>);\n\tSat, 2 Sep 2017 17:50:03 -0400",
            "from mail-wr0-f194.google.com ([209.85.128.194]:34810 \"EHLO\n\tmail-wr0-f194.google.com\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n\twith ESMTP id S1752862AbdIBVuB (ORCPT\n\t<rfc822;netdev@vger.kernel.org>); Sat, 2 Sep 2017 17:50:01 -0400",
            "by mail-wr0-f194.google.com with SMTP id w62so542840wrc.1\n\tfor <netdev@vger.kernel.org>; Sat, 02 Sep 2017 14:50:00 -0700 (PDT)",
            "from localhost (jirka.pirko.cz. [84.16.102.26])\n\tby smtp.gmail.com with ESMTPSA id\n\tb10sm1620690wrc.69.2017.09.02.14.49.58\n\t(version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256);\n\tSat, 02 Sep 2017 14:49:59 -0700 (PDT)"
        ],
        "DKIM-Signature": "v=1; a=rsa-sha256; c=relaxed/relaxed;\n\td=resnulli-us.20150623.gappssmtp.com; s=20150623;\n\th=from:to:cc:subject:date:message-id:in-reply-to:references;\n\tbh=pehg36uQdEcdIa83PJ4mpHiXUp57kXo9qYfsRlHcuek=;\n\tb=wmnHmGfGuRud0IqQtb5LfmvUWqlFeUponONX1kUacyeNv+YwojfUD8yleCnKThwKbg\n\tR4J5GhAN98Ry6t68Oo8td322dxakeDkRKzAzsIO2FwBKTi6svU6sPMMIk8guEfMhBIVE\n\tG5aWsligzkcJaBPDQa64aJT4FaSgttjVLG3iaPxDpAFYYGZNVvuYvZfgDqUDDhH8U12F\n\t625rtqJ9WUG9Wr+xOkOhrQAQvGAr2ylJXL2F8DR+zAEkxHwUbQjcUubH8pzyQ7ieDVDP\n\txgSMYV2Xf5au4/jdLwE8dLSS4s1PjxEXj5ilQ9pEQU/8P3JqGw5JQizJGvxLRJy+WxMS\n\tiFYA==",
        "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=pehg36uQdEcdIa83PJ4mpHiXUp57kXo9qYfsRlHcuek=;\n\tb=jflyosQd7orl9NaiMvMDVlkO2DTssvo7MX+lRDMZloLgAJ8VPaH9ZK4Q3p3/3ChjMc\n\t8TCV0Z5r0O/WILjbYgONpkdThdxY5afZLF6iF9pwUYrrPfRD4swUsTy1NeG0kLOTQJm2\n\tJj75jdwkkPUclrWvuaXyA+usROFPKdeRonEW6F0nmxg7N3IX0ntc1UyV7HwzSUyzCIDw\n\tnBGGEkRs8rxsO0ixvihYkIY9sEMYFEXo4u0th8/JM/CGchVgp2OdB7x8iwQ71M/AJ89o\n\tuKLtzRicF0xvAirEEQmZ8f2RwZAz448PG06sysw0szkdZIjCOCqKfGghN9KEHjLmYrJl\n\tCxBg==",
        "X-Gm-Message-State": "AHPjjUg0+4C3cyFKzUD9zRPfy2Z/rzWZBvG8UMm4SyLIMtDY4IZkVPY6\n\t7/UPoMJM1036vIxCix8=",
        "X-Google-Smtp-Source": "ADKCNb4uNIxVTWF3yUCk0CPviJpAr7Lt5ruiYnnQn4JYycMcn/5IfS4UZkhrj4Pd+P3I9qwcBPrqSw==",
        "X-Received": "by 10.223.131.194 with SMTP id 60mr3084686wre.155.1504388999775; \n\tSat, 02 Sep 2017 14:49:59 -0700 (PDT)",
        "From": "Jiri Pirko <jiri@resnulli.us>",
        "To": "netdev@vger.kernel.org",
        "Cc": "davem@davemloft.net, petrm@mellanox.com, idosch@mellanox.com,\n\tmlxsw@mellanox.com",
        "Subject": "[patch net-next v2 18/21] mlxsw: spectrum_router: Use existing\n\tdecap route",
        "Date": "Sat,  2 Sep 2017 23:49:26 +0200",
        "Message-Id": "<20170902214929.2890-19-jiri@resnulli.us>",
        "X-Mailer": "git-send-email 2.9.3",
        "In-Reply-To": "<20170902214929.2890-1-jiri@resnulli.us>",
        "References": "<20170902214929.2890-1-jiri@resnulli.us>",
        "Sender": "netdev-owner@vger.kernel.org",
        "Precedence": "bulk",
        "List-ID": "<netdev.vger.kernel.org>",
        "X-Mailing-List": "netdev@vger.kernel.org"
    },
    "content": "From: Petr Machata <petrm@mellanox.com>\n\nThe local route that points at IPIP's underlay device (decap route) can\nbe present long before the GRE device. Thus when an encap route is\nadded, it's necessary to look inside the underlay FIB if the decap route\nis already present. If so, the current trap offload needs to be\nwithdrawn and replaced with a decap offload.\n\nSigned-off-by: Petr Machata <petrm@mellanox.com>\nReviewed-by: Ido Schimmel <idosch@mellanox.com>\nSigned-off-by: Jiri Pirko <jiri@mellanox.com>\n---\n .../net/ethernet/mellanox/mlxsw/spectrum_router.c  | 80 ++++++++++++++++++++--\n 1 file changed, 76 insertions(+), 4 deletions(-)",
    "diff": "diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c\nindex 0d09f81..2189cf0 100644\n--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c\n+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c\n@@ -1072,6 +1072,9 @@ static void mlxsw_sp_fib_entry_decap_fini(struct mlxsw_sp *mlxsw_sp,\n \tmlxsw_sp_kvdl_free(mlxsw_sp, fib_entry->decap.tunnel_index);\n }\n \n+static struct mlxsw_sp_fib_node *\n+mlxsw_sp_fib_node_lookup(struct mlxsw_sp_fib *fib, const void *addr,\n+\t\t\t size_t addr_len, unsigned char prefix_len);\n static int mlxsw_sp_fib_entry_update(struct mlxsw_sp *mlxsw_sp,\n \t\t\t\t     struct mlxsw_sp_fib_entry *fib_entry);\n \n@@ -1087,6 +1090,73 @@ mlxsw_sp_ipip_entry_demote_decap(struct mlxsw_sp *mlxsw_sp,\n \tmlxsw_sp_fib_entry_update(mlxsw_sp, fib_entry);\n }\n \n+static void\n+mlxsw_sp_ipip_entry_promote_decap(struct mlxsw_sp *mlxsw_sp,\n+\t\t\t\t  struct mlxsw_sp_ipip_entry *ipip_entry,\n+\t\t\t\t  struct mlxsw_sp_fib_entry *decap_fib_entry)\n+{\n+\tif (mlxsw_sp_fib_entry_decap_init(mlxsw_sp, decap_fib_entry,\n+\t\t\t\t\t  ipip_entry))\n+\t\treturn;\n+\tdecap_fib_entry->type = MLXSW_SP_FIB_ENTRY_TYPE_IPIP_DECAP;\n+\n+\tif (mlxsw_sp_fib_entry_update(mlxsw_sp, decap_fib_entry))\n+\t\tmlxsw_sp_ipip_entry_demote_decap(mlxsw_sp, ipip_entry);\n+}\n+\n+/* Given an IPIP entry, find the corresponding decap route. */\n+static struct mlxsw_sp_fib_entry *\n+mlxsw_sp_ipip_entry_find_decap(struct mlxsw_sp *mlxsw_sp,\n+\t\t\t       struct mlxsw_sp_ipip_entry *ipip_entry)\n+{\n+\tstatic struct mlxsw_sp_fib_node *fib_node;\n+\tconst struct mlxsw_sp_ipip_ops *ipip_ops;\n+\tstruct mlxsw_sp_fib_entry *fib_entry;\n+\tunsigned char saddr_prefix_len;\n+\tunion mlxsw_sp_l3addr saddr;\n+\tstruct mlxsw_sp_fib *ul_fib;\n+\tstruct mlxsw_sp_vr *ul_vr;\n+\tconst void *saddrp;\n+\tsize_t saddr_len;\n+\tu32 ul_tb_id;\n+\tu32 saddr4;\n+\n+\tipip_ops = mlxsw_sp->router->ipip_ops_arr[ipip_entry->ipipt];\n+\n+\tul_tb_id = mlxsw_sp_ipip_dev_ul_tb_id(ipip_entry->ol_dev);\n+\tul_vr = mlxsw_sp_vr_find(mlxsw_sp, ul_tb_id);\n+\tif (!ul_vr)\n+\t\treturn NULL;\n+\n+\tul_fib = mlxsw_sp_vr_fib(ul_vr, ipip_ops->ul_proto);\n+\tsaddr = mlxsw_sp_ipip_netdev_saddr(ipip_ops->ul_proto,\n+\t\t\t\t\t   ipip_entry->ol_dev);\n+\n+\tswitch (ipip_ops->ul_proto) {\n+\tcase MLXSW_SP_L3_PROTO_IPV4:\n+\t\tsaddr4 = be32_to_cpu(saddr.addr4);\n+\t\tsaddrp = &saddr4;\n+\t\tsaddr_len = 4;\n+\t\tsaddr_prefix_len = 32;\n+\t\tbreak;\n+\tcase MLXSW_SP_L3_PROTO_IPV6:\n+\t\tWARN_ON(1);\n+\t\treturn NULL;\n+\t}\n+\n+\tfib_node = mlxsw_sp_fib_node_lookup(ul_fib, saddrp, saddr_len,\n+\t\t\t\t\t    saddr_prefix_len);\n+\tif (!fib_node || list_empty(&fib_node->entry_list))\n+\t\treturn NULL;\n+\n+\tfib_entry = list_first_entry(&fib_node->entry_list,\n+\t\t\t\t     struct mlxsw_sp_fib_entry, list);\n+\tif (fib_entry->type != MLXSW_SP_FIB_ENTRY_TYPE_TRAP)\n+\t\treturn NULL;\n+\n+\treturn fib_entry;\n+}\n+\n static struct mlxsw_sp_ipip_entry *\n mlxsw_sp_ipip_entry_get(struct mlxsw_sp *mlxsw_sp,\n \t\t\tenum mlxsw_sp_ipip_type ipipt,\n@@ -1094,6 +1164,7 @@ mlxsw_sp_ipip_entry_get(struct mlxsw_sp *mlxsw_sp,\n {\n \tu32 ul_tb_id = mlxsw_sp_ipip_dev_ul_tb_id(ol_dev);\n \tstruct mlxsw_sp_router *router = mlxsw_sp->router;\n+\tstruct mlxsw_sp_fib_entry *decap_fib_entry;\n \tstruct mlxsw_sp_ipip_entry *ipip_entry;\n \tenum mlxsw_sp_l3proto ul_proto;\n \tunion mlxsw_sp_l3addr saddr;\n@@ -1118,6 +1189,11 @@ mlxsw_sp_ipip_entry_get(struct mlxsw_sp *mlxsw_sp,\n \tif (IS_ERR(ipip_entry))\n \t\treturn ipip_entry;\n \n+\tdecap_fib_entry = mlxsw_sp_ipip_entry_find_decap(mlxsw_sp, ipip_entry);\n+\tif (decap_fib_entry)\n+\t\tmlxsw_sp_ipip_entry_promote_decap(mlxsw_sp, ipip_entry,\n+\t\t\t\t\t\t  decap_fib_entry);\n+\n \tlist_add_tail(&ipip_entry->ipip_list_node,\n \t\t      &mlxsw_sp->router->ipip_list);\n \n@@ -3259,10 +3335,6 @@ static void mlxsw_sp_fib4_entry_destroy(struct mlxsw_sp *mlxsw_sp,\n \tkfree(fib4_entry);\n }\n \n-static struct mlxsw_sp_fib_node *\n-mlxsw_sp_fib_node_lookup(struct mlxsw_sp_fib *fib, const void *addr,\n-\t\t\t size_t addr_len, unsigned char prefix_len);\n-\n static struct mlxsw_sp_fib4_entry *\n mlxsw_sp_fib4_entry_lookup(struct mlxsw_sp *mlxsw_sp,\n \t\t\t   const struct fib_entry_notifier_info *fen_info)\n",
    "prefixes": [
        "net-next",
        "v2",
        "18/21"
    ]
}