diff options
author | Lucas Christian <lucas@lucasec.com> | 2024-08-08 23:36:09 -0700 |
---|---|---|
committer | Christian Breunig <christian@breunig.cc> | 2024-09-21 08:51:28 +0200 |
commit | bf5805c52b7133ec76edeebac33f3c30b56b169f (patch) | |
tree | 23a9aebfa768dd604762c8e5ba16f8e72755190b | |
parent | e504e0cac55725e93f21322877bb7d0c4f97c992 (diff) | |
download | vyos-1x-bf5805c52b7133ec76edeebac33f3c30b56b169f.tar.gz vyos-1x-bf5805c52b7133ec76edeebac33f3c30b56b169f.zip |
T6630: ntp: add hardware timestamp offload
-rw-r--r-- | data/templates/chrony/chrony.conf.j2 | 11 | ||||
-rw-r--r-- | interface-definitions/service_ntp.xml.in | 60 | ||||
-rwxr-xr-x | smoketest/scripts/cli/test_service_ntp.py | 30 |
3 files changed, 101 insertions, 0 deletions
diff --git a/data/templates/chrony/chrony.conf.j2 b/data/templates/chrony/chrony.conf.j2 index 86c20a4d8..838813866 100644 --- a/data/templates/chrony/chrony.conf.j2 +++ b/data/templates/chrony/chrony.conf.j2 @@ -66,3 +66,14 @@ bindaddress {{ address }} binddevice {{ interface }} {% endif %} {% endif %} + +{% if offload.timestamp.interface is vyos_defined %} +# Enable hardware timestamping on the specified interfaces +{% for interface, config in offload.timestamp.interface.items() %} +hwtimestamp {{ interface }} {{- ' rxfilter ' ~ config.receive_filter if config.receive_filter is vyos_defined }} +{% endfor %} +{% endif %} +{% if offload.timestamp.default_enable is vyos_defined %} +# Enable hardware timestamping on all supported interfaces not otherwise configured +hwtimestamp * +{% endif %} diff --git a/interface-definitions/service_ntp.xml.in b/interface-definitions/service_ntp.xml.in index eca0ada63..005499abd 100644 --- a/interface-definitions/service_ntp.xml.in +++ b/interface-definitions/service_ntp.xml.in @@ -13,6 +13,66 @@ #include <include/generic-interface.xml.i> #include <include/listen-address.xml.i> #include <include/interface/vrf.xml.i> + <node name="offload"> + <properties> + <help>Configurable offload options</help> + </properties> + <children> + <node name="timestamp"> + <properties> + <help>Enable timestamping of packets in the NIC hardware</help> + </properties> + <children> + <leafNode name="default-enable"> + <properties> + <help>Enable timestamping on all supported interfaces</help> + <valueless/> + </properties> + </leafNode> + <tagNode name="interface"> + <properties> + <help>Interface to enable timestamping on</help> + <completionHelp> + <script>${vyos_completion_dir}/list_interfaces</script> + </completionHelp> + <valueHelp> + <format>txt</format> + <description>Interface name</description> + </valueHelp> + <constraint> + #include <include/constraint/interface-name.xml.i> + </constraint> + </properties> + <children> + <leafNode name="receive-filter"> + <properties> + <help>Selects which inbound packets are timestamped by the NIC</help> + <completionHelp> + <list>all ntp none</list> + </completionHelp> + <valueHelp> + <format>all</format> + <description>All received packets are timestamped</description> + </valueHelp> + <valueHelp> + <format>ntp</format> + <description>Only NTP packets are timestamped</description> + </valueHelp> + <valueHelp> + <format>none</format> + <description>No received packets are timestamped</description> + </valueHelp> + <constraint> + <regex>(all|ntp|none)</regex> + </constraint> + </properties> + </leafNode> + </children> + </tagNode> + </children> + </node> + </children> + </node> <leafNode name="leap-second"> <properties> <help>Leap second behavior</help> diff --git a/smoketest/scripts/cli/test_service_ntp.py b/smoketest/scripts/cli/test_service_ntp.py index fe6b1a529..644894914 100755 --- a/smoketest/scripts/cli/test_service_ntp.py +++ b/smoketest/scripts/cli/test_service_ntp.py @@ -194,5 +194,35 @@ class TestSystemNTP(VyOSUnitTestSHIM.TestCase): for server in servers: self.assertIn(f'server {server} iburst ' + ' '.join(options) + ' xleave', config) + def test_offload_timestamp_default(self): + # Test offloading of NIC timestamp + servers = ['192.0.2.1', '192.0.2.2'] + options = ['prefer'] + + for server in servers: + for option in options: + self.cli_set(base_path + ['server', server, option]) + + self.cli_set(base_path + ['offload', 'timestamp', 'default-enable']) + + # commit changes + self.cli_commit() + + # Check generated configuration + # this file must be read with higher permissions + config = cmd(f'sudo cat {NTP_CONF}') + self.assertIn('driftfile /run/chrony/drift', config) + self.assertIn('dumpdir /run/chrony', config) + self.assertIn('ntsdumpdir /run/chrony', config) + self.assertIn('clientloglimit 1048576', config) + self.assertIn('rtcsync', config) + self.assertIn('makestep 1.0 3', config) + self.assertIn('leapsectz right/UTC', config) + + for server in servers: + self.assertIn(f'server {server} iburst ' + ' '.join(options), config) + + self.assertIn('hwtimestamp *', config) + if __name__ == '__main__': unittest.main(verbosity=2) |