aboutsummaryrefslogtreecommitdiffstats
path: root/net/ipv6/route.c
diff options
context:
space:
mode:
authorDavid S. Miller <davem@davemloft.net>2011-07-18 02:09:49 -0400
committerDavid S. Miller <davem@davemloft.net>2011-07-18 02:11:35 -0400
commit69cce1d1404968f78b177a0314f5822d5afdbbfb (patch)
tree26223264fd69ea8078d0013fd5a76eb7aeb04c12 /net/ipv6/route.c
parent9cbb7ecbcff85077bb12301aaf4c9b5a56c5993d (diff)
net: Abstract dst->neighbour accesses behind helpers.
dst_{get,set}_neighbour() Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/ipv6/route.c')
-rw-r--r--net/ipv6/route.c39
1 files changed, 20 insertions, 19 deletions
diff --git a/net/ipv6/route.c b/net/ipv6/route.c
index c1515a3c130..2998cb5be90 100644
--- a/net/ipv6/route.c
+++ b/net/ipv6/route.c
@@ -356,7 +356,7 @@ out:
356#ifdef CONFIG_IPV6_ROUTER_PREF 356#ifdef CONFIG_IPV6_ROUTER_PREF
357static void rt6_probe(struct rt6_info *rt) 357static void rt6_probe(struct rt6_info *rt)
358{ 358{
359 struct neighbour *neigh = rt ? rt->dst.neighbour : NULL; 359 struct neighbour *neigh = rt ? dst_get_neighbour(&rt->dst) : NULL;
360 /* 360 /*
361 * Okay, this does not seem to be appropriate 361 * Okay, this does not seem to be appropriate
362 * for now, however, we need to check if it 362 * for now, however, we need to check if it
@@ -404,7 +404,7 @@ static inline int rt6_check_dev(struct rt6_info *rt, int oif)
404 404
405static inline int rt6_check_neigh(struct rt6_info *rt) 405static inline int rt6_check_neigh(struct rt6_info *rt)
406{ 406{
407 struct neighbour *neigh = rt->dst.neighbour; 407 struct neighbour *neigh = dst_get_neighbour(&rt->dst);
408 int m; 408 int m;
409 if (rt->rt6i_flags & RTF_NONEXTHOP || 409 if (rt->rt6i_flags & RTF_NONEXTHOP ||
410 !(rt->rt6i_flags & RTF_GATEWAY)) 410 !(rt->rt6i_flags & RTF_GATEWAY))
@@ -745,7 +745,7 @@ static struct rt6_info *rt6_alloc_cow(struct rt6_info *ort, const struct in6_add
745 dst_free(&rt->dst); 745 dst_free(&rt->dst);
746 return NULL; 746 return NULL;
747 } 747 }
748 rt->dst.neighbour = neigh; 748 dst_set_neighbour(&rt->dst, neigh);
749 749
750 } 750 }
751 751
@@ -760,7 +760,7 @@ static struct rt6_info *rt6_alloc_clone(struct rt6_info *ort, const struct in6_a
760 rt->rt6i_dst.plen = 128; 760 rt->rt6i_dst.plen = 128;
761 rt->rt6i_flags |= RTF_CACHE; 761 rt->rt6i_flags |= RTF_CACHE;
762 rt->dst.flags |= DST_HOST; 762 rt->dst.flags |= DST_HOST;
763 rt->dst.neighbour = neigh_clone(ort->dst.neighbour); 763 dst_set_neighbour(&rt->dst, neigh_clone(dst_get_neighbour(&ort->dst)));
764 } 764 }
765 return rt; 765 return rt;
766} 766}
@@ -794,7 +794,7 @@ restart:
794 dst_hold(&rt->dst); 794 dst_hold(&rt->dst);
795 read_unlock_bh(&table->tb6_lock); 795 read_unlock_bh(&table->tb6_lock);
796 796
797 if (!rt->dst.neighbour && !(rt->rt6i_flags & RTF_NONEXTHOP)) 797 if (!dst_get_neighbour(&rt->dst) && !(rt->rt6i_flags & RTF_NONEXTHOP))
798 nrt = rt6_alloc_cow(rt, &fl6->daddr, &fl6->saddr); 798 nrt = rt6_alloc_cow(rt, &fl6->daddr, &fl6->saddr);
799 else if (!(rt->dst.flags & DST_HOST)) 799 else if (!(rt->dst.flags & DST_HOST))
800 nrt = rt6_alloc_clone(rt, &fl6->daddr); 800 nrt = rt6_alloc_clone(rt, &fl6->daddr);
@@ -1058,7 +1058,7 @@ struct dst_entry *icmp6_dst_alloc(struct net_device *dev,
1058 } 1058 }
1059 1059
1060 rt->rt6i_idev = idev; 1060 rt->rt6i_idev = idev;
1061 rt->dst.neighbour = neigh; 1061 dst_set_neighbour(&rt->dst, neigh);
1062 atomic_set(&rt->dst.__refcnt, 1); 1062 atomic_set(&rt->dst.__refcnt, 1);
1063 dst_metric_set(&rt->dst, RTAX_HOPLIMIT, 255); 1063 dst_metric_set(&rt->dst, RTAX_HOPLIMIT, 255);
1064 rt->dst.output = ip6_output; 1064 rt->dst.output = ip6_output;
@@ -1338,12 +1338,12 @@ int ip6_route_add(struct fib6_config *cfg)
1338 rt->rt6i_prefsrc.plen = 0; 1338 rt->rt6i_prefsrc.plen = 0;
1339 1339
1340 if (cfg->fc_flags & (RTF_GATEWAY | RTF_NONEXTHOP)) { 1340 if (cfg->fc_flags & (RTF_GATEWAY | RTF_NONEXTHOP)) {
1341 rt->dst.neighbour = __neigh_lookup_errno(&nd_tbl, &rt->rt6i_gateway, dev); 1341 struct neighbour *n = __neigh_lookup_errno(&nd_tbl, &rt->rt6i_gateway, dev);
1342 if (IS_ERR(rt->dst.neighbour)) { 1342 if (IS_ERR(n)) {
1343 err = PTR_ERR(rt->dst.neighbour); 1343 err = PTR_ERR(n);
1344 rt->dst.neighbour = NULL;
1345 goto out; 1344 goto out;
1346 } 1345 }
1346 dst_set_neighbour(&rt->dst, n);
1347 } 1347 }
1348 1348
1349 rt->rt6i_flags = cfg->fc_flags; 1349 rt->rt6i_flags = cfg->fc_flags;
@@ -1574,7 +1574,7 @@ void rt6_redirect(const struct in6_addr *dest, const struct in6_addr *src,
1574 dst_confirm(&rt->dst); 1574 dst_confirm(&rt->dst);
1575 1575
1576 /* Duplicate redirect: silently ignore. */ 1576 /* Duplicate redirect: silently ignore. */
1577 if (neigh == rt->dst.neighbour) 1577 if (neigh == dst_get_neighbour(&rt->dst))
1578 goto out; 1578 goto out;
1579 1579
1580 nrt = ip6_rt_copy(rt); 1580 nrt = ip6_rt_copy(rt);
@@ -1590,7 +1590,7 @@ void rt6_redirect(const struct in6_addr *dest, const struct in6_addr *src,
1590 nrt->dst.flags |= DST_HOST; 1590 nrt->dst.flags |= DST_HOST;
1591 1591
1592 ipv6_addr_copy(&nrt->rt6i_gateway, (struct in6_addr*)neigh->primary_key); 1592 ipv6_addr_copy(&nrt->rt6i_gateway, (struct in6_addr*)neigh->primary_key);
1593 nrt->dst.neighbour = neigh_clone(neigh); 1593 dst_set_neighbour(&nrt->dst, neigh_clone(neigh));
1594 1594
1595 if (ip6_ins_rt(nrt)) 1595 if (ip6_ins_rt(nrt))
1596 goto out; 1596 goto out;
@@ -1670,7 +1670,7 @@ again:
1670 1. It is connected route. Action: COW 1670 1. It is connected route. Action: COW
1671 2. It is gatewayed route or NONEXTHOP route. Action: clone it. 1671 2. It is gatewayed route or NONEXTHOP route. Action: clone it.
1672 */ 1672 */
1673 if (!rt->dst.neighbour && !(rt->rt6i_flags & RTF_NONEXTHOP)) 1673 if (!dst_get_neighbour(&rt->dst) && !(rt->rt6i_flags & RTF_NONEXTHOP))
1674 nrt = rt6_alloc_cow(rt, daddr, saddr); 1674 nrt = rt6_alloc_cow(rt, daddr, saddr);
1675 else 1675 else
1676 nrt = rt6_alloc_clone(rt, daddr); 1676 nrt = rt6_alloc_clone(rt, daddr);
@@ -2035,7 +2035,7 @@ struct rt6_info *addrconf_dst_alloc(struct inet6_dev *idev,
2035 2035
2036 return ERR_CAST(neigh); 2036 return ERR_CAST(neigh);
2037 } 2037 }
2038 rt->dst.neighbour = neigh; 2038 dst_set_neighbour(&rt->dst, neigh);
2039 2039
2040 ipv6_addr_copy(&rt->rt6i_dst.addr, addr); 2040 ipv6_addr_copy(&rt->rt6i_dst.addr, addr);
2041 rt->rt6i_dst.plen = 128; 2041 rt->rt6i_dst.plen = 128;
@@ -2400,8 +2400,8 @@ static int rt6_fill_node(struct net *net,
2400 if (rtnetlink_put_metrics(skb, dst_metrics_ptr(&rt->dst)) < 0) 2400 if (rtnetlink_put_metrics(skb, dst_metrics_ptr(&rt->dst)) < 0)
2401 goto nla_put_failure; 2401 goto nla_put_failure;
2402 2402
2403 if (rt->dst.neighbour) 2403 if (dst_get_neighbour(&rt->dst))
2404 NLA_PUT(skb, RTA_GATEWAY, 16, &rt->dst.neighbour->primary_key); 2404 NLA_PUT(skb, RTA_GATEWAY, 16, &dst_get_neighbour(&rt->dst)->primary_key);
2405 2405
2406 if (rt->dst.dev) 2406 if (rt->dst.dev)
2407 NLA_PUT_U32(skb, RTA_OIF, rt->rt6i_dev->ifindex); 2407 NLA_PUT_U32(skb, RTA_OIF, rt->rt6i_dev->ifindex);
@@ -2585,6 +2585,7 @@ struct rt6_proc_arg
2585static int rt6_info_route(struct rt6_info *rt, void *p_arg) 2585static int rt6_info_route(struct rt6_info *rt, void *p_arg)
2586{ 2586{
2587 struct seq_file *m = p_arg; 2587 struct seq_file *m = p_arg;
2588 struct neighbour *n;
2588 2589
2589 seq_printf(m, "%pi6 %02x ", &rt->rt6i_dst.addr, rt->rt6i_dst.plen); 2590 seq_printf(m, "%pi6 %02x ", &rt->rt6i_dst.addr, rt->rt6i_dst.plen);
2590 2591
@@ -2593,9 +2594,9 @@ static int rt6_info_route(struct rt6_info *rt, void *p_arg)
2593#else 2594#else
2594 seq_puts(m, "00000000000000000000000000000000 00 "); 2595 seq_puts(m, "00000000000000000000000000000000 00 ");
2595#endif 2596#endif
2596 2597 n = dst_get_neighbour(&rt->dst);
2597 if (rt->dst.neighbour) { 2598 if (n) {
2598 seq_printf(m, "%pi6", rt->dst.neighbour->primary_key); 2599 seq_printf(m, "%pi6", n->primary_key);
2599 } else { 2600 } else {
2600 seq_puts(m, "00000000000000000000000000000000"); 2601 seq_puts(m, "00000000000000000000000000000000");
2601 } 2602 }