From patchwork Wed Mar 2 16:43:06 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andy Gospodarek X-Patchwork-Id: 591042 X-Patchwork-Delegate: davem@davemloft.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 1031B1402D6 for ; Thu, 3 Mar 2016 03:44:13 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=cumulusnetworks.com header.i=@cumulusnetworks.com header.b=gD4HhILX; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752217AbcCBQoH (ORCPT ); Wed, 2 Mar 2016 11:44:07 -0500 Received: from mail-qg0-f52.google.com ([209.85.192.52]:36492 "EHLO mail-qg0-f52.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750977AbcCBQoF (ORCPT ); Wed, 2 Mar 2016 11:44:05 -0500 Received: by mail-qg0-f52.google.com with SMTP id u110so44344177qge.3 for ; Wed, 02 Mar 2016 08:44:04 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cumulusnetworks.com; s=google; h=from:to:cc:subject:date:message-id; bh=31t3PXdHuQHNCjVNTu9JvAphavIuOT+PuUK/71RPtuQ=; b=gD4HhILXA0orBJWj1jR3JMTo/MCFuVwanSq04/fdFjTUE5DCxcbCD+ctDEkUUg7/6c a6HNaPbgSs0fw2tiDqpVU9P2s8wic30gwd18T7Fgo65C4FvgZIgI//RjbGS8KDJnjFoT jz20zJD6Hex8x8rMY181E4n6V9KipmLonEvyA= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id; bh=31t3PXdHuQHNCjVNTu9JvAphavIuOT+PuUK/71RPtuQ=; b=RxUZifyfpYXQBjplHoUN3aoPKZNeD3Ph7t3lzrNieZm0O07eua8G77iHRnAuLaNwSJ 4MJWMA85Z19Jxd+PJ4dQyyAAo1etdUdaINHl0cSBCdmbr07TATbbQCSapn0bEafUfZQ7 eB+QVfuiYk+wsAm4fDnjACW0DIWfY2Sx5Cw6fJxDJ5eP6wDPHP35i/vB1uWUTFsoDn72 dzxHf7xGT8qWU6AsolkDlxe7cQvPbM0kMHctWis5eouDeU/F/qrbyzGK2F6n7UiCXrKH bAgZD0amRSGBB5cFzgbEBPnJm1f0CJZ4+nsUwxrbmiM8dQRV//c0YPKOW6zL/qAD0PVk bHyA== X-Gm-Message-State: AD7BkJJ2HHLNz6JOIELwM/n0GbgzlBovSGlmp3Tvo+aeotTDGnZPx9kwafUrGsmqfGyIziIC X-Received: by 10.140.169.9 with SMTP id p9mr36340612qhp.50.1456937043734; Wed, 02 Mar 2016 08:44:03 -0800 (PST) Received: from fedora-devel.rdu.cumulusnetworks.com (42-10-255-199.rev.celito.net. [199.255.10.42]) by smtp.googlemail.com with ESMTPSA id x136sm15331053qka.0.2016.03.02.08.44.02 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Wed, 02 Mar 2016 08:44:03 -0800 (PST) From: Andy Gospodarek To: netdev@vger.kernel.org Cc: Andy Gospodarek Subject: [PATCH net-next] ipv4: properly apply change to ignore_routes_on_linkdown to all interfaces Date: Wed, 2 Mar 2016 11:43:06 -0500 Message-Id: <1456936986-2042-1-git-send-email-gospo@cumulusnetworks.com> X-Mailer: git-send-email 1.9.3 Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Any change to sysctl net.ipv4.conf.all.ignore_routes_with_linkdown does not result in a change to all interfaces on the system. This means that any devices initialized before sysctl settings are applied on boot do not see a change if the sysctl setting is different than what the stack has as a default ('0' in this case). This patch changes the net.ipv4.conf.all.ignore_routes_with_linkdown setting to match what is done for forwarding for ipv4 and for ignore_routes_with_linkdown for ipv6. The current behavior was not intentional and had I recognized this corner-case before posting I would have done this with the first series. Fixes: 0eeb075fad73 ("net: ipv4 sysctl option to ignore routes when nexthop link is down") Signed-off-by: Andy Gospodarek --- Generic infrastructure could be added to do this for all values, but I'm hesitant to do this since historically users are probably depending on the exiting behavior (whether intentional or not) for the more widely used sysctls. net/ipv4/devinet.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 75 insertions(+), 2 deletions(-) diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c index 8c3df2c..d247e41 100644 --- a/net/ipv4/devinet.c +++ b/net/ipv4/devinet.c @@ -2030,6 +2030,36 @@ static void inet_forward_change(struct net *net) } } +/* called with RTNL locked */ +static void inet_ignore_routes_change(struct net *net) +{ + struct net_device *dev; + int on = IPV4_DEVCONF_ALL(net, IGNORE_ROUTES_WITH_LINKDOWN); + + IPV4_DEVCONF_DFLT(net, IGNORE_ROUTES_WITH_LINKDOWN) = on; + inet_netconf_notify_devconf(net, NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN, + NETCONFA_IFINDEX_ALL, + net->ipv4.devconf_all); + inet_netconf_notify_devconf(net, NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN, + NETCONFA_IFINDEX_DEFAULT, + net->ipv4.devconf_dflt); + + for_each_netdev(net, dev) { + struct in_device *in_dev; + + rcu_read_lock(); + in_dev = __in_dev_get_rcu(dev); + if (in_dev) { + IN_DEV_CONF_SET(in_dev, + IGNORE_ROUTES_WITH_LINKDOWN, on); + inet_netconf_notify_devconf(net, + NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN, + dev->ifindex, &in_dev->cnf); + } + rcu_read_unlock(); + } +} + static int devinet_conf_ifindex(struct net *net, struct ipv4_devconf *cnf) { if (cnf == net->ipv4.devconf_dflt) @@ -2147,6 +2177,48 @@ static int ipv4_doint_and_flush(struct ctl_table *ctl, int write, return ret; } +static int devinet_sysctl_ignore_routes(struct ctl_table *ctl, int write, + void __user *buffer, + size_t *lenp, loff_t *ppos) +{ + int *valp = ctl->data; + int val = *valp; + loff_t pos = *ppos; + int ret = proc_dointvec(ctl, write, buffer, lenp, ppos); + + if (write && *valp != val) { + struct net *net = ctl->extra2; + + if (valp != &IPV4_DEVCONF_DFLT(net, IGNORE_ROUTES_WITH_LINKDOWN)) { + if (!rtnl_trylock()) { + /* Restore the original values before restarting */ + *valp = val; + *ppos = pos; + return restart_syscall(); + } + if (valp == &IPV4_DEVCONF_ALL(net, IGNORE_ROUTES_WITH_LINKDOWN)) { + inet_ignore_routes_change(net); + } else { + struct ipv4_devconf *cnf = ctl->extra1; + struct in_device *idev = + container_of(cnf, struct in_device, cnf); + inet_netconf_notify_devconf(net, + NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN, + idev->dev->ifindex, + cnf); + } + rtnl_unlock(); + rt_cache_flush(net); + } else + inet_netconf_notify_devconf(net, + NETCONFA_IGNORE_ROUTES_WITH_LINKDOWN, + NETCONFA_IFINDEX_DEFAULT, + net->ipv4.devconf_dflt); + } + + return ret; +} + #define DEVINET_SYSCTL_ENTRY(attr, name, mval, proc) \ { \ .procname = name, \ @@ -2205,8 +2277,9 @@ static struct devinet_sysctl_table { "igmpv2_unsolicited_report_interval"), DEVINET_SYSCTL_RW_ENTRY(IGMPV3_UNSOLICITED_REPORT_INTERVAL, "igmpv3_unsolicited_report_interval"), - DEVINET_SYSCTL_RW_ENTRY(IGNORE_ROUTES_WITH_LINKDOWN, - "ignore_routes_with_linkdown"), + DEVINET_SYSCTL_COMPLEX_ENTRY(IGNORE_ROUTES_WITH_LINKDOWN, + "ignore_routes_with_linkdown", + devinet_sysctl_ignore_routes), DEVINET_SYSCTL_RW_ENTRY(DROP_GRATUITOUS_ARP, "drop_gratuitous_arp"),