@@ -11,7 +11,7 @@ use crate::float_polyfill::FloatPolyfill;
1111use 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