From f2da253bc3f8226915ee56990151c3c43e4aa423 Mon Sep 17 00:00:00 2001 From: Miroslav Lichvar Date: Tue, 6 Jun 2017 17:20:03 +0200 Subject: [PATCH] ntp: add option to select HW RX timestamping filter Add an rxfilter option to the hwtimestamp directive to select which received packets should be timestamped. It can be set to "none", "ntp", or "all". The default value is ntp, which falls back to all when ntp is not supported. --- conf.c | 14 +++++++++++++- conf.h | 5 +++++ ntp_io_linux.c | 20 ++++++++++++++++---- 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/conf.c b/conf.c index 6fa5eee..2b9d376 100644 --- a/conf.c +++ b/conf.c @@ -1259,7 +1259,7 @@ static void parse_hwtimestamp(char *line) { CNF_HwTsInterface *iface; - char *p; + char *p, filter[5]; int n; if (!*line) { @@ -1274,6 +1274,7 @@ parse_hwtimestamp(char *line) iface->name = Strdup(p); iface->minpoll = 0; iface->nocrossts = 0; + iface->rxfilter = CNF_HWTS_RXFILTER_NTP; iface->precision = 100.0e-9; iface->tx_comp = 0.0; iface->rx_comp = 0.0; @@ -1293,6 +1294,17 @@ parse_hwtimestamp(char *line) } else if (!strcasecmp(p, "txcomp")) { if (sscanf(line, "%lf%n", &iface->tx_comp, &n) != 1) break; + } else if (!strcasecmp(p, "rxfilter")) { + if (sscanf(line, "%4s%n", filter, &n) != 1) + break; + if (!strcasecmp(filter, "none")) + iface->rxfilter = CNF_HWTS_RXFILTER_NONE; + else if (!strcasecmp(filter, "ntp")) + iface->rxfilter = CNF_HWTS_RXFILTER_NTP; + else if (!strcasecmp(filter, "all")) + iface->rxfilter = CNF_HWTS_RXFILTER_ALL; + else + break; } else if (!strcasecmp(p, "nocrossts")) { n = 0; iface->nocrossts = 1; diff --git a/conf.h b/conf.h index 7128e6e..0dde153 100644 --- a/conf.h +++ b/conf.h @@ -118,10 +118,15 @@ extern char *CNF_GetHwclockFile(void); extern int CNF_GetInitSources(void); extern double CNF_GetInitStepThreshold(void); +#define CNF_HWTS_RXFILTER_NONE 0 +#define CNF_HWTS_RXFILTER_NTP 1 +#define CNF_HWTS_RXFILTER_ALL 2 + typedef struct { char *name; int minpoll; int nocrossts; + int rxfilter; double precision; double tx_comp; double rx_comp; diff --git a/ntp_io_linux.c b/ntp_io_linux.c index 52d0e3a..5a50677 100644 --- a/ntp_io_linux.c +++ b/ntp_io_linux.c @@ -152,12 +152,24 @@ add_interface(CNF_HwTsInterface *conf_iface) ts_config.flags = 0; ts_config.tx_type = HWTSTAMP_TX_ON; + + switch (conf_iface->rxfilter) { + case CNF_HWTS_RXFILTER_NONE: + ts_config.rx_filter = HWTSTAMP_FILTER_NONE; + break; + case CNF_HWTS_RXFILTER_NTP: #ifdef HAVE_LINUX_TIMESTAMPING_RXFILTER_NTP - if (ts_info.rx_filters & (1 << HWTSTAMP_FILTER_NTP_ALL)) - ts_config.rx_filter = HWTSTAMP_FILTER_NTP_ALL; - else + if (ts_info.rx_filters & (1 << HWTSTAMP_FILTER_NTP_ALL)) { + ts_config.rx_filter = HWTSTAMP_FILTER_NTP_ALL; + break; + } #endif - ts_config.rx_filter = HWTSTAMP_FILTER_ALL; + /* Fall through */ + default: + ts_config.rx_filter = HWTSTAMP_FILTER_ALL; + break; + } + req.ifr_data = (char *)&ts_config; if (ioctl(sock_fd, SIOCSHWTSTAMP, &req)) {