xref: /minix3/external/bsd/bind/dist/lib/isc/win32/net.c (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
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