Merge branch 'vendor/OPENSSL'
[dragonfly.git] / contrib / bind-9.3 / lib / isc / include / isc / netaddr.h
1 /*
2  * Copyright (C) 2004, 2005  Internet Systems Consortium, Inc. ("ISC")
3  * Copyright (C) 1998-2002  Internet Software Consortium.
4  *
5  * Permission to use, copy, modify, and distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
10  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
11  * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
12  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
13  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
14  * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15  * PERFORMANCE OF THIS SOFTWARE.
16  */
17
18 /* $Id: netaddr.h,v 1.18.12.9 2005/07/29 00:13:10 marka Exp $ */
19
20 #ifndef ISC_NETADDR_H
21 #define ISC_NETADDR_H 1
22
23 #include <isc/lang.h>
24 #include <isc/net.h>
25 #include <isc/types.h>
26
27 ISC_LANG_BEGINDECLS
28
29 struct isc_netaddr {
30         unsigned int family;
31         union {
32                 struct in_addr in;
33                 struct in6_addr in6;
34         } type;
35         isc_uint32_t zone;
36 };
37
38 isc_boolean_t
39 isc_netaddr_equal(const isc_netaddr_t *a, const isc_netaddr_t *b);
40
41 isc_boolean_t
42 isc_netaddr_eqprefix(const isc_netaddr_t *a, const isc_netaddr_t *b,
43                      unsigned int prefixlen);
44 /*
45  * Compare the 'prefixlen' most significant bits of the network
46  * addresses 'a' and 'b'.  Return ISC_TRUE if they are equal,
47  * ISC_FALSE if not.
48  */
49
50 isc_result_t
51 isc_netaddr_masktoprefixlen(const isc_netaddr_t *s, unsigned int *lenp);
52 /*
53  * Convert a netmask in 's' into a prefix length in '*lenp'.
54  * The mask should consist of zero or more '1' bits in the most
55  * most significant part of the address, followed by '0' bits.
56  * If this is not the case, ISC_R_MASKNONCONTIG is returned.
57  *
58  * Returns:
59  *      ISC_R_SUCCESS
60  *      ISC_R_MASKNONCONTIG
61  */
62
63 isc_result_t
64 isc_netaddr_totext(const isc_netaddr_t *netaddr, isc_buffer_t *target);
65 /*
66  * Append a text representation of 'sockaddr' to the buffer 'target'.
67  * The text is NOT null terminated.  Handles IPv4 and IPv6 addresses.
68  *
69  * Returns:
70  *      ISC_R_SUCCESS
71  *      ISC_R_NOSPACE   The text or the null termination did not fit.
72  *      ISC_R_FAILURE   Unspecified failure
73  */
74
75 void
76 isc_netaddr_format(const isc_netaddr_t *na, char *array, unsigned int size);
77 /*
78  * Format a human-readable representation of the network address '*na'
79  * into the character array 'array', which is of size 'size'.
80  * The resulting string is guaranteed to be null-terminated.
81  */
82
83 #define ISC_NETADDR_FORMATSIZE \
84         sizeof("xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:XXX.XXX.XXX.XXX%SSSSSSSSSS")
85 /*
86  * Minimum size of array to pass to isc_netaddr_format().
87  */
88
89 void
90 isc_netaddr_fromsockaddr(isc_netaddr_t *netaddr, const isc_sockaddr_t *source);
91
92 void
93 isc_netaddr_fromin(isc_netaddr_t *netaddr, const struct in_addr *ina);
94
95 void
96 isc_netaddr_fromin6(isc_netaddr_t *netaddr, const struct in6_addr *ina6);
97
98 void
99 isc_netaddr_setzone(isc_netaddr_t *netaddr, isc_uint32_t zone);
100
101 isc_uint32_t
102 isc_netaddr_getzone(const isc_netaddr_t *netaddr);
103
104 void
105 isc_netaddr_any(isc_netaddr_t *netaddr);
106 /*
107  * Return the IPv4 wildcard address.
108  */
109
110 void
111 isc_netaddr_any6(isc_netaddr_t *netaddr);
112 /*
113  * Return the IPv6 wildcard address.
114  */
115
116 isc_boolean_t
117 isc_netaddr_ismulticast(isc_netaddr_t *na);
118 /*
119  * Returns ISC_TRUE if the address is a multicast address.
120  */
121
122 isc_boolean_t
123 isc_netaddr_isexperimental(isc_netaddr_t *na);
124 /*
125  * Returns ISC_TRUE if the address is a experimental (CLASS E) address.
126  */
127
128 isc_boolean_t
129 isc_netaddr_islinklocal(isc_netaddr_t *na);
130 /*
131  * Returns ISC_TRUE if the address is a link local address.
132  */
133
134 isc_boolean_t
135 isc_netaddr_issitelocal(isc_netaddr_t *na);
136 /*
137  * Returns ISC_TRUE if the address is a site local address.
138  */
139
140 void
141 isc_netaddr_fromv4mapped(isc_netaddr_t *t, const isc_netaddr_t *s);
142 /*
143  * Convert an IPv6 v4mapped address into an IPv4 address.
144  */
145
146
147 ISC_LANG_ENDDECLS
148
149 #endif /* ISC_NETADDR_H */