From: Vishal Chillara Srinivas Date: Sun, 27 Apr 2025 16:39:35 +0000 (+0530) Subject: reslove: Refactor DNS Answer to support 'until' in DnsAnswerItem X-Git-Tag: v258-rc1~33^2~3 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f7d5177dd2d71c2bf1e12d6f7bb6313dcb6694fc;p=thirdparty%2Fsystemd.git reslove: Refactor DNS Answer to support 'until' in DnsAnswerItem Prepare for mDNS browse services to facilitate scheduled cache maintenance queries when browsing for services. Introduce dns_answer_add_full() and dns_answer_add_extend_full() to explicitly handle the 'until' argument, enabling fine-grained control over the time property of DNS answers. Ensure backward compatibility while providing the flexibility to specify 'until' for specific cases when needed Co-authored-by: Vishwanath Chandapur --- diff --git a/src/resolve/resolved-dns-answer.c b/src/resolve/resolved-dns-answer.c index 144b8c3b677..37e2ba11006 100644 --- a/src/resolve/resolved-dns-answer.c +++ b/src/resolve/resolved-dns-answer.c @@ -109,7 +109,8 @@ static int dns_answer_add_raw( DnsResourceRecord *rr, int ifindex, DnsAnswerFlags flags, - DnsResourceRecord *rrsig) { + DnsResourceRecord *rrsig, + usec_t until) { _cleanup_(dns_answer_item_unrefp) DnsAnswerItem *item = NULL; int r; @@ -131,6 +132,7 @@ static int dns_answer_add_raw( .rr = dns_resource_record_ref(rr), .ifindex = ifindex, .flags = flags, + .until = until, .rrsig = dns_resource_record_ref(rrsig), }; @@ -152,7 +154,8 @@ static int dns_answer_add_raw_all(DnsAnswer *a, DnsAnswer *source) { item->rr, item->ifindex, item->flags, - item->rrsig); + item->rrsig, + /* until= */ USEC_INFINITY); if (r < 0) return r; } @@ -160,12 +163,13 @@ static int dns_answer_add_raw_all(DnsAnswer *a, DnsAnswer *source) { return 0; } -int dns_answer_add( +int dns_answer_add_full( DnsAnswer *a, DnsResourceRecord *rr, int ifindex, DnsAnswerFlags flags, - DnsResourceRecord *rrsig) { + DnsResourceRecord *rrsig, + usec_t until) { DnsAnswerItem tmp, *exist; @@ -220,7 +224,7 @@ int dns_answer_add( return 0; } - return dns_answer_add_raw(a, rr, ifindex, flags, rrsig); + return dns_answer_add_raw(a, rr, ifindex, flags, rrsig, until); } static int dns_answer_add_all(DnsAnswer *a, DnsAnswer *b) { @@ -236,12 +240,13 @@ static int dns_answer_add_all(DnsAnswer *a, DnsAnswer *b) { return 0; } -int dns_answer_add_extend( +int dns_answer_add_extend_full( DnsAnswer **a, DnsResourceRecord *rr, int ifindex, DnsAnswerFlags flags, - DnsResourceRecord *rrsig) { + DnsResourceRecord *rrsig, + usec_t until) { int r; @@ -252,7 +257,7 @@ int dns_answer_add_extend( if (r < 0) return r; - return dns_answer_add(*a, rr, ifindex, flags, rrsig); + return dns_answer_add_full(*a, rr, ifindex, flags, rrsig, until); } int dns_answer_add_soa(DnsAnswer *a, const char *name, uint32_t ttl, int ifindex) { diff --git a/src/resolve/resolved-dns-answer.h b/src/resolve/resolved-dns-answer.h index e4c1d2cb2a4..5f4a54c5567 100644 --- a/src/resolve/resolved-dns-answer.h +++ b/src/resolve/resolved-dns-answer.h @@ -31,6 +31,7 @@ typedef struct DnsAnswerItem { DnsResourceRecord *rrsig; /* Optionally, also store RRSIG RR that successfully validates this item */ int ifindex; DnsAnswerFlags flags; + usec_t until; } DnsAnswerItem; typedef struct DnsAnswer { @@ -50,8 +51,8 @@ DnsAnswer *dns_answer_unref(DnsAnswer *a); *_a = _b; \ } while(0) -int dns_answer_add(DnsAnswer *a, DnsResourceRecord *rr, int ifindex, DnsAnswerFlags flags, DnsResourceRecord *rrsig); -int dns_answer_add_extend(DnsAnswer **a, DnsResourceRecord *rr, int ifindex, DnsAnswerFlags flags, DnsResourceRecord *rrsig); +int dns_answer_add_full(DnsAnswer *a, DnsResourceRecord *rr, int ifindex, DnsAnswerFlags flags, DnsResourceRecord *rrsig, usec_t until); +int dns_answer_add_extend_full(DnsAnswer **a, DnsResourceRecord *rr, int ifindex, DnsAnswerFlags flags, DnsResourceRecord *rrsig, usec_t until); int dns_answer_add_soa(DnsAnswer *a, const char *name, uint32_t ttl, int ifindex); int dns_answer_match_key(DnsAnswer *a, const DnsResourceKey *key, DnsAnswerFlags *ret_flags); @@ -79,6 +80,16 @@ int dns_answer_move_by_key(DnsAnswer **to, DnsAnswer **from, const DnsResourceKe int dns_answer_has_dname_for_cname(DnsAnswer *a, DnsResourceRecord *cname); +static inline int dns_answer_add_extend(DnsAnswer **a, DnsResourceRecord *rr, + int ifindex, DnsAnswerFlags flags, DnsResourceRecord *rrsig) { + return dns_answer_add_extend_full(a, rr, ifindex, flags, rrsig, /* until= */ USEC_INFINITY); +} + +static inline int dns_answer_add(DnsAnswer *a, DnsResourceRecord *rr, + int ifindex, DnsAnswerFlags flags, DnsResourceRecord *rrsig) { + return dns_answer_add_full(a, rr, ifindex, flags, rrsig, /* until= */ USEC_INFINITY); +} + static inline size_t dns_answer_size(DnsAnswer *a) { return a ? ordered_set_size(a->items) : 0; } diff --git a/src/resolve/resolved-dns-cache.c b/src/resolve/resolved-dns-cache.c index 9ae3e78286c..5429cefdcda 100644 --- a/src/resolve/resolved-dns-cache.c +++ b/src/resolve/resolved-dns-cache.c @@ -1022,7 +1022,7 @@ static int answer_add_clamp_ttl( } } - r = dns_answer_add_extend(answer, rr, ifindex, answer_flags, rrsig); + r = dns_answer_add_extend_full(answer, rr, ifindex, answer_flags, rrsig, until); if (r < 0) return r;