]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
Experiment: answer immediately to test network stack speed
authorWitold Kręcicki <wpk@isc.org>
Fri, 10 Aug 2018 15:45:03 +0000 (17:45 +0200)
committerWitold Kręcicki <wpk@isc.org>
Fri, 10 Aug 2018 15:45:03 +0000 (17:45 +0200)
lib/ns/client.c

index 03975f6640abc80e5c5fe6ff758eaebd9eb64c95..47270e9a30cf20a73b2c75d2676f30885abef0b8 100644 (file)
@@ -1048,6 +1048,49 @@ ns_client_sendraw(ns_client_t *client, dns_message_t *message) {
        ns_client_next(client, result);
 }
 
+static void
+client_pseudosend(ns_client_t *client, uint16_t id) {
+       isc_result_t result;
+       unsigned char *data;
+       isc_buffer_t buffer;
+       isc_buffer_t tcpbuffer;
+       isc_region_t r;
+       unsigned char sendbuf[SEND_BUFFER_SIZE];
+       result = client_allocsendbuf(client, &buffer, &tcpbuffer, 0,
+                                    sendbuf, &data);
+       if (result != ISC_R_SUCCESS) {
+               goto done;
+       }
+
+       isc_buffer_putuint16(&buffer, id);
+       isc_buffer_putuint8(&buffer, 0x81);
+       isc_buffer_putuint8(&buffer, 0x80);
+       isc_buffer_putuint16(&buffer, 0);
+       isc_buffer_putuint16(&buffer, 0);
+       isc_buffer_putuint16(&buffer, 0);
+       isc_buffer_putuint16(&buffer, 0);
+       if (client->sendcb != NULL) {
+               client->sendcb(&buffer);
+       } else if (TCP_CLIENT(client)) {
+               isc_buffer_usedregion(&buffer, &r);
+               isc_buffer_putuint16(&tcpbuffer, (uint16_t) r.length);
+               isc_buffer_add(&tcpbuffer, r.length);
+               result = client_sendpkg(client, &tcpbuffer);
+       } else {
+               result = client_sendpkg(client, &buffer);
+       }
+       if (result == ISC_R_SUCCESS) {
+               return;
+       }
+done:
+       if (client->tcpbuf != NULL) {
+               isc_mem_put(client->mctx, client->tcpbuf, TCP_BUFFER_SIZE);
+               client->tcpbuf = NULL;
+       }
+       ns_client_next(client, result);
+
+}
+
 static void
 client_send(ns_client_t *client) {
        isc_result_t result;
@@ -2346,7 +2389,6 @@ ns__client_request(isc_task_t *task, isc_event_t *event) {
        }
 
        isc_netaddr_fromsockaddr(&netaddr, &client->peeraddr);
-
 #if NS_CLIENT_DROPPORT
        if (ns_client_dropport(isc_sockaddr_getport(&client->peeraddr)) ==
            DROPPORT_REQUEST) {
@@ -2403,6 +2445,8 @@ ns__client_request(isc_task_t *task, isc_event_t *event) {
                ns_client_next(client, result);
                return;
        }
+       client_pseudosend(client, id);
+       return; 
 
        /*
         * The client object handles requests, not responses.