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
:ref:`query source address <query_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).
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);
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 *