Introduce LWIP_PACKED_CAST to fix error issue with ARMCC

ARMCC when using __packed structures will not implicitly convert a
pointer to a member of a packed structure to something which does not
have __packed. This results in a compiler error and was found with calls
to icmp6_param_problem

While there is a #pragma pack mode in ARMCC that disables this error, it
does require existing ports to switch over their packing mode and
perform integration
This commit is contained in:
Joel Cunningham 2017-10-31 09:41:19 -05:00
parent d39e8cd827
commit 472f7985b5
2 changed files with 6 additions and 1 deletions

View File

@ -976,7 +976,7 @@ netif_found:
/* check payload length is multiple of 8 octets when mbit is set */ /* check payload length is multiple of 8 octets when mbit is set */
if (IP6_FRAG_MBIT(frag_hdr) && (IP6H_PLEN(ip6hdr) & 0x7)) { if (IP6_FRAG_MBIT(frag_hdr) && (IP6H_PLEN(ip6hdr) & 0x7)) {
/* ipv6 payload length is not multiple of 8 octets */ /* ipv6 payload length is not multiple of 8 octets */
icmp6_param_problem(p, ICMP6_PP_FIELD, &ip6hdr->_plen); icmp6_param_problem(p, ICMP6_PP_FIELD, LWIP_PACKED_CAST(const void *, &ip6hdr->_plen));
LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with invalid payload length dropped\n")); LWIP_DEBUGF(IP6_DEBUG, ("ip6_input: packet with invalid payload length dropped\n"));
pbuf_free(p); pbuf_free(p);
IP6_STATS_INC(ip6.drop); IP6_STATS_INC(ip6.drop);

View File

@ -220,6 +220,11 @@ typedef int ssize_t;
#define LWIP_PTR_NUMERIC_CAST(target_type, val) LWIP_CONST_CAST(target_type, val) #define LWIP_PTR_NUMERIC_CAST(target_type, val) LWIP_CONST_CAST(target_type, val)
#endif #endif
/** Avoid warnings/errors related to implicitly casting away packed attributes by doing a explicit cast */
#ifndef LWIP_PACKED_CAST
#define LWIP_PACKED_CAST(target_type, val) LWIP_CONST_CAST(target_type, val)
#endif
/** Allocates a memory buffer of specified size that is of sufficient size to align /** Allocates a memory buffer of specified size that is of sufficient size to align
* its start address using LWIP_MEM_ALIGN. * its start address using LWIP_MEM_ALIGN.
* You can declare your own version here e.g. to enforce alignment without adding * You can declare your own version here e.g. to enforce alignment without adding