2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-09-04 08:35:31 +00:00

Make sharing of pending TCP dispatches nonoptional

The DNS_REQUESTOPT_SHARE flag was added when client-side pipelining of
TCP queries was implemented. there was no need to make it optional;
forcing it to be in effect for all requests simplfiies the code.
This commit is contained in:
Evan Hunt
2020-12-11 15:20:33 -08:00
committed by Ondřej Surý
parent ca11f68d61
commit 5863acc907
4 changed files with 13 additions and 32 deletions

View File

@@ -173,10 +173,10 @@ sendquery(isc_task_t *task) {
dns_message_addname(message, qname, DNS_SECTION_QUESTION); dns_message_addname(message, qname, DNS_SECTION_QUESTION);
request = NULL; request = NULL;
result = dns_request_createvia( result = dns_request_createvia(requestmgr, message,
requestmgr, message, have_src ? &srcaddr : NULL, &dstaddr, -1, have_src ? &srcaddr : NULL, &dstaddr, -1,
DNS_REQUESTOPT_TCP | DNS_REQUESTOPT_SHARE, NULL, TIMEOUT, 0, 0, DNS_REQUESTOPT_TCP, NULL, TIMEOUT, 0, 0,
task, recvresponse, message, &request); task, recvresponse, message, &request);
CHECK("dns_request_create", result); CHECK("dns_request_create", result);
return (ISC_R_SUCCESS); return (ISC_R_SUCCESS);

View File

@@ -752,7 +752,7 @@ sendquery(struct query *query, isc_task_t *task) {
options = 0; options = 0;
if (tcp_mode) { if (tcp_mode) {
options |= DNS_REQUESTOPT_TCP | DNS_REQUESTOPT_SHARE; options |= DNS_REQUESTOPT_TCP;
} }
request = NULL; request = NULL;
result = dns_request_createvia( result = dns_request_createvia(

View File

@@ -43,7 +43,6 @@
#define DNS_REQUESTOPT_TCP 0x00000001U #define DNS_REQUESTOPT_TCP 0x00000001U
#define DNS_REQUESTOPT_CASE 0x00000002U #define DNS_REQUESTOPT_CASE 0x00000002U
#define DNS_REQUESTOPT_FIXEDID 0x00000004U #define DNS_REQUESTOPT_FIXEDID 0x00000004U
#define DNS_REQUESTOPT_SHARE 0x00000008U
typedef struct dns_requestevent { typedef struct dns_requestevent {
ISC_EVENT_COMMON(struct dns_requestevent); ISC_EVENT_COMMON(struct dns_requestevent);

View File

@@ -512,7 +512,7 @@ isblackholed(dns_dispatchmgr_t *dispatchmgr, const isc_sockaddr_t *destaddr) {
} }
static isc_result_t static isc_result_t
create_tcp_dispatch(bool newtcp, bool share, dns_requestmgr_t *requestmgr, create_tcp_dispatch(bool newtcp, dns_requestmgr_t *requestmgr,
const isc_sockaddr_t *srcaddr, const isc_sockaddr_t *srcaddr,
const isc_sockaddr_t *destaddr, isc_dscp_t dscp, const isc_sockaddr_t *destaddr, isc_dscp_t dscp,
bool *connected, dns_dispatch_t **dispatchp) { bool *connected, dns_dispatch_t **dispatchp) {
@@ -522,7 +522,7 @@ create_tcp_dispatch(bool newtcp, bool share, dns_requestmgr_t *requestmgr,
unsigned int attrs; unsigned int attrs;
isc_sockaddr_t bind_any; isc_sockaddr_t bind_any;
if (!newtcp && share) { if (!newtcp) {
result = dns_dispatch_gettcp(requestmgr->dispatchmgr, destaddr, result = dns_dispatch_gettcp(requestmgr->dispatchmgr, destaddr,
srcaddr, connected, dispatchp); srcaddr, connected, dispatchp);
if (result == ISC_R_SUCCESS) { if (result == ISC_R_SUCCESS) {
@@ -535,20 +535,6 @@ create_tcp_dispatch(bool newtcp, bool share, dns_requestmgr_t *requestmgr,
*connected ? "existing" : "pending", peer); *connected ? "existing" : "pending", peer);
return (result); return (result);
} }
} else if (!newtcp) {
result = dns_dispatch_gettcp(requestmgr->dispatchmgr, destaddr,
srcaddr, NULL, dispatchp);
if (result == ISC_R_SUCCESS) {
char peer[ISC_SOCKADDR_FORMATSIZE];
*connected = true;
isc_sockaddr_format(destaddr, peer, sizeof(peer));
req_log(ISC_LOG_DEBUG(1),
"attached to existing TCP "
"connection to %s",
peer);
return (result);
}
} }
result = isc_socket_create(requestmgr->socketmgr, result = isc_socket_create(requestmgr->socketmgr,
@@ -635,13 +621,13 @@ find_udp_dispatch(dns_requestmgr_t *requestmgr, const isc_sockaddr_t *srcaddr,
} }
static isc_result_t static isc_result_t
get_dispatch(bool tcp, bool newtcp, bool share, dns_requestmgr_t *requestmgr, get_dispatch(bool tcp, bool newtcp, dns_requestmgr_t *requestmgr,
const isc_sockaddr_t *srcaddr, const isc_sockaddr_t *destaddr, const isc_sockaddr_t *srcaddr, const isc_sockaddr_t *destaddr,
isc_dscp_t dscp, bool *connected, dns_dispatch_t **dispatchp) { isc_dscp_t dscp, bool *connected, dns_dispatch_t **dispatchp) {
isc_result_t result; isc_result_t result;
if (tcp) { if (tcp) {
result = create_tcp_dispatch(newtcp, share, requestmgr, srcaddr, result = create_tcp_dispatch(newtcp, requestmgr, srcaddr,
destaddr, dscp, connected, destaddr, dscp, connected,
dispatchp); dispatchp);
} else { } else {
@@ -686,7 +672,6 @@ dns_request_createraw(dns_requestmgr_t *requestmgr, isc_buffer_t *msgbuf,
dns_messageid_t id; dns_messageid_t id;
bool tcp = false; bool tcp = false;
bool newtcp = false; bool newtcp = false;
bool share = false;
isc_region_t r; isc_region_t r;
bool connected = false; bool connected = false;
unsigned int dispopt = 0; unsigned int dispopt = 0;
@@ -752,11 +737,10 @@ dns_request_createraw(dns_requestmgr_t *requestmgr, isc_buffer_t *msgbuf,
if ((options & DNS_REQUESTOPT_TCP) != 0 || r.length > 512) { if ((options & DNS_REQUESTOPT_TCP) != 0 || r.length > 512) {
tcp = true; tcp = true;
} }
share = (options & DNS_REQUESTOPT_SHARE);
again: again:
result = get_dispatch(tcp, newtcp, share, requestmgr, srcaddr, destaddr, result = get_dispatch(tcp, newtcp, requestmgr, srcaddr, destaddr, dscp,
dscp, &connected, &request->dispatch); &connected, &request->dispatch);
if (result != ISC_R_SUCCESS) { if (result != ISC_R_SUCCESS) {
goto cleanup; goto cleanup;
} }
@@ -876,7 +860,6 @@ dns_request_createvia(dns_requestmgr_t *requestmgr, dns_message_t *message,
isc_mem_t *mctx; isc_mem_t *mctx;
dns_messageid_t id; dns_messageid_t id;
bool tcp; bool tcp;
bool share;
bool settsigkey = true; bool settsigkey = true;
bool connected = false; bool connected = false;
@@ -939,9 +922,8 @@ dns_request_createvia(dns_requestmgr_t *requestmgr, dns_message_t *message,
use_tcp: use_tcp:
tcp = ((options & DNS_REQUESTOPT_TCP) != 0); tcp = ((options & DNS_REQUESTOPT_TCP) != 0);
share = ((options & DNS_REQUESTOPT_SHARE) != 0); result = get_dispatch(tcp, false, requestmgr, srcaddr, destaddr, dscp,
result = get_dispatch(tcp, false, share, requestmgr, srcaddr, destaddr, &connected, &request->dispatch);
dscp, &connected, &request->dispatch);
if (result != ISC_R_SUCCESS) { if (result != ISC_R_SUCCESS) {
goto cleanup; goto cleanup;
} }