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
* 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];
} __attribute__((__packed__));
* ARP header IPv4 payload.
*/
struct arp_ipv4 {
struct ether_addr arp_sha;
uint32_t arp_sip;
struct ether_addr arp_tha;
uint32_t arp_tip;
} __attribute__((__packed__));
* ARP header.
*/
struct arp_hdr {
uint16_t arp_hrd;
#define ARP_HRD_ETHER 1
uint16_t arp_pro;
uint8_t arp_hln;
uint8_t arp_pln;
uint16_t arp_op;
#define ARP_OP_REQUEST 1
#define ARP_OP_REPLY 2
#define ARP_OP_REVREQUEST 3
#define ARP_OP_REVREPLY 4
#define ARP_OP_INVREQUEST 8
#define ARP_OP_INVREPLY 9
struct arp_ipv4 arp_data;
} __attribute__((__packed__));