From patchwork Tue Mar 28 21:28:03 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Ahern X-Patchwork-Id: 744536 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 3vt3sg0xJqz9s3w for ; Wed, 29 Mar 2017 08:28:23 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=cumulusnetworks.com header.i=@cumulusnetworks.com header.b="VigclUOQ"; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932543AbdC1V2S (ORCPT ); Tue, 28 Mar 2017 17:28:18 -0400 Received: from mail-it0-f54.google.com ([209.85.214.54]:35251 "EHLO mail-it0-f54.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1753422AbdC1V2Q (ORCPT ); Tue, 28 Mar 2017 17:28:16 -0400 Received: by mail-it0-f54.google.com with SMTP id y18so130330431itc.0 for ; Tue, 28 Mar 2017 14:28:15 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=cumulusnetworks.com; s=google; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=FpPxAoQOKeR8QCWZGnkBcKb6IltEW7zeD0STS1O3nOc=; b=VigclUOQ2LymxDUUXho4Ud9UHMjh89jqt+MUldAOoDcFFfiUv1ThfyUnJwwwUOCEh/ L5MbAI47+fVHI3U2TNV6hk+v9aThMeRh76asdpif75Wkk1sXPIirINNn4IkFGtichXC6 /uDF2dr/5LcXfcEfTSGlu52AcE9t2s2fJHP04= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=FpPxAoQOKeR8QCWZGnkBcKb6IltEW7zeD0STS1O3nOc=; b=PiIpdIvjNVqKU26hSCchFbHaLykIIi+00NdlYaNjiBZUKo84JiAmvNSPnTZOxE+JGg 22fsb4EJfMi0acFGn/GtZQL/wjBaBjOBNRTjQbRUP3dxNaAfluAkdum87FT6xIQXg+e5 CATAlQVa3cdDUJrOIDUqXjQs7nSpOhwsb1HTQz9jWrzOK5/Bu2jFcJGmmF9dW5HxxWym R4PIqkW2ybAnyr3Z2wKfEmIRlRu9tyrnMbkLmimYAFN3r00FfPY/W7QVo+T7gMnpCcNG E4QSbbNtp/GwY1YovoKDszZ2s9l1fYx6H3J+J8Fx/LzBbPEzsIFy1sxVuCFzkD76tP9R ZXEA== X-Gm-Message-State: AFeK/H2VlJ7eOedRlJqZcMSSx3J1HyEk6WfK/lv3xXDKUDy6fv5OwJ8GGmuHIleeO0Jbfspg X-Received: by 10.36.127.3 with SMTP id r3mr6120169itc.3.1490736494826; Tue, 28 Mar 2017 14:28:14 -0700 (PDT) Received: from kenny.it.cumulusnetworks.com. ([216.129.126.126]) by smtp.googlemail.com with ESMTPSA id k186sm2123144ita.30.2017.03.28.14.28.14 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 28 Mar 2017 14:28:14 -0700 (PDT) From: David Ahern To: netdev@vger.kernel.org Cc: nicolas.dichtel@6wind.com, David Ahern Subject: [PATCH net-next 3/7] net: devinet: Add support for RTM_DELNETCONF Date: Tue, 28 Mar 2017 14:28:03 -0700 Message-Id: <1490736487-16020-4-git-send-email-dsa@cumulusnetworks.com> X-Mailer: git-send-email 2.1.4 In-Reply-To: <1490736487-16020-1-git-send-email-dsa@cumulusnetworks.com> References: <1490736487-16020-1-git-send-email-dsa@cumulusnetworks.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org Send RTM_DELNETCONF notifications when a device is deleted. The message only needs the device index, so modify inet_netconf_fill_devconf to skip devconf references if it is NULL. Allows a userspace cache to remove entries as devices are deleted. Signed-off-by: David Ahern --- net/ipv4/devinet.c | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c index fd3218cd1870..6d3602ec640c 100644 --- a/net/ipv4/devinet.c +++ b/net/ipv4/devinet.c @@ -1802,6 +1802,9 @@ static int inet_netconf_fill_devconf(struct sk_buff *skb, int ifindex, if (nla_put_s32(skb, NETCONFA_IFINDEX, ifindex) < 0) goto nla_put_failure; + if (!devconf) + goto out; + if ((all || type == NETCONFA_FORWARDING) && nla_put_s32(skb, NETCONFA_FORWARDING, IPV4_DEVCONF(*devconf, FORWARDING)) < 0) @@ -1823,6 +1826,7 @@ static int inet_netconf_fill_devconf(struct sk_buff *skb, int ifindex, IPV4_DEVCONF(*devconf, IGNORE_ROUTES_WITH_LINKDOWN)) < 0) goto nla_put_failure; +out: nlmsg_end(skb, nlh); return 0; @@ -2276,16 +2280,18 @@ static int __devinet_sysctl_register(struct net *net, char *dev_name, return -ENOBUFS; } -static void __devinet_sysctl_unregister(struct ipv4_devconf *cnf) +static void __devinet_sysctl_unregister(struct net *net, + struct ipv4_devconf *cnf, int ifindex) { struct devinet_sysctl_table *t = cnf->sysctl; - if (!t) - return; + if (t) { + cnf->sysctl = NULL; + unregister_net_sysctl_table(t->sysctl_header); + kfree(t); + } - cnf->sysctl = NULL; - unregister_net_sysctl_table(t->sysctl_header); - kfree(t); + inet_netconf_notify_devconf(net, RTM_DELNETCONF, 0, ifindex, NULL); } static int devinet_sysctl_register(struct in_device *idev) @@ -2307,7 +2313,9 @@ static int devinet_sysctl_register(struct in_device *idev) static void devinet_sysctl_unregister(struct in_device *idev) { - __devinet_sysctl_unregister(&idev->cnf); + struct net *net = dev_net(idev->dev); + + __devinet_sysctl_unregister(net, &idev->cnf, idev->dev->ifindex); neigh_sysctl_unregister(idev->arp_parms); } @@ -2382,9 +2390,9 @@ static __net_init int devinet_init_net(struct net *net) #ifdef CONFIG_SYSCTL err_reg_ctl: - __devinet_sysctl_unregister(dflt); + __devinet_sysctl_unregister(net, dflt, NETCONFA_IFINDEX_DEFAULT); err_reg_dflt: - __devinet_sysctl_unregister(all); + __devinet_sysctl_unregister(net, all, NETCONFA_IFINDEX_ALL); err_reg_all: if (tbl != ctl_forward_entry) kfree(tbl); @@ -2406,8 +2414,10 @@ static __net_exit void devinet_exit_net(struct net *net) tbl = net->ipv4.forw_hdr->ctl_table_arg; unregister_net_sysctl_table(net->ipv4.forw_hdr); - __devinet_sysctl_unregister(net->ipv4.devconf_dflt); - __devinet_sysctl_unregister(net->ipv4.devconf_all); + __devinet_sysctl_unregister(net, net->ipv4.devconf_dflt, + NETCONFA_IFINDEX_DEFAULT); + __devinet_sysctl_unregister(net, net->ipv4.devconf_all, + NETCONFA_IFINDEX_ALL); kfree(tbl); #endif kfree(net->ipv4.devconf_dflt);