From patchwork Sun Dec 31 16:14:58 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Ido Schimmel X-Patchwork-Id: 854238 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=Mellanox.com header.i=@Mellanox.com header.b="c+wJurE8"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3z8lqQ4Qyhz9s84 for ; Mon, 1 Jan 2018 03:18:10 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751123AbdLaQQg (ORCPT ); Sun, 31 Dec 2017 11:16:36 -0500 Received: from mail-eopbgr30047.outbound.protection.outlook.com ([40.107.3.47]:24032 "EHLO EUR03-AM5-obe.outbound.protection.outlook.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S1750962AbdLaQQc (ORCPT ); Sun, 31 Dec 2017 11:16:32 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=Mellanox.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version; bh=JMzVfUIJlV7EQdTxw3ESm+amZYPSFw6ekCba8WgrK20=; b=c+wJurE82voMiDWW5buKg10HuPmDaMnhw7cI/AGuWYr7cp7DATOtNQrROlfnbWcNVSijdCnlit3QbxjHrX84Z7OyFkTS5/uqg3k8dtwb+VNux3HuqOi0oaAwSwXlOc1KbJSH3a1R5UuLMmaBY2lZR9EVBsJyWVdr9czPSNMOMEE= Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=idosch@mellanox.com; Received: from splinter.mtl.com (193.47.165.251) by AM5PR0501MB2001.eurprd05.prod.outlook.com (2603:10a6:203:1a::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P256) id 15.20.366.8; Sun, 31 Dec 2017 16:16:25 +0000 From: Ido Schimmel To: netdev@vger.kernel.org Cc: davem@davemloft.net, dsahern@gmail.com, roopa@cumulusnetworks.com, nicolas.dichtel@6wind.com, mlxsw@mellanox.com, Ido Schimmel Subject: [RFC PATCH net-next 04/19] ipv6: Prepare to handle multiple netdev events Date: Sun, 31 Dec 2017 18:14:58 +0200 Message-Id: <20171231161513.25785-5-idosch@mellanox.com> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20171231161513.25785-1-idosch@mellanox.com> References: <20171231161513.25785-1-idosch@mellanox.com> MIME-Version: 1.0 X-Originating-IP: [193.47.165.251] X-ClientProxiedBy: AM5PR0502CA0020.eurprd05.prod.outlook.com (2603:10a6:203:91::30) To AM5PR0501MB2001.eurprd05.prod.outlook.com (2603:10a6:203:1a::11) X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 2cc8a5f6-fe70-470a-d74b-08d55069d774 X-MS-Office365-Filtering-HT: Tenant X-Microsoft-Antispam: UriScan:; BCL:0; PCL:0; RULEID:(4534020)(4602075)(4627115)(201703031133081)(201702281549075)(5600026)(4604075)(48565401081)(2017052603307)(7153060); SRVR:AM5PR0501MB2001; X-Microsoft-Exchange-Diagnostics: 1; AM5PR0501MB2001; 3:8x/2LJsPsz6xWz0c4TLSucY0nzHE6M3Ska6luqYXOF+cn1DYLoM5nEbkxRRdwZ316X3VEg7Ghvyf+4vsiPnhBJwc1hb4PsAWOUENC3nVKMcId5aVkwlUImBKRTPJ3ey8Pcz1z7noqfjKXIFn+mi+7EZDY47SHewCQiKhTYMV9AESGTvbRDaBqu/qVBn+hoZJqp3RI8/7TK7T2EO/+9Q+xbbRozBL0FG7CmwTo26l+oBmJ3YHNvMA3Nb3aCcqnBoD; 25:ObRSaw8EIAxSfn7XGU4IYxdRTWeqVezDdgh6dZZfkiKt0REF+DgZOmp+0PolLFLLVV8u34YQdQ4M0laDc6PlRM7GQpG023kfhvEMuxXm1AAHcFibP6hMuf3t7bwPJXibQCwWHvytx2hfE6NFs0DAuyYhmeGuKkpk8I848QEv1FyD7U15P4zPbAtUUZTgR+UXcyJOdG1kyHyIbQpgJHzqgbqQooixIqpn0pkbDzNtALSEYwX28a4GEBx3ffbik/nJ4s9IMWhQzXLOFUEm09NoSw5UxlwkjsVnXCP9LR/Ad4s9JQWm9WSDPmmqIy5jIxIm61bjxZVwsP8Xrjuqf4We9A==; 31:8BwdbgucpjL2zNq9DnVHQWVVh3PgKUl5U+Xc8e4xvazJ4YYri8J1MfY41bkKo4t3M/HcEFkFoopbS5I2MJ+RSZVGT527geYZdDXvb2KZGQm4fcm22nXMuZOYO7xltcxHQjkmgzpzgbg9kxGqW/Wx5ol8GbU3tw1qfg8HrklAqNv2jtSicVF4p10TrjhAiTVzR242pQSeLKFFffFj2FhhqKJU3s8kd2yqWfxN1OBxzQE= X-MS-TrafficTypeDiagnostic: AM5PR0501MB2001: X-Microsoft-Exchange-Diagnostics: 1; AM5PR0501MB2001; 20:5TXOuyzgW2o0lKJYRk5cCq1R9xSnBBTdbcnkVLDyoPsVB2Kr1gCHtes8oYgvum2pdY2UbdwdjQaezCQevHPqbLDPyJZo/NLXVzg1g+hb6CjqL1ozTWMP14/SeHD+eIh9rcJeof/twdt72cRSVXt2u8Gf/BRAF1UCBlvzx0uqMe4W4ePbH5oal2f0uAEJQCtqxjlL7fLqEaYpqBWuHPYyWh9g31BOnoZcp3Biw88IB0hopRxKZ08st64YfkXKTT4hD1hLuNZJhuiEwt4Ro4Zu/Ngzx1W+FAtphwG18xah/G3hXOG0cgHu3qkNC5gM6BTVlEq4sim4rCaPqCvwfg0FaY5vj7TLzzTDtS92uD1s0HTCSjmCHd+lzt8biaNjMWhXVnttGOuMi+hdMRWMOhoqzu2rdliECdy7gXDtNtJ3s7iaZey6CPElx8Zl4Ma7dUcRp69rkhvlju0G87AAicb5PsGK8vG4uGPbUj/LFNG5XiIDrPptg9KhMO/WGWTXL+64; 4:51oTc7xeVKh/+kZ/HkgtyS6QR04CBYKJ2U9KTIe5a7zI/vuXgeBynouIfvOckk2Mt6ZzAicOa4Pr6tM51WrTuOqMghwmysnjGHwDHRSxA0p0oMChfa83AH9l1dLdh8GprW8vNWrnKPQcBGNxQkEIvNQ9Vi6nCSArejTdiCCNBCsX7Q86MHsmX0FRa0pjzdvrsePk+MnMjAnFM/1ad0u4EjkuHdYySdO5fAL0auTUEUwdE5Fi0g/nD20ODauoFtEpJYPNNFXdC5M/P4vC/swLcA== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:; X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040470)(2401047)(5005006)(8121501046)(93006095)(93001095)(3002001)(10201501046)(3231023)(944501075)(6055026)(6041268)(20161123562045)(20161123560045)(201703131423095)(201702281528075)(20161123555045)(201703061421075)(201703061406153)(20161123558120)(20161123564045)(6072148)(201708071742011); SRVR:AM5PR0501MB2001; BCL:0; PCL:0; RULEID:(100000803101)(100110400095); SRVR:AM5PR0501MB2001; X-Forefront-PRVS: 0538A71254 X-Forefront-Antispam-Report: SFV:NSPM; SFS:(10009020)(39380400002)(366004)(346002)(396003)(39860400002)(376002)(199004)(189003)(106356001)(86362001)(305945005)(6512007)(6486002)(1076002)(316002)(81156014)(2906002)(575784001)(6116002)(3846002)(16526018)(16586007)(8676002)(5660300001)(47776003)(66066001)(25786009)(6916009)(2361001)(39060400002)(68736007)(105586002)(6666003)(36756003)(51416003)(97736004)(48376002)(8936002)(4326008)(52116002)(2351001)(59450400001)(7736002)(53936002)(478600001)(386003)(107886003)(50226002)(50466002)(2950100002)(53416004)(81166006)(76176011)(6506007)(217873001); DIR:OUT; SFP:1101; SCL:1; SRVR:AM5PR0501MB2001; H:splinter.mtl.com; FPR:; SPF:None; PTR:InfoNoRecords; A:1; MX:1; LANG:en; Received-SPF: None (protection.outlook.com: mellanox.com does not designate permitted sender hosts) X-Microsoft-Exchange-Diagnostics: 1; AM5PR0501MB2001; 23:puTVj/3BTjTYWHoXqxxva9LxZDQjPq5WG3vkn+66wAIgffKrLF4wlw7gHddYAa1OhPaVqlM+K3lL/5VKAJ5aPSa9Alynrk/4mFPkFKAZIjgCdRSzqY3aP5WVpLr5RjTUpJxN4Ckhnlra5fuV5R2DjHAKrq8v3SPKUrz39I8rYXlrNAfN784SEI0rjtk2VwPQ1jYp0CJBeEXjP+FOje97EA/Hcj6be+F/8r+WLbztwqtlH7Mzf1NKN470zhhcTynmedWFmr7+Rjnk2QASs2HMnmI/EOmQ8EyzfUvbbPBQAlTb2t8fJcHH65V3boDxXLN0mtGB1kzSJZqGlQNOW+30J1doordGf2Q8qBUMalLQkiYea2XAnRSg91zpX1SldTnZbgIUPvITGUDGZNNQum30hbHt0HgljkMJ0vfTE9zodCFt0URCXlO15WUHI9KY43B1vEnIWlBWdopfI9qZhSE1BIjGvFbybfhsu5P73lcIV1hSBii04Pae6W0SfSsM9pqQNr2dfjiO1MGcvNv0WN0PQ0qt17ZXi80jgVqLOyJRPwKLEbVZXljcJO9y4wRZj6Al39Q9Ocl2wSfYc6QYHzfpD3WrTy1FT7/o+7R90r2LLaoGPoEVqsD/jBP9cH2Udd0/YbZxKB2kACt6rK7RKF36paFLz0n0QUdcgZYmY3RcITvr//RaBzaAdWNtsFJK9BW3XR+w/vW9zxiW6GNlIk8dKhDFQWg2N/T0u3OpzmxJ1+u27AhA+qeC+9EWCiUyTNOItlHKgZ/nXUYP2p9qM+4mxL36iT6KqvNJrZSjguKI0pLHIcmLly6ZMmpHaHqqjvQiiQbCFI6eQkn20fbDzm4RfErOXqeRolQ6Eph7Tp6tLgh1/c97Y4RT3V9HCONwEzk/ppORRqNpilHUd+abO/dnDwrNigaDV/DxkLjeFTSWqiPlEmuaU3djvdvyW3u6LrTmcPYD1XgC9q6ILDkWbAHbijTFEOqe91MpwUCgSLwTi9CHbQ2AANNEHDvFb+KXK7X3IAWMgJSiIIIa8jzYwcu4rFNyUEvUK9m6aMvk8I9AmeUv3bPMpRYfyogB2iqcFhNntMzddPy/WcFL0FlL04Sa89acvFlrC5e/VMZEAvOX+TrcUY0cmJpYBsDsHgYgyuFXzUpfVPHN9ntXTGp40u7H6l9tYZujWFwQlVqM88MWHzPWuLe4+0CnzVW2PZl+v9JVEQ50qcGWrDqTXX2bfE2EdK/M1ipHRJgZZpGUqubvibu2soDI+vtzG2KlLnw3xypz X-Microsoft-Exchange-Diagnostics: 1; AM5PR0501MB2001; 6:1OK6LXfBShGqtpMmKfQouM8wSq30n4doCE9QuNtI10cJxTfGThVgFD5JZGwYhNKJRioaRJtPUburRuHt+bfa/+KEjkcbesuPw4sr/4r9WEQsC9X7bpvjMlvhbCgzlpiLBUi43onBqI9AKB/vEUh7UkXmivU+SsERgeGhZpGZ6FNJL7hY7jV+2bOQmgqSxqB9g2mpmOOmTaqqn2wL499cbawcpQIx/89nfCG7pnC5JSTd6iCcmtnTyCvago8asiqMKfn2pT6fagbEYN0grCeSnP+/QzMRkBw4otSKQ9qH3Xh/xOqB3m58SoMkPj7KDRISFjGaTgjCCyjVyJzXQFTQYXx3Ya0BtE9aHitg9eHAPok=; 5:8sIqIott6mHYf06Mpz+q9DCYJmYSl6lc8Y5yGzZLhS52DYD3L6phsWi0n/YaP1dWblxzbIyPekRZxj+S6LlT2o3w0anfiZypGzkwS+XZ/wlwIUwd4Sz+ywaEYtZSIkpoo18iuCb64p+wVppKRc+80YuCjJ7evVudAewzx1nA+sE=; 24:suJ134u0nGB8LidCyKC8Ell6jXZQrrLvAbvvCgVI0X2bWbHfu5+r0G1k7WFpVZo9XkhbPPU4gX08RH3OlHD5pMN9/7S2U4pQQQdCaIkB4bo=; 7:gbJVTldLHhuBCNEZyqP0qTQE0OMDQYbBboj25RCXu0kYxEkQADlsefT/VzNog+l2q04l94SAaTS+fEwVptWZK+/EsdJbcjMmlcGm38Z/yxt7ztGV4ZICu+IJEYJ/AXuiU6tcHHMdaqMuV05AHmCHA9+69naW1ICR0X/T+m28AzGKWW4/az/zITovA+tidbAyUOv8HzHJsOXVAeFE+6bt2o1GOGK2TByMzf6Wrh8tQh4b9Ine+54BaZUZeWhLggKh SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-OriginatorOrg: Mellanox.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 31 Dec 2017 16:16:25.3402 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 2cc8a5f6-fe70-470a-d74b-08d55069d774 X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: a652971c-7d2e-4d9b-a6a4-d149256f461b X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM5PR0501MB2001 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org To make IPv6 more in line with IPv4 we need to be able to respond differently to different netdev events. For example, when a netdev is unregistered all the routes using it as their nexthop device should be flushed, whereas when the netdev's carrier changes only the 'linkdown' flag should be toggled. Currently, this is not possible, as the function that traverses the routing tables is not aware of the triggering event. Propagate the triggering event down, so that it could be used in later patches. Signed-off-by: Ido Schimmel --- include/net/ip6_route.h | 1 + net/ipv6/addrconf.c | 4 ++-- net/ipv6/route.c | 35 ++++++++++++++++++++--------------- 3 files changed, 23 insertions(+), 17 deletions(-) diff --git a/include/net/ip6_route.h b/include/net/ip6_route.h index caad39198c2a..8205402ff3dc 100644 --- a/include/net/ip6_route.h +++ b/include/net/ip6_route.h @@ -170,6 +170,7 @@ void rt6_mtu_change(struct net_device *dev, unsigned int mtu); void rt6_remove_prefsrc(struct inet6_ifaddr *ifp); void rt6_clean_tohost(struct net *net, struct in6_addr *gateway); void rt6_sync_up(struct net_device *dev, unsigned int nh_flags); +void rt6_disable_ip(struct net_device *dev, unsigned long event); static inline const struct rt6_info *skb_rt6_info(const struct sk_buff *skb) { diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index b6405568ed7b..a13e1ffe87ec 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c @@ -3580,6 +3580,7 @@ static bool addr_is_local(const struct in6_addr *addr) static int addrconf_ifdown(struct net_device *dev, int how) { + unsigned long event = how ? NETDEV_UNREGISTER : NETDEV_DOWN; struct net *net = dev_net(dev); struct inet6_dev *idev; struct inet6_ifaddr *ifa, *tmp; @@ -3589,8 +3590,7 @@ static int addrconf_ifdown(struct net_device *dev, int how) ASSERT_RTNL(); - rt6_ifdown(net, dev); - neigh_ifdown(&nd_tbl, dev); + rt6_disable_ip(dev, event); idev = __in6_dev_get(dev); if (!idev) diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 4796d87e0b93..9d1c34f2c7ed 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c @@ -3461,7 +3461,10 @@ void rt6_clean_tohost(struct net *net, struct in6_addr *gateway) struct arg_netdev_event { const struct net_device *dev; - unsigned int nh_flags; + union { + unsigned int nh_flags; + unsigned long event; + }; }; static int fib6_ifup(struct rt6_info *rt, void *p_arg) @@ -3488,19 +3491,15 @@ void rt6_sync_up(struct net_device *dev, unsigned int nh_flags) fib6_clean_all(dev_net(dev), fib6_ifup, &arg); } -struct arg_dev_net { - struct net_device *dev; - struct net *net; -}; - /* called with write lock held for table with rt */ -static int fib6_ifdown(struct rt6_info *rt, void *arg) +static int fib6_ifdown(struct rt6_info *rt, void *p_arg) { - const struct arg_dev_net *adn = arg; - const struct net_device *dev = adn->dev; + const struct arg_netdev_event *arg = p_arg; + const struct net_device *dev = arg->dev; + const struct net *net = dev_net(dev); if (rt->dst.dev == dev && - rt != adn->net->ipv6.ip6_null_entry && + rt != net->ipv6.ip6_null_entry && (rt->rt6i_nsiblings == 0 || netdev_unregistering(dev) || !rt->rt6i_idev->cnf.ignore_routes_with_linkdown)) { rt->rt6i_nh_flags |= (RTNH_F_DEAD | RTNH_F_LINKDOWN); @@ -3510,15 +3509,21 @@ static int fib6_ifdown(struct rt6_info *rt, void *arg) return 0; } -void rt6_ifdown(struct net *net, struct net_device *dev) +static void rt6_sync_down_dev(struct net_device *dev, unsigned long event) { - struct arg_dev_net adn = { + struct arg_netdev_event arg = { .dev = dev, - .net = net, + .event = event, }; - fib6_clean_all(net, fib6_ifdown, &adn); - rt6_uncached_list_flush_dev(net, dev); + fib6_clean_all(dev_net(dev), fib6_ifdown, &arg); +} + +void rt6_disable_ip(struct net_device *dev, unsigned long event) +{ + rt6_sync_down_dev(dev, event); + rt6_uncached_list_flush_dev(dev_net(dev), dev); + neigh_ifdown(&nd_tbl, dev); } struct rt6_mtu_change_arg {