Greg Hartman | 76d05dc | 2016-11-23 15:51:27 -0800 | [diff] [blame] | 1 | #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 | |
| 10 | FILE_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 | */ |
| 47 | struct 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 | */ |
| 71 | static 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 | */ |
| 80 | static 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 | */ |
| 89 | static 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 | */ |
| 98 | static 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 */ |