From: Witold Kręcicki Date: Fri, 10 Aug 2018 15:45:03 +0000 (+0200) Subject: Experiment: answer immediately to test network stack speed X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c16fcbf9a49999bcb95e2e143354693b56e208bb;p=thirdparty%2Fbind9.git Experiment: answer immediately to test network stack speed --- diff --git a/lib/ns/client.c b/lib/ns/client.c index 03975f6640a..47270e9a30c 100644 --- a/lib/ns/client.c +++ b/lib/ns/client.c @@ -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.