diff options
Diffstat (limited to 'net/ipv6')
-rw-r--r-- | net/ipv6/ip6_output.c | 17 |
1 files changed, 4 insertions, 13 deletions
diff --git a/net/ipv6/ip6_output.c b/net/ipv6/ip6_output.c index e9212c7ff5cf..7b7bd44fbf47 100644 --- a/net/ipv6/ip6_output.c +++ b/net/ipv6/ip6_output.c | |||
@@ -72,20 +72,11 @@ static __inline__ void ipv6_select_ident(struct sk_buff *skb, struct frag_hdr *f | |||
72 | 72 | ||
73 | static inline int ip6_output_finish(struct sk_buff *skb) | 73 | static inline int ip6_output_finish(struct sk_buff *skb) |
74 | { | 74 | { |
75 | |||
76 | struct dst_entry *dst = skb->dst; | 75 | struct dst_entry *dst = skb->dst; |
77 | struct hh_cache *hh = dst->hh; | 76 | |
78 | 77 | if (dst->hh) | |
79 | if (hh) { | 78 | return neigh_hh_output(dst->hh, skb); |
80 | int hh_alen; | 79 | else if (dst->neighbour) |
81 | |||
82 | read_lock_bh(&hh->hh_lock); | ||
83 | hh_alen = HH_DATA_ALIGN(hh->hh_len); | ||
84 | memcpy(skb->data - hh_alen, hh->hh_data, hh_alen); | ||
85 | read_unlock_bh(&hh->hh_lock); | ||
86 | skb_push(skb, hh->hh_len); | ||
87 | return hh->hh_output(skb); | ||
88 | } else if (dst->neighbour) | ||
89 | return dst->neighbour->output(skb); | 80 | return dst->neighbour->output(skb); |
90 | 81 | ||
91 | IP6_INC_STATS_BH(ip6_dst_idev(dst), IPSTATS_MIB_OUTNOROUTES); | 82 | IP6_INC_STATS_BH(ip6_dst_idev(dst), IPSTATS_MIB_OUTNOROUTES); |