diff options
author | David Duarte <licorne@google.com> | 2024-06-04 00:34:17 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2024-06-04 00:34:17 +0000 |
commit | 3d098cc5d327b0bc34eaf7fd4630a3a51dc02b42 (patch) | |
tree | 66dfabc2bec92a48585d526ac5ce3084eaa99ae0 /src/rust | |
parent | 7ba5b459980b316831faf89a17fefe449fb1a1d7 (diff) | |
parent | 250c82dc0372f394bd9fde06513a8d34b8668225 (diff) | |
download | uwb-master.tar.gz |
Original change: https://android-review.googlesource.com/c/platform/external/uwb/+/3106793
Change-Id: I738727aa169c84d3a478859219b13e241082d63c
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
Diffstat (limited to 'src/rust')
-rw-r--r-- | src/rust/uci_hal_android/uci_hal_android.rs | 3 | ||||
-rw-r--r-- | src/rust/uwb_core/src/uci/mock_uci_logger.rs | 5 | ||||
-rw-r--r-- | src/rust/uwb_core/src/uci/notification.rs | 29 | ||||
-rw-r--r-- | src/rust/uwb_core/src/uci/uci_hal.rs | 2 | ||||
-rw-r--r-- | src/rust/uwb_core/src/uci/uci_logger.rs | 4 | ||||
-rw-r--r-- | src/rust/uwb_core/src/uci/uci_logger_pcapng.rs | 5 | ||||
-rw-r--r-- | src/rust/uwb_core/src/uci/uci_manager.rs | 16 | ||||
-rw-r--r-- | src/rust/uwb_uci_packets/src/lib.rs | 132 |
8 files changed, 111 insertions, 85 deletions
diff --git a/src/rust/uci_hal_android/uci_hal_android.rs b/src/rust/uci_hal_android/uci_hal_android.rs index aa41875..86c9c93 100644 --- a/src/rust/uci_hal_android/uci_hal_android.rs +++ b/src/rust/uci_hal_android/uci_hal_android.rs @@ -30,6 +30,7 @@ use android_hardware_uwb::binder::{ use async_trait::async_trait; use binder_tokio::{Tokio, TokioRuntime}; use log::error; +use pdl_runtime::Packet; use tokio::runtime::Handle; use tokio::sync::{mpsc, Mutex}; use uwb_core::error::{Error as UwbCoreError, Result as UwbCoreResult}; @@ -43,7 +44,7 @@ fn input_uci_hal_packet<T: Into<uwb_uci_packets::UciControlPacket>>( builder: T, ) -> Vec<UciHalPacket> { let packets: Vec<uwb_uci_packets::UciControlPacketHal> = builder.into().into(); - packets.into_iter().map(|packet| packet.into()).collect() + packets.into_iter().map(|packet| packet.encode_to_vec().unwrap()).collect() } /// Send device status notification with error state. diff --git a/src/rust/uwb_core/src/uci/mock_uci_logger.rs b/src/rust/uwb_core/src/uci/mock_uci_logger.rs index e21fb71..52d6044 100644 --- a/src/rust/uwb_core/src/uci/mock_uci_logger.rs +++ b/src/rust/uwb_core/src/uci/mock_uci_logger.rs @@ -14,6 +14,7 @@ use std::convert::TryFrom; +use pdl_runtime::Packet; use tokio::sync::mpsc; use uwb_uci_packets::{UciControlPacket, UciDataPacket}; @@ -58,10 +59,10 @@ impl UciLogger for MockUciLogger { } fn log_uci_control_packet(&mut self, packet: UciControlPacket) { - let _ = self.log_sender.send(UciLogEvent::Packet(packet.into())); + let _ = self.log_sender.send(UciLogEvent::Packet(packet.encode_to_vec().unwrap())); } fn log_uci_data_packet(&mut self, packet: &UciDataPacket) { - let _ = self.log_sender.send(UciLogEvent::Packet(packet.clone().into())); + let _ = self.log_sender.send(UciLogEvent::Packet(packet.encode_to_vec().unwrap())); } } diff --git a/src/rust/uwb_core/src/uci/notification.rs b/src/rust/uwb_core/src/uci/notification.rs index 58e68cd..688199e 100644 --- a/src/rust/uwb_core/src/uci/notification.rs +++ b/src/rust/uwb_core/src/uci/notification.rs @@ -498,7 +498,7 @@ impl TryFrom<uwb_uci_packets::SessionControlNotification> for SessionNotificatio impl TryFrom<uwb_uci_packets::SessionInfoNtf> for SessionNotification { type Error = Error; fn try_from(evt: uwb_uci_packets::SessionInfoNtf) -> std::result::Result<Self, Self::Error> { - let raw_ranging_data = evt.clone().to_bytes()[UCI_PACKET_HEADER_LEN..].to_vec(); + let raw_ranging_data = evt.encode_to_bytes().unwrap()[UCI_PACKET_HEADER_LEN..].to_vec(); use uwb_uci_packets::SessionInfoNtfChild; let ranging_measurements = match evt.specialize() { SessionInfoNtfChild::ShortMacTwoWaySessionInfoNtf(evt) => { @@ -772,8 +772,9 @@ mod tests { vendor_data: vec![], } .build(); - let raw_ranging_data = - extended_two_way_session_info_ntf.clone().to_bytes()[UCI_PACKET_HEADER_LEN..].to_vec(); + let raw_ranging_data = extended_two_way_session_info_ntf.encode_to_bytes().unwrap() + [UCI_PACKET_HEADER_LEN..] + .to_vec(); let range_notification = uwb_uci_packets::SessionInfoNtf::try_from(extended_two_way_session_info_ntf).unwrap(); let session_notification = SessionNotification::try_from(range_notification).unwrap(); @@ -822,8 +823,9 @@ mod tests { vendor_data: vec![0x02, 0x01], } .build(); - let raw_ranging_data = - short_two_way_session_info_ntf.clone().to_bytes()[UCI_PACKET_HEADER_LEN..].to_vec(); + let raw_ranging_data = short_two_way_session_info_ntf.encode_to_bytes().unwrap() + [UCI_PACKET_HEADER_LEN..] + .to_vec(); let range_notification = uwb_uci_packets::SessionInfoNtf::try_from(short_two_way_session_info_ntf).unwrap(); let session_notification = SessionNotification::try_from(range_notification).unwrap(); @@ -868,8 +870,9 @@ mod tests { vendor_data: vec![], } .build(); - let raw_ranging_data = - extended_owr_aoa_session_info_ntf.clone().to_bytes()[UCI_PACKET_HEADER_LEN..].to_vec(); + let raw_ranging_data = extended_owr_aoa_session_info_ntf.encode_to_bytes().unwrap() + [UCI_PACKET_HEADER_LEN..] + .to_vec(); let range_notification = uwb_uci_packets::SessionInfoNtf::try_from(extended_owr_aoa_session_info_ntf).unwrap(); let session_notification = SessionNotification::try_from(range_notification).unwrap(); @@ -913,8 +916,9 @@ mod tests { vendor_data: vec![], } .build(); - let raw_ranging_data = - short_owr_aoa_session_info_ntf.clone().to_bytes()[UCI_PACKET_HEADER_LEN..].to_vec(); + let raw_ranging_data = short_owr_aoa_session_info_ntf.encode_to_bytes().unwrap() + [UCI_PACKET_HEADER_LEN..] + .to_vec(); let range_notification = uwb_uci_packets::SessionInfoNtf::try_from(short_owr_aoa_session_info_ntf).unwrap(); let session_notification = SessionNotification::try_from(range_notification).unwrap(); @@ -1226,8 +1230,9 @@ mod tests { session_token: 0x11, } .build(); - let raw_ranging_data = - short_mac_dl_tdoa_session_info_ntf.clone().to_bytes()[UCI_PACKET_HEADER_LEN..].to_vec(); + let raw_ranging_data = short_mac_dl_tdoa_session_info_ntf.encode_to_bytes().unwrap() + [UCI_PACKET_HEADER_LEN..] + .to_vec(); let short_measurement = ShortAddressDlTdoaRangingMeasurement::parse(&dl_tdoa_measurements, 1).unwrap(); let range_notification_packet = @@ -1279,7 +1284,7 @@ mod tests { session_token: 0x11, } .build(); - let raw_ranging_data = extended_mac_dl_tdoa_session_info_ntf.clone().to_bytes() + let raw_ranging_data = extended_mac_dl_tdoa_session_info_ntf.encode_to_bytes().unwrap() [UCI_PACKET_HEADER_LEN..] .to_vec(); let short_measurement = diff --git a/src/rust/uwb_core/src/uci/uci_hal.rs b/src/rust/uwb_core/src/uci/uci_hal.rs index 098840a..adc69b3 100644 --- a/src/rust/uwb_core/src/uci/uci_hal.rs +++ b/src/rust/uwb_core/src/uci/uci_hal.rs @@ -58,7 +58,7 @@ pub trait UciHal: 'static + Send + Sync { let packet: UciControlPacket = cmd.try_into()?; let fragmented_packets: Vec<UciControlPacketHal> = packet.into(); for packet in fragmented_packets.into_iter() { - self.send_packet(packet.to_vec()).await?; + self.send_packet(packet.encode_to_vec().unwrap()).await?; } Ok(()) } diff --git a/src/rust/uwb_core/src/uci/uci_logger.rs b/src/rust/uwb_core/src/uci/uci_logger.rs index 381351c..a6060d9 100644 --- a/src/rust/uwb_core/src/uci/uci_logger.rs +++ b/src/rust/uwb_core/src/uci/uci_logger.rs @@ -108,10 +108,10 @@ fn filter_uci_response(rsp: UciResponse) -> UciResponse { // Log only the Data Packet header bytes, so that we don't log any PII (payload bytes). fn filter_uci_data( packet: &UciDataPacket, -) -> std::result::Result<UciDataPacket, pdl_runtime::Error> { +) -> std::result::Result<UciDataPacket, pdl_runtime::DecodeError> { // Initialize a (zeroed out) Vec to the same length as the data packet, and then copy over // only the Data Packet header bytes into it. This masks out all the payload bytes to 0. - let data_packet_bytes: Vec<u8> = packet.clone().to_vec(); + let data_packet_bytes: Vec<u8> = packet.encode_to_vec().unwrap(); let mut filtered_data_packet_bytes: Vec<u8> = vec![0; data_packet_bytes.len()]; for (i, &b) in data_packet_bytes[..UCI_PACKET_HAL_HEADER_LEN].iter().enumerate() { filtered_data_packet_bytes[i] = b; diff --git a/src/rust/uwb_core/src/uci/uci_logger_pcapng.rs b/src/rust/uwb_core/src/uci/uci_logger_pcapng.rs index 5743913..ca67601 100644 --- a/src/rust/uwb_core/src/uci/uci_logger_pcapng.rs +++ b/src/rust/uwb_core/src/uci/uci_logger_pcapng.rs @@ -15,6 +15,7 @@ //! Implements UciLoggerPcapng, a UciLogger with PCAPNG format log. use log::warn; +use pdl_runtime::Packet; use tokio::sync::mpsc; use uwb_uci_packets::{UciControlPacket, UciDataPacket}; @@ -51,7 +52,7 @@ impl UciLogger for UciLoggerPcapng { fn log_uci_control_packet(&mut self, packet: UciControlPacket) { let block_bytes = match EnhancedPacketBlockBuilder::new() .interface_id(self.interface_id) - .packet(packet.into()) + .packet(packet.encode_to_vec().unwrap()) .into_le_bytes() { Some(b) => b, @@ -63,7 +64,7 @@ impl UciLogger for UciLoggerPcapng { fn log_uci_data_packet(&mut self, packet: &UciDataPacket) { let packet_header_bytes = match EnhancedPacketBlockBuilder::new() .interface_id(self.interface_id) - .packet(packet.clone().into()) + .packet(packet.encode_to_vec().unwrap()) .into_le_bytes() { Some(b) => b, diff --git a/src/rust/uwb_core/src/uci/uci_manager.rs b/src/rust/uwb_core/src/uci/uci_manager.rs index fbeb1d3..ce2e103 100644 --- a/src/rust/uwb_core/src/uci/uci_manager.rs +++ b/src/rust/uwb_core/src/uci/uci_manager.rs @@ -1153,7 +1153,11 @@ impl<T: UciHal, U: UciLogger> UciManagerActor<T, U> { return; } - match self.hal.send_packet(uci_data_snd_retryer.data_packet.clone().to_vec()).await { + match self + .hal + .send_packet(uci_data_snd_retryer.data_packet.encode_to_vec().unwrap()) + .await + { Ok(_) => { self.uci_data_snd_retryer = Some(uci_data_snd_retryer); } @@ -1266,7 +1270,7 @@ impl<T: UciHal, U: UciLogger> UciManagerActor<T, U> { retry_count: MAX_RETRY_COUNT, }); - let result = self.hal.send_packet(hal_data_packet_fragment.to_vec()).await; + let result = self.hal.send_packet(hal_data_packet_fragment.encode_to_vec().unwrap()).await; if result.is_err() { error!( "Result {:?} of sending data packet fragment SessionToken: {} to HAL", @@ -1699,6 +1703,7 @@ mod tests { use super::*; use bytes::Bytes; + use pdl_runtime::Packet; use tokio::macros::support::Future; use uwb_uci_packets::{ Controlee_V2_0_16_Byte_Version, Controlee_V2_0_32_Byte_Version, SessionGetCountCmdBuilder, @@ -1725,7 +1730,7 @@ mod tests { builder: T, ) -> Vec<UciHalPacket> { let packets: Vec<uwb_uci_packets::UciControlPacketHal> = builder.into().into(); - packets.into_iter().map(|packet| packet.into()).collect() + packets.into_iter().map(|packet| packet.encode_to_vec().unwrap()).collect() } // Construct a UCI packet, with the header fields and payload bytes. @@ -4341,13 +4346,14 @@ mod tests { uci_manager.set_logger_mode(UciLoggerMode::Filtered).await.unwrap(); uci_manager.session_get_count().await.unwrap(); let packet: Vec<u8> = log_receiver.recv().await.unwrap().try_into().unwrap(); - let cmd_packet: Vec<u8> = SessionGetCountCmdBuilder {}.build().into(); + let cmd_packet: Vec<u8> = SessionGetCountCmdBuilder {}.build().encode_to_vec().unwrap(); assert_eq!(&packet, &cmd_packet); let packet: Vec<u8> = log_receiver.recv().await.unwrap().try_into().unwrap(); let rsp_packet: Vec<u8> = SessionGetCountRspBuilder { status: StatusCode::UciStatusOk, session_count: 2 } .build() - .into(); + .encode_to_vec() + .unwrap(); assert_eq!(&packet, &rsp_packet); assert!(mock_hal.wait_expected_calls_done().await); diff --git a/src/rust/uwb_uci_packets/src/lib.rs b/src/rust/uwb_uci_packets/src/lib.rs index 18c50c1..6ed8b62 100644 --- a/src/rust/uwb_uci_packets/src/lib.rs +++ b/src/rust/uwb_uci_packets/src/lib.rs @@ -283,10 +283,10 @@ impl From<DataPacketFormat> for GroupIdOrDataPacketFormat { // The GroupIdOrDataPacketFormat enum has more values defined (for the GroupId bits) than the // DataPacketFormat enum. Hence this is implemented as TryFrom() instead of From(). impl TryFrom<GroupIdOrDataPacketFormat> for DataPacketFormat { - type Error = Error; + type Error = DecodeError; - fn try_from(gid_or_dpf: GroupIdOrDataPacketFormat) -> Result<Self> { - DataPacketFormat::try_from(u8::from(gid_or_dpf)).or(Err(Error::InvalidPacketError)) + fn try_from(gid_or_dpf: GroupIdOrDataPacketFormat) -> Result<Self, DecodeError> { + DataPacketFormat::try_from(u8::from(gid_or_dpf)).or(Err(DecodeError::InvalidPacketError)) } } @@ -298,9 +298,9 @@ struct UciControlPacketHeader { } impl UciControlPacketHeader { - fn new(message_type: MessageType, group_id: GroupId, opcode: u8) -> Result<Self> { + fn new(message_type: MessageType, group_id: GroupId, opcode: u8) -> Result<Self, DecodeError> { if !is_uci_control_packet(message_type) { - return Err(Error::InvalidPacketError); + return Err(DecodeError::InvalidPacketError); } Ok(UciControlPacketHeader { @@ -330,9 +330,9 @@ fn get_oid_from_uci_control_packet(packet: &[u8]) -> u8 { // This function parses the packet bytes to return the Control Packet Opcode (OID) field. The // caller should check that the packet bytes represent a UCI control packet. The code will not -// panic because UciPacketHal::to_bytes() should always be larger then the place we access. +// panic because UciPacketHal::encode_to_bytes() should always be larger then the place we access. fn get_opcode_from_uci_control_packet(packet: &UciPacketHal) -> u8 { - get_oid_from_uci_control_packet(&packet.clone().to_bytes()) + get_oid_from_uci_control_packet(&packet.encode_to_bytes().unwrap()) } fn is_uci_control_packet(message_type: MessageType) -> bool { @@ -371,25 +371,25 @@ fn is_device_state_err_control_packet(packet: &UciPacketHal) -> bool { packet.get_message_type() == MessageType::Notification.into() && packet.get_group_id_or_data_packet_format() == GroupIdOrDataPacketFormat::Core.into() && get_opcode_from_uci_control_packet(packet) == CoreOpCode::CoreDeviceStatusNtf.into() - && packet.clone().to_vec()[UCI_PACKET_HAL_HEADER_LEN] + && packet.encode_to_vec().unwrap()[UCI_PACKET_HAL_HEADER_LEN] == DeviceState::DeviceStateError.into() } impl UciControlPacket { // For some usage, we need to get the raw payload. pub fn to_raw_payload(self) -> Vec<u8> { - self.to_bytes().slice(UCI_PACKET_HEADER_LEN..).to_vec() + self.encode_to_bytes().unwrap().slice(UCI_PACKET_HEADER_LEN..).to_vec() } } // Helper to convert from vector of |UciPacketHal| to |UciControlPacket|. An example // usage is to convert a list UciPacketHAL fragments to one UciPacket, during de-fragmentation. impl TryFrom<Vec<UciPacketHal>> for UciControlPacket { - type Error = Error; + type Error = DecodeError; - fn try_from(packets: Vec<UciPacketHal>) -> Result<Self> { + fn try_from(packets: Vec<UciPacketHal>) -> Result<Self, DecodeError> { if packets.is_empty() { - return Err(Error::InvalidPacketError); + return Err(DecodeError::InvalidPacketError); } // Store header info from the first packet. @@ -413,17 +413,25 @@ impl TryFrom<Vec<UciPacketHal>> for UciControlPacket { message_type: packet.get_message_type(), group_id: packet.get_group_id_or_data_packet_format().into(), opcode: get_opcode_from_uci_control_packet(&packet), - payload: Some(packet.to_bytes().slice(UCI_PACKET_HAL_HEADER_LEN..)), + payload: Some( + packet + .encode_to_bytes() + .unwrap() + .slice(UCI_PACKET_HAL_HEADER_LEN..), + ), } .build() - .to_bytes(), + .encode_to_bytes() + .unwrap(), ); } error!("Received unexpected fragment: {:?}", packet); - return Err(Error::InvalidPacketError); + return Err(DecodeError::InvalidPacketError); } // get payload by stripping the header. - payload_buf.extend_from_slice(&packet.to_bytes().slice(UCI_PACKET_HAL_HEADER_LEN..)) + payload_buf.extend_from_slice( + &packet.encode_to_bytes().unwrap().slice(UCI_PACKET_HAL_HEADER_LEN..), + ) } // Create assembled |UciControlPacket| and convert to bytes again since we need to @@ -436,7 +444,8 @@ impl TryFrom<Vec<UciPacketHal>> for UciControlPacket { payload: Some(payload_buf.into()), } .build() - .to_bytes(), + .encode_to_bytes() + .unwrap(), ) } } @@ -472,24 +481,24 @@ fn is_data_rcv_or_radar_format(data_packet_format: DataPacketFormat) -> bool { fn try_into_data_payload( packet: UciPacketHal, expected_data_packet_format: DataPacketFormat, -) -> Result<Bytes> { +) -> Result<Bytes, DecodeError> { let dpf: DataPacketFormat = packet.get_group_id_or_data_packet_format().try_into()?; if is_uci_data_packet(packet.get_message_type()) && dpf == expected_data_packet_format { - Ok(packet.to_bytes().slice(UCI_PACKET_HAL_HEADER_LEN..)) + Ok(packet.encode_to_bytes().unwrap().slice(UCI_PACKET_HAL_HEADER_LEN..)) } else { error!("Received unexpected data packet fragment: {:?}", packet); - Err(Error::InvalidPacketError) + Err(DecodeError::InvalidPacketError) } } // Helper to convert from vector of |UciPacketHal| to |UciDataPacket|. An example // usage is to convert a list UciPacketHAL fragments to one UciPacket, during de-fragmentation. impl TryFrom<Vec<UciPacketHal>> for UciDataPacket { - type Error = Error; + type Error = DecodeError; - fn try_from(packets: Vec<UciPacketHal>) -> Result<Self> { + fn try_from(packets: Vec<UciPacketHal>) -> Result<Self, DecodeError> { if packets.is_empty() { - return Err(Error::InvalidPacketError); + return Err(DecodeError::InvalidPacketError); } let dpf: DataPacketFormat = packets[0].get_group_id_or_data_packet_format().try_into()?; @@ -514,7 +523,8 @@ impl TryFrom<Vec<UciPacketHal>> for UciDataPacket { payload: Some(payload_buf.into()), } .build() - .to_bytes(), + .encode_to_bytes() + .unwrap(), ) } } @@ -541,7 +551,7 @@ impl From<UciControlPacket> for Vec<UciControlPacketHal> { let mut fragments = Vec::new(); // get payload by stripping the header. - let payload = packet.to_bytes().slice(UCI_PACKET_HEADER_LEN..); + let payload = packet.encode_to_bytes().unwrap().slice(UCI_PACKET_HEADER_LEN..); if payload.is_empty() { fragments.push( UciControlPacketHalBuilder { @@ -585,7 +595,7 @@ pub fn fragment_data_msg_send(packet: UciDataSnd, max_payload_len: usize) -> Vec let dpf = packet.get_data_packet_format().into(); // get payload by stripping the header. - let payload = packet.to_bytes().slice(UCI_DATA_SND_PACKET_HEADER_LEN..); + let payload = packet.encode_to_bytes().unwrap().slice(UCI_DATA_SND_PACKET_HEADER_LEN..); if payload.is_empty() { fragments.push( UciDataPacketHalBuilder { @@ -632,7 +642,7 @@ pub struct PacketDefrager { pub enum UciDefragPacket { Control(UciControlPacket), Data(UciDataPacket), - Raw(Result<()>, RawUciControlPacket), + Raw(Result<(), DecodeError>, RawUciControlPacket), } impl PacketDefrager { @@ -654,7 +664,7 @@ impl PacketDefrager { Err(_) => { error!("Rx packet from HAL has unrecognized MT={}", mt_u8); return Some(UciDefragPacket::Raw( - Err(Error::InvalidPacketError), + Err(DecodeError::InvalidPacketError), RawUciControlPacket { mt: mt_u8, gid: 0, oid: 0, payload: Vec::new() }, )); } @@ -742,7 +752,7 @@ impl PacketDefrager { mt_u8, pbf, gid, oid ); return Some(UciDefragPacket::Raw( - Err(Error::InvalidPacketError), + Err(DecodeError::InvalidPacketError), RawUciControlPacket { mt: mt_u8, gid, oid, payload: Vec::new() }, )); } @@ -769,7 +779,9 @@ pub struct ParsedFrameReport { segment_metrics: Vec<SegmentMetricsValue>, } -pub fn parse_diagnostics_ntf(evt: AndroidRangeDiagnosticsNtf) -> Result<ParsedDiagnosticNtfPacket> { +pub fn parse_diagnostics_ntf( + evt: AndroidRangeDiagnosticsNtf, +) -> Result<ParsedDiagnosticNtfPacket, DecodeError> { let session_token = evt.get_session_token(); let sequence_number = evt.get_sequence_number(); let mut parsed_frame_reports = Vec::new(); @@ -796,11 +808,11 @@ pub fn parse_diagnostics_ntf(evt: AndroidRangeDiagnosticsNtf) -> Result<ParsedDi FrameReportTlvPacketChild::SegmentMetrics(sm) => { segment_metrics_vec.append(&mut sm.get_segment_metrics().clone()) } - _ => return Err(Error::InvalidPacketError), + _ => return Err(DecodeError::InvalidPacketError), }, Err(e) => { error!("Failed to parse the packet {:?}", e); - return Err(Error::InvalidPacketError); + return Err(DecodeError::InvalidPacketError); } } } @@ -863,7 +875,7 @@ pub fn build_session_update_controller_multicast_list_cmd( session_token: u32, action: UpdateMulticastListAction, controlees: Controlees, -) -> Result<SessionUpdateControllerMulticastListCmd> { +) -> Result<SessionUpdateControllerMulticastListCmd, DecodeError> { let mut controlees_buf = BytesMut::new(); match controlees { Controlees::NoSessionKey(controlee_v1) => { @@ -888,7 +900,7 @@ pub fn build_session_update_controller_multicast_list_cmd( controlees_buf.extend_from_slice(&write_controlee_2_0_32byte(&controlee)); } } - _ => return Err(Error::InvalidPacketError), + _ => return Err(DecodeError::InvalidPacketError), } Ok(SessionUpdateControllerMulticastListCmdBuilder { session_token, @@ -906,7 +918,7 @@ pub fn build_data_transfer_phase_config_cmd( dtpml_size: u8, mac_address: Vec<u8>, slot_bitmap: Vec<u8>, -) -> Result<SessionDataTransferPhaseConfigCmd> { +) -> Result<SessionDataTransferPhaseConfigCmd, DecodeError> { let mut dtpml_buffer = BytesMut::new(); //calculate mac address mode from data transfer control @@ -916,7 +928,7 @@ pub fn build_data_transfer_phase_config_cmd( let mac_address_size = match mac_address_mode { SHORT_ADDRESS => 2, EXTENDED_ADDRESS => 8, - _ => return Err(Error::InvalidPacketError), + _ => return Err(DecodeError::InvalidPacketError), }; // Calculate slot bitmap size from data transfer control @@ -932,7 +944,7 @@ pub fn build_data_transfer_phase_config_cmd( // Validate sizes of mac_address and slot_bitmap if slot_bitmap_vec.len() != dtpml_size.into() || mac_address_vec.len() != dtpml_size.into() { - return Err(Error::InvalidPacketError); + return Err(DecodeError::InvalidPacketError); } // Combine segmented vectors into dtpml_buffer @@ -973,7 +985,7 @@ pub fn build_session_set_hybrid_controller_config_cmd( number_of_phases: u8, update_time: [u8; 8], phase_list: PhaseList, -) -> Result<SessionSetHybridControllerConfigCmd> { +) -> Result<SessionSetHybridControllerConfigCmd, DecodeError> { let mut phase_list_buffer = BytesMut::new(); match phase_list { PhaseList::ShortMacAddress(phaseListShortMacAddressVec) => { @@ -1010,7 +1022,7 @@ pub fn build_session_set_hybrid_controller_config_cmd( phase_list_buffer.extend_from_slice(&phaseListExtendedMacAddress.mac_address); } } - _ => return Err(Error::InvalidPacketError), + _ => return Err(DecodeError::InvalidPacketError), } Ok(SessionSetHybridControllerConfigCmdBuilder { session_token, @@ -1072,11 +1084,11 @@ mod tests { let mut frame_reports = Vec::new(); let tlvs = vec![ FrameReportTlv { t: rssi.get_t(), v: rssi.get_rssi().to_vec() }, - FrameReportTlv { t: aoa.get_t(), v: aoa.to_vec()[3..].to_vec() }, - FrameReportTlv { t: cir.get_t(), v: cir.to_vec()[3..].to_vec() }, + FrameReportTlv { t: aoa.get_t(), v: aoa.encode_to_vec().unwrap()[3..].to_vec() }, + FrameReportTlv { t: cir.get_t(), v: cir.encode_to_vec().unwrap()[3..].to_vec() }, FrameReportTlv { t: segment_metrics.get_t(), - v: segment_metrics.to_vec()[3..].to_vec(), + v: segment_metrics.encode_to_vec().unwrap()[3..].to_vec(), }, ]; let frame_report = @@ -1118,15 +1130,15 @@ mod tests { .unwrap() .into(); let packet_fragments: Vec<UciControlPacketHal> = packet.into(); - let uci_packet: Vec<u8> = packet_fragments[0].clone().into(); + let uci_packet = packet_fragments[0].encode_to_vec(); assert_eq!( uci_packet, - vec![ + Ok(vec![ 0x21, 0x07, 0x00, 0x0c, // 2(packet info), RFU, payload length(12) 0x47, 0x36, 0x25, 0x14, // 4(session id (LE)) 0x00, 0x01, 0x12, 0x34, // action, # controlee, 2(short address (LE)) 0x46, 0x35, 0x24, 0x13, // 4(subsession id (LE)) - ] + ]) ); } @@ -1149,17 +1161,17 @@ mod tests { .unwrap() .into(); let packet_fragments: Vec<UciControlPacketHal> = packet.into(); - let uci_packet: Vec<u8> = packet_fragments[0].clone().into(); + let uci_packet = packet_fragments[0].encode_to_vec(); assert_eq!( uci_packet, - vec![ + Ok(vec![ 0x21, 0x07, 0x00, 0x1c, // 2(packet info), RFU, payload length(28) 0x47, 0x36, 0x25, 0x14, // 4(session id (LE)) 0x02, 0x01, 0x12, 0x34, // action, # controlee, 2(short address (LE)) 0x46, 0x35, 0x24, 0x13, // 4(subsession id (LE)) 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef, 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef, // 16(subsession key(LE)) - ] + ]) ); } @@ -1183,10 +1195,10 @@ mod tests { .unwrap() .into(); let packet_fragments: Vec<UciControlPacketHal> = packet.into(); - let uci_packet: Vec<u8> = packet_fragments[0].clone().into(); + let uci_packet = packet_fragments[0].encode_to_vec(); assert_eq!( uci_packet, - vec![ + Ok(vec![ 0x21, 0x07, 0x00, 0x2c, // 2(packet info), RFU, payload length(44) 0x47, 0x36, 0x25, 0x14, // 4(session id (LE)) 0x03, 0x01, 0x12, 0x34, // action, # controlee, 2(short address (LE)) @@ -1194,7 +1206,7 @@ mod tests { 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef, 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef, 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef, 0x12, 0x34, 0x56, 0x78, 0x90, 0xab, 0xcd, 0xef, // 32(subsession key(LE)) - ] + ]) ); } @@ -1414,15 +1426,15 @@ mod tests { .unwrap() .into(); let packet_fragments: Vec<UciControlPacketHal> = packet.into(); - let uci_packet: Vec<u8> = packet_fragments[0].clone().into(); + let uci_packet = packet_fragments[0].encode_to_vec(); assert_eq!( uci_packet, - vec![ + Ok(vec![ 0x21, 0x0e, 0x00, 0x0b, // 2(packet info), RFU, payload length(11) 0x78, 0x56, 0x34, 0x12, // 4(session id (LE)) 0x00, 0x02, 0x01, // dtpcm_repetition, data_transfer_control, dtpml_size 0x00, 0x01, 0x02, 0x03, // payload - ] + ]) ); } @@ -1445,10 +1457,10 @@ mod tests { .unwrap() .into(); let packet_fragments: Vec<UciControlPacketHal> = packet.into(); - let uci_packet: Vec<u8> = packet_fragments[0].clone().into(); + let uci_packet = packet_fragments[0].encode_to_vec(); assert_eq!( uci_packet, - vec![ + Ok(vec![ 0x21, 0x0c, 0x00, 0x19, // 2(packet info), RFU, payload length(25) 0x78, 0x56, 0x34, 0x12, // 4(session id (LE)) 0x00, 0x00, // message_control, number_of_phases @@ -1458,7 +1470,7 @@ mod tests { 0x21, 0x11, // end slot index (LE) 0x00, // phase_participation 0x01, 0x02, // mac address - ] + ]) ); } @@ -1481,10 +1493,10 @@ mod tests { .unwrap() .into(); let packet_fragments: Vec<UciControlPacketHal> = packet.into(); - let uci_packet: Vec<u8> = packet_fragments[0].clone().into(); + let uci_packet = packet_fragments[0].encode_to_vec(); assert_eq!( uci_packet, - vec![ + Ok(vec![ 0x21, 0x0c, 0x00, 0x1f, // 2(packet info), RFU, payload length(31) 0x78, 0x56, 0x34, 0x12, // 4(session id (LE)) 0x00, 0x00, // message_control, number_of_phases @@ -1494,7 +1506,7 @@ mod tests { 0x21, 0x11, // end slot index (LE) 0x00, // phase_participation 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08 // mac address - ] + ]) ); } } |