arp.h revision 6017:7e310503019e
1/* 2 * arp.h 3 * 4 * Address Resolution Protocol. 5 * RFC 826 6 * 7 * Copyright (c) 2000 Dug Song <dugsong@monkey.org> 8 * 9 * $Id: arp.h,v 1.12 2003/03/16 17:39:17 dugsong Exp $ 10 */ 11 12#ifndef DNET_ARP_H 13#define DNET_ARP_H 14 15#define ARP_HDR_LEN 8 /* base ARP header length */ 16#define ARP_ETHIP_LEN 20 /* base ARP message length */ 17 18#ifndef __GNUC__ 19# define __attribute__(x) 20# pragma pack(1) 21#endif 22 23/* 24 * ARP header 25 */ 26struct arp_hdr { 27 uint16_t ar_hrd; /* format of hardware address */ 28 uint16_t ar_pro; /* format of protocol address */ 29 uint8_t ar_hln; /* length of hardware address (ETH_ADDR_LEN) */ 30 uint8_t ar_pln; /* length of protocol address (IP_ADDR_LEN) */ 31 uint16_t ar_op; /* operation */ 32}; 33 34/* 35 * Hardware address format 36 */ 37#define ARP_HRD_ETH 0x0001 /* ethernet hardware */ 38#define ARP_HRD_IEEE802 0x0006 /* IEEE 802 hardware */ 39 40/* 41 * Protocol address format 42 */ 43#define ARP_PRO_IP 0x0800 /* IP protocol */ 44 45/* 46 * ARP operation 47 */ 48#define ARP_OP_REQUEST 1 /* request to resolve ha given pa */ 49#define ARP_OP_REPLY 2 /* response giving hardware address */ 50#define ARP_OP_REVREQUEST 3 /* request to resolve pa given ha */ 51#define ARP_OP_REVREPLY 4 /* response giving protocol address */ 52 53/* 54 * Ethernet/IP ARP message 55 */ 56struct arp_ethip { 57 uint8_t ar_sha[ETH_ADDR_LEN]; /* sender hardware address */ 58 uint8_t ar_spa[IP_ADDR_LEN]; /* sender protocol address */ 59 uint8_t ar_tha[ETH_ADDR_LEN]; /* target hardware address */ 60 uint8_t ar_tpa[IP_ADDR_LEN]; /* target protocol address */ 61}; 62 63/* 64 * ARP cache entry 65 */ 66struct arp_entry { 67 struct addr arp_pa; /* protocol address */ 68 struct addr arp_ha; /* hardware address */ 69}; 70 71#ifndef __GNUC__ 72# pragma pack() 73#endif 74 75#define arp_pack_hdr_ethip(hdr, op, sha, spa, tha, tpa) do { \ 76 struct arp_hdr *pack_arp_p = (struct arp_hdr *)(hdr); \ 77 struct arp_ethip *pack_ethip_p = (struct arp_ethip *) \ 78 ((uint8_t *)(hdr) + ARP_HDR_LEN); \ 79 pack_arp_p->ar_hrd = htons(ARP_HRD_ETH); \ 80 pack_arp_p->ar_pro = htons(ARP_PRO_IP); \ 81 pack_arp_p->ar_hln = ETH_ADDR_LEN; \ 82 pack_arp_p->ar_pln = IP_ADDR_LEN; \ 83 pack_arp_p->ar_op = htons(op); \ 84 memmove(pack_ethip_p->ar_sha, &(sha), ETH_ADDR_LEN); \ 85 memmove(pack_ethip_p->ar_spa, &(spa), IP_ADDR_LEN); \ 86 memmove(pack_ethip_p->ar_tha, &(tha), ETH_ADDR_LEN); \ 87 memmove(pack_ethip_p->ar_tpa, &(tpa), IP_ADDR_LEN); \ 88} while (0) 89 90typedef struct arp_handle arp_t; 91 92typedef int (*arp_handler)(const struct arp_entry *entry, void *arg); 93 94__BEGIN_DECLS 95arp_t *arp_open(void); 96int arp_add(arp_t *arp, const struct arp_entry *entry); 97int arp_delete(arp_t *arp, const struct arp_entry *entry); 98int arp_get(arp_t *arp, struct arp_entry *entry); 99int arp_loop(arp_t *arp, arp_handler callback, void *arg); 100arp_t *arp_close(arp_t *arp); 101__END_DECLS 102 103#endif /* DNET_ARP_H */ 104