|
|
@@ -40,7 +40,7 @@ static bool ipv6_mapped_addr_any(const struct in6_addr *a)
|
|
|
return ipv6_addr_v4mapped(a) && (a->s6_addr32[3] == 0);
|
|
|
}
|
|
|
|
|
|
-int ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
|
|
|
+static int __ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
|
|
|
{
|
|
|
struct sockaddr_in6 *usin = (struct sockaddr_in6 *) uaddr;
|
|
|
struct inet_sock *inet = inet_sk(sk);
|
|
|
@@ -56,7 +56,7 @@ int ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
|
|
|
if (usin->sin6_family == AF_INET) {
|
|
|
if (__ipv6_only_sock(sk))
|
|
|
return -EAFNOSUPPORT;
|
|
|
- err = ip4_datagram_connect(sk, uaddr, addr_len);
|
|
|
+ err = __ip4_datagram_connect(sk, uaddr, addr_len);
|
|
|
goto ipv4_connected;
|
|
|
}
|
|
|
|
|
|
@@ -98,9 +98,9 @@ int ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
|
|
|
sin.sin_addr.s_addr = daddr->s6_addr32[3];
|
|
|
sin.sin_port = usin->sin6_port;
|
|
|
|
|
|
- err = ip4_datagram_connect(sk,
|
|
|
- (struct sockaddr *) &sin,
|
|
|
- sizeof(sin));
|
|
|
+ err = __ip4_datagram_connect(sk,
|
|
|
+ (struct sockaddr *) &sin,
|
|
|
+ sizeof(sin));
|
|
|
|
|
|
ipv4_connected:
|
|
|
if (err)
|
|
|
@@ -204,6 +204,16 @@ out:
|
|
|
fl6_sock_release(flowlabel);
|
|
|
return err;
|
|
|
}
|
|
|
+
|
|
|
+int ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len)
|
|
|
+{
|
|
|
+ int res;
|
|
|
+
|
|
|
+ lock_sock(sk);
|
|
|
+ res = __ip6_datagram_connect(sk, uaddr, addr_len);
|
|
|
+ release_sock(sk);
|
|
|
+ return res;
|
|
|
+}
|
|
|
EXPORT_SYMBOL_GPL(ip6_datagram_connect);
|
|
|
|
|
|
int ip6_datagram_connect_v6_only(struct sock *sk, struct sockaddr *uaddr,
|