summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLucas Christian <lucas@lucasec.com>2024-08-08 23:36:09 -0700
committerChristian Breunig <christian@breunig.cc>2024-09-21 08:51:28 +0200
commitbf5805c52b7133ec76edeebac33f3c30b56b169f (patch)
tree23a9aebfa768dd604762c8e5ba16f8e72755190b
parente504e0cac55725e93f21322877bb7d0c4f97c992 (diff)
downloadvyos-1x-bf5805c52b7133ec76edeebac33f3c30b56b169f.tar.gz
vyos-1x-bf5805c52b7133ec76edeebac33f3c30b56b169f.zip
T6630: ntp: add hardware timestamp offload
-rw-r--r--data/templates/chrony/chrony.conf.j211
-rw-r--r--interface-definitions/service_ntp.xml.in60
-rwxr-xr-xsmoketest/scripts/cli/test_service_ntp.py30
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)