diff --git a/configure.ac b/configure.ac index 53f67d50f8..71f14127ee 100644 --- a/configure.ac +++ b/configure.ac @@ -178,7 +178,7 @@ AC_ARG_ENABLE([developer], AS_IF([test "$enable_developer" = "yes"], [DEVELOPER_MODE=yes - STD_CPPFLAGS="$STD_CPPFLAGS -DISC_MEM_DEFAULTFILL=1 -DISC_MEM_TRACKLINES=1 -DISC_LIST_CHECKINIT=1 -DISC_STATS_CHECKUNDERFLOW=1 -DISC_MUTEX_ERROR_CHECK=1" + STD_CPPFLAGS="$STD_CPPFLAGS -DISC_MEM_DEFAULTFILL=1 -DISC_MEM_TRACKLINES=1 -DISC_LIST_CHECKINIT=1 -DISC_STATS_CHECKUNDERFLOW=1 -DISC_MUTEX_ERROR_CHECK=1 -DISC_SOCKET_DETAILS=1" test "${enable_querytrace+set}" = set || enable_querytrace=yes test "${with_cmocka+set}" = set || with_cmocka=yes test "${with_zlib+set}" = set || with_zlib=yes diff --git a/doc/arm/reference.rst b/doc/arm/reference.rst index 66b3ffc30d..4f83936ba8 100644 --- a/doc/arm/reference.rst +++ b/doc/arm/reference.rst @@ -1214,7 +1214,11 @@ default is used. :ref:`query source address ` is explicitly set, these sockets are bound to wildcard IP addresses and determining the specific IP address used by each of them requires issuing a - system call (i.e. incurring a performance penalty). + system call (i.e. incurring a performance penalty). If the highest + possible logging accuracy is required, BIND 9 can be built with + ``-DISC_SOCKET_DETAILS=1`` added to ``CFLAGS`` at compile-time; + this enables exact socket addresses to be logged, although at the + cost of lowering the server's performance. Logged :any:`dnstap` messages can be parsed using the :iscman:`dnstap-read` utility (see :ref:`man_dnstap-read` for details). diff --git a/lib/dns/dispatch.c b/lib/dns/dispatch.c index 6e71c5c645..6c9227fd84 100644 --- a/lib/dns/dispatch.c +++ b/lib/dns/dispatch.c @@ -2200,7 +2200,7 @@ dns_dispentry_getlocaladdress(dns_dispentry_t *resp, isc_sockaddr_t *addrp) { switch (disp->socktype) { case isc_socktype_tcp: - *addrp = disp->local; + *addrp = isc_nmhandle_localaddr(disp->handle); return ISC_R_SUCCESS; case isc_socktype_udp: *addrp = isc_nmhandle_localaddr(resp->handle); diff --git a/lib/isc/netmgr/netmgr.c b/lib/isc/netmgr/netmgr.c index c8e67fafda..b88f2d9fb7 100644 --- a/lib/isc/netmgr/netmgr.c +++ b/lib/isc/netmgr/netmgr.c @@ -1539,9 +1539,45 @@ isc_nmhandle_peeraddr(isc_nmhandle_t *handle) { isc_sockaddr_t isc_nmhandle_localaddr(isc_nmhandle_t *handle) { + isc_sockaddr_t addr; + REQUIRE(VALID_NMHANDLE(handle)); - return handle->local; + addr = handle->local; + +#ifdef ISC_SOCKET_DETAILS + switch (handle->sock->type) { + case isc_nm_tcpsocket: + uv_tcp_getsockname(&handle->sock->uv_handle.tcp, + (struct sockaddr *)&addr.type, + &(int){ sizeof(addr.type) }); + break; + + case isc_nm_udpsocket: + uv_udp_getsockname(&handle->sock->uv_handle.udp, + (struct sockaddr *)&addr.type, + &(int){ sizeof(addr.type) }); + break; + + case isc_nm_tlssocket: + case isc_nm_httpsocket: + case isc_nm_streamdnssocket: + if (handle->sock->outerhandle) { + addr = isc_nmhandle_localaddr( + handle->sock->outerhandle); + } + break; + + case isc_nm_proxystreamsocket: + case isc_nm_proxyudpsocket: + break; + + default: + UNREACHABLE(); + } +#endif /* ISC_SOCKET_DETAILS */ + + return addr; } isc_nm_t *