From patchwork Tue Mar 28 21:28:05 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: David Ahern X-Patchwork-Id: 744538 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 3vt3t444Mjz9s2Q for ; Wed, 29 Mar 2017 08:28:44 +1100 (AEDT) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=cumulusnetworks.com header.i=@cumulusnetworks.com header.b="guxgMZZN"; dkim-atps=neutral Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932595AbdC1V2n (ORCPT ); Tue, 28 Mar 2017 17:28:43 -0400 Received: from mail-it0-f41.google.com ([209.85.214.41]:34130 "EHLO mail-it0-f41.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752401AbdC1V2n (ORCPT ); Tue, 28 Mar 2017 17:28:43 -0400 Received: by mail-it0-f41.google.com with SMTP id y18so30240021itc.1 for ; Tue, 28 Mar 2017 14:28:37 -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=qQIBbdbfbdC6wfvMrwdqpjmFvaVgfCV1sOFjM3ACC/A=; b=guxgMZZNbbJoJkkdMtzolJfrROgi7HR5+5EPHr2jutfGdegBjT9lEpIuMuN7mgt6hk 3gCkjXHuBmijlBWq664Cuh6c40mliPjh4c50Pfq7klvd+LWknvhx7kLo2RZsRuJFscD6 8DUDPeT1xUCaMKrE/Yd+cal5C5KU08cH4LiBI= 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=qQIBbdbfbdC6wfvMrwdqpjmFvaVgfCV1sOFjM3ACC/A=; b=sytJm+Q9tc0p2xss8+gk4nAdnxRII7Me5hSXEaGGnXD9Iox9s+/B4FxvvAmTrPPOWD 8qgvUwvv5MCDYb58Ikr8YJZYR1KHr1W2MzHLi25UWZoaZ5lDL2mRUfOVOexL2MV80TKw IM0jQhL2Sz9BULjQy+FAGWq0ZQGod65mNLto3vWoaEInzeWx7zV1nnVOOBsndCA/OiQm 6OCcgeGftBztTEQOkS3cDbKy0x4IBZ3ZtupQUWuRPMHCvHhx+1uj0ylCZfVgMXG08Q0W ymF1s11JuVKiBfAQhHdQ+85cBw7qtuM1KioOn3svb9T1Cr3T3XCyQ8YWXxkrM95G+r7c DuMA== X-Gm-Message-State: AFeK/H0xDa7XnLRW4BAuAUS01TBRf5QGHQ2RIhamzClQbs/BEMHO1Tbq5DWhnuMlwNEuGYML X-Received: by 10.36.207.212 with SMTP id y203mr16877621itf.63.1490736496558; Tue, 28 Mar 2017 14:28:16 -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.15 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 28 Mar 2017 14:28:16 -0700 (PDT) From: David Ahern To: netdev@vger.kernel.org Cc: nicolas.dichtel@6wind.com, David Ahern Subject: [PATCH net-next 5/7] net: ipv6: Add support for RTM_DELNETCONF Date: Tue, 28 Mar 2017 14:28:05 -0700 Message-Id: <1490736487-16020-6-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 inet6_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/ipv6/addrconf.c | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index b8442be85e1b..67ec87ea5fb6 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c @@ -549,6 +549,9 @@ static int inet6_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, devconf->forwarding) < 0) goto nla_put_failure; @@ -567,6 +570,7 @@ static int inet6_netconf_fill_devconf(struct sk_buff *skb, int ifindex, devconf->ignore_routes_with_linkdown) < 0) goto nla_put_failure; +out: nlmsg_end(skb, nlh); return 0; @@ -6368,7 +6372,8 @@ static int __addrconf_sysctl_register(struct net *net, char *dev_name, return -ENOBUFS; } -static void __addrconf_sysctl_unregister(struct ipv6_devconf *p) +static void __addrconf_sysctl_unregister(struct net *net, + struct ipv6_devconf *p, int ifindex) { struct ctl_table *table; @@ -6379,6 +6384,8 @@ static void __addrconf_sysctl_unregister(struct ipv6_devconf *p) unregister_net_sysctl_table(p->sysctl_header); p->sysctl_header = NULL; kfree(table); + + inet6_netconf_notify_devconf(net, RTM_DELNETCONF, 0, ifindex, NULL); } static int addrconf_sysctl_register(struct inet6_dev *idev) @@ -6402,7 +6409,8 @@ static int addrconf_sysctl_register(struct inet6_dev *idev) static void addrconf_sysctl_unregister(struct inet6_dev *idev) { - __addrconf_sysctl_unregister(&idev->cnf); + __addrconf_sysctl_unregister(dev_net(idev->dev), &idev->cnf, + idev->dev->ifindex); neigh_sysctl_unregister(idev->nd_parms); } @@ -6445,7 +6453,7 @@ static int __net_init addrconf_init_net(struct net *net) #ifdef CONFIG_SYSCTL err_reg_dflt: - __addrconf_sysctl_unregister(all); + __addrconf_sysctl_unregister(net, all, NETCONFA_IFINDEX_ALL); err_reg_all: kfree(dflt); #endif @@ -6458,8 +6466,10 @@ static int __net_init addrconf_init_net(struct net *net) static void __net_exit addrconf_exit_net(struct net *net) { #ifdef CONFIG_SYSCTL - __addrconf_sysctl_unregister(net->ipv6.devconf_dflt); - __addrconf_sysctl_unregister(net->ipv6.devconf_all); + __addrconf_sysctl_unregister(net, net->ipv6.devconf_dflt, + NETCONFA_IFINDEX_DEFAULT); + __addrconf_sysctl_unregister(net, net->ipv6.devconf_all, + NETCONFA_IFINDEX_ALL); #endif kfree(net->ipv6.devconf_dflt); kfree(net->ipv6.devconf_all);