ipv6: datagram: Update dst cache of a connected datagram sk during pmtu update
[cascardo/linux.git] / net / ipv6 / datagram.c
index 669585e..59e01f2 100644 (file)
@@ -64,7 +64,7 @@ static void ip6_datagram_flow_key_init(struct flowi6 *fl6, struct sock *sk)
        security_sk_classify_flow(sk, flowi6_to_flowi(fl6));
 }
 
-static int ip6_datagram_dst_update(struct sock *sk)
+int ip6_datagram_dst_update(struct sock *sk, bool fix_sk_saddr)
 {
        struct ip6_flowlabel *flowlabel = NULL;
        struct in6_addr *final_p, final;
@@ -93,14 +93,16 @@ static int ip6_datagram_dst_update(struct sock *sk)
                goto out;
        }
 
-       if (ipv6_addr_any(&np->saddr))
-               np->saddr = fl6.saddr;
+       if (fix_sk_saddr) {
+               if (ipv6_addr_any(&np->saddr))
+                       np->saddr = fl6.saddr;
 
-       if (ipv6_addr_any(&sk->sk_v6_rcv_saddr)) {
-               sk->sk_v6_rcv_saddr = fl6.saddr;
-               inet->inet_rcv_saddr = LOOPBACK4_IPV6;
-               if (sk->sk_prot->rehash)
-                       sk->sk_prot->rehash(sk);
+               if (ipv6_addr_any(&sk->sk_v6_rcv_saddr)) {
+                       sk->sk_v6_rcv_saddr = fl6.saddr;
+                       inet->inet_rcv_saddr = LOOPBACK4_IPV6;
+                       if (sk->sk_prot->rehash)
+                               sk->sk_prot->rehash(sk);
+               }
        }
 
        ip6_dst_store(sk, dst,
@@ -221,7 +223,7 @@ ipv4_connected:
         *      destination cache for it.
         */
 
-       err = ip6_datagram_dst_update(sk);
+       err = ip6_datagram_dst_update(sk, true);
        if (err)
                goto out;