diff options
author | Daniel Lezcano <dlezcano@fr.ibm.com> | 2007-09-25 22:16:28 -0400 |
---|---|---|
committer | David S. Miller <davem@sunset.davemloft.net> | 2007-10-10 19:52:14 -0400 |
commit | de3cb747ffac5f2a4a6bb156e7e2fd5229e688e5 (patch) | |
tree | fe79764b8093843934c9b9f82f573e7a92cef406 /net/ipv6 | |
parent | 556829657397b9b05baec6691ead4e22ee8d1567 (diff) |
[NET]: Dynamically allocate the loopback device, part 1.
This patch replaces all occurences to the static variable
loopback_dev to a pointer loopback_dev. That provides the
mindless, trivial, uninteressting change part for the dynamic
allocation for the loopback.
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: Daniel Lezcano <dlezcano@fr.ibm.com>
Acked-By: Kirill Korotaev <dev@sw.ru>
Acked-by: Benjamin Thery <benjamin.thery@bull.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6')
-rw-r--r-- | net/ipv6/addrconf.c | 15 | ||||
-rw-r--r-- | net/ipv6/ip6_input.c | 2 | ||||
-rw-r--r-- | net/ipv6/netfilter/ip6t_REJECT.c | 2 | ||||
-rw-r--r-- | net/ipv6/route.c | 15 | ||||
-rw-r--r-- | net/ipv6/xfrm6_policy.c | 2 |
5 files changed, 18 insertions, 18 deletions
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c index 9c2e94f1c637..b43574f73375 100644 --- a/net/ipv6/addrconf.c +++ b/net/ipv6/addrconf.c | |||
@@ -2410,7 +2410,7 @@ static int addrconf_ifdown(struct net_device *dev, int how) | |||
2410 | 2410 | ||
2411 | ASSERT_RTNL(); | 2411 | ASSERT_RTNL(); |
2412 | 2412 | ||
2413 | if (dev == &loopback_dev && how == 1) | 2413 | if (dev == loopback_dev && how == 1) |
2414 | how = 0; | 2414 | how = 0; |
2415 | 2415 | ||
2416 | rt6_ifdown(dev); | 2416 | rt6_ifdown(dev); |
@@ -4212,16 +4212,19 @@ int __init addrconf_init(void) | |||
4212 | * device and it being up should be removed. | 4212 | * device and it being up should be removed. |
4213 | */ | 4213 | */ |
4214 | rtnl_lock(); | 4214 | rtnl_lock(); |
4215 | if (!ipv6_add_dev(&loopback_dev)) | 4215 | if (!ipv6_add_dev(loopback_dev)) |
4216 | err = -ENOMEM; | 4216 | err = -ENOMEM; |
4217 | rtnl_unlock(); | 4217 | rtnl_unlock(); |
4218 | if (err) | 4218 | if (err) |
4219 | return err; | 4219 | return err; |
4220 | 4220 | ||
4221 | ip6_null_entry.rt6i_idev = in6_dev_get(&loopback_dev); | 4221 | ip6_null_entry.u.dst.dev = loopback_dev; |
4222 | ip6_null_entry.rt6i_idev = in6_dev_get(loopback_dev); | ||
4222 | #ifdef CONFIG_IPV6_MULTIPLE_TABLES | 4223 | #ifdef CONFIG_IPV6_MULTIPLE_TABLES |
4223 | ip6_prohibit_entry.rt6i_idev = in6_dev_get(&loopback_dev); | 4224 | ip6_prohibit_entry.u.dst.dev = loopback_dev; |
4224 | ip6_blk_hole_entry.rt6i_idev = in6_dev_get(&loopback_dev); | 4225 | ip6_prohibit_entry.rt6i_idev = in6_dev_get(loopback_dev); |
4226 | ip6_blk_hole_entry.u.dst.dev = loopback_dev; | ||
4227 | ip6_blk_hole_entry.rt6i_idev = in6_dev_get(loopback_dev); | ||
4225 | #endif | 4228 | #endif |
4226 | 4229 | ||
4227 | register_netdevice_notifier(&ipv6_dev_notf); | 4230 | register_netdevice_notifier(&ipv6_dev_notf); |
@@ -4276,7 +4279,7 @@ void __exit addrconf_cleanup(void) | |||
4276 | continue; | 4279 | continue; |
4277 | addrconf_ifdown(dev, 1); | 4280 | addrconf_ifdown(dev, 1); |
4278 | } | 4281 | } |
4279 | addrconf_ifdown(&loopback_dev, 2); | 4282 | addrconf_ifdown(loopback_dev, 2); |
4280 | 4283 | ||
4281 | /* | 4284 | /* |
4282 | * Check hash table. | 4285 | * Check hash table. |
diff --git a/net/ipv6/ip6_input.c b/net/ipv6/ip6_input.c index 7d18cac3f110..9149fc239759 100644 --- a/net/ipv6/ip6_input.c +++ b/net/ipv6/ip6_input.c | |||
@@ -91,7 +91,7 @@ int ipv6_rcv(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt | |||
91 | * | 91 | * |
92 | * BTW, when we send a packet for our own local address on a | 92 | * BTW, when we send a packet for our own local address on a |
93 | * non-loopback interface (e.g. ethX), it is being delivered | 93 | * non-loopback interface (e.g. ethX), it is being delivered |
94 | * via the loopback interface (lo) here; skb->dev = &loopback_dev. | 94 | * via the loopback interface (lo) here; skb->dev = loopback_dev. |
95 | * It, however, should be considered as if it is being | 95 | * It, however, should be considered as if it is being |
96 | * arrived via the sending interface (ethX), because of the | 96 | * arrived via the sending interface (ethX), because of the |
97 | * nature of scoping architecture. --yoshfuji | 97 | * nature of scoping architecture. --yoshfuji |
diff --git a/net/ipv6/netfilter/ip6t_REJECT.c b/net/ipv6/netfilter/ip6t_REJECT.c index 2f487cda3b6b..50860531cd3c 100644 --- a/net/ipv6/netfilter/ip6t_REJECT.c +++ b/net/ipv6/netfilter/ip6t_REJECT.c | |||
@@ -167,7 +167,7 @@ static inline void | |||
167 | send_unreach(struct sk_buff *skb_in, unsigned char code, unsigned int hooknum) | 167 | send_unreach(struct sk_buff *skb_in, unsigned char code, unsigned int hooknum) |
168 | { | 168 | { |
169 | if (hooknum == NF_IP6_LOCAL_OUT && skb_in->dev == NULL) | 169 | if (hooknum == NF_IP6_LOCAL_OUT && skb_in->dev == NULL) |
170 | skb_in->dev = &loopback_dev; | 170 | skb_in->dev = loopback_dev; |
171 | 171 | ||
172 | icmpv6_send(skb_in, ICMPV6_DEST_UNREACH, code, 0, NULL); | 172 | icmpv6_send(skb_in, ICMPV6_DEST_UNREACH, code, 0, NULL); |
173 | } | 173 | } |
diff --git a/net/ipv6/route.c b/net/ipv6/route.c index 104070e92cea..a7a21a7ba790 100644 --- a/net/ipv6/route.c +++ b/net/ipv6/route.c | |||
@@ -138,7 +138,6 @@ struct rt6_info ip6_null_entry = { | |||
138 | .dst = { | 138 | .dst = { |
139 | .__refcnt = ATOMIC_INIT(1), | 139 | .__refcnt = ATOMIC_INIT(1), |
140 | .__use = 1, | 140 | .__use = 1, |
141 | .dev = &loopback_dev, | ||
142 | .obsolete = -1, | 141 | .obsolete = -1, |
143 | .error = -ENETUNREACH, | 142 | .error = -ENETUNREACH, |
144 | .metrics = { [RTAX_HOPLIMIT - 1] = 255, }, | 143 | .metrics = { [RTAX_HOPLIMIT - 1] = 255, }, |
@@ -164,7 +163,6 @@ struct rt6_info ip6_prohibit_entry = { | |||
164 | .dst = { | 163 | .dst = { |
165 | .__refcnt = ATOMIC_INIT(1), | 164 | .__refcnt = ATOMIC_INIT(1), |
166 | .__use = 1, | 165 | .__use = 1, |
167 | .dev = &loopback_dev, | ||
168 | .obsolete = -1, | 166 | .obsolete = -1, |
169 | .error = -EACCES, | 167 | .error = -EACCES, |
170 | .metrics = { [RTAX_HOPLIMIT - 1] = 255, }, | 168 | .metrics = { [RTAX_HOPLIMIT - 1] = 255, }, |
@@ -184,7 +182,6 @@ struct rt6_info ip6_blk_hole_entry = { | |||
184 | .dst = { | 182 | .dst = { |
185 | .__refcnt = ATOMIC_INIT(1), | 183 | .__refcnt = ATOMIC_INIT(1), |
186 | .__use = 1, | 184 | .__use = 1, |
187 | .dev = &loopback_dev, | ||
188 | .obsolete = -1, | 185 | .obsolete = -1, |
189 | .error = -EINVAL, | 186 | .error = -EINVAL, |
190 | .metrics = { [RTAX_HOPLIMIT - 1] = 255, }, | 187 | .metrics = { [RTAX_HOPLIMIT - 1] = 255, }, |
@@ -224,8 +221,8 @@ static void ip6_dst_ifdown(struct dst_entry *dst, struct net_device *dev, | |||
224 | struct rt6_info *rt = (struct rt6_info *)dst; | 221 | struct rt6_info *rt = (struct rt6_info *)dst; |
225 | struct inet6_dev *idev = rt->rt6i_idev; | 222 | struct inet6_dev *idev = rt->rt6i_idev; |
226 | 223 | ||
227 | if (dev != &loopback_dev && idev != NULL && idev->dev == dev) { | 224 | if (dev != loopback_dev && idev != NULL && idev->dev == dev) { |
228 | struct inet6_dev *loopback_idev = in6_dev_get(&loopback_dev); | 225 | struct inet6_dev *loopback_idev = in6_dev_get(loopback_dev); |
229 | if (loopback_idev != NULL) { | 226 | if (loopback_idev != NULL) { |
230 | rt->rt6i_idev = loopback_idev; | 227 | rt->rt6i_idev = loopback_idev; |
231 | in6_dev_put(idev); | 228 | in6_dev_put(idev); |
@@ -1188,12 +1185,12 @@ int ip6_route_add(struct fib6_config *cfg) | |||
1188 | if ((cfg->fc_flags & RTF_REJECT) || | 1185 | if ((cfg->fc_flags & RTF_REJECT) || |
1189 | (dev && (dev->flags&IFF_LOOPBACK) && !(addr_type&IPV6_ADDR_LOOPBACK))) { | 1186 | (dev && (dev->flags&IFF_LOOPBACK) && !(addr_type&IPV6_ADDR_LOOPBACK))) { |
1190 | /* hold loopback dev/idev if we haven't done so. */ | 1187 | /* hold loopback dev/idev if we haven't done so. */ |
1191 | if (dev != &loopback_dev) { | 1188 | if (dev != loopback_dev) { |
1192 | if (dev) { | 1189 | if (dev) { |
1193 | dev_put(dev); | 1190 | dev_put(dev); |
1194 | in6_dev_put(idev); | 1191 | in6_dev_put(idev); |
1195 | } | 1192 | } |
1196 | dev = &loopback_dev; | 1193 | dev = loopback_dev; |
1197 | dev_hold(dev); | 1194 | dev_hold(dev); |
1198 | idev = in6_dev_get(dev); | 1195 | idev = in6_dev_get(dev); |
1199 | if (!idev) { | 1196 | if (!idev) { |
@@ -1897,13 +1894,13 @@ struct rt6_info *addrconf_dst_alloc(struct inet6_dev *idev, | |||
1897 | if (rt == NULL) | 1894 | if (rt == NULL) |
1898 | return ERR_PTR(-ENOMEM); | 1895 | return ERR_PTR(-ENOMEM); |
1899 | 1896 | ||
1900 | dev_hold(&loopback_dev); | 1897 | dev_hold(loopback_dev); |
1901 | in6_dev_hold(idev); | 1898 | in6_dev_hold(idev); |
1902 | 1899 | ||
1903 | rt->u.dst.flags = DST_HOST; | 1900 | rt->u.dst.flags = DST_HOST; |
1904 | rt->u.dst.input = ip6_input; | 1901 | rt->u.dst.input = ip6_input; |
1905 | rt->u.dst.output = ip6_output; | 1902 | rt->u.dst.output = ip6_output; |
1906 | rt->rt6i_dev = &loopback_dev; | 1903 | rt->rt6i_dev = loopback_dev; |
1907 | rt->rt6i_idev = idev; | 1904 | rt->rt6i_idev = idev; |
1908 | rt->u.dst.metrics[RTAX_MTU-1] = ipv6_get_mtu(rt->rt6i_dev); | 1905 | rt->u.dst.metrics[RTAX_MTU-1] = ipv6_get_mtu(rt->rt6i_dev); |
1909 | rt->u.dst.metrics[RTAX_ADVMSS-1] = ipv6_advmss(dst_mtu(&rt->u.dst)); | 1906 | rt->u.dst.metrics[RTAX_ADVMSS-1] = ipv6_advmss(dst_mtu(&rt->u.dst)); |
diff --git a/net/ipv6/xfrm6_policy.c b/net/ipv6/xfrm6_policy.c index 3ec0c4770ee3..cc07216cfd59 100644 --- a/net/ipv6/xfrm6_policy.c +++ b/net/ipv6/xfrm6_policy.c | |||
@@ -375,7 +375,7 @@ static void xfrm6_dst_ifdown(struct dst_entry *dst, struct net_device *dev, | |||
375 | 375 | ||
376 | xdst = (struct xfrm_dst *)dst; | 376 | xdst = (struct xfrm_dst *)dst; |
377 | if (xdst->u.rt6.rt6i_idev->dev == dev) { | 377 | if (xdst->u.rt6.rt6i_idev->dev == dev) { |
378 | struct inet6_dev *loopback_idev = in6_dev_get(&loopback_dev); | 378 | struct inet6_dev *loopback_idev = in6_dev_get(loopback_dev); |
379 | BUG_ON(!loopback_idev); | 379 | BUG_ON(!loopback_idev); |
380 | 380 | ||
381 | do { | 381 | do { |