net: use UNALIGNED_GET/PUT to access IP address

Use UNALIGNED_GET and UNALIGNED_PUT throughout the networking stack to
access fields from the IP address structure. These structures can be
mapped directly to buffers and the macros are required for correct
unaligned memory access.

Jira: ZEP-2012

Change-Id: I55f9da7b143a22fa869d5d215c661de988cd9b91
Signed-off-by: Bogdan Davidoaia <bogdan.davidoaia@linaro.org>
This commit is contained in:
Bogdan Davidoaia 2017-04-10 17:13:35 +03:00 committed by Jukka Rissanen
commit 290e1d8451
6 changed files with 66 additions and 73 deletions

View file

@ -316,10 +316,10 @@ struct net_tcp_hdr {
*/
static inline bool net_is_ipv6_addr_loopback(struct in6_addr *addr)
{
return addr->s6_addr32[0] == 0 &&
addr->s6_addr32[1] == 0 &&
addr->s6_addr32[2] == 0 &&
ntohl(addr->s6_addr32[3]) == 1;
return UNALIGNED_GET(&addr->s6_addr32[0]) == 0 &&
UNALIGNED_GET(&addr->s6_addr32[1]) == 0 &&
UNALIGNED_GET(&addr->s6_addr32[2]) == 0 &&
ntohl(UNALIGNED_GET(&addr->s6_addr32[3])) == 1;
}
/**
@ -508,8 +508,7 @@ static inline bool net_ipv6_addr_cmp(const struct in6_addr *addr1,
*/
static inline bool net_is_ipv6_ll_addr(const struct in6_addr *addr)
{
return ((addr->s6_addr[0]) == 0xFE) &&
((addr->s6_addr[1]) == 0x80);
return UNALIGNED_GET(&addr->s6_addr16[0]) == htons(0xFE80);
}
/**
@ -561,8 +560,10 @@ static inline bool net_ipv4_addr_mask_cmp(struct net_if *iface,
*/
static inline bool net_is_ipv6_addr_unspecified(const struct in6_addr *addr)
{
return addr->s6_addr32[0] == 0 && addr->s6_addr32[1] == 0 &&
addr->s6_addr32[2] == 0 && addr->s6_addr32[3] == 0;
return UNALIGNED_GET(&addr->s6_addr32[0]) == 0 &&
UNALIGNED_GET(&addr->s6_addr32[1]) == 0 &&
UNALIGNED_GET(&addr->s6_addr32[2]) == 0 &&
UNALIGNED_GET(&addr->s6_addr32[3]) == 0;
}
/**
@ -575,10 +576,11 @@ static inline bool net_is_ipv6_addr_unspecified(const struct in6_addr *addr)
*/
static inline bool net_is_ipv6_addr_solicited_node(const struct in6_addr *addr)
{
return addr->s6_addr32[0] == htonl(0xff020000) &&
addr->s6_addr32[1] == 0x00000000 &&
addr->s6_addr32[2] == htonl(0x00000001) &&
((addr->s6_addr32[3] & htonl(0xff000000)) == htonl(0xff000000));
return UNALIGNED_GET(&addr->s6_addr32[0]) == htonl(0xff020000) &&
UNALIGNED_GET(&addr->s6_addr32[1]) == 0x00000000 &&
UNALIGNED_GET(&addr->s6_addr32[2]) == htonl(0x00000001) &&
((UNALIGNED_GET(&addr->s6_addr32[3]) & htonl(0xff000000)) ==
htonl(0xff000000));
}
/**
@ -607,15 +609,15 @@ void net_ipv6_addr_create_solicited_node(const struct in6_addr *src,
{
dst->s6_addr[0] = 0xFF;
dst->s6_addr[1] = 0x02;
dst->s6_addr16[1] = 0;
dst->s6_addr16[2] = 0;
dst->s6_addr16[3] = 0;
dst->s6_addr16[4] = 0;
UNALIGNED_PUT(0, &dst->s6_addr16[1]);
UNALIGNED_PUT(0, &dst->s6_addr16[2]);
UNALIGNED_PUT(0, &dst->s6_addr16[3]);
UNALIGNED_PUT(0, &dst->s6_addr16[4]);
dst->s6_addr[10] = 0;
dst->s6_addr[11] = 0x01;
dst->s6_addr[12] = 0xFF;
dst->s6_addr[13] = src->s6_addr[13];
dst->s6_addr16[7] = src->s6_addr16[7];
UNALIGNED_PUT(UNALIGNED_GET(&src->s6_addr16[7]), &dst->s6_addr16[7]);
}
/** @brief Construct an IPv6 address from eight 16-bit words.
@ -636,14 +638,14 @@ static inline void net_ipv6_addr_create(struct in6_addr *addr,
uint16_t addr4, uint16_t addr5,
uint16_t addr6, uint16_t addr7)
{
addr->s6_addr16[0] = htons(addr0);
addr->s6_addr16[1] = htons(addr1);
addr->s6_addr16[2] = htons(addr2);
addr->s6_addr16[3] = htons(addr3);
addr->s6_addr16[4] = htons(addr4);
addr->s6_addr16[5] = htons(addr5);
addr->s6_addr16[6] = htons(addr6);
addr->s6_addr16[7] = htons(addr7);
UNALIGNED_PUT(htons(addr0), &addr->s6_addr16[0]);
UNALIGNED_PUT(htons(addr1), &addr->s6_addr16[1]);
UNALIGNED_PUT(htons(addr2), &addr->s6_addr16[2]);
UNALIGNED_PUT(htons(addr3), &addr->s6_addr16[3]);
UNALIGNED_PUT(htons(addr4), &addr->s6_addr16[4]);
UNALIGNED_PUT(htons(addr5), &addr->s6_addr16[5]);
UNALIGNED_PUT(htons(addr6), &addr->s6_addr16[6]);
UNALIGNED_PUT(htons(addr7), &addr->s6_addr16[7]);
}
/**
@ -667,8 +669,8 @@ static inline void net_ipv6_addr_create_iid(struct in6_addr *addr,
{
addr->s6_addr[0] = 0xfe;
addr->s6_addr[1] = 0x80;
addr->s6_addr16[1] = 0;
addr->s6_addr32[1] = 0;
UNALIGNED_PUT(0, &addr->s6_addr16[1]);
UNALIGNED_PUT(0, &addr->s6_addr32[1]);
switch (lladdr->len) {
case 2:
@ -676,7 +678,7 @@ static inline void net_ipv6_addr_create_iid(struct in6_addr *addr,
* Universal/Local bit. RFC 6282 ch 3.2.2
*/
if (lladdr->type == NET_LINK_IEEE802154) {
addr->s6_addr32[2] = 0;
UNALIGNED_PUT(0, &addr->s6_addr32[2]);
addr->s6_addr[11] = 0xff;
addr->s6_addr[12] = 0xfe;
addr->s6_addr[13] = 0;

View file

@ -53,45 +53,36 @@ static struct net_6lo_context ctx_6co[CONFIG_NET_MAX_6LO_CONTEXTS];
static inline bool net_6lo_ll_prefix_padded_with_zeros(struct in6_addr *addr)
{
return ((addr->s6_addr[2] == 0x00) &&
(addr->s6_addr[3] == 0x00) &&
(addr->s6_addr[4] == 0x00) &&
(addr->s6_addr[5] == 0x00) &&
(addr->s6_addr[6] == 0x00) &&
(addr->s6_addr[7] == 0x00));
return ((UNALIGNED_GET(&addr->s6_addr16[1]) == 0x00) &&
(UNALIGNED_GET(&addr->s6_addr32[1]) == 0x00));
}
static inline bool net_6lo_addr_16_bit_compressible(struct in6_addr *addr)
{
return ((addr->s6_addr[8] == 0x00) &&
(addr->s6_addr[9] == 0x00) &&
(addr->s6_addr[10] == 0x00) &&
(addr->s6_addr[11] == 0xFF) &&
(addr->s6_addr[12] == 0xFE) &&
(addr->s6_addr[13] == 0x00));
return ((UNALIGNED_GET(&addr->s6_addr32[2]) == htonl(0xFF)) &&
(UNALIGNED_GET(&addr->s6_addr16[6]) == htons(0xFE00)));
}
static inline bool net_6lo_maddr_8_bit_compressible(struct in6_addr *addr)
{
return ((addr->s6_addr[1] == 0x02) &&
(addr->s6_addr16[1] == 0x00) &&
(addr->s6_addr32[1] == 0x00) &&
(addr->s6_addr32[2] == 0x00) &&
(UNALIGNED_GET(&addr->s6_addr16[1]) == 0x00) &&
(UNALIGNED_GET(&addr->s6_addr32[1]) == 0x00) &&
(UNALIGNED_GET(&addr->s6_addr32[2]) == 0x00) &&
(addr->s6_addr[14] == 0x00));
}
static inline bool net_6lo_maddr_32_bit_compressible(struct in6_addr *addr)
{
return ((addr->s6_addr32[1] == 0x00) &&
(addr->s6_addr32[2] == 0x00) &&
return ((UNALIGNED_GET(&addr->s6_addr32[1]) == 0x00) &&
(UNALIGNED_GET(&addr->s6_addr32[2]) == 0x00) &&
(addr->s6_addr[12] == 0x00));
}
static inline bool net_6lo_maddr_48_bit_compressible(struct in6_addr *addr)
{
return ((addr->s6_addr32[1] == 0x00) &&
(addr->s6_addr16[4] == 0x00) &&
return ((UNALIGNED_GET(&addr->s6_addr32[1]) == 0x00) &&
(UNALIGNED_GET(&addr->s6_addr16[4]) == 0x00) &&
(addr->s6_addr[10] == 0x00));
}

View file

@ -107,23 +107,23 @@ static inline uint16_t ipv6_to_hash(struct in6_addr *addr)
/* Use more bits from the lower part of address space */
return
/* Take 3 bits from higher values */
TAKE_BIT(addr->s6_addr32[0], 31, 11, 1) |
TAKE_BIT(addr->s6_addr32[0], 15, 11, 2) |
TAKE_BIT(addr->s6_addr32[0], 7, 11, 3) |
TAKE_BIT(UNALIGNED_GET(&addr->s6_addr32[0]), 31, 11, 1) |
TAKE_BIT(UNALIGNED_GET(&addr->s6_addr32[0]), 15, 11, 2) |
TAKE_BIT(UNALIGNED_GET(&addr->s6_addr32[0]), 7, 11, 3) |
/* Take 2 bits from higher middle values */
TAKE_BIT(addr->s6_addr32[1], 31, 11, 4) |
TAKE_BIT(addr->s6_addr32[1], 15, 11, 5) |
TAKE_BIT(UNALIGNED_GET(&addr->s6_addr32[1]), 31, 11, 4) |
TAKE_BIT(UNALIGNED_GET(&addr->s6_addr32[1]), 15, 11, 5) |
/* Take 2 bits from lower middle values */
TAKE_BIT(addr->s6_addr32[2], 31, 11, 6) |
TAKE_BIT(addr->s6_addr32[2], 15, 11, 7) |
TAKE_BIT(UNALIGNED_GET(&addr->s6_addr32[2]), 31, 11, 6) |
TAKE_BIT(UNALIGNED_GET(&addr->s6_addr32[2]), 15, 11, 7) |
/* Take 4 bits from lower values */
TAKE_BIT(addr->s6_addr32[3], 31, 11, 8) |
TAKE_BIT(addr->s6_addr32[3], 15, 11, 9) |
TAKE_BIT(addr->s6_addr32[3], 7, 11, 10) |
TAKE_BIT(addr->s6_addr32[3], 0, 11, 11);
TAKE_BIT(UNALIGNED_GET(&addr->s6_addr32[3]), 31, 11, 8) |
TAKE_BIT(UNALIGNED_GET(&addr->s6_addr32[3]), 15, 11, 9) |
TAKE_BIT(UNALIGNED_GET(&addr->s6_addr32[3]), 7, 11, 10) |
TAKE_BIT(UNALIGNED_GET(&addr->s6_addr32[3]), 0, 11, 11);
}
static inline uint16_t ipv4_to_hash(struct in_addr *addr)

View file

@ -1414,7 +1414,7 @@ struct net_if_addr *net_if_ipv4_addr_lookup(const struct in_addr *addr,
continue;
}
if (addr->s4_addr32[0] ==
if (UNALIGNED_GET(&addr->s4_addr32[0]) ==
iface->ipv4.unicast[i].address.in_addr.s_addr[0]) {
if (ret) {

View file

@ -639,10 +639,10 @@ struct net_rpl_route_entry {
*/
static inline bool net_rpl_is_ipv6_addr_mcast(const struct in6_addr *addr)
{
return addr->s6_addr32[0] == htonl(0xff020000) &&
addr->s6_addr32[1] == 0x00000000 &&
addr->s6_addr32[2] == 0x00000000 &&
addr->s6_addr32[3] == htonl(0x0000001a);
return UNALIGNED_GET(&addr->s6_addr32[0]) == htonl(0xff020000) &&
UNALIGNED_GET(&addr->s6_addr32[1]) == 0x00000000 &&
UNALIGNED_GET(&addr->s6_addr32[2]) == 0x00000000 &&
UNALIGNED_GET(&addr->s6_addr32[3]) == htonl(0x0000001a);
}
/**
@ -657,12 +657,12 @@ struct in6_addr *net_rpl_create_mcast_address(struct in6_addr *addr)
{
addr->s6_addr[0] = 0xFF;
addr->s6_addr[1] = 0x02;
addr->s6_addr16[1] = 0;
addr->s6_addr16[2] = 0;
addr->s6_addr16[3] = 0;
addr->s6_addr16[4] = 0;
addr->s6_addr16[5] = 0;
addr->s6_addr16[6] = 0;
UNALIGNED_PUT(0, &addr->s6_addr16[1]);
UNALIGNED_PUT(0, &addr->s6_addr16[2]);
UNALIGNED_PUT(0, &addr->s6_addr16[3]);
UNALIGNED_PUT(0, &addr->s6_addr16[4]);
UNALIGNED_PUT(0, &addr->s6_addr16[5]);
UNALIGNED_PUT(0, &addr->s6_addr16[6]);
addr->s6_addr[14] = 0;
addr->s6_addr[15] = 0x1a;

View file

@ -306,8 +306,8 @@ int net_addr_pton(sa_family_t family, const char *src,
if (*src != ':') {
/* Normal IPv6 16-bit piece */
addr->s6_addr16[i] = htons(strtol(src, NULL,
16));
UNALIGNED_PUT(htons(strtol(src, NULL, 16)),
&addr->s6_addr16[i]);
src = strchr(src, ':');
if (!src && i < expected_groups - 1) {
return -EINVAL;
@ -320,7 +320,7 @@ int net_addr_pton(sa_family_t family, const char *src,
/* Two colons in a row */
for (; i < expected_groups; i++) {
addr->s6_addr16[i] = 0;
UNALIGNED_PUT(0, &addr->s6_addr16[i]);
}
tmp = strrchr(src, ':');