ipv6: 64bit version of ipv6_addr_set().
Subsystems (3)
PATCH 4/6 ipv6: 64bit version of ipv6_addr_set().
Signed-off-by YOSHIFUJI Hideaki <[email protected]>
--- include/net/ipv6.h | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-)
include/net/ipv6.h +22 -4
@@ -355,14 +355,32 @@ static inline void ipv6_addr_prefix(struct in6_addr *pfx, pfx->s6_addr[o] = addr->s6_addr[o] & (0xff00 >> b); } +static inline void __ipv6_addr_set_half (__be32 *addr, +__be32 wh,__be32 wl) +{ +#if defined(CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS ) &&BITS_PER_LONG ==64 +#if defined(__BIG_ENDIAN) +if (__builtin_constant_p (wh) &&__builtin_constant_p (wl)) { + *(__force u64 *)addr = ((__force u64)(wh) <<32 | (__force u64)(wl)); +return ; + } +#elif defined(__LITTLE_ENDIAN) +if (__builtin_constant_p (wl) &&__builtin_constant_p (wh)) { + *(__force u64 *)addr = ((__force u64)(wl) <<32 | (__force u64)(wh)); +return ; + } +#endif +#endif + addr[0 ] = wh; + addr[1 ] = wl; +} +static inline void ipv6_addr_set (struct in6_addr *addr,__be32 w1,__be32 w2,__be32 w3,__be32 w4) { - addr->s6_addr32[0 ] = w1; - addr->s6_addr32[1 ] = w2; - addr->s6_addr32[2 ] = w3; - addr->s6_addr32[3 ] = w4; +__ipv6_addr_set_half (&addr->s6_addr32[0 ], w1, w2); +__ipv6_addr_set_half (&addr->s6_addr32[2 ], w3, w4); } static inline bool ipv6_addr_equal(const struct in6_addr *a1,
Signature · 1 line
1.7.9.5