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)) {