diff options
| author | David Lamparter <equinox@diac24.net> | 2019-12-11 13:33:36 +0100 |
|---|---|---|
| committer | David Lamparter <equinox@diac24.net> | 2019-12-11 13:33:36 +0100 |
| commit | 3286ca0750dc837d5e3e0d1a38aef64ea93c70a5 (patch) | |
| tree | ee643a572b7c20c56b2f2e218b48c3ff0c3a9d17 | |
| parent | 9e89da8c5572fa8589a89e1d43cac0fcd9248373 (diff) | |
lib,nhrpd,bgpd/bmp: pass resolver failure details
To keep the calling code agnostic of the DNS resolver libary used, pass
a strerror-style string instead of a status code that would need extra
handling.
Signed-off-by: David Lamparter <equinox@diac24.net>
| -rw-r--r-- | bgpd/bgp_bmp.c | 15 | ||||
| -rw-r--r-- | bgpd/bgp_bmp.h | 1 | ||||
| -rw-r--r-- | lib/resolver.c | 19 | ||||
| -rw-r--r-- | lib/resolver.h | 6 | ||||
| -rw-r--r-- | nhrpd/nhrp_nhs.c | 4 |
5 files changed, 28 insertions, 17 deletions
diff --git a/bgpd/bgp_bmp.c b/bgpd/bgp_bmp.c index b57af89eeb..b184c9f567 100644 --- a/bgpd/bgp_bmp.c +++ b/bgpd/bgp_bmp.c @@ -1662,14 +1662,16 @@ static void bmp_active_connect(struct bmp_active *ba) bmp_active_setup(ba); } -static void bmp_active_resolved(struct resolver_query *resq, int numaddrs, - union sockunion *addr) +static void bmp_active_resolved(struct resolver_query *resq, const char *errstr, + int numaddrs, union sockunion *addr) { struct bmp_active *ba = container_of(resq, struct bmp_active, resq); unsigned i; if (numaddrs <= 0) { - zlog_warn("bmp[%s]: hostname resolution failed", ba->hostname); + zlog_warn("bmp[%s]: hostname resolution failed: %s", + ba->hostname, errstr); + ba->last_err = errstr; ba->curretry += ba->curretry / 2; ba->addrpos = 0; ba->addrtotal = 0; @@ -1701,6 +1703,8 @@ static int bmp_active_thread(struct thread *t) THREAD_OFF(ba->t_read); THREAD_OFF(ba->t_write); + ba->last_err = NULL; + if (ba->socket == -1) { resolver_resolve(&ba->resq, AF_UNSPEC, ba->hostname, bmp_active_resolved); @@ -1713,8 +1717,9 @@ static int bmp_active_thread(struct thread *t) sockunion2str(&ba->addrs[ba->addrpos], buf, sizeof(buf)); if (ret < 0 || status != 0) { - zlog_warn("bmp[%s]: failed to connect to %s:%d", - ba->hostname, buf, ba->port); + ba->last_err = strerror(status); + zlog_warn("bmp[%s]: failed to connect to %s:%d: %s", + ba->hostname, buf, ba->port, ba->last_err); goto out_next; } diff --git a/bgpd/bgp_bmp.h b/bgpd/bgp_bmp.h index 9d270e808c..94a17f70da 100644 --- a/bgpd/bgp_bmp.h +++ b/bgpd/bgp_bmp.h @@ -182,6 +182,7 @@ struct bmp_active { unsigned addrpos, addrtotal; union sockunion addrs[8]; int socket; + const char *last_err; struct thread *t_timer, *t_read, *t_write; }; diff --git a/lib/resolver.c b/lib/resolver.c index 938ebd4143..1be47bd6e1 100644 --- a/lib/resolver.c +++ b/lib/resolver.c @@ -145,7 +145,8 @@ static void ares_address_cb(void *arg, int status, int timeouts, { struct resolver_query *query = (struct resolver_query *)arg; union sockunion addr[16]; - void (*callback)(struct resolver_query *, int, union sockunion *); + void (*callback)(struct resolver_query *, const char *, int, + union sockunion *); size_t i; callback = query->callback; @@ -153,9 +154,10 @@ static void ares_address_cb(void *arg, int status, int timeouts, if (status != ARES_SUCCESS) { if (resolver_debug) - zlog_debug("[%p] Resolving failed", query); + zlog_debug("[%p] Resolving failed (%s)", + query, ares_strerror(status)); - callback(query, -1, NULL); + callback(query, ares_strerror(status), -1, NULL); return; } @@ -177,25 +179,26 @@ static void ares_address_cb(void *arg, int status, int timeouts, if (resolver_debug) zlog_debug("[%p] Resolved with %d results", query, (int)i); - callback(query, i, &addr[0]); + callback(query, NULL, i, &addr[0]); } static int resolver_cb_literal(struct thread *t) { struct resolver_query *query = THREAD_ARG(t); - void (*callback)(struct resolver_query *, int, union sockunion *); + void (*callback)(struct resolver_query *, const char *, int, + union sockunion *); callback = query->callback; query->callback = NULL; - callback(query, 1, &query->literal_addr); + callback(query, ARES_SUCCESS, 1, &query->literal_addr); return 0; } void resolver_resolve(struct resolver_query *query, int af, const char *hostname, - void (*callback)(struct resolver_query *, int, - union sockunion *)) + void (*callback)(struct resolver_query *, const char *, + int, union sockunion *)) { int ret; diff --git a/lib/resolver.h b/lib/resolver.h index a418377a29..59bf0d0f55 100644 --- a/lib/resolver.h +++ b/lib/resolver.h @@ -14,7 +14,8 @@ #include "sockunion.h" struct resolver_query { - void (*callback)(struct resolver_query *, int n, union sockunion *); + void (*callback)(struct resolver_query *, const char *errstr, int n, + union sockunion *); /* used to immediate provide the result if IP literal is passed in */ union sockunion literal_addr; @@ -24,6 +25,7 @@ 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 *, - int, union sockunion *)); + const char *, int, + union sockunion *)); #endif /* _FRR_RESOLVER_H */ diff --git a/nhrpd/nhrp_nhs.c b/nhrpd/nhrp_nhs.c index 360972c327..bec6c014a0 100644 --- a/nhrpd/nhrp_nhs.c +++ b/nhrpd/nhrp_nhs.c @@ -238,8 +238,8 @@ nhrp_reg_by_nbma(struct nhrp_nhs *nhs, const union sockunion *nbma_addr) return NULL; } -static void nhrp_nhs_resolve_cb(struct resolver_query *q, int n, - union sockunion *addrs) +static void nhrp_nhs_resolve_cb(struct resolver_query *q, const char *errstr, + int n, union sockunion *addrs) { struct nhrp_nhs *nhs = container_of(q, struct nhrp_nhs, dns_resolve); struct nhrp_interface *nifp = nhs->ifp->info; |
