diff options
| author | Nicolas Dichtel <nicolas.dichtel@6wind.com> | 2012-12-04 01:13:35 +0000 | 
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2012-12-04 13:08:10 -0500 | 
| commit | d67b8c616b48df30e2836d797795f2420d109bc9 (patch) | |
| tree | e06b3f77e905e789def714958fcd455c8b3c037b /net/ipv4/ipmr.c | |
| parent | e8ad1a8fab6f550aba1f1fe7ba26749ff5460751 (diff) | |
| download | olio-linux-3.10-d67b8c616b48df30e2836d797795f2420d109bc9.tar.xz olio-linux-3.10-d67b8c616b48df30e2836d797795f2420d109bc9.zip  | |
netconf: advertise mc_forwarding status
This patch advertise the MC_FORWARDING status for IPv4 and IPv6.
This field is readonly, only multicast engine in the kernel updates it.
Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv4/ipmr.c')
| -rw-r--r-- | net/ipv4/ipmr.c | 12 | 
1 files changed, 12 insertions, 0 deletions
diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c index 58e4160fdce..0c452e3fdc1 100644 --- a/net/ipv4/ipmr.c +++ b/net/ipv4/ipmr.c @@ -65,6 +65,7 @@  #include <net/checksum.h>  #include <net/netlink.h>  #include <net/fib_rules.h> +#include <linux/netconf.h>  #if defined(CONFIG_IP_PIMSM_V1) || defined(CONFIG_IP_PIMSM_V2)  #define CONFIG_IP_PIMSM	1 @@ -582,6 +583,9 @@ static int vif_delete(struct mr_table *mrt, int vifi, int notify,  	in_dev = __in_dev_get_rtnl(dev);  	if (in_dev) {  		IPV4_DEVCONF(in_dev->cnf, MC_FORWARDING)--; +		inet_netconf_notify_devconf(dev_net(dev), +					    NETCONFA_MC_FORWARDING, +					    dev->ifindex, &in_dev->cnf);  		ip_rt_multicast_event(in_dev);  	} @@ -772,6 +776,8 @@ static int vif_add(struct net *net, struct mr_table *mrt,  		return -EADDRNOTAVAIL;  	}  	IPV4_DEVCONF(in_dev->cnf, MC_FORWARDING)++; +	inet_netconf_notify_devconf(net, NETCONFA_MC_FORWARDING, dev->ifindex, +				    &in_dev->cnf);  	ip_rt_multicast_event(in_dev);  	/* Fill in the VIF structures */ @@ -1185,6 +1191,9 @@ static void mrtsock_destruct(struct sock *sk)  	ipmr_for_each_table(mrt, net) {  		if (sk == rtnl_dereference(mrt->mroute_sk)) {  			IPV4_DEVCONF_ALL(net, MC_FORWARDING)--; +			inet_netconf_notify_devconf(net, NETCONFA_MC_FORWARDING, +						    NETCONFA_IFINDEX_ALL, +						    net->ipv4.devconf_all);  			RCU_INIT_POINTER(mrt->mroute_sk, NULL);  			mroute_clean_tables(mrt);  		} @@ -1236,6 +1245,9 @@ int ip_mroute_setsockopt(struct sock *sk, int optname, char __user *optval, unsi  		if (ret == 0) {  			rcu_assign_pointer(mrt->mroute_sk, sk);  			IPV4_DEVCONF_ALL(net, MC_FORWARDING)++; +			inet_netconf_notify_devconf(net, NETCONFA_MC_FORWARDING, +						    NETCONFA_IFINDEX_ALL, +						    net->ipv4.devconf_all);  		}  		rtnl_unlock();  		return ret;  |