]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
StreamDNS: Use isc__nm_senddns() to send DNS messages
authorArtem Boldariev <artem@boldariev.com>
Wed, 7 Dec 2022 12:32:20 +0000 (14:32 +0200)
committerArtem Boldariev <artem@boldariev.com>
Tue, 20 Dec 2022 20:13:53 +0000 (22:13 +0200)
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).

lib/isc/netmgr/streamdns.c

index c72697c8f34dc3144e49d9175c08ba4d455ccf90..fe8f2512bc5a9d0e881c7f9b16754c2e81b67c01 100644 (file)
@@ -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;