aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv6
diff options
context:
space:
mode:
authorDaniel Lezcano <dlezcano@fr.ibm.com>2007-09-25 22:16:28 -0400
committerDavid S. Miller <davem@sunset.davemloft.net>2007-10-10 19:52:14 -0400
commitde3cb747ffac5f2a4a6bb156e7e2fd5229e688e5 (patch)
treefe79764b8093843934c9b9f82f573e7a92cef406 /net/ipv6
parent556829657397b9b05baec6691ead4e22ee8d1567 (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.c15
-rw-r--r--net/ipv6/ip6_input.c2
-rw-r--r--net/ipv6/netfilter/ip6t_REJECT.c2
-rw-r--r--net/ipv6/route.c15
-rw-r--r--net/ipv6/xfrm6_policy.c2
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
167send_unreach(struct sk_buff *skb_in, unsigned char code, unsigned int hooknum) 167send_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 {