From: Ondřej Surý Date: Tue, 20 Aug 2024 09:53:07 +0000 (+0200) Subject: Assume that IPv4 and IPv6 is always available X-Git-Tag: v9.21.3~9^2~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e85399b1c0a355e7b68a9b2b38a2fdf7b969e5bc;p=thirdparty%2Fbind9.git Assume that IPv4 and IPv6 is always available In 2024, it is reasonable to assume that IPv4 and IPv6 is always available on a socket() level. We still keep the option to enable or disable each IP version individually, as the routing might be broken or undesirable for one of the versions. --- diff --git a/lib/isc/include/isc/net.h b/lib/isc/include/isc/net.h index 322584c3af3..7d04bfe6b07 100644 --- a/lib/isc/include/isc/net.h +++ b/lib/isc/include/isc/net.h @@ -188,27 +188,23 @@ ISC_LANG_BEGINDECLS isc_result_t isc_net_probeipv4(void); /*%< - * Check if the system's kernel supports IPv4. + * Check if the IPv4 has been disabled. * * Returns: * *\li #ISC_R_SUCCESS IPv4 is supported. - *\li #ISC_R_NOTFOUND IPv4 is not supported. *\li #ISC_R_DISABLED IPv4 is disabled. - *\li #ISC_R_UNEXPECTED */ isc_result_t isc_net_probeipv6(void); /*%< - * Check if the system's kernel supports IPv6. + * Check if the IPv6 has been disabled. * * Returns: * *\li #ISC_R_SUCCESS IPv6 is supported. - *\li #ISC_R_NOTFOUND IPv6 is not supported. *\li #ISC_R_DISABLED IPv6 is disabled. - *\li #ISC_R_UNEXPECTED */ isc_result_t diff --git a/lib/isc/net.c b/lib/isc/net.c index d0ab37316bc..8f73185696f 100644 --- a/lib/isc/net.c +++ b/lib/isc/net.c @@ -101,100 +101,17 @@ static isc_once_t once_ipv6pktinfo = ISC_ONCE_INIT; #endif /* ! __APPLE__ */ #endif /* ! ISC_CMSG_IP_TOS */ -static isc_once_t once = ISC_ONCE_INIT; - -static isc_result_t ipv4_result = ISC_R_NOTFOUND; -static isc_result_t ipv6_result = ISC_R_NOTFOUND; +static isc_result_t ipv4_result = ISC_R_SUCCESS; +static isc_result_t ipv6_result = ISC_R_SUCCESS; static isc_result_t ipv6pktinfo_result = ISC_R_NOTFOUND; -static isc_result_t -try_proto(int domain) { - int s; - isc_result_t result = ISC_R_SUCCESS; - - s = socket(domain, SOCK_STREAM, 0); - if (s == -1) { - switch (errno) { -#ifdef EAFNOSUPPORT - case EAFNOSUPPORT: -#endif /* ifdef EAFNOSUPPORT */ -#ifdef EPFNOSUPPORT - case EPFNOSUPPORT: -#endif /* ifdef EPFNOSUPPORT */ -#ifdef EPROTONOSUPPORT - case EPROTONOSUPPORT: -#endif /* ifdef EPROTONOSUPPORT */ -#ifdef EINVAL - case EINVAL: -#endif /* ifdef EINVAL */ - return ISC_R_NOTFOUND; - default: - UNEXPECTED_SYSERROR(errno, "socket()"); - return ISC_R_UNEXPECTED; - } - } - - if (domain == PF_INET6) { - struct sockaddr_in6 sin6; - unsigned int len; - - /* - * Check to see if IPv6 is broken, as is common on Linux. - */ - len = sizeof(sin6); - if (getsockname(s, (struct sockaddr *)&sin6, (void *)&len) < 0) - { - isc_log_write(ISC_LOGCATEGORY_GENERAL, - ISC_LOGMODULE_SOCKET, ISC_LOG_ERROR, - "retrieving the address of an IPv6 " - "socket from the kernel failed."); - isc_log_write(ISC_LOGCATEGORY_GENERAL, - ISC_LOGMODULE_SOCKET, ISC_LOG_ERROR, - "IPv6 is not supported."); - result = ISC_R_NOTFOUND; - } else { - if (len == sizeof(struct sockaddr_in6)) { - result = ISC_R_SUCCESS; - } else { - isc_log_write(ISC_LOGCATEGORY_GENERAL, - ISC_LOGMODULE_SOCKET, - ISC_LOG_ERROR, - "IPv6 structures in kernel and " - "user space do not match."); - isc_log_write(ISC_LOGCATEGORY_GENERAL, - ISC_LOGMODULE_SOCKET, - ISC_LOG_ERROR, - "IPv6 is not supported."); - result = ISC_R_NOTFOUND; - } - } - } - - (void)close(s); - - return result; -} - -static void -initialize_action(void) { - ipv4_result = try_proto(PF_INET); - ipv6_result = try_proto(PF_INET6); -} - -static void -initialize(void) { - isc_once_do(&once, initialize_action); -} - isc_result_t isc_net_probeipv4(void) { - initialize(); return ipv4_result; } isc_result_t isc_net_probeipv6(void) { - initialize(); return ipv6_result; } @@ -382,7 +299,6 @@ isc_net_getudpportrange(int af, in_port_t *low, in_port_t *high) { void isc_net_disableipv4(void) { - initialize(); if (ipv4_result == ISC_R_SUCCESS) { ipv4_result = ISC_R_DISABLED; } @@ -390,7 +306,6 @@ isc_net_disableipv4(void) { void isc_net_disableipv6(void) { - initialize(); if (ipv6_result == ISC_R_SUCCESS) { ipv6_result = ISC_R_DISABLED; } @@ -398,7 +313,6 @@ isc_net_disableipv6(void) { void isc_net_enableipv4(void) { - initialize(); if (ipv4_result == ISC_R_DISABLED) { ipv4_result = ISC_R_SUCCESS; } @@ -406,7 +320,6 @@ isc_net_enableipv4(void) { void isc_net_enableipv6(void) { - initialize(); if (ipv6_result == ISC_R_DISABLED) { ipv6_result = ISC_R_SUCCESS; }