1 /* 2 * Copyright (C) 2021 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.server.uwb.params; 18 19 20 import static com.google.common.truth.Truth.assertThat; 21 import static com.google.uwb.support.fira.FiraParams.CONTENTION_BASED_RANGING; 22 import static com.google.uwb.support.fira.FiraParams.MULTI_NODE_MODE_ONE_TO_MANY; 23 import static com.google.uwb.support.fira.FiraParams.MULTI_NODE_MODE_UNICAST; 24 import static com.google.uwb.support.fira.FiraParams.PROTOCOL_VERSION_1_1; 25 import static com.google.uwb.support.fira.FiraParams.PROTOCOL_VERSION_2_0; 26 import static com.google.uwb.support.fira.FiraParams.RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_AOA_LEVEL_TRIG; 27 import static com.google.uwb.support.fira.FiraParams.RANGING_DEVICE_DT_TAG; 28 import static com.google.uwb.support.fira.FiraParams.RANGING_DEVICE_ROLE_INITIATOR; 29 import static com.google.uwb.support.fira.FiraParams.RANGING_DEVICE_ROLE_RESPONDER; 30 import static com.google.uwb.support.fira.FiraParams.RANGING_DEVICE_TYPE_CONTROLEE; 31 import static com.google.uwb.support.fira.FiraParams.RANGING_DEVICE_TYPE_CONTROLLER; 32 import static com.google.uwb.support.fira.FiraParams.RANGING_DEVICE_TYPE_DT_TAG; 33 import static com.google.uwb.support.fira.FiraParams.RANGING_DEVICE_UT_TAG; 34 import static com.google.uwb.support.fira.FiraParams.RANGING_ROUND_USAGE_DL_TDOA; 35 import static com.google.uwb.support.fira.FiraParams.RANGING_ROUND_USAGE_SS_TWR_DEFERRED_MODE; 36 import static com.google.uwb.support.fira.FiraParams.RANGING_ROUND_USAGE_UL_TDOA; 37 import static com.google.uwb.support.fira.FiraParams.RFRAME_CONFIG_SP1; 38 import static com.google.uwb.support.fira.FiraParams.SESSION_TYPE_RANGING; 39 import static com.google.uwb.support.fira.FiraParams.STS_CONFIG_DYNAMIC_FOR_CONTROLEE_INDIVIDUAL_KEY; 40 import static com.google.uwb.support.fira.FiraParams.STS_CONFIG_PROVISIONED; 41 import static com.google.uwb.support.fira.FiraParams.STS_CONFIG_PROVISIONED_FOR_CONTROLEE_INDIVIDUAL_KEY; 42 import static com.google.uwb.support.fira.FiraParams.STS_CONFIG_STATIC; 43 import static com.google.uwb.support.fira.FiraParams.TX_TIMESTAMP_40_BIT; 44 import static com.google.uwb.support.fira.FiraParams.UL_TDOA_DEVICE_ID_16_BIT; 45 46 import static org.junit.Assume.assumeTrue; 47 import static org.mockito.Mockito.mock; 48 import static org.mockito.Mockito.when; 49 50 import android.platform.test.annotations.Presubmit; 51 import android.uwb.UwbAddress; 52 53 import androidx.test.filters.SmallTest; 54 import androidx.test.runner.AndroidJUnit4; 55 56 import com.android.modules.utils.build.SdkLevel; 57 import com.android.server.uwb.DeviceConfigFacade; 58 import com.android.server.uwb.UwbInjector; 59 import com.android.server.uwb.util.UwbUtil; 60 import com.android.uwb.flags.FeatureFlags; 61 62 import com.google.uwb.support.fira.FiraOpenSessionParams; 63 import com.google.uwb.support.fira.FiraParams; 64 import com.google.uwb.support.fira.FiraProtocolVersion; 65 import com.google.uwb.support.fira.FiraRangingReconfigureParams; 66 67 import org.junit.Before; 68 import org.junit.Test; 69 import org.junit.runner.RunWith; 70 import org.mockito.Mock; 71 import org.mockito.MockitoAnnotations; 72 73 import java.util.Arrays; 74 75 /** 76 * Unit tests for {@link com.android.server.uwb.params.FiraEncoder}. 77 */ 78 @RunWith(AndroidJUnit4.class) 79 @SmallTest 80 @Presubmit 81 public class FiraEncoderTest { 82 private static final FiraProtocolVersion PROTOCOL_VERSION_DUMMY = new FiraProtocolVersion(0, 0); 83 private static final FiraOpenSessionParams.Builder TEST_FIRA_OPEN_SESSION_COMMON_PARAMS = 84 new FiraOpenSessionParams.Builder() 85 .setProtocolVersion(FiraParams.PROTOCOL_VERSION_1_1) // Required Parameter 86 .setSessionId(1) 87 .setSessionType(SESSION_TYPE_RANGING) 88 .setRangeDataNtfConfig(RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_AOA_LEVEL_TRIG) 89 .setDeviceType(RANGING_DEVICE_TYPE_CONTROLLER) 90 .setDeviceRole(RANGING_DEVICE_ROLE_RESPONDER) 91 .setDeviceAddress(UwbAddress.fromBytes(new byte[]{0x4, 0x6})) 92 .setDestAddressList(Arrays.asList(UwbAddress.fromBytes(new byte[]{0x4, 0x6}))) 93 .setMultiNodeMode(MULTI_NODE_MODE_UNICAST) 94 .setRangingRoundUsage(RANGING_ROUND_USAGE_SS_TWR_DEFERRED_MODE) 95 .setStsConfig(STS_CONFIG_STATIC) 96 .setVendorId(new byte[]{0x5, 0x78}) 97 .setStaticStsIV(new byte[]{0x1a, 0x55, 0x77, 0x47, 0x7e, 0x7d}) 98 .setRangeDataNtfAoaAzimuthLower(-1.5) 99 .setRangeDataNtfAoaAzimuthUpper(2.5) 100 .setRangeDataNtfAoaElevationLower(-1.5) 101 .setRangeDataNtfAoaElevationUpper(1.2); 102 103 private static final FiraOpenSessionParams.Builder TEST_FIRA_OPEN_SESSION_PARAMS_V_1_1 = 104 new FiraOpenSessionParams.Builder(TEST_FIRA_OPEN_SESSION_COMMON_PARAMS); 105 106 private static final FiraOpenSessionParams.Builder TEST_FIRA_OPEN_SESSION_PARAMS_V_2_0 = 107 new FiraOpenSessionParams.Builder(TEST_FIRA_OPEN_SESSION_COMMON_PARAMS) 108 .setProtocolVersion(FiraParams.PROTOCOL_VERSION_2_0) 109 .setInitiationTime(1000) 110 .setLinkLayerMode(1) 111 .setApplicationDataEndpoint(1); 112 113 private static final FiraOpenSessionParams.Builder 114 TEST_FIRA_OPEN_SESSION_PARAMS_V_2_0_ABSOLUTE_INITIATION_TIME = 115 new FiraOpenSessionParams.Builder(TEST_FIRA_OPEN_SESSION_PARAMS_V_2_0) 116 .setAbsoluteInitiationTime(20000000L); 117 118 private static final FiraRangingReconfigureParams.Builder TEST_FIRA_RECONFIGURE_PARAMS = 119 new FiraRangingReconfigureParams.Builder() 120 .setBlockStrideLength(6) 121 .setRangeDataNtfConfig(RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_AOA_LEVEL_TRIG) 122 .setRangeDataProximityFar(6) 123 .setRangeDataProximityNear(4) 124 .setRangeDataAoaAzimuthLower(-1.5) 125 .setRangeDataAoaAzimuthUpper(2.5) 126 .setRangeDataAoaElevationLower(-1.5) 127 .setRangeDataAoaElevationUpper(1.2); 128 129 private static final byte[] TEST_FIRA_RECONFIGURE_TLV_DATA = 130 UwbUtil.getByteArray("2D01060E01040F020400100206001D0807D59E4707D56022"); 131 132 private static final FiraOpenSessionParams.Builder TEST_FIRA_UT_TAG_OPEN_SESSION_PARAM = 133 new FiraOpenSessionParams.Builder() 134 .setProtocolVersion(FiraParams.PROTOCOL_VERSION_1_1) 135 .setSessionId(2) 136 .setSessionType(SESSION_TYPE_RANGING) 137 .setDeviceType(RANGING_DEVICE_TYPE_CONTROLLER) 138 .setDeviceRole(RANGING_DEVICE_UT_TAG) 139 .setDeviceAddress(UwbAddress.fromBytes(new byte[]{0x4, 0x6})) 140 .setDestAddressList(Arrays.asList(UwbAddress.fromBytes(new byte[]{0x4, 0x6}))) 141 .setMultiNodeMode(MULTI_NODE_MODE_UNICAST) 142 .setStsConfig(STS_CONFIG_STATIC) 143 .setVendorId(new byte[]{0x5, 0x78}) 144 .setStaticStsIV(new byte[]{0x1a, 0x55, 0x77, 0x47, 0x7e, 0x7d}) 145 .setRangingRoundUsage(RANGING_ROUND_USAGE_UL_TDOA) 146 .setUlTdoaTxIntervalMs(1200) 147 .setUlTdoaRandomWindowMs(30) 148 .setUlTdoaDeviceIdType(UL_TDOA_DEVICE_ID_16_BIT) 149 .setUlTdoaDeviceId(new byte[]{0x0B, 0x0A}) 150 .setUlTdoaTxTimestampType(TX_TIMESTAMP_40_BIT); 151 152 private static final String DEVICE_TYPE_CONTROLEE_TLV = "000100"; 153 private static final String DEVICE_TYPE_CONTROLLER_TLV = "000101"; 154 private static final String RANGING_ROUND_USAGE_SS_TWR_TLV = "010101"; 155 private static final String RANGING_ROUND_USAGE_UL_TDOA_TLV = "010100"; 156 private static final String RANGING_ROUND_USAGE_Dl_TDOA_TLV = "010105"; 157 private static final String STS_CONFIG_STATIC_TLV = "020100"; 158 private static final String STS_CONFIG_PROVISIONED_TLV = "020103"; 159 private static final String MULTI_NODE_MODE_UNICAST_TLV = "030100"; 160 private static final String MULTI_NODE_MODE_ONE_TO_MANY_TLV = "030101"; 161 private static final String CHANNEL_NUMBER_TLV = "040109"; 162 private static final String NUMBER_OF_CONTROLEES_TLV = "050101"; 163 private static final String DEVICE_MAC_ADDRESS_TLV = "06020406"; 164 private static final String SLOT_DURATION_TLV = "08026009"; 165 private static final String MAC_FCS_TYPE_TLV = "0B0100"; 166 private static final String RANGING_ROUND_CONTROL_TLV = "0C0103"; 167 private static final String RANGING_ROUND_CONTROL_CONTENTION_MRP_RCP_CM_RRRM_TLV = "0C0147"; 168 private static final String AOA_RESULT_REQ_TLV = "0D0101"; 169 private static final String RANGE_DATA_NTF_CONFIG_AOA_LEVEL_TLV = "0E0104"; 170 private static final String RANGE_DATA_NTF_CONFIG_ENABLE_TLV = "0E0101"; 171 private static final String RANGE_DATA_NTF_PROXIMITY_NEAR_TLV = "0F020000"; 172 private static final String RANGE_DATA_NTF_PROXIMITY_FAR_TLV = "1002204E"; 173 private static final String DEVICE_ROLE_RESPONDER_TLV = "110100"; 174 private static final String DEVICE_ROLE_INITIATOR_TLV = "110101"; 175 private static final String DEVICE_ROLE_UT_TAG_TLV = "110104"; 176 private static final String DEVICE_ROLE_DT_TAG_TLV = "110108"; 177 private static final String RFRAME_CONFIG_TLV = "120103"; 178 private static final String RFRAME_CONFIG_DL_TDOA_TLV = "120101"; 179 private static final String RSSI_REPORTING_TLV = "130100"; 180 private static final String PREAMBLE_CODE_INDEX_TLV = "14010A"; 181 private static final String SFD_ID_TLV = "150102"; 182 private static final String PSDU_DATA_RATE_TLV = "160100"; 183 private static final String PREAMBLE_DURATION_TLV = "170101"; 184 private static final String LINK_LAYER_MODE_BYPASS_TLV = "180100"; 185 private static final String LINK_LAYER_MODE_CONNECTIONLESS_DATA_TLV = "180101"; 186 private static final String DATA_REPETITION_COUNT_TLV = "190100"; 187 private static final String RANGING_TIME_STRUCT_TLV = "1A0101"; 188 private static final String SLOTS_PER_RR_TLV = "1B0119"; 189 private static final String TX_ADAPTIVE_PAYLOAD_POWER_TLV = "1C0100"; 190 private static final String PRF_MODE_TLV = "1F0100"; 191 private static final String CAP_SIZE_RANGE_DEFAULT_TLV = "20021805"; 192 private static final String SCHEDULED_MODE_TIME_SCHEDULED_TLV = "220101"; 193 private static final String SCHEDULED_MODE_CONTENTION_TLV = "220100"; 194 private static final String KEY_ROTATION_TLV = "230100"; 195 private static final String KEY_ROTATION_RATE_TLV = "240100"; 196 private static final String SESSION_PRIORITY_TLV = "250132"; 197 private static final String MAC_ADDRESS_MODE_TLV = "260100"; 198 private static final String NUMBER_OF_STS_SEGMENTS_TLV = "290101"; 199 private static final String MAX_RR_RETRY_TLV = "2A020000"; 200 private static final String HOPPING_MODE_TLV = "2C0100"; 201 private static final String BLOCK_STRIDE_LENGTH_TLV = "2D0100"; 202 private static final String RESULT_REPORT_CONFIG_TLV = "2E0101"; 203 private static final String IN_BAND_TERMINATION_ATTEMPT_COUNT_TLV = "2F0101"; 204 private static final String BPRF_PHR_DATA_RATE_TLV = "310100"; 205 private static final String MAX_NUMBER_OF_MEASUREMENTS_TLV = "32020000"; 206 private static final String STS_LENGTH_TLV = "350101"; 207 private static final String ANTENNA_MODE_TLV = "EA0100"; 208 private static final String RANGING_INTERVAL_TLV = "0904C8000000"; 209 private static final String DST_MAC_ADDRESS_TLV = "07020406"; 210 private static final String UWB_INITIATION_TIME_TLV = "2B0400000000"; 211 private static final String UWB_INITIATION_TIME_2_0_TLV = "2B08E803000000000000"; 212 private static final String ABSOLUTE_UWB_INITIATION_TIME_2_0_TLV = "2B08002D310100000000"; 213 private static final String VENDOR_ID_TLV = "27020578"; 214 private static final String STATIC_STS_IV_TLV = "28061A5577477E7D"; 215 private static final String RANGE_DATA_NTF_AOA_BOUND_TLV = "1D0807D59E4707D56022"; 216 private static final String APPLICATION_DATA_ENDPOINT_HOST_TLV = "4C0100"; 217 private static final String APPLICATION_DATA_ENDPOINT_SECURE_COMPONENT_TLV = "4C0101"; 218 private static final String UL_TDOA_TX_INTERVAL_TLV = "3304B0040000"; 219 private static final String UL_TDOA_RANDOM_WINDOW_TLV = "34041E000000"; 220 private static final String UL_TDOA_DEVICE_ID_TLV = "3803010B0A"; 221 private static final String UL_TDOA_TX_TIMESTAMP_TLV = "390101"; 222 private static final String SESSION_DATA_TRANSFER_STATUS_NTF_CONFIG_TLV = "470100"; 223 private static final String SUB_SESSION_ID_TLV = "300401000000"; 224 private static final String SESSION_KEY_TLV = "451005780578057805780578057805780578"; 225 private static final String SESSION_TIME_BASE_TLV = "48090101000000C8000000"; 226 227 @Mock private UwbInjector mUwbInjector; 228 @Mock private FeatureFlags mFeatureFlags; 229 230 private FiraEncoder mFiraEncoder; 231 private byte[] mFiraOpenSessionTlvUtTag; 232 private byte[] mFiraSessionv11TlvData; 233 private byte[] mFiraSessionv20TlvData; 234 private byte[] mFiraSessionv20AbsoluteInitiationTimeTlvData; 235 236 @Before setUp()237 public void setUp() { 238 MockitoAnnotations.initMocks(this); 239 240 // Setup the unit tests to have the default behavior of using the UWBS UCI version. 241 when(mUwbInjector.getFeatureFlags()).thenReturn(mFeatureFlags); 242 243 // Test antenna mode param. 244 DeviceConfigFacade mockDeviceConfig = mock(DeviceConfigFacade.class); 245 when(mockDeviceConfig.isAntennaModeConfigSupported()).thenReturn(true); 246 when(mUwbInjector.getDeviceConfigFacade()).thenReturn(mockDeviceConfig); 247 248 mFiraEncoder = new FiraEncoder(mUwbInjector); 249 250 if (!SdkLevel.isAtLeastU()) { 251 mFiraSessionv11TlvData = UwbUtil.getByteArray( 252 "01010102010003010004010906020604080260090B01000C01030D01010E01040F02" 253 + "00001002204E11010012010313010014010A1501021601001701011A01011B0119" 254 + "1F01002201012301002401002501322601002901012A0200002C01002D01002E" 255 + "01012F0101310100320200003501010904C8000000000101050101070206042B0400" 256 + "0000001C01002702780528061A5577477E7D1D0807D59E4707D56022EA0100"); 257 258 mFiraOpenSessionTlvUtTag = UwbUtil.getByteArray( 259 "01010002010003010004010906020604080260090B01000C01030D01010E01010F02" 260 + "00001002204E11010412010313010014010A1501021601001701011A01011B0119" 261 + "1F01002201012301002401002501322601002901012A0200002C01002D01002E" 262 + "01012F0101310100320200003501010001012B04000000001C0100270278" 263 + "0528061A5577477E7D3304B004000034041E0000003803010B0A390101EA0100"); 264 } else { 265 mFiraSessionv11TlvData = UwbUtil.getByteArray(RANGING_ROUND_USAGE_SS_TWR_TLV 266 + STS_CONFIG_STATIC_TLV + MULTI_NODE_MODE_UNICAST_TLV + CHANNEL_NUMBER_TLV 267 + DEVICE_MAC_ADDRESS_TLV + SLOT_DURATION_TLV + MAC_FCS_TYPE_TLV 268 + RANGING_ROUND_CONTROL_TLV + AOA_RESULT_REQ_TLV 269 + RANGE_DATA_NTF_CONFIG_AOA_LEVEL_TLV + RANGE_DATA_NTF_PROXIMITY_NEAR_TLV 270 + RANGE_DATA_NTF_PROXIMITY_FAR_TLV + DEVICE_ROLE_RESPONDER_TLV 271 + RFRAME_CONFIG_TLV 272 + RSSI_REPORTING_TLV + PREAMBLE_CODE_INDEX_TLV + SFD_ID_TLV + PSDU_DATA_RATE_TLV 273 + PREAMBLE_DURATION_TLV + RANGING_TIME_STRUCT_TLV + SLOTS_PER_RR_TLV 274 + PRF_MODE_TLV + SCHEDULED_MODE_TIME_SCHEDULED_TLV 275 + KEY_ROTATION_TLV + KEY_ROTATION_RATE_TLV + SESSION_PRIORITY_TLV 276 + MAC_ADDRESS_MODE_TLV + NUMBER_OF_STS_SEGMENTS_TLV + MAX_RR_RETRY_TLV 277 + HOPPING_MODE_TLV + BLOCK_STRIDE_LENGTH_TLV + RESULT_REPORT_CONFIG_TLV 278 + IN_BAND_TERMINATION_ATTEMPT_COUNT_TLV + BPRF_PHR_DATA_RATE_TLV 279 + MAX_NUMBER_OF_MEASUREMENTS_TLV + STS_LENGTH_TLV + RANGING_INTERVAL_TLV 280 + DEVICE_TYPE_CONTROLLER_TLV + NUMBER_OF_CONTROLEES_TLV + DST_MAC_ADDRESS_TLV 281 + UWB_INITIATION_TIME_TLV + TX_ADAPTIVE_PAYLOAD_POWER_TLV + VENDOR_ID_TLV 282 + STATIC_STS_IV_TLV + RANGE_DATA_NTF_AOA_BOUND_TLV + ANTENNA_MODE_TLV); 283 284 mFiraSessionv20TlvData = UwbUtil.getByteArray( 285 RANGING_ROUND_USAGE_SS_TWR_TLV 286 + STS_CONFIG_STATIC_TLV + MULTI_NODE_MODE_UNICAST_TLV + CHANNEL_NUMBER_TLV 287 + DEVICE_MAC_ADDRESS_TLV + SLOT_DURATION_TLV + MAC_FCS_TYPE_TLV 288 + RANGING_ROUND_CONTROL_TLV + AOA_RESULT_REQ_TLV 289 + RANGE_DATA_NTF_CONFIG_AOA_LEVEL_TLV + RANGE_DATA_NTF_PROXIMITY_NEAR_TLV 290 + RANGE_DATA_NTF_PROXIMITY_FAR_TLV + DEVICE_ROLE_RESPONDER_TLV 291 + RFRAME_CONFIG_TLV 292 + RSSI_REPORTING_TLV + PREAMBLE_CODE_INDEX_TLV + SFD_ID_TLV 293 + PSDU_DATA_RATE_TLV + PREAMBLE_DURATION_TLV + RANGING_TIME_STRUCT_TLV 294 + SLOTS_PER_RR_TLV 295 + PRF_MODE_TLV + SCHEDULED_MODE_TIME_SCHEDULED_TLV + KEY_ROTATION_TLV 296 + KEY_ROTATION_RATE_TLV 297 + SESSION_PRIORITY_TLV + MAC_ADDRESS_MODE_TLV + NUMBER_OF_STS_SEGMENTS_TLV 298 + MAX_RR_RETRY_TLV + HOPPING_MODE_TLV + BLOCK_STRIDE_LENGTH_TLV 299 + RESULT_REPORT_CONFIG_TLV + IN_BAND_TERMINATION_ATTEMPT_COUNT_TLV 300 + BPRF_PHR_DATA_RATE_TLV + MAX_NUMBER_OF_MEASUREMENTS_TLV + STS_LENGTH_TLV 301 + RANGING_INTERVAL_TLV + DEVICE_TYPE_CONTROLLER_TLV + NUMBER_OF_CONTROLEES_TLV 302 + DST_MAC_ADDRESS_TLV + UWB_INITIATION_TIME_2_0_TLV 303 + LINK_LAYER_MODE_CONNECTIONLESS_DATA_TLV 304 + DATA_REPETITION_COUNT_TLV 305 + SESSION_DATA_TRANSFER_STATUS_NTF_CONFIG_TLV 306 + APPLICATION_DATA_ENDPOINT_SECURE_COMPONENT_TLV 307 + VENDOR_ID_TLV + STATIC_STS_IV_TLV 308 + RANGE_DATA_NTF_AOA_BOUND_TLV + ANTENNA_MODE_TLV); 309 310 mFiraSessionv20AbsoluteInitiationTimeTlvData = UwbUtil.getByteArray( 311 RANGING_ROUND_USAGE_SS_TWR_TLV 312 + STS_CONFIG_STATIC_TLV + MULTI_NODE_MODE_UNICAST_TLV + CHANNEL_NUMBER_TLV 313 + DEVICE_MAC_ADDRESS_TLV + SLOT_DURATION_TLV + MAC_FCS_TYPE_TLV 314 + RANGING_ROUND_CONTROL_TLV + AOA_RESULT_REQ_TLV 315 + RANGE_DATA_NTF_CONFIG_AOA_LEVEL_TLV + RANGE_DATA_NTF_PROXIMITY_NEAR_TLV 316 + RANGE_DATA_NTF_PROXIMITY_FAR_TLV + DEVICE_ROLE_RESPONDER_TLV 317 + RFRAME_CONFIG_TLV 318 + RSSI_REPORTING_TLV + PREAMBLE_CODE_INDEX_TLV + SFD_ID_TLV 319 + PSDU_DATA_RATE_TLV + PREAMBLE_DURATION_TLV + RANGING_TIME_STRUCT_TLV 320 + SLOTS_PER_RR_TLV 321 + PRF_MODE_TLV + SCHEDULED_MODE_TIME_SCHEDULED_TLV + KEY_ROTATION_TLV 322 + KEY_ROTATION_RATE_TLV 323 + SESSION_PRIORITY_TLV + MAC_ADDRESS_MODE_TLV + NUMBER_OF_STS_SEGMENTS_TLV 324 + MAX_RR_RETRY_TLV + HOPPING_MODE_TLV + BLOCK_STRIDE_LENGTH_TLV 325 + RESULT_REPORT_CONFIG_TLV + IN_BAND_TERMINATION_ATTEMPT_COUNT_TLV 326 + BPRF_PHR_DATA_RATE_TLV + MAX_NUMBER_OF_MEASUREMENTS_TLV + STS_LENGTH_TLV 327 + RANGING_INTERVAL_TLV + DEVICE_TYPE_CONTROLLER_TLV + NUMBER_OF_CONTROLEES_TLV 328 + DST_MAC_ADDRESS_TLV + ABSOLUTE_UWB_INITIATION_TIME_2_0_TLV 329 + LINK_LAYER_MODE_CONNECTIONLESS_DATA_TLV 330 + DATA_REPETITION_COUNT_TLV 331 + SESSION_DATA_TRANSFER_STATUS_NTF_CONFIG_TLV 332 + APPLICATION_DATA_ENDPOINT_SECURE_COMPONENT_TLV 333 + VENDOR_ID_TLV + STATIC_STS_IV_TLV 334 + RANGE_DATA_NTF_AOA_BOUND_TLV + ANTENNA_MODE_TLV); 335 336 mFiraOpenSessionTlvUtTag = UwbUtil.getByteArray( 337 RANGING_ROUND_USAGE_UL_TDOA_TLV 338 + STS_CONFIG_STATIC_TLV + MULTI_NODE_MODE_UNICAST_TLV + CHANNEL_NUMBER_TLV 339 + DEVICE_MAC_ADDRESS_TLV + SLOT_DURATION_TLV + MAC_FCS_TYPE_TLV 340 + RANGING_ROUND_CONTROL_TLV + AOA_RESULT_REQ_TLV 341 + RANGE_DATA_NTF_CONFIG_ENABLE_TLV + RANGE_DATA_NTF_PROXIMITY_NEAR_TLV 342 + RANGE_DATA_NTF_PROXIMITY_FAR_TLV + DEVICE_ROLE_UT_TAG_TLV 343 + RFRAME_CONFIG_TLV + RSSI_REPORTING_TLV + PREAMBLE_CODE_INDEX_TLV 344 + SFD_ID_TLV + PSDU_DATA_RATE_TLV + PREAMBLE_DURATION_TLV 345 + RANGING_TIME_STRUCT_TLV + SLOTS_PER_RR_TLV 346 + PRF_MODE_TLV + SCHEDULED_MODE_TIME_SCHEDULED_TLV 347 + KEY_ROTATION_TLV + KEY_ROTATION_RATE_TLV 348 + SESSION_PRIORITY_TLV + MAC_ADDRESS_MODE_TLV + NUMBER_OF_STS_SEGMENTS_TLV 349 + MAX_RR_RETRY_TLV + HOPPING_MODE_TLV + BLOCK_STRIDE_LENGTH_TLV 350 + RESULT_REPORT_CONFIG_TLV + IN_BAND_TERMINATION_ATTEMPT_COUNT_TLV 351 + BPRF_PHR_DATA_RATE_TLV + MAX_NUMBER_OF_MEASUREMENTS_TLV + STS_LENGTH_TLV 352 + DEVICE_TYPE_CONTROLLER_TLV 353 + UWB_INITIATION_TIME_TLV + TX_ADAPTIVE_PAYLOAD_POWER_TLV + VENDOR_ID_TLV 354 + STATIC_STS_IV_TLV + UL_TDOA_TX_INTERVAL_TLV + UL_TDOA_RANDOM_WINDOW_TLV 355 + UL_TDOA_DEVICE_ID_TLV + UL_TDOA_TX_TIMESTAMP_TLV + ANTENNA_MODE_TLV); 356 } 357 } 358 359 // Test FiraEncoder behavior when the Fira ProtocolVersion comes from the UWBS UCI version. 360 @Test testFiraOpenSessionParams_useUwbsUciVersion()361 public void testFiraOpenSessionParams_useUwbsUciVersion() throws Exception { 362 // Test FiRa v1.1 Params 363 FiraOpenSessionParams params = TEST_FIRA_OPEN_SESSION_PARAMS_V_1_1.build(); 364 TlvBuffer tlvs = mFiraEncoder.getTlvBuffer(params, PROTOCOL_VERSION_1_1); 365 366 assertThat(tlvs.getNoOfParams()).isEqualTo(46); 367 assertThat(tlvs.getByteArray()).isEqualTo(mFiraSessionv11TlvData); 368 369 // Test FiRa v2.0 Params 370 if (SdkLevel.isAtLeastU()) { 371 // Test the default Fira v2.0 OpenSessionParams. 372 params = TEST_FIRA_OPEN_SESSION_PARAMS_V_2_0.build(); 373 tlvs = mFiraEncoder.getTlvBuffer(params, PROTOCOL_VERSION_2_0); 374 375 assertThat(tlvs.getNoOfParams()).isEqualTo(49); 376 assertThat(tlvs.getByteArray()).isEqualTo(mFiraSessionv20TlvData); 377 378 // Test the Fira v2.0 OpenSessionParams with ABSOLUTE_INITIATION_TIME set. 379 params = TEST_FIRA_OPEN_SESSION_PARAMS_V_2_0_ABSOLUTE_INITIATION_TIME.build(); 380 tlvs = mFiraEncoder.getTlvBuffer(params, PROTOCOL_VERSION_2_0); 381 382 assertThat(tlvs.getNoOfParams()).isEqualTo(49); 383 assertThat(tlvs.getByteArray()).isEqualTo(mFiraSessionv20AbsoluteInitiationTimeTlvData); 384 385 } 386 } 387 388 @Test testFiraRangingReconfigureParams()389 public void testFiraRangingReconfigureParams() throws Exception { 390 FiraRangingReconfigureParams params = TEST_FIRA_RECONFIGURE_PARAMS.build(); 391 TlvBuffer tlvs = mFiraEncoder.getTlvBuffer(params, PROTOCOL_VERSION_1_1); 392 393 assertThat(tlvs.getNoOfParams()).isEqualTo(5); 394 assertThat(tlvs.getByteArray()).isEqualTo(TEST_FIRA_RECONFIGURE_TLV_DATA); 395 } 396 397 // This test could be changed to just check that TlvEncoder returns a FiraEncoder, as 398 // above testFiraOpenSessionParams() already checks the encoding done by FiraEncoder. 399 @Test testFiraOpenSessionParamsViaTlvEncoder()400 public void testFiraOpenSessionParamsViaTlvEncoder() throws Exception { 401 FiraOpenSessionParams params = TEST_FIRA_OPEN_SESSION_PARAMS_V_1_1.build(); 402 TlvBuffer tlvs = TlvEncoder.getEncoder(FiraParams.PROTOCOL_NAME, mUwbInjector) 403 .getTlvBuffer(params, PROTOCOL_VERSION_1_1); 404 405 assertThat(tlvs.getNoOfParams()).isEqualTo(46); 406 assertThat(tlvs.getByteArray()).isEqualTo(mFiraSessionv11TlvData); 407 } 408 409 @Test testFiraRangingReconfigureParamsViaTlvEncoder()410 public void testFiraRangingReconfigureParamsViaTlvEncoder() throws Exception { 411 FiraRangingReconfigureParams params = TEST_FIRA_RECONFIGURE_PARAMS.build(); 412 TlvBuffer tlvs = TlvEncoder.getEncoder(FiraParams.PROTOCOL_NAME, mUwbInjector) 413 .getTlvBuffer(params, PROTOCOL_VERSION_DUMMY); 414 415 assertThat(tlvs.getNoOfParams()).isEqualTo(5); 416 assertThat(tlvs.getByteArray()).isEqualTo(TEST_FIRA_RECONFIGURE_TLV_DATA); 417 } 418 419 @Test testFiraOpenSessionParamsUtTag()420 public void testFiraOpenSessionParamsUtTag() throws Exception { 421 FiraOpenSessionParams params = TEST_FIRA_UT_TAG_OPEN_SESSION_PARAM.build(); 422 TlvBuffer tlvs = mFiraEncoder.getTlvBuffer(params, PROTOCOL_VERSION_1_1); 423 424 assertThat(tlvs.getNoOfParams()).isEqualTo(46); 425 assertThat(tlvs.getByteArray()).isEqualTo(mFiraOpenSessionTlvUtTag); 426 427 } 428 429 @Test testFiraOpenSessionParamsProvisionedStsWithSessionKey()430 public void testFiraOpenSessionParamsProvisionedStsWithSessionKey() throws Exception { 431 FiraOpenSessionParams params = 432 new FiraOpenSessionParams.Builder() 433 .setProtocolVersion(FiraParams.PROTOCOL_VERSION_1_1) 434 .setSessionId(1) 435 .setSessionType(SESSION_TYPE_RANGING) 436 .setRangeDataNtfConfig( 437 RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_AOA_LEVEL_TRIG) 438 .setDeviceType(RANGING_DEVICE_TYPE_CONTROLLER) 439 .setDeviceRole(RANGING_DEVICE_ROLE_RESPONDER) 440 .setDeviceAddress(UwbAddress.fromBytes(new byte[]{0x4, 0x6})) 441 .setDestAddressList(Arrays.asList(UwbAddress.fromBytes( 442 new byte[]{0x4, 0x6}))) 443 .setMultiNodeMode(MULTI_NODE_MODE_UNICAST) 444 .setRangingRoundUsage(RANGING_ROUND_USAGE_SS_TWR_DEFERRED_MODE) 445 .setStsConfig(STS_CONFIG_PROVISIONED) 446 .setSessionKey(new byte[]{0x5, 0x78, 0x5, 0x78, 0x5, 0x78, 0x5, 0x78, 0x5, 447 0x78, 0x5, 0x78, 0x5, 0x78, 0x5, 0x78}) 448 .setRangeDataNtfAoaAzimuthLower(-1.5) 449 .setRangeDataNtfAoaAzimuthUpper(2.5) 450 .setRangeDataNtfAoaElevationLower(-1.5) 451 .setRangeDataNtfAoaElevationUpper(1.2) 452 .build(); 453 454 byte[] expected_data; 455 if (!SdkLevel.isAtLeastU()) { 456 expected_data = UwbUtil.getByteArray( 457 "01010102010303010004010906020604080260090B01000C01030D01010E01040F02" 458 + "00001002204E11010012010313010014010A1501021601001701011A01011B0119" 459 + "1F01002201012301002401002501322601002901012A0200002C01002D01002E" 460 + "01012F0101310100320200003501010904C8000000000101050101070206042B0400" 461 + "0000001C0100451005780578057805780578057805780578" 462 + "1D0807D59E4707D56022EA0100"); 463 } else { 464 expected_data = UwbUtil.getByteArray(RANGING_ROUND_USAGE_SS_TWR_TLV 465 + STS_CONFIG_PROVISIONED_TLV + MULTI_NODE_MODE_UNICAST_TLV + CHANNEL_NUMBER_TLV 466 + DEVICE_MAC_ADDRESS_TLV + SLOT_DURATION_TLV + MAC_FCS_TYPE_TLV 467 + RANGING_ROUND_CONTROL_TLV + AOA_RESULT_REQ_TLV 468 + RANGE_DATA_NTF_CONFIG_AOA_LEVEL_TLV + RANGE_DATA_NTF_PROXIMITY_NEAR_TLV 469 + RANGE_DATA_NTF_PROXIMITY_FAR_TLV + DEVICE_ROLE_RESPONDER_TLV 470 + RFRAME_CONFIG_TLV 471 + RSSI_REPORTING_TLV + PREAMBLE_CODE_INDEX_TLV + SFD_ID_TLV 472 + PSDU_DATA_RATE_TLV + PREAMBLE_DURATION_TLV + RANGING_TIME_STRUCT_TLV 473 + SLOTS_PER_RR_TLV + PRF_MODE_TLV 474 + SCHEDULED_MODE_TIME_SCHEDULED_TLV + KEY_ROTATION_TLV + KEY_ROTATION_RATE_TLV 475 + SESSION_PRIORITY_TLV + MAC_ADDRESS_MODE_TLV + NUMBER_OF_STS_SEGMENTS_TLV 476 + MAX_RR_RETRY_TLV + HOPPING_MODE_TLV + BLOCK_STRIDE_LENGTH_TLV 477 + RESULT_REPORT_CONFIG_TLV + IN_BAND_TERMINATION_ATTEMPT_COUNT_TLV 478 + BPRF_PHR_DATA_RATE_TLV + MAX_NUMBER_OF_MEASUREMENTS_TLV + STS_LENGTH_TLV 479 + RANGING_INTERVAL_TLV + DEVICE_TYPE_CONTROLLER_TLV + NUMBER_OF_CONTROLEES_TLV 480 + DST_MAC_ADDRESS_TLV + UWB_INITIATION_TIME_TLV + TX_ADAPTIVE_PAYLOAD_POWER_TLV 481 + SESSION_KEY_TLV + RANGE_DATA_NTF_AOA_BOUND_TLV + ANTENNA_MODE_TLV); 482 } 483 TlvBuffer tlvs = mFiraEncoder.getTlvBuffer(params, PROTOCOL_VERSION_1_1); 484 485 assertThat(tlvs.getNoOfParams()).isEqualTo(45); 486 assertThat(tlvs.getByteArray()).isEqualTo(expected_data); 487 } 488 489 @Test testFiraOpenSessionParamsProvisionedStsWithoutSessionKey()490 public void testFiraOpenSessionParamsProvisionedStsWithoutSessionKey() throws Exception { 491 FiraOpenSessionParams params = 492 new FiraOpenSessionParams.Builder() 493 .setProtocolVersion(FiraParams.PROTOCOL_VERSION_1_1) 494 .setSessionId(1) 495 .setSessionType(SESSION_TYPE_RANGING) 496 .setRangeDataNtfConfig( 497 RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_AOA_LEVEL_TRIG) 498 .setDeviceType(RANGING_DEVICE_TYPE_CONTROLLER) 499 .setDeviceRole(RANGING_DEVICE_ROLE_RESPONDER) 500 .setDeviceAddress(UwbAddress.fromBytes(new byte[]{0x4, 0x6})) 501 .setDestAddressList(Arrays.asList(UwbAddress.fromBytes( 502 new byte[]{0x4, 0x6}))) 503 .setMultiNodeMode(MULTI_NODE_MODE_UNICAST) 504 .setRangingRoundUsage(RANGING_ROUND_USAGE_SS_TWR_DEFERRED_MODE) 505 .setStsConfig(STS_CONFIG_PROVISIONED) 506 .setRangeDataNtfAoaAzimuthLower(-1.5) 507 .setRangeDataNtfAoaAzimuthUpper(2.5) 508 .setRangeDataNtfAoaElevationLower(-1.5) 509 .setRangeDataNtfAoaElevationUpper(1.2) 510 .build(); 511 512 byte[] expected_data; 513 if (!SdkLevel.isAtLeastU()) { 514 expected_data = UwbUtil.getByteArray( 515 "01010102010303010004010906020604080260090B01000C01030D01010E01040F02" 516 + "00001002204E11010012010313010014010A1501021601001701011A01011B0119" 517 + "1F01002201012301002401002501322601002901012A0200002C01002D01002E" 518 + "01012F0101310100320200003501010904C8000000000101050101070206042B0400" 519 + "0000001C01001D0807D59E4707D56022EA0100"); 520 } else { 521 expected_data = UwbUtil.getByteArray(RANGING_ROUND_USAGE_SS_TWR_TLV 522 + STS_CONFIG_PROVISIONED_TLV + MULTI_NODE_MODE_UNICAST_TLV + CHANNEL_NUMBER_TLV 523 + DEVICE_MAC_ADDRESS_TLV + SLOT_DURATION_TLV + MAC_FCS_TYPE_TLV 524 + RANGING_ROUND_CONTROL_TLV + AOA_RESULT_REQ_TLV 525 + RANGE_DATA_NTF_CONFIG_AOA_LEVEL_TLV + RANGE_DATA_NTF_PROXIMITY_NEAR_TLV 526 + RANGE_DATA_NTF_PROXIMITY_FAR_TLV + DEVICE_ROLE_RESPONDER_TLV 527 + RFRAME_CONFIG_TLV 528 + RSSI_REPORTING_TLV + PREAMBLE_CODE_INDEX_TLV + SFD_ID_TLV 529 + PSDU_DATA_RATE_TLV + PREAMBLE_DURATION_TLV + RANGING_TIME_STRUCT_TLV 530 + SLOTS_PER_RR_TLV + PRF_MODE_TLV 531 + SCHEDULED_MODE_TIME_SCHEDULED_TLV + KEY_ROTATION_TLV + KEY_ROTATION_RATE_TLV 532 + SESSION_PRIORITY_TLV + MAC_ADDRESS_MODE_TLV + NUMBER_OF_STS_SEGMENTS_TLV 533 + MAX_RR_RETRY_TLV + HOPPING_MODE_TLV + BLOCK_STRIDE_LENGTH_TLV 534 + RESULT_REPORT_CONFIG_TLV + IN_BAND_TERMINATION_ATTEMPT_COUNT_TLV 535 + BPRF_PHR_DATA_RATE_TLV + MAX_NUMBER_OF_MEASUREMENTS_TLV + STS_LENGTH_TLV 536 + RANGING_INTERVAL_TLV + DEVICE_TYPE_CONTROLLER_TLV + NUMBER_OF_CONTROLEES_TLV 537 + DST_MAC_ADDRESS_TLV + UWB_INITIATION_TIME_TLV + TX_ADAPTIVE_PAYLOAD_POWER_TLV 538 + RANGE_DATA_NTF_AOA_BOUND_TLV + ANTENNA_MODE_TLV); 539 } 540 TlvBuffer tlvs = mFiraEncoder.getTlvBuffer(params, PROTOCOL_VERSION_1_1); 541 542 assertThat(tlvs.getNoOfParams()).isEqualTo(44); 543 assertThat(tlvs.getByteArray()).isEqualTo(expected_data); 544 } 545 546 @Test testFiraOpenSessionParamsDynamicControleeIndKey()547 public void testFiraOpenSessionParamsDynamicControleeIndKey() throws Exception { 548 FiraOpenSessionParams params = 549 new FiraOpenSessionParams.Builder() 550 .setProtocolVersion(FiraParams.PROTOCOL_VERSION_1_1) 551 .setSessionId(1) 552 .setSessionType(SESSION_TYPE_RANGING) 553 .setRangeDataNtfConfig( 554 RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_AOA_LEVEL_TRIG) 555 .setDeviceType(RANGING_DEVICE_TYPE_CONTROLEE) 556 .setDeviceRole(RANGING_DEVICE_ROLE_RESPONDER) 557 .setDeviceAddress(UwbAddress.fromBytes(new byte[]{0x4, 0x6})) 558 .setDestAddressList(Arrays.asList(UwbAddress.fromBytes( 559 new byte[]{0x4, 0x6}))) 560 .setMultiNodeMode(MULTI_NODE_MODE_UNICAST) 561 .setRangingRoundUsage(RANGING_ROUND_USAGE_SS_TWR_DEFERRED_MODE) 562 .setStsConfig(STS_CONFIG_DYNAMIC_FOR_CONTROLEE_INDIVIDUAL_KEY) 563 .setSubSessionId(01) 564 .setRangeDataNtfAoaAzimuthLower(-1.5) 565 .setRangeDataNtfAoaAzimuthUpper(2.5) 566 .setRangeDataNtfAoaElevationLower(-1.5) 567 .setRangeDataNtfAoaElevationUpper(1.2) 568 .build(); 569 570 String STS_CONFIG_DYNAMIC_FOR_CONTROLEE_INDIVIDUAL_KEY_TLV = "020102"; 571 byte[] expected_data; 572 if (!SdkLevel.isAtLeastU()) { 573 expected_data = UwbUtil.getByteArray( 574 "01010102010203010004010906020604080260090B01000C01030D01010E01040F02" 575 + "00001002204E11010012010313010014010A1501021601001701011A01011B0119" 576 + "1F01002201012301002401002501322601002901012A0200002C01002D01002E" 577 + "01012F0101310100320200003501010904C8000000000100050101070206042B0400" 578 + "0000001C01003004010000001D0807D59E4707D56022EA0100"); 579 } else { 580 expected_data = UwbUtil.getByteArray(RANGING_ROUND_USAGE_SS_TWR_TLV 581 + STS_CONFIG_DYNAMIC_FOR_CONTROLEE_INDIVIDUAL_KEY_TLV 582 + MULTI_NODE_MODE_UNICAST_TLV + CHANNEL_NUMBER_TLV + DEVICE_MAC_ADDRESS_TLV 583 + SLOT_DURATION_TLV + MAC_FCS_TYPE_TLV 584 + RANGING_ROUND_CONTROL_TLV + AOA_RESULT_REQ_TLV 585 + RANGE_DATA_NTF_CONFIG_AOA_LEVEL_TLV + RANGE_DATA_NTF_PROXIMITY_NEAR_TLV 586 + RANGE_DATA_NTF_PROXIMITY_FAR_TLV + DEVICE_ROLE_RESPONDER_TLV 587 + RFRAME_CONFIG_TLV 588 + RSSI_REPORTING_TLV + PREAMBLE_CODE_INDEX_TLV + SFD_ID_TLV 589 + PSDU_DATA_RATE_TLV + PREAMBLE_DURATION_TLV + RANGING_TIME_STRUCT_TLV 590 + SLOTS_PER_RR_TLV + PRF_MODE_TLV 591 + SCHEDULED_MODE_TIME_SCHEDULED_TLV + KEY_ROTATION_TLV + KEY_ROTATION_RATE_TLV 592 + SESSION_PRIORITY_TLV + MAC_ADDRESS_MODE_TLV + NUMBER_OF_STS_SEGMENTS_TLV 593 + MAX_RR_RETRY_TLV + HOPPING_MODE_TLV + BLOCK_STRIDE_LENGTH_TLV 594 + RESULT_REPORT_CONFIG_TLV + IN_BAND_TERMINATION_ATTEMPT_COUNT_TLV 595 + BPRF_PHR_DATA_RATE_TLV + MAX_NUMBER_OF_MEASUREMENTS_TLV + STS_LENGTH_TLV 596 + RANGING_INTERVAL_TLV + DEVICE_TYPE_CONTROLEE_TLV + NUMBER_OF_CONTROLEES_TLV 597 + DST_MAC_ADDRESS_TLV + UWB_INITIATION_TIME_TLV + TX_ADAPTIVE_PAYLOAD_POWER_TLV 598 + SUB_SESSION_ID_TLV + RANGE_DATA_NTF_AOA_BOUND_TLV + ANTENNA_MODE_TLV); 599 } 600 TlvBuffer tlvs = mFiraEncoder.getTlvBuffer(params, PROTOCOL_VERSION_1_1); 601 602 assertThat(tlvs.getNoOfParams()).isEqualTo(45); 603 assertThat(tlvs.getByteArray()).isEqualTo(expected_data); 604 } 605 606 @Test testFiraOpenSessionParamsProvControleeIndKeyWithSessionkey()607 public void testFiraOpenSessionParamsProvControleeIndKeyWithSessionkey() throws Exception { 608 FiraOpenSessionParams params = 609 new FiraOpenSessionParams.Builder() 610 .setProtocolVersion(FiraParams.PROTOCOL_VERSION_1_1) 611 .setSessionId(1) 612 .setSessionType(SESSION_TYPE_RANGING) 613 .setRangeDataNtfConfig( 614 RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_AOA_LEVEL_TRIG) 615 .setDeviceType(RANGING_DEVICE_TYPE_CONTROLEE) 616 .setDeviceRole(RANGING_DEVICE_ROLE_RESPONDER) 617 .setDeviceAddress(UwbAddress.fromBytes(new byte[]{0x4, 0x6})) 618 .setDestAddressList(Arrays.asList(UwbAddress.fromBytes( 619 new byte[]{0x4, 0x6}))) 620 .setMultiNodeMode(MULTI_NODE_MODE_UNICAST) 621 .setRangingRoundUsage(RANGING_ROUND_USAGE_SS_TWR_DEFERRED_MODE) 622 .setStsConfig(STS_CONFIG_PROVISIONED_FOR_CONTROLEE_INDIVIDUAL_KEY) 623 .setSubSessionId(01) 624 .setSessionKey(new byte[]{0x5, 0x78, 0x5, 0x78, 0x5, 0x78, 0x5, 0x78, 0x5, 625 0x78, 0x5, 0x78, 0x5, 0x78, 0x5, 0x78}) 626 .setSubsessionKey(new byte[]{0x6, 0x79, 0x6, 0x79, 0x6, 0x79, 0x6, 627 0x79, 0x6, 0x79, 0x6, 0x79, 0x6, 0x79, 0x6, 0x79}) 628 .setRangeDataNtfAoaAzimuthLower(-1.5) 629 .setRangeDataNtfAoaAzimuthUpper(2.5) 630 .setRangeDataNtfAoaElevationLower(-1.5) 631 .setRangeDataNtfAoaElevationUpper(1.2) 632 .build(); 633 634 String STS_CONFIG_PROVISIONED_FOR_CONTROLEE_INDIVIDUAL_KEY_TLV = "020104"; 635 String subsession_key = "461006790679067906790679067906790679"; 636 byte[] expected_data; 637 if (!SdkLevel.isAtLeastU()) { 638 expected_data = UwbUtil.getByteArray( 639 "01010102010403010004010906020604080260090B01000C01030D01010E01040F02" 640 + "00001002204E11010012010313010014010A1501021601001701011A01011B0119" 641 + "1F01002201012301002401002501322601002901012A0200002C01002D01002E" 642 + "01012F0101310100320200003501010904C8000000000100050101070206042B0400" 643 + "0000001C0100300401000000" 644 + "461006790679067906790679067906790679" 645 + "451005780578057805780578057805780578" 646 + "1D0807D59E4707D56022EA0100"); 647 } else { 648 expected_data = UwbUtil.getByteArray(RANGING_ROUND_USAGE_SS_TWR_TLV 649 + STS_CONFIG_PROVISIONED_FOR_CONTROLEE_INDIVIDUAL_KEY_TLV 650 + MULTI_NODE_MODE_UNICAST_TLV + CHANNEL_NUMBER_TLV + DEVICE_MAC_ADDRESS_TLV 651 + SLOT_DURATION_TLV + MAC_FCS_TYPE_TLV + RANGING_ROUND_CONTROL_TLV 652 + AOA_RESULT_REQ_TLV + RANGE_DATA_NTF_CONFIG_AOA_LEVEL_TLV 653 + RANGE_DATA_NTF_PROXIMITY_NEAR_TLV + RANGE_DATA_NTF_PROXIMITY_FAR_TLV 654 + DEVICE_ROLE_RESPONDER_TLV + RFRAME_CONFIG_TLV 655 + RSSI_REPORTING_TLV + PREAMBLE_CODE_INDEX_TLV + SFD_ID_TLV 656 + PSDU_DATA_RATE_TLV + PREAMBLE_DURATION_TLV + RANGING_TIME_STRUCT_TLV 657 + SLOTS_PER_RR_TLV + PRF_MODE_TLV 658 + SCHEDULED_MODE_TIME_SCHEDULED_TLV + KEY_ROTATION_TLV + KEY_ROTATION_RATE_TLV 659 + SESSION_PRIORITY_TLV + MAC_ADDRESS_MODE_TLV + NUMBER_OF_STS_SEGMENTS_TLV 660 + MAX_RR_RETRY_TLV + HOPPING_MODE_TLV + BLOCK_STRIDE_LENGTH_TLV 661 + RESULT_REPORT_CONFIG_TLV + IN_BAND_TERMINATION_ATTEMPT_COUNT_TLV 662 + BPRF_PHR_DATA_RATE_TLV + MAX_NUMBER_OF_MEASUREMENTS_TLV + STS_LENGTH_TLV 663 + RANGING_INTERVAL_TLV + DEVICE_TYPE_CONTROLEE_TLV + NUMBER_OF_CONTROLEES_TLV 664 + DST_MAC_ADDRESS_TLV + UWB_INITIATION_TIME_TLV + TX_ADAPTIVE_PAYLOAD_POWER_TLV 665 + SUB_SESSION_ID_TLV + subsession_key + SESSION_KEY_TLV 666 + RANGE_DATA_NTF_AOA_BOUND_TLV + ANTENNA_MODE_TLV); 667 } 668 TlvBuffer tlvs = mFiraEncoder.getTlvBuffer(params, PROTOCOL_VERSION_1_1); 669 670 assertThat(tlvs.getNoOfParams()).isEqualTo(47); 671 assertThat(tlvs.getByteArray()).isEqualTo(expected_data); 672 } 673 674 @Test testFiraOpenSessionParamsProvControleeIndKeyWithoutSessionkey()675 public void testFiraOpenSessionParamsProvControleeIndKeyWithoutSessionkey() throws Exception { 676 FiraOpenSessionParams params = 677 new FiraOpenSessionParams.Builder() 678 .setProtocolVersion(FiraParams.PROTOCOL_VERSION_1_1) 679 .setSessionId(1) 680 .setSessionType(SESSION_TYPE_RANGING) 681 .setRangeDataNtfConfig( 682 RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_AOA_LEVEL_TRIG) 683 .setDeviceType(RANGING_DEVICE_TYPE_CONTROLEE) 684 .setDeviceRole(RANGING_DEVICE_ROLE_RESPONDER) 685 .setDeviceAddress(UwbAddress.fromBytes(new byte[]{0x4, 0x6})) 686 .setDestAddressList(Arrays.asList(UwbAddress.fromBytes( 687 new byte[]{0x4, 0x6}))) 688 .setMultiNodeMode(MULTI_NODE_MODE_UNICAST) 689 .setRangingRoundUsage(RANGING_ROUND_USAGE_SS_TWR_DEFERRED_MODE) 690 .setStsConfig(STS_CONFIG_PROVISIONED_FOR_CONTROLEE_INDIVIDUAL_KEY) 691 .setSubSessionId(01) 692 .setRangeDataNtfAoaAzimuthLower(-1.5) 693 .setRangeDataNtfAoaAzimuthUpper(2.5) 694 .setRangeDataNtfAoaElevationLower(-1.5) 695 .setRangeDataNtfAoaElevationUpper(1.2) 696 .build(); 697 698 String STS_CONFIG_PROVISIONED_FOR_CONTROLEE_INDIVIDUAL_KEY_TLV = "020104"; 699 byte[] expected_data; 700 if (!SdkLevel.isAtLeastU()) { 701 expected_data = UwbUtil.getByteArray( 702 "01010102010403010004010906020604080260090B01000C01030D01010E01040F02" 703 + "00001002204E11010012010313010014010A1501021601001701011A01011B0119" 704 + "1F01002201012301002401002501322601002901012A0200002C01002D01002E" 705 + "01012F0101310100320200003501010904C8000000000100050101070206042B0400" 706 + "0000001C01003004010000001D0807D59E4707D56022EA0100"); 707 } else { 708 expected_data = UwbUtil.getByteArray(RANGING_ROUND_USAGE_SS_TWR_TLV 709 + STS_CONFIG_PROVISIONED_FOR_CONTROLEE_INDIVIDUAL_KEY_TLV 710 + MULTI_NODE_MODE_UNICAST_TLV + CHANNEL_NUMBER_TLV 711 + DEVICE_MAC_ADDRESS_TLV + SLOT_DURATION_TLV 712 + MAC_FCS_TYPE_TLV + RANGING_ROUND_CONTROL_TLV + AOA_RESULT_REQ_TLV 713 + RANGE_DATA_NTF_CONFIG_AOA_LEVEL_TLV + RANGE_DATA_NTF_PROXIMITY_NEAR_TLV 714 + RANGE_DATA_NTF_PROXIMITY_FAR_TLV + DEVICE_ROLE_RESPONDER_TLV 715 + RFRAME_CONFIG_TLV + RSSI_REPORTING_TLV + PREAMBLE_CODE_INDEX_TLV + SFD_ID_TLV 716 + PSDU_DATA_RATE_TLV + PREAMBLE_DURATION_TLV + RANGING_TIME_STRUCT_TLV 717 + SLOTS_PER_RR_TLV + PRF_MODE_TLV 718 + SCHEDULED_MODE_TIME_SCHEDULED_TLV + KEY_ROTATION_TLV + KEY_ROTATION_RATE_TLV 719 + SESSION_PRIORITY_TLV + MAC_ADDRESS_MODE_TLV + NUMBER_OF_STS_SEGMENTS_TLV 720 + MAX_RR_RETRY_TLV + HOPPING_MODE_TLV + BLOCK_STRIDE_LENGTH_TLV 721 + RESULT_REPORT_CONFIG_TLV + IN_BAND_TERMINATION_ATTEMPT_COUNT_TLV 722 + BPRF_PHR_DATA_RATE_TLV + MAX_NUMBER_OF_MEASUREMENTS_TLV + STS_LENGTH_TLV 723 + RANGING_INTERVAL_TLV + DEVICE_TYPE_CONTROLEE_TLV + NUMBER_OF_CONTROLEES_TLV 724 + DST_MAC_ADDRESS_TLV + UWB_INITIATION_TIME_TLV + TX_ADAPTIVE_PAYLOAD_POWER_TLV 725 + SUB_SESSION_ID_TLV 726 + RANGE_DATA_NTF_AOA_BOUND_TLV + ANTENNA_MODE_TLV); 727 } 728 TlvBuffer tlvs = mFiraEncoder.getTlvBuffer(params, PROTOCOL_VERSION_1_1); 729 730 assertThat(tlvs.getNoOfParams()).isEqualTo(45); 731 assertThat(tlvs.getByteArray()).isEqualTo(expected_data); 732 } 733 734 @Test testFiraDlTdoaDtTagSession()735 public void testFiraDlTdoaDtTagSession() throws Exception { 736 assumeTrue(SdkLevel.isAtLeastU()); 737 FiraOpenSessionParams params = 738 new FiraOpenSessionParams.Builder() 739 .setProtocolVersion(FiraParams.PROTOCOL_VERSION_1_1) 740 .setSessionId(1) 741 .setSessionType(SESSION_TYPE_RANGING) 742 .setStsConfig(STS_CONFIG_STATIC) 743 .setDeviceType(RANGING_DEVICE_TYPE_DT_TAG) 744 .setDeviceRole(RANGING_DEVICE_DT_TAG) 745 .setDeviceAddress(UwbAddress.fromBytes(new byte[]{0x4, 0x6})) 746 .setDestAddressList(Arrays.asList(UwbAddress.fromBytes( 747 new byte[]{0x4, 0x6}))) // Should be ignored 748 .setMultiNodeMode(MULTI_NODE_MODE_ONE_TO_MANY) 749 .setRangingRoundUsage(RANGING_ROUND_USAGE_DL_TDOA) 750 .setRframeConfig(RFRAME_CONFIG_SP1) 751 .setVendorId(new byte[]{0x5, 0x78}) 752 .setStaticStsIV(new byte[]{0x1a, 0x55, 0x77, 0x47, 0x7e, 0x7d}) 753 .build(); 754 755 byte[] expected_data = UwbUtil.getByteArray(RANGING_ROUND_USAGE_Dl_TDOA_TLV 756 + STS_CONFIG_STATIC_TLV + MULTI_NODE_MODE_ONE_TO_MANY_TLV + CHANNEL_NUMBER_TLV 757 + DEVICE_MAC_ADDRESS_TLV + SLOT_DURATION_TLV + MAC_FCS_TYPE_TLV 758 + RANGING_ROUND_CONTROL_TLV + AOA_RESULT_REQ_TLV 759 + RANGE_DATA_NTF_CONFIG_ENABLE_TLV + RANGE_DATA_NTF_PROXIMITY_NEAR_TLV 760 + RANGE_DATA_NTF_PROXIMITY_FAR_TLV + DEVICE_ROLE_DT_TAG_TLV 761 + RFRAME_CONFIG_DL_TDOA_TLV + RSSI_REPORTING_TLV + PREAMBLE_CODE_INDEX_TLV 762 + SFD_ID_TLV + PSDU_DATA_RATE_TLV + PREAMBLE_DURATION_TLV + RANGING_TIME_STRUCT_TLV 763 + SLOTS_PER_RR_TLV + PRF_MODE_TLV 764 + SCHEDULED_MODE_TIME_SCHEDULED_TLV + KEY_ROTATION_TLV + KEY_ROTATION_RATE_TLV 765 + SESSION_PRIORITY_TLV + MAC_ADDRESS_MODE_TLV + NUMBER_OF_STS_SEGMENTS_TLV 766 + MAX_RR_RETRY_TLV + HOPPING_MODE_TLV + BLOCK_STRIDE_LENGTH_TLV 767 + RESULT_REPORT_CONFIG_TLV + IN_BAND_TERMINATION_ATTEMPT_COUNT_TLV 768 + BPRF_PHR_DATA_RATE_TLV + MAX_NUMBER_OF_MEASUREMENTS_TLV + STS_LENGTH_TLV 769 + RANGING_INTERVAL_TLV + TX_ADAPTIVE_PAYLOAD_POWER_TLV 770 + VENDOR_ID_TLV + STATIC_STS_IV_TLV + ANTENNA_MODE_TLV); 771 772 TlvBuffer tlvs = mFiraEncoder.getTlvBuffer(params, PROTOCOL_VERSION_1_1); 773 774 assertThat(tlvs.getNoOfParams()).isEqualTo(41); 775 assertThat(tlvs.getByteArray()).isEqualTo(expected_data); 776 } 777 778 @Test testFiraDlTdoaDtTagSession_2_0()779 public void testFiraDlTdoaDtTagSession_2_0() throws Exception { 780 assumeTrue(SdkLevel.isAtLeastU()); 781 FiraOpenSessionParams params = 782 new FiraOpenSessionParams.Builder() 783 .setProtocolVersion(FiraParams.PROTOCOL_VERSION_2_0) 784 .setSessionId(1) 785 .setSessionType(SESSION_TYPE_RANGING) 786 .setStsConfig(STS_CONFIG_STATIC) 787 .setDeviceType(RANGING_DEVICE_TYPE_DT_TAG) 788 .setDeviceRole(RANGING_DEVICE_DT_TAG) 789 .setDeviceAddress(UwbAddress.fromBytes(new byte[]{0x4, 0x6})) 790 .setDestAddressList(Arrays.asList(UwbAddress.fromBytes( 791 new byte[]{0x4, 0x6}))) // Should be ignored 792 .setMultiNodeMode(MULTI_NODE_MODE_ONE_TO_MANY) 793 .setRangingRoundUsage(RANGING_ROUND_USAGE_DL_TDOA) 794 .setRframeConfig(RFRAME_CONFIG_SP1) 795 .setVendorId(new byte[]{0x5, 0x78}) 796 .setStaticStsIV(new byte[]{0x1a, 0x55, 0x77, 0x47, 0x7e, 0x7d}) 797 .setDlTdoaBlockStriding(01) 798 .build(); 799 800 String DL_TDOA_BLOCK_STRIDING_TLV = "430101"; 801 byte[] expected_data = UwbUtil.getByteArray(RANGING_ROUND_USAGE_Dl_TDOA_TLV 802 + STS_CONFIG_STATIC_TLV + MULTI_NODE_MODE_ONE_TO_MANY_TLV + CHANNEL_NUMBER_TLV 803 + DEVICE_MAC_ADDRESS_TLV + SLOT_DURATION_TLV + MAC_FCS_TYPE_TLV 804 + RANGING_ROUND_CONTROL_TLV + AOA_RESULT_REQ_TLV 805 + RANGE_DATA_NTF_CONFIG_ENABLE_TLV + RANGE_DATA_NTF_PROXIMITY_NEAR_TLV 806 + RANGE_DATA_NTF_PROXIMITY_FAR_TLV + DEVICE_ROLE_DT_TAG_TLV 807 + RFRAME_CONFIG_DL_TDOA_TLV + RSSI_REPORTING_TLV + PREAMBLE_CODE_INDEX_TLV 808 + SFD_ID_TLV + PSDU_DATA_RATE_TLV + PREAMBLE_DURATION_TLV + RANGING_TIME_STRUCT_TLV 809 + SLOTS_PER_RR_TLV + PRF_MODE_TLV 810 + SCHEDULED_MODE_TIME_SCHEDULED_TLV + KEY_ROTATION_TLV + KEY_ROTATION_RATE_TLV 811 + SESSION_PRIORITY_TLV + MAC_ADDRESS_MODE_TLV + NUMBER_OF_STS_SEGMENTS_TLV 812 + MAX_RR_RETRY_TLV + HOPPING_MODE_TLV + BLOCK_STRIDE_LENGTH_TLV 813 + RESULT_REPORT_CONFIG_TLV + IN_BAND_TERMINATION_ATTEMPT_COUNT_TLV 814 + BPRF_PHR_DATA_RATE_TLV + MAX_NUMBER_OF_MEASUREMENTS_TLV + STS_LENGTH_TLV 815 + RANGING_INTERVAL_TLV + DL_TDOA_BLOCK_STRIDING_TLV 816 + LINK_LAYER_MODE_BYPASS_TLV + DATA_REPETITION_COUNT_TLV 817 + SESSION_DATA_TRANSFER_STATUS_NTF_CONFIG_TLV 818 + APPLICATION_DATA_ENDPOINT_HOST_TLV 819 + VENDOR_ID_TLV + STATIC_STS_IV_TLV + ANTENNA_MODE_TLV); 820 821 TlvBuffer tlvs = mFiraEncoder.getTlvBuffer(params, PROTOCOL_VERSION_2_0); 822 823 assertThat(tlvs.getNoOfParams()).isEqualTo(45); 824 assertThat(tlvs.getByteArray()).isEqualTo(expected_data); 825 } 826 827 @Test testFiraContentionbasedOpenSessionParams()828 public void testFiraContentionbasedOpenSessionParams() throws Exception { 829 assumeTrue(SdkLevel.isAtLeastU()); 830 FiraOpenSessionParams params = 831 new FiraOpenSessionParams.Builder() 832 .setProtocolVersion(FiraParams.PROTOCOL_VERSION_2_0) 833 .setSessionId(1) 834 .setSessionType(SESSION_TYPE_RANGING) 835 .setRangeDataNtfConfig(RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_AOA_LEVEL_TRIG) 836 .setDeviceType(RANGING_DEVICE_TYPE_CONTROLLER) 837 .setDeviceRole(RANGING_DEVICE_ROLE_INITIATOR) 838 .setDeviceAddress(UwbAddress.fromBytes(new byte[]{0x4, 0x6})) 839 .setMultiNodeMode(MULTI_NODE_MODE_ONE_TO_MANY) 840 .setRangingRoundUsage(RANGING_ROUND_USAGE_SS_TWR_DEFERRED_MODE) 841 .setStsConfig(STS_CONFIG_STATIC) 842 .setVendorId(new byte[]{0x5, 0x78}) 843 .setStaticStsIV(new byte[]{0x1a, 0x55, 0x77, 0x47, 0x7e, 0x7d}) 844 .setRangeDataNtfAoaAzimuthLower(-1.5) 845 .setRangeDataNtfAoaAzimuthUpper(2.5) 846 .setRangeDataNtfAoaElevationLower(-1.5) 847 .setRangeDataNtfAoaElevationUpper(1.2) 848 .setInitiationTime(1000) 849 .setScheduledMode(CONTENTION_BASED_RANGING) 850 .setHasControlMessage(true) 851 .setHasRangingControlPhase(true) 852 .setMeasurementReportPhase(FiraParams.MEASUREMENT_REPORT_PHASE_SET) 853 .build(); 854 byte[] expected_data = UwbUtil.getByteArray( 855 RANGING_ROUND_USAGE_SS_TWR_TLV 856 + STS_CONFIG_STATIC_TLV 857 + MULTI_NODE_MODE_ONE_TO_MANY_TLV 858 + CHANNEL_NUMBER_TLV 859 + DEVICE_MAC_ADDRESS_TLV 860 + SLOT_DURATION_TLV 861 + MAC_FCS_TYPE_TLV 862 + RANGING_ROUND_CONTROL_CONTENTION_MRP_RCP_CM_RRRM_TLV 863 + AOA_RESULT_REQ_TLV 864 + RANGE_DATA_NTF_CONFIG_AOA_LEVEL_TLV 865 + RANGE_DATA_NTF_PROXIMITY_NEAR_TLV 866 + RANGE_DATA_NTF_PROXIMITY_FAR_TLV 867 + DEVICE_ROLE_INITIATOR_TLV 868 + RFRAME_CONFIG_TLV 869 + RSSI_REPORTING_TLV 870 + PREAMBLE_CODE_INDEX_TLV 871 + SFD_ID_TLV 872 + PSDU_DATA_RATE_TLV 873 + PREAMBLE_DURATION_TLV 874 + RANGING_TIME_STRUCT_TLV 875 + SLOTS_PER_RR_TLV 876 + PRF_MODE_TLV 877 + SCHEDULED_MODE_CONTENTION_TLV 878 + KEY_ROTATION_TLV 879 + KEY_ROTATION_RATE_TLV 880 + SESSION_PRIORITY_TLV 881 + MAC_ADDRESS_MODE_TLV 882 + NUMBER_OF_STS_SEGMENTS_TLV 883 + MAX_RR_RETRY_TLV 884 + HOPPING_MODE_TLV 885 + BLOCK_STRIDE_LENGTH_TLV 886 + RESULT_REPORT_CONFIG_TLV 887 + IN_BAND_TERMINATION_ATTEMPT_COUNT_TLV 888 + BPRF_PHR_DATA_RATE_TLV 889 + MAX_NUMBER_OF_MEASUREMENTS_TLV 890 + STS_LENGTH_TLV 891 + RANGING_INTERVAL_TLV 892 + DEVICE_TYPE_CONTROLLER_TLV 893 + UWB_INITIATION_TIME_2_0_TLV 894 + LINK_LAYER_MODE_BYPASS_TLV 895 + DATA_REPETITION_COUNT_TLV 896 + SESSION_DATA_TRANSFER_STATUS_NTF_CONFIG_TLV 897 + APPLICATION_DATA_ENDPOINT_HOST_TLV 898 + VENDOR_ID_TLV 899 + STATIC_STS_IV_TLV 900 + RANGE_DATA_NTF_AOA_BOUND_TLV 901 + CAP_SIZE_RANGE_DEFAULT_TLV 902 + ANTENNA_MODE_TLV); 903 TlvBuffer tlvs = mFiraEncoder.getTlvBuffer(params, PROTOCOL_VERSION_2_0); 904 905 assertThat(tlvs.getNoOfParams()).isEqualTo(48); 906 assertThat(tlvs.getByteArray()).isEqualTo(expected_data); 907 } 908 909 @Test testFiraOpenSessionParamsForEnabledReferenceTimeBase()910 public void testFiraOpenSessionParamsForEnabledReferenceTimeBase() throws Exception { 911 assumeTrue(SdkLevel.isAtLeastU()); 912 FiraOpenSessionParams params = 913 new FiraOpenSessionParams.Builder() 914 .setProtocolVersion(FiraParams.PROTOCOL_VERSION_2_0) 915 .setSessionId(1) 916 .setSessionType(SESSION_TYPE_RANGING) 917 .setRangeDataNtfConfig( 918 RANGE_DATA_NTF_CONFIG_ENABLE_PROXIMITY_AOA_LEVEL_TRIG) 919 .setDeviceType(RANGING_DEVICE_TYPE_CONTROLLER) 920 .setDeviceRole(RANGING_DEVICE_ROLE_RESPONDER) 921 .setDeviceAddress(UwbAddress.fromBytes(new byte[]{0x4, 0x6})) 922 .setDestAddressList(Arrays.asList(UwbAddress.fromBytes( 923 new byte[]{0x4, 0x6}))) 924 .setMultiNodeMode(MULTI_NODE_MODE_UNICAST) 925 .setRangingRoundUsage(RANGING_ROUND_USAGE_SS_TWR_DEFERRED_MODE) 926 .setStsConfig(STS_CONFIG_STATIC) 927 .setVendorId(new byte[]{0x5, 0x78}) 928 .setStaticStsIV(new byte[]{0x1a, 0x55, 0x77, 0x47, 0x7e, 0x7d}) 929 .setRangeDataNtfAoaAzimuthLower(-1.5) 930 .setRangeDataNtfAoaAzimuthUpper(2.5) 931 .setRangeDataNtfAoaElevationLower(-1.5) 932 .setRangeDataNtfAoaElevationUpper(1.2) 933 .setInitiationTime(1000) 934 .setSessionTimeBase(1, 1, 200) 935 .build(); 936 937 byte[] expected_data = UwbUtil.getByteArray(RANGING_ROUND_USAGE_SS_TWR_TLV 938 + STS_CONFIG_STATIC_TLV + MULTI_NODE_MODE_UNICAST_TLV + CHANNEL_NUMBER_TLV 939 + DEVICE_MAC_ADDRESS_TLV + SLOT_DURATION_TLV + MAC_FCS_TYPE_TLV 940 + RANGING_ROUND_CONTROL_TLV + AOA_RESULT_REQ_TLV 941 + RANGE_DATA_NTF_CONFIG_AOA_LEVEL_TLV + RANGE_DATA_NTF_PROXIMITY_NEAR_TLV 942 + RANGE_DATA_NTF_PROXIMITY_FAR_TLV + DEVICE_ROLE_RESPONDER_TLV 943 + RFRAME_CONFIG_TLV 944 + RSSI_REPORTING_TLV + PREAMBLE_CODE_INDEX_TLV + SFD_ID_TLV 945 + PSDU_DATA_RATE_TLV + PREAMBLE_DURATION_TLV + RANGING_TIME_STRUCT_TLV 946 + SLOTS_PER_RR_TLV 947 + PRF_MODE_TLV + SCHEDULED_MODE_TIME_SCHEDULED_TLV + KEY_ROTATION_TLV 948 + KEY_ROTATION_RATE_TLV 949 + SESSION_PRIORITY_TLV + MAC_ADDRESS_MODE_TLV + NUMBER_OF_STS_SEGMENTS_TLV 950 + MAX_RR_RETRY_TLV + HOPPING_MODE_TLV + BLOCK_STRIDE_LENGTH_TLV 951 + RESULT_REPORT_CONFIG_TLV + IN_BAND_TERMINATION_ATTEMPT_COUNT_TLV 952 + BPRF_PHR_DATA_RATE_TLV + MAX_NUMBER_OF_MEASUREMENTS_TLV + STS_LENGTH_TLV 953 + RANGING_INTERVAL_TLV + DEVICE_TYPE_CONTROLLER_TLV + NUMBER_OF_CONTROLEES_TLV 954 + DST_MAC_ADDRESS_TLV + UWB_INITIATION_TIME_2_0_TLV 955 + LINK_LAYER_MODE_BYPASS_TLV 956 + DATA_REPETITION_COUNT_TLV 957 + SESSION_DATA_TRANSFER_STATUS_NTF_CONFIG_TLV 958 + APPLICATION_DATA_ENDPOINT_HOST_TLV 959 + SESSION_TIME_BASE_TLV 960 + VENDOR_ID_TLV + STATIC_STS_IV_TLV 961 + RANGE_DATA_NTF_AOA_BOUND_TLV + ANTENNA_MODE_TLV); 962 TlvBuffer tlvs = mFiraEncoder.getTlvBuffer(params, PROTOCOL_VERSION_2_0); 963 964 assertThat(tlvs.getNoOfParams()).isEqualTo(50); 965 assertThat(tlvs.getByteArray()).isEqualTo(expected_data); 966 } 967 } 968