firewire_dice_protocols/tcat/extension/
router_section.rs1use super::{router_entry::*, *};
10
11#[derive(Default, Debug, Clone, PartialEq, Eq)]
13pub struct RouterParams(pub Vec<RouterEntry>);
14
15impl<O: TcatExtensionOperation> TcatExtensionSectionParamsOperation<RouterParams> for O {
16 fn cache_extension_whole_params(
17 req: &FwReq,
18 node: &FwNode,
19 sections: &ExtensionSections,
20 caps: &ExtensionCaps,
21 params: &mut RouterParams,
22 timeout_ms: u32,
23 ) -> Result<(), Error> {
24 let size = 4 + calculate_router_entries_size(caps.router.maximum_entry_count as usize);
25 let size = std::cmp::min(sections.router.size, size);
26 let mut raw = vec![0u8; size];
27
28 Self::read_extension(req, node, §ions.router, 0, &mut raw, timeout_ms)?;
29
30 let mut val = 0u32;
31 deserialize_u32(&mut val, &raw[..4]);
32 params.0.resize_with(val as usize, Default::default);
33
34 deserialize_router_entries(&mut params.0, &mut raw[4..])
35 .map_err(|cause| Error::new(ProtocolExtensionError::Router, &cause))
36 }
37}
38
39impl<O: TcatExtensionOperation> TcatExtensionSectionWholeMutableParamsOperation<RouterParams>
40 for O
41{
42 fn update_extension_whole_params(
43 req: &FwReq,
44 node: &FwNode,
45 sections: &ExtensionSections,
46 caps: &ExtensionCaps,
47 params: &RouterParams,
48 timeout_ms: u32,
49 ) -> Result<(), Error> {
50 if params.0.len() >= caps.router.maximum_entry_count as usize {
51 let msg = format!(
52 "The number of router entries should be less than{}, but {} given",
53 caps.router.maximum_entry_count,
54 params.0.len(),
55 );
56 Err(Error::new(ProtocolExtensionError::Router, &msg))?;
57 }
58
59 let size = 4 + calculate_router_entries_size(params.0.len() as usize);
60 let mut raw = vec![0u8; size];
61
62 serialize_u32(&(params.0.len() as u32), &mut raw[..4]);
63 serialize_router_entries(¶ms.0, &mut raw[4..])
64 .map_err(|cause| Error::new(ProtocolExtensionError::Router, &cause))?;
65
66 Self::write_extension(req, node, §ions.router, 0, &mut raw, timeout_ms)
67 }
68}