summaryrefslogtreecommitdiffstats
path: root/debian/grub-extras/disabled/gpxe/src/include/gpxe/if_arp.h
blob: 932bb3b2c7bcc8f9eda9fe2a3c4efebbd8c31693 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#ifndef	_GPXE_IF_ARP_H
#define	_GPXE_IF_ARP_H

/** @file
 *
 * Address Resolution Protocol constants and types
 *
 */

FILE_LICENCE ( GPL2_OR_LATER );

#include <stdint.h>

/* ARP protocol HARDWARE identifiers. */
#define ARPHRD_NETROM	0		/**< from KA9Q: NET/ROM pseudo	*/
#define ARPHRD_ETHER 	1		/**< Ethernet 10Mbps		*/
#define	ARPHRD_EETHER	2		/**< Experimental Ethernet	*/
#define	ARPHRD_AX25	3		/**< AX.25 Level 2		*/
#define	ARPHRD_PRONET	4		/**< PROnet token ring		*/
#define	ARPHRD_CHAOS	5		/**< Chaosnet			*/
#define	ARPHRD_IEEE802	6		/**< IEEE 802.2 Ethernet/TR/TB	*/
#define	ARPHRD_ARCNET	7		/**< ARCnet			*/
#define	ARPHRD_APPLETLK	8		/**< APPLEtalk			*/
#define ARPHRD_DLCI	15		/**< Frame Relay DLCI		*/
#define ARPHRD_ATM	19		/**< ATM 			*/
#define ARPHRD_METRICOM	23		/**< Metricom STRIP (new IANA id) */
#define	ARPHRD_IEEE1394	24		/**< IEEE 1394 IPv4 - RFC 2734	*/
#define ARPHRD_EUI64	27		/**< EUI-64			*/
#define ARPHRD_INFINIBAND 32		/**< InfiniBand			*/

/* ARP protocol opcodes. */
#define	ARPOP_REQUEST	1		/**< ARP request		*/
#define	ARPOP_REPLY	2		/**< ARP reply			*/
#define	ARPOP_RREQUEST	3		/**< RARP request		*/
#define	ARPOP_RREPLY	4		/**< RARP reply			*/
#define	ARPOP_InREQUEST	8		/**< InARP request		*/
#define	ARPOP_InREPLY	9		/**< InARP reply		*/
#define	ARPOP_NAK	10		/**< (ATM)ARP NAK		*/

/**
 * An ARP header
 *
 * This contains only the fixed-size portions of an ARP header; for
 * other fields use the arp_{sender,target}_{ha,pa} family of
 * functions.
 */
struct arphdr {
	/** Link-layer protocol
	 *
	 * This is an ARPHRD_XXX constant
	 */
	uint16_t ar_hrd;
	/** Network-layer protocol
	 *
	 * This is, for Ethernet, an ETH_P_XXX constant.
	 */
	uint16_t ar_pro;
	/** Link-layer address length */
	uint8_t ar_hln;
	/** Network-layer address length */
	uint8_t ar_pln;
	/** ARP opcode */
	uint16_t ar_op;
} __attribute__ (( packed ));

/** ARP packet sender hardware address
 *
 * @v arphdr	ARP header
 * @ret ar_sha	Sender hardware address
 */
static inline void * arp_sender_ha ( struct arphdr *arphdr ) {
	return ( ( ( void * ) arphdr ) + sizeof ( *arphdr ) );
}

/** ARP packet sender protocol address
 *
 * @v arphdr	ARP header
 * @ret ar_spa	Sender protocol address
 */
static inline void * arp_sender_pa ( struct arphdr *arphdr ) {
	return ( arp_sender_ha ( arphdr ) + arphdr->ar_hln );
}

/** ARP packet target hardware address
 *
 * @v arphdr	ARP header
 * @ret ar_tha	Target hardware address
 */
static inline void * arp_target_ha ( struct arphdr *arphdr ) {
	return ( arp_sender_pa ( arphdr ) + arphdr->ar_pln );
}

/** ARP packet target protocol address
 *
 * @v arphdr	ARP header
 * @ret ar_tpa	Target protocol address
 */
static inline void * arp_target_pa ( struct arphdr *arphdr ) {
	return ( arp_target_ha ( arphdr ) + arphdr->ar_hln );
}

#endif	/* _GPXE_IF_ARP_H */