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