Skip to content

Commit c4f63a0

Browse files
committed
Moved sequence id generators out of state.
1 parent b081e36 commit c4f63a0

File tree

5 files changed

+100
-111
lines changed

5 files changed

+100
-111
lines changed

statime/src/port/bmca.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use rand::Rng;
22

3-
use super::{state::MasterState, InBmca, Port, PortActionIterator, Running};
3+
use super::{InBmca, Port, PortActionIterator, Running};
44
use crate::{
55
bmc::bmca::{BestAnnounceMessage, RecommendedState},
66
config::{AcceptableMasterList, LeapIndicator, TimePropertiesDS, TimeSource},
@@ -146,7 +146,7 @@ impl<'a, A, C: Clock, F: Filter, R: Rng> Port<InBmca<'a>, A, R, C, F> {
146146
let remote_master = announce_message.header.source_port_identity;
147147

148148
let update_state = match &self.port_state {
149-
PortState::Listening | PortState::Master(_) | PortState::Passive => true,
149+
PortState::Listening | PortState::Master | PortState::Passive => true,
150150
PortState::Slave(old_state) => old_state.remote_master() != remote_master,
151151
};
152152

@@ -177,7 +177,7 @@ impl<'a, A, C: Clock, F: Filter, R: Rng> Port<InBmca<'a>, A, R, C, F> {
177177
let reset_announce = PortAction::ResetAnnounceReceiptTimer { duration };
178178
self.lifecycle.pending_action = actions![reset_announce];
179179
}
180-
PortState::Master(_) => {
180+
PortState::Master => {
181181
let msg = "slave-only PTP port should not be in master state";
182182
debug_assert!(!default_ds.slave_only, "{msg}");
183183
log::error!("{msg}");
@@ -186,7 +186,7 @@ impl<'a, A, C: Clock, F: Filter, R: Rng> Port<InBmca<'a>, A, R, C, F> {
186186
} else {
187187
match self.port_state {
188188
PortState::Listening | PortState::Slave(_) | PortState::Passive => {
189-
self.set_forced_port_state(PortState::Master(MasterState::new()));
189+
self.set_forced_port_state(PortState::Master);
190190

191191
// Immediately start sending announces and syncs
192192
let duration = core::time::Duration::from_secs(0);
@@ -195,12 +195,12 @@ impl<'a, A, C: Clock, F: Filter, R: Rng> Port<InBmca<'a>, A, R, C, F> {
195195
PortAction::ResetSyncTimer { duration }
196196
];
197197
}
198-
PortState::Master(_) => { /* do nothing */ }
198+
PortState::Master => { /* do nothing */ }
199199
}
200200
}
201201
}
202202
RecommendedState::P1(_) | RecommendedState::P2(_) => match self.port_state {
203-
PortState::Listening | PortState::Slave(_) | PortState::Master(_) => {
203+
PortState::Listening | PortState::Slave(_) | PortState::Master => {
204204
self.set_forced_port_state(PortState::Passive)
205205
}
206206
PortState::Passive => {}

statime/src/port/master.rs

Lines changed: 73 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,13 @@ use crate::{
1111

1212
impl<'a, A, C, F: Filter, R> Port<Running<'a>, A, R, C, F> {
1313
pub(super) fn send_sync(&mut self) -> PortActionIterator {
14-
match self.port_state {
15-
PortState::Master(ref mut state) => {
16-
log::trace!("sending sync message");
17-
18-
let seq_id = state.sync_seq_ids.generate();
19-
let packet_length = match Message::sync(
20-
&self.lifecycle.state.default_ds,
21-
self.port_identity,
22-
seq_id,
23-
)
24-
.serialize(&mut self.packet_buffer)
14+
if matches!(self.port_state, PortState::Master) {
15+
log::trace!("sending sync message");
16+
17+
let seq_id = self.sync_seq_ids.generate();
18+
let packet_length =
19+
match Message::sync(&self.lifecycle.state.default_ds, self.port_identity, seq_id)
20+
.serialize(&mut self.packet_buffer)
2521
{
2622
Ok(message) => message,
2723
Err(error) => {
@@ -30,24 +26,24 @@ impl<'a, A, C, F: Filter, R> Port<Running<'a>, A, R, C, F> {
3026
}
3127
};
3228

33-
actions![
34-
PortAction::ResetSyncTimer {
35-
duration: self.config.sync_interval.as_core_duration(),
29+
actions![
30+
PortAction::ResetSyncTimer {
31+
duration: self.config.sync_interval.as_core_duration(),
32+
},
33+
PortAction::SendEvent {
34+
context: TimestampContext {
35+
inner: TimestampContextInner::Sync { id: seq_id },
3636
},
37-
PortAction::SendEvent {
38-
context: TimestampContext {
39-
inner: TimestampContextInner::Sync { id: seq_id },
40-
},
41-
data: &self.packet_buffer[..packet_length],
42-
}
43-
]
44-
}
45-
_ => actions![],
37+
data: &self.packet_buffer[..packet_length],
38+
}
39+
]
40+
} else {
41+
actions![]
4642
}
4743
}
4844

4945
pub(super) fn handle_sync_timestamp(&mut self, id: u16, timestamp: Time) -> PortActionIterator {
50-
if matches!(self.port_state, PortState::Master(_)) {
46+
if matches!(self.port_state, PortState::Master) {
5147
let packet_length = match Message::follow_up(
5248
&self.lifecycle.state.default_ds,
5349
self.port_identity,
@@ -78,61 +74,60 @@ impl<'a, A, C, F: Filter, R> Port<Running<'a>, A, R, C, F> {
7874
&mut self,
7975
tlv_provider: &mut impl ForwardedTLVProvider,
8076
) -> PortActionIterator {
81-
match self.port_state {
82-
PortState::Master(ref mut state) => {
83-
log::trace!("sending announce message");
84-
85-
let mut tlv_buffer = [0; MAX_DATA_LEN];
86-
let mut tlv_builder = TlvSetBuilder::new(&mut tlv_buffer);
87-
88-
let mut message = Message::announce(
89-
&self.lifecycle.state,
90-
self.port_identity,
91-
state.announce_seq_ids.generate(),
92-
);
93-
let mut tlv_margin = MAX_DATA_LEN - message.wire_size();
94-
95-
while let Some(tlv) = tlv_provider.next_if_smaller(tlv_margin) {
96-
assert!(tlv.size() < tlv_margin);
97-
if self.lifecycle.state.parent_ds.parent_port_identity != tlv.sender_identity {
98-
// Ignore, shouldn't be forwarded
99-
continue;
100-
}
77+
if matches!(self.port_state, PortState::Master) {
78+
log::trace!("sending announce message");
10179

102-
tlv_margin -= tlv.size();
103-
// Will not fail as previous checks ensure sufficient space in buffer.
104-
tlv_builder.add(tlv.tlv).unwrap();
105-
}
80+
let mut tlv_buffer = [0; MAX_DATA_LEN];
81+
let mut tlv_builder = TlvSetBuilder::new(&mut tlv_buffer);
10682

107-
message.suffix = tlv_builder.build();
83+
let mut message = Message::announce(
84+
&self.lifecycle.state,
85+
self.port_identity,
86+
self.announce_seq_ids.generate(),
87+
);
88+
let mut tlv_margin = MAX_DATA_LEN - message.wire_size();
10889

109-
let packet_length = match Message::announce(
110-
&self.lifecycle.state,
111-
self.port_identity,
112-
state.announce_seq_ids.generate(),
113-
)
114-
.serialize(&mut self.packet_buffer)
115-
{
116-
Ok(length) => length,
117-
Err(error) => {
118-
log::error!(
119-
"Statime bug: Could not serialize announce message {:?}",
120-
error
121-
);
122-
return actions![];
123-
}
124-
};
90+
while let Some(tlv) = tlv_provider.next_if_smaller(tlv_margin) {
91+
assert!(tlv.size() < tlv_margin);
92+
if self.lifecycle.state.parent_ds.parent_port_identity != tlv.sender_identity {
93+
// Ignore, shouldn't be forwarded
94+
continue;
95+
}
12596

126-
actions![
127-
PortAction::ResetAnnounceTimer {
128-
duration: self.config.announce_interval.as_core_duration(),
129-
},
130-
PortAction::SendGeneral {
131-
data: &self.packet_buffer[..packet_length]
132-
}
133-
]
97+
tlv_margin -= tlv.size();
98+
// Will not fail as previous checks ensure sufficient space in buffer.
99+
tlv_builder.add(tlv.tlv).unwrap();
134100
}
135-
_ => actions![],
101+
102+
message.suffix = tlv_builder.build();
103+
104+
let packet_length = match Message::announce(
105+
&self.lifecycle.state,
106+
self.port_identity,
107+
self.announce_seq_ids.generate(),
108+
)
109+
.serialize(&mut self.packet_buffer)
110+
{
111+
Ok(length) => length,
112+
Err(error) => {
113+
log::error!(
114+
"Statime bug: Could not serialize announce message {:?}",
115+
error
116+
);
117+
return actions![];
118+
}
119+
};
120+
121+
actions![
122+
PortAction::ResetAnnounceTimer {
123+
duration: self.config.announce_interval.as_core_duration(),
124+
},
125+
PortAction::SendGeneral {
126+
data: &self.packet_buffer[..packet_length]
127+
}
128+
]
129+
} else {
130+
actions![]
136131
}
137132
}
138133

@@ -142,7 +137,7 @@ impl<'a, A, C, F: Filter, R> Port<Running<'a>, A, R, C, F> {
142137
message: DelayReqMessage,
143138
timestamp: Time,
144139
) -> PortActionIterator {
145-
if matches!(self.port_state, PortState::Master(_)) {
140+
if matches!(self.port_state, PortState::Master) {
146141
log::debug!("Received DelayReq");
147142
let delay_resp_message = Message::delay_resp(
148143
header,
@@ -181,7 +176,6 @@ mod tests {
181176
messages::{Header, MessageBody},
182177
},
183178
port::{
184-
state::MasterState,
185179
tests::{setup_test_port, setup_test_state},
186180
NoForwardedTLVs,
187181
},
@@ -194,7 +188,7 @@ mod tests {
194188

195189
let mut port = setup_test_port(&state);
196190

197-
port.set_forced_port_state(PortState::Master(MasterState::default()));
191+
port.set_forced_port_state(PortState::Master);
198192

199193
port.config.delay_mechanism = DelayMechanism::E2E {
200194
interval: Interval::from_log_2(2),
@@ -308,7 +302,7 @@ mod tests {
308302

309303
let mut port = setup_test_port(&state);
310304

311-
port.set_forced_port_state(PortState::Master(MasterState::default()));
305+
port.set_forced_port_state(PortState::Master);
312306

313307
let mut actions = port.send_announce(&mut NoForwardedTLVs);
314308

@@ -369,7 +363,7 @@ mod tests {
369363

370364
let mut port = setup_test_port(&state);
371365

372-
port.set_forced_port_state(PortState::Master(MasterState::default()));
366+
port.set_forced_port_state(PortState::Master);
373367
let mut actions = port.send_sync();
374368

375369
assert!(matches!(

statime/src/port/mod.rs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,9 @@ pub use actions::{
1111
use atomic_refcell::{AtomicRef, AtomicRefCell};
1212
pub use measurement::Measurement;
1313
use rand::Rng;
14-
use state::{MasterState, PortState};
14+
use state::PortState;
1515

16+
use self::sequence_id::SequenceIdGenerator;
1617
pub use crate::datastructures::messages::MAX_DATA_LEN;
1718
#[cfg(doc)]
1819
use crate::PtpInstance;
@@ -280,6 +281,10 @@ pub struct Port<L, A, R, C, F: Filter> {
280281
packet_buffer: [u8; MAX_DATA_LEN],
281282
lifecycle: L,
282283
rng: R,
284+
285+
announce_seq_ids: SequenceIdGenerator,
286+
sync_seq_ids: SequenceIdGenerator,
287+
delay_seq_ids: SequenceIdGenerator,
283288
}
284289

285290
/// Type state of [`Port`] entered by [`Port::end_bmca`]
@@ -340,8 +345,8 @@ impl<'a, A: AcceptableMasterList, C: Clock, F: Filter, R: Rng> Port<Running<'a>,
340345
// we didn't hear announce messages from other masters, so become master
341346
// ourselves
342347
match self.port_state {
343-
PortState::Master(_) => (),
344-
_ => self.set_forced_port_state(PortState::Master(MasterState::new())),
348+
PortState::Master => (),
349+
_ => self.set_forced_port_state(PortState::Master),
345350
}
346351

347352
// Immediately start sending syncs and announces
@@ -382,6 +387,9 @@ impl<'a, A: AcceptableMasterList, C: Clock, F: Filter, R: Rng> Port<Running<'a>,
382387
local_best: None,
383388
state_refcell: self.lifecycle.state_refcell,
384389
},
390+
announce_seq_ids: self.announce_seq_ids,
391+
sync_seq_ids: self.sync_seq_ids,
392+
delay_seq_ids: self.delay_seq_ids,
385393
}
386394
}
387395

@@ -476,6 +484,9 @@ impl<'a, A, C, F: Filter, R> Port<InBmca<'a>, A, R, C, F> {
476484
state_refcell: self.lifecycle.state_refcell,
477485
state: self.lifecycle.state_refcell.borrow(),
478486
},
487+
announce_seq_ids: self.announce_seq_ids,
488+
sync_seq_ids: self.sync_seq_ids,
489+
delay_seq_ids: self.delay_seq_ids,
479490
},
480491
self.lifecycle.pending_action,
481492
)
@@ -505,7 +516,7 @@ impl<L, A, R, C, F: Filter> Port<L, A, R, C, F> {
505516

506517
/// Indicate whether this [`Port`] is in the master state.
507518
pub fn is_master(&self) -> bool {
508-
matches!(self.port_state, PortState::Master(_))
519+
matches!(self.port_state, PortState::Master)
509520
}
510521

511522
pub(crate) fn state(&self) -> &PortState<F> {
@@ -556,6 +567,9 @@ impl<'a, A, C, F: Filter, R: Rng> Port<InBmca<'a>, A, R, C, F> {
556567
local_best: None,
557568
state_refcell,
558569
},
570+
announce_seq_ids: SequenceIdGenerator::new(),
571+
sync_seq_ids: SequenceIdGenerator::new(),
572+
delay_seq_ids: SequenceIdGenerator::new(),
559573
}
560574
}
561575
}

statime/src/port/slave.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ impl<'a, A, C: Clock, F: Filter, R: Rng> Port<Running<'a>, A, R, C, F> {
224224
PortState::Slave(ref mut state) => {
225225
log::debug!("Starting new delay measurement");
226226

227-
let delay_id = state.delay_req_ids.generate();
227+
let delay_id = self.delay_seq_ids.generate();
228228
let delay_req = Message::delay_req(
229229
&self.lifecycle.state.default_ds,
230230
self.port_identity,

0 commit comments

Comments
 (0)