|
@@ -53,6 +53,8 @@ int ipv6_rcv_saddr_equal(const struct sock *sk, const struct sock *sk2)
|
|
|
{
|
|
|
const struct in6_addr *sk_rcv_saddr6 = &inet6_sk(sk)->rcv_saddr;
|
|
|
const struct in6_addr *sk2_rcv_saddr6 = inet6_rcv_saddr(sk2);
|
|
|
+ __be32 sk_rcv_saddr = inet_sk(sk)->rcv_saddr;
|
|
|
+ __be32 sk2_rcv_saddr = inet_rcv_saddr(sk2);
|
|
|
int sk_ipv6only = ipv6_only_sock(sk);
|
|
|
int sk2_ipv6only = inet_v6_ipv6only(sk2);
|
|
|
int addr_type = ipv6_addr_type(sk_rcv_saddr6);
|
|
@@ -60,7 +62,9 @@ int ipv6_rcv_saddr_equal(const struct sock *sk, const struct sock *sk2)
|
|
|
|
|
|
/* if both are mapped, treat as IPv4 */
|
|
|
if (addr_type == IPV6_ADDR_MAPPED && addr_type2 == IPV6_ADDR_MAPPED)
|
|
|
- return ipv4_rcv_saddr_equal(sk, sk2);
|
|
|
+ return (!sk2_ipv6only &&
|
|
|
+ (!sk_rcv_saddr || !sk2_rcv_saddr ||
|
|
|
+ sk_rcv_saddr == sk2_rcv_saddr));
|
|
|
|
|
|
if (addr_type2 == IPV6_ADDR_ANY &&
|
|
|
!(sk2_ipv6only && addr_type == IPV6_ADDR_MAPPED))
|