]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
reslove: Refactor DNS Answer to support 'until' in DnsAnswerItem
authorVishal Chillara Srinivas <vishal.chillarasrinivas@philips.com>
Sun, 27 Apr 2025 16:39:35 +0000 (22:09 +0530)
committerVishal Chillara Srinivas <vishal.chillarasrinivas@philips.com>
Mon, 14 Jul 2025 09:20:03 +0000 (14:50 +0530)
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 <vishwanath.chandapur@philips.com>
src/resolve/resolved-dns-answer.c
src/resolve/resolved-dns-answer.h
src/resolve/resolved-dns-cache.c

index 144b8c3b6771056471136b993702609c35c3a2c5..37e2ba1100677cf41943a9e44a5afa82bd50b762 100644 (file)
@@ -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) {
index e4c1d2cb2a4aa0cae0a1d5ca3f52f1b722d1d7d8..5f4a54c55675950946eb3f4c6c9ebdfa53b5989a 100644 (file)
@@ -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;
 }
index 9ae3e78286c5091cb292512f0ec1002beda9a196..5429cefdcdad9da1d86e478c45934e8eeac79b33 100644 (file)
@@ -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;