Lines Matching refs:request
38 #include <dns/request.h>
46 #define VALID_REQUEST(request) ISC_MAGIC_VALID(request, REQUEST_MAGIC)
99 #define DNS_REQUEST_F_TCP 0x0010 /*%< This request used TCP */
124 static isc_socket_t * req_getsocket(dns_request_t *request);
126 static void req_sendevent(dns_request_t *request, isc_result_t result);
127 static void req_cancel(dns_request_t *request);
128 static void req_destroy(dns_request_t *request);
260 dns_request_t *request;
267 for (request = ISC_LIST_HEAD(requestmgr->requests);
268 request != NULL;
269 request = ISC_LIST_NEXT(request, link)) {
270 dns_request_cancel(request);
427 req_send(dns_request_t *request, isc_task_t *task, isc_sockaddr_t *address) {
432 req_log(ISC_LOG_DEBUG(3), "req_send: request %p", request);
434 REQUIRE(VALID_REQUEST(request));
435 socket = req_getsocket(request);
436 isc_buffer_usedregion(request->query, &r);
443 request, address, NULL);
445 request->flags |= DNS_REQUEST_F_SENDING;
451 dns_request_t *request;
453 request = isc_mem_get(mctx, sizeof(*request));
454 if (request == NULL)
460 request->magic = 0;
461 request->mctx = NULL;
462 request->flags = 0;
463 ISC_LINK_INIT(request, link);
464 request->query = NULL;
465 request->answer = NULL;
466 request->event = NULL;
467 request->dispatch = NULL;
468 request->dispentry = NULL;
469 request->timer = NULL;
470 request->requestmgr = NULL;
471 request->tsig = NULL;
472 request->tsigkey = NULL;
473 ISC_EVENT_INIT(&request->ctlevent, sizeof(request->ctlevent), 0, NULL,
474 DNS_EVENT_REQUESTCONTROL, do_cancel, request, NULL,
476 request->canceling = ISC_FALSE;
477 request->udpcount = 0;
479 isc_mem_attach(mctx, &request->mctx);
481 request->magic = REQUEST_MAGIC;
482 *requestp = request;
680 dns_request_t *request = NULL;
706 request = NULL;
707 result = new_request(mctx, &request);
716 request->udpcount = udpretries;
722 NULL, NULL, task, req_timeout, request,
723 &request->timer);
727 request->event = (dns_requestevent_t *)
730 if (request->event == NULL) {
735 request->event->ev_sender = task;
736 request->event->request = request;
737 request->event->result = ISC_R_FAILURE;
749 &request->dispatch);
753 result = dns_dispatch_addresponse2(request->dispatch, destaddr, task,
754 req_response, request, &id,
755 &request->dispentry,
760 socket = req_getsocket(request);
763 result = isc_buffer_allocate(mctx, &request->query,
768 isc_buffer_putuint16(request->query, (isc_uint16_t)r.length);
769 result = isc_buffer_copyregion(request->query, &r);
774 isc_buffer_usedregion(request->query, &r);
786 requestmgr_attach(requestmgr, &request->requestmgr);
787 request->hash = mgr_gethash(requestmgr);
788 ISC_LIST_APPEND(requestmgr->requests, request, link);
791 result = set_timer(request->timer, timeout, tcp ? 0 : udptimeout);
795 request->destaddr = *destaddr;
798 req_connected, request);
801 request->flags |= DNS_REQUEST_F_CONNECTING|DNS_REQUEST_F_TCP;
803 result = req_send(request, task, destaddr);
808 req_log(ISC_LOG_DEBUG(3), "dns_request_createraw: request %p",
809 request);
810 *requestp = request;
815 ISC_LIST_UNLINK(requestmgr->requests, request, link);
821 req_destroy(request);
880 dns_request_t *request = NULL;
908 request = NULL;
909 result = new_request(mctx, &request);
918 request->udpcount = udpretries;
924 NULL, NULL, task, req_timeout, request,
925 &request->timer);
929 request->event = (dns_requestevent_t *)
932 if (request->event == NULL) {
937 request->event->ev_sender = task;
938 request->event->request = request;
939 request->event->result = ISC_R_FAILURE;
941 dns_tsigkey_attach(key, &request->tsigkey);
946 &request->dispatch);
950 result = dns_dispatch_addresponse2(request->dispatch, destaddr, task,
951 req_response, request, &id,
952 &request->dispentry,
956 socket = req_getsocket(request);
961 result = dns_message_settsigkey(message, request->tsigkey);
965 result = req_render(message, &request->query, options, mctx);
972 dns_dispatch_removeresponse(&request->dispentry, NULL);
973 dns_dispatch_detach(&request->dispatch);
982 result = dns_message_getquerytsig(message, mctx, &request->tsig);
992 requestmgr_attach(requestmgr, &request->requestmgr);
993 request->hash = mgr_gethash(requestmgr);
994 ISC_LIST_APPEND(requestmgr->requests, request, link);
997 result = set_timer(request->timer, timeout, tcp ? 0 : udptimeout);
1001 request->destaddr = *destaddr;
1004 req_connected, request);
1007 request->flags |= DNS_REQUEST_F_CONNECTING|DNS_REQUEST_F_TCP;
1009 result = req_send(request, task, destaddr);
1014 req_log(ISC_LOG_DEBUG(3), "dns_request_createvia: request %p",
1015 request);
1016 *requestp = request;
1021 ISC_LIST_UNLINK(requestmgr->requests, request, link);
1027 req_destroy(request);
1125 * If this request is no longer waiting for events,
1127 * cause the request to be destroyed.
1130 * 'request' is locked by the caller.
1133 send_if_done(dns_request_t *request, isc_result_t result) {
1134 if (request->event != NULL && !request->canceling)
1135 req_sendevent(request, result);
1143 dns_request_t *request = event->ev_arg;
1146 LOCK(&request->requestmgr->locks[request->hash]);
1147 request->canceling = ISC_FALSE;
1148 if (!DNS_REQUEST_CANCELED(request))
1149 req_cancel(request);
1150 send_if_done(request, ISC_R_CANCELED);
1151 UNLOCK(&request->requestmgr->locks[request->hash]);
1155 dns_request_cancel(dns_request_t *request) {
1156 REQUIRE(VALID_REQUEST(request));
1158 req_log(ISC_LOG_DEBUG(3), "dns_request_cancel: request %p", request);
1160 REQUIRE(VALID_REQUEST(request));
1162 LOCK(&request->requestmgr->locks[request->hash]);
1163 if (!request->canceling && !DNS_REQUEST_CANCELED(request)) {
1164 isc_event_t *ev = &request->ctlevent;
1165 isc_task_send(request->event->ev_sender, &ev);
1166 request->canceling = ISC_TRUE;
1168 UNLOCK(&request->requestmgr->locks[request->hash]);
1172 dns_request_getresponse(dns_request_t *request, dns_message_t *message,
1177 REQUIRE(VALID_REQUEST(request));
1178 REQUIRE(request->answer != NULL);
1180 req_log(ISC_LOG_DEBUG(3), "dns_request_getresponse: request %p",
1181 request);
1183 result = dns_message_setquerytsig(message, request->tsig);
1186 result = dns_message_settsigkey(message, request->tsigkey);
1189 result = dns_message_parse(message, request->answer, options);
1192 if (request->tsigkey != NULL)
1193 result = dns_tsig_verify(request->answer, message, NULL, NULL);
1198 dns_request_usedtcp(dns_request_t *request) {
1199 REQUIRE(VALID_REQUEST(request));
1201 return (ISC_TF((request->flags & DNS_REQUEST_F_TCP) != 0));
1206 dns_request_t *request;
1210 request = *requestp;
1212 req_log(ISC_LOG_DEBUG(3), "dns_request_destroy: request %p", request);
1214 LOCK(&request->requestmgr->lock);
1215 LOCK(&request->requestmgr->locks[request->hash]);
1216 ISC_LIST_UNLINK(request->requestmgr->requests, request, link);
1217 INSIST(!DNS_REQUEST_CONNECTING(request));
1218 INSIST(!DNS_REQUEST_SENDING(request));
1219 UNLOCK(&request->requestmgr->locks[request->hash]);
1220 UNLOCK(&request->requestmgr->lock);
1226 INSIST(!ISC_LINK_LINKED(request, link));
1227 INSIST(request->dispentry == NULL);
1228 INSIST(request->dispatch == NULL);
1229 INSIST(request->timer == NULL);
1231 req_destroy(request);
1237 *** Private: request.
1241 req_getsocket(dns_request_t *request) {
1245 dispattr = dns_dispatch_getattributes(request->dispatch);
1247 INSIST(request->dispentry != NULL);
1248 socket = dns_dispatch_getentrysocket(request->dispentry);
1250 socket = dns_dispatch_getsocket(request->dispatch);
1259 dns_request_t *request = event->ev_arg;
1262 REQUIRE(VALID_REQUEST(request));
1263 REQUIRE(DNS_REQUEST_CONNECTING(request));
1265 req_log(ISC_LOG_DEBUG(3), "req_connected: request %p", request);
1267 LOCK(&request->requestmgr->locks[request->hash]);
1268 request->flags &= ~DNS_REQUEST_F_CONNECTING;
1270 if (DNS_REQUEST_CANCELED(request)) {
1274 if (DNS_REQUEST_TIMEDOUT(request))
1275 send_if_done(request, ISC_R_TIMEDOUT);
1277 send_if_done(request, ISC_R_CANCELED);
1279 dns_dispatch_starttcp(request->dispatch);
1282 result = req_send(request, task, NULL);
1285 req_cancel(request);
1286 send_if_done(request, ISC_R_CANCELED);
1289 UNLOCK(&request->requestmgr->locks[request->hash]);
1296 dns_request_t *request = event->ev_arg;
1299 REQUIRE(VALID_REQUEST(request));
1300 REQUIRE(DNS_REQUEST_SENDING(request));
1302 req_log(ISC_LOG_DEBUG(3), "req_senddone: request %p", request);
1306 LOCK(&request->requestmgr->locks[request->hash]);
1307 request->flags &= ~DNS_REQUEST_F_SENDING;
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);
1318 req_cancel(request);
1319 send_if_done(request, ISC_R_CANCELED);
1321 UNLOCK(&request->requestmgr->locks[request->hash]);
1329 dns_request_t *request = event->ev_arg;
1333 REQUIRE(VALID_REQUEST(request));
1338 req_log(ISC_LOG_DEBUG(3), "req_response: request %p: %s", request,
1341 LOCK(&request->requestmgr->locks[request->hash]);
1347 * Copy buffer to request.
1350 result = isc_buffer_allocate(request->mctx, &request->answer,
1354 result = isc_buffer_copyregion(request->answer, &r);
1356 isc_buffer_free(&request->answer);
1361 dns_dispatch_removeresponse(&request->dispentry, &devent);
1362 req_cancel(request);
1366 send_if_done(request, result);
1367 UNLOCK(&request->requestmgr->locks[request->hash]);
1372 dns_request_t *request = event->ev_arg;
1375 REQUIRE(VALID_REQUEST(request));
1377 req_log(ISC_LOG_DEBUG(3), "req_timeout: request %p", request);
1380 LOCK(&request->requestmgr->locks[request->hash]);
1382 request->udpcount-- != 0) {
1383 if (! DNS_REQUEST_SENDING(request)) {
1384 result = req_send(request, task, &request->destaddr);
1386 req_cancel(request);
1387 send_if_done(request, result);
1391 request->flags |= DNS_REQUEST_F_TIMEDOUT;
1392 req_cancel(request);
1393 send_if_done(request, ISC_R_TIMEDOUT);
1395 UNLOCK(&request->requestmgr->locks[request->hash]);
1400 req_sendevent(dns_request_t *request, isc_result_t result) {
1403 REQUIRE(VALID_REQUEST(request));
1405 req_log(ISC_LOG_DEBUG(3), "req_sendevent: request %p", request);
1410 task = request->event->ev_sender;
1411 request->event->ev_sender = request;
1412 request->event->result = result;
1413 isc_task_sendanddetach(&task, (isc_event_t **)&request->event);
1417 req_destroy(dns_request_t *request) {
1420 REQUIRE(VALID_REQUEST(request));
1422 req_log(ISC_LOG_DEBUG(3), "req_destroy: request %p", request);
1424 request->magic = 0;
1425 if (request->query != NULL)
1426 isc_buffer_free(&request->query);
1427 if (request->answer != NULL)
1428 isc_buffer_free(&request->answer);
1429 if (request->event != NULL)
1430 isc_event_free((isc_event_t **)&request->event);
1431 if (request->dispentry != NULL)
1432 dns_dispatch_removeresponse(&request->dispentry, NULL);
1433 if (request->dispatch != NULL)
1434 dns_dispatch_detach(&request->dispatch);
1435 if (request->timer != NULL)
1436 isc_timer_detach(&request->timer);
1437 if (request->tsig != NULL)
1438 isc_buffer_free(&request->tsig);
1439 if (request->tsigkey != NULL)
1440 dns_tsigkey_detach(&request->tsigkey);
1441 if (request->requestmgr != NULL)
1442 requestmgr_detach(&request->requestmgr);
1443 mctx = request->mctx;
1444 isc_mem_put(mctx, request, sizeof(*request));
1449 * Stop the current request. Must be called from the request's task.
1452 req_cancel(dns_request_t *request) {
1456 REQUIRE(VALID_REQUEST(request));
1458 req_log(ISC_LOG_DEBUG(3), "req_cancel: request %p", request);
1463 request->flags |= DNS_REQUEST_F_CANCELED;
1465 if (request->timer != NULL)
1466 isc_timer_detach(&request->timer);
1467 dispattr = dns_dispatch_getattributes(request->dispatch);
1469 if (DNS_REQUEST_CONNECTING(request) || DNS_REQUEST_SENDING(request)) {
1471 if (request->dispentry != NULL) {
1473 request->dispentry);
1476 socket = dns_dispatch_getsocket(request->dispatch);
1477 if (DNS_REQUEST_CONNECTING(request) && socket != NULL)
1479 if (DNS_REQUEST_SENDING(request) && socket != NULL)
1482 if (request->dispentry != NULL)
1483 dns_dispatch_removeresponse(&request->dispentry, NULL);
1484 dns_dispatch_detach(&request->dispatch);