mirror of
https://gitlab.isc.org/isc-projects/bind9.git
synced 2025-04-18 09:44:09 +03:00
StreamDNS: Use isc__nm_senddns() to send DNS messages
This commit modifies the Stream DNS message so that it uses the optimised code path (isc__nm_senddns()) for sending DNS messages over the underlying transport. This way we avoid allocating any intermediate memory buffers needed to render a DNS message with its length pre-pended ahead of the contents (TCP DNS message format).
This commit is contained in:
parent
cb6f3dc3c8
commit
0a7e83feea
@ -78,12 +78,11 @@ typedef struct streamdns_send_req {
|
||||
isc_nm_cb_t cb; /* send callback */
|
||||
void *cbarg; /* send callback argument */
|
||||
isc_nmhandle_t *dnshandle; /* Stream DNS socket handle */
|
||||
isc_dnsbuffer_t data; /* buffer that contains the DNS message to send */
|
||||
} streamdns_send_req_t;
|
||||
|
||||
static streamdns_send_req_t *
|
||||
streamdns_get_send_req(isc_nmsocket_t *sock, isc_mem_t *mctx,
|
||||
isc__nm_uvreq_t *req, isc_region_t *data);
|
||||
isc__nm_uvreq_t *req);
|
||||
|
||||
static void
|
||||
streamdns_put_send_req(isc_mem_t *mctx, streamdns_send_req_t *send_req,
|
||||
@ -549,7 +548,7 @@ streamdns_try_close_unused(isc_nmsocket_t *sock) {
|
||||
|
||||
static streamdns_send_req_t *
|
||||
streamdns_get_send_req(isc_nmsocket_t *sock, isc_mem_t *mctx,
|
||||
isc__nm_uvreq_t *req, isc_region_t *data) {
|
||||
isc__nm_uvreq_t *req) {
|
||||
streamdns_send_req_t *send_req;
|
||||
|
||||
if (sock->streamdns.send_req != NULL) {
|
||||
@ -563,7 +562,6 @@ streamdns_get_send_req(isc_nmsocket_t *sock, isc_mem_t *mctx,
|
||||
/* Allocate a new object. */
|
||||
send_req = isc_mem_get(mctx, sizeof(*send_req));
|
||||
*send_req = (streamdns_send_req_t){ 0 };
|
||||
isc_dnsbuffer_init(&send_req->data, mctx);
|
||||
}
|
||||
|
||||
/* Initialise the send request object */
|
||||
@ -571,14 +569,6 @@ streamdns_get_send_req(isc_nmsocket_t *sock, isc_mem_t *mctx,
|
||||
send_req->cbarg = req->cbarg;
|
||||
isc_nmhandle_attach(req->handle, &send_req->dnshandle);
|
||||
|
||||
/* Prepare the message */
|
||||
/* 1. Add the message length at the very beginning of the message */
|
||||
isc_dnsbuffer_putmem_uint16be(&send_req->data,
|
||||
(uint16_t)req->uvbuf.len);
|
||||
/* 2. Append the data itself */
|
||||
isc_dnsbuffer_putmem(&send_req->data, req->uvbuf.base, req->uvbuf.len);
|
||||
isc_dnsbuffer_remainingregion(&send_req->data, data);
|
||||
|
||||
sock->streamdns.nsending++;
|
||||
|
||||
return (send_req);
|
||||
@ -596,7 +586,6 @@ streamdns_put_send_req(isc_mem_t *mctx, streamdns_send_req_t *send_req,
|
||||
sock->streamdns.nsending--;
|
||||
isc_nmhandle_detach(&send_req->dnshandle);
|
||||
if (sock->streamdns.send_req == NULL) {
|
||||
isc_dnsbuffer_clear(&send_req->data);
|
||||
sock->streamdns.send_req = send_req;
|
||||
/*
|
||||
* An object has been recycled,
|
||||
@ -606,7 +595,6 @@ streamdns_put_send_req(isc_mem_t *mctx, streamdns_send_req_t *send_req,
|
||||
}
|
||||
}
|
||||
|
||||
isc_dnsbuffer_uninit(&send_req->data);
|
||||
isc_mem_put(mctx, send_req, sizeof(*send_req));
|
||||
}
|
||||
|
||||
@ -917,9 +905,11 @@ isc__nm_async_streamdnssend(isc__networker_t *worker, isc__netievent_t *ev0) {
|
||||
|
||||
mctx = sock->worker->mctx;
|
||||
|
||||
send_req = streamdns_get_send_req(sock, mctx, req, &data);
|
||||
isc_nm_send(sock->outerhandle, &data, streamdns_writecb,
|
||||
(void *)send_req);
|
||||
send_req = streamdns_get_send_req(sock, mctx, req);
|
||||
data.base = (unsigned char *)req->uvbuf.base;
|
||||
data.length = req->uvbuf.len;
|
||||
isc__nm_senddns(sock->outerhandle, &data, streamdns_writecb,
|
||||
(void *)send_req);
|
||||
|
||||
isc__nm_uvreq_put(&req, sock);
|
||||
return;
|
||||
|
Loading…
x
Reference in New Issue
Block a user