12632SN/A/*
22632SN/A * addr.h
32632SN/A *
42632SN/A * Network address operations.
52632SN/A *
62632SN/A * Copyright (c) 2000 Dug Song <dugsong@monkey.org>
72632SN/A *
82632SN/A * $Id: addr.h,v 1.12 2003/02/27 03:44:55 dugsong Exp $
92632SN/A */
102632SN/A
112632SN/A#ifndef DNET_ADDR_H
122632SN/A#define DNET_ADDR_H
132632SN/A
142632SN/A#define ADDR_TYPE_NONE		0	/* No address set */
152632SN/A#define	ADDR_TYPE_ETH		1	/* Ethernet */
162632SN/A#define	ADDR_TYPE_IP		2	/* Internet Protocol v4 */
172632SN/A#define	ADDR_TYPE_IP6		3	/* Internet Protocol v6 */
182632SN/A
192632SN/Astruct addr {
202632SN/A        uint16_t		addr_type;
212632SN/A        uint16_t		addr_bits;
222632SN/A        union {
232632SN/A                eth_addr_t	__eth;
242632SN/A                ip_addr_t	__ip;
252632SN/A                ip6_addr_t	__ip6;
262632SN/A
272632SN/A                uint8_t		__data8[16];
282632SN/A                uint16_t	__data16[8];
292632SN/A                uint32_t	__data32[4];
302632SN/A        } __addr_u;
312632SN/A};
322632SN/A#define addr_eth	__addr_u.__eth
332632SN/A#define addr_ip		__addr_u.__ip
342632SN/A#define addr_ip6	__addr_u.__ip6
352632SN/A#define addr_data8	__addr_u.__data8
362632SN/A#define addr_data16	__addr_u.__data16
372632SN/A#define addr_data32	__addr_u.__data32
382632SN/A
392632SN/A#define addr_pack(addr, type, bits, data, len) do {	\
402632SN/A        (addr)->addr_type = type;			\
412632SN/A        (addr)->addr_bits = bits;			\
422632SN/A        memmove((addr)->addr_data8, (char *)data, len);	\
432632SN/A} while (0)
442632SN/A
452632SN/A__BEGIN_DECLS
462632SN/Aint	 addr_cmp(const struct addr *a, const struct addr *b);
472632SN/A
482632SN/Aint	 addr_bcast(const struct addr *a, struct addr *b);
492632SN/Aint	 addr_net(const struct addr *a, struct addr *b);
502632SN/A
512632SN/Achar	*addr_ntop(const struct addr *src, char *dst, size_t size);
522632SN/Aint	 addr_pton(const char *src, struct addr *dst);
532632SN/A
542632SN/Achar	*addr_ntoa(const struct addr *a);
552632SN/A#define	 addr_aton	addr_pton
562632SN/A
572632SN/Aint	 addr_ntos(const struct addr *a, struct sockaddr *sa);
582632SN/Aint	 addr_ston(const struct sockaddr *sa, struct addr *a);
592632SN/A
602632SN/Aint	 addr_btos(uint16_t bits, struct sockaddr *sa);
612632SN/Aint	 addr_stob(const struct sockaddr *sa, uint16_t *bits);
622632SN/A
632632SN/Aint	 addr_btom(uint16_t bits, void *mask, size_t size);
642632SN/Aint	 addr_mtob(const void *mask, size_t size, uint16_t *bits);
652632SN/A__END_DECLS
662632SN/A
672632SN/A#endif /* DNET_ADDR_H */
68