text: // Based on the net.h file from the AVRlib library by Pascal Stang.
  // Author: Guido Socher
  // Copyright: GPL V2
  //
  // For AVRlib See http://www.procyonengineering.com/
  // Used with explicit permission of Pascal Stang.
  //
  // 2010-05-20 <jc@wippler.nl>
  
  // notation: _P = position of a field
  //           _V = value of a field
  
  #ifndef NET_H
  #define NET_H
  
  // ******* ETH *******
  #define ETH_HEADER_LEN    14
  // values of certain bytes:
  #define ETHTYPE_ARP_H_V 0x08
  #define ETHTYPE_ARP_L_V 0x06
  #define ETHTYPE_IP_H_V  0x08
  #define ETHTYPE_IP_L_V  0x00
  // byte positions in the ethernet frame:
  //
  // Ethernet type field (2bytes):
  #define ETH_TYPE_H_P 12
  #define ETH_TYPE_L_P 13
  //
  #define ETH_DST_MAC 0
  #define ETH_SRC_MAC 6
  
  
  // ******* ARP *******
  #define ETH_ARP_OPCODE_REPLY_H_V 0x0
  #define ETH_ARP_OPCODE_REPLY_L_V 0x02
  #define ETH_ARP_OPCODE_REQ_H_V 0x0
  #define ETH_ARP_OPCODE_REQ_L_V 0x01
  // start of arp header:
  #define ETH_ARP_P 0xe
  //
  #define ETHTYPE_ARP_L_V 0x06
  // arp.dst.ip
  #define ETH_ARP_DST_IP_P 0x26
  // arp.opcode
  #define ETH_ARP_OPCODE_H_P 0x14
  #define ETH_ARP_OPCODE_L_P 0x15
  // arp.src.mac
  #define ETH_ARP_SRC_MAC_P 0x16
  #define ETH_ARP_SRC_IP_P 0x1c
  #define ETH_ARP_DST_MAC_P 0x20
  #define ETH_ARP_DST_IP_P 0x26
  
  // ******* IP *******
  #define IP_HEADER_LEN    20
  // ip.src
  #define IP_SRC_P 0x1a
  #define IP_DST_P 0x1e
  #define IP_HEADER_LEN_VER_P 0xe
  #define IP_CHECKSUM_P 0x18
  #define IP_TTL_P 0x16
  #define IP_FLAGS_P 0x14
  #define IP_P 0xe
  #define IP_TOTLEN_H_P 0x10
  #define IP_TOTLEN_L_P 0x11
  
  #define IP_PROTO_P 0x17
  
  #define IP_PROTO_ICMP_V 1
  #define IP_PROTO_TCP_V 6
  // 17=0x11
  #define IP_PROTO_UDP_V 17
  // ******* ICMP *******
  #define ICMP_TYPE_ECHOREPLY_V 0
  #define ICMP_TYPE_ECHOREQUEST_V 8
  //
  #define ICMP_TYPE_P 0x22
  #define ICMP_CHECKSUM_P 0x24
  #define ICMP_CHECKSUM_H_P 0x24
  #define ICMP_CHECKSUM_L_P 0x25
  #define ICMP_IDENT_H_P 0x26
  #define ICMP_IDENT_L_P 0x27
  #define ICMP_DATA_P 0x2a
  
  // ******* UDP *******
  #define UDP_HEADER_LEN    8
  //
  #define UDP_SRC_PORT_H_P 0x22
  #define UDP_SRC_PORT_L_P 0x23
  #define UDP_DST_PORT_H_P 0x24
  #define UDP_DST_PORT_L_P 0x25
  //
  #define UDP_LEN_H_P 0x26
  #define UDP_LEN_L_P 0x27
  #define UDP_CHECKSUM_H_P 0x28
  #define UDP_CHECKSUM_L_P 0x29
  #define UDP_DATA_P 0x2a
  
  // ******* TCP *******
  #define TCP_SRC_PORT_H_P 0x22
  #define TCP_SRC_PORT_L_P 0x23
  #define TCP_DST_PORT_H_P 0x24
  #define TCP_DST_PORT_L_P 0x25
  // the tcp seq number is 4 bytes 0x26-0x29
  #define TCP_SEQ_H_P 0x26
  #define TCP_SEQACK_H_P 0x2a
  // flags: SYN=2
  #define TCP_FLAGS_P 0x2f
  #define TCP_FLAGS_SYN_V 2
  #define TCP_FLAGS_FIN_V 1
  #define TCP_FLAGS_RST_V 4
  #define TCP_FLAGS_PUSH_V 8
  #define TCP_FLAGS_SYNACK_V 0x12
  #define TCP_FLAGS_ACK_V 0x10
  #define TCP_FLAGS_PSHACK_V 0x18
  //  plain len without the options:
  #define TCP_HEADER_LEN_PLAIN 20
  #define TCP_HEADER_LEN_P 0x2e
  #define TCP_WIN_SIZE 0x30
  #define TCP_CHECKSUM_H_P 0x32
  #define TCP_CHECKSUM_L_P 0x33
  #define TCP_OPTIONS_P 0x36
  //
  #endif
  