mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-08-31 06:25:31 +00:00
add netmgr functions to support outgoing DNS queries
- isc_nm_tcpdnsconnect() sets up up an outgoing TCP DNS connection. - isc_nm_tcpconnect(), _udpconnect() and _tcpdnsconnect() now take a timeout argument to ensure connections time out and are correctly cleaned up on failure. - isc_nm_read() now supports UDP; it reads a single datagram and then stops until the next time it's called. - isc_nm_cancelread() now runs asynchronously to prevent assertion failure if reading is interrupted by a non-network thread (e.g. a timeout). - isc_nm_cancelread() can now apply to UDP sockets. - added shim code to support UDP connection in versions of libuv prior to 1.27, when uv_udp_connect() was added all these functions will be used to support outgoing queries in dig, xfrin, dispatch, etc.
This commit is contained in:
@@ -135,8 +135,12 @@ struct isc_nmiface {
|
||||
};
|
||||
|
||||
typedef enum isc__netievent_type {
|
||||
netievent_udpconnect,
|
||||
netievent_udpsend,
|
||||
netievent_udpread,
|
||||
netievent_udpstop,
|
||||
netievent_udpcancel,
|
||||
netievent_udpclose,
|
||||
|
||||
netievent_tcpconnect,
|
||||
netievent_tcpsend,
|
||||
@@ -145,9 +149,12 @@ typedef enum isc__netievent_type {
|
||||
netievent_tcpchildaccept,
|
||||
netievent_tcpaccept,
|
||||
netievent_tcpstop,
|
||||
netievent_tcpcancel,
|
||||
netievent_tcpclose,
|
||||
|
||||
netievent_tcpdnssend,
|
||||
netievent_tcpdnsread,
|
||||
netievent_tcpdnscancel,
|
||||
netievent_tcpdnsclose,
|
||||
netievent_tcpdnsstop,
|
||||
|
||||
@@ -212,13 +219,16 @@ typedef struct isc__netievent__socket {
|
||||
} isc__netievent__socket_t;
|
||||
|
||||
typedef isc__netievent__socket_t isc__netievent_udplisten_t;
|
||||
typedef isc__netievent__socket_t isc__netievent_udpread_t;
|
||||
typedef isc__netievent__socket_t isc__netievent_udpstop_t;
|
||||
typedef isc__netievent__socket_t isc__netievent_udpclose_t;
|
||||
typedef isc__netievent__socket_t isc__netievent_tcpstop_t;
|
||||
typedef isc__netievent__socket_t isc__netievent_tcpclose_t;
|
||||
typedef isc__netievent__socket_t isc__netievent_startread_t;
|
||||
typedef isc__netievent__socket_t isc__netievent_pauseread_t;
|
||||
typedef isc__netievent__socket_t isc__netievent_closecb_t;
|
||||
typedef isc__netievent__socket_t isc__netievent_tcpdnsclose_t;
|
||||
typedef isc__netievent__socket_t isc__netievent_tcpdnsread_t;
|
||||
typedef isc__netievent__socket_t isc__netievent_tcpdnsstop_t;
|
||||
|
||||
typedef struct isc__netievent__socket_req {
|
||||
@@ -227,6 +237,7 @@ typedef struct isc__netievent__socket_req {
|
||||
isc__nm_uvreq_t *req;
|
||||
} isc__netievent__socket_req_t;
|
||||
|
||||
typedef isc__netievent__socket_req_t isc__netievent_udpconnect_t;
|
||||
typedef isc__netievent__socket_req_t isc__netievent_tcpconnect_t;
|
||||
typedef isc__netievent__socket_req_t isc__netievent_tcplisten_t;
|
||||
typedef isc__netievent__socket_req_t isc__netievent_tcpsend_t;
|
||||
@@ -248,6 +259,9 @@ typedef struct isc__netievent__socket_handle {
|
||||
isc_nmhandle_t *handle;
|
||||
} isc__netievent__socket_handle_t;
|
||||
|
||||
typedef isc__netievent__socket_handle_t isc__netievent_udpcancel_t;
|
||||
typedef isc__netievent__socket_handle_t isc__netievent_tcpcancel_t;
|
||||
typedef isc__netievent__socket_handle_t isc__netievent_tcpdnscancel_t;
|
||||
typedef isc__netievent__socket_handle_t isc__netievent_detach_t;
|
||||
|
||||
typedef struct isc__netievent__socket_quota {
|
||||
@@ -399,11 +413,14 @@ struct isc_nmsocket {
|
||||
const isc_statscounter_t *statsindex;
|
||||
|
||||
/*%
|
||||
* TCP read timeout timer.
|
||||
* TCP read/connect timeout timers.
|
||||
*/
|
||||
uv_timer_t timer;
|
||||
bool timer_initialized;
|
||||
bool timer_running;
|
||||
uint64_t read_timeout;
|
||||
uint64_t connect_timeout;
|
||||
bool timed_out;
|
||||
|
||||
/*% outer socket is for 'wrapped' sockets - e.g. tcpdns in tcp */
|
||||
isc_nmsocket_t *outer;
|
||||
@@ -452,6 +469,7 @@ struct isc_nmsocket {
|
||||
atomic_bool closed;
|
||||
atomic_bool listening;
|
||||
atomic_bool listen_error;
|
||||
atomic_bool connecting;
|
||||
atomic_bool connected;
|
||||
atomic_bool connect_error;
|
||||
isc_refcount_t references;
|
||||
@@ -506,9 +524,9 @@ struct isc_nmsocket {
|
||||
isc_condition_t cond;
|
||||
|
||||
/*%
|
||||
* Used to pass a result back from TCP listening events.
|
||||
* Used to pass a result back from listen or connect events.
|
||||
*/
|
||||
isc_result_t result;
|
||||
atomic_int_fast32_t result;
|
||||
|
||||
/*%
|
||||
* List of active handles.
|
||||
@@ -551,6 +569,9 @@ struct isc_nmsocket {
|
||||
isc_nm_recv_cb_t recv_cb;
|
||||
void *recv_cbarg;
|
||||
|
||||
isc_nm_cb_t connect_cb;
|
||||
void *connect_cbarg;
|
||||
|
||||
isc_nm_accept_cb_t accept_cb;
|
||||
void *accept_cbarg;
|
||||
#ifdef NETMGR_TRACE
|
||||
@@ -698,16 +719,41 @@ isc__nm_udp_send(isc_nmhandle_t *handle, isc_region_t *region, isc_nm_cb_t cb,
|
||||
* Back-end implementation of isc_nm_send() for UDP handles.
|
||||
*/
|
||||
|
||||
isc_result_t
|
||||
isc__nm_udp_read(isc_nmhandle_t *handle, isc_nm_recv_cb_t cb, void *cbarg);
|
||||
/*
|
||||
* Back-end implementation of isc_nm_read() for UDP handles.
|
||||
*/
|
||||
|
||||
void
|
||||
isc__nm_udp_close(isc_nmsocket_t *sock);
|
||||
/*%<
|
||||
* Close a UDP socket.
|
||||
*/
|
||||
|
||||
void
|
||||
isc__nm_udp_cancelread(isc_nmhandle_t *handle);
|
||||
/*%<
|
||||
* Stop reading on a connected UDP handle.
|
||||
*/
|
||||
|
||||
void
|
||||
isc__nm_udp_stoplistening(isc_nmsocket_t *sock);
|
||||
|
||||
void
|
||||
isc__nm_async_udplisten(isc__networker_t *worker, isc__netievent_t *ev0);
|
||||
|
||||
void
|
||||
isc__nm_async_udpconnect(isc__networker_t *worker, isc__netievent_t *ev0);
|
||||
void
|
||||
isc__nm_async_udpstop(isc__networker_t *worker, isc__netievent_t *ev0);
|
||||
void
|
||||
isc__nm_async_udpsend(isc__networker_t *worker, isc__netievent_t *ev0);
|
||||
void
|
||||
isc__nm_async_udpread(isc__networker_t *worker, isc__netievent_t *ev0);
|
||||
void
|
||||
isc__nm_async_udpcancel(isc__networker_t *worker, isc__netievent_t *ev0);
|
||||
void
|
||||
isc__nm_async_udpclose(isc__networker_t *worker, isc__netievent_t *ev0);
|
||||
/*%<
|
||||
* Callback handlers for asynchronous UDP events (listen, stoplisten, send).
|
||||
*/
|
||||
@@ -780,6 +826,8 @@ isc__nm_async_tcp_startread(isc__networker_t *worker, isc__netievent_t *ev0);
|
||||
void
|
||||
isc__nm_async_tcp_pauseread(isc__networker_t *worker, isc__netievent_t *ev0);
|
||||
void
|
||||
isc__nm_async_tcpcancel(isc__networker_t *worker, isc__netievent_t *ev0);
|
||||
void
|
||||
isc__nm_async_tcpclose(isc__networker_t *worker, isc__netievent_t *ev0);
|
||||
/*%<
|
||||
* Callback handlers for asynchronous TCP events (connect, listen,
|
||||
@@ -802,6 +850,8 @@ isc__nm_tcpdns_close(isc_nmsocket_t *sock);
|
||||
void
|
||||
isc__nm_tcpdns_stoplistening(isc_nmsocket_t *sock);
|
||||
|
||||
void
|
||||
isc__nm_async_tcpdnscancel(isc__networker_t *worker, isc__netievent_t *ev0);
|
||||
void
|
||||
isc__nm_async_tcpdnsclose(isc__networker_t *worker, isc__netievent_t *ev0);
|
||||
void
|
||||
@@ -809,6 +859,18 @@ isc__nm_async_tcpdnssend(isc__networker_t *worker, isc__netievent_t *ev0);
|
||||
void
|
||||
isc__nm_async_tcpdnsstop(isc__networker_t *worker, isc__netievent_t *ev0);
|
||||
|
||||
void
|
||||
isc__nm_async_tcpdnsread(isc__networker_t *worker, isc__netievent_t *ev0);
|
||||
|
||||
isc_result_t
|
||||
isc__nm_tcpdns_read(isc_nmhandle_t *handle, isc_nm_recv_cb_t cb, void *cbarg);
|
||||
|
||||
void
|
||||
isc__nm_tcpdns_cancelread(isc_nmhandle_t *handle);
|
||||
/*%<
|
||||
* Stop reading on a connected TCPDNS handle.
|
||||
*/
|
||||
|
||||
#define isc__nm_uverr2result(x) \
|
||||
isc___nm_uverr2result(x, true, __FILE__, __LINE__)
|
||||
isc_result_t
|
||||
|
Reference in New Issue
Block a user