1/*
2 * addr.h
3 *
4 * Network address operations.
5 *
6 * Copyright (c) 2000 Dug Song <dugsong@monkey.org>
7 *
8 * $Id: addr.h,v 1.12 2003/02/27 03:44:55 dugsong Exp $
9 */
10
11#ifndef DNET_ADDR_H
12#define DNET_ADDR_H
13
14#define ADDR_TYPE_NONE		0	/* No address set */
15#define	ADDR_TYPE_ETH		1	/* Ethernet */
16#define	ADDR_TYPE_IP		2	/* Internet Protocol v4 */
17#define	ADDR_TYPE_IP6		3	/* Internet Protocol v6 */
18
19struct addr {
20        uint16_t		addr_type;
21        uint16_t		addr_bits;
22        union {
23                eth_addr_t	__eth;
24                ip_addr_t	__ip;
25                ip6_addr_t	__ip6;
26
27                uint8_t		__data8[16];
28                uint16_t	__data16[8];
29                uint32_t	__data32[4];
30        } __addr_u;
31};
32#define addr_eth	__addr_u.__eth
33#define addr_ip		__addr_u.__ip
34#define addr_ip6	__addr_u.__ip6
35#define addr_data8	__addr_u.__data8
36#define addr_data16	__addr_u.__data16
37#define addr_data32	__addr_u.__data32
38
39#define addr_pack(addr, type, bits, data, len) do {	\
40        (addr)->addr_type = type;			\
41        (addr)->addr_bits = bits;			\
42        memmove((addr)->addr_data8, (char *)data, len);	\
43} while (0)
44
45__BEGIN_DECLS
46int	 addr_cmp(const struct addr *a, const struct addr *b);
47
48int	 addr_bcast(const struct addr *a, struct addr *b);
49int	 addr_net(const struct addr *a, struct addr *b);
50
51char	*addr_ntop(const struct addr *src, char *dst, size_t size);
52int	 addr_pton(const char *src, struct addr *dst);
53
54char	*addr_ntoa(const struct addr *a);
55#define	 addr_aton	addr_pton
56
57int	 addr_ntos(const struct addr *a, struct sockaddr *sa);
58int	 addr_ston(const struct sockaddr *sa, struct addr *a);
59
60int	 addr_btos(uint16_t bits, struct sockaddr *sa);
61int	 addr_stob(const struct sockaddr *sa, uint16_t *bits);
62
63int	 addr_btom(uint16_t bits, void *mask, size_t size);
64int	 addr_mtob(const void *mask, size_t size, uint16_t *bits);
65__END_DECLS
66
67#endif /* DNET_ADDR_H */
68