blob: 932bb3b2c7bcc8f9eda9fe2a3c4efebbd8c31693 [file] [log] [blame]
Greg Hartman76d05dc2016-11-23 15:51:27 -08001#ifndef _GPXE_IF_ARP_H
2#define _GPXE_IF_ARP_H
3
4/** @file
5 *
6 * Address Resolution Protocol constants and types
7 *
8 */
9
10FILE_LICENCE ( GPL2_OR_LATER );
11
12#include <stdint.h>
13
14/* ARP protocol HARDWARE identifiers. */
15#define ARPHRD_NETROM 0 /**< from KA9Q: NET/ROM pseudo */
16#define ARPHRD_ETHER 1 /**< Ethernet 10Mbps */
17#define ARPHRD_EETHER 2 /**< Experimental Ethernet */
18#define ARPHRD_AX25 3 /**< AX.25 Level 2 */
19#define ARPHRD_PRONET 4 /**< PROnet token ring */
20#define ARPHRD_CHAOS 5 /**< Chaosnet */
21#define ARPHRD_IEEE802 6 /**< IEEE 802.2 Ethernet/TR/TB */
22#define ARPHRD_ARCNET 7 /**< ARCnet */
23#define ARPHRD_APPLETLK 8 /**< APPLEtalk */
24#define ARPHRD_DLCI 15 /**< Frame Relay DLCI */
25#define ARPHRD_ATM 19 /**< ATM */
26#define ARPHRD_METRICOM 23 /**< Metricom STRIP (new IANA id) */
27#define ARPHRD_IEEE1394 24 /**< IEEE 1394 IPv4 - RFC 2734 */
28#define ARPHRD_EUI64 27 /**< EUI-64 */
29#define ARPHRD_INFINIBAND 32 /**< InfiniBand */
30
31/* ARP protocol opcodes. */
32#define ARPOP_REQUEST 1 /**< ARP request */
33#define ARPOP_REPLY 2 /**< ARP reply */
34#define ARPOP_RREQUEST 3 /**< RARP request */
35#define ARPOP_RREPLY 4 /**< RARP reply */
36#define ARPOP_InREQUEST 8 /**< InARP request */
37#define ARPOP_InREPLY 9 /**< InARP reply */
38#define ARPOP_NAK 10 /**< (ATM)ARP NAK */
39
40/**
41 * An ARP header
42 *
43 * This contains only the fixed-size portions of an ARP header; for
44 * other fields use the arp_{sender,target}_{ha,pa} family of
45 * functions.
46 */
47struct arphdr {
48 /** Link-layer protocol
49 *
50 * This is an ARPHRD_XXX constant
51 */
52 uint16_t ar_hrd;
53 /** Network-layer protocol
54 *
55 * This is, for Ethernet, an ETH_P_XXX constant.
56 */
57 uint16_t ar_pro;
58 /** Link-layer address length */
59 uint8_t ar_hln;
60 /** Network-layer address length */
61 uint8_t ar_pln;
62 /** ARP opcode */
63 uint16_t ar_op;
64} __attribute__ (( packed ));
65
66/** ARP packet sender hardware address
67 *
68 * @v arphdr ARP header
69 * @ret ar_sha Sender hardware address
70 */
71static inline void * arp_sender_ha ( struct arphdr *arphdr ) {
72 return ( ( ( void * ) arphdr ) + sizeof ( *arphdr ) );
73}
74
75/** ARP packet sender protocol address
76 *
77 * @v arphdr ARP header
78 * @ret ar_spa Sender protocol address
79 */
80static inline void * arp_sender_pa ( struct arphdr *arphdr ) {
81 return ( arp_sender_ha ( arphdr ) + arphdr->ar_hln );
82}
83
84/** ARP packet target hardware address
85 *
86 * @v arphdr ARP header
87 * @ret ar_tha Target hardware address
88 */
89static inline void * arp_target_ha ( struct arphdr *arphdr ) {
90 return ( arp_sender_pa ( arphdr ) + arphdr->ar_pln );
91}
92
93/** ARP packet target protocol address
94 *
95 * @v arphdr ARP header
96 * @ret ar_tpa Target protocol address
97 */
98static inline void * arp_target_pa ( struct arphdr *arphdr ) {
99 return ( arp_target_ha ( arphdr ) + arphdr->ar_hln );
100}
101
102#endif /* _GPXE_IF_ARP_H */