From 127013ae0d4a99d69607a6223b5f62efd984024b Mon Sep 17 00:00:00 2001 From: David Venhoek Date: Mon, 7 Oct 2024 10:21:31 +0200 Subject: [PATCH] Added configurable minor version number. --- docs/man/statime.toml.5.md | 3 + docs/precompiled/man/statime.8 | 2 +- docs/precompiled/man/statime.toml.5 | 7 +- statime-linux/src/config/mod.rs | 8 +++ statime/src/config/port.rs | 5 +- .../src/datastructures/messages/announce.rs | 5 +- statime/src/datastructures/messages/header.rs | 39 +++++----- statime/src/datastructures/messages/mod.rs | 39 +++++++--- statime/src/overlay_clock.rs | 12 ++-- statime/src/port/master.rs | 39 ++++++++-- statime/src/port/mod.rs | 10 ++- statime/src/port/slave.rs | 72 +++++++++++-------- statime/src/shared_clock.rs | 14 ++-- 13 files changed, 168 insertions(+), 87 deletions(-) diff --git a/docs/man/statime.toml.5.md b/docs/man/statime.toml.5.md index 29572f8c7..2e152c20b 100644 --- a/docs/man/statime.toml.5.md +++ b/docs/man/statime.toml.5.md @@ -84,3 +84,6 @@ will be indicated by each configuration setting shown. A clock identity is encoded as a 16-character hexadecimal string, for example `acceptable-master-list = ["00FFFFFFFFFFFFFB"]`. The default is to accept all clock identities. + +`minor-ptp-version` = *version number* (**1**) +: Set a different minor ptp version. Should be either 1 or 0, intended to work around misbehaving ptp 2.0 hardware diff --git a/docs/precompiled/man/statime.8 b/docs/precompiled/man/statime.8 index c42fb78da..0d4f6de81 100644 --- a/docs/precompiled/man/statime.8 +++ b/docs/precompiled/man/statime.8 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pandoc 3.4 +.\" Automatically generated by Pandoc 3.5 .\" .TH "STATIME" "8" "" "statime 0.2.2" "statime" .SH NAME diff --git a/docs/precompiled/man/statime.toml.5 b/docs/precompiled/man/statime.toml.5 index 0b26006a9..bfa9240e6 100644 --- a/docs/precompiled/man/statime.toml.5 +++ b/docs/precompiled/man/statime.toml.5 @@ -1,4 +1,4 @@ -.\" Automatically generated by Pandoc 3.4 +.\" Automatically generated by Pandoc 3.5 .\" .TH "STATIME.TOML" "5" "" "statime 0.2.2" "statime" .SH NAME @@ -102,3 +102,8 @@ A clock identity is encoded as a 16\-character hexadecimal string, for example \f[CR]acceptable\-master\-list = [\[dq]00FFFFFFFFFFFFFB\[dq]]\f[R]. The default is to accept all clock identities. +.TP +\f[CR]minor\-ptp\-version\f[R] = \f[I]version number\f[R] (\f[B]1\f[R]) +Set a different minor ptp version. +Should be either 1 or 0, intended to work around misbehaving ptp 2.0 +hardware diff --git a/statime-linux/src/config/mod.rs b/statime-linux/src/config/mod.rs index bb8eeda6e..3f8a7dd08 100644 --- a/statime-linux/src/config/mod.rs +++ b/statime-linux/src/config/mod.rs @@ -64,6 +64,8 @@ pub struct PortConfig { pub delay_mechanism: DelayType, #[serde(default = "default_delay_interval")] pub delay_interval: i8, + #[serde(default = "default_minor_ptp_version")] + pub minor_ptp_version: u8, } fn deserialize_acceptable_master_list<'de, D>( @@ -116,6 +118,7 @@ impl From for statime::config::PortConfig> interval: Interval::from_log_2(pc.delay_interval), }, }, + minor_ptp_version: pc.minor_ptp_version, } } } @@ -218,6 +221,10 @@ fn default_delay_interval() -> i8 { 0 } +fn default_minor_ptp_version() -> u8 { + 1 +} + #[derive(Deserialize, Debug, Clone, PartialEq, Eq)] #[serde(rename_all = "kebab-case", deny_unknown_fields)] pub struct ObservabilityConfig { @@ -275,6 +282,7 @@ interface = "enp0s31f6" delay_asymmetry: 0, delay_mechanism: crate::config::DelayType::E2E, delay_interval: 0, + minor_ptp_version: 1, }; let expected = crate::config::Config { diff --git a/statime/src/config/port.rs b/statime/src/config/port.rs index 32679c025..06ac0eef8 100644 --- a/statime/src/config/port.rs +++ b/statime/src/config/port.rs @@ -52,9 +52,12 @@ pub struct PortConfig { /// The estimated asymmetry in the link connected to this [`Port`] pub delay_asymmetry: Duration, + + /// Minor version number to use. + pub minor_ptp_version: u8, // Notes: // Fields specific for delay mechanism are kept as part of [DelayMechanism]. - // Version is always 2.1, so not stored (versionNumber, minorVersionNumber) + // Major version is always 2.1, so not stored (versionNumber) } impl PortConfig { diff --git a/statime/src/datastructures/messages/announce.rs b/statime/src/datastructures/messages/announce.rs index f2907cc07..03c348be2 100644 --- a/statime/src/datastructures/messages/announce.rs +++ b/statime/src/datastructures/messages/announce.rs @@ -101,7 +101,7 @@ mod tests { 0x80, 0x80, ], AnnounceMessage { - header: Header::default(), + header: Header::new(1), origin_timestamp: WireTimestamp { seconds: 1169232218, nanos: 175326816, @@ -132,8 +132,7 @@ mod tests { // Test the deserialization output let deserialized_data = - AnnounceMessage::deserialize_content(Header::default(), &byte_representation) - .unwrap(); + AnnounceMessage::deserialize_content(Header::new(1), &byte_representation).unwrap(); assert_eq!(deserialized_data, object_representation); } } diff --git a/statime/src/datastructures/messages/header.rs b/statime/src/datastructures/messages/header.rs index a8dd4e178..86e410465 100644 --- a/statime/src/datastructures/messages/header.rs +++ b/statime/src/datastructures/messages/header.rs @@ -35,10 +35,13 @@ pub(crate) struct DeserializedHeader { } impl Header { - pub(super) fn new() -> Self { + pub(crate) fn new(minor_ptp_version: u8) -> Self { Self { sdo_id: SdoId(0), - version: PtpVersion { major: 2, minor: 1 }, + version: PtpVersion { + major: 2, + minor: minor_ptp_version, + }, domain_number: 0, alternate_master_flag: false, two_step_flag: false, @@ -134,12 +137,6 @@ impl Header { } } -impl Default for Header { - fn default() -> Self { - Self::new() - } -} - /// A wrapper type for PTP Sdo Identifiers. /// /// Because `SdoId`s are 12 bit values they always lie within `0..=0xFFF`. @@ -277,19 +274,19 @@ mod tests { fn flagfield_wireformat() { #[rustfmt::skip] let representations = [ - ([0x00, 0x00u8], Header::default()), - ([0x01, 0x00u8], Header { alternate_master_flag: true, ..Default::default() }), - ([0x02, 0x00u8], Header { two_step_flag: true, ..Default::default() }), - ([0x04, 0x00u8], Header { unicast_flag: true, ..Default::default() }), - ([0x20, 0x00u8], Header { ptp_profile_specific_1: true, ..Default::default() }), - ([0x40, 0x00u8], Header { ptp_profile_specific_2: true, ..Default::default() }), - ([0x00, 0x01u8], Header { leap61: true, ..Default::default() }), - ([0x00, 0x02u8], Header { leap59: true, ..Default::default() }), - ([0x00, 0x04u8], Header { current_utc_offset_valid: true, ..Default::default() }), - ([0x00, 0x08u8], Header { ptp_timescale: true, ..Default::default() }), - ([0x00, 0x10u8], Header { time_tracable: true, ..Default::default() }), - ([0x00, 0x20u8], Header { frequency_tracable: true, ..Default::default() }), - ([0x00, 0x40u8], Header { synchronization_uncertain: true, ..Default::default() }), + ([0x00, 0x00u8], Header::new(1)), + ([0x01, 0x00u8], Header { alternate_master_flag: true, ..Header::new(1) }), + ([0x02, 0x00u8], Header { two_step_flag: true, ..Header::new(1) }), + ([0x04, 0x00u8], Header { unicast_flag: true, ..Header::new(1) }), + ([0x20, 0x00u8], Header { ptp_profile_specific_1: true, ..Header::new(1) }), + ([0x40, 0x00u8], Header { ptp_profile_specific_2: true, ..Header::new(1) }), + ([0x00, 0x01u8], Header { leap61: true, ..Header::new(1) }), + ([0x00, 0x02u8], Header { leap59: true, ..Header::new(1) }), + ([0x00, 0x04u8], Header { current_utc_offset_valid: true, ..Header::new(1) }), + ([0x00, 0x08u8], Header { ptp_timescale: true, ..Header::new(1) }), + ([0x00, 0x10u8], Header { time_tracable: true, ..Header::new(1) }), + ([0x00, 0x20u8], Header { frequency_tracable: true, ..Header::new(1) }), + ([0x00, 0x40u8], Header { synchronization_uncertain: true, ..Header::new(1) }), ]; for (i, (byte_representation, flag_representation)) in diff --git a/statime/src/datastructures/messages/mod.rs b/statime/src/datastructures/messages/mod.rs index b44d259da..18c6cbeef 100644 --- a/statime/src/datastructures/messages/mod.rs +++ b/statime/src/datastructures/messages/mod.rs @@ -227,21 +227,23 @@ fn base_header( default_ds: &InternalDefaultDS, port_identity: PortIdentity, sequence_id: u16, + minor_ptp_version: u8, ) -> Header { Header { sdo_id: default_ds.sdo_id, domain_number: default_ds.domain_number, source_port_identity: port_identity, sequence_id, - ..Default::default() + ..Header::new(minor_ptp_version) } } /// Checks whether message is of PTP revision compatible with Statime pub fn is_compatible(buffer: &[u8]) -> bool { // this ensures that versionPTP in the header is 2 - // it will never happen in PTPv1 packets because this octet is the LSB of versionPTP there - (buffer.len() >= 2) && (buffer[1] & 0xF) == 2 + // it will never happen in PTPv1 packets because this octet is the LSB of + // versionPTP there + (buffer.len() >= 2) && (buffer[1] & 0xf) == 2 } impl Message<'_> { @@ -249,10 +251,11 @@ impl Message<'_> { default_ds: &InternalDefaultDS, port_identity: PortIdentity, sequence_id: u16, + minor_ptp_version: u8, ) -> Self { let header = Header { two_step_flag: true, - ..base_header(default_ds, port_identity, sequence_id) + ..base_header(default_ds, port_identity, sequence_id, minor_ptp_version) }; Message { @@ -269,10 +272,11 @@ impl Message<'_> { port_identity: PortIdentity, sequence_id: u16, timestamp: Time, + minor_ptp_version: u8, ) -> Self { let header = Header { correction_field: timestamp.subnano(), - ..base_header(default_ds, port_identity, sequence_id) + ..base_header(default_ds, port_identity, sequence_id, minor_ptp_version) }; Message { @@ -288,6 +292,7 @@ impl Message<'_> { global: &PtpInstanceState, port_identity: PortIdentity, sequence_id: u16, + minor_ptp_version: u8, ) -> Self { let time_properties_ds = &global.time_properties_ds; @@ -298,7 +303,12 @@ impl Message<'_> { ptp_timescale: time_properties_ds.ptp_timescale, time_tracable: time_properties_ds.time_traceable, frequency_tracable: time_properties_ds.frequency_traceable, - ..base_header(&global.default_ds, port_identity, sequence_id) + ..base_header( + &global.default_ds, + port_identity, + sequence_id, + minor_ptp_version, + ) }; let body = MessageBody::Announce(AnnounceMessage { @@ -324,10 +334,11 @@ impl Message<'_> { default_ds: &InternalDefaultDS, port_identity: PortIdentity, sequence_id: u16, + minor_ptp_version: u8, ) -> Self { let header = Header { log_message_interval: 0x7f, - ..base_header(default_ds, port_identity, sequence_id) + ..base_header(default_ds, port_identity, sequence_id, minor_ptp_version) }; Message { @@ -375,9 +386,10 @@ impl Message<'_> { default_ds: &InternalDefaultDS, port_identity: PortIdentity, sequence_id: u16, + minor_ptp_version: u8, ) -> Self { Message { - header: base_header(default_ds, port_identity, sequence_id), + header: base_header(default_ds, port_identity, sequence_id, minor_ptp_version), body: MessageBody::PDelayReq(PDelayReqMessage { origin_timestamp: WireTimestamp::default(), }), @@ -390,13 +402,19 @@ impl Message<'_> { port_identity: PortIdentity, request_header: Header, timestamp: Time, + minor_ptp_version: u8, ) -> Self { // We implement Option B from IEEE 1588-2019 page 202 Message { header: Header { two_step_flag: true, correction_field: request_header.correction_field, - ..base_header(default_ds, port_identity, request_header.sequence_id) + ..base_header( + default_ds, + port_identity, + request_header.sequence_id, + minor_ptp_version, + ) }, body: MessageBody::PDelayResp(PDelayRespMessage { request_receive_timestamp: timestamp.into(), @@ -412,9 +430,10 @@ impl Message<'_> { requestor_identity: PortIdentity, sequence_id: u16, timestamp: Time, + minor_ptp_version: u8, ) -> Self { Message { - header: base_header(default_ds, port_identity, sequence_id), + header: base_header(default_ds, port_identity, sequence_id, minor_ptp_version), body: MessageBody::PDelayRespFollowUp(PDelayRespFollowUpMessage { response_origin_timestamp: timestamp.into(), requesting_port_identity: requestor_identity, diff --git a/statime/src/overlay_clock.rs b/statime/src/overlay_clock.rs index 48d9780ab..912affb98 100644 --- a/statime/src/overlay_clock.rs +++ b/statime/src/overlay_clock.rs @@ -1,8 +1,11 @@ -use crate::{time::Duration, time::Time, Clock}; +use crate::{ + time::{Duration, Time}, + Clock, +}; /// An overlay over other, read-only clock, frequency-locked to it. -/// In other words, a virtual clock which can be tuned in software without affecting -/// the underlying system or hardware clock. +/// In other words, a virtual clock which can be tuned in software without +/// affecting the underlying system or hardware clock. #[derive(Debug)] pub struct OverlayClock { roclock: C, @@ -23,7 +26,8 @@ impl OverlayClock { } } - /// Converts (shifts and scales) `Time` in underlying clock's timescale to overlay clock timescale + /// Converts (shifts and scales) `Time` in underlying clock's timescale to + /// overlay clock timescale pub fn time_from_underlying(&self, roclock_time: Time) -> Time { let elapsed = roclock_time - self.last_sync; let corr = elapsed * self.freq_scale_ppm_diff / 1_000_000; diff --git a/statime/src/port/master.rs b/statime/src/port/master.rs index 18fc74974..a16bb6b8d 100644 --- a/statime/src/port/master.rs +++ b/statime/src/port/master.rs @@ -20,7 +20,14 @@ impl<'a, A, C, F: Filter, R, S: PtpInstanceStateMutex> Port<'a, Running, A, R, C let seq_id = self.sync_seq_ids.generate(); let packet_length = match self .instance_state - .with_ref(|state| Message::sync(&state.default_ds, self.port_identity, seq_id)) + .with_ref(|state| { + Message::sync( + &state.default_ds, + self.port_identity, + seq_id, + self.config.minor_ptp_version, + ) + }) .serialize(&mut self.packet_buffer) { Ok(message) => message, @@ -52,7 +59,13 @@ impl<'a, A, C, F: Filter, R, S: PtpInstanceStateMutex> Port<'a, Running, A, R, C let packet_length = match self .instance_state .with_ref(|state| { - Message::follow_up(&state.default_ds, self.port_identity, id, timestamp) + Message::follow_up( + &state.default_ds, + self.port_identity, + id, + timestamp, + self.config.minor_ptp_version, + ) }) .serialize(&mut self.packet_buffer) { @@ -86,7 +99,12 @@ impl<'a, A, C, F: Filter, R, S: PtpInstanceStateMutex> Port<'a, Running, A, R, C let mut tlv_builder = TlvSetBuilder::new(&mut tlv_buffer); let mut message = self.instance_state.with_ref(|state| { - Message::announce(state, self.port_identity, self.announce_seq_ids.generate()) + Message::announce( + state, + self.port_identity, + self.announce_seq_ids.generate(), + self.config.minor_ptp_version, + ) }); let mut tlv_margin = MAX_DATA_LEN - message.wire_size(); @@ -206,7 +224,13 @@ impl<'a, A, C, F: Filter, R, S: PtpInstanceStateMutex> Port<'a, Running, A, R, C ) -> PortActionIterator { log::debug!("Received PDelayReq"); let pdelay_resp_message = self.instance_state.with_ref(|state| { - Message::pdelay_resp(&state.default_ds, self.port_identity, header, timestamp) + Message::pdelay_resp( + &state.default_ds, + self.port_identity, + header, + timestamp, + self.config.minor_ptp_version, + ) }); let packet_length = match pdelay_resp_message.serialize(&mut self.packet_buffer) { @@ -242,6 +266,7 @@ impl<'a, A, C, F: Filter, R, S: PtpInstanceStateMutex> Port<'a, Running, A, R, C requestor_identity, id, timestamp, + self.config.minor_ptp_version, ) }); @@ -299,7 +324,7 @@ mod tests { ..Default::default() }, correction_field: TimeInterval(I48F16::from_bits(400)), - ..Default::default() + ..Header::new(1) }, DelayReqMessage { origin_timestamp: Time::from_micros(0).into(), @@ -352,7 +377,7 @@ mod tests { ..Default::default() }, correction_field: TimeInterval(I48F16::from_bits(200)), - ..Default::default() + ..Header::new(1) }, DelayReqMessage { origin_timestamp: Time::from_micros(0).into(), @@ -674,7 +699,7 @@ mod tests { let mut port = setup_test_port(&state); - let mut actions = port.handle_pdelay_req(Header::default(), Time::from_micros(500)); + let mut actions = port.handle_pdelay_req(Header::new(1), Time::from_micros(500)); let Some(PortAction::SendEvent { context, diff --git a/statime/src/port/mod.rs b/statime/src/port/mod.rs index 402bd89dd..cc50a8a15 100644 --- a/statime/src/port/mod.rs +++ b/statime/src/port/mod.rs @@ -13,8 +13,9 @@ use rand::Rng; use state::PortState; use self::sequence_id::SequenceIdGenerator; -pub use crate::datastructures::messages::is_compatible as is_message_buffer_compatible; -pub use crate::datastructures::messages::MAX_DATA_LEN; +pub use crate::datastructures::messages::{ + is_compatible as is_message_buffer_compatible, MAX_DATA_LEN, +}; #[cfg(doc)] use crate::PtpInstance; use crate::{ @@ -134,6 +135,7 @@ pub(crate) mod state; /// sync_interval: interval, /// master_only: false, /// delay_asymmetry: Default::default(), +/// minor_ptp_version: 1, /// }; /// let filter_config = 1.0; /// let clock = system::Clock {}; @@ -617,6 +619,7 @@ impl<'a, A, C, F: Filter, R: Rng, S: PtpInstanceStateMutex> Port<'a, InBmca, A, sync_interval: config.sync_interval, master_only: config.master_only, delay_asymmetry: config.delay_asymmetry, + minor_ptp_version: 1, }, filter_config, clock, @@ -696,6 +699,7 @@ mod tests { sync_interval: Interval::from_log_2(0), master_only: false, delay_asymmetry: Duration::ZERO, + minor_ptp_version: 1, }, 0.25, TestClock, @@ -723,6 +727,7 @@ mod tests { sync_interval: Interval::from_log_2(0), master_only: false, delay_asymmetry: Duration::ZERO, + minor_ptp_version: 1, }, 0.25, TestClock, @@ -750,6 +755,7 @@ mod tests { sync_interval: Interval::from_log_2(0), master_only: false, delay_asymmetry: Duration::ZERO, + minor_ptp_version: 1, }, filter_config, TestClock, diff --git a/statime/src/port/slave.rs b/statime/src/port/slave.rs index d1c794871..18eb20abd 100644 --- a/statime/src/port/slave.rs +++ b/statime/src/port/slave.rs @@ -473,7 +473,12 @@ impl<'a, A, C: Clock, F: Filter, R: Rng, S: PtpInstanceStateMutex> let pdelay_id = self.pdelay_seq_ids.generate(); let pdelay_req = self.instance_state.with_ref(|state| { - Message::pdelay_req(&state.default_ds, self.port_identity, pdelay_id) + Message::pdelay_req( + &state.default_ds, + self.port_identity, + pdelay_id, + self.config.minor_ptp_version, + ) }); let message_length = match pdelay_req.serialize(&mut self.packet_buffer) { Ok(length) => length, @@ -520,7 +525,12 @@ impl<'a, A, C: Clock, F: Filter, R: Rng, S: PtpInstanceStateMutex> let delay_id = self.delay_seq_ids.generate(); let delay_req = self.instance_state.with_ref(|state| { - Message::delay_req(&state.default_ds, self.port_identity, delay_id) + Message::delay_req( + &state.default_ds, + self.port_identity, + delay_id, + self.config.minor_ptp_version, + ) }); let message_length = match delay_req.serialize(&mut self.packet_buffer) { @@ -626,7 +636,7 @@ mod tests { Header { two_step_flag: false, correction_field: TimeInterval(1000.into()), - ..Default::default() + ..Header::new(1) }, SyncMessage { origin_timestamp: Time::from_micros(0).into(), @@ -653,7 +663,7 @@ mod tests { two_step_flag: true, sequence_id: 15, correction_field: TimeInterval(1000.into()), - ..Default::default() + ..Header::new(1) }, SyncMessage { origin_timestamp: Time::from_micros(0).into(), @@ -668,7 +678,7 @@ mod tests { Header { sequence_id: 15, correction_field: TimeInterval(2000.into()), - ..Default::default() + ..Header::new(1) }, FollowUpMessage { precise_origin_timestamp: Time::from_micros(1000).into(), @@ -708,7 +718,7 @@ mod tests { Header { two_step_flag: false, correction_field: TimeInterval(1000.into()), - ..Default::default() + ..Header::new(1) }, SyncMessage { origin_timestamp: Time::from_micros(0).into(), @@ -745,7 +755,7 @@ mod tests { Header { two_step_flag: false, correction_field: TimeInterval(1000.into()), - ..Default::default() + ..Header::new(1) }, SyncMessage { origin_timestamp: Time::from_micros(0).into(), @@ -808,7 +818,7 @@ mod tests { Header { correction_field: TimeInterval(2000.into()), sequence_id: req_header.sequence_id, - ..Default::default() + ..Header::new(1) }, DelayRespMessage { receive_timestamp: Time::from_micros(253).into(), @@ -838,7 +848,7 @@ mod tests { Header { two_step_flag: true, correction_field: TimeInterval(1000.into()), - ..Default::default() + ..Header::new(1) }, SyncMessage { origin_timestamp: Time::from_micros(0).into(), @@ -890,7 +900,7 @@ mod tests { let mut action = port.handle_follow_up( Header { correction_field: TimeInterval(2000.into()), - ..Default::default() + ..Header::new(1) }, FollowUpMessage { precise_origin_timestamp: Time::from_micros(1000).into(), @@ -915,7 +925,7 @@ mod tests { Header { correction_field: TimeInterval(2000.into()), sequence_id: req_header.sequence_id, - ..Default::default() + ..Header::new(1) }, DelayRespMessage { receive_timestamp: Time::from_micros(1255).into(), @@ -955,7 +965,7 @@ mod tests { Header { sequence_id: 15, correction_field: TimeInterval(2000.into()), - ..Default::default() + ..Header::new(1) }, FollowUpMessage { precise_origin_timestamp: Time::from_micros(10).into(), @@ -972,7 +982,7 @@ mod tests { two_step_flag: true, sequence_id: 15, correction_field: TimeInterval(1000.into()), - ..Default::default() + ..Header::new(1) }, SyncMessage { origin_timestamp: Time::from_micros(0).into(), @@ -1011,7 +1021,7 @@ mod tests { two_step_flag: true, sequence_id: 15, correction_field: TimeInterval(1000.into()), - ..Default::default() + ..Header::new(1) }, SyncMessage { origin_timestamp: Time::from_micros(0).into(), @@ -1027,7 +1037,7 @@ mod tests { Header { sequence_id: 14, correction_field: TimeInterval(2000.into()), - ..Default::default() + ..Header::new(1) }, FollowUpMessage { precise_origin_timestamp: Time::from_micros(10).into(), @@ -1043,7 +1053,7 @@ mod tests { Header { sequence_id: 15, correction_field: TimeInterval(2000.into()), - ..Default::default() + ..Header::new(1) }, FollowUpMessage { precise_origin_timestamp: Time::from_micros(10).into(), @@ -1072,7 +1082,7 @@ mod tests { two_step_flag: true, sequence_id: 14, correction_field: TimeInterval(1000.into()), - ..Default::default() + ..Header::new(1) }, SyncMessage { origin_timestamp: Time::from_micros(0).into(), @@ -1089,7 +1099,7 @@ mod tests { two_step_flag: true, sequence_id: 15, correction_field: TimeInterval(1000.into()), - ..Default::default() + ..Header::new(1) }, SyncMessage { origin_timestamp: Time::from_micros(0).into(), @@ -1105,7 +1115,7 @@ mod tests { Header { sequence_id: 15, correction_field: TimeInterval(2000.into()), - ..Default::default() + ..Header::new(1) }, FollowUpMessage { precise_origin_timestamp: Time::from_micros(1000).into(), @@ -1142,7 +1152,7 @@ mod tests { Header { two_step_flag: false, correction_field: TimeInterval(1000.into()), - ..Default::default() + ..Header::new(1) }, SyncMessage { origin_timestamp: Time::from_micros(0).into(), @@ -1206,7 +1216,7 @@ mod tests { Header { correction_field: TimeInterval(2000.into()), sequence_id: req_header.sequence_id, - ..Default::default() + ..Header::new(1) }, DelayRespMessage { receive_timestamp: Time::from_micros(353).into(), @@ -1226,7 +1236,7 @@ mod tests { Header { correction_field: TimeInterval(2000.into()), sequence_id: req_header.sequence_id.wrapping_sub(1), - ..Default::default() + ..Header::new(1) }, DelayRespMessage { receive_timestamp: Time::from_micros(353).into(), @@ -1243,7 +1253,7 @@ mod tests { Header { correction_field: TimeInterval(2000.into()), sequence_id: req_header.sequence_id, - ..Default::default() + ..Header::new(1) }, DelayRespMessage { receive_timestamp: Time::from_micros(253).into(), @@ -1310,7 +1320,7 @@ mod tests { let mut actions = port.handle_peer_delay_response( Header { correction_field: TimeInterval(2000.into()), - ..Default::default() + ..Header::new(1) }, PDelayRespMessage { request_receive_timestamp: Time::from_micros(100).into(), @@ -1377,7 +1387,7 @@ mod tests { two_step_flag: true, correction_field: TimeInterval(1000.into()), sequence_id: req.header.sequence_id, - ..Default::default() + ..Header::new(1) }, PDelayRespMessage { request_receive_timestamp: Time::from_micros(101).into(), @@ -1393,7 +1403,7 @@ mod tests { Header { correction_field: TimeInterval(1000.into()), sequence_id: req.header.sequence_id, - ..Default::default() + ..Header::new(1) }, PDelayRespFollowUpMessage { response_origin_timestamp: Time::from_micros(103).into(), @@ -1458,7 +1468,7 @@ mod tests { Header { correction_field: TimeInterval(1000.into()), sequence_id: req.header.sequence_id, - ..Default::default() + ..Header::new(1) }, PDelayRespFollowUpMessage { response_origin_timestamp: Time::from_micros(103).into(), @@ -1474,7 +1484,7 @@ mod tests { two_step_flag: true, correction_field: TimeInterval(1000.into()), sequence_id: req.header.sequence_id, - ..Default::default() + ..Header::new(1) }, PDelayRespMessage { request_receive_timestamp: Time::from_micros(101).into(), @@ -1541,7 +1551,7 @@ mod tests { Header { correction_field: TimeInterval(2000.into()), sequence_id: req.header.sequence_id, - ..Default::default() + ..Header::new(1) }, PDelayRespMessage { request_receive_timestamp: Time::from_micros(100).into(), @@ -1571,7 +1581,7 @@ mod tests { port_number: 5, }, correction_field: TimeInterval(2000.into()), - ..Default::default() + ..Header::new(1) }, PDelayRespMessage { request_receive_timestamp: Time::from_micros(100).into(), @@ -1614,7 +1624,7 @@ mod tests { Header { correction_field: TimeInterval(2000.into()), sequence_id: req.header.sequence_id, - ..Default::default() + ..Header::new(1) }, PDelayRespMessage { request_receive_timestamp: Time::from_micros(100).into(), diff --git a/statime/src/shared_clock.rs b/statime/src/shared_clock.rs index 1006a6623..bbbf02632 100644 --- a/statime/src/shared_clock.rs +++ b/statime/src/shared_clock.rs @@ -1,8 +1,9 @@ -use crate::time::Duration; -use crate::time::Time; -use crate::Clock; -use std::sync::Arc; -use std::sync::Mutex; +use std::sync::{Arc, Mutex}; + +use crate::{ + time::{Duration, Time}, + Clock, +}; /// A wrapper for stateful `statime::Clock` implementations to make them behave /// like e.g. `statime_linux::LinuxClock` - clones share state with each other @@ -19,7 +20,8 @@ impl SharedClock { } impl Clone for SharedClock { - /// Clone the shared reference to the clock (behaviour consistent with `statime_linux::LinuxClock`) + /// Clone the shared reference to the clock (behaviour consistent with + /// `statime_linux::LinuxClock`) fn clone(&self) -> Self { Self(self.0.clone()) }