2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-08-30 14:07:59 +00:00

270. [func] Allow maximum sized TCP answers.

This commit is contained in:
Mark Andrews
2000-06-22 00:05:11 +00:00
parent 9bff67898d
commit b35a009df8
3 changed files with 27 additions and 5 deletions

View File

@@ -1,3 +1,5 @@
270. [func] Allow maximum sized TCP answers.
269. [bug] Failed DNSSEC validations could cause an assertion 269. [bug] Failed DNSSEC validations could cause an assertion
failure by causing clone_results() to be called with failure by causing clone_results() to be called with
with hevent->node == NULL. with hevent->node == NULL.

View File

@@ -72,7 +72,9 @@
#define TCP_CLIENT(c) (((c)->attributes & NS_CLIENTATTR_TCP) != 0) #define TCP_CLIENT(c) (((c)->attributes & NS_CLIENTATTR_TCP) != 0)
#define TCP_BUFFER_SIZE (65535 + 2)
#define SEND_BUFFER_SIZE 2048 #define SEND_BUFFER_SIZE 2048
#define RECV_BUFFER_SIZE 2048
struct ns_clientmgr { struct ns_clientmgr {
/* Unlocked. */ /* Unlocked. */
@@ -223,6 +225,8 @@ client_free(ns_client_t *client) {
isc_mem_put(client->mctx, client->sendbuf, SEND_BUFFER_SIZE); isc_mem_put(client->mctx, client->sendbuf, SEND_BUFFER_SIZE);
isc_timer_detach(&client->timer); isc_timer_detach(&client->timer);
if (client->sendbuf != NULL)
isc_mem_put(client->mctx, client->sendbuf, TCP_BUFFER_SIZE);
if (client->opt != NULL) { if (client->opt != NULL) {
INSIST(dns_rdataset_isassociated(client->opt)); INSIST(dns_rdataset_isassociated(client->opt));
dns_rdataset_disassociate(client->opt); dns_rdataset_disassociate(client->opt);
@@ -571,6 +575,11 @@ client_senddone(isc_task_t *task, isc_event_t *event) {
INSIST(client->nsends > 0); INSIST(client->nsends > 0);
client->nsends--; client->nsends--;
if (client->tcpbuf != NULL) {
isc_mem_put(client->mctx, client->tcpbuf, TCP_BUFFER_SIZE);
client->tcpbuf = NULL;
}
isc_event_free(&event); isc_event_free(&event);
@@ -599,7 +608,6 @@ ns_client_send(ns_client_t *client) {
if ((client->attributes & NS_CLIENTATTR_RA) != 0) if ((client->attributes & NS_CLIENTATTR_RA) != 0)
client->message->flags |= DNS_MESSAGEFLAG_RA; client->message->flags |= DNS_MESSAGEFLAG_RA;
data = client->sendbuf;
/* /*
* XXXRTH The following doesn't deal with TSIGs, TCP buffer resizing, * XXXRTH The following doesn't deal with TSIGs, TCP buffer resizing,
* or ENDS1 more data packets. * or ENDS1 more data packets.
@@ -608,9 +616,14 @@ ns_client_send(ns_client_t *client) {
/* /*
* XXXRTH "tcpbuffer" is a hack to get things working. * XXXRTH "tcpbuffer" is a hack to get things working.
*/ */
isc_buffer_init(&tcpbuffer, data, SEND_BUFFER_SIZE); client->tcpbuf = isc_mem_get(client->mctx, TCP_BUFFER_SIZE);
isc_buffer_init(&buffer, data + 2, SEND_BUFFER_SIZE - 2); if (client->tcpbuf == NULL)
goto done;
data = client->tcpbuf;
isc_buffer_init(&tcpbuffer, data, TCP_BUFFER_SIZE);
isc_buffer_init(&buffer, data + 2, TCP_BUFFER_SIZE - 2);
} else { } else {
data = client->sendbuf;
if (client->udpsize < SEND_BUFFER_SIZE) if (client->udpsize < SEND_BUFFER_SIZE)
bufsize = client->udpsize; bufsize = client->udpsize;
else else
@@ -623,7 +636,7 @@ ns_client_send(ns_client_t *client) {
goto done; goto done;
if (client->opt != NULL) { if (client->opt != NULL) {
result = dns_message_setopt(client->message, client->opt); result = dns_message_setopt(client->message, client->opt);
if (result != ISC_R_SUCCESS) if (result != ISC_R_SUCCESS)
goto done; goto done;
/* /*
* XXXRTH dns_message_setopt() should probably do this... * XXXRTH dns_message_setopt() should probably do this...
@@ -683,7 +696,12 @@ ns_client_send(ns_client_t *client) {
client->nsends++; client->nsends++;
return; return;
} }
done: done:
if (client->tcpbuf != NULL) {
isc_mem_put(client->mctx, client->tcpbuf, TCP_BUFFER_SIZE);
client->tcpbuf = NULL;
}
ns_client_next(client, result); ns_client_next(client, result);
} }
@@ -755,7 +773,7 @@ client_addopt(ns_client_t *client) {
/* /*
* Set Maximum UDP buffer size. * Set Maximum UDP buffer size.
*/ */
rdatalist->rdclass = SEND_BUFFER_SIZE; rdatalist->rdclass = RECV_BUFFER_SIZE;
/* /*
* Set EXTENDED-RCODE, VERSION, and Z to 0. * Set EXTENDED-RCODE, VERSION, and Z to 0.
@@ -1155,6 +1173,7 @@ client_create(ns_clientmgr_t *manager, ns_client_t **clientp)
client->tcplistener = NULL; client->tcplistener = NULL;
client->tcpsocket = NULL; client->tcpsocket = NULL;
client->tcpmsg_valid = ISC_FALSE; client->tcpmsg_valid = ISC_FALSE;
client->tcpbuf = NULL;
client->opt = NULL; client->opt = NULL;
client->udpsize = 512; client->udpsize = 512;
client->next = NULL; client->next = NULL;

View File

@@ -97,6 +97,7 @@ struct ns_client {
dns_dispatchevent_t * dispevent; dns_dispatchevent_t * dispevent;
isc_socket_t * tcplistener; isc_socket_t * tcplistener;
isc_socket_t * tcpsocket; isc_socket_t * tcpsocket;
unsigned char * tcpbuf;
dns_tcpmsg_t tcpmsg; dns_tcpmsg_t tcpmsg;
isc_boolean_t tcpmsg_valid; isc_boolean_t tcpmsg_valid;
isc_timer_t * timer; isc_timer_t * timer;