]> Pileus Git - ~andy/linux/blobdiff - net/ipv6/inet6_connection_sock.c
Merge tag 'for-linus-docs-2012-05-02' of git://git.kernel.org/pub/scm/linux/kernel...
[~andy/linux] / net / ipv6 / inet6_connection_sock.c
index 9bfab19ff3c02b301be08555b2c35a7982b2d1b6..e4311cbc8b4ecbf70ea1fb2e2f2415342be382cc 100644 (file)
@@ -54,6 +54,10 @@ int inet6_csk_bind_conflict(const struct sock *sk,
                                if (ipv6_rcv_saddr_equal(sk, sk2))
                                        break;
                        }
+                       if (!relax && reuse && sk2->sk_reuse &&
+                           sk2->sk_state != TCP_LISTEN &&
+                           ipv6_rcv_saddr_equal(sk, sk2))
+                               break;
                }
        }
 
@@ -169,10 +173,8 @@ void inet6_csk_addr2sockaddr(struct sock *sk, struct sockaddr * uaddr)
        sin6->sin6_port = inet_sk(sk)->inet_dport;
        /* We do not store received flowlabel for TCP */
        sin6->sin6_flowinfo = 0;
-       sin6->sin6_scope_id = 0;
-       if (sk->sk_bound_dev_if &&
-           ipv6_addr_type(&sin6->sin6_addr) & IPV6_ADDR_LINKLOCAL)
-               sin6->sin6_scope_id = sk->sk_bound_dev_if;
+       sin6->sin6_scope_id = ipv6_iface_scope_id(&sin6->sin6_addr,
+                                                 sk->sk_bound_dev_if);
 }
 
 EXPORT_SYMBOL_GPL(inet6_csk_addr2sockaddr);