Lines Matching defs:xfr

208 axfr_init(dns_xfrin_ctx_t *xfr);
210 axfr_makedb(dns_xfrin_ctx_t *xfr, dns_db_t **dbp);
212 axfr_putdata(dns_xfrin_ctx_t *xfr, dns_diffop_t op, dns_name_t *name,
215 axfr_apply(dns_xfrin_ctx_t *xfr);
217 axfr_commit(dns_xfrin_ctx_t *xfr);
219 axfr_finalize(dns_xfrin_ctx_t *xfr);
222 ixfr_init(dns_xfrin_ctx_t *xfr);
224 ixfr_apply(dns_xfrin_ctx_t *xfr);
226 ixfr_putdata(dns_xfrin_ctx_t *xfr, dns_diffop_t op, dns_name_t *name,
229 ixfr_commit(dns_xfrin_ctx_t *xfr);
232 xfr_rr(dns_xfrin_ctx_t *xfr, dns_name_t *name, uint32_t ttl,
236 xfrin_start(dns_xfrin_ctx_t *xfr);
241 xfrin_send_request(dns_xfrin_ctx_t *xfr);
250 maybe_free(dns_xfrin_ctx_t *xfr);
253 xfrin_fail(dns_xfrin_ctx_t *xfr, isc_result_t result, const char *msg);
266 xfrin_log(dns_xfrin_ctx_t *xfr, int level, const char *fmt, ...)
275 axfr_init(dns_xfrin_ctx_t *xfr) {
278 xfr->is_ixfr = false;
280 if (xfr->db != NULL) {
281 dns_db_detach(&xfr->db);
284 CHECK(axfr_makedb(xfr, &xfr->db));
285 dns_rdatacallbacks_init(&xfr->axfr);
286 CHECK(dns_db_beginload(xfr->db, &xfr->axfr));
293 axfr_makedb(dns_xfrin_ctx_t *xfr, dns_db_t **dbp) {
296 result = dns_db_create(xfr->mctx, /* XXX */
298 &xfr->name, dns_dbtype_zone, xfr->rdclass, 0,
302 dns_zone_rpz_enable_db(xfr->zone, *dbp);
303 dns_zone_catz_enable_db(xfr->zone, *dbp);
309 axfr_putdata(dns_xfrin_ctx_t *xfr, dns_diffop_t op, dns_name_t *name,
315 if (rdata->rdclass != xfr->rdclass) {
319 CHECK(dns_zone_checknames(xfr->zone, name, rdata));
320 CHECK(dns_difftuple_create(xfr->diff.mctx, op, name, ttl, rdata,
322 dns_diff_append(&xfr->diff, &tuple);
323 if (++xfr->difflen > 100) {
324 CHECK(axfr_apply(xfr));
335 axfr_apply(dns_xfrin_ctx_t *xfr) {
339 CHECK(dns_diff_load(&xfr->diff, xfr->axfr.add, xfr->axfr.add_private));
340 xfr->difflen = 0;
341 dns_diff_clear(&xfr->diff);
342 if (xfr->maxrecords != 0U) {
343 result = dns_db_getsize(xfr->db, xfr->ver, &records, NULL);
344 if (result == ISC_R_SUCCESS && records > xfr->maxrecords) {
355 axfr_commit(dns_xfrin_ctx_t *xfr) {
358 CHECK(axfr_apply(xfr));
359 CHECK(dns_db_endload(xfr->db, &xfr->axfr));
360 CHECK(dns_zone_verifydb(xfr->zone, xfr->db, NULL));
368 axfr_finalize(dns_xfrin_ctx_t *xfr) {
371 CHECK(dns_zone_replacedb(xfr->zone, xfr->db, true));
384 ixfr_init(dns_xfrin_ctx_t *xfr) {
388 if (xfr->reqtype != dns_rdatatype_ixfr) {
389 xfrin_log(xfr, ISC_LOG_ERROR,
394 xfr->is_ixfr = true;
395 INSIST(xfr->db != NULL);
396 xfr->difflen = 0;
398 journalfile = dns_zone_getjournal(xfr->zone);
400 CHECK(dns_journal_open(xfr->mctx, journalfile,
401 DNS_JOURNAL_CREATE, &xfr->ixfr.journal));
410 ixfr_putdata(dns_xfrin_ctx_t *xfr, dns_diffop_t op, dns_name_t *name,
415 if (rdata->rdclass != xfr->rdclass) {
420 CHECK(dns_zone_checknames(xfr->zone, name, rdata));
422 CHECK(dns_difftuple_create(xfr->diff.mctx, op, name, ttl, rdata,
424 dns_diff_append(&xfr->diff, &tuple);
425 if (++xfr->difflen > 100) {
426 CHECK(ixfr_apply(xfr));
437 ixfr_apply(dns_xfrin_ctx_t *xfr) {
441 if (xfr->ver == NULL) {
442 CHECK(dns_db_newversion(xfr->db, &xfr->ver));
443 if (xfr->ixfr.journal != NULL) {
444 CHECK(dns_journal_begin_transaction(xfr->ixfr.journal));
447 CHECK(dns_diff_apply(&xfr->diff, xfr->db, xfr->ver));
448 if (xfr->maxrecords != 0U) {
449 result = dns_db_getsize(xfr->db, xfr->ver, &records, NULL);
450 if (result == ISC_R_SUCCESS && records > xfr->maxrecords) {
455 if (xfr->ixfr.journal != NULL) {
456 result = dns_journal_writediff(xfr->ixfr.journal, &xfr->diff);
461 dns_diff_clear(&xfr->diff);
462 xfr->difflen = 0;
469 ixfr_commit(dns_xfrin_ctx_t *xfr) {
472 CHECK(ixfr_apply(xfr));
473 if (xfr->ver != NULL) {
474 CHECK(dns_zone_verifydb(xfr->zone, xfr->db, xfr->ver));
476 if (xfr->ixfr.journal != NULL) {
477 CHECK(dns_journal_commit(xfr->ixfr.journal));
479 dns_db_closeversion(xfr->db, &xfr->ver, true);
480 dns_zone_markdirty(xfr->zone);
497 xfr_rr(dns_xfrin_ctx_t *xfr, dns_name_t *name, uint32_t ttl,
501 xfr->nrecs++;
515 !dns_name_equal(&xfr->name, name))
519 xfrin_log(xfr, ISC_LOG_DEBUG(3), "SOA name mismatch: '%s'",
525 switch (xfr->state) {
528 xfrin_log(xfr, ISC_LOG_ERROR,
532 xfr->end_serial = dns_soa_getserial(rdata);
533 if (!DNS_SERIAL_GT(xfr->end_serial, xfr->ixfr.request_serial) &&
534 !dns_zone_isforced(xfr->zone))
536 xfrin_log(xfr, ISC_LOG_DEBUG(3),
539 xfr->ixfr.request_serial, xfr->end_serial);
542 xfr->state = XFRST_GOTSOA;
553 xfrin_log(xfr, ISC_LOG_ERROR,
561 xfr->end_serial = dns_soa_getserial(rdata);
562 if (xfr->reqtype == dns_rdatatype_ixfr &&
563 !DNS_SERIAL_GT(xfr->end_serial, xfr->ixfr.request_serial) &&
564 !dns_zone_isforced(xfr->zone))
571 xfrin_log(xfr, ISC_LOG_DEBUG(3),
574 xfr->ixfr.request_serial, xfr->end_serial);
577 if (xfr->reqtype == dns_rdatatype_axfr) {
578 xfr->checkid = false;
580 xfr->firstsoa = *rdata;
581 if (xfr->firstsoa_data != NULL) {
582 isc_mem_free(xfr->mctx, xfr->firstsoa_data);
584 xfr->firstsoa_data = isc_mem_allocate(xfr->mctx, rdata->length);
585 memcpy(xfr->firstsoa_data, rdata->data, rdata->length);
586 xfr->firstsoa.data = xfr->firstsoa_data;
587 xfr->state = XFRST_FIRSTDATA;
595 if (xfr->reqtype == dns_rdatatype_ixfr &&
597 xfr->ixfr.request_serial == dns_soa_getserial(rdata))
599 xfrin_log(xfr, ISC_LOG_DEBUG(3),
601 CHECK(ixfr_init(xfr));
602 xfr->state = XFRST_IXFR_DELSOA;
604 xfrin_log(xfr, ISC_LOG_DEBUG(3),
606 CHECK(axfr_init(xfr));
607 xfr->state = XFRST_AXFR;
613 CHECK(ixfr_putdata(xfr, DNS_DIFFOP_DEL, name, ttl, rdata));
614 xfr->state = XFRST_IXFR_DEL;
620 xfr->state = XFRST_IXFR_ADDSOA;
621 xfr->ixfr.current_serial = soa_serial;
624 CHECK(ixfr_putdata(xfr, DNS_DIFFOP_DEL, name, ttl, rdata));
629 CHECK(ixfr_putdata(xfr, DNS_DIFFOP_ADD, name, ttl, rdata));
630 xfr->state = XFRST_IXFR_ADD;
636 if (soa_serial == xfr->end_serial) {
637 CHECK(ixfr_commit(xfr));
638 xfr->state = XFRST_IXFR_END;
640 } else if (soa_serial != xfr->ixfr.current_serial) {
641 xfrin_log(xfr, ISC_LOG_ERROR,
644 xfr->ixfr.current_serial, soa_serial);
647 CHECK(ixfr_commit(xfr));
648 xfr->state = XFRST_IXFR_DELSOA;
657 CHECK(ixfr_putdata(xfr, DNS_DIFFOP_ADD, name, ttl, rdata));
665 rdata->rdclass != xfr->rdclass &&
666 xfr->rdclass != dns_rdataclass_in)
670 CHECK(axfr_putdata(xfr, DNS_DIFFOP_ADD, name, ttl, rdata));
676 if (dns_rdata_compare(rdata, &xfr->firstsoa) != 0) {
677 xfrin_log(xfr, ISC_LOG_ERROR,
682 CHECK(axfr_commit(xfr));
683 xfr->state = XFRST_AXFR_END;
708 dns_xfrin_ctx_t *xfr = NULL;
722 sourceaddr, dscp, tsigkey, &xfr));
725 xfr->zone_had_db = true;
728 CHECK(xfrin_start(xfr));
730 xfr->done = done;
731 if (xfr->done != NULL) {
732 xfr->refcount++;
734 *xfrp = xfr;
750 dns_xfrin_shutdown(dns_xfrin_ctx_t *xfr) {
751 if (!xfr->shuttingdown) {
752 xfrin_fail(xfr, ISC_R_CANCELED, "shut down");
765 dns_xfrin_ctx_t *xfr = *xfrp;
767 INSIST(xfr->refcount > 0);
768 xfr->refcount--;
769 maybe_free(xfr);
773 xfrin_cancelio(dns_xfrin_ctx_t *xfr) {
774 if (xfr->connects > 0) {
775 isc_socket_cancel(xfr->socket, xfr->task,
777 } else if (xfr->recvs > 0) {
778 dns_tcpmsg_cancelread(&xfr->tcpmsg);
779 } else if (xfr->sends > 0) {
780 isc_socket_cancel(xfr->socket, xfr->task, ISC_SOCKCANCEL_SEND);
785 xfrin_reset(dns_xfrin_ctx_t *xfr) {
786 REQUIRE(VALID_XFRIN(xfr));
788 xfrin_log(xfr, ISC_LOG_INFO, "resetting");
790 xfrin_cancelio(xfr);
792 if (xfr->socket != NULL) {
793 isc_socket_detach(&xfr->socket);
796 if (xfr->lasttsig != NULL) {
797 isc_buffer_free(&xfr->lasttsig);
800 dns_diff_clear(&xfr->diff);
801 xfr->difflen = 0;
803 if (xfr->ixfr.journal != NULL) {
804 dns_journal_destroy(&xfr->ixfr.journal);
807 if (xfr->axfr.add_private != NULL) {
808 (void)dns_db_endload(xfr->db, &xfr->axfr);
811 if (xfr->tcpmsg_valid) {
812 dns_tcpmsg_invalidate(&xfr->tcpmsg);
813 xfr->tcpmsg_valid = false;
816 if (xfr->ver != NULL) {
817 dns_db_closeversion(xfr->db, &xfr->ver, false);
822 xfrin_fail(dns_xfrin_ctx_t *xfr, isc_result_t result, const char *msg) {
824 xfrin_log(xfr, ISC_LOG_ERROR, "%s: %s", msg,
826 if (xfr->is_ixfr) {
831 xfrin_cancelio(xfr);
835 if (xfr->ixfr.journal != NULL) {
836 dns_journal_destroy(&xfr->ixfr.journal);
838 if (xfr->done != NULL) {
839 (xfr->done)(xfr->zone, result);
840 xfr->done = NULL;
842 xfr->shuttingdown = true;
843 xfr->shutdown_result = result;
844 maybe_free(xfr);
854 dns_xfrin_ctx_t *xfr = NULL;
857 xfr = isc_mem_get(mctx, sizeof(*xfr));
858 xfr->mctx = NULL;
859 isc_mem_attach(mctx, &xfr->mctx);
860 xfr->refcount = 0;
861 xfr->zone = NULL;
862 dns_zone_iattach(zone, &xfr->zone);
863 xfr->task = NULL;
864 isc_task_attach(task, &xfr->task);
865 xfr->timer = NULL;
866 xfr->socketmgr = socketmgr;
867 xfr->done = NULL;
869 xfr->connects = 0;
870 xfr->sends = 0;
871 xfr->recvs = 0;
872 xfr->shuttingdown = false;
873 xfr->shutdown_result = ISC_R_UNSET;
875 dns_name_init(&xfr->name, NULL);
876 xfr->rdclass = rdclass;
877 xfr->checkid = true;
878 xfr->logit = true;
879 xfr->id = (dns_messageid_t)isc_random16();
880 xfr->reqtype = reqtype;
881 xfr->dscp = dscp;
884 xfr->socket = NULL;
888 xfr->tcpmsg_valid = false;
890 xfr->zone_had_db = false;
891 xfr->db = NULL;
893 dns_db_attach(db, &xfr->db);
895 xfr->ver = NULL;
896 dns_diff_init(xfr->mctx, &xfr->diff);
897 xfr->difflen = 0;
900 xfr->state = XFRST_SOAQUERY;
902 xfr->state = XFRST_INITIALSOA;
906 xfr->nmsg = 0;
907 xfr->nrecs = 0;
908 xfr->nbytes = 0;
909 xfr->maxrecords = dns_zone_getmaxrecords(zone);
910 isc_time_now(&xfr->start);
912 xfr->tsigkey = NULL;
914 dns_tsigkey_attach(tsigkey, &xfr->tsigkey);
916 xfr->lasttsig = NULL;
917 xfr->tsigctx = NULL;
918 xfr->sincetsig = 0;
919 xfr->is_ixfr = false;
923 xfr->ixfr.journal = NULL;
925 xfr->axfr.add = NULL;
926 xfr->axfr.add_private = NULL;
927 dns_rdata_init(&xfr->firstsoa);
928 xfr->firstsoa_data = NULL;
930 dns_name_dup(zonename, mctx, &xfr->name);
933 task, xfrin_timeout, xfr, &xfr->timer));
934 CHECK(dns_timer_setidle(xfr->timer, dns_zone_getmaxxfrin(xfr->zone),
935 dns_zone_getidlein(xfr->zone), false));
937 xfr->masteraddr = *masteraddr;
940 xfr->sourceaddr = *sourceaddr;
941 isc_sockaddr_setport(&xfr->sourceaddr, 0);
946 isc_buffer_init(&xfr->qbuffer, &xfr->qbuffer_data[2],
947 sizeof(xfr->qbuffer_data) - 2);
949 xfr->magic = XFRIN_MAGIC;
950 *xfrp = xfr;
954 if (xfr->timer != NULL) {
955 isc_timer_destroy(&xfr->timer);
957 if (dns_name_dynamic(&xfr->name)) {
958 dns_name_free(&xfr->name, xfr->mctx);
960 if (xfr->tsigkey != NULL) {
961 dns_tsigkey_detach(&xfr->tsigkey);
963 if (xfr->db != NULL) {
964 dns_db_detach(&xfr->db);
966 isc_task_detach(&xfr->task);
967 dns_zone_idetach(&xfr->zone);
968 isc_mem_putanddetach(&xfr->mctx, xfr, sizeof(*xfr));
974 xfrin_start(dns_xfrin_ctx_t *xfr) {
976 CHECK(isc_socket_create(xfr->socketmgr,
977 isc_sockaddr_pf(&xfr->sourceaddr),
978 isc_sockettype_tcp, &xfr->socket));
979 isc_socket_setname(xfr->socket, "xfrin", NULL);
981 CHECK(isc_socket_bind(xfr->socket, &xfr->sourceaddr,
984 isc_socket_dscp(xfr->socket, xfr->dscp);
985 CHECK(isc_socket_connect(xfr->socket, &xfr->masteraddr, xfr->task,
986 xfrin_connect_done, xfr));
987 xfr->connects++;
990 xfrin_fail(xfr, result, "failed setting up socket");
1024 dns_xfrin_ctx_t *xfr = (dns_xfrin_ctx_t *)event->ev_arg;
1033 REQUIRE(VALID_XFRIN(xfr));
1040 xfr->connects--;
1041 if (xfr->shuttingdown) {
1042 maybe_free(xfr);
1046 zmgr = dns_zone_getmgr(xfr->zone);
1050 dns_zonemgr_unreachableadd(zmgr, &xfr->masteraddr,
1051 &xfr->sourceaddr, &now);
1054 dns_zonemgr_unreachabledel(zmgr, &xfr->masteraddr,
1055 &xfr->sourceaddr);
1059 result = isc_socket_getsockname(xfr->socket, &sockaddr);
1066 if (xfr->tsigkey != NULL && xfr->tsigkey->key != NULL) {
1067 dns_name_format(dst_key_name(xfr->tsigkey->key), signerbuf,
1073 xfrin_log(xfr, ISC_LOG_INFO, "connected using %s%s%s", sourcetext, sep,
1076 dns_tcpmsg_init(xfr->mctx, xfr->socket, &xfr->tcpmsg);
1077 xfr->tcpmsg_valid = true;
1079 CHECK(xfrin_send_request(xfr));
1082 xfrin_fail(xfr, result, "failed to connect");
1142 xfrin_send_request(dns_xfrin_ctx_t *xfr) {
1153 dns_message_create(xfr->mctx, DNS_MESSAGE_INTENTRENDER, &msg);
1154 CHECK(dns_message_settsigkey(msg, xfr->tsigkey));
1158 dns_name_clone(&xfr->name, qname);
1162 dns_rdataset_makequestion(qrdataset, xfr->rdclass, xfr->reqtype);
1169 if (xfr->reqtype == dns_rdatatype_ixfr) {
1172 dns_db_currentversion(xfr->db, &ver);
1173 CHECK(dns_db_createsoatuple(xfr->db, ver, xfr->mctx,
1175 xfr->ixfr.request_serial = dns_soa_getserial(&soatuple->rdata);
1176 xfr->ixfr.current_serial = xfr->ixfr.request_serial;
1177 xfrin_log(xfr, ISC_LOG_DEBUG(3),
1179 xfr->ixfr.request_serial);
1183 } else if (xfr->reqtype == dns_rdatatype_soa) {
1184 CHECK(dns_db_getsoaserial(xfr->db, NULL,
1185 &xfr->ixfr.request_serial));
1188 xfr->checkid = true;
1189 xfr->logit = true;
1190 xfr->id++;
1191 xfr->nmsg = 0;
1192 xfr->nrecs = 0;
1193 xfr->nbytes = 0;
1194 isc_time_now(&xfr->start);
1195 msg->id = xfr->id;
1196 if (xfr->tsigctx != NULL) {
1197 dst_context_destroy(&xfr->tsigctx);
1200 CHECK(render(msg, xfr->mctx, &xfr->qbuffer));
1205 if (xfr->lasttsig != NULL) {
1206 isc_buffer_free(&xfr->lasttsig);
1212 CHECK(dns_message_getquerytsig(msg, xfr->mctx, &xfr->lasttsig));
1214 isc_buffer_usedregion(&xfr->qbuffer, &region);
1221 xfr->qbuffer_data[0] = (region.length >> 8) & 0xff;
1222 xfr->qbuffer_data[1] = region.length & 0xff;
1225 CHECK(isc_socket_send(xfr->socket, &region, xfr->task, xfrin_send_done,
1226 xfr));
1227 xfr->sends++;
1243 dns_db_closeversion(xfr->db, &ver, false);
1251 dns_xfrin_ctx_t *xfr = (dns_xfrin_ctx_t *)event->ev_arg;
1254 REQUIRE(VALID_XFRIN(xfr));
1260 xfr->sends--;
1261 xfrin_log(xfr, ISC_LOG_DEBUG(3), "sent request data");
1264 CHECK(dns_tcpmsg_readmessage(&xfr->tcpmsg, xfr->task, xfrin_recv_done,
1265 xfr));
1266 xfr->recvs++;
1270 xfrin_fail(xfr, result, "failed sending request data");
1276 dns_xfrin_ctx_t *xfr = (dns_xfrin_ctx_t *)ev->ev_arg;
1283 REQUIRE(VALID_XFRIN(xfr));
1291 xfr->recvs--;
1292 if (xfr->shuttingdown) {
1293 maybe_free(xfr);
1299 xfrin_log(xfr, ISC_LOG_DEBUG(7), "received %u bytes",
1302 CHECK(isc_timer_touch(xfr->timer));
1304 dns_message_create(xfr->mctx, DNS_MESSAGE_INTENTPARSE, &msg);
1306 CHECK(dns_message_settsigkey(msg, xfr->tsigkey));
1307 CHECK(dns_message_setquerytsig(msg, xfr->lasttsig));
1309 msg->tsigctx = xfr->tsigctx;
1310 xfr->tsigctx = NULL;
1312 dns_message_setclass(msg, xfr->rdclass);
1314 if (xfr->nmsg > 0) {
1325 xfr->mctx);
1327 xfrin_log(xfr, ISC_LOG_DEBUG(10), "dns_message_parse: %s",
1332 msg->opcode != dns_opcode_query || msg->rdclass != xfr->rdclass ||
1333 (xfr->checkid && msg->id != xfr->id))
1343 msg->rdclass != xfr->rdclass)
1349 if (xfr->reqtype == dns_rdatatype_axfr ||
1350 xfr->reqtype == dns_rdatatype_soa)
1354 xfrin_log(xfr, ISC_LOG_DEBUG(3), "got %s, retrying with AXFR",
1358 xfrin_reset(xfr);
1359 xfr->reqtype = dns_rdatatype_soa;
1360 xfr->state = XFRST_SOAQUERY;
1361 (void)xfrin_start(xfr);
1363 } else if (!xfr->checkid && msg->id != xfr->id && xfr->logit) {
1364 xfrin_log(xfr, ISC_LOG_WARNING,
1368 xfr->logit = false;
1377 if (xfr->reqtype == dns_rdatatype_ixfr &&
1378 xfr->state == XFRST_INITIALSOA &&
1381 xfrin_log(xfr, ISC_LOG_DEBUG(3),
1386 if (xfr->reqtype == dns_rdatatype_soa &&
1392 result = dns_message_checksig(msg, dns_zone_getview(xfr->zone));
1394 xfrin_log(xfr, ISC_LOG_DEBUG(3), "TSIG check failed: %s",
1416 CHECK(xfr_rr(xfr, name, rds->ttl, &rdata));
1428 xfr->sincetsig = 0;
1433 if (xfr->lasttsig != NULL) {
1434 isc_buffer_free(&xfr->lasttsig);
1440 CHECK(dns_message_getquerytsig(msg, xfr->mctx, &xfr->lasttsig));
1442 xfr->sincetsig++;
1443 if (xfr->sincetsig > 100 || xfr->nmsg == 0 ||
1444 xfr->state == XFRST_AXFR_END ||
1445 xfr->state == XFRST_IXFR_END)
1455 xfr->nmsg++;
1460 xfr->nbytes += tcpmsg->buffer.used;
1465 INSIST(xfr->tsigctx == NULL);
1466 xfr->tsigctx = msg->tsigctx;
1471 switch (xfr->state) {
1473 xfr->reqtype = dns_rdatatype_axfr;
1474 xfr->state = XFRST_INITIALSOA;
1475 CHECK(xfrin_send_request(xfr));
1478 CHECK(axfr_finalize(xfr));
1484 if (xfr->ixfr.journal != NULL) {
1485 dns_journal_destroy(&xfr->ixfr.journal);
1491 if (xfr->done != NULL) {
1492 (xfr->done)(xfr->zone, ISC_R_SUCCESS);
1493 xfr->done = NULL;
1499 xfr->shuttingdown = true;
1500 xfr->shutdown_result = ISC_R_SUCCESS;
1501 maybe_free(xfr);
1507 CHECK(dns_tcpmsg_readmessage(&xfr->tcpmsg, xfr->task,
1508 xfrin_recv_done, xfr));
1509 xfr->recvs++;
1518 xfrin_fail(xfr, result, "failed while receiving responses");
1524 dns_xfrin_ctx_t *xfr = (dns_xfrin_ctx_t *)event->ev_arg;
1526 REQUIRE(VALID_XFRIN(xfr));
1534 xfrin_fail(xfr, ISC_R_TIMEDOUT, "giving up");
1538 maybe_free(dns_xfrin_ctx_t *xfr) {
1543 REQUIRE(VALID_XFRIN(xfr));
1545 if (!xfr->shuttingdown || xfr->refcount != 0 || xfr->connects != 0 ||
1546 xfr->sends != 0 || xfr->recvs != 0)
1551 INSIST(!xfr->shuttingdown || xfr->shutdown_result != ISC_R_UNSET);
1557 result_str = (xfr->shuttingdown
1558 ? isc_result_totext(xfr->shutdown_result)
1560 xfrin_log(xfr, ISC_LOG_INFO, "Transfer status: %s", result_str);
1566 isc_time_now(&xfr->end);
1567 msecs = isc_time_microdiff(&xfr->end, &xfr->start) / 1000;
1571 persec = (xfr->nbytes * 1000) / msecs;
1572 xfrin_log(xfr, ISC_LOG_INFO,
1576 xfr->nmsg, xfr->nrecs, xfr->nbytes,
1578 (unsigned int)persec, xfr->end_serial);
1580 if (xfr->socket != NULL) {
1581 isc_socket_detach(&xfr->socket);
1584 if (xfr->timer != NULL) {
1585 isc_timer_destroy(&xfr->timer);
1588 if (xfr->task != NULL) {
1589 isc_task_detach(&xfr->task);
1592 if (xfr->tsigkey != NULL) {
1593 dns_tsigkey_detach(&xfr->tsigkey);
1596 if (xfr->lasttsig != NULL) {
1597 isc_buffer_free(&xfr->lasttsig);
1600 dns_diff_clear(&xfr->diff);
1602 if (xfr->ixfr.journal != NULL) {
1603 dns_journal_destroy(&xfr->ixfr.journal);
1606 if (xfr->axfr.add_private != NULL) {
1607 (void)dns_db_endload(xfr->db, &xfr->axfr);
1610 if (xfr->tcpmsg_valid) {
1611 dns_tcpmsg_invalidate(&xfr->tcpmsg);
1614 if (xfr->tsigctx != NULL) {
1615 dst_context_destroy(&xfr->tsigctx);
1618 if ((xfr->name.attributes & DNS_NAMEATTR_DYNAMIC) != 0) {
1619 dns_name_free(&xfr->name, xfr->mctx);
1622 if (xfr->ver != NULL) {
1623 dns_db_closeversion(xfr->db, &xfr->ver, false);
1626 if (xfr->db != NULL) {
1627 dns_db_detach(&xfr->db);
1630 if (xfr->zone != NULL) {
1631 if (!xfr->zone_had_db && xfr->shuttingdown &&
1632 xfr->shutdown_result == ISC_R_SUCCESS &&
1633 dns_zone_gettype(xfr->zone) == dns_zone_mirror)
1635 dns_zone_log(xfr->zone, ISC_LOG_INFO,
1638 xfrin_log(xfr, ISC_LOG_DEBUG(99), "freeing transfer context");
1640 * xfr->zone must not be detached before xfrin_log() is called.
1642 dns_zone_idetach(&xfr->zone);
1645 if (xfr->firstsoa_data != NULL) {
1646 isc_mem_free(xfr->mctx, xfr->firstsoa_data);
1649 isc_mem_putanddetach(&xfr->mctx, xfr, sizeof(*xfr));
1693 xfrin_log(dns_xfrin_ctx_t *xfr, int level, const char *fmt, ...) {
1701 dns_zone_name(xfr->zone, zonetext, sizeof(zonetext));
1704 xfrin_logv(level, zonetext, &xfr->masteraddr, fmt, ap);