ntp: allow wildcard in hwtimestamp directive
If "*" was specified, use getifaddrs() to get a list of all interfaces, and try to enable HW timestamping on all of them.
This commit is contained in:
parent
88c31b3785
commit
db312a5ff6
2 changed files with 55 additions and 3 deletions
|
@ -1800,6 +1800,9 @@ interfaces. The timestamping used in measurements is indicated in the
|
||||||
_measurements.log_ file if enabled by the <<log,*log measurements*>> directive,
|
_measurements.log_ file if enabled by the <<log,*log measurements*>> directive,
|
||||||
and the <<chronyc.adoc#ntpdata,*ntpdata*>> report in *chronyc*.
|
and the <<chronyc.adoc#ntpdata,*ntpdata*>> report in *chronyc*.
|
||||||
+
|
+
|
||||||
|
If the specified interface is _*_, *chronyd* will try to enable HW timestamping
|
||||||
|
on all available interfaces.
|
||||||
|
+
|
||||||
An example of the directive is:
|
An example of the directive is:
|
||||||
+
|
+
|
||||||
----
|
----
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
|
|
||||||
#include "sysincl.h"
|
#include "sysincl.h"
|
||||||
|
|
||||||
|
#include <ifaddrs.h>
|
||||||
#include <linux/errqueue.h>
|
#include <linux/errqueue.h>
|
||||||
#include <linux/ethtool.h>
|
#include <linux/ethtool.h>
|
||||||
#include <linux/net_tstamp.h>
|
#include <linux/net_tstamp.h>
|
||||||
|
@ -90,9 +91,16 @@ add_interface(const char *name)
|
||||||
struct hwtstamp_config ts_config;
|
struct hwtstamp_config ts_config;
|
||||||
struct ifreq req;
|
struct ifreq req;
|
||||||
int sock_fd, if_index, phc_index, phc_fd;
|
int sock_fd, if_index, phc_index, phc_fd;
|
||||||
|
unsigned int i;
|
||||||
struct Interface *iface;
|
struct Interface *iface;
|
||||||
char phc_path[64];
|
char phc_path[64];
|
||||||
|
|
||||||
|
/* Check if the interface was not already added */
|
||||||
|
for (i = 0; i < ARR_GetSize(interfaces); i++) {
|
||||||
|
if (!strcmp(name, ((struct Interface *)ARR_GetElement(interfaces, i))->name))
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
|
sock_fd = socket(AF_INET, SOCK_DGRAM, 0);
|
||||||
if (sock_fd < 0)
|
if (sock_fd < 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -160,11 +168,37 @@ add_interface(const char *name)
|
||||||
|
|
||||||
iface->clock = HCL_CreateInstance();
|
iface->clock = HCL_CreateInstance();
|
||||||
|
|
||||||
|
DEBUG_LOG(LOGF_NtpIOLinux, "Enabled HW timestamping on %s", name);
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* ================================================== */
|
/* ================================================== */
|
||||||
|
|
||||||
|
static int
|
||||||
|
add_all_interfaces(void)
|
||||||
|
{
|
||||||
|
struct ifaddrs *ifaddr, *ifa;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
if (getifaddrs(&ifaddr)) {
|
||||||
|
DEBUG_LOG(LOGF_NtpIOLinux, "getifaddrs() failed : %s", strerror(errno));
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (r = 0, ifa = ifaddr; ifa; ifa = ifa->ifa_next) {
|
||||||
|
if (add_interface(ifa->ifa_name))
|
||||||
|
r = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
freeifaddrs(ifaddr);
|
||||||
|
|
||||||
|
/* Return success if at least one interface was added */
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ================================================== */
|
||||||
|
|
||||||
static void
|
static void
|
||||||
update_interface_speed(struct Interface *iface)
|
update_interface_speed(struct Interface *iface)
|
||||||
{
|
{
|
||||||
|
@ -202,19 +236,34 @@ NIO_Linux_Initialise(void)
|
||||||
ARR_Instance config_hwts_ifaces;
|
ARR_Instance config_hwts_ifaces;
|
||||||
char *if_name;
|
char *if_name;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
int wildcard, hwts;
|
||||||
|
|
||||||
interfaces = ARR_CreateInstance(sizeof (struct Interface));
|
interfaces = ARR_CreateInstance(sizeof (struct Interface));
|
||||||
|
|
||||||
config_hwts_ifaces = CNF_GetHwTsInterfaces();
|
config_hwts_ifaces = CNF_GetHwTsInterfaces();
|
||||||
|
|
||||||
/* Enable HW timestamping on all specified interfaces. If no interface was
|
/* Enable HW timestamping on specified interfaces. If "*" was specified, try
|
||||||
specified, use SW timestamping. */
|
all interfaces. If no interface was specified, enable SW timestamping. */
|
||||||
if (ARR_GetSize(config_hwts_ifaces)) {
|
|
||||||
|
for (i = wildcard = 0; i < ARR_GetSize(config_hwts_ifaces); i++) {
|
||||||
|
if (!strcmp("*", *(char **)ARR_GetElement(config_hwts_ifaces, i)))
|
||||||
|
wildcard = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!wildcard && ARR_GetSize(config_hwts_ifaces)) {
|
||||||
for (i = 0; i < ARR_GetSize(config_hwts_ifaces); i++) {
|
for (i = 0; i < ARR_GetSize(config_hwts_ifaces); i++) {
|
||||||
if_name = *(char **)ARR_GetElement(config_hwts_ifaces, i);
|
if_name = *(char **)ARR_GetElement(config_hwts_ifaces, i);
|
||||||
if (!add_interface(if_name))
|
if (!add_interface(if_name))
|
||||||
LOG_FATAL(LOGF_NtpIO, "Could not enable HW timestamping on %s", if_name);
|
LOG_FATAL(LOGF_NtpIO, "Could not enable HW timestamping on %s", if_name);
|
||||||
}
|
}
|
||||||
|
hwts = 1;
|
||||||
|
} else if (wildcard && add_all_interfaces()) {
|
||||||
|
hwts = 1;
|
||||||
|
} else {
|
||||||
|
hwts = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hwts) {
|
||||||
ts_flags = SOF_TIMESTAMPING_RAW_HARDWARE | SOF_TIMESTAMPING_RX_HARDWARE;
|
ts_flags = SOF_TIMESTAMPING_RAW_HARDWARE | SOF_TIMESTAMPING_RX_HARDWARE;
|
||||||
ts_tx_flags = SOF_TIMESTAMPING_TX_HARDWARE;
|
ts_tx_flags = SOF_TIMESTAMPING_TX_HARDWARE;
|
||||||
} else {
|
} else {
|
||||||
|
|
Loading…
Reference in a new issue