ntpd may needs to be instructed to stay away from interfaces that are ports in bridges and aggregates.
And only use the ones we want
ntpd can operate as unicast server for any permitting restriction, an additional directive is used to produce autonomous multicasts sent out of the specified interface, with the source IPv6 address of that interface.
Although extra lines might be added to send from other interfaces, it is neater to decide on a primary source interface, specified here, and copy to others with smcroute
If autokey is configured, instead:
Recently it has been possible to add mostly any ntp.conf file rule whilst ntpd is running. This is most useful to add client lines as these require a connection to the associated server to be live to work.
Using a script from NetworkManager dispatcher directory, or dhcp client, to prod ntpd when the interface is ready
ntpdc wants to open /dev/tty to get your password, but it can be tricked with expect.
Change multicastclient ff05:101%${IFACE}
to a line like pool ntp.example
for a unicast client
Example for option gsm card
Though it does not need a sim card in it for the gps receiver to work, ModemManager might not like that idea so it has to be activated manually.
Can try activating via gpsdctl add /dev/ttyHS1 or manually
ptpd can be used to get more precision and interoperates with ntpd, where ntp can get time from the internet and serve it to sntp stations, and ptpd or ptp4l where supported, can serve to ptp downstreams.
It supports multicasting with raw ethernet and udp modes, and there is provision in windows 10 though that only takes IPV4 udp, not ipv6 or raw ethernet for the time being.
Whilst still in beta the only configuration interface is with the registry and some items are barely documented, and discovered by loading ptpprov.dll into notepad, and search utf-16 spaced words, although another way is to use procmon and filter "Path" on the registry branch TimeProviders/PtpClient to discover values that are actually read.
ChosenMcastIfIpAddr selects the interface via an assigned IPv4 address.
HWTSEnabledIfIpAddr could be for the physical related interface if the mcast one is a virtual bridge.
Other recommendable registry adjustments include RealTimeIsUniversal to treat the system RTC better, and ShowSecondsInSystemClock to exhibit the system improved accuracy after PTP can work!
NtpClient and VMICTimeProvider could be disabled for testing purposes as microsoft suggest, so the system has to use PTP, and apply the powershell rules to open up the firewall for PTP-319 and PTP-320. In normal operation, it is useful to have both NTPClient and PTPClient active, so the system can try to fallback to NTP, if PTP does stop working, rather than just go adrift.
To troubleshoot, wireshark, and a batch.cmd can be used, invoked from an Administrator cmd even when the "user" account is logged in.
Also, check netsh interface ipv4 show joins for 224.0.1.129, which has references not zero when either the test client is running from w32tm /ptp_monitor or the normal one when Enabled is set in PtpClient in the registry
Unlike W10, Windows 11 appears to not use ChosenMcastIfIpAddr and instead joins on all interfaces, using only PtpMasters if AllowAnyMaster is zero.
With the tasklist, find the PID associated with the instance of svchost.exe that handles W32Time, and use that with live mirrorable microsoft sysinternals procmon64 to have a detailed examination of what is happening. Internet (not private!) windows may be able to have the microsoft store version of sysinternals, and benefit from updates, until mirrorability of ms store can be established.
There other log to check is the event viewer, in compmgmt.msc where there is a Time-Service-PTP-Provider that provides 512 as a trying code, 514 for some failure, confirmation that everything is working with a 513 return code.
If the microsoft hybrid ptpd template is taken for master, probably causes are that the ptpd needs to set PTP_TIMESCALE and PTP_UTC_REASONABLE in flags for windows to accept it as a master, and needs to send announces more often than AnnounceInterval of 4 seconds, once a second seems to work.