Add v4mapped address inline
Subsystems (6)
Add v4mapped address inline to avoid calls to ipv6_addr_type().
include/net/ipv6.h +6 -0
@@ -418,6 +418,12 @@ static inline int ipv6_addr_diff(const struct in6_addr *a1, const struct in6_addreturn __ipv6_addr_diff (a1, a2,sizeof (struct in6_addr )); } +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 )); +} +/* * Prototypes exported by ipv6 */
net/ipv6/ipv6_sockglue.c +1 -1
@@ -249,7 +249,7 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname, }if (ipv6_only_sock (sk) || - !(ipv6_addr_type (&np->daddr) &IPV6_ADDR_MAPPED )) { + !ipv6_addr_v4mapped (&np->daddr)) { retv = -EADDRNOTAVAIL ;break ; }
net/ipv6/tcp_ipv6.c +2 -2
@@ -697,7 +697,7 @@ static int tcp_v6_parse_md5_keys (struct sock *sk, char __user *optval,if (!cmd.tcpm_keylen) {if (!tcp_sk (sk)->md5sig_info)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_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 );if (!newkey)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 ], newkey, cmd.tcpm_keylen); }
net/ipv6/udp.c +1 -1
@@ -610,7 +610,7 @@ int udpv6_sendmsg(struct kiocb *iocb, struct sock *sk, daddr =NULL ;if (daddr) { -if (ipv6_addr_type (daddr) ==IPV6_ADDR_MAPPED ) { +if (ipv6_addr_v4mapped (daddr)) {struct sockaddr_in sin; sin.sin_family =AF_INET ; sin.sin_port = sin6 ? sin6->sin6_port : inet->dport;
net/sctp/ipv6.c +2 -2
@@ -481,7 +481,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 ==AF_INET && 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 && addr2->v6.sin6_addr.s6_addr32[3 ] == addr1->v4.sin_addr.s_addr)
@@ -489,7 +489,7 @@ static int sctp_v6_cmp_addr(const union sctp_addr *addr1, }if (addr2->sa.sa_family ==AF_INET && 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 && addr1->v6.sin6_addr.s6_addr32[3 ] == addr2->v4.sin_addr.s_addr)
Hello.
In article <[email protected]> (at Thu, 23 Aug 2007 12:40:54 -0400), Brian Haley <[email protected]> says:
Quoted 5 lines
include/net/ipv6.h +0
-0
include/net/ipv6.h static inline int ipv6_addr_diff(const struct in6_addr *a1, const struct in6_add · line 426
Quoted 9 lines
include/net/ipv6.h +6
-0@@ -418,6 +418,12 @@ static inline int ipv6_addr_diff(const struct in6_addr *a1, const struct in6_addreturn __ipv6_addr_diff (a1, a2,sizeof (struct in6_addr )); } +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 )); +} +
Please put this just after ipv6_addr_any(), not after ipv6_addr_diff().
--yoshfuji
Quoted 2 lines · YOSHIFUJI Hideaki / ????
Please put this just after
ipv6_addr_any(), not afteripv6_addr_diff().
Ok, updated patch attached.
-Brian
Add v4mapped address inline to avoid calls to ipv6_addr_type().
include/net/ipv6.h +6 -0
@@ -377,6 +377,12 @@ static inline int ipv6_addr_any(const struct in6_addr *a) 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 * length of address must be a multiple of 32bits
net/ipv6/ipv6_sockglue.c +1 -1
@@ -249,7 +249,7 @@ static int do_ipv6_setsockopt(struct sock *sk, int level, int optname, }if (ipv6_only_sock (sk) || - !(ipv6_addr_type (&np->daddr) &IPV6_ADDR_MAPPED )) { + !ipv6_addr_v4mapped (&np->daddr)) { retv = -EADDRNOTAVAIL ;break ; }
net/ipv6/tcp_ipv6.c +2 -2
@@ -697,7 +697,7 @@ static int tcp_v6_parse_md5_keys (struct sock *sk, char __user *optval,if (!cmd.tcpm_keylen) {if (!tcp_sk (sk)->md5sig_info)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_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 );if (!newkey)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 ], newkey, cmd.tcpm_keylen); }
net/ipv6/udp.c +1 -1
@@ -610,7 +610,7 @@ int udpv6_sendmsg(struct kiocb *iocb, struct sock *sk, daddr =NULL ;if (daddr) { -if (ipv6_addr_type (daddr) ==IPV6_ADDR_MAPPED ) { +if (ipv6_addr_v4mapped (daddr)) {struct sockaddr_in sin; sin.sin_family =AF_INET ; sin.sin_port = sin6 ? sin6->sin6_port : inet->dport;
net/sctp/ipv6.c +2 -2
@@ -481,7 +481,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 ==AF_INET && 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 && addr2->v6.sin6_addr.s6_addr32[3 ] == addr1->v4.sin_addr.s_addr)
@@ -489,7 +489,7 @@ static int sctp_v6_cmp_addr(const union sctp_addr *addr1, }if (addr2->sa.sa_family ==AF_INET && 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 && addr1->v6.sin6_addr.s6_addr32[3 ] == addr2->v4.sin_addr.s_addr)
In article <[email protected]> (at Thu, 23 Aug 2007 14:14:35 -0400), Brian Haley <[email protected]> says:
Quoted 4 lines
Quoted 2 lines · YOSHIFUJI Hideaki / ????
Please put this just after
ipv6_addr_any(), not afteripv6_addr_diff().
Quoted 8 lines
Ok, updated patch attached.
-Brian
Add v4mapped address inline to avoid calls to
ipv6_addr_type().Signed-off-by Brian Haley <[email protected]>
--yoshfuji
From: Brian Haley <[email protected]>
Date: Thu, 23 Aug 2007 14:14:35 -0400
Quoted 9 lines
Quoted 2 lines · YOSHIFUJI Hideaki / ????
Please put this just after
ipv6_addr_any(), not afteripv6_addr_diff().Ok, updated patch attached.
Add v4mapped address inline to avoid calls to
ipv6_addr_type().Signed-off-by Brian Haley <[email protected]>
Applied, thanks Brian.