xref: /trueos/contrib/ntp/include/isc/netaddr.h (revision b3db078f21c6b171ca87f55006f0195783756e42)
1 /*
2  * Copyright (C) 2004  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.7 2004/03/08 09:04:52 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")
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 */
150