Home | History | Annotate | Download | only in dns

Lines Matching refs:request

1 /*	$NetBSD: request.c,v 1.1 2024/02/18 20:57:33 christos Exp $	*/
35 #include <dns/request.h>
43 #define VALID_REQUEST(request) ISC_MAGIC_VALID(request, REQUEST_MAGIC)
98 #define DNS_REQUEST_F_TCP 0x0010 /*%< This request used TCP */
127 req_getsocket(dns_request_t *request);
131 req_sendevent(dns_request_t *request, isc_result_t result);
133 req_cancel(dns_request_t *request);
135 req_destroy(dns_request_t *request);
251 dns_request_t *request;
258 for (request = ISC_LIST_HEAD(requestmgr->requests);
259 request != NULL; request = ISC_LIST_NEXT(request, link))
261 dns_request_cancel(request);
419 req_send(dns_request_t *request, isc_task_t *task,
426 req_log(ISC_LOG_DEBUG(3), "req_send: request %p", request);
428 REQUIRE(VALID_REQUEST(request));
429 sock = req_getsocket(request);
430 isc_buffer_usedregion(request->query, &r);
436 sendevent = isc_socket_socketevent(request->mctx, sock,
438 request);
442 if (request->dscp == -1) {
447 sendevent->dscp = request->dscp;
450 request->flags |= DNS_REQUEST_F_SENDING;
459 dns_request_t *request;
461 request = isc_mem_get(mctx, sizeof(*request));
466 request->magic = 0;
467 request->mctx = NULL;
468 request->flags = 0;
469 ISC_LINK_INIT(request, link);
470 request->query = NULL;
471 request->answer = NULL;
472 request->event = NULL;
473 request->dispatch = NULL;
474 request->dispentry = NULL;
475 request->timer = NULL;
476 request->requestmgr = NULL;
477 request->tsig = NULL;
478 request->tsigkey = NULL;
479 request->dscp = -1;
480 ISC_EVENT_INIT(&request->ctlevent, sizeof(request->ctlevent), 0, NULL,
481 DNS_EVENT_REQUESTCONTROL, do_cancel, request, NULL, NULL,
483 request->canceling = false;
484 request->udpcount = 0;
486 isc_mem_attach(mctx, &request->mctx);
488 request->magic = REQUEST_MAGIC;
489 *requestp = request;
690 dns_request_t *request = NULL;
722 request = NULL;
723 result = new_request(mctx, &request);
734 request->udpcount = udpretries;
735 request->dscp = dscp;
741 NULL, NULL, task, req_timeout, request,
742 &request->timer);
747 request->event = (dns_requestevent_t *)isc_event_allocate(
751 request->event->ev_sender = task;
752 request->event->request = request;
753 request->event->result = ISC_R_FAILURE;
768 dscp, &connected, &request->dispatch);
779 request->dispatch, dispopt, destaddr, task, req_response,
780 request, &id, &request->dispentry, requestmgr->socketmgr);
785 dns_dispatch_detach(&request->dispatch);
791 sock = req_getsocket(request);
794 isc_buffer_allocate(mctx, &request->query, r.length + (tcp ? 2 : 0));
796 isc_buffer_putuint16(request->query, (uint16_t)r.length);
798 result = isc_buffer_copyregion(request->query, &r);
804 isc_buffer_usedregion(request->query, &r);
817 requestmgr_attach(requestmgr, &request->requestmgr);
818 request->hash = mgr_gethash(requestmgr);
819 ISC_LIST_APPEND(requestmgr->requests, request, link);
822 result = set_timer(request->timer, timeout, tcp ? 0 : udptimeout);
827 request->destaddr = *destaddr;
830 request);
834 request->flags |= DNS_REQUEST_F_CONNECTING | DNS_REQUEST_F_TCP;
836 result = req_send(request, task, connected ? NULL : destaddr);
842 req_log(ISC_LOG_DEBUG(3), "dns_request_createraw: request %p", request);
843 *requestp = request;
848 ISC_LIST_UNLINK(requestmgr->requests, request, link);
855 req_destroy(request);
881 dns_request_t *request = NULL;
914 request = NULL;
915 result = new_request(mctx, &request);
926 request->udpcount = udpretries;
927 request->dscp = dscp;
933 NULL, NULL, task, req_timeout, request,
934 &request->timer);
939 request->event = (dns_requestevent_t *)isc_event_allocate(
943 request->event->ev_sender = task;
944 request->event->request = request;
945 request->event->result = ISC_R_FAILURE;
947 dns_tsigkey_attach(key, &request->tsigkey);
954 dscp, &connected, &request->dispatch);
960 request->dispatch, 0, destaddr, task, req_response, request,
961 &id, &request->dispentry, requestmgr->socketmgr);
965 sock = req_getsocket(request);
970 result = dns_message_settsigkey(message, request->tsigkey);
975 result = req_render(message, &request->query, options, mctx);
981 dns_dispatch_removeresponse(&request->dispentry, NULL);
982 dns_dispatch_detach(&request->dispatch);
992 result = dns_message_getquerytsig(message, mctx, &request->tsig);
1003 requestmgr_attach(requestmgr, &request->requestmgr);
1004 request->hash = mgr_gethash(requestmgr);
1005 ISC_LIST_APPEND(requestmgr->requests, request, link);
1008 result = set_timer(request->timer, timeout, tcp ? 0 : udptimeout);
1013 request->destaddr = *destaddr;
1016 request);
1020 request->flags |= DNS_REQUEST_F_CONNECTING | DNS_REQUEST_F_TCP;
1022 result = req_send(request, task, connected ? NULL : destaddr);
1028 req_log(ISC_LOG_DEBUG(3), "dns_request_createvia: request %p", request);
1029 *requestp = request;
1034 ISC_LIST_UNLINK(requestmgr->requests, request, link);
1041 req_destroy(request);
1149 * If this request is no longer waiting for events,
1151 * cause the request to be destroyed.
1154 * 'request' is locked by the caller.
1157 send_if_done(dns_request_t *request, isc_result_t result) {
1158 if (request->event != NULL && !request->canceling) {
1159 req_sendevent(request, result);
1168 dns_request_t *request = event->ev_arg;
1171 LOCK(&request->requestmgr->locks[request->hash]);
1172 request->canceling = false;
1173 if (!DNS_REQUEST_CANCELED(request)) {
1174 req_cancel(request);
1176 send_if_done(request, ISC_R_CANCELED);
1177 UNLOCK(&request->requestmgr->locks[request->hash]);
1181 dns_request_cancel(dns_request_t *request) {
1182 REQUIRE(VALID_REQUEST(request));
1184 req_log(ISC_LOG_DEBUG(3), "dns_request_cancel: request %p", request);
1186 REQUIRE(VALID_REQUEST(request));
1188 LOCK(&request->requestmgr->locks[request->hash]);
1189 if (!request->canceling && !DNS_REQUEST_CANCELED(request)) {
1190 isc_event_t *ev = &request->ctlevent;
1191 isc_task_send(request->event->ev_sender, &ev);
1192 request->canceling = true;
1194 UNLOCK(&request->requestmgr->locks[request->hash]);
1198 dns_request_getresponse(dns_request_t *request, dns_message_t *message,
1202 REQUIRE(VALID_REQUEST(request));
1203 REQUIRE(request->answer != NULL);
1205 req_log(ISC_LOG_DEBUG(3), "dns_request_getresponse: request %p",
1206 request);
1208 result = dns_message_setquerytsig(message, request->tsig);
1212 result = dns_message_settsigkey(message, request->tsigkey);
1216 result = dns_message_parse(message, request->answer, options);
1220 if (request->tsigkey != NULL) {
1221 result = dns_tsig_verify(request->answer, message, NULL, NULL);
1227 dns_request_getanswer(dns_request_t *request) {
1228 REQUIRE(VALID_REQUEST(request));
1230 return (request->answer);
1234 dns_request_usedtcp(dns_request_t *request) {
1235 REQUIRE(VALID_REQUEST(request));
1237 return ((request->flags & DNS_REQUEST_F_TCP) != 0);
1242 dns_request_t *request;
1246 request = *requestp;
1249 req_log(ISC_LOG_DEBUG(3), "dns_request_destroy: request %p", request);
1251 LOCK(&request->requestmgr->lock);
1252 LOCK(&request->requestmgr->locks[request->hash]);
1253 ISC_LIST_UNLINK(request->requestmgr->requests, request, link);
1254 INSIST(!DNS_REQUEST_CONNECTING(request));
1255 INSIST(!DNS_REQUEST_SENDING(request));
1256 UNLOCK(&request->requestmgr->locks[request->hash]);
1257 UNLOCK(&request->requestmgr->lock);
1263 INSIST(!ISC_LINK_LINKED(request, link));
1264 INSIST(request->dispentry == NULL);
1265 INSIST(request->dispatch == NULL);
1266 INSIST(request->timer == NULL);
1268 req_destroy(request);
1272 *** Private: request.
1276 req_getsocket(dns_request_t *request) {
1280 dispattr = dns_dispatch_getattributes(request->dispatch);
1282 INSIST(request->dispentry != NULL);
1283 sock = dns_dispatch_getentrysocket(request->dispentry);
1285 sock = dns_dispatch_getsocket(request->dispatch);
1295 dns_request_t *request = event->ev_arg;
1298 REQUIRE(VALID_REQUEST(request));
1299 REQUIRE(DNS_REQUEST_CONNECTING(request));
1301 req_log(ISC_LOG_DEBUG(3), "req_connected: request %p", request);
1306 LOCK(&request->requestmgr->locks[request->hash]);
1307 request->flags &= ~DNS_REQUEST_F_CONNECTING;
1309 if (DNS_REQUEST_CANCELED(request)) {
1313 if (DNS_REQUEST_TIMEDOUT(request)) {
1314 send_if_done(request, ISC_R_TIMEDOUT);
1316 send_if_done(request, ISC_R_CANCELED);
1319 dns_dispatch_starttcp(request->dispatch);
1321 result = req_send(request, task, NULL);
1325 req_cancel(request);
1326 send_if_done(request, ISC_R_CANCELED);
1329 UNLOCK(&request->requestmgr->locks[request->hash]);
1335 dns_request_t *request = event->ev_arg;
1339 REQUIRE(VALID_REQUEST(request));
1340 REQUIRE(DNS_REQUEST_SENDING(request));
1342 req_log(ISC_LOG_DEBUG(3), "req_senddone: request %p", request);
1348 LOCK(&request->requestmgr->locks[request->hash]);
1349 request->flags &= ~DNS_REQUEST_F_SENDING;
1351 if (DNS_REQUEST_CANCELED(request)) {
1355 if (DNS_REQUEST_TIMEDOUT(request)) {
1356 send_if_done(request, ISC_R_TIMEDOUT);
1358 send_if_done(request, ISC_R_CANCELED);
1361 req_cancel(request);
1362 send_if_done(request, ISC_R_CANCELED);
1364 UNLOCK(&request->requestmgr->locks[request->hash]);
1370 dns_request_t *request = event->ev_arg;
1374 REQUIRE(VALID_REQUEST(request));
1379 req_log(ISC_LOG_DEBUG(3), "req_response: request %p: %s", request,
1382 LOCK(&request->requestmgr->locks[request->hash]);
1389 * Copy buffer to request.
1392 isc_buffer_allocate(request->mctx, &request->answer, r.length);
1393 result = isc_buffer_copyregion(request->answer, &r);
1395 isc_buffer_free(&request->answer);
1401 dns_dispatch_removeresponse(&request->dispentry, &devent);
1402 req_cancel(request);
1406 send_if_done(request, result);
1407 UNLOCK(&request->requestmgr->locks[request->hash]);
1412 dns_request_t *request = event->ev_arg;
1416 REQUIRE(VALID_REQUEST(request));
1418 req_log(ISC_LOG_DEBUG(3), "req_timeout: request %p", request);
1424 LOCK(&request->requestmgr->locks[request->hash]);
1425 if (ev_type == ISC_TIMEREVENT_TICK && request->udpcount-- != 0) {
1426 if (!DNS_REQUEST_SENDING(request)) {
1427 result = req_send(request, task, &request->destaddr);
1429 req_cancel(request);
1430 send_if_done(request, result);
1434 request->flags |= DNS_REQUEST_F_TIMEDOUT;
1435 req_cancel(request);
1436 send_if_done(request, ISC_R_TIMEDOUT);
1438 UNLOCK(&request->requestmgr->locks[request->hash]);
1442 req_sendevent(dns_request_t *request, isc_result_t result) {
1445 REQUIRE(VALID_REQUEST(request));
1447 req_log(ISC_LOG_DEBUG(3), "req_sendevent: request %p", request);
1452 task = request->event->ev_sender;
1453 request->event->ev_sender = request;
1454 request->event->result = result;
1455 isc_task_sendanddetach(&task, (isc_event_t **)(void *)&request->event);
1459 req_destroy(dns_request_t *request) {
1460 REQUIRE(VALID_REQUEST(request));
1462 req_log(ISC_LOG_DEBUG(3), "req_destroy: request %p", request);
1464 request->magic = 0;
1465 if (request->query != NULL) {
1466 isc_buffer_free(&request->query);
1468 if (request->answer != NULL) {
1469 isc_buffer_free(&request->answer);
1471 if (request->event != NULL) {
1472 isc_event_free((isc_event_t **)(void *)&request->event);
1474 if (request->dispentry != NULL) {
1475 dns_dispatch_removeresponse(&request->dispentry, NULL);
1477 if (request->dispatch != NULL) {
1478 dns_dispatch_detach(&request->dispatch);
1480 if (request->timer != NULL) {
1481 isc_timer_destroy(&request->timer);
1483 if (request->tsig != NULL) {
1484 isc_buffer_free(&request->tsig);
1486 if (request->tsigkey != NULL) {
1487 dns_tsigkey_detach(&request->tsigkey);
1489 if (request->requestmgr != NULL) {
1490 requestmgr_detach(&request->requestmgr);
1492 isc_mem_putanddetach(&request->mctx, request, sizeof(*request));
1496 * Stop the current request. Must be called from the request's task.
1499 req_cancel(dns_request_t *request) {
1503 REQUIRE(VALID_REQUEST(request));
1505 req_log(ISC_LOG_DEBUG(3), "req_cancel: request %p", request);
1510 request->flags |= DNS_REQUEST_F_CANCELED;
1512 if (request->timer != NULL) {
1513 isc_timer_destroy(&request->timer);
1515 dispattr = dns_dispatch_getattributes(request->dispatch);
1517 if (DNS_REQUEST_CONNECTING(request) || DNS_REQUEST_SENDING(request)) {
1519 if (request->dispentry != NULL) {
1521 request->dispentry);
1524 sock = dns_dispatch_getsocket(request->dispatch);
1526 if (DNS_REQUEST_CONNECTING(request) && sock != NULL) {
1529 if (DNS_REQUEST_SENDING(request) && sock != NULL) {
1533 if (request->dispentry != NULL) {
1534 dns_dispatch_removeresponse(&request->dispentry, NULL);
1536 dns_dispatch_detach(&request->dispatch);