Removed all structure packing directives. Protocol header fields are naturally aligned by design.
(Earlier, the 14-byte ethernet header screwed this up, this had already been fixed by adding two pad bytes.)
Assumption is that compilers do not align with larger-than-sizeof(type) boundaries.
Pre-tag PRE_PACK_REMOVE. Post-tag POST_TAG_REMOVE.
diff --git a/doc/sys_arch.txt b/doc/sys_arch.txt
index 95d0add..9f2a999 100644
--- a/doc/sys_arch.txt
+++ b/doc/sys_arch.txt
@@ -154,12 +154,6 @@
   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 634405b..8063eac 100644
--- a/src/include/ipv4/lwip/icmp.h
+++ b/src/include/ipv4/lwip/icmp.h
@@ -71,36 +71,24 @@
 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 {
-  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
+  u16_t _type_code;
+  u16_t chksum;
+  u16_t id;
+  u16_t seqno;
+};
 
-PACK_STRUCT_BEGIN
 struct icmp_dur_hdr {
-  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
+  u16_t _type_code;
+  u16_t chksum;
+  u32_t unused;
+};
 
-PACK_STRUCT_BEGIN
 struct icmp_te_hdr {
-  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
+  u16_t _type_code;
+  u16_t chksum;
+  u32_t unused;
+};
 
 #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 c8b9c22..58eab8a 100644
--- a/src/include/ipv4/lwip/ip.h
+++ b/src/include/ipv4/lwip/ip.h
@@ -94,37 +94,27 @@
 #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 */
-  PACK_STRUCT_FIELD(u16_t _v_hl_tos);
+  u16_t _v_hl_tos;
   /* total length */
-  PACK_STRUCT_FIELD(u16_t _len);
+  u16_t _len;
   /* identification */
-  PACK_STRUCT_FIELD(u16_t _id);
+  u16_t _id;
   /* fragment offset field */
-  PACK_STRUCT_FIELD(u16_t _offset);
+  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*/
-  PACK_STRUCT_FIELD(u16_t _ttl_proto);
+  u16_t _ttl_proto;
   /* checksum */
-  PACK_STRUCT_FIELD(u16_t _chksum);
+  u16_t _chksum;
   /* source and destination IP addresses */
-  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
+  struct ip_addr src;
+  struct ip_addr dest; 
+};
 
 #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 7ac4954..e524c8d 100644
--- a/src/include/ipv4/lwip/ip_addr.h
+++ b/src/include/ipv4/lwip/ip_addr.h
@@ -34,29 +34,13 @@
 
 #include "lwip/arch.h"
 
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/bpstruct.h"
-#endif
-PACK_STRUCT_BEGIN
 struct ip_addr {
-  PACK_STRUCT_FIELD(u32_t addr);
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/epstruct.h"
-#endif
+  u32_t addr;
+};
 
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/bpstruct.h"
-#endif
-PACK_STRUCT_BEGIN
 struct ip_addr2 {
-  PACK_STRUCT_FIELD(u16_t addrw[2]);
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/epstruct.h"
-#endif
+  u16_t addrw[2];
+};
 
 /* For compatibility with BSD code */
 struct in_addr {
diff --git a/src/include/lwip/arch.h b/src/include/lwip/arch.h
index e0d622a..b70a5fc 100644
--- a/src/include/lwip/arch.h
+++ b/src/include/lwip/arch.h
@@ -42,20 +42,6 @@
 
 #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 73a0bcb..0314171 100644
--- a/src/include/lwip/dhcp.h
+++ b/src/include/lwip/dhcp.h
@@ -55,44 +55,35 @@
 #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
 {
-  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);
+  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;
 #define DHCP_CHADDR_LEN 16U
-  PACK_STRUCT_FIELD(u8_t chaddr[DHCP_CHADDR_LEN]);
+  u8_t chaddr[DHCP_CHADDR_LEN];
 #define DHCP_SNAME_LEN 64U
-  PACK_STRUCT_FIELD(u8_t sname[DHCP_SNAME_LEN]);
+  u8_t sname[DHCP_SNAME_LEN];
 #define DHCP_FILE_LEN 128U
-  PACK_STRUCT_FIELD(u8_t file[DHCP_FILE_LEN]);
-  PACK_STRUCT_FIELD(u32_t cookie);
+  u8_t file[DHCP_FILE_LEN];
+  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
-  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
+  u8_t options[DHCP_OPTIONS_LEN];
+};
 
 /** 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 d200e7c..95d1feb 100644
--- a/src/include/lwip/tcp.h
+++ b/src/include/lwip/tcp.h
@@ -161,25 +161,16 @@
 #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 {
-  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
+  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;
+};
 
 #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 c548594..94a7227 100644
--- a/src/include/lwip/udp.h
+++ b/src/include/lwip/udp.h
@@ -41,11 +41,11 @@
 #define UDP_HLEN 8
 
 struct udp_hdr {
-  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;
+  u16_t src;
+  u16_t dest;  /* src/dest UDP ports */
+  u16_t len;
+  u16_t chksum;
+};
 
 #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 0f1eeef..1e87c6a 100644
--- a/src/include/netif/etharp.h
+++ b/src/include/netif/etharp.h
@@ -44,49 +44,36 @@
 #include "lwip/netif.h"
 #include "lwip/ip.h"
 
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/bpstruct.h"
-#endif
-PACK_STRUCT_BEGIN
 struct eth_addr {
-  PACK_STRUCT_FIELD(u8_t addr[6]);
-} PACK_STRUCT_STRUCT;
-PACK_STRUCT_END
+  u8_t addr[6];
+};
 
-PACK_STRUCT_BEGIN
 struct eth_hdr {
 #if ETH_PAD_SIZE
-  PACK_STRUCT_FIELD(u8_t padding[ETH_PAD_SIZE]);
+  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
+  struct eth_addr dest;
+  struct eth_addr src;
+  u16_t type;
+};
 
-PACK_STRUCT_BEGIN
 /** the ARP message */
 struct etharp_hdr {
-  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 {
-  PACK_STRUCT_FIELD(struct eth_hdr eth);
-  PACK_STRUCT_FIELD(struct ip_hdr ip);
+  struct eth_hdr ethhdr;
+  u16_t hwtype;
+  u16_t proto;
+  u16_t _hwlen_protolen;
+  u16_t opcode;
+  struct eth_addr shwaddr;
+  struct ip_addr2 sipaddr;
+  struct eth_addr dhwaddr;
+  struct ip_addr2 dipaddr;
 };
-#ifdef PACK_STRUCT_USE_INCLUDES
-#  include "arch/epstruct.h"
-#endif
+
+struct ethip_hdr {
+  struct eth_hdr eth);
+  struct ip_hdr ip;
+};
 
 #define ARP_TMR_INTERVAL 10000
 
@@ -102,6 +89,4 @@
          struct pbuf *q);
 err_t etharp_query(struct netif *netif, struct ip_addr *ipaddr, struct pbuf *q);
 
-
-
 #endif /* __NETIF_ARP_H__ */
diff --git a/src/netif/ppp/vjbsdhdr.h b/src/netif/ppp/vjbsdhdr.h
index a089352..8a5ecc3 100644
--- a/src/netif/ppp/vjbsdhdr.h
+++ b/src/netif/ppp/vjbsdhdr.h
@@ -11,7 +11,6 @@
  * 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)
@@ -39,7 +38,6 @@
 	u_short	ip_sum;					/* checksum */
 	struct	in_addr ip_src,ip_dst;	/* source and dest address */
 };
-PACK_STRUCT_END
 
 typedef u32_t tcp_seq;
 
@@ -47,7 +45,6 @@
  * TCP header.
  * Per RFC 793, September, 1981.
  */
-PACK_STRUCT_BEGIN
 struct tcphdr  
 {
 	u_short	th_sport;		/* source port */
@@ -71,6 +68,5 @@
 	u_short	th_sum;			/* checksum */
 	u_short	th_urp;			/* urgent pointer */
 };
-PACK_STRUCT_END
 
 #endif /* VJBSDHDR_H */