From 5fc49b081e877911de47a621cfd7ee536f08c613 Mon Sep 17 00:00:00 2001 From: Brent Cook Date: Tue, 30 Dec 2014 09:05:46 -0600 Subject: [PATCH 04/15] check if rdomain support is available. Handle FreeBSD's calling rdomain 'FIB'. - from naddy@openbsd.org --- src/usr.sbin/ntpd/ntpd.h | 6 ++++++ src/usr.sbin/ntpd/parse.y | 2 ++ src/usr.sbin/ntpd/server.c | 15 ++++++++++++++- 3 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/usr.sbin/ntpd/ntpd.h b/src/usr.sbin/ntpd/ntpd.h index 208d19ccdf..05493ad1b2 100644 --- a/src/usr.sbin/ntpd/ntpd.h +++ b/src/usr.sbin/ntpd/ntpd.h @@ -41,6 +41,12 @@ #define DRIFTFILE "/var/db/ntpd.drift" #define CTLSOCKET "/var/run/ntpd.sock" +#if defined(SO_SETFIB) +#define SO_RTABLE SO_SETFIB +#define SIOCGIFRDOMAIN SIOCGIFFIB +#define ifr_rdomainid ifr_fib +#endif + #define INTERVAL_QUERY_NORMAL 30 /* sync to peers every n secs */ #define INTERVAL_QUERY_PATHETIC 60 #define INTERVAL_QUERY_AGGRESSIVE 5 diff --git a/src/usr.sbin/ntpd/parse.y b/src/usr.sbin/ntpd/parse.y index fa84123903..610bd34731 100644 --- a/src/usr.sbin/ntpd/parse.y +++ b/src/usr.sbin/ntpd/parse.y @@ -480,11 +480,13 @@ weight : WEIGHT NUMBER { opts.weight = $2; } rtable : RTABLE NUMBER { +#ifdef RT_TABLEID_MAX if ($2 < 0 || $2 > RT_TABLEID_MAX) { yyerror("rtable must be between 1" " and RT_TABLEID_MAX"); YYERROR; } +#endif opts.rtable = $2; } ; diff --git a/src/usr.sbin/ntpd/server.c b/src/usr.sbin/ntpd/server.c index 123b6939a2..8c18eb7610 100644 --- a/src/usr.sbin/ntpd/server.c +++ b/src/usr.sbin/ntpd/server.c @@ -35,11 +35,16 @@ setup_listeners(struct servent *se, struct ntpd_conf *lconf, u_int *cnt) struct listen_addr *la, *nla, *lap; struct ifaddrs *ifa, *ifap; struct sockaddr *sa; +#ifdef SO_RTABLE struct if_data *ifd; +#endif u_int8_t *a6; size_t sa6len = sizeof(struct in6_addr); u_int new_cnt = 0; - int tos = IPTOS_LOWDELAY, rdomain = 0; + int tos = IPTOS_LOWDELAY; +#ifdef SO_RTABLE + int rdomain = 0; +#endif TAILQ_FOREACH(lap, &lconf->listen_addrs, entry) { switch (lap->sa.ss_family) { @@ -51,15 +56,19 @@ setup_listeners(struct servent *se, struct ntpd_conf *lconf, u_int *cnt) sa = ifap->ifa_addr; if (sa == NULL || SA_LEN(sa) == 0) continue; +#ifdef SO_RTABLE if (sa->sa_family == AF_LINK) { ifd = ifap->ifa_data; rdomain = ifd->ifi_rdomain; } +#endif if (sa->sa_family != AF_INET && sa->sa_family != AF_INET6) continue; +#ifdef SO_RTABLE if (lap->rtable != -1 && rdomain != lap->rtable) continue; +#endif if (sa->sa_family == AF_INET && ((struct sockaddr_in *)sa)->sin_addr.s_addr == @@ -78,7 +87,9 @@ setup_listeners(struct servent *se, struct ntpd_conf *lconf, u_int *cnt) fatal("setup_listeners calloc"); memcpy(&la->sa, sa, SA_LEN(sa)); +#ifdef SO_RTABLE la->rtable = rdomain; +#endif TAILQ_INSERT_TAIL(&lconf->listen_addrs, la, entry); } @@ -123,10 +134,12 @@ setup_listeners(struct servent *se, struct ntpd_conf *lconf, u_int *cnt) IPPROTO_IP, IP_TOS, &tos, sizeof(tos)) == -1) log_warn("setsockopt IPTOS_LOWDELAY"); +#ifdef SO_RTABLE if (la->rtable != -1 && setsockopt(la->fd, SOL_SOCKET, SO_RTABLE, &la->rtable, sizeof(la->rtable)) == -1) fatal("setup_listeners setsockopt SO_RTABLE"); +#endif if (bind(la->fd, (struct sockaddr *)&la->sa, SA_LEN((struct sockaddr *)&la->sa)) == -1) { -- 2.26.0