diff options
author | Dajung Lee <dajunglee@google.com> | 2024-03-28 21:01:10 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2024-03-28 21:01:10 +0000 |
commit | fe4ccb7efe94806a93ff60fbf4f9388d6713785b (patch) | |
tree | 165e1320a540f136ad10b839e998af4341ccf731 | |
parent | f6b8908a080cc359e8a0a11ada390c20fde674bd (diff) | |
download | uwb-fe4ccb7efe94806a93ff60fbf4f9388d6713785b.tar.gz |
Revert "Support Multicast NTF V1/V2 packet formats."
Revert submission 3018363-uwb_multicast_ntf
Reason for revert: b/331836038
Reverted changes: /q/submissionid:3018363-uwb_multicast_ntf
Change-Id: I29b995c1b4e248f49b700987d3546f47261969d2
-rw-r--r-- | src/rust/uwb_core/src/params/uci_packets.rs | 20 | ||||
-rw-r--r-- | src/rust/uwb_core/src/session/session_manager.rs | 14 | ||||
-rw-r--r-- | src/rust/uwb_core/src/session/uwb_session.rs | 10 | ||||
-rw-r--r-- | src/rust/uwb_core/src/uci/message.rs | 8 | ||||
-rw-r--r-- | src/rust/uwb_core/src/uci/notification.rs | 124 | ||||
-rw-r--r-- | src/rust/uwb_core/src/uci/uci_manager.rs | 25 | ||||
-rw-r--r-- | src/rust/uwb_uci_packets/uci_packets.pdl | 24 |
7 files changed, 56 insertions, 169 deletions
diff --git a/src/rust/uwb_core/src/params/uci_packets.rs b/src/rust/uwb_core/src/params/uci_packets.rs index f5f969d..6f42e3b 100644 --- a/src/rust/uwb_core/src/params/uci_packets.rs +++ b/src/rust/uwb_core/src/params/uci_packets.rs @@ -21,16 +21,16 @@ use std::iter::FromIterator; // Re-export enums and structs from uwb_uci_packets. pub use uwb_uci_packets::{ AppConfigStatus, AppConfigTlv as RawAppConfigTlv, AppConfigTlvType, BitsPerSample, CapTlv, - CapTlvType, Controlee, ControleePhaseList, ControleeStatusV1, ControleeStatusV2, Controlees, - CreditAvailability, DataRcvStatusCode, DataTransferNtfStatusCode, - DataTransferPhaseConfigUpdateStatusCode, DeviceConfigId, DeviceConfigStatus, DeviceConfigTlv, - DeviceState, ExtendedAddressDlTdoaRangingMeasurement, ExtendedAddressOwrAoaRangingMeasurement, - ExtendedAddressTwoWayRangingMeasurement, GroupId, MacAddressIndicator, MessageType, - MulticastUpdateStatusCode, PhaseList, PowerStats, RadarConfigStatus, RadarConfigTlv, - RadarConfigTlvType, RadarDataType, RangingMeasurementType, ReasonCode, ResetConfig, - SessionState, SessionType, ShortAddressDlTdoaRangingMeasurement, - ShortAddressOwrAoaRangingMeasurement, ShortAddressTwoWayRangingMeasurement, StatusCode, - UpdateMulticastListAction, + CapTlvType, Controlee, ControleePhaseList, ControleeStatus, Controlees, CreditAvailability, + DataRcvStatusCode, DataTransferNtfStatusCode, DataTransferPhaseConfigUpdateStatusCode, + DeviceConfigId, DeviceConfigStatus, DeviceConfigTlv, DeviceState, + ExtendedAddressDlTdoaRangingMeasurement, ExtendedAddressOwrAoaRangingMeasurement, + ExtendedAddressTwoWayRangingMeasurement, GroupId, MacAddressIndicator, + MessageType, MulticastUpdateStatusCode, PhaseList, PowerStats, RadarConfigStatus, + RadarConfigTlv, RadarConfigTlvType, RadarDataType, RangingMeasurementType, ReasonCode, + ResetConfig, SessionState, SessionType, ShortAddressDlTdoaRangingMeasurement, + ShortAddressOwrAoaRangingMeasurement, ShortAddressTwoWayRangingMeasurement, + StatusCode, UpdateMulticastListAction, }; pub(crate) use uwb_uci_packets::{UciControlPacket, UciDataPacket, UciDataPacketHal}; diff --git a/src/rust/uwb_core/src/session/session_manager.rs b/src/rust/uwb_core/src/session/session_manager.rs index 02e79fa..38a9887 100644 --- a/src/rust/uwb_core/src/session/session_manager.rs +++ b/src/rust/uwb_core/src/session/session_manager.rs @@ -336,16 +336,13 @@ impl<T: UciManager> SessionManagerActor<T> { UciSessionNotification::UpdateControllerMulticastList { session_token, remaining_multicast_list_size: _, - status_list_v1, - status_list_v2: _, + status_list, } => match self.active_sessions.get_mut(&session_token) { - // TODO: Use status_list_v2 when it's not empty (can convert it into - // status_list_v1, since that is a super-set). - Some(session) => session.on_controller_multicast_list_udpated(status_list_v1), + Some(session) => session.on_controller_multicast_list_udpated(status_list), None => { warn!( "Received the notification of the unknown Session {}: {:?}", - session_token, status_list_v1, + session_token, status_list ); } }, @@ -587,7 +584,7 @@ mod tests { use crate::params::ccc_started_app_config_params::CccStartedAppConfigParams; use crate::params::uci_packets::{ - AppConfigTlv, AppConfigTlvType, ControleeStatusV1, Controlees, MulticastUpdateStatusCode, + AppConfigTlv, AppConfigTlvType, ControleeStatus, Controlees, MulticastUpdateStatusCode, ReasonCode, SetAppConfigResponse, StatusCode, }; use crate::params::utils::{u32_to_bytes, u64_to_bytes, u8_to_bytes}; @@ -816,12 +813,11 @@ mod tests { UciSessionNotification::UpdateControllerMulticastList { session_token: session_id, remaining_multicast_list_size: 1, - status_list_v1: vec![ControleeStatusV1 { + status_list: vec![ControleeStatus { mac_address: [0x34, 0x12], subsession_id: 0x24, status: MulticastUpdateStatusCode::StatusOkMulticastListUpdate, }], - status_list_v2: vec![], }, )]; uci_manager.expect_session_init( diff --git a/src/rust/uwb_core/src/session/uwb_session.rs b/src/rust/uwb_core/src/session/uwb_session.rs index c6732c3..37fcba4 100644 --- a/src/rust/uwb_core/src/session/uwb_session.rs +++ b/src/rust/uwb_core/src/session/uwb_session.rs @@ -24,7 +24,7 @@ use crate::error::{Error, Result}; use crate::params::app_config_params::AppConfigParams; use crate::params::ccc_started_app_config_params::CccStartedAppConfigParams; use crate::params::uci_packets::{ - Controlee, ControleeStatusV1, Controlees, MulticastUpdateStatusCode, SessionId, SessionState, + Controlee, ControleeStatus, Controlees, MulticastUpdateStatusCode, SessionId, SessionState, SessionType, UpdateMulticastListAction, }; use crate::uci::error::status_code_to_result; @@ -42,7 +42,7 @@ pub(super) type ResponseSender = oneshot::Sender<Result<Response>>; pub(super) struct UwbSession { cmd_sender: mpsc::UnboundedSender<(Command, ResponseSender)>, state_sender: watch::Sender<SessionState>, - controlee_status_notf_sender: Option<oneshot::Sender<Vec<ControleeStatusV1>>>, + controlee_status_notf_sender: Option<oneshot::Sender<Vec<ControleeStatus>>>, } impl UwbSession { @@ -110,7 +110,7 @@ impl UwbSession { let _ = self.state_sender.send(state); } - pub fn on_controller_multicast_list_udpated(&mut self, status_list: Vec<ControleeStatusV1>) { + pub fn on_controller_multicast_list_udpated(&mut self, status_list: Vec<ControleeStatus>) { if let Some(sender) = self.controlee_status_notf_sender.take() { let _ = sender.send(status_list); } @@ -294,7 +294,7 @@ impl<T: UciManager> UwbSessionActor<T> { &mut self, action: UpdateMulticastListAction, controlees: Vec<Controlee>, - notf_receiver: oneshot::Receiver<Vec<ControleeStatusV1>>, + notf_receiver: oneshot::Receiver<Vec<ControleeStatus>>, ) -> Result<Response> { if self.session_type == SessionType::Ccc { error!("Cannot update multicast list for CCC session"); @@ -387,7 +387,7 @@ enum Command { UpdateControllerMulticastList { action: UpdateMulticastListAction, controlees: Vec<Controlee>, - notf_receiver: oneshot::Receiver<Vec<ControleeStatusV1>>, + notf_receiver: oneshot::Receiver<Vec<ControleeStatus>>, }, GetParams, } diff --git a/src/rust/uwb_core/src/uci/message.rs b/src/rust/uwb_core/src/uci/message.rs index d0caa77..fcbc65d 100644 --- a/src/rust/uwb_core/src/uci/message.rs +++ b/src/rust/uwb_core/src/uci/message.rs @@ -26,17 +26,15 @@ pub(super) enum UciMessage { Notification(UciNotification), } -impl TryFrom<(uwb_uci_packets::UciControlPacket, u8)> for UciMessage { +impl TryFrom<uwb_uci_packets::UciControlPacket> for UciMessage { type Error = Error; - fn try_from(pair: (uwb_uci_packets::UciControlPacket, u8)) -> Result<Self, Self::Error> { - let packet = pair.0; - let uci_fira_major_ver = pair.1; + fn try_from(packet: uwb_uci_packets::UciControlPacket) -> Result<Self, Self::Error> { match packet.specialize() { uwb_uci_packets::UciControlPacketChild::UciResponse(evt) => { Ok(UciMessage::Response(evt.try_into()?)) } uwb_uci_packets::UciControlPacketChild::UciNotification(evt) => { - Ok(UciMessage::Notification((evt, uci_fira_major_ver).try_into()?)) + Ok(UciMessage::Notification(evt.try_into()?)) } _ => { error!("Unknown packet for converting to UciMessage: {:?}", packet); diff --git a/src/rust/uwb_core/src/uci/notification.rs b/src/rust/uwb_core/src/uci/notification.rs index 7c55c14..08af530 100644 --- a/src/rust/uwb_core/src/uci/notification.rs +++ b/src/rust/uwb_core/src/uci/notification.rs @@ -25,7 +25,7 @@ use uwb_uci_packets::{ use crate::error::{Error, Result}; use crate::params::fira_app_config_params::UwbAddress; use crate::params::uci_packets::{ - BitsPerSample, ControleeStatusV1, ControleeStatusV2, CreditAvailability, DataRcvStatusCode, + BitsPerSample, ControleeStatus, CreditAvailability, DataRcvStatusCode, DataTransferNtfStatusCode, DataTransferPhaseConfigUpdateStatusCode, DeviceState, ExtendedAddressDlTdoaRangingMeasurement, ExtendedAddressOwrAoaRangingMeasurement, ExtendedAddressTwoWayRangingMeasurement, RadarDataType, RangingMeasurementType, RawUciMessage, @@ -71,10 +71,8 @@ pub enum SessionNotification { session_token: SessionToken, /// count of controlees: u8 remaining_multicast_list_size: usize, - /// Controlee status List (Fira 1.x) - status_list_v1: Vec<ControleeStatusV1>, - /// Controlee status List (Fira 2.0) - status_list_v2: Vec<ControleeStatusV2>, + /// list of controlees. + status_list: Vec<ControleeStatus>, }, /// (Short/Extended)Mac()SessionInfoNtf equivalent SessionInfo(SessionRangeData), @@ -333,19 +331,14 @@ impl UciNotification { } } -impl TryFrom<(uwb_uci_packets::UciNotification, u8)> for UciNotification { +impl TryFrom<uwb_uci_packets::UciNotification> for UciNotification { type Error = Error; - fn try_from( - pair: (uwb_uci_packets::UciNotification, u8), - ) -> std::result::Result<Self, Self::Error> { + fn try_from(evt: uwb_uci_packets::UciNotification) -> std::result::Result<Self, Self::Error> { use uwb_uci_packets::UciNotificationChild; - let evt = pair.0; - let uci_fira_major_ver = pair.1; - match evt.specialize() { UciNotificationChild::CoreNotification(evt) => Ok(Self::Core(evt.try_into()?)), UciNotificationChild::SessionConfigNotification(evt) => { - Ok(Self::Session((evt, uci_fira_major_ver).try_into()?)) + Ok(Self::Session(evt.try_into()?)) } UciNotificationChild::SessionControlNotification(evt) => { Ok(Self::Session(evt.try_into()?)) @@ -382,38 +375,23 @@ impl TryFrom<uwb_uci_packets::CoreNotification> for CoreNotification { } } -impl TryFrom<(uwb_uci_packets::SessionConfigNotification, u8)> for SessionNotification { +impl TryFrom<uwb_uci_packets::SessionConfigNotification> for SessionNotification { type Error = Error; fn try_from( - pair: (uwb_uci_packets::SessionConfigNotification, u8), + evt: uwb_uci_packets::SessionConfigNotification, ) -> std::result::Result<Self, Self::Error> { use uwb_uci_packets::SessionConfigNotificationChild; - let evt = pair.0; - let uci_fira_major_ver = pair.1; match evt.specialize() { SessionConfigNotificationChild::SessionStatusNtf(evt) => Ok(Self::Status { session_token: evt.get_session_token(), session_state: evt.get_session_state(), reason_code: evt.get_reason_code(), }), - SessionConfigNotificationChild::SessionUpdateControllerMulticastListNtfV1(evt) - if uci_fira_major_ver == 1 => - { + SessionConfigNotificationChild::SessionUpdateControllerMulticastListNtf(evt) => { Ok(Self::UpdateControllerMulticastList { session_token: evt.get_session_token(), remaining_multicast_list_size: evt.get_remaining_multicast_list_size() as usize, - status_list_v1: evt.get_controlee_status().clone(), - status_list_v2: vec![], - }) - } - SessionConfigNotificationChild::SessionUpdateControllerMulticastListNtfV2(evt) - if uci_fira_major_ver >= 2 => - { - Ok(Self::UpdateControllerMulticastList { - session_token: evt.get_session_token(), - remaining_multicast_list_size: 0_usize, // undefined field in FiEa 2.0 NTF. - status_list_v1: vec![], - status_list_v2: evt.get_controlee_status().clone(), + status_list: evt.get_controlee_status().clone(), }) } SessionConfigNotificationChild::SessionDataTransferPhaseConfigNtf(evt) => { @@ -907,10 +885,8 @@ mod tests { .build(); let session_notification_packet = uwb_uci_packets::SessionConfigNotification::try_from(session_status_ntf).unwrap(); - let uci_fira_major_version = 1; let session_notification = - SessionNotification::try_from((session_notification_packet, uci_fira_major_version)) - .unwrap(); + SessionNotification::try_from(session_notification_packet).unwrap(); let uci_notification_from_session_status_ntf = UciNotification::Session(session_notification); assert_eq!( @@ -925,36 +901,31 @@ mod tests { } #[test] - fn test_session_notification_cast_from_session_update_controller_multicast_list_ntf_v1_packet() + fn test_session_notification_casting_from_session_update_controller_multicast_list_ntf_packet() { - let controlee_status_v1 = uwb_uci_packets::ControleeStatusV1 { + let controlee_status = uwb_uci_packets::ControleeStatus { mac_address: [0x0c, 0xa8], subsession_id: 0x30, status: uwb_uci_packets::MulticastUpdateStatusCode::StatusOkMulticastListUpdate, }; - let another_controlee_status_v1 = uwb_uci_packets::ControleeStatusV1 { + let another_controlee_status = uwb_uci_packets::ControleeStatus { mac_address: [0x0c, 0xa9], subsession_id: 0x31, status: uwb_uci_packets::MulticastUpdateStatusCode::StatusErrorKeyFetchFail, }; - let session_update_controller_multicast_list_ntf_v1 = - uwb_uci_packets::SessionUpdateControllerMulticastListNtfV1Builder { + let session_update_controller_multicast_list_ntf = + uwb_uci_packets::SessionUpdateControllerMulticastListNtfBuilder { session_token: 0x32, remaining_multicast_list_size: 0x2, - controlee_status: vec![ - controlee_status_v1.clone(), - another_controlee_status_v1.clone(), - ], + controlee_status: vec![controlee_status.clone(), another_controlee_status.clone()], } .build(); let session_notification_packet = uwb_uci_packets::SessionConfigNotification::try_from( - session_update_controller_multicast_list_ntf_v1, + session_update_controller_multicast_list_ntf, ) .unwrap(); - let uci_fira_major_version = 1; let session_notification = - SessionNotification::try_from((session_notification_packet, uci_fira_major_version)) - .unwrap(); + SessionNotification::try_from(session_notification_packet).unwrap(); let uci_notification_from_session_update_controller_multicast_list_ntf = UciNotification::Session(session_notification); assert_eq!( @@ -962,51 +933,7 @@ mod tests { UciNotification::Session(SessionNotification::UpdateControllerMulticastList { session_token: 0x32, remaining_multicast_list_size: 0x2, - status_list_v1: vec![controlee_status_v1, another_controlee_status_v1], - status_list_v2: vec![], - }) - ); - } - - #[test] - fn test_session_notification_cast_from_session_update_controller_multicast_list_ntf_v2_packet() - { - let controlee_status_v2 = uwb_uci_packets::ControleeStatusV2 { - mac_address: [0x0c, 0xa8], - status: uwb_uci_packets::MulticastUpdateStatusCode::StatusOkMulticastListUpdate, - }; - let another_controlee_status_v2 = uwb_uci_packets::ControleeStatusV2 { - mac_address: [0x0c, 0xa9], - status: uwb_uci_packets::MulticastUpdateStatusCode::StatusErrorKeyFetchFail, - }; - let session_update_controller_multicast_list_ntf_v2 = - uwb_uci_packets::SessionUpdateControllerMulticastListNtfV2Builder { - session_token: 0x32, - controlee_status: vec![ - controlee_status_v2.clone(), - another_controlee_status_v2.clone(), - ], - } - .build(); - let session_notification_packet = uwb_uci_packets::SessionConfigNotification::try_from( - session_update_controller_multicast_list_ntf_v2, - ) - .unwrap(); - let uci_fira_major_version = 2; - let session_notification = - SessionNotification::try_from((session_notification_packet, uci_fira_major_version)) - .unwrap(); - //let session_notification = - // parse_uci_session_ntf(session_notification_packet, Some(2)).unwrap(); - let uci_notification_from_session_update_controller_multicast_list_ntf = - UciNotification::Session(session_notification); - assert_eq!( - uci_notification_from_session_update_controller_multicast_list_ntf, - UciNotification::Session(SessionNotification::UpdateControllerMulticastList { - session_token: 0x32, - remaining_multicast_list_size: 0x0, - status_list_v1: vec![], - status_list_v2: vec![controlee_status_v2, another_controlee_status_v2], + status_list: vec![controlee_status, another_controlee_status], }) ); } @@ -1025,13 +952,10 @@ mod tests { } .build() .into(); - let uci_fira_major_version = 1; let uci_notification_from_vendor_9 = - UciNotification::try_from((vendor_9_empty_notification, uci_fira_major_version)) - .unwrap(); + UciNotification::try_from(vendor_9_empty_notification).unwrap(); let uci_notification_from_vendor_A = - UciNotification::try_from((vendor_A_nonempty_notification, uci_fira_major_version)) - .unwrap(); + UciNotification::try_from(vendor_A_nonempty_notification).unwrap(); assert_eq!( uci_notification_from_vendor_9, UciNotification::Vendor(RawUciMessage { @@ -1054,9 +978,7 @@ mod tests { fn test_test_to_vendor_notification_casting() { let test_notification: uwb_uci_packets::UciNotification = uwb_uci_packets::TestNotificationBuilder { opcode: 0x22, payload: None }.build().into(); - let uci_fira_major_version = 1; - let test_uci_notification = - UciNotification::try_from((test_notification, uci_fira_major_version)).unwrap(); + let test_uci_notification = UciNotification::try_from(test_notification).unwrap(); assert_eq!( test_uci_notification, UciNotification::Vendor(RawUciMessage { diff --git a/src/rust/uwb_core/src/uci/uci_manager.rs b/src/rust/uwb_core/src/uci/uci_manager.rs index 7e10cd0..4104dc2 100644 --- a/src/rust/uwb_core/src/uci/uci_manager.rs +++ b/src/rust/uwb_core/src/uci/uci_manager.rs @@ -941,15 +941,6 @@ impl<T: UciHal, U: UciLogger> UciManagerActor<T, U> { } } - fn get_uwbs_uci_major_version(&mut self) -> Option<u8> { - if let Some(core_get_device_info_rsp) = &self.get_device_info_rsp { - // Byte 0 : Major UCI version - // Calling unwrap() will be safe here as with the bitmask, the value will be within u8. - return Some((core_get_device_info_rsp.uci_version & 0xFF).try_into().unwrap()); - } - None - } - #[allow(unknown_lints)] #[allow(clippy::unnecessary_fallible_conversions)] fn store_if_uwbs_caps_info(&mut self, resp: &UciResponse) { @@ -1286,9 +1277,7 @@ impl<T: UciHal, U: UciLogger> UciManagerActor<T, U> { UciDefragPacket::Control(packet) => { self.logger.log_uci_response_or_notification(&packet); - // Use a safe value of Fira 1.x as the UWBS UCI version. - let uci_fira_major_version = self.get_uwbs_uci_major_version().unwrap_or(1); - match (packet, uci_fira_major_version).try_into() { + match packet.try_into() { Ok(UciMessage::Response(resp)) => { self.handle_response(resp).await; } @@ -1454,13 +1443,11 @@ impl<T: UciHal, U: UciLogger> UciManagerActor<T, U> { SessionNotification::UpdateControllerMulticastList { session_token, remaining_multicast_list_size, - status_list_v1, - status_list_v2, + status_list, } => Ok(SessionNotification::UpdateControllerMulticastList { session_token: self.get_session_id(&session_token).await?, remaining_multicast_list_size, - status_list_v1, - status_list_v2, + status_list, }), SessionNotification::SessionInfo(session_range_data) => { Ok(SessionNotification::SessionInfo(SessionRangeData { @@ -2274,7 +2261,7 @@ mod tests { assert!(mock_hal.wait_expected_calls_done().await); } - #[tokio::test] + #[tokio::test] async fn test_session_set_hybrid_controller_config_ok() { let session_id = 0x123; let message_control = 0x00; @@ -2392,7 +2379,7 @@ mod tests { assert!(mock_hal.wait_expected_calls_done().await); } - #[tokio::test] + #[tokio::test] async fn test_session_set_hybrid_controlee_config_ok() { let session_id = 0x123; let session_token = 0x123; @@ -2428,7 +2415,7 @@ mod tests { assert!(result.is_ok()); assert!(mock_hal.wait_expected_calls_done().await); } - + #[tokio::test] async fn test_session_data_transfer_phase_config_ok() { let session_id = 0x123; diff --git a/src/rust/uwb_uci_packets/uci_packets.pdl b/src/rust/uwb_uci_packets/uci_packets.pdl index f494af2..7b3e174 100644 --- a/src/rust/uwb_uci_packets/uci_packets.pdl +++ b/src/rust/uwb_uci_packets/uci_packets.pdl @@ -997,39 +997,23 @@ test SessionUpdateControllerMulticastListRsp { "\x41\x07\x00\x01\x00\x00\x00\x00", } -struct ControleeStatusV1 { +struct ControleeStatus { mac_address: 8[2], subsession_id: 32, status: MulticastUpdateStatusCode, } -struct ControleeStatusV2 { - mac_address: 8[2], - status: MulticastUpdateStatusCode, -} - -packet SessionUpdateControllerMulticastListNtfV1 : SessionConfigNotification (opcode = 0x7) { //SESSION_UPDATE_CONTROLLER_MULTICAST_LIST +packet SessionUpdateControllerMulticastListNtf : SessionConfigNotification (opcode = 0x7) { //SESSION_UPDATE_CONTROLLER_MULTICAST_LIST session_token: 32, // Session ID or Session Handle (based on UWBS version) remaining_multicast_list_size: 8, _count_(controlee_status): 8, - controlee_status: ControleeStatusV1[], + controlee_status: ControleeStatus[], } -test SessionUpdateControllerMulticastListNtfV1 { +test SessionUpdateControllerMulticastListNtf { "\x61\x07\x00\x06\x00\x00\x00\x00\x01\x02\x03\x04\x00", } -packet SessionUpdateControllerMulticastListNtfV2 : SessionConfigNotification (opcode = 0x7) { //SESSION_UPDATE_CONTROLLER_MULTICAST_LIST - session_token: 32, // Session ID or Session Handle (based on UWBS version) - _count_(controlee_status): 8, - controlee_status: ControleeStatusV2[], -} - -test SessionUpdateControllerMulticastListNtfV2 { - "\x61\x07\x00\x06\x00\x00\x00\x00\x01\x00", - "\x61\x07\x00\x09\x00\x00\x00\x00\x01\x01\x03\x04\x00", -} - packet DataCreditNtf : SessionControlNotification (opcode = 0x04) { // SESSION_DATA_CREDIT_NTF session_token: 32, // Session ID or Session Handle (based on UWBS version) credit_availability: CreditAvailability, |