From e4295396ac25e15c70597443f368bd14bb32c39f Mon Sep 17 00:00:00 2001 From: likewise Date: Thu, 6 May 2004 03:27:13 +0000 Subject: [PATCH] Re-instantiated the pack directives. Nested structs do break individual field natural alignment on arm-gcc. --- doc/sys_arch.txt | 6 ++++ src/include/ipv4/lwip/icmp.h | 38 +++++++++++++------- src/include/ipv4/lwip/ip.h | 28 ++++++++++----- src/include/ipv4/lwip/ip_addr.h | 24 ++++++++++--- src/include/lwip/arch.h | 14 ++++++++ src/include/lwip/dhcp.h | 43 +++++++++++++--------- src/include/lwip/tcp.h | 27 +++++++++----- src/include/lwip/udp.h | 10 +++--- src/include/netif/etharp.h | 64 ++++++++++++++++++--------------- src/netif/ppp/vjbsdhdr.h | 4 +++ 10 files changed, 173 insertions(+), 85 deletions(-) diff --git a/doc/sys_arch.txt b/doc/sys_arch.txt index 9f2a999a..95d0add7 100644 --- a/doc/sys_arch.txt +++ b/doc/sys_arch.txt @@ -154,6 +154,12 @@ cc.h - Architecture environment, some compiler specific, some Typedefs for the types used by lwip - u8_t, s8_t, u16_t, s16_t, u32_t, s32_t, mem_ptr_t + Compiler hints for packing lwip's structures - + PACK_STRUCT_FIELD(x) + PACK_STRUCT_STRUCT + PACK_STRUCT_BEGIN + PACK_STRUCT_END + Platform specific diagnostic output - LWIP_PLATFORM_DIAG(x) - non-fatal, print a message. LWIP_PLATFORM_ASSERT(x) - fatal, print message and abandon execution. diff --git a/src/include/ipv4/lwip/icmp.h b/src/include/ipv4/lwip/icmp.h index 8063eac6..634405b7 100644 --- a/src/include/ipv4/lwip/icmp.h +++ b/src/include/ipv4/lwip/icmp.h @@ -71,24 +71,36 @@ void icmp_input(struct pbuf *p, struct netif *inp); void icmp_dest_unreach(struct pbuf *p, enum icmp_dur_type t); void icmp_time_exceeded(struct pbuf *p, enum icmp_te_type t); +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN struct icmp_echo_hdr { - u16_t _type_code; - u16_t chksum; - u16_t id; - u16_t seqno; -}; + PACK_STRUCT_FIELD(u16_t _type_code); + PACK_STRUCT_FIELD(u16_t chksum); + PACK_STRUCT_FIELD(u16_t id); + PACK_STRUCT_FIELD(u16_t seqno); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +PACK_STRUCT_BEGIN struct icmp_dur_hdr { - u16_t _type_code; - u16_t chksum; - u32_t unused; -}; + PACK_STRUCT_FIELD(u16_t _type_code); + PACK_STRUCT_FIELD(u16_t chksum); + PACK_STRUCT_FIELD(u32_t unused); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +PACK_STRUCT_BEGIN struct icmp_te_hdr { - u16_t _type_code; - u16_t chksum; - u32_t unused; -}; + PACK_STRUCT_FIELD(u16_t _type_code); + PACK_STRUCT_FIELD(u16_t chksum); + PACK_STRUCT_FIELD(u32_t unused); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif #define ICMPH_TYPE(hdr) (ntohs((hdr)->_type_code) >> 8) #define ICMPH_CODE(hdr) (ntohs((hdr)->_type_code) & 0xff) diff --git a/src/include/ipv4/lwip/ip.h b/src/include/ipv4/lwip/ip.h index 58eab8ab..c8b9c222 100644 --- a/src/include/ipv4/lwip/ip.h +++ b/src/include/ipv4/lwip/ip.h @@ -94,27 +94,37 @@ err_t ip_output_if(struct pbuf *p, struct ip_addr *src, struct ip_addr *dest, #define SOF_OOBINLINE (u16_t)0x0100U /* leave received OOB data in line */ #define SOF_REUSEPORT (u16_t)0x0200U /* allow local address & port reuse */ + + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN struct ip_hdr { /* version / header length / type of service */ - u16_t _v_hl_tos; + PACK_STRUCT_FIELD(u16_t _v_hl_tos); /* total length */ - u16_t _len; + PACK_STRUCT_FIELD(u16_t _len); /* identification */ - u16_t _id; + PACK_STRUCT_FIELD(u16_t _id); /* fragment offset field */ - u16_t _offset; + PACK_STRUCT_FIELD(u16_t _offset); #define IP_RF 0x8000 /* reserved fragment flag */ #define IP_DF 0x4000 /* dont fragment flag */ #define IP_MF 0x2000 /* more fragments flag */ #define IP_OFFMASK 0x1fff /* mask for fragmenting bits */ /* time to live / protocol*/ - u16_t _ttl_proto; + PACK_STRUCT_FIELD(u16_t _ttl_proto); /* checksum */ - u16_t _chksum; + PACK_STRUCT_FIELD(u16_t _chksum); /* source and destination IP addresses */ - struct ip_addr src; - struct ip_addr dest; -}; + PACK_STRUCT_FIELD(struct ip_addr src); + PACK_STRUCT_FIELD(struct ip_addr dest); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif #define IPH_V(hdr) (ntohs((hdr)->_v_hl_tos) >> 12) #define IPH_HL(hdr) ((ntohs((hdr)->_v_hl_tos) >> 8) & 0x0f) diff --git a/src/include/ipv4/lwip/ip_addr.h b/src/include/ipv4/lwip/ip_addr.h index e524c8db..7ac4954b 100644 --- a/src/include/ipv4/lwip/ip_addr.h +++ b/src/include/ipv4/lwip/ip_addr.h @@ -34,13 +34,29 @@ #include "lwip/arch.h" +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN struct ip_addr { - u32_t addr; -}; + PACK_STRUCT_FIELD(u32_t addr); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN struct ip_addr2 { - u16_t addrw[2]; -}; + PACK_STRUCT_FIELD(u16_t addrw[2]); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif /* For compatibility with BSD code */ struct in_addr { diff --git a/src/include/lwip/arch.h b/src/include/lwip/arch.h index b70a5fc4..e0d622a4 100644 --- a/src/include/lwip/arch.h +++ b/src/include/lwip/arch.h @@ -42,6 +42,20 @@ #include "arch/cc.h" +#ifndef PACK_STRUCT_BEGIN +#define PACK_STRUCT_BEGIN +#endif /* PACK_STRUCT_BEGIN */ + +#ifndef PACK_STRUCT_END +#define PACK_STRUCT_END +#endif /* PACK_STRUCT_END */ + +#ifndef PACK_STRUCT_FIELD +#define PACK_STRUCT_FIELD(x) x +#endif /* PACK_STRUCT_FIELD */ + + + #ifdef LWIP_PROVIDE_ERRNO #define EPERM 1 /* Operation not permitted */ diff --git a/src/include/lwip/dhcp.h b/src/include/lwip/dhcp.h index 0314171a..73a0bcba 100644 --- a/src/include/lwip/dhcp.h +++ b/src/include/lwip/dhcp.h @@ -55,35 +55,44 @@ struct dhcp #endif }; +/* MUST be compiled with "pack structs" or equivalent! */ +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN /** minimum set of fields of any DHCP message */ struct dhcp_msg { - u8_t op; - u8_t htype; - u8_t hlen; - u8_t hops; - u32_t xid; - u16_t secs; - u16_t flags; - struct ip_addr ciaddr; - struct ip_addr yiaddr; - struct ip_addr siaddr; - struct ip_addr giaddr; + PACK_STRUCT_FIELD(u8_t op); + PACK_STRUCT_FIELD(u8_t htype); + PACK_STRUCT_FIELD(u8_t hlen); + PACK_STRUCT_FIELD(u8_t hops); + PACK_STRUCT_FIELD(u32_t xid); + PACK_STRUCT_FIELD(u16_t secs); + PACK_STRUCT_FIELD(u16_t flags); + PACK_STRUCT_FIELD(struct ip_addr ciaddr); + PACK_STRUCT_FIELD(struct ip_addr yiaddr); + PACK_STRUCT_FIELD(struct ip_addr siaddr); + PACK_STRUCT_FIELD(struct ip_addr giaddr); #define DHCP_CHADDR_LEN 16U - u8_t chaddr[DHCP_CHADDR_LEN]; + PACK_STRUCT_FIELD(u8_t chaddr[DHCP_CHADDR_LEN]); #define DHCP_SNAME_LEN 64U - u8_t sname[DHCP_SNAME_LEN]; + PACK_STRUCT_FIELD(u8_t sname[DHCP_SNAME_LEN]); #define DHCP_FILE_LEN 128U - u8_t file[DHCP_FILE_LEN]; - u32_t cookie; + PACK_STRUCT_FIELD(u8_t file[DHCP_FILE_LEN]); + PACK_STRUCT_FIELD(u32_t cookie); #define DHCP_MIN_OPTIONS_LEN 68U /** allow this to be configured in lwipopts.h, but not too small */ #if ((!defined(DHCP_OPTIONS_LEN)) || (DHCP_OPTIONS_LEN < DHCP_MIN_OPTIONS_LEN)) /** set this to be sufficient for your options in outgoing DHCP msgs */ # define DHCP_OPTIONS_LEN DHCP_MIN_OPTIONS_LEN #endif - u8_t options[DHCP_OPTIONS_LEN]; -}; + PACK_STRUCT_FIELD(u8_t options[DHCP_OPTIONS_LEN]); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif /** start DHCP configuration */ err_t dhcp_start(struct netif *netif); diff --git a/src/include/lwip/tcp.h b/src/include/lwip/tcp.h index 95d1febc..d200e7c3 100644 --- a/src/include/lwip/tcp.h +++ b/src/include/lwip/tcp.h @@ -161,16 +161,25 @@ void tcp_rexmit (struct tcp_pcb *pcb); #define TCP_KEEPCNT 9 /* Counter for KEEPALIVE probes */ #define TCP_MAXIDLE TCP_KEEPCNT * TCP_KEEPINTVL /* Maximum KEEPALIVE probe time */ + +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" +#endif +PACK_STRUCT_BEGIN struct tcp_hdr { - u16_t src; - u16_t dest; - u32_t seqno; - u32_t ackno; - u16_t _hdrlen_rsvd_flags; - u16_t wnd; - u16_t chksum; - u16_t urgp; -}; + PACK_STRUCT_FIELD(u16_t src); + PACK_STRUCT_FIELD(u16_t dest); + PACK_STRUCT_FIELD(u32_t seqno); + PACK_STRUCT_FIELD(u32_t ackno); + PACK_STRUCT_FIELD(u16_t _hdrlen_rsvd_flags); + PACK_STRUCT_FIELD(u16_t wnd); + PACK_STRUCT_FIELD(u16_t chksum); + PACK_STRUCT_FIELD(u16_t urgp); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif #define TCPH_OFFSET(phdr) (ntohs((phdr)->_hdrlen_rsvd_flags) >> 8) #define TCPH_HDRLEN(phdr) (ntohs((phdr)->_hdrlen_rsvd_flags) >> 12) diff --git a/src/include/lwip/udp.h b/src/include/lwip/udp.h index 94a7227f..c5485947 100644 --- a/src/include/lwip/udp.h +++ b/src/include/lwip/udp.h @@ -41,11 +41,11 @@ #define UDP_HLEN 8 struct udp_hdr { - u16_t src; - u16_t dest; /* src/dest UDP ports */ - u16_t len; - u16_t chksum; -}; + PACK_STRUCT_FIELD(u16_t src); + PACK_STRUCT_FIELD(u16_t dest); /* src/dest UDP ports */ + PACK_STRUCT_FIELD(u16_t len); + PACK_STRUCT_FIELD(u16_t chksum); +} PACK_STRUCT_STRUCT; #define UDP_FLAGS_NOCHKSUM 0x01U #define UDP_FLAGS_UDPLITE 0x02U diff --git a/src/include/netif/etharp.h b/src/include/netif/etharp.h index 6142922d..4d6eefa0 100644 --- a/src/include/netif/etharp.h +++ b/src/include/netif/etharp.h @@ -44,41 +44,49 @@ #include "lwip/netif.h" #include "lwip/ip.h" -struct eth_addr { - u8_t addr[6]; -}; - -struct eth_hdr { - /* Ethernet header is 14 bytes, this breaks natural alignment on - * subsequent (TCP/IP) protocol header fields. */ -#if ETH_PAD_SIZE - u8_t padding[ETH_PAD_SIZE]; +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/bpstruct.h" #endif - struct eth_addr dest; - struct eth_addr src; - u16_t type; -}; +PACK_STRUCT_BEGIN +struct eth_addr { + PACK_STRUCT_FIELD(u8_t addr[6]); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +PACK_STRUCT_BEGIN +struct eth_hdr { +#if ETH_PAD_SIZE + PACK_STRUCT_FIELD(u8_t padding[ETH_PAD_SIZE]); +#endif + PACK_STRUCT_FIELD(struct eth_addr dest); + PACK_STRUCT_FIELD(struct eth_addr src); + PACK_STRUCT_FIELD(u16_t type); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END + +PACK_STRUCT_BEGIN /** the ARP message */ struct etharp_hdr { - /* Ethernet header */ - struct eth_hdr ethhdr; - u16_t hwtype; - u16_t proto; - u16_t _hwlen_protolen; - u16_t opcode; - struct eth_addr shwaddr; - /* assume 2-byte alignment */ - struct ip_addr2 sipaddr; - struct eth_addr dhwaddr; - /* assume 2-byte alignment */ - struct ip_addr2 dipaddr; -}; + PACK_STRUCT_FIELD(struct eth_hdr ethhdr); + PACK_STRUCT_FIELD(u16_t hwtype); + PACK_STRUCT_FIELD(u16_t proto); + PACK_STRUCT_FIELD(u16_t _hwlen_protolen); + PACK_STRUCT_FIELD(u16_t opcode); + PACK_STRUCT_FIELD(struct eth_addr shwaddr); + PACK_STRUCT_FIELD(struct ip_addr2 sipaddr); + PACK_STRUCT_FIELD(struct eth_addr dhwaddr); + PACK_STRUCT_FIELD(struct ip_addr2 dipaddr); +} PACK_STRUCT_STRUCT; +PACK_STRUCT_END +PACK_STRUCT_BEGIN struct ethip_hdr { - struct eth_hdr eth; - struct ip_hdr ip; + PACK_STRUCT_FIELD(struct eth_hdr eth); + PACK_STRUCT_FIELD(struct ip_hdr ip); }; +#ifdef PACK_STRUCT_USE_INCLUDES +# include "arch/epstruct.h" +#endif #define ARP_TMR_INTERVAL 10000 diff --git a/src/netif/ppp/vjbsdhdr.h b/src/netif/ppp/vjbsdhdr.h index 8a5ecc3b..a089352a 100644 --- a/src/netif/ppp/vjbsdhdr.h +++ b/src/netif/ppp/vjbsdhdr.h @@ -11,6 +11,7 @@ * pragmatically since otherwise unsigned comparisons can result * against negative integers quite easily, and fail in subtle ways. */ +PACK_STRUCT_BEGIN struct ip { #if defined(NO_CHAR_BITFIELDS) @@ -38,6 +39,7 @@ struct ip u_short ip_sum; /* checksum */ struct in_addr ip_src,ip_dst; /* source and dest address */ }; +PACK_STRUCT_END typedef u32_t tcp_seq; @@ -45,6 +47,7 @@ typedef u32_t tcp_seq; * TCP header. * Per RFC 793, September, 1981. */ +PACK_STRUCT_BEGIN struct tcphdr { u_short th_sport; /* source port */ @@ -68,5 +71,6 @@ struct tcphdr u_short th_sum; /* checksum */ u_short th_urp; /* urgent pointer */ }; +PACK_STRUCT_END #endif /* VJBSDHDR_H */