[IPV6]: Add v4mapped address inline
Add v4mapped address inline to avoid calls to ipv6_addr_type(). Signed-off-by: Brian Haley <brian.haley@hp.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
6f4fc423b9
commit
e773e4faa1
@@ -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,
|
|||||||
}
|
}
|
||||||
|
|
||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
}
|
}
|
||||||
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)
|
||||||
|
Reference in New Issue
Block a user