typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; typedef unsigned long long uint64_t; #define ETHER_ADDR_LEN 6 /**< Length of Ethernet address. */ /** * Ethernet address: * A universally administered address is uniquely assigned to a device by its * manufacturer. The first three octets (in transmission order) contain the * Organizationally Unique Identifier (OUI). The following three (MAC-48 and * EUI-48) octets are assigned by that organization with the only constraint * of uniqueness. * A locally administered address is assigned to a device by a network * administrator and does not contain OUIs. * See http://standards.ieee.org/regauth/groupmac/tutorial.html */ struct ether_addr { uint8_t addr_bytes[ETHER_ADDR_LEN]; /**< Addr bytes in tx order */ } __attribute__((__packed__)); /** * ARP header IPv4 payload. */ struct arp_ipv4 { struct ether_addr arp_sha; /**< sender hardware address */ uint32_t arp_sip; /**< sender IP address */ struct ether_addr arp_tha; /**< target hardware address */ uint32_t arp_tip; /**< target IP address */ } __attribute__((__packed__)); /** * ARP header. */ struct arp_hdr { uint16_t arp_hrd; /* format of hardware address */ #define ARP_HRD_ETHER 1 /* ARP Ethernet address format */ uint16_t arp_pro; /* format of protocol address */ uint8_t arp_hln; /* length of hardware address */ uint8_t arp_pln; /* length of protocol address */ uint16_t arp_op; /* ARP opcode (command) */ #define ARP_OP_REQUEST 1 /* request to resolve address */ #define ARP_OP_REPLY 2 /* response to previous request */ #define ARP_OP_REVREQUEST 3 /* request proto addr given hardware */ #define ARP_OP_REVREPLY 4 /* response giving protocol address */ #define ARP_OP_INVREQUEST 8 /* request to identify peer */ #define ARP_OP_INVREPLY 9 /* response identifying peer */ struct arp_ipv4 arp_data; } __attribute__((__packed__));