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