]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: resolvers: add unique numeric id to nameservers
authorAurelien DARRAGON <adarragon@haproxy.com>
Mon, 4 Dec 2023 14:34:32 +0000 (15:34 +0100)
committerChristopher Faulet <cfaulet@haproxy.com>
Thu, 21 Dec 2023 13:22:27 +0000 (14:22 +0100)
When we want to avoid keeping pointers on a nameserver struct, it's not
always convenient to refer as a nameserver using it's text-based unique
identifier since it's not limited in length thus it cannot be serialized
and deserialized safely.

To address this limitation, we add a new ->puid member in dns_nameserver
struct which is a parent-unique numeric value that can be used to refer
to the dns nameserver within its parent resolver context.

To achieve this, we reused the resolver->nb_nameserver member that wasn't
used. Each time we add a new nameserver to a resolver: we set ns->puid to
the current number of nameservers within the resolver and we increment
this number right away.

Public helper function find_nameserver_by_resolvers_and_id() was added to
help retrieve nameserver pointer from (resolver X nameserver puid)
combination.

include/haproxy/dns-t.h
include/haproxy/resolvers-t.h
include/haproxy/resolvers.h
src/resolvers.c

index 1c876e306673b493aab08a9829a5497b148bcca7..245169bc59da227a56f49072d5e51c9847c91404 100644 (file)
@@ -136,6 +136,7 @@ struct dns_session {
 struct dns_nameserver {
        char *id;                       /* nameserver unique identifier */
        void *parent;
+       unsigned int puid;              /* parent-unique numeric id */
        struct {
                const char *file;       /* file where the section appears */
                int         line;       /* line where the section appears */
index b7274630c4198b78b4a7a2866436d73420aabc9d..9d291614d2474b94165be90024d2215c619c8b7e 100644 (file)
@@ -134,7 +134,7 @@ struct resolv_response {
 struct resolvers {
        __decl_thread(HA_SPINLOCK_T lock);
        unsigned int accepted_payload_size; /* maximum payload size we accept for responses */
-       int          nb_nameservers;        /* total number of active nameservers in a resolvers section */
+       int          nb_nameservers;        /* total number of nameservers in a resolvers section */
        int          resolve_retries;       /* number of retries before giving up */
        struct {                            /* time to: */
                int resolve;                /*     wait between 2 queries for the same resolution */
index 70dd0978a86e486f4579759e940e702f4d852dda..d4054b65fe04ad2bcba2a2cd59cd084ca13a9bc5 100644 (file)
@@ -34,6 +34,7 @@ extern struct list sec_resolvers;
 extern unsigned int resolv_failed_resolutions;
 
 struct resolvers *find_resolvers_by_id(const char *id);
+struct dns_nameserver *find_nameserver_by_resolvers_and_id(struct resolvers *parent, unsigned int id);
 struct resolv_srvrq *find_srvrq_by_name(const char *name, struct proxy *px);
 struct resolv_srvrq *new_resolv_srvrq(struct server *srv, char *fqdn);
 struct resolv_answer_item *find_srvrq_answer_record(const struct resolv_requester *requester);
index 3275cd22d094646784c1b90a791a23beee96e1bf..762b818a0778d296c4f304777a50fa1eb13f7f5c 100644 (file)
@@ -170,6 +170,20 @@ struct resolvers *find_resolvers_by_id(const char *id)
        return NULL;
 }
 
+/* Returns a pointer to the nameserver matching numerical <id> within <parent>
+ * resolver section. NULL is returned if no match is found.
+ */
+struct dns_nameserver *find_nameserver_by_resolvers_and_id(struct resolvers *parent, unsigned int id)
+{
+       struct dns_nameserver *ns;
+
+       list_for_each_entry(ns, &parent->nameservers, list) {
+               if (ns->puid == id)
+                       return ns;
+       }
+       return NULL;
+}
+
 /* Returns a pointer on the SRV request matching the name <name> for the proxy
  * <px>. NULL is returned if no match is found.
  */
@@ -3371,7 +3385,9 @@ static int parse_resolve_conf(char **errmsg, char **warnmsg)
                newnameserver->parent = curr_resolvers;
                newnameserver->process_responses = resolv_process_responses;
                newnameserver->conf.line = resolv_linenum;
+               newnameserver->puid = curr_resolvers->nb_nameservers;
                LIST_APPEND(&curr_resolvers->nameservers, &newnameserver->list);
+               curr_resolvers->nb_nameservers++;
        }
 
 resolv_out:
@@ -3428,6 +3444,7 @@ static int resolvers_new(struct resolvers **resolvers, const char *id, const cha
        r->timeout.resolve = 1000;
        r->timeout.retry   = 1000;
        r->resolve_retries = 3;
+       r->nb_nameservers = 0;
        LIST_INIT(&r->nameservers);
        LIST_INIT(&r->resolutions.curr);
        LIST_INIT(&r->resolutions.wait);
@@ -3572,8 +3589,10 @@ int cfg_parse_resolvers(const char *file, int linenum, char **args, int kwm)
                newnameserver->parent = curr_resolvers;
                newnameserver->process_responses = resolv_process_responses;
                newnameserver->conf.line = linenum;
+               newnameserver->puid = curr_resolvers->nb_nameservers;
                /* the nameservers are linked backward first */
                LIST_APPEND(&curr_resolvers->nameservers, &newnameserver->list);
+               curr_resolvers->nb_nameservers++;
        }
        else if (strcmp(args[0], "parse-resolv-conf") == 0) {
                err_code |= parse_resolve_conf(&errmsg, &warnmsg);