typedef struct {
  unsigned short __required_align;
  unsigned char ethDstMac[];
  unsigned char ethSrcMac[];
  unsigned short ethType;
  unsigned char ipVerHl;
  unsigned char ipDifServEcn;
  unsigned short ipTotalLen;
  unsigned short ipIdent;
  unsigned short ipFlagsFragOffst;
  unsigned char ipTtl;
  unsigned char ipProtocol;
  unsigned short ipHdrChecksum;
  unsigned long ipSrcAddr;
  unsigned long ipDstAddr;
  unsigned short ipOptions[];

CTL_IPV4_HEADER_t describes the layout of the IPv4 header. We include the Ethernet header because they are always adjacent. But this is the last layer we can do this with. Because of the variable-length ipOptions field, we can't fix where the start of the transport (or user datagram) layer is after the IP layer.