From 421754ffe8d44301f1c6240fe20f2f48ac06722e Mon Sep 17 00:00:00 2001 From: Max Matveev Date: Fri, 5 Aug 2011 03:56:30 -0700 Subject: [PATCH] --- yaml --- r: 262493 b: refs/heads/master c: c15fea2d8ca834dae491339c47e4fb3c81428190 h: refs/heads/master i: 262491: 23b7ae25010720b36f9efeae2ff437789c9ed775 v: v3 --- [refs] | 2 +- trunk/net/ipv6/datagram.c | 11 +++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index dbad386d5b54..eadb64c657d2 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 20e72a44098641f0c4de34a31287a93e006afb5b +refs/heads/master: c15fea2d8ca834dae491339c47e4fb3c81428190 diff --git a/trunk/net/ipv6/datagram.c b/trunk/net/ipv6/datagram.c index 16560336eb72..9ef1831746ef 100644 --- a/trunk/net/ipv6/datagram.c +++ b/trunk/net/ipv6/datagram.c @@ -33,6 +33,11 @@ #include #include +static inline int 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) { struct sockaddr_in6 *usin = (struct sockaddr_in6 *) uaddr; @@ -102,10 +107,12 @@ int ip6_datagram_connect(struct sock *sk, struct sockaddr *uaddr, int addr_len) ipv6_addr_set_v4mapped(inet->inet_daddr, &np->daddr); - if (ipv6_addr_any(&np->saddr)) + if (ipv6_addr_any(&np->saddr) || + ipv6_mapped_addr_any(&np->saddr)) ipv6_addr_set_v4mapped(inet->inet_saddr, &np->saddr); - if (ipv6_addr_any(&np->rcv_saddr)) { + if (ipv6_addr_any(&np->rcv_saddr) || + ipv6_mapped_addr_any(&np->rcv_saddr)) { ipv6_addr_set_v4mapped(inet->inet_rcv_saddr, &np->rcv_saddr); if (sk->sk_prot->rehash)