提交 e773e4fa 编写于 作者: B Brian Haley 提交者: David S. Miller

[IPV6]: Add v4mapped address inline

Add v4mapped address inline to avoid calls to ipv6_addr_type().
Signed-off-by: NBrian Haley <brian.haley@hp.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 6f4fc423
...@@ -377,6 +377,12 @@ static inline int ipv6_addr_any(const struct in6_addr *a) ...@@ -377,6 +377,12 @@ static inline int ipv6_addr_any(const struct in6_addr *a)
a->s6_addr32[2] | a->s6_addr32[3] ) == 0); a->s6_addr32[2] | a->s6_addr32[3] ) == 0);
} }
static inline int ipv6_addr_v4mapped(const struct in6_addr *a)
{
return ((a->s6_addr32[0] | a->s6_addr32[1]) == 0 &&
a->s6_addr32[2] == htonl(0x0000ffff));
}
/* /*
* find the first different bit between two addresses * find the first different bit between two addresses
* length of address must be a multiple of 32bits * length of address must be a multiple of 32bits
......
...@@ -249,7 +249,7 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname, ...@@ -249,7 +249,7 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname,
} }
if (ipv6_only_sock(sk) || if (ipv6_only_sock(sk) ||
!(ipv6_addr_type(&np->daddr) & IPV6_ADDR_MAPPED)) { !ipv6_addr_v4mapped(&np->daddr)) {
retv = -EADDRNOTAVAIL; retv = -EADDRNOTAVAIL;
break; break;
} }
......
...@@ -697,7 +697,7 @@ static int tcp_v6_parse_md5_keys (struct sock *sk, char __user *optval, ...@@ -697,7 +697,7 @@ static int tcp_v6_parse_md5_keys (struct sock *sk, char __user *optval,
if (!cmd.tcpm_keylen) { if (!cmd.tcpm_keylen) {
if (!tcp_sk(sk)->md5sig_info) if (!tcp_sk(sk)->md5sig_info)
return -ENOENT; return -ENOENT;
if (ipv6_addr_type(&sin6->sin6_addr) & IPV6_ADDR_MAPPED) if (ipv6_addr_v4mapped(&sin6->sin6_addr))
return tcp_v4_md5_do_del(sk, sin6->sin6_addr.s6_addr32[3]); return tcp_v4_md5_do_del(sk, sin6->sin6_addr.s6_addr32[3]);
return tcp_v6_md5_do_del(sk, &sin6->sin6_addr); return tcp_v6_md5_do_del(sk, &sin6->sin6_addr);
} }
...@@ -720,7 +720,7 @@ static int tcp_v6_parse_md5_keys (struct sock *sk, char __user *optval, ...@@ -720,7 +720,7 @@ static int tcp_v6_parse_md5_keys (struct sock *sk, char __user *optval,
newkey = kmemdup(cmd.tcpm_key, cmd.tcpm_keylen, GFP_KERNEL); newkey = kmemdup(cmd.tcpm_key, cmd.tcpm_keylen, GFP_KERNEL);
if (!newkey) if (!newkey)
return -ENOMEM; return -ENOMEM;
if (ipv6_addr_type(&sin6->sin6_addr) & IPV6_ADDR_MAPPED) { if (ipv6_addr_v4mapped(&sin6->sin6_addr)) {
return tcp_v4_md5_do_add(sk, sin6->sin6_addr.s6_addr32[3], return tcp_v4_md5_do_add(sk, sin6->sin6_addr.s6_addr32[3],
newkey, cmd.tcpm_keylen); newkey, cmd.tcpm_keylen);
} }
......
...@@ -612,7 +612,7 @@ int udpv6_sendmsg(struct kiocb *iocb, struct sock *sk, ...@@ -612,7 +612,7 @@ int udpv6_sendmsg(struct kiocb *iocb, struct sock *sk,
daddr = NULL; daddr = NULL;
if (daddr) { if (daddr) {
if (ipv6_addr_type(daddr) == IPV6_ADDR_MAPPED) { if (ipv6_addr_v4mapped(daddr)) {
struct sockaddr_in sin; struct sockaddr_in sin;
sin.sin_family = AF_INET; sin.sin_family = AF_INET;
sin.sin_port = sin6 ? sin6->sin6_port : inet->dport; sin.sin_port = sin6 ? sin6->sin6_port : inet->dport;
......
...@@ -493,7 +493,7 @@ static int sctp_v6_cmp_addr(const union sctp_addr *addr1, ...@@ -493,7 +493,7 @@ static int sctp_v6_cmp_addr(const union sctp_addr *addr1,
if (addr1->sa.sa_family != addr2->sa.sa_family) { if (addr1->sa.sa_family != addr2->sa.sa_family) {
if (addr1->sa.sa_family == AF_INET && if (addr1->sa.sa_family == AF_INET &&
addr2->sa.sa_family == AF_INET6 && addr2->sa.sa_family == AF_INET6 &&
IPV6_ADDR_MAPPED == ipv6_addr_type(&addr2->v6.sin6_addr)) { ipv6_addr_v4mapped(&addr2->v6.sin6_addr)) {
if (addr2->v6.sin6_port == addr1->v4.sin_port && if (addr2->v6.sin6_port == addr1->v4.sin_port &&
addr2->v6.sin6_addr.s6_addr32[3] == addr2->v6.sin6_addr.s6_addr32[3] ==
addr1->v4.sin_addr.s_addr) addr1->v4.sin_addr.s_addr)
...@@ -501,7 +501,7 @@ static int sctp_v6_cmp_addr(const union sctp_addr *addr1, ...@@ -501,7 +501,7 @@ static int sctp_v6_cmp_addr(const union sctp_addr *addr1,
} }
if (addr2->sa.sa_family == AF_INET && if (addr2->sa.sa_family == AF_INET &&
addr1->sa.sa_family == AF_INET6 && addr1->sa.sa_family == AF_INET6 &&
IPV6_ADDR_MAPPED == ipv6_addr_type(&addr1->v6.sin6_addr)) { ipv6_addr_v4mapped(&addr1->v6.sin6_addr)) {
if (addr1->v6.sin6_port == addr2->v4.sin_port && if (addr1->v6.sin6_port == addr2->v4.sin_port &&
addr1->v6.sin6_addr.s6_addr32[3] == addr1->v6.sin6_addr.s6_addr32[3] ==
addr2->v4.sin_addr.s_addr) addr2->v4.sin_addr.s_addr)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册