2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-09-03 16:15:27 +00:00

If we can do both IPv4 and IPv6, then use an IPv6 socket for all TCP

This commit is contained in:
Bob Halley
1999-08-18 00:36:24 +00:00
parent 4033d792a8
commit a2ce103c23

View File

@@ -97,7 +97,7 @@ ns_interfacemgr_create(isc_mem_t *mctx, isc_taskmgr_t *taskmgr,
static dns_result_t static dns_result_t
ns_interface_create(ns_interfacemgr_t *mgr, isc_sockaddr_t *addr, ns_interface_create(ns_interfacemgr_t *mgr, isc_sockaddr_t *addr,
ns_interface_t **ifpret) { isc_boolean_t udp_only, ns_interface_t **ifpret) {
ns_interface_t *ifp; ns_interface_t *ifp;
isc_result_t result; isc_result_t result;
@@ -172,10 +172,11 @@ ns_interface_create(ns_interfacemgr_t *mgr, isc_sockaddr_t *addr,
goto addtodispatch_failure; goto addtodispatch_failure;
} }
ifp->tcpsocket = NULL;
if (!udp_only) {
/* /*
* Open a TCP socket. * Open a TCP socket.
*/ */
ifp->tcpsocket = NULL;
result = isc_socket_create(mgr->socketmgr, result = isc_socket_create(mgr->socketmgr,
isc_sockaddr_pf(addr), isc_sockaddr_pf(addr),
isc_sockettype_tcp, isc_sockettype_tcp,
@@ -208,6 +209,7 @@ ns_interface_create(ns_interfacemgr_t *mgr, isc_sockaddr_t *addr,
isc_result_totext(result)); isc_result_totext(result));
goto accepttcp_failure; goto accepttcp_failure;
} }
}
ISC_LIST_APPEND(mgr->interfaces, ifp, link); ISC_LIST_APPEND(mgr->interfaces, ifp, link);
@@ -255,8 +257,10 @@ ns_interface_destroy(ns_interface_t **ifpret) {
dns_dispatch_detach(&ifp->udpdispatch); dns_dispatch_detach(&ifp->udpdispatch);
isc_socket_detach(&ifp->udpsocket); isc_socket_detach(&ifp->udpsocket);
if (ifp->tcpsocket != NULL) {
isc_socket_cancel(ifp->tcpsocket, NULL, ISC_SOCKCANCEL_ALL); isc_socket_cancel(ifp->tcpsocket, NULL, ISC_SOCKCANCEL_ALL);
isc_socket_detach(&ifp->tcpsocket); isc_socket_detach(&ifp->tcpsocket);
}
isc_task_detach(&ifp->task); isc_task_detach(&ifp->task);
@@ -299,7 +303,7 @@ purge_old_interfaces(ns_interfacemgr_t *mgr) {
} }
static void static void
do_ipv4(ns_interfacemgr_t *mgr) { do_ipv4(ns_interfacemgr_t *mgr, isc_boolean_t udp_only) {
isc_interfaceiter_t *iter = NULL; isc_interfaceiter_t *iter = NULL;
isc_result_t result; isc_result_t result;
@@ -344,7 +348,8 @@ do_ipv4(ns_interfacemgr_t *mgr) {
interface.name, addrstr, interface.name, addrstr,
ntohs(listen_addr.type.sin.sin_port)); ntohs(listen_addr.type.sin.sin_port));
result = ns_interface_create(mgr, &listen_addr, &ifp); result = ns_interface_create(mgr, &listen_addr,
udp_only, &ifp);
if (result != DNS_R_SUCCESS) { if (result != DNS_R_SUCCESS) {
UNEXPECTED_ERROR(__FILE__, __LINE__, UNEXPECTED_ERROR(__FILE__, __LINE__,
"IPv4: listening on interface %s" "IPv4: listening on interface %s"
@@ -378,7 +383,8 @@ do_ipv6(ns_interfacemgr_t *mgr) {
ifp->generation = mgr->generation; ifp->generation = mgr->generation;
} else { } else {
printf("IPv6: listening (port %u)\n", listen_port); printf("IPv6: listening (port %u)\n", listen_port);
result = ns_interface_create(mgr, &listen_addr, &ifp); result = ns_interface_create(mgr, &listen_addr, ISC_FALSE,
&ifp);
if (result != DNS_R_SUCCESS) if (result != DNS_R_SUCCESS)
UNEXPECTED_ERROR(__FILE__, __LINE__, UNEXPECTED_ERROR(__FILE__, __LINE__,
"IPv6: listening failed"); "IPv6: listening failed");
@@ -387,18 +393,21 @@ do_ipv6(ns_interfacemgr_t *mgr) {
void void
ns_interfacemgr_scan(ns_interfacemgr_t *mgr) { ns_interfacemgr_scan(ns_interfacemgr_t *mgr) {
isc_boolean_t udp_only = ISC_FALSE;
REQUIRE(VALID_IFMGR(mgr)); REQUIRE(VALID_IFMGR(mgr));
mgr->generation++; /* Increment the generation count. */ mgr->generation++; /* Increment the generation count. */
if (isc_net_probeipv6() == ISC_R_SUCCESS) {
do_ipv6(mgr);
udp_only = ISC_TRUE;
} else
printf("IPv6: not available\n");
if (isc_net_probeipv4() == ISC_R_SUCCESS) if (isc_net_probeipv4() == ISC_R_SUCCESS)
do_ipv4(mgr); do_ipv4(mgr, udp_only);
else else
printf("IPv4: not available\n"); printf("IPv4: not available\n");
if (isc_net_probeipv6() == ISC_R_SUCCESS)
do_ipv6(mgr);
else
printf("IPv6: not available\n");
/* /*
* Now go through the interface list and delete anything that * Now go through the interface list and delete anything that