diff --git a/include/net/net_ip.h b/include/net/net_ip.h index f9e62129a9e..295eff1c9f8 100644 --- a/include/net/net_ip.h +++ b/include/net/net_ip.h @@ -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; diff --git a/subsys/net/ip/6lo.c b/subsys/net/ip/6lo.c index f33c29933d4..07c939d9c78 100644 --- a/subsys/net/ip/6lo.c +++ b/subsys/net/ip/6lo.c @@ -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)); } diff --git a/subsys/net/ip/connection.c b/subsys/net/ip/connection.c index 7e1b43f4bfb..56430fb0a7c 100644 --- a/subsys/net/ip/connection.c +++ b/subsys/net/ip/connection.c @@ -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) diff --git a/subsys/net/ip/net_if.c b/subsys/net/ip/net_if.c index 6aa4082dd42..744a8fe2af5 100644 --- a/subsys/net/ip/net_if.c +++ b/subsys/net/ip/net_if.c @@ -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) { diff --git a/subsys/net/ip/rpl.h b/subsys/net/ip/rpl.h index 8e32a03b3c1..06b9c126603 100644 --- a/subsys/net/ip/rpl.h +++ b/subsys/net/ip/rpl.h @@ -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; diff --git a/subsys/net/ip/utils.c b/subsys/net/ip/utils.c index 600a1d3ba59..e06f08384d3 100644 --- a/subsys/net/ip/utils.c +++ b/subsys/net/ip/utils.c @@ -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, ':');