Skip to content

Commit 40f19d1

Browse files
Convert struct Defragmenter into Defragment trait.
1 parent 15e18ab commit 40f19d1

3 files changed

Lines changed: 23 additions & 19 deletions

File tree

src/defragmentation.rs

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,17 @@ use log::{error, trace, warn};
44

55
pub use self::defragmentation_error::DefragmentationError;
66
pub use self::defragmented_message::DefragmentedMessage;
7-
use self::transaction::Transaction;
7+
pub use self::transaction::Transaction;
88
use crate::parameters::messaging::handler::IncomingMessage;
99

1010
mod defragmentation_error;
1111
mod defragmented_message;
1212
mod transaction;
1313

14-
/// Defragments potentially fragmented EZSP frames.
15-
#[derive(Clone, Debug, Default, Eq, PartialEq, Hash)]
16-
pub struct Defragmenter<const BACKPRESSURE_THRESHOLD: usize> {
17-
inner: BTreeMap<u8, Transaction>,
18-
}
14+
const BACKPRESSURE_THRESHOLD: usize = 2;
1915

20-
impl<const BACKPRESSURE_THRESHOLD: usize> Defragmenter<BACKPRESSURE_THRESHOLD> {
16+
/// Defragment potentially fragmented EZSP frames.
17+
pub trait Defragment {
2118
/// Attempt to defragment the given frame.
2219
///
2320
/// # Returns
@@ -30,14 +27,21 @@ impl<const BACKPRESSURE_THRESHOLD: usize> Defragmenter<BACKPRESSURE_THRESHOLD> {
3027
///
3128
/// - [`DefragmentationError::StrayFragment`] if a follow-up fragment is received without an initial fragment.
3229
/// - [`DefragmentationError::DuplicateFragment`] if a duplicate fragment is received.
33-
pub fn defragment(
30+
fn defragment(
31+
&mut self,
32+
incoming_message: IncomingMessage,
33+
) -> Result<Option<DefragmentedMessage>, DefragmentationError>;
34+
}
35+
36+
impl Defragment for BTreeMap<u8, Transaction> {
37+
fn defragment(
3438
&mut self,
3539
incoming_message: IncomingMessage,
3640
) -> Result<Option<DefragmentedMessage>, DefragmentationError> {
37-
if self.inner.len() > BACKPRESSURE_THRESHOLD {
41+
if self.len() > BACKPRESSURE_THRESHOLD {
3842
warn!(
3943
"Defragmenter backpressure threshold exceeded: {} transactions in progress.",
40-
self.inner.len()
44+
self.len()
4145
);
4246
}
4347

@@ -48,8 +52,7 @@ impl<const BACKPRESSURE_THRESHOLD: usize> Defragmenter<BACKPRESSURE_THRESHOLD> {
4852
trace!("Received initial fragment.");
4953

5054
if size > 1 {
51-
self.inner
52-
.insert(seq, Transaction::new(size, index, incoming_message));
55+
self.insert(seq, Transaction::new(size, index, incoming_message));
5356
return Ok(None);
5457
}
5558

@@ -59,13 +62,13 @@ impl<const BACKPRESSURE_THRESHOLD: usize> Defragmenter<BACKPRESSURE_THRESHOLD> {
5962
Some((index, None)) => {
6063
trace!("Received follow-up fragment.");
6164

62-
let Some(transaction) = self.inner.get_mut(&seq) else {
65+
let Some(transaction) = self.get_mut(&seq) else {
6366
return Err(DefragmentationError::StrayFragment { seq, index });
6467
};
6568

6669
if let Some(message) = transaction.update(index, incoming_message) {
6770
error!("Duplicate fragment received. Previous was: {message:?}");
68-
self.inner.remove(&seq);
71+
self.remove(&seq);
6972
return Err(DefragmentationError::DuplicateFragment { seq, index });
7073
}
7174

@@ -77,7 +80,7 @@ impl<const BACKPRESSURE_THRESHOLD: usize> Defragmenter<BACKPRESSURE_THRESHOLD> {
7780
return Ok(None);
7881
};
7982

80-
self.inner.remove(&seq);
83+
self.remove(&seq);
8184
Ok(Some(defragmented_message))
8285
}
8386
None => {

src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ pub use self::commands::{
1212
Networking, ProxyTable, Security, SinkTable, TokenInterface, TrustCenter, Utilities, Wwah, Zll,
1313
};
1414
pub use self::constants::{MAX_HEADER_SIZE, MAX_PARAMETER_SIZE, MIN_NON_LEGACY_VERSION};
15-
pub use self::defragmentation::{DefragmentationError, DefragmentedMessage, Defragmenter};
15+
pub use self::defragmentation::{Defragment, DefragmentationError, DefragmentedMessage};
1616
pub use self::error::{Error, ValueError};
1717
pub use self::extensions::{ConfigurationExt, Displayable, PolicyExt};
1818
pub use self::frame::{

src/zigbee/network_manager/message_handler.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use std::collections::BTreeMap;
12
use std::sync::Arc;
23

34
use log::{debug, error, trace, warn};
@@ -7,7 +8,7 @@ use tokio::sync::mpsc::{Receiver, Sender, channel};
78
use zigbee::Endpoint;
89
use zigbee_nwk::Event;
910

10-
use crate::defragmentation::Defragmenter;
11+
use crate::defragmentation::{Defragment, Transaction};
1112
use crate::ember::device::Update;
1213
use crate::frame::parameters::networking::handler::Handler as Networking;
1314
use crate::parameters::messaging::handler::{Handler as Messaging, IncomingMessage, MessageSent};
@@ -23,7 +24,7 @@ pub type Handlers = Arc<Mutex<Vec<Sender<Callback>>>>;
2324
pub struct MessageHandler {
2425
handlers: Handlers,
2526
outgoing: Sender<Event>,
26-
transactions: Defragmenter<2>,
27+
transactions: BTreeMap<u8, Transaction>,
2728
}
2829

2930
impl MessageHandler {
@@ -35,7 +36,7 @@ impl MessageHandler {
3536
Self {
3637
handlers: handlers.clone(),
3738
outgoing,
38-
transactions: Defragmenter::default(),
39+
transactions: BTreeMap::new(),
3940
},
4041
handlers,
4142
rx,

0 commit comments

Comments
 (0)