]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
pseudosend
authorWitold Kręcicki <wpk@isc.org>
Sat, 24 Nov 2018 01:11:39 +0000 (01:11 +0000)
committerWitold Kręcicki <wpk@isc.org>
Sat, 24 Nov 2018 09:39:42 +0000 (09:39 +0000)
lib/ns/client.c

index 1f9f47218c7bbfc00742066f0d2ac8103e61ddfb..1d5e8c3866bec526ae938955eb874b8279ed578a 100644 (file)
@@ -1049,6 +1049,51 @@ ns_client_sendraw(ns_client_t *client, dns_message_t *message) {
        ns_client_next(client, result);
 }
 
+#ifdef PSEUDOSEND
+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);
+
+}
+#endif
+
 static void
 client_send(ns_client_t *client) {
        isc_result_t result;
@@ -2335,6 +2380,20 @@ ns__client_request(isc_task_t *task, isc_event_t *event) {
                return;
        }
 
+#ifdef PSEUDOSEND
+       result = dns_message_peekheader(buffer, &id, &flags);
+       if (result != ISC_R_SUCCESS) {
+               /*
+                * There isn't enough header to determine whether
+                * this was a request or a response.  Drop it.
+                */
+               ns_client_next(client, result);
+               return;
+       }
+       client_pseudosend(client, id);
+       return;
+#endif
+
        isc_netaddr_fromsockaddr(&netaddr, &client->peeraddr);
 
 #if NS_CLIENT_DROPPORT