diff options
author | ziyiw <ziyiw@google.com> | 2022-05-12 18:01:22 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2022-05-12 18:01:22 +0000 |
commit | c57e1f7c025f23fd87abe0627d2735570cb2b2e1 (patch) | |
tree | 32e3d1aa8a97e39e9d18c9446b2c593b90d8f139 | |
parent | 2e80b87ea2ef5a06c21ac1d79ed8608243a4207a (diff) | |
parent | d789afda65c307ac89322328325fe7dc69de2edd (diff) | |
download | uwb-android13-qpr2-s3-release.tar.gz |
Fuzz remaining UciNotifications and send them from HAL to Uci layer. am: efe3409fc6 am: d789afda65android-13.0.0_r83android-13.0.0_r82android-13.0.0_r81android-13.0.0_r80android-13.0.0_r79android-13.0.0_r78android-13.0.0_r77android-13.0.0_r76android-13.0.0_r75android-13.0.0_r74android-13.0.0_r73android-13.0.0_r72android-13.0.0_r71android-13.0.0_r70android-13.0.0_r69android-13.0.0_r68android-13.0.0_r67android-13.0.0_r66android-13.0.0_r65android-13.0.0_r64android-13.0.0_r63android-13.0.0_r62android-13.0.0_r61android-13.0.0_r60android-13.0.0_r59android-13.0.0_r58android-13.0.0_r56android-13.0.0_r54android-13.0.0_r53android-13.0.0_r52android-13.0.0_r51android-13.0.0_r50android-13.0.0_r49android-13.0.0_r48android-13.0.0_r47android-13.0.0_r46android-13.0.0_r45android-13.0.0_r44android-13.0.0_r43android-13.0.0_r42android-13.0.0_r41android-13.0.0_r40android-13.0.0_r39android-13.0.0_r38android-13.0.0_r37android-13.0.0_r36android-13.0.0_r35android-13.0.0_r34android-13.0.0_r33android-13.0.0_r32android13-qpr3-s9-releaseandroid13-qpr3-s8-releaseandroid13-qpr3-s7-releaseandroid13-qpr3-s6-releaseandroid13-qpr3-s5-releaseandroid13-qpr3-s4-releaseandroid13-qpr3-s3-releaseandroid13-qpr3-s2-releaseandroid13-qpr3-s14-releaseandroid13-qpr3-s13-releaseandroid13-qpr3-s12-releaseandroid13-qpr3-s11-releaseandroid13-qpr3-s10-releaseandroid13-qpr3-s1-releaseandroid13-qpr3-releaseandroid13-qpr3-c-s8-releaseandroid13-qpr3-c-s7-releaseandroid13-qpr3-c-s6-releaseandroid13-qpr3-c-s5-releaseandroid13-qpr3-c-s4-releaseandroid13-qpr3-c-s3-releaseandroid13-qpr3-c-s2-releaseandroid13-qpr3-c-s12-releaseandroid13-qpr3-c-s11-releaseandroid13-qpr3-c-s10-releaseandroid13-qpr3-c-s1-releaseandroid13-qpr2-s9-releaseandroid13-qpr2-s8-releaseandroid13-qpr2-s7-releaseandroid13-qpr2-s6-releaseandroid13-qpr2-s5-releaseandroid13-qpr2-s3-releaseandroid13-qpr2-s2-releaseandroid13-qpr2-s12-releaseandroid13-qpr2-s11-releaseandroid13-qpr2-s10-releaseandroid13-qpr2-s1-releaseandroid13-qpr2-releaseandroid13-qpr2-b-s1-releaseandroid13-d4-s2-releaseandroid13-d4-s1-releaseandroid13-d4-release
Original change: https://googleplex-android-review.googlesource.com/c/platform/external/uwb/+/18231392
Change-Id: I4e5f3aa99867ad89d9b9544a8f51c70225d7f601
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
-rw-r--r-- | src/fuzz/fuzzer.rs | 255 |
1 files changed, 244 insertions, 11 deletions
diff --git a/src/fuzz/fuzzer.rs b/src/fuzz/fuzzer.rs index b30e992..e97d07f 100644 --- a/src/fuzz/fuzzer.rs +++ b/src/fuzz/fuzzer.rs @@ -11,16 +11,20 @@ use std::sync::Arc; use tokio::sync::mpsc; use uwb_uci_packets::{ AndroidGetPowerStatsCmdBuilder, AndroidGetPowerStatsRspBuilder, - AndroidSetCountryCodeCmdBuilder, AndroidSetCountryCodeRspBuilder, DeviceResetRspBuilder, - DeviceState, DeviceStatusNtfBuilder, GenericErrorBuilder, GetCapsInfoCmdBuilder, - GetCapsInfoRspBuilder, GetDeviceInfoCmdBuilder, GetDeviceInfoRspBuilder, PowerStats, - RangeStartCmdBuilder, RangeStartRspBuilder, RangeStopCmdBuilder, RangeStopRspBuilder, - ReasonCode, SessionDeinitCmdBuilder, SessionDeinitRspBuilder, SessionGetAppConfigCmdBuilder, + AndroidSetCountryCodeCmdBuilder, AndroidSetCountryCodeRspBuilder, ControleeStatus, + DeviceResetRspBuilder, DeviceState, DeviceStatusNtfBuilder, + ExtendedAddressTwoWayRangingMeasurement, ExtendedMacTwoWayRangeDataNtfBuilder, + GenericErrorBuilder, GetCapsInfoCmdBuilder, GetCapsInfoRspBuilder, GetDeviceInfoCmdBuilder, + GetDeviceInfoRspBuilder, MulticastUpdateStatusCode, PowerStats, RangeStartCmdBuilder, + RangeStartRspBuilder, RangeStopCmdBuilder, RangeStopRspBuilder, ReasonCode, + SessionDeinitCmdBuilder, SessionDeinitRspBuilder, SessionGetAppConfigCmdBuilder, SessionGetAppConfigRspBuilder, SessionGetCountCmdBuilder, SessionGetCountRspBuilder, SessionGetStateCmdBuilder, SessionGetStateRspBuilder, SessionInitCmdBuilder, SessionInitRspBuilder, SessionSetAppConfigRspBuilder, SessionState, SessionStatusNtfBuilder, - SessionType, SessionUpdateControllerMulticastListRspBuilder, StatusCode, UciCommandPacket, - UciPacketChild, UciPacketPacket, UciVendor_9_ResponseBuilder, + SessionType, SessionUpdateControllerMulticastListNtfBuilder, + SessionUpdateControllerMulticastListRspBuilder, ShortAddressTwoWayRangingMeasurement, + ShortMacTwoWayRangeDataNtfBuilder, StatusCode, UciCommandPacket, UciPacketChild, + UciPacketPacket, UciVendor_9_ResponseBuilder, }; use uwb_uci_rust::adaptation::mock_adaptation::MockUwbAdaptation; use uwb_uci_rust::error::UwbErr; @@ -31,9 +35,127 @@ use uwb_uci_rust::uci::{ #[derive(Debug, Clone, Arbitrary)] enum UciNotification { - GenericError { status: u8 }, - DeviceStatusNtf { device_state: u8 }, - SessionStatusNtf { session_id: u32, session_state: u8, reason_code: u8 }, + GenericError { + status: u8, + }, + DeviceStatusNtf { + device_state: u8, + }, + SessionStatusNtf { + session_id: u32, + session_state: u8, + reason_code: u8, + }, + ShortMacTwoWayRangeDataNtf { + sequence_number: u32, + session_id: u32, + rcr_indicator: u8, + current_ranging_interval: u32, + two_way_ranging_measurements: Vec<ShortAddressMeasurement>, + }, + ExtendedMacTwoWayRangeDataNtf { + sequence_number: u32, + session_id: u32, + rcr_indicator: u8, + current_ranging_interval: u32, + two_way_ranging_measurements: Vec<ExtendedAddressMeasurement>, + }, + SessionUpdateControllerMulticastListNtf { + session_id: u32, + remaining_multicast_list_size: u8, + controlee_status: Vec<MockControleeStatus>, + }, +} + +#[derive(Debug, Clone, Arbitrary)] +struct ShortAddressMeasurement { + mac_address: u16, + status: u8, + nlos: u8, + distance: u16, + aoa_azimuth: u16, + aoa_azimuth_fom: u8, + aoa_elevation: u16, + aoa_elevation_fom: u8, + aoa_destination_azimuth: u16, + aoa_destination_azimuth_fom: u8, + aoa_destination_elevation: u16, + aoa_destination_elevation_fom: u8, + slot_index: u8, +} + +impl ShortAddressMeasurement { + fn convert(&self) -> Result<ShortAddressTwoWayRangingMeasurement, UwbErr> { + Ok(ShortAddressTwoWayRangingMeasurement { + mac_address: self.mac_address, + status: StatusCode::from_u8(self.status).ok_or(UwbErr::InvalidArgs)?, + nlos: self.nlos, + distance: self.distance, + aoa_azimuth: self.aoa_azimuth, + aoa_azimuth_fom: self.aoa_azimuth_fom, + aoa_elevation: self.aoa_elevation, + aoa_elevation_fom: self.aoa_elevation_fom, + aoa_destination_azimuth: self.aoa_destination_azimuth, + aoa_destination_azimuth_fom: self.aoa_destination_azimuth_fom, + aoa_destination_elevation: self.aoa_destination_elevation, + aoa_destination_elevation_fom: self.aoa_destination_elevation_fom, + slot_index: self.slot_index, + }) + } +} + +#[derive(Debug, Clone, Arbitrary)] +struct ExtendedAddressMeasurement { + mac_address: u64, + status: u8, + nlos: u8, + distance: u16, + aoa_azimuth: u16, + aoa_azimuth_fom: u8, + aoa_elevation: u16, + aoa_elevation_fom: u8, + aoa_destination_azimuth: u16, + aoa_destination_azimuth_fom: u8, + aoa_destination_elevation: u16, + aoa_destination_elevation_fom: u8, + slot_index: u8, +} + +impl ExtendedAddressMeasurement { + fn convert(&self) -> Result<ExtendedAddressTwoWayRangingMeasurement, UwbErr> { + Ok(ExtendedAddressTwoWayRangingMeasurement { + mac_address: self.mac_address, + status: StatusCode::from_u8(self.status).ok_or(UwbErr::InvalidArgs)?, + nlos: self.nlos, + distance: self.distance, + aoa_azimuth: self.aoa_azimuth, + aoa_azimuth_fom: self.aoa_azimuth_fom, + aoa_elevation: self.aoa_elevation, + aoa_elevation_fom: self.aoa_elevation_fom, + aoa_destination_azimuth: self.aoa_destination_azimuth, + aoa_destination_azimuth_fom: self.aoa_destination_azimuth_fom, + aoa_destination_elevation: self.aoa_destination_elevation, + aoa_destination_elevation_fom: self.aoa_destination_elevation_fom, + slot_index: self.slot_index, + }) + } +} + +#[derive(Debug, Clone, Arbitrary)] +struct MockControleeStatus { + mac_address: u16, + subsession_id: u32, + status: u8, +} + +impl MockControleeStatus { + fn convert(&self) -> Result<ControleeStatus, UwbErr> { + Ok(ControleeStatus { + mac_address: self.mac_address, + subsession_id: self.subsession_id, + status: MulticastUpdateStatusCode::from_u8(self.status).ok_or(UwbErr::InvalidArgs)?, + }) + } } #[derive(Debug, Clone, Arbitrary)] @@ -88,7 +210,7 @@ fn create_dispatcher_with_mock_adaptation( mock_event_manager.expect_device_status_notification_received(Ok(())) } UciNotification::SessionStatusNtf { - session_id: _session_ids, + session_id: _session_id, session_state, reason_code, } => { @@ -102,6 +224,55 @@ fn create_dispatcher_with_mock_adaptation( } mock_event_manager.expect_session_status_notification_received(Ok(())) } + UciNotification::ShortMacTwoWayRangeDataNtf { + sequence_number: _sequence_number, + session_id: _session_id, + rcr_indicator: _rcr_indicator, + current_ranging_interval: _current_ranging_interval, + two_way_ranging_measurements, + } => { + for measurement in two_way_ranging_measurements.iter() { + if StatusCode::from_u8(measurement.status).is_none() { + mock_adaptation.clear_expected_calls(); + mock_event_manager.clear_expected_calls(); + return Err(UwbErr::InvalidArgs); + } + } + mock_event_manager.expect_short_range_data_notification_received(Ok(())) + } + UciNotification::ExtendedMacTwoWayRangeDataNtf { + sequence_number: _sequence_number, + session_id: _session_id, + rcr_indicator: _rcr_indicator, + current_ranging_interval: _current_ranging_interval, + two_way_ranging_measurements, + } => { + for measurement in two_way_ranging_measurements.iter() { + if StatusCode::from_u8(measurement.status).is_none() { + mock_adaptation.clear_expected_calls(); + mock_event_manager.clear_expected_calls(); + return Err(UwbErr::InvalidArgs); + } + } + mock_event_manager.expect_extended_range_data_notification_received(Ok(())) + } + UciNotification::SessionUpdateControllerMulticastListNtf { + session_id: _session_id, + remaining_multicast_list_size: _remaining_multicast_list_size, + controlee_status, + } => { + for status in controlee_status.iter() { + if MulticastUpdateStatusCode::from_u8(status.status).is_none() { + mock_adaptation.clear_expected_calls(); + mock_event_manager.clear_expected_calls(); + return Err(UwbErr::InvalidArgs); + } + } + mock_event_manager + .expect_session_update_controller_multicast_list_notification_received(Ok( + (), + )) + } }, } } @@ -322,6 +493,68 @@ fn consume_command(msgs: Vec<Command>) -> Result<(), UwbErr> { } .build(), ), + UciNotification::ShortMacTwoWayRangeDataNtf { + sequence_number, + session_id, + rcr_indicator, + current_ranging_interval, + two_way_ranging_measurements, + } => { + let mut measurements = Vec::new(); + for measurement in two_way_ranging_measurements.iter() { + measurements.push(measurement.convert()?); + } + uci_hrcv::UciNotification::ShortMacTwoWayRangeDataNtf( + ShortMacTwoWayRangeDataNtfBuilder { + sequence_number, + session_id, + rcr_indicator, + current_ranging_interval, + two_way_ranging_measurements: measurements, + } + .build(), + ) + } + UciNotification::ExtendedMacTwoWayRangeDataNtf { + sequence_number, + session_id, + rcr_indicator, + current_ranging_interval, + two_way_ranging_measurements, + } => { + let mut measurements = Vec::new(); + for measurement in two_way_ranging_measurements.iter() { + measurements.push(measurement.convert()?); + } + uci_hrcv::UciNotification::ExtendedMacTwoWayRangeDataNtf( + ExtendedMacTwoWayRangeDataNtfBuilder { + sequence_number, + session_id, + rcr_indicator, + current_ranging_interval, + two_way_ranging_measurements: measurements, + } + .build(), + ) + } + UciNotification::SessionUpdateControllerMulticastListNtf { + session_id, + remaining_multicast_list_size, + controlee_status, + } => { + let mut status_vec = Vec::new(); + for status in controlee_status.iter() { + status_vec.push(status.convert()?); + } + uci_hrcv::UciNotification::SessionUpdateControllerMulticastListNtf( + SessionUpdateControllerMulticastListNtfBuilder { + session_id, + remaining_multicast_list_size, + controlee_status: status_vec, + } + .build(), + ) + } }; rsp_sender .send(HalCallback::UciNtf(evt)) |