get:
Show a patch.

patch:
Update a patch.

put:
Update a patch.

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

{
    "id": 809088,
    "url": "http://patchwork.ozlabs.org/api/patches/809088/?format=api",
    "web_url": "http://patchwork.ozlabs.org/project/netdev/patch/20170902152126.17286-21-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-21-jiri@resnulli.us>",
    "list_archive_url": null,
    "date": "2017-09-02T15:21:25",
    "name": "[net-next,20/21] mlxsw: spectrum_router: Support GRE tunnels",
    "commit_ref": null,
    "pull_url": null,
    "state": "superseded",
    "archived": true,
    "hash": "a161d77f0e06b1e3f774419837e384953509b4f3",
    "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-21-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/809088/comments/",
    "check": "pending",
    "checks": "http://patchwork.ozlabs.org/api/patches/809088/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=\"0RYJ9go4\"; dkim-atps=neutral"
        ],
        "Received": [
            "from vger.kernel.org (vger.kernel.org [209.132.180.67])\n\tby ozlabs.org (Postfix) with ESMTP id 3xl0GG0sr9z9sQl\n\tfor <patchwork-incoming@ozlabs.org>;\n\tSun,  3 Sep 2017 01:22:14 +1000 (AEST)",
            "(majordomo@vger.kernel.org) by vger.kernel.org via listexpand\n\tid S1752809AbdIBPWM (ORCPT <rfc822;patchwork-incoming@ozlabs.org>);\n\tSat, 2 Sep 2017 11:22:12 -0400",
            "from mail-wr0-f194.google.com ([209.85.128.194]:34681 \"EHLO\n\tmail-wr0-f194.google.com\" rhost-flags-OK-OK-OK-OK) by vger.kernel.org\n\twith ESMTP id S1752786AbdIBPWA (ORCPT\n\t<rfc822;netdev@vger.kernel.org>); Sat, 2 Sep 2017 11:22:00 -0400",
            "by mail-wr0-f194.google.com with SMTP id w62so272671wrc.1\n\tfor <netdev@vger.kernel.org>; Sat, 02 Sep 2017 08:22:00 -0700 (PDT)",
            "from localhost (jirka.pirko.cz. [84.16.102.26])\n\tby smtp.gmail.com with ESMTPSA id\n\tc56sm5388854wrc.1.2017.09.02.08.21.57\n\t(version=TLS1_2 cipher=ECDHE-RSA-CHACHA20-POLY1305 bits=256/256);\n\tSat, 02 Sep 2017 08:21:58 -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=TnsroUk5B+amw4SUTzrWDMIgFnwjhPgPG8nGc9EYkGE=;\n\tb=0RYJ9go4qKuqevcDFW2eKwp6CTUWqIgdpJXKckWbcrwiuWwEafXA/RCLQEKKvYeNmn\n\tqz0oivuQ/4ZaBIcd1Uq0G9V1Lec58P6mWWfnTwNmOMENlsgIw743wh+9CH0MNGBPz4Pd\n\tUNKYjgUFat0o/ZNkUamr+U+GxMNm7ro/GyuX6etNLczXhf/iFe5c/H8F3hB7pssrxwql\n\txzvBbGSK7mulLopHwZm14XvoAR7lP2dP0/JPtr80smjIGO1fpNT75QhtOR3gvDzCyXVa\n\tn8xQTBAyAdEScw3tE0XHPcssRI4hdWCyfssceoCtKf2zhr5BdbkMGbvPEHi8tr1I67M2\n\t2zkg==",
        "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=TnsroUk5B+amw4SUTzrWDMIgFnwjhPgPG8nGc9EYkGE=;\n\tb=ZC+NhUzJR7b8EMv6DSAjU20WSfJRTDe8szhqaKCNO6rhSwZZOaFSp8MEVy0khcS9lr\n\tWL5FrIsYARYFX0gq7V6WKjTxP/klZ6AtPVhuzYyHtAPH32AkYArQAAuhfeWim6IsZKOY\n\tbmjnthMyxVxty2o1M+G+8WDy9alspwy1rgvDexc2wJJ/pxaJcVdCg5Fww7d/lKLcq7ka\n\tg3y33boSbn17tcIlqHQ86kekDIagN8n1guI0KNRLHSVpVAxnMmF61FAFt91D2ENUqhXy\n\tD4WHaXavPhcAOV/TZg+fyAf6IHZnP4fDvwW3/ymM3W5HlDZ7GPpgMKigvEnJr81Unu+f\n\tHHPA==",
        "X-Gm-Message-State": "AHPjjUiH2eQ3rnVb2Sxf0x0dg1byosCg98jmyb7ScILXIgxrCpC8hz68\n\tNxEAE6H6PkeLrkOaZpc=",
        "X-Google-Smtp-Source": "ADKCNb7JTK/ZaAbbRSN2PGRoBuCkhau+uuNgAbaYVoLQStjtglv6PYN2h+vuzbC17GzHIo8ppy6pzQ==",
        "X-Received": "by 10.223.161.155 with SMTP id u27mr2595625wru.129.1504365719014;\n\tSat, 02 Sep 2017 08:21: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 20/21] mlxsw: spectrum_router: Support GRE tunnels",
        "Date": "Sat,  2 Sep 2017 17:21:25 +0200",
        "Message-Id": "<20170902152126.17286-21-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\nThis patch introduces callbacks and tunnel type to offload GRE tunnels.\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_ipip.c    | 176 +++++++++++++++++++++\n .../net/ethernet/mellanox/mlxsw/spectrum_ipip.h    |   1 +\n .../net/ethernet/mellanox/mlxsw/spectrum_router.c  |  26 +++\n .../net/ethernet/mellanox/mlxsw/spectrum_router.h  |   4 +\n 4 files changed, 207 insertions(+)",
    "diff": "diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_ipip.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_ipip.c\nindex 20b0b96..702fe94 100644\n--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_ipip.c\n+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_ipip.c\n@@ -32,7 +32,183 @@\n  * POSSIBILITY OF SUCH DAMAGE.\n  */\n \n+#include <net/ip_tunnels.h>\n+\n #include \"spectrum_ipip.h\"\n \n+static bool\n+mlxsw_sp_ipip_netdev_has_ikey(const struct net_device *ol_dev)\n+{\n+\tstruct ip_tunnel *tun = netdev_priv(ol_dev);\n+\n+\treturn !!(tun->parms.i_flags & TUNNEL_KEY);\n+}\n+\n+static bool\n+mlxsw_sp_ipip_netdev_has_okey(const struct net_device *ol_dev)\n+{\n+\tstruct ip_tunnel *tun = netdev_priv(ol_dev);\n+\n+\treturn !!(tun->parms.o_flags & TUNNEL_KEY);\n+}\n+\n+static u32 mlxsw_sp_ipip_netdev_ikey(const struct net_device *ol_dev)\n+{\n+\tstruct ip_tunnel *tun = netdev_priv(ol_dev);\n+\n+\treturn mlxsw_sp_ipip_netdev_has_ikey(ol_dev) ?\n+\t\tbe32_to_cpu(tun->parms.i_key) : 0;\n+}\n+\n+static u32 mlxsw_sp_ipip_netdev_okey(const struct net_device *ol_dev)\n+{\n+\tstruct ip_tunnel *tun = netdev_priv(ol_dev);\n+\n+\treturn mlxsw_sp_ipip_netdev_has_okey(ol_dev) ?\n+\t\tbe32_to_cpu(tun->parms.o_key) : 0;\n+}\n+\n+static int\n+mlxsw_sp_ipip_nexthop_update_gre4(struct mlxsw_sp *mlxsw_sp, u32 adj_index,\n+\t\t\t\t  struct mlxsw_sp_ipip_entry *ipip_entry)\n+{\n+\tu16 rif_index = mlxsw_sp_ipip_lb_rif_index(ipip_entry->ol_lb);\n+\t__be32 daddr4 = mlxsw_sp_ipip_netdev_daddr4(ipip_entry->ol_dev);\n+\tchar ratr_pl[MLXSW_REG_RATR_LEN];\n+\n+\tmlxsw_reg_ratr_pack(ratr_pl, MLXSW_REG_RATR_OP_WRITE_WRITE_ENTRY,\n+\t\t\t    true, MLXSW_REG_RATR_TYPE_IPIP,\n+\t\t\t    adj_index, rif_index);\n+\tmlxsw_reg_ratr_ipip4_entry_pack(ratr_pl, be32_to_cpu(daddr4));\n+\n+\treturn mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(ratr), ratr_pl);\n+}\n+\n+static int\n+mlxsw_sp_ipip_fib_entry_op_gre4_rtdp(struct mlxsw_sp *mlxsw_sp,\n+\t\t\t\t     u32 tunnel_index,\n+\t\t\t\t     struct mlxsw_sp_ipip_entry *ipip_entry)\n+{\n+\tbool has_ikey = mlxsw_sp_ipip_netdev_has_ikey(ipip_entry->ol_dev);\n+\tu16 rif_index = mlxsw_sp_ipip_lb_rif_index(ipip_entry->ol_lb);\n+\tu32 ikey = mlxsw_sp_ipip_netdev_ikey(ipip_entry->ol_dev);\n+\tchar rtdp_pl[MLXSW_REG_RTDP_LEN];\n+\tunsigned int type_check;\n+\tu32 daddr4;\n+\n+\tmlxsw_reg_rtdp_pack(rtdp_pl, MLXSW_REG_RTDP_TYPE_IPIP, tunnel_index);\n+\n+\ttype_check = has_ikey ?\n+\t\tMLXSW_REG_RTDP_IPIP_TYPE_CHECK_ALLOW_GRE_KEY :\n+\t\tMLXSW_REG_RTDP_IPIP_TYPE_CHECK_ALLOW_GRE;\n+\n+\t/* Linux demuxes tunnels based on packet SIP (which must match tunnel\n+\t * remote IP). Thus configure decap so that it filters out packets that\n+\t * are not IPv4 or have the wrong SIP. IPIP_DECAP_ERROR trap is\n+\t * generated for packets that fail this criterion. Linux then handles\n+\t * such packets in slow path and generates ICMP destination unreachable.\n+\t */\n+\tdaddr4 = be32_to_cpu(mlxsw_sp_ipip_netdev_daddr4(ipip_entry->ol_dev));\n+\tmlxsw_reg_rtdp_ipip4_pack(rtdp_pl, rif_index,\n+\t\t\t\t  MLXSW_REG_RTDP_IPIP_SIP_CHECK_FILTER_IPV4,\n+\t\t\t\t  type_check, has_ikey, daddr4, ikey);\n+\n+\treturn mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(rtdp), rtdp_pl);\n+}\n+\n+static int\n+mlxsw_sp_ipip_fib_entry_op_gre4_ralue(struct mlxsw_sp *mlxsw_sp,\n+\t\t\t\t      u32 dip, u8 prefix_len, u16 ul_vr_id,\n+\t\t\t\t      enum mlxsw_reg_ralue_op op,\n+\t\t\t\t      u32 tunnel_index)\n+{\n+\tchar ralue_pl[MLXSW_REG_RALUE_LEN];\n+\n+\tmlxsw_reg_ralue_pack4(ralue_pl, MLXSW_REG_RALXX_PROTOCOL_IPV4, op,\n+\t\t\t      ul_vr_id, prefix_len, dip);\n+\tmlxsw_reg_ralue_act_ip2me_tun_pack(ralue_pl, tunnel_index);\n+\treturn mlxsw_reg_write(mlxsw_sp->core, MLXSW_REG(ralue), ralue_pl);\n+}\n+\n+static int mlxsw_sp_ipip_fib_entry_op_gre4(struct mlxsw_sp *mlxsw_sp,\n+\t\t\t\t\tstruct mlxsw_sp_ipip_entry *ipip_entry,\n+\t\t\t\t\tenum mlxsw_reg_ralue_op op,\n+\t\t\t\t\tu32 tunnel_index)\n+{\n+\tu16 ul_vr_id = mlxsw_sp_ipip_lb_ul_vr_id(ipip_entry->ol_lb);\n+\t__be32 dip;\n+\tint err;\n+\n+\terr = mlxsw_sp_ipip_fib_entry_op_gre4_rtdp(mlxsw_sp, tunnel_index,\n+\t\t\t\t\t\t   ipip_entry);\n+\tif (err)\n+\t\treturn err;\n+\n+\tdip = mlxsw_sp_ipip_netdev_saddr(MLXSW_SP_L3_PROTO_IPV4,\n+\t\t\t\t\t ipip_entry->ol_dev).addr4;\n+\treturn mlxsw_sp_ipip_fib_entry_op_gre4_ralue(mlxsw_sp, be32_to_cpu(dip),\n+\t\t\t\t\t\t     32, ul_vr_id, op,\n+\t\t\t\t\t\t     tunnel_index);\n+}\n+\n+static bool mlxsw_sp_ipip_tunnel_complete(enum mlxsw_sp_l3proto proto,\n+\t\t\t\t\t  const struct net_device *ol_dev)\n+{\n+\tunion mlxsw_sp_l3addr saddr = mlxsw_sp_ipip_netdev_saddr(proto, ol_dev);\n+\tunion mlxsw_sp_l3addr daddr = mlxsw_sp_ipip_netdev_daddr(proto, ol_dev);\n+\tunion mlxsw_sp_l3addr naddr = {0};\n+\n+\t/* Tunnels with unset local or remote address are valid in Linux and\n+\t * used for lightweight tunnels (LWT) and Non-Broadcast Multi-Access\n+\t * (NBMA) tunnels. In principle these can be offloaded, but the driver\n+\t * currently doesn't support this. So punt.\n+\t */\n+\treturn memcmp(&saddr, &naddr, sizeof(naddr)) &&\n+\t       memcmp(&daddr, &naddr, sizeof(naddr));\n+}\n+\n+static bool mlxsw_sp_ipip_can_offload_gre4(const struct mlxsw_sp *mlxsw_sp,\n+\t\t\t\t\t   const struct net_device *ol_dev,\n+\t\t\t\t\t   enum mlxsw_sp_l3proto ol_proto)\n+{\n+\tstruct ip_tunnel *tunnel = netdev_priv(ol_dev);\n+\t__be16 okflags = TUNNEL_KEY; /* We can't offload any other features. */\n+\tbool inherit_ttl = tunnel->parms.iph.ttl == 0;\n+\tbool inherit_tos = tunnel->parms.iph.tos & 0x1;\n+\n+\treturn (tunnel->parms.i_flags & ~okflags) == 0 &&\n+\t       (tunnel->parms.o_flags & ~okflags) == 0 &&\n+\t       inherit_ttl && inherit_tos &&\n+\t       mlxsw_sp_ipip_tunnel_complete(MLXSW_SP_L3_PROTO_IPV4, ol_dev);\n+}\n+\n+static struct mlxsw_sp_rif_ipip_lb_config\n+mlxsw_sp_ipip_ol_loopback_config_gre4(struct mlxsw_sp *mlxsw_sp,\n+\t\t\t\t      const struct net_device *ol_dev)\n+{\n+\tenum mlxsw_reg_ritr_loopback_ipip_type lb_ipipt;\n+\n+\tlb_ipipt = mlxsw_sp_ipip_netdev_has_okey(ol_dev) ?\n+\t\tMLXSW_REG_RITR_LOOPBACK_IPIP_TYPE_IP_IN_GRE_KEY_IN_IP :\n+\t\tMLXSW_REG_RITR_LOOPBACK_IPIP_TYPE_IP_IN_GRE_IN_IP;\n+\treturn (struct mlxsw_sp_rif_ipip_lb_config){\n+\t\t.lb_ipipt = lb_ipipt,\n+\t\t.okey = mlxsw_sp_ipip_netdev_okey(ol_dev),\n+\t\t.ul_protocol = MLXSW_SP_L3_PROTO_IPV4,\n+\t\t.saddr = mlxsw_sp_ipip_netdev_saddr(MLXSW_SP_L3_PROTO_IPV4,\n+\t\t\t\t\t\t    ol_dev),\n+\t};\n+}\n+\n+static const struct mlxsw_sp_ipip_ops mlxsw_sp_ipip_gre4_ops = {\n+\t.dev_type = ARPHRD_IPGRE,\n+\t.ul_proto = MLXSW_SP_L3_PROTO_IPV4,\n+\t.nexthop_update = mlxsw_sp_ipip_nexthop_update_gre4,\n+\t.fib_entry_op = mlxsw_sp_ipip_fib_entry_op_gre4,\n+\t.can_offload = mlxsw_sp_ipip_can_offload_gre4,\n+\t.ol_loopback_config = mlxsw_sp_ipip_ol_loopback_config_gre4,\n+};\n+\n const struct mlxsw_sp_ipip_ops *mlxsw_sp_ipip_ops_arr[] = {\n+\t[MLXSW_SP_IPIP_TYPE_GRE4] = &mlxsw_sp_ipip_gre4_ops,\n };\ndiff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_ipip.h b/drivers/net/ethernet/mellanox/mlxsw/spectrum_ipip.h\nindex cd986bd..1c2db83 100644\n--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_ipip.h\n+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_ipip.h\n@@ -39,6 +39,7 @@\n #include <net/ip_fib.h>\n \n enum mlxsw_sp_ipip_type {\n+\tMLXSW_SP_IPIP_TYPE_GRE4,\n \tMLXSW_SP_IPIP_TYPE_MAX,\n };\n \ndiff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c\nindex 6068eea..f0fb898 100644\n--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c\n+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.c\n@@ -1020,6 +1020,32 @@ mlxsw_sp_ipip_netdev_saddr(enum mlxsw_sp_l3proto proto,\n \t};\n }\n \n+__be32 mlxsw_sp_ipip_netdev_daddr4(const struct net_device *ol_dev)\n+{\n+\tstruct ip_tunnel *tun = netdev_priv(ol_dev);\n+\n+\treturn tun->parms.iph.daddr;\n+}\n+\n+union mlxsw_sp_l3addr\n+mlxsw_sp_ipip_netdev_daddr(enum mlxsw_sp_l3proto proto,\n+\t\t\t   const struct net_device *ol_dev)\n+{\n+\tswitch (proto) {\n+\tcase MLXSW_SP_L3_PROTO_IPV4:\n+\t\treturn (union mlxsw_sp_l3addr) {\n+\t\t\t.addr4 = mlxsw_sp_ipip_netdev_daddr4(ol_dev),\n+\t\t};\n+\tcase MLXSW_SP_L3_PROTO_IPV6:\n+\t\tbreak;\n+\t};\n+\n+\tWARN_ON(1);\n+\treturn (union mlxsw_sp_l3addr) {\n+\t\t.addr4 = 0,\n+\t};\n+}\n+\n static bool mlxsw_sp_l3addr_eq(const union mlxsw_sp_l3addr *addr1,\n \t\t\t       const union mlxsw_sp_l3addr *addr2)\n {\ndiff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.h b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.h\nindex 9632476..345fcc4 100644\n--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.h\n+++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_router.h\n@@ -103,5 +103,9 @@ bool mlxsw_sp_neigh_ipv6_ignore(struct mlxsw_sp_neigh_entry *neigh_entry);\n union mlxsw_sp_l3addr\n mlxsw_sp_ipip_netdev_saddr(enum mlxsw_sp_l3proto proto,\n \t\t\t   const struct net_device *ol_dev);\n+union mlxsw_sp_l3addr\n+mlxsw_sp_ipip_netdev_daddr(enum mlxsw_sp_l3proto proto,\n+\t\t\t   const struct net_device *ol_dev);\n+__be32 mlxsw_sp_ipip_netdev_daddr4(const struct net_device *ol_dev);\n \n #endif /* _MLXSW_ROUTER_H_*/\n",
    "prefixes": [
        "net-next",
        "20/21"
    ]
}