]> git.proxmox.com Git - mirror_frr.git/commitdiff
lib: resolver per vrf support
authorPhilippe Guibert <philippe.guibert@6wind.com>
Thu, 29 Aug 2019 14:27:00 +0000 (16:27 +0200)
committerPhilippe Guibert <philippe.guibert@6wind.com>
Tue, 23 Nov 2021 08:02:23 +0000 (09:02 +0100)
add a parameter to resolver api that is the vrf identifier. this permits
to make resolution self to each vrf. in case vrf netns backend is used,
this is very practical, since resolution can happen on one netns, while
it is not the case in an other one.

Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
bgpd/bgp_bmp.c
lib/resolver.c
lib/resolver.h
nhrpd/nhrp_nhs.c
tests/lib/test_resolver.c

index 1bc3fd0dbae7226f5f78cfd2735b37b52345fe25..b4da22699996a8163f0a2a146798a62ccbeea001 100644 (file)
@@ -1833,6 +1833,7 @@ static int bmp_active_thread(struct thread *t)
        socklen_t slen;
        int status, ret;
        char buf[SU_ADDRSTRLEN];
+       vrf_id_t vrf_id;
 
        /* all 3 end up here, though only timer or read+write are active
         * at a time */
@@ -1843,7 +1844,12 @@ static int bmp_active_thread(struct thread *t)
        ba->last_err = NULL;
 
        if (ba->socket == -1) {
-               resolver_resolve(&ba->resq, AF_UNSPEC, ba->hostname,
+               /* get vrf_id */
+               if (!ba->targets || !ba->targets->bgp)
+                       vrf_id = VRF_DEFAULT;
+               else
+                       vrf_id = ba->targets->bgp->vrf_id;
+               resolver_resolve(&ba->resq, AF_UNSPEC, vrf_id, ba->hostname,
                                 bmp_active_resolved);
                return 0;
        }
index e3dba5f8aeb9e83f095ab39e8af7f0bfe7fc07a1..29138bbc8dc0ec3440d1c8d8c944f4817b5961ae 100644 (file)
@@ -21,6 +21,7 @@
 #include "resolver.h"
 #include "command.h"
 #include "xref.h"
+#include "vrf.h"
 
 XREF_SETUP();
 
@@ -244,7 +245,7 @@ static int resolver_cb_literal(struct thread *t)
        return 0;
 }
 
-void resolver_resolve(struct resolver_query *query, int af,
+void resolver_resolve(struct resolver_query *query, int af, vrf_id_t vrf_id,
                      const char *hostname,
                      void (*callback)(struct resolver_query *, const char *,
                                       int, union sockunion *))
@@ -279,7 +280,18 @@ void resolver_resolve(struct resolver_query *query, int af,
        if (resolver_debug)
                zlog_debug("[%p] Resolving '%s'", query, hostname);
 
+       ret = vrf_switch_to_netns(vrf_id);
+       if (ret < 0) {
+               flog_err_sys(EC_LIB_SOCKET, "%s: Can't switch to VRF %u (%s)",
+                            __func__, vrf_id, safe_strerror(errno));
+               return;
+       }
        ares_gethostbyname(state.channel, hostname, af, ares_address_cb, query);
+       ret = vrf_switchback_to_initial();
+       if (ret < 0)
+               flog_err_sys(EC_LIB_SOCKET,
+                            "%s: Can't switchback from VRF %u (%s)", __func__,
+                            vrf_id, safe_strerror(errno));
        resolver_update_timeouts(&state);
 }
 
index 5f922dcb579916b480c6c62f5d7f6cbc5a62f9a1..988449693c37c4dd5e448750616878fea1570c62 100644 (file)
@@ -27,10 +27,10 @@ struct resolver_query {
 };
 
 void resolver_init(struct thread_master *tm);
-void resolver_resolve(struct resolver_query *query, int af,
-                     const char *hostname, void (*cb)(struct resolver_query *,
-                                                      const char *, int,
-                                                      union sockunion *));
+void resolver_resolve(struct resolver_query *query, int af, vrf_id_t vrf_id,
+                     const char *hostname,
+                     void (*cb)(struct resolver_query *, const char *, int,
+                                union sockunion *));
 
 #ifdef __cplusplus
 }
index 597c125e17b17594f8cf916b46e1ff3816887982..3733910a639ba7030c8200a7b7aade97b1db219e 100644 (file)
@@ -324,8 +324,8 @@ static int nhrp_nhs_resolve(struct thread *t)
 {
        struct nhrp_nhs *nhs = THREAD_ARG(t);
 
-       resolver_resolve(&nhs->dns_resolve, AF_INET, nhs->nbma_fqdn,
-                        nhrp_nhs_resolve_cb);
+       resolver_resolve(&nhs->dns_resolve, AF_INET, VRF_DEFAULT,
+                        nhs->nbma_fqdn, nhrp_nhs_resolve_cb);
 
        return 0;
 }
index 0b3dccc820b1dba858e81e8e0811d9e333ddf5c1..6a582cceaff90bf62ab57f9e903aa0ceb6eaf2f5 100644 (file)
@@ -63,7 +63,7 @@ DEFUN (test_resolve,
        "DNS resolver\n"
        "Name to resolve\n")
 {
-       resolver_resolve(&query, AF_UNSPEC, argv[1]->arg, resolver_result);
+       resolver_resolve(&query, AF_UNSPEC, 0, argv[1]->arg, resolver_result);
        return CMD_SUCCESS;
 }