Skip to content

Commit ff18563

Browse files
bhagen55davidv1992
authored andcommitted
Add set_clock_quality method to PtpInstance for dynamic clock quality updates
1 parent 8473f37 commit ff18563

File tree

1 file changed

+69
-1
lines changed

1 file changed

+69
-1
lines changed

statime/src/ptp_instance.rs

Lines changed: 69 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use crate::float_polyfill::FloatPolyfill;
1111
use crate::{
1212
bmc::{acceptable_master::AcceptableMasterList, bmca::Bmca},
1313
clock::Clock,
14-
config::{InstanceConfig, PortConfig},
14+
config::{ClockQuality, InstanceConfig, PortConfig},
1515
datastructures::{
1616
common::PortIdentity,
1717
datasets::{
@@ -259,6 +259,17 @@ impl<F: Filter, S: PtpInstanceStateMutex> PtpInstance<F, S> {
259259
2f64.powi(self.log_bmca_interval.load(Ordering::Relaxed) as i32),
260260
)
261261
}
262+
263+
/// Set the clock quality of the instance
264+
///
265+
/// This allows changing the clock quality after the instance has been created.
266+
/// The change will be reflected in all subsequent PTP messages sent by this instance
267+
/// and the BMCA algorithm will use the new clock quality.
268+
pub fn set_clock_quality(&self, clock_quality: ClockQuality) {
269+
self.state.with_mut(|state| {
270+
state.default_ds.clock_quality = clock_quality;
271+
});
272+
}
262273
}
263274

264275
/// A mutex over a [`PtpInstanceState`]
@@ -305,3 +316,60 @@ impl PtpInstanceStateMutex for std::sync::RwLock<PtpInstanceState> {
305316
f(&mut self.write().unwrap())
306317
}
307318
}
319+
320+
#[cfg(test)]
321+
mod tests {
322+
use super::*;
323+
use crate::{
324+
config::{
325+
ClockAccuracy, ClockIdentity, ClockQuality, InstanceConfig, TimePropertiesDS,
326+
TimeSource,
327+
},
328+
filters::BasicFilter,
329+
};
330+
331+
fn create_test_instance() -> PtpInstance<BasicFilter> {
332+
let config = InstanceConfig {
333+
clock_identity: ClockIdentity::from_mac_address([1, 2, 3, 4, 5, 6]),
334+
priority_1: 128,
335+
priority_2: 128,
336+
domain_number: 0,
337+
slave_only: false,
338+
sdo_id: Default::default(),
339+
path_trace: false,
340+
clock_quality: ClockQuality::default(),
341+
};
342+
let time_properties_ds =
343+
TimePropertiesDS::new_arbitrary_time(false, false, TimeSource::InternalOscillator);
344+
PtpInstance::new(config, time_properties_ds)
345+
}
346+
347+
#[test]
348+
fn test_set_clock_quality_basic() {
349+
let instance = create_test_instance();
350+
351+
let default_ds = instance.default_ds();
352+
assert_eq!(default_ds.clock_quality.clock_class, 248);
353+
assert_eq!(
354+
default_ds.clock_quality.clock_accuracy,
355+
ClockAccuracy::Unknown
356+
);
357+
358+
// Set custom clock quality and verify that it is applied
359+
let custom_quality = ClockQuality {
360+
clock_class: 6,
361+
clock_accuracy: ClockAccuracy::NS1,
362+
offset_scaled_log_variance: 0x8000 - (20 * 256),
363+
};
364+
365+
instance.set_clock_quality(custom_quality);
366+
367+
let updated_ds = instance.default_ds();
368+
assert_eq!(updated_ds.clock_quality.clock_class, 6);
369+
assert_eq!(updated_ds.clock_quality.clock_accuracy, ClockAccuracy::NS1);
370+
assert_eq!(
371+
updated_ds.clock_quality.offset_scaled_log_variance,
372+
0x8000 - (20 * 256)
373+
);
374+
}
375+
}

0 commit comments

Comments
 (0)