diff options
3 files changed, 57 insertions, 12 deletions
diff --git a/service/java/com/android/server/uwb/UwbServiceCore.java b/service/java/com/android/server/uwb/UwbServiceCore.java index 2f6fa739..cc921264 100644 --- a/service/java/com/android/server/uwb/UwbServiceCore.java +++ b/service/java/com/android/server/uwb/UwbServiceCore.java @@ -609,6 +609,8 @@ public class UwbServiceCore implements INativeUwbManager.DeviceNotification, specificationParams.second.getFiraSpecificationParams()) .setBackgroundRangingSupport(mUwbInjector.getDeviceConfigFacade() .isBackgroundRangingEnabled()) + .setUciVersionSupported(getCachedDeviceInfoResponse( + mUwbInjector.getMultichipData().getDefaultChipId()).mUciVersion) .build(); specificationParams.second.setFiraSpecificationParams(firaSpecificationParams); } diff --git a/service/support_lib/src/com/google/uwb/support/fira/FiraSpecificationParams.java b/service/support_lib/src/com/google/uwb/support/fira/FiraSpecificationParams.java index d4754b4d..8b6d9c6d 100644 --- a/service/support_lib/src/com/google/uwb/support/fira/FiraSpecificationParams.java +++ b/service/support_lib/src/com/google/uwb/support/fira/FiraSpecificationParams.java @@ -113,6 +113,8 @@ public class FiraSpecificationParams extends FiraParams { private final boolean mHasPsduLengthSupport; + private final int mUciVersion; + private static final String KEY_MIN_PHY_VERSION = "min_phy_version"; private static final String KEY_MAX_PHY_VERSION = "max_phy_version"; private static final String KEY_MIN_MAC_VERSION = "min_mac_version"; @@ -165,6 +167,8 @@ public class FiraSpecificationParams extends FiraParams { public static final String KEY_PSDU_LENGTH_SUPPORT = "psdu_length_support"; + public static final String KEY_UCI_VERSION = "uci_version"; + public static final int DEFAULT_MAX_RANGING_SESSIONS_NUMBER = 5; private FiraSpecificationParams( @@ -201,7 +205,8 @@ public class FiraSpecificationParams extends FiraParams { EnumSet<RangeDataNtfConfigCapabilityFlag> rangeDataNtfConfigCapabilities, int deviceType, boolean suspendRangingSupport, int sessionKeyLength, int dtTagMaxActiveRr, boolean hasBackgroundRangingSupport, - boolean hasDtTagBlockSkippingSupport, boolean hasPsduLengthSupport) { + boolean hasDtTagBlockSkippingSupport, boolean hasPsduLengthSupport, + int uciVersion) { mMinPhyVersionSupported = minPhyVersionSupported; mMaxPhyVersionSupported = maxPhyVersionSupported; mMinMacVersionSupported = minMacVersionSupported; @@ -240,6 +245,7 @@ public class FiraSpecificationParams extends FiraParams { mHasBackgroundRangingSupport = hasBackgroundRangingSupport; mHasDtTagBlockSkippingSupport = hasDtTagBlockSkippingSupport; mHasPsduLengthSupport = hasPsduLengthSupport; + mUciVersion = uciVersion; } @Override @@ -401,6 +407,10 @@ public class FiraSpecificationParams extends FiraParams { return mHasPsduLengthSupport; } + public int getUciVersionSupported() { + return mUciVersion; + } + private static int[] toIntArray(List<Integer> data) { int[] res = new int[data.size()]; for (int i = 0; i < data.size(); i++) { @@ -456,6 +466,7 @@ public class FiraSpecificationParams extends FiraParams { bundle.putBoolean(KEY_BACKGROUND_RANGING_SUPPORT, mHasBackgroundRangingSupport); bundle.putBoolean(KEY_DT_TAG_BLOCK_SKIPPING_SUPPORT, mHasDtTagBlockSkippingSupport); bundle.putBoolean(KEY_PSDU_LENGTH_SUPPORT, mHasPsduLengthSupport); + bundle.putInt(KEY_UCI_VERSION, mUciVersion); return bundle; } @@ -491,6 +502,7 @@ public class FiraSpecificationParams extends FiraParams { builder.setBackgroundRangingSupport(bundle.getBoolean(KEY_BACKGROUND_RANGING_SUPPORT)); builder.setDtTagBlockSkippingSupport(bundle.getBoolean(KEY_DT_TAG_BLOCK_SKIPPING_SUPPORT)); builder.setPsduLengthSupport(bundle.getBoolean(KEY_PSDU_LENGTH_SUPPORT)); + builder.setUciVersionSupported(bundle.getInt(KEY_UCI_VERSION, 1)); return builder; } @@ -628,6 +640,8 @@ public class FiraSpecificationParams extends FiraParams { private int mMaxRangingSessionNumber = DEFAULT_MAX_RANGING_SESSIONS_NUMBER; + private int mUciVersion = 1; + // Unicast support is mandatory private EnumSet<MultiNodeCapabilityFlag> mMultiNodeCapabilities = EnumSet.of(MultiNodeCapabilityFlag.HAS_UNICAST_SUPPORT); @@ -925,6 +939,12 @@ public class FiraSpecificationParams extends FiraParams { return this; } + public FiraSpecificationParams.Builder setUciVersionSupported( + int uciVersion) { + mUciVersion = uciVersion; + return this; + } + public Builder() {} public Builder(@NonNull FiraSpecificationParams params) { @@ -1007,7 +1027,8 @@ public class FiraSpecificationParams extends FiraParams { mDtTagMaxActiveRr, mHasBackgroundRangingSupport, mHasDtTagBlockSkippingSupport, - mHasPsduLengthSupport); + mHasPsduLengthSupport, + mUciVersion); } } } diff --git a/service/uci/jni/src/notification_manager_android.rs b/service/uci/jni/src/notification_manager_android.rs index 3500be41..6961544d 100644 --- a/service/uci/jni/src/notification_manager_android.rs +++ b/service/uci/jni/src/notification_manager_android.rs @@ -30,14 +30,14 @@ use jni::sys::jvalue; use jni::{AttachGuard, JavaVM}; use log::{debug, error}; use uwb_core::error::{Error as UwbError, Result as UwbResult}; -use uwb_core::params::UwbAddress; +use uwb_core::params::{ControleeStatusList, UwbAddress}; use uwb_core::uci::uci_manager_sync::{NotificationManager, NotificationManagerBuilder}; use uwb_core::uci::{ CoreNotification, DataRcvNotification, RadarDataRcvNotification, RangingMeasurements, SessionNotification, SessionRangeData, }; use uwb_uci_packets::{ - radar_bytes_per_sample_value, ControleeStatus, ExtendedAddressDlTdoaRangingMeasurement, + radar_bytes_per_sample_value, ExtendedAddressDlTdoaRangingMeasurement, ExtendedAddressOwrAoaRangingMeasurement, ExtendedAddressTwoWayRangingMeasurement, MacAddressIndicator, RangingMeasurementType, SessionState, ShortAddressDlTdoaRangingMeasurement, ShortAddressOwrAoaRangingMeasurement, @@ -383,18 +383,32 @@ impl NotificationManagerAndroid { &mut self, session_id: u32, remaining_multicast_list_size: usize, - status_list: Vec<ControleeStatus>, + status_list: ControleeStatusList, ) -> Result<JObject, JNIError> { let remaining_multicast_list_size: i32 = remaining_multicast_list_size.try_into().map_err(|_| JNIError::InvalidCtorReturn)?; - let count: i32 = status_list.len().try_into().map_err(|_| JNIError::InvalidCtorReturn)?; + let mac_address_vec: Vec<[u8; 2]>; + let subsession_id_vec: Vec<_>; + let status_vec: Vec<_>; + let count: i32; + match status_list { + ControleeStatusList::V1(status_list) => { + count = status_list.len().try_into().map_err(|_| JNIError::InvalidCtorReturn)?; + (mac_address_vec, (subsession_id_vec, status_vec)) = status_list + .into_iter() + .map(|cs| (cs.mac_address, (cs.subsession_id as i64, i32::from(cs.status)))) + .unzip(); + } + ControleeStatusList::V2(status_list) => { + count = status_list.len().try_into().map_err(|_| JNIError::InvalidCtorReturn)?; + (mac_address_vec, (subsession_id_vec, status_vec)) = status_list + .into_iter() + .map(|cs| (cs.mac_address, (0_i64, i32::from(cs.status)))) + .unzip(); + } + } let subsession_id_jlongarray = self.env.new_long_array(count)?; let status_jintarray = self.env.new_int_array(count)?; - let (mac_address_vec, (subsession_id_vec, status_vec)): (Vec<[u8; 2]>, (Vec<_>, Vec<_>)) = - status_list - .into_iter() - .map(|cs| (cs.mac_address, (cs.subsession_id as i64, i32::from(cs.status)))) - .unzip(); let mac_address_vec_i8 = mac_address_vec.iter().flat_map(|&[a, b]| vec![a as i8, b as i8]).collect::<Vec<i8>>(); @@ -1048,14 +1062,22 @@ impl NotificationManager for NotificationManagerAndroid { session_state, reason_code, ), - SessionNotification::UpdateControllerMulticastList { + SessionNotification::UpdateControllerMulticastListV1 { session_token, remaining_multicast_list_size, status_list, } => self.on_session_update_multicast_notification( session_token, remaining_multicast_list_size, + ControleeStatusList::V1(status_list), + ), + SessionNotification::UpdateControllerMulticastListV2 { + session_token, status_list, + } => self.on_session_update_multicast_notification( + session_token, + 0_usize, + ControleeStatusList::V2(status_list), ), // TODO(b/246678053): Match here on range_data.ranging_measurement_type instead. SessionNotification::SessionInfo(range_data) => { |