|  | /* | 
|  | * arp.h | 
|  | * | 
|  | * Address Resolution Protocol. | 
|  | * RFC 826 | 
|  | * | 
|  | * Copyright (c) 2000 Dug Song <dugsong@monkey.org> | 
|  | * | 
|  | * $Id: arp.h,v 1.12 2003/03/16 17:39:17 dugsong Exp $ | 
|  | */ | 
|  |  | 
|  | #ifndef DNET_ARP_H | 
|  | #define DNET_ARP_H | 
|  |  | 
|  | #define ARP_HDR_LEN	8	/* base ARP header length */ | 
|  | #define ARP_ETHIP_LEN	20	/* base ARP message length */ | 
|  |  | 
|  | #ifndef __GNUC__ | 
|  | # define __attribute__(x) | 
|  | # pragma pack(1) | 
|  | #endif | 
|  |  | 
|  | /* | 
|  | * ARP header | 
|  | */ | 
|  | struct arp_hdr { | 
|  | uint16_t	ar_hrd;	/* format of hardware address */ | 
|  | uint16_t	ar_pro;	/* format of protocol address */ | 
|  | uint8_t		ar_hln;	/* length of hardware address (ETH_ADDR_LEN) */ | 
|  | uint8_t		ar_pln;	/* length of protocol address (IP_ADDR_LEN) */ | 
|  | uint16_t	ar_op;	/* operation */ | 
|  | }; | 
|  |  | 
|  | /* | 
|  | * Hardware address format | 
|  | */ | 
|  | #define ARP_HRD_ETH 	0x0001	/* ethernet hardware */ | 
|  | #define ARP_HRD_IEEE802	0x0006	/* IEEE 802 hardware */ | 
|  |  | 
|  | /* | 
|  | * Protocol address format | 
|  | */ | 
|  | #define ARP_PRO_IP	0x0800	/* IP protocol */ | 
|  |  | 
|  | /* | 
|  | * ARP operation | 
|  | */ | 
|  | #define	ARP_OP_REQUEST		1	/* request to resolve ha given pa */ | 
|  | #define	ARP_OP_REPLY		2	/* response giving hardware address */ | 
|  | #define	ARP_OP_REVREQUEST	3	/* request to resolve pa given ha */ | 
|  | #define	ARP_OP_REVREPLY		4	/* response giving protocol address */ | 
|  |  | 
|  | /* | 
|  | * Ethernet/IP ARP message | 
|  | */ | 
|  | struct arp_ethip { | 
|  | uint8_t		ar_sha[ETH_ADDR_LEN];	/* sender hardware address */ | 
|  | uint8_t		ar_spa[IP_ADDR_LEN];	/* sender protocol address */ | 
|  | uint8_t		ar_tha[ETH_ADDR_LEN];	/* target hardware address */ | 
|  | uint8_t		ar_tpa[IP_ADDR_LEN];	/* target protocol address */ | 
|  | }; | 
|  |  | 
|  | /* | 
|  | * ARP cache entry | 
|  | */ | 
|  | struct arp_entry { | 
|  | struct addr	arp_pa;			/* protocol address */ | 
|  | struct addr	arp_ha;			/* hardware address */ | 
|  | }; | 
|  |  | 
|  | #ifndef __GNUC__ | 
|  | # pragma pack() | 
|  | #endif | 
|  |  | 
|  | #define arp_pack_hdr_ethip(hdr, op, sha, spa, tha, tpa) do {	\ | 
|  | struct arp_hdr *pack_arp_p = (struct arp_hdr *)(hdr);	\ | 
|  | struct arp_ethip *pack_ethip_p = (struct arp_ethip *)	\ | 
|  | ((uint8_t *)(hdr) + ARP_HDR_LEN);		\ | 
|  | pack_arp_p->ar_hrd = htons(ARP_HRD_ETH);		\ | 
|  | pack_arp_p->ar_pro = htons(ARP_PRO_IP);			\ | 
|  | pack_arp_p->ar_hln = ETH_ADDR_LEN;			\ | 
|  | pack_arp_p->ar_pln = IP_ADDR_LEN;			\ | 
|  | pack_arp_p->ar_op = htons(op);				\ | 
|  | memmove(pack_ethip_p->ar_sha, &(sha), ETH_ADDR_LEN);	\ | 
|  | memmove(pack_ethip_p->ar_spa, &(spa), IP_ADDR_LEN);	\ | 
|  | memmove(pack_ethip_p->ar_tha, &(tha), ETH_ADDR_LEN);	\ | 
|  | memmove(pack_ethip_p->ar_tpa, &(tpa), IP_ADDR_LEN);	\ | 
|  | } while (0) | 
|  |  | 
|  | typedef struct arp_handle arp_t; | 
|  |  | 
|  | typedef int (*arp_handler)(const struct arp_entry *entry, void *arg); | 
|  |  | 
|  | __BEGIN_DECLS | 
|  | arp_t	*arp_open(void); | 
|  | int	 arp_add(arp_t *arp, const struct arp_entry *entry); | 
|  | int	 arp_delete(arp_t *arp, const struct arp_entry *entry); | 
|  | int	 arp_get(arp_t *arp, struct arp_entry *entry); | 
|  | int	 arp_loop(arp_t *arp, arp_handler callback, void *arg); | 
|  | arp_t	*arp_close(arp_t *arp); | 
|  | __END_DECLS | 
|  |  | 
|  | #endif /* DNET_ARP_H */ |