aboutsummaryrefslogtreecommitdiffstats
path: root/net
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
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')
-rw-r--r--net/atm/clip.c16
-rw-r--r--net/bridge/br_netfilter.c2
-rw-r--r--net/core/dst.c10
-rw-r--r--net/core/neighbour.c7
-rw-r--r--net/decnet/dn_neigh.c2
-rw-r--r--net/decnet/dn_route.c18
-rw-r--r--net/ipv4/ip_gre.c2
-rw-r--r--net/ipv4/ip_output.c2
-rw-r--r--net/ipv4/route.c25
-rw-r--r--net/ipv6/addrconf.c2
-rw-r--r--net/ipv6/ip6_fib.c2
-rw-r--r--net/ipv6/ip6_output.c16
-rw-r--r--net/ipv6/ndisc.c4
-rw-r--r--net/ipv6/route.c39
-rw-r--r--net/ipv6/sit.c4
-rw-r--r--net/sched/sch_teql.c4
-rw-r--r--net/xfrm/xfrm_policy.c2
17 files changed, 85 insertions, 72 deletions
diff --git a/net/atm/clip.c b/net/atm/clip.c
index c6cd5318be3f..4bc8c67ecb14 100644
--- a/net/atm/clip.c
+++ b/net/atm/clip.c
@@ -362,33 +362,37 @@ static netdev_tx_t clip_start_xmit(struct sk_buff *skb,
362 struct net_device *dev) 362 struct net_device *dev)
363{ 363{
364 struct clip_priv *clip_priv = PRIV(dev); 364 struct clip_priv *clip_priv = PRIV(dev);
365 struct dst_entry *dst = skb_dst(skb);
365 struct atmarp_entry *entry; 366 struct atmarp_entry *entry;
367 struct neighbour *n;
366 struct atm_vcc *vcc; 368 struct atm_vcc *vcc;
367 int old; 369 int old;
368 unsigned long flags; 370 unsigned long flags;
369 371
370 pr_debug("(skb %p)\n", skb); 372 pr_debug("(skb %p)\n", skb);
371 if (!skb_dst(skb)) { 373 if (!dst) {
372 pr_err("skb_dst(skb) == NULL\n"); 374 pr_err("skb_dst(skb) == NULL\n");
373 dev_kfree_skb(skb); 375 dev_kfree_skb(skb);
374 dev->stats.tx_dropped++; 376 dev->stats.tx_dropped++;
375 return NETDEV_TX_OK; 377 return NETDEV_TX_OK;
376 } 378 }
377 if (!skb_dst(skb)->neighbour) { 379 n = dst_get_neighbour(dst);
380 if (!n) {
378#if 0 381#if 0
379 skb_dst(skb)->neighbour = clip_find_neighbour(skb_dst(skb), 1); 382 n = clip_find_neighbour(skb_dst(skb), 1);
380 if (!skb_dst(skb)->neighbour) { 383 if (!n) {
381 dev_kfree_skb(skb); /* lost that one */ 384 dev_kfree_skb(skb); /* lost that one */
382 dev->stats.tx_dropped++; 385 dev->stats.tx_dropped++;
383 return 0; 386 return 0;
384 } 387 }
388 dst_set_neighbour(dst, n);
385#endif 389#endif
386 pr_err("NO NEIGHBOUR !\n"); 390 pr_err("NO NEIGHBOUR !\n");
387 dev_kfree_skb(skb); 391 dev_kfree_skb(skb);
388 dev->stats.tx_dropped++; 392 dev->stats.tx_dropped++;
389 return NETDEV_TX_OK; 393 return NETDEV_TX_OK;
390 } 394 }
391 entry = NEIGH2ENTRY(skb_dst(skb)->neighbour); 395 entry = NEIGH2ENTRY(n);
392 if (!entry->vccs) { 396 if (!entry->vccs) {
393 if (time_after(jiffies, entry->expires)) { 397 if (time_after(jiffies, entry->expires)) {
394 /* should be resolved */ 398 /* should be resolved */
@@ -405,7 +409,7 @@ static netdev_tx_t clip_start_xmit(struct sk_buff *skb,
405 } 409 }
406 pr_debug("neigh %p, vccs %p\n", entry, entry->vccs); 410 pr_debug("neigh %p, vccs %p\n", entry, entry->vccs);
407 ATM_SKB(skb)->vcc = vcc = entry->vccs->vcc; 411 ATM_SKB(skb)->vcc = vcc = entry->vccs->vcc;
408 pr_debug("using neighbour %p, vcc %p\n", skb_dst(skb)->neighbour, vcc); 412 pr_debug("using neighbour %p, vcc %p\n", n, vcc);
409 if (entry->vccs->encap) { 413 if (entry->vccs->encap) {
410 void *here; 414 void *here;
411 415
diff --git a/net/bridge/br_netfilter.c b/net/bridge/br_netfilter.c
index 1fe43fdf9973..b1a5f9777b7e 100644
--- a/net/bridge/br_netfilter.c
+++ b/net/bridge/br_netfilter.c
@@ -350,7 +350,7 @@ static int br_nf_pre_routing_finish_bridge(struct sk_buff *skb)
350 if (!skb->dev) 350 if (!skb->dev)
351 goto free_skb; 351 goto free_skb;
352 dst = skb_dst(skb); 352 dst = skb_dst(skb);
353 neigh = dst->neighbour; 353 neigh = dst_get_neighbour(dst);
354 if (neigh->hh.hh_len) { 354 if (neigh->hh.hh_len) {
355 neigh_hh_bridge(&neigh->hh, skb); 355 neigh_hh_bridge(&neigh->hh, skb);
356 skb->dev = nf_bridge->physindev; 356 skb->dev = nf_bridge->physindev;
diff --git a/net/core/dst.c b/net/core/dst.c
index 4aacc14936a0..14b33baf0733 100644
--- a/net/core/dst.c
+++ b/net/core/dst.c
@@ -171,7 +171,7 @@ void *dst_alloc(struct dst_ops *ops, struct net_device *dev,
171 dst_init_metrics(dst, dst_default_metrics, true); 171 dst_init_metrics(dst, dst_default_metrics, true);
172 dst->expires = 0UL; 172 dst->expires = 0UL;
173 dst->path = dst; 173 dst->path = dst;
174 dst->neighbour = NULL; 174 dst->_neighbour = NULL;
175#ifdef CONFIG_XFRM 175#ifdef CONFIG_XFRM
176 dst->xfrm = NULL; 176 dst->xfrm = NULL;
177#endif 177#endif
@@ -229,11 +229,11 @@ struct dst_entry *dst_destroy(struct dst_entry * dst)
229 smp_rmb(); 229 smp_rmb();
230 230
231again: 231again:
232 neigh = dst->neighbour; 232 neigh = dst->_neighbour;
233 child = dst->child; 233 child = dst->child;
234 234
235 if (neigh) { 235 if (neigh) {
236 dst->neighbour = NULL; 236 dst->_neighbour = NULL;
237 neigh_release(neigh); 237 neigh_release(neigh);
238 } 238 }
239 239
@@ -363,8 +363,8 @@ static void dst_ifdown(struct dst_entry *dst, struct net_device *dev,
363 dst->dev = dev_net(dst->dev)->loopback_dev; 363 dst->dev = dev_net(dst->dev)->loopback_dev;
364 dev_hold(dst->dev); 364 dev_hold(dst->dev);
365 dev_put(dev); 365 dev_put(dev);
366 if (dst->neighbour && dst->neighbour->dev == dev) { 366 if (dst->_neighbour && dst->_neighbour->dev == dev) {
367 dst->neighbour->dev = dst->dev; 367 dst->_neighbour->dev = dst->dev;
368 dev_hold(dst->dev); 368 dev_hold(dst->dev);
369 dev_put(dev); 369 dev_put(dev);
370 } 370 }
diff --git a/net/core/neighbour.c b/net/core/neighbour.c
index cefb8e52615e..8fab9b0bb203 100644
--- a/net/core/neighbour.c
+++ b/net/core/neighbour.c
@@ -1153,11 +1153,12 @@ int neigh_update(struct neighbour *neigh, const u8 *lladdr, u8 new,
1153 1153
1154 while (neigh->nud_state & NUD_VALID && 1154 while (neigh->nud_state & NUD_VALID &&
1155 (skb = __skb_dequeue(&neigh->arp_queue)) != NULL) { 1155 (skb = __skb_dequeue(&neigh->arp_queue)) != NULL) {
1156 struct neighbour *n1 = neigh; 1156 struct dst_entry *dst = skb_dst(skb);
1157 struct neighbour *n2, *n1 = neigh;
1157 write_unlock_bh(&neigh->lock); 1158 write_unlock_bh(&neigh->lock);
1158 /* On shaper/eql skb->dst->neighbour != neigh :( */ 1159 /* On shaper/eql skb->dst->neighbour != neigh :( */
1159 if (skb_dst(skb) && skb_dst(skb)->neighbour) 1160 if (dst && (n2 = dst_get_neighbour(dst)) != NULL)
1160 n1 = skb_dst(skb)->neighbour; 1161 n1 = n2;
1161 n1->output(n1, skb); 1162 n1->output(n1, skb);
1162 write_lock_bh(&neigh->lock); 1163 write_lock_bh(&neigh->lock);
1163 } 1164 }
diff --git a/net/decnet/dn_neigh.c b/net/decnet/dn_neigh.c
index 5d61e8965b66..0dc3fe61085b 100644
--- a/net/decnet/dn_neigh.c
+++ b/net/decnet/dn_neigh.c
@@ -202,7 +202,7 @@ static int dn_neigh_output_packet(struct sk_buff *skb)
202{ 202{
203 struct dst_entry *dst = skb_dst(skb); 203 struct dst_entry *dst = skb_dst(skb);
204 struct dn_route *rt = (struct dn_route *)dst; 204 struct dn_route *rt = (struct dn_route *)dst;
205 struct neighbour *neigh = dst->neighbour; 205 struct neighbour *neigh = dst_get_neighbour(dst);
206 struct net_device *dev = neigh->dev; 206 struct net_device *dev = neigh->dev;
207 char mac_addr[ETH_ALEN]; 207 char mac_addr[ETH_ALEN];
208 208
diff --git a/net/decnet/dn_route.c b/net/decnet/dn_route.c
index 3b6400d17dc2..9bd45fcb3b8e 100644
--- a/net/decnet/dn_route.c
+++ b/net/decnet/dn_route.c
@@ -241,9 +241,11 @@ static int dn_dst_gc(struct dst_ops *ops)
241 */ 241 */
242static void dn_dst_update_pmtu(struct dst_entry *dst, u32 mtu) 242static void dn_dst_update_pmtu(struct dst_entry *dst, u32 mtu)
243{ 243{
244 struct neighbour *n = dst_get_neighbour(dst);
244 u32 min_mtu = 230; 245 u32 min_mtu = 230;
245 struct dn_dev *dn = dst->neighbour ? 246 struct dn_dev *dn;
246 rcu_dereference_raw(dst->neighbour->dev->dn_ptr) : NULL; 247
248 dn = n ? rcu_dereference_raw(n->dev->dn_ptr) : NULL;
247 249
248 if (dn && dn->use_long == 0) 250 if (dn && dn->use_long == 0)
249 min_mtu -= 6; 251 min_mtu -= 6;
@@ -708,7 +710,7 @@ out:
708static int dn_to_neigh_output(struct sk_buff *skb) 710static int dn_to_neigh_output(struct sk_buff *skb)
709{ 711{
710 struct dst_entry *dst = skb_dst(skb); 712 struct dst_entry *dst = skb_dst(skb);
711 struct neighbour *n = dst->neighbour; 713 struct neighbour *n = dst_get_neighbour(dst);
712 714
713 return n->output(n, skb); 715 return n->output(n, skb);
714} 716}
@@ -723,7 +725,7 @@ static int dn_output(struct sk_buff *skb)
723 725
724 int err = -EINVAL; 726 int err = -EINVAL;
725 727
726 if ((neigh = dst->neighbour) == NULL) 728 if ((neigh = dst_get_neighbour(dst)) == NULL)
727 goto error; 729 goto error;
728 730
729 skb->dev = dev; 731 skb->dev = dev;
@@ -840,11 +842,11 @@ static int dn_rt_set_next_hop(struct dn_route *rt, struct dn_fib_res *res)
840 } 842 }
841 rt->rt_type = res->type; 843 rt->rt_type = res->type;
842 844
843 if (dev != NULL && rt->dst.neighbour == NULL) { 845 if (dev != NULL && dst_get_neighbour(&rt->dst) == NULL) {
844 n = __neigh_lookup_errno(&dn_neigh_table, &rt->rt_gateway, dev); 846 n = __neigh_lookup_errno(&dn_neigh_table, &rt->rt_gateway, dev);
845 if (IS_ERR(n)) 847 if (IS_ERR(n))
846 return PTR_ERR(n); 848 return PTR_ERR(n);
847 rt->dst.neighbour = n; 849 dst_set_neighbour(&rt->dst, n);
848 } 850 }
849 851
850 if (dst_metric(&rt->dst, RTAX_MTU) > rt->dst.dev->mtu) 852 if (dst_metric(&rt->dst, RTAX_MTU) > rt->dst.dev->mtu)
@@ -1151,7 +1153,7 @@ make_route:
1151 rt->rt_dst_map = fld.daddr; 1153 rt->rt_dst_map = fld.daddr;
1152 rt->rt_src_map = fld.saddr; 1154 rt->rt_src_map = fld.saddr;
1153 1155
1154 rt->dst.neighbour = neigh; 1156 dst_set_neighbour(&rt->dst, neigh);
1155 neigh = NULL; 1157 neigh = NULL;
1156 1158
1157 rt->dst.lastuse = jiffies; 1159 rt->dst.lastuse = jiffies;
@@ -1423,7 +1425,7 @@ make_route:
1423 rt->fld.flowidn_iif = in_dev->ifindex; 1425 rt->fld.flowidn_iif = in_dev->ifindex;
1424 rt->fld.flowidn_mark = fld.flowidn_mark; 1426 rt->fld.flowidn_mark = fld.flowidn_mark;
1425 1427
1426 rt->dst.neighbour = neigh; 1428 dst_set_neighbour(&rt->dst, neigh);
1427 rt->dst.lastuse = jiffies; 1429 rt->dst.lastuse = jiffies;
1428 rt->dst.output = dn_rt_bug; 1430 rt->dst.output = dn_rt_bug;
1429 switch (res.type) { 1431 switch (res.type) {
diff --git a/net/ipv4/ip_gre.c b/net/ipv4/ip_gre.c
index 8871067560db..d7bb94c48345 100644
--- a/net/ipv4/ip_gre.c
+++ b/net/ipv4/ip_gre.c
@@ -731,9 +731,9 @@ static netdev_tx_t ipgre_tunnel_xmit(struct sk_buff *skb, struct net_device *dev
731 } 731 }
732#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE) 732#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
733 else if (skb->protocol == htons(ETH_P_IPV6)) { 733 else if (skb->protocol == htons(ETH_P_IPV6)) {
734 struct neighbour *neigh = dst_get_neighbour(skb_dst(skb));
734 const struct in6_addr *addr6; 735 const struct in6_addr *addr6;
735 int addr_type; 736 int addr_type;
736 struct neighbour *neigh = skb_dst(skb)->neighbour;
737 737
738 if (neigh == NULL) 738 if (neigh == NULL)
739 goto tx_error; 739 goto tx_error;
diff --git a/net/ipv4/ip_output.c b/net/ipv4/ip_output.c
index db296a98b236..be27e609a98b 100644
--- a/net/ipv4/ip_output.c
+++ b/net/ipv4/ip_output.c
@@ -204,7 +204,7 @@ static inline int ip_finish_output2(struct sk_buff *skb)
204 skb = skb2; 204 skb = skb2;
205 } 205 }
206 206
207 neigh = dst->neighbour; 207 neigh = dst_get_neighbour(dst);
208 if (neigh) 208 if (neigh)
209 return neigh_output(neigh, skb); 209 return neigh_output(neigh, skb);
210 210
diff --git a/net/ipv4/route.c b/net/ipv4/route.c
index bcf9bb508200..1d4cd3b4fd69 100644
--- a/net/ipv4/route.c
+++ b/net/ipv4/route.c
@@ -412,8 +412,10 @@ static int rt_cache_seq_show(struct seq_file *seq, void *v)
412 "HHUptod\tSpecDst"); 412 "HHUptod\tSpecDst");
413 else { 413 else {
414 struct rtable *r = v; 414 struct rtable *r = v;
415 struct neighbour *n;
415 int len; 416 int len;
416 417
418 n = dst_get_neighbour(&r->dst);
417 seq_printf(seq, "%s\t%08X\t%08X\t%8X\t%d\t%u\t%d\t" 419 seq_printf(seq, "%s\t%08X\t%08X\t%8X\t%d\t%u\t%d\t"
418 "%08X\t%d\t%u\t%u\t%02X\t%d\t%1d\t%08X%n", 420 "%08X\t%d\t%u\t%u\t%02X\t%d\t%1d\t%08X%n",
419 r->dst.dev ? r->dst.dev->name : "*", 421 r->dst.dev ? r->dst.dev->name : "*",
@@ -427,9 +429,7 @@ static int rt_cache_seq_show(struct seq_file *seq, void *v)
427 dst_metric(&r->dst, RTAX_RTTVAR)), 429 dst_metric(&r->dst, RTAX_RTTVAR)),
428 r->rt_key_tos, 430 r->rt_key_tos,
429 -1, 431 -1,
430 (r->dst.neighbour && 432 (n && (n->nud_state & NUD_CONNECTED)) ? 1 : 0,
431 (r->dst.neighbour->nud_state & NUD_CONNECTED)) ?
432 1 : 0,
433 r->rt_spec_dst, &len); 433 r->rt_spec_dst, &len);
434 434
435 seq_printf(seq, "%*s\n", 127 - len, ""); 435 seq_printf(seq, "%*s\n", 127 - len, "");
@@ -1026,7 +1026,7 @@ static int rt_bind_neighbour(struct rtable *rt)
1026 n = ipv4_neigh_lookup(tbl, dev, nexthop); 1026 n = ipv4_neigh_lookup(tbl, dev, nexthop);
1027 if (IS_ERR(n)) 1027 if (IS_ERR(n))
1028 return PTR_ERR(n); 1028 return PTR_ERR(n);
1029 rt->dst.neighbour = n; 1029 dst_set_neighbour(&rt->dst, n);
1030 1030
1031 return 0; 1031 return 0;
1032} 1032}
@@ -1617,23 +1617,24 @@ static int check_peer_redir(struct dst_entry *dst, struct inet_peer *peer)
1617{ 1617{
1618 struct rtable *rt = (struct rtable *) dst; 1618 struct rtable *rt = (struct rtable *) dst;
1619 __be32 orig_gw = rt->rt_gateway; 1619 __be32 orig_gw = rt->rt_gateway;
1620 struct neighbour *n;
1620 1621
1621 dst_confirm(&rt->dst); 1622 dst_confirm(&rt->dst);
1622 1623
1623 neigh_release(rt->dst.neighbour); 1624 neigh_release(dst_get_neighbour(&rt->dst));
1624 rt->dst.neighbour = NULL; 1625 dst_set_neighbour(&rt->dst, NULL);
1625 1626
1626 rt->rt_gateway = peer->redirect_learned.a4; 1627 rt->rt_gateway = peer->redirect_learned.a4;
1627 if (rt_bind_neighbour(rt) || 1628 rt_bind_neighbour(rt);
1628 !(rt->dst.neighbour->nud_state & NUD_VALID)) { 1629 n = dst_get_neighbour(&rt->dst);
1629 if (rt->dst.neighbour) 1630 if (!n || !(n->nud_state & NUD_VALID)) {
1630 neigh_event_send(rt->dst.neighbour, NULL); 1631 if (n)
1632 neigh_event_send(n, NULL);
1631 rt->rt_gateway = orig_gw; 1633 rt->rt_gateway = orig_gw;
1632 return -EAGAIN; 1634 return -EAGAIN;
1633 } else { 1635 } else {
1634 rt->rt_flags |= RTCF_REDIRECTED; 1636 rt->rt_flags |= RTCF_REDIRECTED;
1635 call_netevent_notifiers(NETEVENT_NEIGH_UPDATE, 1637 call_netevent_notifiers(NETEVENT_NEIGH_UPDATE, n);
1636 rt->dst.neighbour);
1637 } 1638 }
1638 return 0; 1639 return 0;
1639} 1640}
diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
index 48cd03df8954..a06c53c14d84 100644
--- a/net/ipv6/addrconf.c
+++ b/net/ipv6/addrconf.c
@@ -656,7 +656,7 @@ ipv6_add_addr(struct inet6_dev *idev, const struct in6_addr *addr, int pfxlen,
656 * layer address of our nexhop router 656 * layer address of our nexhop router
657 */ 657 */
658 658
659 if (rt->dst.neighbour == NULL) 659 if (dst_get_neighbour(&rt->dst) == NULL)
660 ifa->flags &= ~IFA_F_OPTIMISTIC; 660 ifa->flags &= ~IFA_F_OPTIMISTIC;
661 661
662 ifa->idev = idev; 662 ifa->idev = idev;
diff --git a/net/ipv6/ip6_fib.c b/net/ipv6/ip6_fib.c
index 158df2365d5e..54a4678955bf 100644
--- a/net/ipv6/ip6_fib.c
+++ b/net/ipv6/ip6_fib.c
@@ -1455,7 +1455,7 @@ static int fib6_age(struct rt6_info *rt, void *arg)
1455 RT6_TRACE("aging clone %p\n", rt); 1455 RT6_TRACE("aging clone %p\n", rt);
1456 return -1; 1456 return -1;
1457 } else if ((rt->rt6i_flags & RTF_GATEWAY) && 1457 } else if ((rt->rt6i_flags & RTF_GATEWAY) &&
1458 (!(rt->dst.neighbour->flags & NTF_ROUTER))) { 1458 (!(dst_get_neighbour(&rt->dst)->flags & NTF_ROUTER))) {
1459 RT6_TRACE("purging route %p via non-router but gateway\n", 1459 RT6_TRACE("purging route %p via non-router but gateway\n",
1460 rt); 1460 rt);
1461 return -1; 1461 return -1;
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c
index eb50bb07ab2e..8db0e4875ad8 100644
--- a/net/ipv6/ip6_output.c
+++ b/net/ipv6/ip6_output.c
@@ -135,7 +135,7 @@ static int ip6_finish_output2(struct sk_buff *skb)
135 skb->len); 135 skb->len);
136 } 136 }
137 137
138 neigh = dst->neighbour; 138 neigh = dst_get_neighbour(dst);
139 if (neigh) 139 if (neigh)
140 return neigh_output(neigh, skb); 140 return neigh_output(neigh, skb);
141 141
@@ -385,6 +385,7 @@ int ip6_forward(struct sk_buff *skb)
385 struct ipv6hdr *hdr = ipv6_hdr(skb); 385 struct ipv6hdr *hdr = ipv6_hdr(skb);
386 struct inet6_skb_parm *opt = IP6CB(skb); 386 struct inet6_skb_parm *opt = IP6CB(skb);
387 struct net *net = dev_net(dst->dev); 387 struct net *net = dev_net(dst->dev);
388 struct neighbour *n;
388 u32 mtu; 389 u32 mtu;
389 390
390 if (net->ipv6.devconf_all->forwarding == 0) 391 if (net->ipv6.devconf_all->forwarding == 0)
@@ -459,11 +460,10 @@ int ip6_forward(struct sk_buff *skb)
459 send redirects to source routed frames. 460 send redirects to source routed frames.
460 We don't send redirects to frames decapsulated from IPsec. 461 We don't send redirects to frames decapsulated from IPsec.
461 */ 462 */
462 if (skb->dev == dst->dev && dst->neighbour && opt->srcrt == 0 && 463 n = dst_get_neighbour(dst);
463 !skb_sec_path(skb)) { 464 if (skb->dev == dst->dev && n && opt->srcrt == 0 && !skb_sec_path(skb)) {
464 struct in6_addr *target = NULL; 465 struct in6_addr *target = NULL;
465 struct rt6_info *rt; 466 struct rt6_info *rt;
466 struct neighbour *n = dst->neighbour;
467 467
468 /* 468 /*
469 * incoming and outgoing devices are the same 469 * incoming and outgoing devices are the same
@@ -920,8 +920,11 @@ out:
920static int ip6_dst_lookup_tail(struct sock *sk, 920static int ip6_dst_lookup_tail(struct sock *sk,
921 struct dst_entry **dst, struct flowi6 *fl6) 921 struct dst_entry **dst, struct flowi6 *fl6)
922{ 922{
923 int err;
924 struct net *net = sock_net(sk); 923 struct net *net = sock_net(sk);
924#ifdef CONFIG_IPV6_OPTIMISTIC_DAD
925 struct neighbour *n;
926#endif
927 int err;
925 928
926 if (*dst == NULL) 929 if (*dst == NULL)
927 *dst = ip6_route_output(net, sk, fl6); 930 *dst = ip6_route_output(net, sk, fl6);
@@ -947,7 +950,8 @@ static int ip6_dst_lookup_tail(struct sock *sk,
947 * dst entry and replace it instead with the 950 * dst entry and replace it instead with the
948 * dst entry of the nexthop router 951 * dst entry of the nexthop router
949 */ 952 */
950 if ((*dst)->neighbour && !((*dst)->neighbour->nud_state & NUD_VALID)) { 953 n = dst_get_neighbour(*dst);
954 if (n && !(n->nud_state & NUD_VALID)) {
951 struct inet6_ifaddr *ifp; 955 struct inet6_ifaddr *ifp;
952 struct flowi6 fl_gw6; 956 struct flowi6 fl_gw6;
953 int redirect; 957 int redirect;
diff --git a/net/ipv6/ndisc.c b/net/ipv6/ndisc.c
index a997d414f525..9da6e02eaaeb 100644
--- a/net/ipv6/ndisc.c
+++ b/net/ipv6/ndisc.c
@@ -1238,7 +1238,7 @@ static void ndisc_router_discovery(struct sk_buff *skb)
1238 rt = rt6_get_dflt_router(&ipv6_hdr(skb)->saddr, skb->dev); 1238 rt = rt6_get_dflt_router(&ipv6_hdr(skb)->saddr, skb->dev);
1239 1239
1240 if (rt) 1240 if (rt)
1241 neigh = rt->dst.neighbour; 1241 neigh = dst_get_neighbour(&rt->dst);
1242 1242
1243 if (rt && lifetime == 0) { 1243 if (rt && lifetime == 0) {
1244 neigh_clone(neigh); 1244 neigh_clone(neigh);
@@ -1259,7 +1259,7 @@ static void ndisc_router_discovery(struct sk_buff *skb)
1259 return; 1259 return;
1260 } 1260 }
1261 1261
1262 neigh = rt->dst.neighbour; 1262 neigh = dst_get_neighbour(&rt->dst);
1263 if (neigh == NULL) { 1263 if (neigh == NULL) {
1264 ND_PRINTK0(KERN_ERR 1264 ND_PRINTK0(KERN_ERR
1265 "ICMPv6 RA: %s() got default router without neighbour.\n", 1265 "ICMPv6 RA: %s() got default router without neighbour.\n",
diff --git a/net/ipv6/route.c b/net/ipv6/route.c
index c1515a3c1305..2998cb5be90b 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 }
diff --git a/net/ipv6/sit.c b/net/ipv6/sit.c
index 1cca5761aea9..07bf1085458f 100644
--- a/net/ipv6/sit.c
+++ b/net/ipv6/sit.c
@@ -677,7 +677,7 @@ static netdev_tx_t ipip6_tunnel_xmit(struct sk_buff *skb,
677 struct neighbour *neigh = NULL; 677 struct neighbour *neigh = NULL;
678 678
679 if (skb_dst(skb)) 679 if (skb_dst(skb))
680 neigh = skb_dst(skb)->neighbour; 680 neigh = dst_get_neighbour(skb_dst(skb));
681 681
682 if (neigh == NULL) { 682 if (neigh == NULL) {
683 if (net_ratelimit()) 683 if (net_ratelimit())
@@ -702,7 +702,7 @@ static netdev_tx_t ipip6_tunnel_xmit(struct sk_buff *skb,
702 struct neighbour *neigh = NULL; 702 struct neighbour *neigh = NULL;
703 703
704 if (skb_dst(skb)) 704 if (skb_dst(skb))
705 neigh = skb_dst(skb)->neighbour; 705 neigh = dst_get_neighbour(skb_dst(skb));
706 706
707 if (neigh == NULL) { 707 if (neigh == NULL) {
708 if (net_ratelimit()) 708 if (net_ratelimit())
diff --git a/net/sched/sch_teql.c b/net/sched/sch_teql.c
index 45cd30098e34..a3b7120fcc74 100644
--- a/net/sched/sch_teql.c
+++ b/net/sched/sch_teql.c
@@ -229,7 +229,7 @@ __teql_resolve(struct sk_buff *skb, struct sk_buff *skb_res, struct net_device *
229{ 229{
230 struct netdev_queue *dev_queue = netdev_get_tx_queue(dev, 0); 230 struct netdev_queue *dev_queue = netdev_get_tx_queue(dev, 0);
231 struct teql_sched_data *q = qdisc_priv(dev_queue->qdisc); 231 struct teql_sched_data *q = qdisc_priv(dev_queue->qdisc);
232 struct neighbour *mn = skb_dst(skb)->neighbour; 232 struct neighbour *mn = dst_get_neighbour(skb_dst(skb));
233 struct neighbour *n = q->ncache; 233 struct neighbour *n = q->ncache;
234 234
235 if (mn->tbl == NULL) 235 if (mn->tbl == NULL)
@@ -270,7 +270,7 @@ static inline int teql_resolve(struct sk_buff *skb,
270 270
271 if (dev->header_ops == NULL || 271 if (dev->header_ops == NULL ||
272 skb_dst(skb) == NULL || 272 skb_dst(skb) == NULL ||
273 skb_dst(skb)->neighbour == NULL) 273 dst_get_neighbour(skb_dst(skb)) == NULL)
274 return 0; 274 return 0;
275 return __teql_resolve(skb, skb_res, dev); 275 return __teql_resolve(skb, skb_res, dev);
276} 276}
diff --git a/net/xfrm/xfrm_policy.c b/net/xfrm/xfrm_policy.c
index 5ce74a385525..7803eb6af414 100644
--- a/net/xfrm/xfrm_policy.c
+++ b/net/xfrm/xfrm_policy.c
@@ -1497,7 +1497,7 @@ static struct dst_entry *xfrm_bundle_create(struct xfrm_policy *policy,
1497 goto free_dst; 1497 goto free_dst;
1498 1498
1499 /* Copy neighbour for reachability confirmation */ 1499 /* Copy neighbour for reachability confirmation */
1500 dst0->neighbour = neigh_clone(dst->neighbour); 1500 dst_set_neighbour(dst0, neigh_clone(dst_get_neighbour(dst)));
1501 1501
1502 xfrm_init_path((struct xfrm_dst *)dst0, dst, nfheader_len); 1502 xfrm_init_path((struct xfrm_dst *)dst0, dst, nfheader_len);
1503 xfrm_init_pmtu(dst_prev); 1503 xfrm_init_pmtu(dst_prev);