Re-instantiated the pack directives. Nested structs do break individual field natural alignment on arm-gcc.

This commit is contained in:
likewise 2004-05-06 03:27:13 +00:00
parent 5c7a70df28
commit e4295396ac
10 changed files with 173 additions and 85 deletions

View File

@ -154,6 +154,12 @@ cc.h - Architecture environment, some compiler specific, some
Typedefs for the types used by lwip - Typedefs for the types used by lwip -
u8_t, s8_t, u16_t, s16_t, u32_t, s32_t, mem_ptr_t 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 - Platform specific diagnostic output -
LWIP_PLATFORM_DIAG(x) - non-fatal, print a message. LWIP_PLATFORM_DIAG(x) - non-fatal, print a message.
LWIP_PLATFORM_ASSERT(x) - fatal, print message and abandon execution. LWIP_PLATFORM_ASSERT(x) - fatal, print message and abandon execution.

View File

@ -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_dest_unreach(struct pbuf *p, enum icmp_dur_type t);
void icmp_time_exceeded(struct pbuf *p, enum icmp_te_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 { struct icmp_echo_hdr {
u16_t _type_code; PACK_STRUCT_FIELD(u16_t _type_code);
u16_t chksum; PACK_STRUCT_FIELD(u16_t chksum);
u16_t id; PACK_STRUCT_FIELD(u16_t id);
u16_t seqno; PACK_STRUCT_FIELD(u16_t seqno);
}; } PACK_STRUCT_STRUCT;
PACK_STRUCT_END
PACK_STRUCT_BEGIN
struct icmp_dur_hdr { struct icmp_dur_hdr {
u16_t _type_code; PACK_STRUCT_FIELD(u16_t _type_code);
u16_t chksum; PACK_STRUCT_FIELD(u16_t chksum);
u32_t unused; PACK_STRUCT_FIELD(u32_t unused);
}; } PACK_STRUCT_STRUCT;
PACK_STRUCT_END
PACK_STRUCT_BEGIN
struct icmp_te_hdr { struct icmp_te_hdr {
u16_t _type_code; PACK_STRUCT_FIELD(u16_t _type_code);
u16_t chksum; PACK_STRUCT_FIELD(u16_t chksum);
u32_t unused; 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_TYPE(hdr) (ntohs((hdr)->_type_code) >> 8)
#define ICMPH_CODE(hdr) (ntohs((hdr)->_type_code) & 0xff) #define ICMPH_CODE(hdr) (ntohs((hdr)->_type_code) & 0xff)

View File

@ -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_OOBINLINE (u16_t)0x0100U /* leave received OOB data in line */
#define SOF_REUSEPORT (u16_t)0x0200U /* allow local address & port reuse */ #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 { struct ip_hdr {
/* version / header length / type of service */ /* version / header length / type of service */
u16_t _v_hl_tos; PACK_STRUCT_FIELD(u16_t _v_hl_tos);
/* total length */ /* total length */
u16_t _len; PACK_STRUCT_FIELD(u16_t _len);
/* identification */ /* identification */
u16_t _id; PACK_STRUCT_FIELD(u16_t _id);
/* fragment offset field */ /* fragment offset field */
u16_t _offset; PACK_STRUCT_FIELD(u16_t _offset);
#define IP_RF 0x8000 /* reserved fragment flag */ #define IP_RF 0x8000 /* reserved fragment flag */
#define IP_DF 0x4000 /* dont fragment flag */ #define IP_DF 0x4000 /* dont fragment flag */
#define IP_MF 0x2000 /* more fragments flag */ #define IP_MF 0x2000 /* more fragments flag */
#define IP_OFFMASK 0x1fff /* mask for fragmenting bits */ #define IP_OFFMASK 0x1fff /* mask for fragmenting bits */
/* time to live / protocol*/ /* time to live / protocol*/
u16_t _ttl_proto; PACK_STRUCT_FIELD(u16_t _ttl_proto);
/* checksum */ /* checksum */
u16_t _chksum; PACK_STRUCT_FIELD(u16_t _chksum);
/* source and destination IP addresses */ /* source and destination IP addresses */
struct ip_addr src; PACK_STRUCT_FIELD(struct ip_addr src);
struct ip_addr dest; 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_V(hdr) (ntohs((hdr)->_v_hl_tos) >> 12)
#define IPH_HL(hdr) ((ntohs((hdr)->_v_hl_tos) >> 8) & 0x0f) #define IPH_HL(hdr) ((ntohs((hdr)->_v_hl_tos) >> 8) & 0x0f)

View File

@ -34,13 +34,29 @@
#include "lwip/arch.h" #include "lwip/arch.h"
#ifdef PACK_STRUCT_USE_INCLUDES
# include "arch/bpstruct.h"
#endif
PACK_STRUCT_BEGIN
struct ip_addr { 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 { 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 */ /* For compatibility with BSD code */
struct in_addr { struct in_addr {

View File

@ -42,6 +42,20 @@
#include "arch/cc.h" #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 #ifdef LWIP_PROVIDE_ERRNO
#define EPERM 1 /* Operation not permitted */ #define EPERM 1 /* Operation not permitted */

View File

@ -55,35 +55,44 @@ struct dhcp
#endif #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 */ /** minimum set of fields of any DHCP message */
struct dhcp_msg struct dhcp_msg
{ {
u8_t op; PACK_STRUCT_FIELD(u8_t op);
u8_t htype; PACK_STRUCT_FIELD(u8_t htype);
u8_t hlen; PACK_STRUCT_FIELD(u8_t hlen);
u8_t hops; PACK_STRUCT_FIELD(u8_t hops);
u32_t xid; PACK_STRUCT_FIELD(u32_t xid);
u16_t secs; PACK_STRUCT_FIELD(u16_t secs);
u16_t flags; PACK_STRUCT_FIELD(u16_t flags);
struct ip_addr ciaddr; PACK_STRUCT_FIELD(struct ip_addr ciaddr);
struct ip_addr yiaddr; PACK_STRUCT_FIELD(struct ip_addr yiaddr);
struct ip_addr siaddr; PACK_STRUCT_FIELD(struct ip_addr siaddr);
struct ip_addr giaddr; PACK_STRUCT_FIELD(struct ip_addr giaddr);
#define DHCP_CHADDR_LEN 16U #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 #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 #define DHCP_FILE_LEN 128U
u8_t file[DHCP_FILE_LEN]; PACK_STRUCT_FIELD(u8_t file[DHCP_FILE_LEN]);
u32_t cookie; PACK_STRUCT_FIELD(u32_t cookie);
#define DHCP_MIN_OPTIONS_LEN 68U #define DHCP_MIN_OPTIONS_LEN 68U
/** allow this to be configured in lwipopts.h, but not too small */ /** allow this to be configured in lwipopts.h, but not too small */
#if ((!defined(DHCP_OPTIONS_LEN)) || (DHCP_OPTIONS_LEN < DHCP_MIN_OPTIONS_LEN)) #if ((!defined(DHCP_OPTIONS_LEN)) || (DHCP_OPTIONS_LEN < DHCP_MIN_OPTIONS_LEN))
/** set this to be sufficient for your options in outgoing DHCP msgs */ /** set this to be sufficient for your options in outgoing DHCP msgs */
# define DHCP_OPTIONS_LEN DHCP_MIN_OPTIONS_LEN # define DHCP_OPTIONS_LEN DHCP_MIN_OPTIONS_LEN
#endif #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 */ /** start DHCP configuration */
err_t dhcp_start(struct netif *netif); err_t dhcp_start(struct netif *netif);

View File

@ -161,16 +161,25 @@ void tcp_rexmit (struct tcp_pcb *pcb);
#define TCP_KEEPCNT 9 /* Counter for KEEPALIVE probes */ #define TCP_KEEPCNT 9 /* Counter for KEEPALIVE probes */
#define TCP_MAXIDLE TCP_KEEPCNT * TCP_KEEPINTVL /* Maximum KEEPALIVE probe time */ #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 { struct tcp_hdr {
u16_t src; PACK_STRUCT_FIELD(u16_t src);
u16_t dest; PACK_STRUCT_FIELD(u16_t dest);
u32_t seqno; PACK_STRUCT_FIELD(u32_t seqno);
u32_t ackno; PACK_STRUCT_FIELD(u32_t ackno);
u16_t _hdrlen_rsvd_flags; PACK_STRUCT_FIELD(u16_t _hdrlen_rsvd_flags);
u16_t wnd; PACK_STRUCT_FIELD(u16_t wnd);
u16_t chksum; PACK_STRUCT_FIELD(u16_t chksum);
u16_t urgp; 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_OFFSET(phdr) (ntohs((phdr)->_hdrlen_rsvd_flags) >> 8)
#define TCPH_HDRLEN(phdr) (ntohs((phdr)->_hdrlen_rsvd_flags) >> 12) #define TCPH_HDRLEN(phdr) (ntohs((phdr)->_hdrlen_rsvd_flags) >> 12)

View File

@ -41,11 +41,11 @@
#define UDP_HLEN 8 #define UDP_HLEN 8
struct udp_hdr { struct udp_hdr {
u16_t src; PACK_STRUCT_FIELD(u16_t src);
u16_t dest; /* src/dest UDP ports */ PACK_STRUCT_FIELD(u16_t dest); /* src/dest UDP ports */
u16_t len; PACK_STRUCT_FIELD(u16_t len);
u16_t chksum; PACK_STRUCT_FIELD(u16_t chksum);
}; } PACK_STRUCT_STRUCT;
#define UDP_FLAGS_NOCHKSUM 0x01U #define UDP_FLAGS_NOCHKSUM 0x01U
#define UDP_FLAGS_UDPLITE 0x02U #define UDP_FLAGS_UDPLITE 0x02U

View File

@ -44,41 +44,49 @@
#include "lwip/netif.h" #include "lwip/netif.h"
#include "lwip/ip.h" #include "lwip/ip.h"
struct eth_addr { #ifdef PACK_STRUCT_USE_INCLUDES
u8_t addr[6]; # include "arch/bpstruct.h"
};
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];
#endif #endif
struct eth_addr dest; PACK_STRUCT_BEGIN
struct eth_addr src; struct eth_addr {
u16_t type; 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 */ /** the ARP message */
struct etharp_hdr { struct etharp_hdr {
/* Ethernet header */ PACK_STRUCT_FIELD(struct eth_hdr ethhdr);
struct eth_hdr ethhdr; PACK_STRUCT_FIELD(u16_t hwtype);
u16_t hwtype; PACK_STRUCT_FIELD(u16_t proto);
u16_t proto; PACK_STRUCT_FIELD(u16_t _hwlen_protolen);
u16_t _hwlen_protolen; PACK_STRUCT_FIELD(u16_t opcode);
u16_t opcode; PACK_STRUCT_FIELD(struct eth_addr shwaddr);
struct eth_addr shwaddr; PACK_STRUCT_FIELD(struct ip_addr2 sipaddr);
/* assume 2-byte alignment */ PACK_STRUCT_FIELD(struct eth_addr dhwaddr);
struct ip_addr2 sipaddr; PACK_STRUCT_FIELD(struct ip_addr2 dipaddr);
struct eth_addr dhwaddr; } PACK_STRUCT_STRUCT;
/* assume 2-byte alignment */ PACK_STRUCT_END
struct ip_addr2 dipaddr;
};
PACK_STRUCT_BEGIN
struct ethip_hdr { struct ethip_hdr {
struct eth_hdr eth; PACK_STRUCT_FIELD(struct eth_hdr eth);
struct ip_hdr ip; PACK_STRUCT_FIELD(struct ip_hdr ip);
}; };
#ifdef PACK_STRUCT_USE_INCLUDES
# include "arch/epstruct.h"
#endif
#define ARP_TMR_INTERVAL 10000 #define ARP_TMR_INTERVAL 10000

View File

@ -11,6 +11,7 @@
* pragmatically since otherwise unsigned comparisons can result * pragmatically since otherwise unsigned comparisons can result
* against negative integers quite easily, and fail in subtle ways. * against negative integers quite easily, and fail in subtle ways.
*/ */
PACK_STRUCT_BEGIN
struct ip struct ip
{ {
#if defined(NO_CHAR_BITFIELDS) #if defined(NO_CHAR_BITFIELDS)
@ -38,6 +39,7 @@ struct ip
u_short ip_sum; /* checksum */ u_short ip_sum; /* checksum */
struct in_addr ip_src,ip_dst; /* source and dest address */ struct in_addr ip_src,ip_dst; /* source and dest address */
}; };
PACK_STRUCT_END
typedef u32_t tcp_seq; typedef u32_t tcp_seq;
@ -45,6 +47,7 @@ typedef u32_t tcp_seq;
* TCP header. * TCP header.
* Per RFC 793, September, 1981. * Per RFC 793, September, 1981.
*/ */
PACK_STRUCT_BEGIN
struct tcphdr struct tcphdr
{ {
u_short th_sport; /* source port */ u_short th_sport; /* source port */
@ -68,5 +71,6 @@ struct tcphdr
u_short th_sum; /* checksum */ u_short th_sum; /* checksum */
u_short th_urp; /* urgent pointer */ u_short th_urp; /* urgent pointer */
}; };
PACK_STRUCT_END
#endif /* VJBSDHDR_H */ #endif /* VJBSDHDR_H */