1typedef unsigned char uint8_t;
2typedef unsigned short uint16_t;
3typedef unsigned int uint32_t;
4typedef unsigned long long uint64_t;
5
6#define ETHER_ADDR_LEN  6 /**< Length of Ethernet address. */
7
8/**
9 * Ethernet address:
10 * A universally administered address is uniquely assigned to a device by its
11 * manufacturer. The first three octets (in transmission order) contain the
12 * Organizationally Unique Identifier (OUI). The following three (MAC-48 and
13 * EUI-48) octets are assigned by that organization with the only constraint
14 * of uniqueness.
15 * A locally administered address is assigned to a device by a network
16 * administrator and does not contain OUIs.
17 * See http://standards.ieee.org/regauth/groupmac/tutorial.html
18 */
19struct ether_addr {
20	uint8_t addr_bytes[ETHER_ADDR_LEN]; /**< Addr bytes in tx order */
21} __attribute__((__packed__));
22
23/**
24 * ARP header IPv4 payload.
25 */
26struct arp_ipv4 {
27	struct ether_addr arp_sha;  /**< sender hardware address */
28	uint32_t          arp_sip;  /**< sender IP address */
29	struct ether_addr arp_tha;  /**< target hardware address */
30	uint32_t          arp_tip;  /**< target IP address */
31} __attribute__((__packed__));
32
33/**
34 * ARP header.
35 */
36struct arp_hdr {
37	uint16_t arp_hrd;    /* format of hardware address */
38#define ARP_HRD_ETHER     1  /* ARP Ethernet address format */
39
40	uint16_t arp_pro;    /* format of protocol address */
41	uint8_t  arp_hln;    /* length of hardware address */
42	uint8_t  arp_pln;    /* length of protocol address */
43	uint16_t arp_op;     /* ARP opcode (command) */
44#define	ARP_OP_REQUEST    1 /* request to resolve address */
45#define	ARP_OP_REPLY      2 /* response to previous request */
46#define	ARP_OP_REVREQUEST 3 /* request proto addr given hardware */
47#define	ARP_OP_REVREPLY   4 /* response giving protocol address */
48#define	ARP_OP_INVREQUEST 8 /* request to identify peer */
49#define	ARP_OP_INVREPLY   9 /* response identifying peer */
50
51	struct arp_ipv4 arp_data;
52} __attribute__((__packed__));