From: Matthijs Mekking Date: Tue, 18 Nov 2025 08:56:34 +0000 (+0100) Subject: Add type parameter to dns_notify_create() X-Git-Tag: v9.21.17~21^2~7 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=dc0437e5185156ecae0847a1f6f6eb6a7f27cb39;p=thirdparty%2Fbind9.git Add type parameter to dns_notify_create() With Generalized DNS Notifications, a zone may need to send different type of NOTIFY messages for different reasons. When creating a new notify, allow for specifying the type. --- diff --git a/lib/dns/include/dns/notify.h b/lib/dns/include/dns/notify.h index d6c64e5a027..6755c2831ac 100644 --- a/lib/dns/include/dns/notify.h +++ b/lib/dns/include/dns/notify.h @@ -51,6 +51,7 @@ struct dns_notify { dns_adbfind_t *find; dns_request_t *request; dns_name_t ns; + dns_rdatatype_t type; in_port_t port; isc_sockaddr_t src; isc_sockaddr_t dst; @@ -77,8 +78,8 @@ dns_notifyctx_init(dns_notifyctx_t *nctx, dns_rdatatype_t type); */ void -dns_notify_create(isc_mem_t *mctx, in_port_t port, unsigned int flags, - dns_notify_t **notifyp); +dns_notify_create(isc_mem_t *mctx, dns_rdatatype_t type, in_port_t port, + unsigned int flags, dns_notify_t **notifyp); /*%< * Create a notify structure to maintain state. * @@ -98,14 +99,15 @@ dns_notify_destroy(dns_notify_t *notify, bool zone_locked); */ bool -dns_notify_isqueued(dns_notifyctx_t *nctx, in_port_t port, unsigned int flags, - dns_name_t *name, isc_sockaddr_t *addr, dns_tsigkey_t *key, - dns_transport_t *transport); +dns_notify_isqueued(dns_notifyctx_t *nctx, dns_rdatatype_t type, in_port_t port, + unsigned int flags, dns_name_t *name, isc_sockaddr_t *addr, + dns_tsigkey_t *key, dns_transport_t *transport); /*%< - * Check if we already have a notify queued matching name, destination - * address and port, TSIG key, and transport. Will requeue on the normal - * notify ratelimiter if the notify was enqueued on the startup ratelimiter - * and this is not a startup notify. + * Check if we already have a notify queued matching name, type, + * destination address and port, TSIG key, and transport. Will + * requeue on the normal notify ratelimiter if the notify was + * enqueued on the startup ratelimiter and this is not a startup + * notify. * * Requires: * 'nctx' is not NULL diff --git a/lib/dns/notify.c b/lib/dns/notify.c index 50f0bb6cea4..07b71b72422 100644 --- a/lib/dns/notify.c +++ b/lib/dns/notify.c @@ -53,8 +53,8 @@ dns_notifyctx_init(dns_notifyctx_t *nctx, dns_rdatatype_t type) { } void -dns_notify_create(isc_mem_t *mctx, in_port_t port, unsigned int flags, - dns_notify_t **notifyp) { +dns_notify_create(isc_mem_t *mctx, dns_rdatatype_t type, in_port_t port, + unsigned int flags, dns_notify_t **notifyp) { dns_notify_t *notify; REQUIRE(notifyp != NULL && *notifyp == NULL); @@ -63,6 +63,7 @@ dns_notify_create(isc_mem_t *mctx, in_port_t port, unsigned int flags, *notify = (dns_notify_t){ .flags = flags, .port = port, + .type = type, }; isc_mem_attach(mctx, ¬ify->mctx); @@ -527,9 +528,9 @@ dns_notify_queue(dns_notify_t *notify, bool startup) { } bool -dns_notify_isqueued(dns_notifyctx_t *nctx, in_port_t port, unsigned int flags, - dns_name_t *name, isc_sockaddr_t *addr, dns_tsigkey_t *key, - dns_transport_t *transport) { +dns_notify_isqueued(dns_notifyctx_t *nctx, dns_rdatatype_t type, in_port_t port, + unsigned int flags, dns_name_t *name, isc_sockaddr_t *addr, + dns_tsigkey_t *key, dns_transport_t *transport) { dns_notify_t *notify = NULL; isc_result_t result; @@ -539,6 +540,9 @@ dns_notify_isqueued(dns_notifyctx_t *nctx, in_port_t port, unsigned int flags, if (n->request != NULL) { continue; } + if (n->type != type) { + continue; + } if ((name != NULL && dns_name_dynamic(&n->ns) && dns_name_equal(name, &n->ns)) || (addr != NULL && isc_sockaddr_equal(addr, &n->dst) && @@ -649,8 +653,8 @@ notify_send(dns_notify_t *notify) { ISC_LIST_FOREACH(notify->find->list, ai, publink) { dst = ai->sockaddr; - if (dns_notify_isqueued(notifyctx, notify->port, notify->flags, - NULL, &dst, NULL, NULL)) + if (dns_notify_isqueued(notifyctx, notify->type, notify->port, + notify->flags, NULL, &dst, NULL, NULL)) { continue; } @@ -659,8 +663,8 @@ notify_send(dns_notify_t *notify) { } newnotify = NULL; flags = notify->flags & DNS_NOTIFY_NOSOA; - dns_notify_create(notify->mctx, notify->port, flags, - &newnotify); + dns_notify_create(notify->mctx, notify->type, notify->port, + flags, &newnotify); dns__zone_iattach_locked(notify->zone, &newnotify->zone); ISC_LIST_APPEND(notifyctx->notifies, newnotify, link); newnotify->dst = dst; diff --git a/lib/dns/zone.c b/lib/dns/zone.c index cceb56d2c7f..db5f59b2b3e 100644 --- a/lib/dns/zone.c +++ b/lib/dns/zone.c @@ -12598,8 +12598,9 @@ zone_notify(dns_zone_t *zone, isc_time_t *now) { goto next; } - if (dns_notify_isqueued(&zone->notifysoa, zone->view->dstport, - flags, NULL, &dst, key, transport)) + if (dns_notify_isqueued(&zone->notifysoa, dns_rdatatype_soa, + zone->view->dstport, flags, NULL, &dst, + key, transport)) { if (key != NULL) { dns_tsigkey_detach(&key); @@ -12610,8 +12611,8 @@ zone_notify(dns_zone_t *zone, isc_time_t *now) { goto next; } - dns_notify_create(zone->mctx, zone->view->dstport, flags, - ¬ify); + dns_notify_create(zone->mctx, dns_rdatatype_soa, + zone->view->dstport, flags, ¬ify); zone_iattach(zone, ¬ify->zone); notify->src = src; notify->dst = dst; @@ -12688,15 +12689,15 @@ zone_notify(dns_zone_t *zone, isc_time_t *now) { } LOCK_ZONE(zone); - isqueued = dns_notify_isqueued(&zone->notifysoa, - zone->view->dstport, flags, - &ns.name, NULL, NULL, NULL); + isqueued = dns_notify_isqueued( + &zone->notifysoa, dns_rdatatype_soa, + zone->view->dstport, flags, &ns.name, NULL, NULL, NULL); UNLOCK_ZONE(zone); if (isqueued) { continue; } - dns_notify_create(zone->mctx, zone->view->dstport, flags, - ¬ify); + dns_notify_create(zone->mctx, dns_rdatatype_soa, + zone->view->dstport, flags, ¬ify); dns_zone_iattach(zone, ¬ify->zone); dns_name_dup(&ns.name, zone->mctx, ¬ify->ns); LOCK_ZONE(zone);