Home | History | Annotate | Download | only in dns

Lines Matching refs:request

1 /*	$NetBSD: request.c,v 1.13 2026/01/29 18:37:49 christos Exp $	*/
38 #include <dns/request.h>
46 #define VALID_REQUEST(request) ISC_MAGIC_VALID(request, REQUEST_MAGIC)
111 req_cleanup(dns_request_t *request);
113 req_sendevent(dns_request_t *request, isc_result_t result);
117 req_destroy(dns_request_t *request);
176 dns_request_t *request = NULL, *next = NULL;
179 ISC_LIST_FOREACH_SAFE(requestmgr->requests[tid], request, link, next) {
180 req_log(ISC_LOG_DEBUG(3), "%s(%" PRIu32 ": request %p",
181 __func__, tid, request);
182 if (DNS_REQUEST_COMPLETE(request)) {
186 req_sendevent(request, ISC_R_CANCELED);
265 req_send(dns_request_t *request) {
268 req_log(ISC_LOG_DEBUG(3), "%s: request %p", __func__, request);
270 REQUIRE(VALID_REQUEST(request));
272 isc_buffer_usedregion(request->query, &r);
274 request->flags |= DNS_REQUEST_F_SENDING;
277 dns_request_ref(request);
278 dns_dispatch_send(request->dispentry, &r);
285 dns_request_t *request = isc_mem_get(mctx, sizeof(*request));
286 *request = (dns_request_t){
297 isc_refcount_init(&request->references, 1);
298 isc_mem_attach(mctx, &request->mctx);
301 request->timeout = timeout * 1000;
304 udptimeout = timeout / request->udpcount;
309 request->timeout = udptimeout * 1000;
312 return request;
417 dns_request_t *request = NULL;
465 request = new_request(mctx, loop, cb, arg, tcp, timeout, udptimeout,
468 isc_buffer_allocate(mctx, &request->query, r.length + (tcp ? 2 : 0));
469 result = isc_buffer_copyregion(request->query, &r);
476 transport, &request->dispatch);
487 request->dispatch, loop, dispopt, request->timeout, destaddr,
489 req_response, request, &id, &request->dispentry);
492 dns_dispatch_detach(&request->dispatch);
501 isc_buffer_usedregion(request->query, &r);
505 request->destaddr = *destaddr;
506 request->flags |= DNS_REQUEST_F_CONNECTING;
508 request->flags |= DNS_REQUEST_F_TCP;
511 dns_requestmgr_attach(requestmgr, &request->requestmgr);
512 ISC_LIST_APPEND(requestmgr->requests[request->tid], request, link);
514 dns_request_ref(request); /* detached in req_connected() */
515 result = dns_dispatch_connect(request->dispentry);
517 dns_request_unref(request);
521 req_log(ISC_LOG_DEBUG(3), "%s: request %p", __func__, request);
522 *requestp = request;
526 req_cleanup(request);
527 dns_request_detach(&request);
546 dns_request_t *request = NULL;
587 request = new_request(mctx, loop, cb, arg, tcp, timeout, udptimeout,
591 dns_tsigkey_attach(key, &request->tsigkey);
594 result = dns_message_settsigkey(message, request->tsigkey);
601 transport, &request->dispatch);
606 result = dns_dispatch_add(request->dispatch, loop, 0, request->timeout,
609 request, &id, &request->dispentry);
615 result = req_render(message, &request->query, options, mctx);
619 dns_dispatch_done(&request->dispentry);
620 dns_dispatch_detach(&request->dispatch);
628 result = dns_message_getquerytsig(message, mctx, &request->tsig);
633 request->destaddr = *destaddr;
634 request->flags |= DNS_REQUEST_F_CONNECTING;
636 request->flags |= DNS_REQUEST_F_TCP;
639 dns_requestmgr_attach(requestmgr, &request->requestmgr);
640 ISC_LIST_APPEND(requestmgr->requests[request->tid], request, link);
642 dns_request_ref(request); /* detached in req_connected() */
643 result = dns_dispatch_connect(request->dispentry);
645 dns_request_unref(request);
649 req_log(ISC_LOG_DEBUG(3), "%s: request %p", __func__, request);
650 *requestp = request;
654 req_cleanup(request);
655 dns_request_detach(&request);
756 request_cancel(dns_request_t *request) {
757 REQUIRE(VALID_REQUEST(request));
758 REQUIRE(request->tid == isc_tid());
760 if (DNS_REQUEST_COMPLETE(request)) {
761 /* The request callback was already called */
765 req_log(ISC_LOG_DEBUG(3), "%s: request %p", __func__, request);
766 req_sendevent(request, ISC_R_CANCELED); /* call asynchronously */
771 dns_request_t *request = arg;
773 request_cancel(request);
774 dns_request_unref(request);
778 dns_request_cancel(dns_request_t *request) {
779 REQUIRE(VALID_REQUEST(request));
781 if (request->tid == isc_tid()) {
782 request_cancel(request);
784 dns_request_ref(request);
785 isc_async_run(request->loop, req_cancel_cb, request);
790 dns_request_getresponse(dns_request_t *request, dns_message_t *message,
794 REQUIRE(VALID_REQUEST(request));
795 REQUIRE(request->tid == isc_tid());
796 REQUIRE(request->answer != NULL);
798 req_log(ISC_LOG_DEBUG(3), "%s: request %p", __func__, request);
800 dns_message_setquerytsig(message, request->tsig);
801 result = dns_message_settsigkey(message, request->tsigkey);
805 result = dns_message_parse(message, request->answer, options);
809 if (request->tsigkey != NULL) {
810 result = dns_tsig_verify(request->answer, message, NULL, NULL);
816 dns_request_getanswer(dns_request_t *request) {
817 REQUIRE(VALID_REQUEST(request));
818 REQUIRE(request->tid == isc_tid());
820 return request->answer;
824 dns_request_usedtcp(dns_request_t *request) {
825 REQUIRE(VALID_REQUEST(request));
826 REQUIRE(request->tid == isc_tid());
828 return (request->flags & DNS_REQUEST_F_TCP) != 0;
835 dns_request_t *request = *requestp;
838 req_log(ISC_LOG_DEBUG(3), "%s: request %p", __func__, request);
840 if (DNS_REQUEST_COMPLETE(request)) {
841 dns_request_cancel(request);
844 /* final detach to shut down request */
845 dns_request_detach(&request);
851 dns_request_t *request = (dns_request_t *)arg;
853 REQUIRE(VALID_REQUEST(request));
854 REQUIRE(request->tid == isc_tid());
855 REQUIRE(DNS_REQUEST_CONNECTING(request));
857 req_log(ISC_LOG_DEBUG(3), "%s: request %p: %s", __func__, request,
860 request->flags &= ~DNS_REQUEST_F_CONNECTING;
862 if (DNS_REQUEST_COMPLETE(request)) {
863 /* The request callback was already called */
868 req_send(request);
870 req_sendevent(request, eresult);
875 dns_request_unref(request);
881 dns_request_t *request = (dns_request_t *)arg;
883 REQUIRE(VALID_REQUEST(request));
884 REQUIRE(request->tid == isc_tid());
885 REQUIRE(DNS_REQUEST_SENDING(request));
887 req_log(ISC_LOG_DEBUG(3), "%s: request %p", __func__, request);
889 request->flags &= ~DNS_REQUEST_F_SENDING;
891 if (DNS_REQUEST_COMPLETE(request)) {
892 /* The request callback was already called */
897 req_sendevent(request, eresult);
902 dns_request_unref(request);
907 dns_request_t *request = (dns_request_t *)arg;
913 REQUIRE(VALID_REQUEST(request));
914 REQUIRE(request->tid == isc_tid());
916 req_log(ISC_LOG_DEBUG(3), "%s: request %p: %s", __func__, request,
919 if (DNS_REQUEST_COMPLETE(request)) {
920 /* The request callback was already called */
926 if (request->udpcount > 1 && !dns_request_usedtcp(request)) {
927 request->udpcount -= 1;
928 dns_dispatch_resume(request->dispentry,
929 request->timeout);
930 if (!DNS_REQUEST_SENDING(request)) {
931 req_send(request);
937 /* Copy region to request. */
938 isc_buffer_allocate(request->mctx, &request->answer,
940 eresult = isc_buffer_copyregion(request->answer, region);
942 isc_buffer_free(&request->answer);
949 req_sendevent(request, eresult);
954 dns_request_t *request = arg;
956 request->cb(request);
957 dns_request_unref(request);
961 req_cleanup(dns_request_t *request) {
962 if (ISC_LINK_LINKED(request, link)) {
963 ISC_LIST_UNLINK(request->requestmgr->requests[request->tid],
964 request, link);
966 if (request->dispentry != NULL) {
967 dns_dispatch_done(&request->dispentry);
969 if (request->dispatch != NULL) {
970 dns_dispatch_detach(&request->dispatch);
975 req_sendevent(dns_request_t *request, isc_result_t result) {
976 REQUIRE(VALID_REQUEST(request));
977 REQUIRE(request->tid == isc_tid());
978 REQUIRE(!DNS_REQUEST_COMPLETE(request));
980 request->flags |= DNS_REQUEST_F_COMPLETE;
982 req_cleanup(request);
984 req_log(ISC_LOG_DEBUG(3), "%s: request %p: %s", __func__, request,
987 request->result = result;
990 * Do not call request->cb directly as it introduces a dead lock
994 dns_request_ref(request);
995 isc_async_run(request->loop, req_sendevent_cb, request);
999 req_destroy(dns_request_t *request) {
1000 REQUIRE(VALID_REQUEST(request));
1001 REQUIRE(request->tid == isc_tid());
1002 REQUIRE(!ISC_LINK_LINKED(request, link));
1004 req_log(ISC_LOG_DEBUG(3), "%s: request %p", __func__, request);
1010 INSIST(!ISC_LINK_LINKED(request, link));
1011 INSIST(request->dispentry == NULL);
1012 INSIST(request->dispatch == NULL);
1014 request->magic = 0;
1015 if (request->query != NULL) {
1016 isc_buffer_free(&request->query);
1018 if (request->answer != NULL) {
1019 isc_buffer_free(&request->answer);
1021 if (request->tsig != NULL) {
1022 isc_buffer_free(&request->tsig);
1024 if (request->tsigkey != NULL) {
1025 dns_tsigkey_detach(&request->tsigkey);
1027 if (request->requestmgr != NULL) {
1028 dns_requestmgr_detach(&request->requestmgr);
1030 isc_mem_putanddetach(&request->mctx, request, sizeof(*request));
1034 dns_request_getarg(dns_request_t *request) {
1035 REQUIRE(VALID_REQUEST(request));
1036 REQUIRE(request->tid == isc_tid());
1038 return request->arg;
1042 dns_request_getresult(dns_request_t *request) {
1043 REQUIRE(VALID_REQUEST(request));
1044 REQUIRE(request->tid == isc_tid());
1046 return request->result;