diff options
Diffstat (limited to 'net/ipv4/ipmr.c')
-rw-r--r-- | net/ipv4/ipmr.c | 23 |
1 files changed, 15 insertions, 8 deletions
diff --git a/net/ipv4/ipmr.c b/net/ipv4/ipmr.c index 0ebae413ae87..d96582acdf69 100644 --- a/net/ipv4/ipmr.c +++ b/net/ipv4/ipmr.c | |||
@@ -152,9 +152,11 @@ struct net_device *ipmr_new_tunnel(struct vifctl *v) | |||
152 | dev->flags |= IFF_MULTICAST; | 152 | dev->flags |= IFF_MULTICAST; |
153 | 153 | ||
154 | in_dev = __in_dev_get_rtnl(dev); | 154 | in_dev = __in_dev_get_rtnl(dev); |
155 | if (in_dev == NULL && (in_dev = inetdev_init(dev)) == NULL) | 155 | if (in_dev == NULL) |
156 | goto failure; | 156 | goto failure; |
157 | in_dev->cnf.rp_filter = 0; | 157 | |
158 | ipv4_devconf_setall(in_dev); | ||
159 | IPV4_DEVCONF(in_dev->cnf, RP_FILTER) = 0; | ||
158 | 160 | ||
159 | if (dev_open(dev)) | 161 | if (dev_open(dev)) |
160 | goto failure; | 162 | goto failure; |
@@ -218,10 +220,15 @@ static struct net_device *ipmr_reg_vif(void) | |||
218 | } | 220 | } |
219 | dev->iflink = 0; | 221 | dev->iflink = 0; |
220 | 222 | ||
221 | if ((in_dev = inetdev_init(dev)) == NULL) | 223 | rcu_read_lock(); |
224 | if ((in_dev = __in_dev_get_rcu(dev)) == NULL) { | ||
225 | rcu_read_unlock(); | ||
222 | goto failure; | 226 | goto failure; |
227 | } | ||
223 | 228 | ||
224 | in_dev->cnf.rp_filter = 0; | 229 | ipv4_devconf_setall(in_dev); |
230 | IPV4_DEVCONF(in_dev->cnf, RP_FILTER) = 0; | ||
231 | rcu_read_unlock(); | ||
225 | 232 | ||
226 | if (dev_open(dev)) | 233 | if (dev_open(dev)) |
227 | goto failure; | 234 | goto failure; |
@@ -281,7 +288,7 @@ static int vif_delete(int vifi) | |||
281 | dev_set_allmulti(dev, -1); | 288 | dev_set_allmulti(dev, -1); |
282 | 289 | ||
283 | if ((in_dev = __in_dev_get_rtnl(dev)) != NULL) { | 290 | if ((in_dev = __in_dev_get_rtnl(dev)) != NULL) { |
284 | in_dev->cnf.mc_forwarding--; | 291 | IPV4_DEVCONF(in_dev->cnf, MC_FORWARDING)--; |
285 | ip_rt_multicast_event(in_dev); | 292 | ip_rt_multicast_event(in_dev); |
286 | } | 293 | } |
287 | 294 | ||
@@ -426,7 +433,7 @@ static int vif_add(struct vifctl *vifc, int mrtsock) | |||
426 | 433 | ||
427 | if ((in_dev = __in_dev_get_rtnl(dev)) == NULL) | 434 | if ((in_dev = __in_dev_get_rtnl(dev)) == NULL) |
428 | return -EADDRNOTAVAIL; | 435 | return -EADDRNOTAVAIL; |
429 | in_dev->cnf.mc_forwarding++; | 436 | IPV4_DEVCONF(in_dev->cnf, MC_FORWARDING)++; |
430 | dev_set_allmulti(dev, +1); | 437 | dev_set_allmulti(dev, +1); |
431 | ip_rt_multicast_event(in_dev); | 438 | ip_rt_multicast_event(in_dev); |
432 | 439 | ||
@@ -841,7 +848,7 @@ static void mrtsock_destruct(struct sock *sk) | |||
841 | { | 848 | { |
842 | rtnl_lock(); | 849 | rtnl_lock(); |
843 | if (sk == mroute_socket) { | 850 | if (sk == mroute_socket) { |
844 | ipv4_devconf.mc_forwarding--; | 851 | IPV4_DEVCONF_ALL(MC_FORWARDING)--; |
845 | 852 | ||
846 | write_lock_bh(&mrt_lock); | 853 | write_lock_bh(&mrt_lock); |
847 | mroute_socket=NULL; | 854 | mroute_socket=NULL; |
@@ -890,7 +897,7 @@ int ip_mroute_setsockopt(struct sock *sk,int optname,char __user *optval,int opt | |||
890 | mroute_socket=sk; | 897 | mroute_socket=sk; |
891 | write_unlock_bh(&mrt_lock); | 898 | write_unlock_bh(&mrt_lock); |
892 | 899 | ||
893 | ipv4_devconf.mc_forwarding++; | 900 | IPV4_DEVCONF_ALL(MC_FORWARDING)++; |
894 | } | 901 | } |
895 | rtnl_unlock(); | 902 | rtnl_unlock(); |
896 | return ret; | 903 | return ret; |