|
@@ -768,6 +768,15 @@ start_lookup:
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+static void udp6_sk_rx_dst_set(struct sock *sk, struct dst_entry *dst)
|
|
|
+{
|
|
|
+ if (udp_sk_rx_dst_set(sk, dst)) {
|
|
|
+ const struct rt6_info *rt = (const struct rt6_info *)dst;
|
|
|
+
|
|
|
+ inet6_sk(sk)->rx_dst_cookie = rt6_get_cookie(rt);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
int __udp6_lib_rcv(struct sk_buff *skb, struct udp_table *udptable,
|
|
|
int proto)
|
|
|
{
|
|
@@ -817,7 +826,7 @@ int __udp6_lib_rcv(struct sk_buff *skb, struct udp_table *udptable,
|
|
|
int ret;
|
|
|
|
|
|
if (unlikely(sk->sk_rx_dst != dst))
|
|
|
- udp_sk_rx_dst_set(sk, dst);
|
|
|
+ udp6_sk_rx_dst_set(sk, dst);
|
|
|
|
|
|
ret = udpv6_queue_rcv_skb(sk, skb);
|
|
|
sock_put(sk);
|