| #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 */ |