mirror of
https://github.com/xcat2/xNBA.git
synced 2024-12-16 00:01:34 +00:00
824d6ffa7f
I want to get to the point where any header in include/ reflects a standard user-level header (e.g. a POSIX header), while everything that's specific to gPXE lives in include/gpxe/. Headers that reflect a Linux header (e.g. if_ether.h) should also be in include/gpxe/, with the same name as the Linux header and, preferably, the same names used for the definitions.
101 lines
2.7 KiB
C
101 lines
2.7 KiB
C
#ifndef _GPXE_IF_ARP_H
|
|
#define _GPXE_IF_ARP_H
|
|
|
|
/** @file
|
|
*
|
|
* Address Resolution Protocol constants and types
|
|
*
|
|
*/
|
|
|
|
#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 */
|