get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 809084,
    "url": "http://patchwork.ozlabs.org/api/patches/809084/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/netdev/patch/20170902152126.17286-18-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": "<20170902152126.17286-18-jiri@resnulli.us>",
    "list_archive_url": null,
    "date": "2017-09-02T15:21:22",
    "name": "[net-next,17/21] mlxsw: spectrum_router: Use existing decap route",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "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/20170902152126.17286-18-jiri@resnulli.us/mbox/",
    "series": [
        {
            "id": 1159,
            "url": "http://patchwork.ozlabs.org/api/series/1159/?format=api",
            "web_url": "http://patchwork.ozlabs.org/project/netdev/list/?series=1159",
            "date": "2017-09-02T15:21:05",
            "name": "mlxsw: Offloading GRE tunnels",
            "version": 1,
            "mbox": "http://patchwork.ozlabs.org/series/1159/mbox/"
        }
    ],
    "comments": "http://patchwork.ozlabs.org/api/patches/809084/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/809084/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=\"IDPysLGs\"; dkim-atps=neutral"
        ],
        "Received": [
            "from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3xl0G01k3cz9sQl\n\tfor <patchwork-incoming@ozlabs.org>;\n\tSun,  3 Sep 2017 01:22:00 +1000 (AEST)",
            "(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1752785AbdIBPV5 (ORCPT <rfc822;patchwork-incoming@ozlabs.org>);\n\tSat, 2 Sep 2017 11:21:57 -0400",
            "from mail-wm0-f66.google.com ([74.125.82.66]:36233 \"EHLO\n\tmail-wm0-f66.google.com\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n\twith ESMTP id S1752765AbdIBPV4 (ORCPT\n\t<rfc822;netdev@vger.kernel.org>); Sat, 2 Sep 2017 11:21:56 -0400",
            "by mail-wm0-f66.google.com with SMTP id p17so2641381wmd.3\n\tfor <netdev@vger.kernel.org>; Sat, 02 Sep 2017 08:21:55 -0700 (PDT)",
            "from localhost (jirka.pirko.cz. [84.16.102.26])\n\tby smtp.gmail.com with ESMTPSA id\n\te8sm8291227wmf.37.2017.09.02.08.21.53\n\t(version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256);\n\tSat, 02 Sep 2017 08:21:53 -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=IDPysLGsODSLgyOTC1ieBxqroCwTBTEfgxMc6wXn3hVdvftzF/PsAR/BvssN1ZOnzJ\n\t/AwteHJLlwGku128DfrhYyjBUC89aryt3x/wdxjlcPE/LNL5Gf03NrWwunQP6lt4I2i1\n\tUOIP5IcMvn5i8xTOp/6LRUQvP69oL4u1Lt81U1A7MO7QmEWPt+Idh7dDK0+K4q9uB+bu\n\tB2KAbNTLt4h2T4oktgFq4IRu3MTG5/yiuFAATJHUX5ASVfBCa9ZJL+gT5OUWy+aucwzY\n\tYLvJLQq2ZordzSkpN+boy6cJ7DAE0d6KbM+Ocxa7VOLRh1lMkPF2rZfxsA4ZcT/njRMV\n\tnOQg==",
        "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=I5xfaRNvxjv8H8ODehD9L1jt+/PDb/94cjHjtST9CF91Pp7SnQpH4qXOc6gzGIFtZr\n\tvHcIoOf787eqSCF4/u25ZI/0tuM2jbNI2wALka+wVfQXQ4psXF5UUxgtcgqfRZgys1xe\n\t/wEE44LLF5iKPryMU0jbhtQePMEWV+902F1+XwJNFMFTe3MWVxVVMOSsBoZRb+HlEN9e\n\tPXH7IthjLVATZupw8nLUw6RKTG3cXq2m6i04sHrYlOb9qnFQ25gVJsp95spHBG6hzHSg\n\tGKfIIz/DXZheIm3093rxQVCQOUqB+Ht7aQNOnHjVDZkETZ737PDS+oWj7EC0pZ1AbmbN\n\ta3dg==",
        "X-Gm-Message-State": "AHPjjUiJ8sYgZLvBG10m5QcjI5wajFr0vpRUIWTCJyz+IPthdbchSHzV\n\tX6PfR0aUl2zrqkZsJ6Y=",
        "X-Google-Smtp-Source": "ADKCNb5/yZZLYuC5KnP+WCCSX91H+EOydvhWwMAYHnVdeh64Ut+QL6eh5yQdtYb9E77+rBqsUJl7FA==",
        "X-Received": "by 10.28.91.65 with SMTP id p62mr1102459wmb.63.1504365714607;\n\tSat, 02 Sep 2017 08:21:54 -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 17/21] mlxsw: spectrum_router: Use existing decap\n\troute",
        "Date": "Sat,  2 Sep 2017 17:21:22 +0200",
        "Message-Id": "<20170902152126.17286-18-jiri@resnulli.us>",
        "X-Mailer": "git-send-email 2.9.3",
        "In-Reply-To": "<20170902152126.17286-1-jiri@resnulli.us>",
        "References": "<20170902152126.17286-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",
        "17/21"
    ]
}