Hi,

I have an IPv6 only host arrowhead.ip6.centroid.eu, that has very noisy:
 
Oct 29 09:12:48 arrowhead ntpd[18744]: DNS lookup tempfail
Oct 29 09:21:45 arrowhead last message repeated 2 times

in fact:

arrowhead# grep 'DNS lookup tempfail' /var/log/daemon | wc -l
    1354

This is because the pool.ntp.org servers as configured don't give back AAAA
answers.  I'm trying to streamline this a little and only ask for AAAA queries
if there is no v4 connectivity.  With change of the 'stdio dns' pledge to
'stdio inet dns' this is possible, when using another constraint from google.
There is no network traffic, just a route lookup if IPv4 is possible at all.

Here is my patch, under my sig.

-peter

Index: config.c
===================================================================
RCS file: /cvs/src/usr.sbin/ntpd/config.c,v
retrieving revision 1.32
diff -u -p -u -r1.32 config.c
--- config.c    7 Jul 2019 07:14:57 -0000       1.32
+++ config.c    6 Nov 2019 07:36:07 -0000
@@ -30,8 +30,9 @@
 
 #include "ntpd.h"
 
-struct ntp_addr        *host_ip(const char *);
-int             host_dns1(const char *, struct ntp_addr **, int);
+struct ntp_addr                *host_ip(const char *);
+int                    host_dns1(const char *, struct ntp_addr **, int);
+static int             test_v4_gw(void);
 
 static u_int32_t                maxid = 0;
 static u_int32_t                constraint_maxid = 0;
@@ -59,7 +60,7 @@ host_ip(const char *s)
        struct ntp_addr         *h = NULL;
 
        memset(&hints, 0, sizeof(hints));
-       hints.ai_family = AF_UNSPEC;
+       hints.ai_family = (test_v4_gw() == 0) ? AF_UNSPEC : AF_INET6;
        hints.ai_socktype = SOCK_DGRAM; /*dummy*/
        hints.ai_flags = AI_NUMERICHOST;
        if (getaddrinfo(s, "0", &hints, &res) == 0) {
@@ -94,7 +95,7 @@ host_dns1(const char *s, struct ntp_addr
        struct ntp_addr         *h, *hh = NULL;
 
        memset(&hints, 0, sizeof(hints));
-       hints.ai_family = AF_UNSPEC;
+       hints.ai_family = (test_v4_gw() == 0) ? AF_UNSPEC : AF_INET6;
        hints.ai_socktype = SOCK_DGRAM; /* DUMMY */
        hints.ai_flags = AI_ADDRCONFIG;
        error = getaddrinfo(s, NULL, &hints, &res0);
@@ -181,3 +182,28 @@ new_constraint(void)
        return (p);
 }
 
+static int
+test_v4_gw(void)
+{
+       struct sockaddr_in sin;
+       socklen_t st = sizeof(struct sockaddr_in);
+       int so;
+
+       so = socket(AF_INET, SOCK_DGRAM, 0);
+       if (so < 0) {
+               return 0;
+       }
+
+       memset(&sin, 0, sizeof(sin));
+       sin.sin_family = AF_INET;
+       sin.sin_addr.s_addr = inet_addr(CONN_CONSTRAINT);
+       sin.sin_port = htons(53);
+       
+       if (connect(so, (struct sockaddr *)&sin, st) < 0) {
+               close(so);
+               return 0;
+       }
+
+       close(so);
+       return 1;
+}
Index: ntp_dns.c
===================================================================
RCS file: /cvs/src/usr.sbin/ntpd/ntp_dns.c,v
retrieving revision 1.24
diff -u -p -u -r1.24 ntp_dns.c
--- ntp_dns.c   27 Jun 2019 15:18:42 -0000      1.24
+++ ntp_dns.c   6 Nov 2019 07:36:07 -0000
@@ -98,7 +98,7 @@ ntp_dns(struct ntpd_conf *nconf, struct 
                fatal(NULL);
        imsg_init(ibuf_dns, PARENT_SOCK_FILENO);
 
-       if (pledge("stdio dns", NULL) == -1)
+       if (pledge("stdio inet dns", NULL) == -1)
                err(1, "pledge");
 
        probe_root();
@@ -170,7 +170,7 @@ dns_dispatch_imsg(struct ntpd_conf *ncon
                            strlen(name) != len)
                                fatalx("invalid %s received", str);
                        if ((cnt = host_dns(name, nconf->status.synced,
-                           &hn)) == -1)
+                           &hn)) <= 0)
                                break;
                        buf = imsg_create(ibuf_dns, imsg.hdr.type,
                            imsg.hdr.peerid, 0,
Index: ntpd.h
===================================================================
RCS file: /cvs/src/usr.sbin/ntpd/ntpd.h,v
retrieving revision 1.146
diff -u -p -u -r1.146 ntpd.h
--- ntpd.h      16 Jul 2019 14:15:40 -0000      1.146
+++ ntpd.h      6 Nov 2019 07:36:07 -0000
@@ -40,6 +40,7 @@
 #define        CONFFILE        "/etc/ntpd.conf"
 #define DRIFTFILE      "/var/db/ntpd.drift"
 #define        CTLSOCKET       "/var/run/ntpd.sock"
+#define CONN_CONSTRAINT        "8.8.8.8"       /* to test connectivity */
 
 #define        INTERVAL_QUERY_NORMAL           30      /* sync to peers every 
n secs */
 #define        INTERVAL_QUERY_PATHETIC         60

Reply via email to