File tree Expand file tree Collapse file tree 1 file changed +13
-5
lines changed Expand file tree Collapse file tree 1 file changed +13
-5
lines changed Original file line number Diff line number Diff line change @@ -88,7 +88,8 @@ static int ip6_finish_output2(struct sk_buff *skb)
88
88
struct dst_entry * dst = skb_dst (skb );
89
89
struct net_device * dev = dst -> dev ;
90
90
struct neighbour * neigh ;
91
- struct rt6_info * rt ;
91
+ struct in6_addr * nexthop ;
92
+ int ret ;
92
93
93
94
skb -> protocol = htons (ETH_P_IPV6 );
94
95
skb -> dev = dev ;
@@ -123,10 +124,17 @@ static int ip6_finish_output2(struct sk_buff *skb)
123
124
skb -> len );
124
125
}
125
126
126
- rt = (struct rt6_info * ) dst ;
127
- neigh = rt -> n ;
128
- if (neigh )
129
- return dst_neigh_output (dst , neigh , skb );
127
+ rcu_read_lock_bh ();
128
+ nexthop = rt6_nexthop ((struct rt6_info * )dst , & ipv6_hdr (skb )-> daddr );
129
+ neigh = __ipv6_neigh_lookup_noref (dst -> dev , nexthop );
130
+ if (unlikely (!neigh ))
131
+ neigh = __neigh_create (& nd_tbl , nexthop , dst -> dev , false);
132
+ if (!IS_ERR (neigh )) {
133
+ ret = dst_neigh_output (dst , neigh , skb );
134
+ rcu_read_unlock_bh ();
135
+ return ret ;
136
+ }
137
+ rcu_read_unlock_bh ();
130
138
131
139
IP6_INC_STATS_BH (dev_net (dst -> dev ),
132
140
ip6_dst_idev (dst ), IPSTATS_MIB_OUTNOROUTES );
You can’t perform that action at this time.
0 commit comments