- From e476ea0fbf67062c3c63ea5393fb58e9c2f6a097 Mon Sep 17 00:00:00 2001
- From: Brent Cook <busterb@gmail.com>
- Date: Tue, 30 Dec 2014 09:05:46 -0600
- Subject: [PATCH 05/12] check if rdomain support is available.
-
- Handle FreeBSD's calling rdomain 'FIB'.
- - from naddy@openbsd.org
- ---
- src/usr.sbin/ntpd/client.c | 4 ++++
- src/usr.sbin/ntpd/ntpd.h | 6 ++++++
- src/usr.sbin/ntpd/parse.y | 2 ++
- src/usr.sbin/ntpd/server.c | 15 ++++++++++++++-
- 4 files changed, 26 insertions(+), 1 deletion(-)
-
- diff --git a/src/usr.sbin/ntpd/client.c b/src/usr.sbin/ntpd/client.c
- index e717d69..2be1f93 100644
- --- a/src/usr.sbin/ntpd/client.c
- +++ b/src/usr.sbin/ntpd/client.c
- @@ -149,10 +149,12 @@ client_query(struct ntp_peer *p)
- fatal("client_query socket");
- }
-
- +#ifdef SO_RTABLE
- if (p->rtable != -1 &&
- setsockopt(p->query->fd, SOL_SOCKET, SO_RTABLE,
- &p->rtable, sizeof(p->rtable)) == -1)
- fatal("client_query setsockopt SO_RTABLE");
- +#endif
- if (connect(p->query->fd, sa, SA_LEN(sa)) == -1) {
- if (errno == ECONNREFUSED || errno == ENETUNREACH ||
- errno == EHOSTUNREACH || errno == EADDRNOTAVAIL) {
- @@ -255,10 +257,12 @@ client_dispatch(struct ntp_peer *p, u_int8_t settime)
- return (0);
- }
-
- +#ifdef SO_RTABLE
- if (p->rtable != -1 &&
- setsockopt(p->query->fd, SOL_SOCKET, SO_RTABLE, &p->rtable,
- sizeof(p->rtable)) == -1)
- fatal("client_dispatch setsockopt SO_RTABLE");
- +#endif
-
- for (cmsg = CMSG_FIRSTHDR(&somsg); cmsg != NULL;
- cmsg = CMSG_NXTHDR(&somsg, cmsg)) {
- diff --git a/src/usr.sbin/ntpd/ntpd.h b/src/usr.sbin/ntpd/ntpd.h
- index de4cd84..1402d74 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 4b9ef49..375f609 100644
- --- a/src/usr.sbin/ntpd/parse.y
- +++ b/src/usr.sbin/ntpd/parse.y
- @@ -412,11 +412,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 ef448d3..618cd8f 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.4.3.573.g4eafbef
-
|