1*00b67f09SDavid van Moolenbroek /* $NetBSD: net.c,v 1.8 2014/12/10 04:38:01 christos Exp $ */
2*00b67f09SDavid van Moolenbroek
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek * Copyright (C) 2004, 2005, 2007-2009, 2011-2014 Internet Systems Consortium, Inc. ("ISC")
5*00b67f09SDavid van Moolenbroek * Copyright (C) 1999-2003 Internet Software Consortium.
6*00b67f09SDavid van Moolenbroek *
7*00b67f09SDavid van Moolenbroek * Permission to use, copy, modify, and/or distribute this software for any
8*00b67f09SDavid van Moolenbroek * purpose with or without fee is hereby granted, provided that the above
9*00b67f09SDavid van Moolenbroek * copyright notice and this permission notice appear in all copies.
10*00b67f09SDavid van Moolenbroek *
11*00b67f09SDavid van Moolenbroek * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
12*00b67f09SDavid van Moolenbroek * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
13*00b67f09SDavid van Moolenbroek * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
14*00b67f09SDavid van Moolenbroek * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
15*00b67f09SDavid van Moolenbroek * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
16*00b67f09SDavid van Moolenbroek * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
17*00b67f09SDavid van Moolenbroek * PERFORMANCE OF THIS SOFTWARE.
18*00b67f09SDavid van Moolenbroek */
19*00b67f09SDavid van Moolenbroek
20*00b67f09SDavid van Moolenbroek /* Id */
21*00b67f09SDavid van Moolenbroek
22*00b67f09SDavid van Moolenbroek #include <config.h>
23*00b67f09SDavid van Moolenbroek
24*00b67f09SDavid van Moolenbroek #include <errno.h>
25*00b67f09SDavid van Moolenbroek #include <unistd.h>
26*00b67f09SDavid van Moolenbroek
27*00b67f09SDavid van Moolenbroek #include <isc/log.h>
28*00b67f09SDavid van Moolenbroek #include <isc/msgs.h>
29*00b67f09SDavid van Moolenbroek #include <isc/net.h>
30*00b67f09SDavid van Moolenbroek #include <isc/once.h>
31*00b67f09SDavid van Moolenbroek #include <isc/strerror.h>
32*00b67f09SDavid van Moolenbroek #include <isc/string.h>
33*00b67f09SDavid van Moolenbroek #include <isc/util.h>
34*00b67f09SDavid van Moolenbroek
35*00b67f09SDavid van Moolenbroek /*%
36*00b67f09SDavid van Moolenbroek * Definitions about UDP port range specification. This is a total mess of
37*00b67f09SDavid van Moolenbroek * portability variants: some use sysctl (but the sysctl names vary), some use
38*00b67f09SDavid van Moolenbroek * system-specific interfaces, some have the same interface for IPv4 and IPv6,
39*00b67f09SDavid van Moolenbroek * some separate them, etc...
40*00b67f09SDavid van Moolenbroek */
41*00b67f09SDavid van Moolenbroek
42*00b67f09SDavid van Moolenbroek /*%
43*00b67f09SDavid van Moolenbroek * The last resort defaults: use all non well known port space
44*00b67f09SDavid van Moolenbroek */
45*00b67f09SDavid van Moolenbroek #ifndef ISC_NET_PORTRANGELOW
46*00b67f09SDavid van Moolenbroek #define ISC_NET_PORTRANGELOW 1024
47*00b67f09SDavid van Moolenbroek #endif /* ISC_NET_PORTRANGELOW */
48*00b67f09SDavid van Moolenbroek #ifndef ISC_NET_PORTRANGEHIGH
49*00b67f09SDavid van Moolenbroek #define ISC_NET_PORTRANGEHIGH 65535
50*00b67f09SDavid van Moolenbroek #endif /* ISC_NET_PORTRANGEHIGH */
51*00b67f09SDavid van Moolenbroek
52*00b67f09SDavid van Moolenbroek #if defined(ISC_PLATFORM_HAVEIPV6) && defined(ISC_PLATFORM_NEEDIN6ADDRANY)
53*00b67f09SDavid van Moolenbroek const struct in6_addr isc_net_in6addrany = IN6ADDR_ANY_INIT;
54*00b67f09SDavid van Moolenbroek #endif
55*00b67f09SDavid van Moolenbroek
56*00b67f09SDavid van Moolenbroek static isc_once_t once = ISC_ONCE_INIT;
57*00b67f09SDavid van Moolenbroek static isc_once_t once_ipv6only = ISC_ONCE_INIT;
58*00b67f09SDavid van Moolenbroek static isc_once_t once_ipv6pktinfo = ISC_ONCE_INIT;
59*00b67f09SDavid van Moolenbroek static isc_result_t ipv4_result = ISC_R_NOTFOUND;
60*00b67f09SDavid van Moolenbroek static isc_result_t ipv6_result = ISC_R_NOTFOUND;
61*00b67f09SDavid van Moolenbroek static isc_result_t ipv6only_result = ISC_R_NOTFOUND;
62*00b67f09SDavid van Moolenbroek static isc_result_t ipv6pktinfo_result = ISC_R_NOTFOUND;
63*00b67f09SDavid van Moolenbroek
64*00b67f09SDavid van Moolenbroek void InitSockets(void);
65*00b67f09SDavid van Moolenbroek
66*00b67f09SDavid van Moolenbroek static isc_result_t
try_proto(int domain)67*00b67f09SDavid van Moolenbroek try_proto(int domain) {
68*00b67f09SDavid van Moolenbroek SOCKET s;
69*00b67f09SDavid van Moolenbroek char strbuf[ISC_STRERRORSIZE];
70*00b67f09SDavid van Moolenbroek int errval;
71*00b67f09SDavid van Moolenbroek
72*00b67f09SDavid van Moolenbroek s = socket(domain, SOCK_STREAM, IPPROTO_TCP);
73*00b67f09SDavid van Moolenbroek if (s == INVALID_SOCKET) {
74*00b67f09SDavid van Moolenbroek errval = WSAGetLastError();
75*00b67f09SDavid van Moolenbroek switch (errval) {
76*00b67f09SDavid van Moolenbroek case WSAEAFNOSUPPORT:
77*00b67f09SDavid van Moolenbroek case WSAEPROTONOSUPPORT:
78*00b67f09SDavid van Moolenbroek case WSAEINVAL:
79*00b67f09SDavid van Moolenbroek return (ISC_R_NOTFOUND);
80*00b67f09SDavid van Moolenbroek default:
81*00b67f09SDavid van Moolenbroek isc__strerror(errval, strbuf, sizeof(strbuf));
82*00b67f09SDavid van Moolenbroek UNEXPECTED_ERROR(__FILE__, __LINE__,
83*00b67f09SDavid van Moolenbroek "socket() %s: %s",
84*00b67f09SDavid van Moolenbroek isc_msgcat_get(isc_msgcat,
85*00b67f09SDavid van Moolenbroek ISC_MSGSET_GENERAL,
86*00b67f09SDavid van Moolenbroek ISC_MSG_FAILED,
87*00b67f09SDavid van Moolenbroek "failed"),
88*00b67f09SDavid van Moolenbroek strbuf);
89*00b67f09SDavid van Moolenbroek return (ISC_R_UNEXPECTED);
90*00b67f09SDavid van Moolenbroek }
91*00b67f09SDavid van Moolenbroek }
92*00b67f09SDavid van Moolenbroek
93*00b67f09SDavid van Moolenbroek closesocket(s);
94*00b67f09SDavid van Moolenbroek
95*00b67f09SDavid van Moolenbroek return (ISC_R_SUCCESS);
96*00b67f09SDavid van Moolenbroek }
97*00b67f09SDavid van Moolenbroek
98*00b67f09SDavid van Moolenbroek static void
initialize_action(void)99*00b67f09SDavid van Moolenbroek initialize_action(void) {
100*00b67f09SDavid van Moolenbroek InitSockets();
101*00b67f09SDavid van Moolenbroek ipv4_result = try_proto(PF_INET);
102*00b67f09SDavid van Moolenbroek #ifdef ISC_PLATFORM_HAVEIPV6
103*00b67f09SDavid van Moolenbroek #ifdef WANT_IPV6
104*00b67f09SDavid van Moolenbroek #ifdef ISC_PLATFORM_HAVEIN6PKTINFO
105*00b67f09SDavid van Moolenbroek ipv6_result = try_proto(PF_INET6);
106*00b67f09SDavid van Moolenbroek #endif
107*00b67f09SDavid van Moolenbroek #endif
108*00b67f09SDavid van Moolenbroek #endif
109*00b67f09SDavid van Moolenbroek }
110*00b67f09SDavid van Moolenbroek
111*00b67f09SDavid van Moolenbroek static void
initialize(void)112*00b67f09SDavid van Moolenbroek initialize(void) {
113*00b67f09SDavid van Moolenbroek RUNTIME_CHECK(isc_once_do(&once, initialize_action) == ISC_R_SUCCESS);
114*00b67f09SDavid van Moolenbroek }
115*00b67f09SDavid van Moolenbroek
116*00b67f09SDavid van Moolenbroek isc_result_t
isc_net_probeipv4(void)117*00b67f09SDavid van Moolenbroek isc_net_probeipv4(void) {
118*00b67f09SDavid van Moolenbroek initialize();
119*00b67f09SDavid van Moolenbroek return (ipv4_result);
120*00b67f09SDavid van Moolenbroek }
121*00b67f09SDavid van Moolenbroek
122*00b67f09SDavid van Moolenbroek isc_result_t
isc_net_probeipv6(void)123*00b67f09SDavid van Moolenbroek isc_net_probeipv6(void) {
124*00b67f09SDavid van Moolenbroek initialize();
125*00b67f09SDavid van Moolenbroek return (ipv6_result);
126*00b67f09SDavid van Moolenbroek }
127*00b67f09SDavid van Moolenbroek
128*00b67f09SDavid van Moolenbroek isc_result_t
isc_net_probeunix(void)129*00b67f09SDavid van Moolenbroek isc_net_probeunix(void) {
130*00b67f09SDavid van Moolenbroek return (ISC_R_NOTFOUND);
131*00b67f09SDavid van Moolenbroek }
132*00b67f09SDavid van Moolenbroek
133*00b67f09SDavid van Moolenbroek #ifdef ISC_PLATFORM_HAVEIPV6
134*00b67f09SDavid van Moolenbroek #ifdef WANT_IPV6
135*00b67f09SDavid van Moolenbroek static void
try_ipv6only(void)136*00b67f09SDavid van Moolenbroek try_ipv6only(void) {
137*00b67f09SDavid van Moolenbroek #ifdef IPV6_V6ONLY
138*00b67f09SDavid van Moolenbroek SOCKET s;
139*00b67f09SDavid van Moolenbroek int on;
140*00b67f09SDavid van Moolenbroek char strbuf[ISC_STRERRORSIZE];
141*00b67f09SDavid van Moolenbroek #endif
142*00b67f09SDavid van Moolenbroek isc_result_t result;
143*00b67f09SDavid van Moolenbroek
144*00b67f09SDavid van Moolenbroek result = isc_net_probeipv6();
145*00b67f09SDavid van Moolenbroek if (result != ISC_R_SUCCESS) {
146*00b67f09SDavid van Moolenbroek ipv6only_result = result;
147*00b67f09SDavid van Moolenbroek return;
148*00b67f09SDavid van Moolenbroek }
149*00b67f09SDavid van Moolenbroek
150*00b67f09SDavid van Moolenbroek #ifndef IPV6_V6ONLY
151*00b67f09SDavid van Moolenbroek ipv6only_result = ISC_R_NOTFOUND;
152*00b67f09SDavid van Moolenbroek return;
153*00b67f09SDavid van Moolenbroek #else
154*00b67f09SDavid van Moolenbroek /* check for TCP sockets */
155*00b67f09SDavid van Moolenbroek s = socket(PF_INET6, SOCK_STREAM, 0);
156*00b67f09SDavid van Moolenbroek if (s == INVALID_SOCKET) {
157*00b67f09SDavid van Moolenbroek isc__strerror(errno, strbuf, sizeof(strbuf));
158*00b67f09SDavid van Moolenbroek UNEXPECTED_ERROR(__FILE__, __LINE__,
159*00b67f09SDavid van Moolenbroek "socket() %s: %s",
160*00b67f09SDavid van Moolenbroek isc_msgcat_get(isc_msgcat,
161*00b67f09SDavid van Moolenbroek ISC_MSGSET_GENERAL,
162*00b67f09SDavid van Moolenbroek ISC_MSG_FAILED,
163*00b67f09SDavid van Moolenbroek "failed"),
164*00b67f09SDavid van Moolenbroek strbuf);
165*00b67f09SDavid van Moolenbroek ipv6only_result = ISC_R_UNEXPECTED;
166*00b67f09SDavid van Moolenbroek return;
167*00b67f09SDavid van Moolenbroek }
168*00b67f09SDavid van Moolenbroek
169*00b67f09SDavid van Moolenbroek on = 1;
170*00b67f09SDavid van Moolenbroek if (setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, (const char *)&on,
171*00b67f09SDavid van Moolenbroek sizeof(on)) < 0) {
172*00b67f09SDavid van Moolenbroek ipv6only_result = ISC_R_NOTFOUND;
173*00b67f09SDavid van Moolenbroek goto close;
174*00b67f09SDavid van Moolenbroek }
175*00b67f09SDavid van Moolenbroek
176*00b67f09SDavid van Moolenbroek closesocket(s);
177*00b67f09SDavid van Moolenbroek
178*00b67f09SDavid van Moolenbroek /* check for UDP sockets */
179*00b67f09SDavid van Moolenbroek s = socket(PF_INET6, SOCK_DGRAM, 0);
180*00b67f09SDavid van Moolenbroek if (s == INVALID_SOCKET) {
181*00b67f09SDavid van Moolenbroek isc__strerror(errno, strbuf, sizeof(strbuf));
182*00b67f09SDavid van Moolenbroek UNEXPECTED_ERROR(__FILE__, __LINE__,
183*00b67f09SDavid van Moolenbroek "socket() %s: %s",
184*00b67f09SDavid van Moolenbroek isc_msgcat_get(isc_msgcat,
185*00b67f09SDavid van Moolenbroek ISC_MSGSET_GENERAL,
186*00b67f09SDavid van Moolenbroek ISC_MSG_FAILED,
187*00b67f09SDavid van Moolenbroek "failed"),
188*00b67f09SDavid van Moolenbroek strbuf);
189*00b67f09SDavid van Moolenbroek ipv6only_result = ISC_R_UNEXPECTED;
190*00b67f09SDavid van Moolenbroek return;
191*00b67f09SDavid van Moolenbroek }
192*00b67f09SDavid van Moolenbroek
193*00b67f09SDavid van Moolenbroek on = 1;
194*00b67f09SDavid van Moolenbroek if (setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY, (const char *)&on,
195*00b67f09SDavid van Moolenbroek sizeof(on)) < 0) {
196*00b67f09SDavid van Moolenbroek ipv6only_result = ISC_R_NOTFOUND;
197*00b67f09SDavid van Moolenbroek goto close;
198*00b67f09SDavid van Moolenbroek }
199*00b67f09SDavid van Moolenbroek
200*00b67f09SDavid van Moolenbroek ipv6only_result = ISC_R_SUCCESS;
201*00b67f09SDavid van Moolenbroek
202*00b67f09SDavid van Moolenbroek close:
203*00b67f09SDavid van Moolenbroek closesocket(s);
204*00b67f09SDavid van Moolenbroek return;
205*00b67f09SDavid van Moolenbroek #endif /* IPV6_V6ONLY */
206*00b67f09SDavid van Moolenbroek }
207*00b67f09SDavid van Moolenbroek
208*00b67f09SDavid van Moolenbroek static void
initialize_ipv6only(void)209*00b67f09SDavid van Moolenbroek initialize_ipv6only(void) {
210*00b67f09SDavid van Moolenbroek RUNTIME_CHECK(isc_once_do(&once_ipv6only,
211*00b67f09SDavid van Moolenbroek try_ipv6only) == ISC_R_SUCCESS);
212*00b67f09SDavid van Moolenbroek }
213*00b67f09SDavid van Moolenbroek
214*00b67f09SDavid van Moolenbroek static void
try_ipv6pktinfo(void)215*00b67f09SDavid van Moolenbroek try_ipv6pktinfo(void) {
216*00b67f09SDavid van Moolenbroek SOCKET s;
217*00b67f09SDavid van Moolenbroek int on;
218*00b67f09SDavid van Moolenbroek char strbuf[ISC_STRERRORSIZE];
219*00b67f09SDavid van Moolenbroek isc_result_t result;
220*00b67f09SDavid van Moolenbroek int optname;
221*00b67f09SDavid van Moolenbroek
222*00b67f09SDavid van Moolenbroek result = isc_net_probeipv6();
223*00b67f09SDavid van Moolenbroek if (result != ISC_R_SUCCESS) {
224*00b67f09SDavid van Moolenbroek ipv6pktinfo_result = result;
225*00b67f09SDavid van Moolenbroek return;
226*00b67f09SDavid van Moolenbroek }
227*00b67f09SDavid van Moolenbroek
228*00b67f09SDavid van Moolenbroek /* we only use this for UDP sockets */
229*00b67f09SDavid van Moolenbroek s = socket(PF_INET6, SOCK_DGRAM, IPPROTO_UDP);
230*00b67f09SDavid van Moolenbroek if (s == INVALID_SOCKET) {
231*00b67f09SDavid van Moolenbroek isc__strerror(errno, strbuf, sizeof(strbuf));
232*00b67f09SDavid van Moolenbroek UNEXPECTED_ERROR(__FILE__, __LINE__,
233*00b67f09SDavid van Moolenbroek "socket() %s: %s",
234*00b67f09SDavid van Moolenbroek isc_msgcat_get(isc_msgcat,
235*00b67f09SDavid van Moolenbroek ISC_MSGSET_GENERAL,
236*00b67f09SDavid van Moolenbroek ISC_MSG_FAILED,
237*00b67f09SDavid van Moolenbroek "failed"),
238*00b67f09SDavid van Moolenbroek strbuf);
239*00b67f09SDavid van Moolenbroek ipv6pktinfo_result = ISC_R_UNEXPECTED;
240*00b67f09SDavid van Moolenbroek return;
241*00b67f09SDavid van Moolenbroek }
242*00b67f09SDavid van Moolenbroek
243*00b67f09SDavid van Moolenbroek #ifdef IPV6_RECVPKTINFO
244*00b67f09SDavid van Moolenbroek optname = IPV6_RECVPKTINFO;
245*00b67f09SDavid van Moolenbroek #else
246*00b67f09SDavid van Moolenbroek optname = IPV6_PKTINFO;
247*00b67f09SDavid van Moolenbroek #endif
248*00b67f09SDavid van Moolenbroek on = 1;
249*00b67f09SDavid van Moolenbroek if (setsockopt(s, IPPROTO_IPV6, optname, (const char *) &on,
250*00b67f09SDavid van Moolenbroek sizeof(on)) < 0) {
251*00b67f09SDavid van Moolenbroek ipv6pktinfo_result = ISC_R_NOTFOUND;
252*00b67f09SDavid van Moolenbroek goto close;
253*00b67f09SDavid van Moolenbroek }
254*00b67f09SDavid van Moolenbroek
255*00b67f09SDavid van Moolenbroek ipv6pktinfo_result = ISC_R_SUCCESS;
256*00b67f09SDavid van Moolenbroek
257*00b67f09SDavid van Moolenbroek close:
258*00b67f09SDavid van Moolenbroek closesocket(s);
259*00b67f09SDavid van Moolenbroek return;
260*00b67f09SDavid van Moolenbroek }
261*00b67f09SDavid van Moolenbroek
262*00b67f09SDavid van Moolenbroek static void
initialize_ipv6pktinfo(void)263*00b67f09SDavid van Moolenbroek initialize_ipv6pktinfo(void) {
264*00b67f09SDavid van Moolenbroek RUNTIME_CHECK(isc_once_do(&once_ipv6pktinfo,
265*00b67f09SDavid van Moolenbroek try_ipv6pktinfo) == ISC_R_SUCCESS);
266*00b67f09SDavid van Moolenbroek }
267*00b67f09SDavid van Moolenbroek #endif /* WANT_IPV6 */
268*00b67f09SDavid van Moolenbroek #endif /* ISC_PLATFORM_HAVEIPV6 */
269*00b67f09SDavid van Moolenbroek
270*00b67f09SDavid van Moolenbroek isc_result_t
isc_net_probe_ipv6only(void)271*00b67f09SDavid van Moolenbroek isc_net_probe_ipv6only(void) {
272*00b67f09SDavid van Moolenbroek #ifdef ISC_PLATFORM_HAVEIPV6
273*00b67f09SDavid van Moolenbroek #ifdef WANT_IPV6
274*00b67f09SDavid van Moolenbroek initialize_ipv6only();
275*00b67f09SDavid van Moolenbroek #else
276*00b67f09SDavid van Moolenbroek ipv6only_result = ISC_R_NOTFOUND;
277*00b67f09SDavid van Moolenbroek #endif
278*00b67f09SDavid van Moolenbroek #endif
279*00b67f09SDavid van Moolenbroek return (ipv6only_result);
280*00b67f09SDavid van Moolenbroek }
281*00b67f09SDavid van Moolenbroek
282*00b67f09SDavid van Moolenbroek isc_result_t
isc_net_probe_ipv6pktinfo(void)283*00b67f09SDavid van Moolenbroek isc_net_probe_ipv6pktinfo(void) {
284*00b67f09SDavid van Moolenbroek #ifdef ISC_PLATFORM_HAVEIPV6
285*00b67f09SDavid van Moolenbroek #ifdef WANT_IPV6
286*00b67f09SDavid van Moolenbroek initialize_ipv6pktinfo();
287*00b67f09SDavid van Moolenbroek #else
288*00b67f09SDavid van Moolenbroek ipv6pktinfo_result = ISC_R_NOTFOUND;
289*00b67f09SDavid van Moolenbroek #endif
290*00b67f09SDavid van Moolenbroek #endif
291*00b67f09SDavid van Moolenbroek return (ipv6pktinfo_result);
292*00b67f09SDavid van Moolenbroek }
293*00b67f09SDavid van Moolenbroek
294*00b67f09SDavid van Moolenbroek isc_result_t
isc_net_getudpportrange(int af,in_port_t * low,in_port_t * high)295*00b67f09SDavid van Moolenbroek isc_net_getudpportrange(int af, in_port_t *low, in_port_t *high) {
296*00b67f09SDavid van Moolenbroek int result = ISC_R_FAILURE;
297*00b67f09SDavid van Moolenbroek
298*00b67f09SDavid van Moolenbroek REQUIRE(low != NULL && high != NULL);
299*00b67f09SDavid van Moolenbroek
300*00b67f09SDavid van Moolenbroek UNUSED(af);
301*00b67f09SDavid van Moolenbroek
302*00b67f09SDavid van Moolenbroek if (result != ISC_R_SUCCESS) {
303*00b67f09SDavid van Moolenbroek *low = ISC_NET_PORTRANGELOW;
304*00b67f09SDavid van Moolenbroek *high = ISC_NET_PORTRANGEHIGH;
305*00b67f09SDavid van Moolenbroek }
306*00b67f09SDavid van Moolenbroek
307*00b67f09SDavid van Moolenbroek return (ISC_R_SUCCESS); /* we currently never fail in this function */
308*00b67f09SDavid van Moolenbroek }
309*00b67f09SDavid van Moolenbroek
310*00b67f09SDavid van Moolenbroek void
isc_net_disableipv4(void)311*00b67f09SDavid van Moolenbroek isc_net_disableipv4(void) {
312*00b67f09SDavid van Moolenbroek initialize();
313*00b67f09SDavid van Moolenbroek if (ipv4_result == ISC_R_SUCCESS)
314*00b67f09SDavid van Moolenbroek ipv4_result = ISC_R_DISABLED;
315*00b67f09SDavid van Moolenbroek }
316*00b67f09SDavid van Moolenbroek
317*00b67f09SDavid van Moolenbroek void
isc_net_disableipv6(void)318*00b67f09SDavid van Moolenbroek isc_net_disableipv6(void) {
319*00b67f09SDavid van Moolenbroek initialize();
320*00b67f09SDavid van Moolenbroek if (ipv6_result == ISC_R_SUCCESS)
321*00b67f09SDavid van Moolenbroek ipv6_result = ISC_R_DISABLED;
322*00b67f09SDavid van Moolenbroek }
323*00b67f09SDavid van Moolenbroek
324*00b67f09SDavid van Moolenbroek void
isc_net_enableipv4(void)325*00b67f09SDavid van Moolenbroek isc_net_enableipv4(void) {
326*00b67f09SDavid van Moolenbroek initialize();
327*00b67f09SDavid van Moolenbroek if (ipv4_result == ISC_R_DISABLED)
328*00b67f09SDavid van Moolenbroek ipv4_result = ISC_R_SUCCESS;
329*00b67f09SDavid van Moolenbroek }
330*00b67f09SDavid van Moolenbroek
331*00b67f09SDavid van Moolenbroek void
isc_net_enableipv6(void)332*00b67f09SDavid van Moolenbroek isc_net_enableipv6(void) {
333*00b67f09SDavid van Moolenbroek initialize();
334*00b67f09SDavid van Moolenbroek if (ipv6_result == ISC_R_DISABLED)
335*00b67f09SDavid van Moolenbroek ipv6_result = ISC_R_SUCCESS;
336*00b67f09SDavid van Moolenbroek }
337*00b67f09SDavid van Moolenbroek
338*00b67f09SDavid van Moolenbroek unsigned int
isc_net_probedscp(void)339*00b67f09SDavid van Moolenbroek isc_net_probedscp(void) {
340*00b67f09SDavid van Moolenbroek return (0);
341*00b67f09SDavid van Moolenbroek }
342