One-sided RTT APs (non-80211mc capable) enabled in API (service)
Bug: 163335690
Test: All unit tests pass.
Change-Id: I2f8b704d3e3e3d18c199b3f476c3fcb0ecb0e27d
diff --git a/framework/java/android/net/wifi/rtt/RangingResult.java b/framework/java/android/net/wifi/rtt/RangingResult.java
index e2f270c..9724d3c 100644
--- a/framework/java/android/net/wifi/rtt/RangingResult.java
+++ b/framework/java/android/net/wifi/rtt/RangingResult.java
@@ -237,13 +237,13 @@
/**
* @return The number of attempted measurements used in the RTT exchange resulting in this set
* of results. The number of successful measurements is returned by
- * {@link #getNumSuccessfulMeasurements()} which at most, if there are no errors, will be 1 less
- * that the number of attempted measurements.
+ * {@link #getNumSuccessfulMeasurements()} which at most, if there are no errors, will be 1
+ * less than the number of attempted measurements.
* <p>
- * Only valid if {@link #getStatus()} returns {@link #STATUS_SUCCESS}, and if the method
- * {@link #is80211mcMeasurement()} returns true, otherwise will throw an exception. If the value
- * is 0, it should be interpreted as no information available, which may occur for one-sided RTT
- * measurements. Instead {@link RangingRequest#getRttBurstSize()} should be used instead.
+ * Only valid if {@link #getStatus()} returns {@link #STATUS_SUCCESS}, otherwise will throw an
+ * exception. If the value is 0, it should be interpreted as no information available, which may
+ * occur for one-sided RTT measurements. Instead {@link RangingRequest#getRttBurstSize()}
+ * should be used instead.
*/
public int getNumAttemptedMeasurements() {
if (mStatus != STATUS_SUCCESS) {
diff --git a/service/java/com/android/server/wifi/rtt/RttNative.java b/service/java/com/android/server/wifi/rtt/RttNative.java
index 98dc170..afe9a35 100644
--- a/service/java/com/android/server/wifi/rtt/RttNative.java
+++ b/service/java/com/android/server/wifi/rtt/RttNative.java
@@ -40,6 +40,7 @@
import android.os.RemoteException;
import android.util.Log;
+import com.android.modules.utils.build.SdkLevel;
import com.android.server.wifi.HalDeviceManager;
import com.android.server.wifi.util.NativeUtil;
@@ -388,13 +389,12 @@
// Skipping any configurations which have an error (printing out a message).
// The caller will only get results for valid configurations.
for (ResponderConfig responder: request.mRttPeers) {
- if (!isCalledFromPrivilegedContext) {
+ if (!SdkLevel.isAtLeastS() && !isCalledFromPrivilegedContext) {
if (!responder.supports80211mc) {
Log.e(TAG, "Invalid responder: does not support 802.11mc");
continue;
}
}
-
RttConfig config = new RttConfig();
System.arraycopy(responder.macAddress.toByteArray(), 0, config.addr, 0,
@@ -477,7 +477,7 @@
// Skipping any configurations which have an error (printing out a message).
// The caller will only get results for valid configurations.
for (ResponderConfig responder: request.mRttPeers) {
- if (!isCalledFromPrivilegedContext) {
+ if (!SdkLevel.isAtLeastS() && !isCalledFromPrivilegedContext) {
if (!responder.supports80211mc) {
Log.e(TAG, "Invalid responder: does not support 802.11mc");
continue;
@@ -779,7 +779,8 @@
rttResult.distanceInMm, rttResult.distanceSdInMm,
rttResult.rssi / -2, rttResult.numberPerBurstPeer,
rttResult.successNumber, lci, lcr, responderLocation,
- rttResult.timeStampInUs / CONVERSION_US_TO_MS));
+ rttResult.timeStampInUs / CONVERSION_US_TO_MS,
+ rttResult.type == RttType.TWO_SIDED));
}
return rangingResults;
}
@@ -815,7 +816,8 @@
rttResult.distanceInMm, rttResult.distanceSdInMm,
rttResult.rssi / -2, rttResult.numberPerBurstPeer,
rttResult.successNumber, lci, lcr, responderLocation,
- rttResult.timeStampInUs / CONVERSION_US_TO_MS));
+ rttResult.timeStampInUs / CONVERSION_US_TO_MS,
+ rttResult.type == RttType.TWO_SIDED));
}
return rangingResults;
}
diff --git a/service/java/com/android/server/wifi/rtt/RttServiceImpl.java b/service/java/com/android/server/wifi/rtt/RttServiceImpl.java
index 3122a94..76cd2d6 100644
--- a/service/java/com/android/server/wifi/rtt/RttServiceImpl.java
+++ b/service/java/com/android/server/wifi/rtt/RttServiceImpl.java
@@ -55,6 +55,7 @@
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.WakeupMessage;
import com.android.modules.utils.BasicShellCommandHandler;
+import com.android.modules.utils.build.SdkLevel;
import com.android.server.wifi.Clock;
import com.android.server.wifi.WifiSettingsConfigStore;
import com.android.server.wifi.proto.nano.WifiMetricsProto;
@@ -1114,16 +1115,16 @@
}
int errorCode = RangingResult.STATUS_FAIL;
- if (!isCalledFromPrivilegedContext) {
- if (!peer.supports80211mc) {
- errorCode = RangingResult.STATUS_RESPONDER_DOES_NOT_SUPPORT_IEEE80211MC;
- }
+
+ if (!SdkLevel.isAtLeastS() && !isCalledFromPrivilegedContext
+ && !peer.supports80211mc) {
+ errorCode = RangingResult.STATUS_RESPONDER_DOES_NOT_SUPPORT_IEEE80211MC;
}
if (peer.peerHandle == null) {
finalResults.add(
new RangingResult(errorCode, peer.macAddress, 0, 0, 0, 0, 0, null,
- null, null, 0));
+ null, null, 0, false));
} else {
finalResults.add(
new RangingResult(errorCode, peer.peerHandle, 0, 0, 0, 0, 0, null,
@@ -1148,32 +1149,32 @@
finalResults.add(new RangingResult(
status,
peer.macAddress,
- resultForRequest.getDistanceMm(),
- resultForRequest.getDistanceStdDevMm(),
- resultForRequest.getRssi(),
- resultForRequest.getNumAttemptedMeasurements(),
- resultForRequest.getNumSuccessfulMeasurements(),
+ resultForRequest.mDistanceMm,
+ resultForRequest.mDistanceStdDevMm,
+ resultForRequest.mRssi,
+ resultForRequest.mNumAttemptedMeasurements,
+ resultForRequest.mNumSuccessfulMeasurements,
lci,
lcr,
responderLocation,
- resultForRequest.getRangingTimestampMillis()));
+ resultForRequest.mTimestamp,
+ resultForRequest.mIs80211mcMeasurement));
} else {
finalResults.add(new RangingResult(
status,
peer.peerHandle,
- resultForRequest.getDistanceMm(),
- resultForRequest.getDistanceStdDevMm(),
- resultForRequest.getRssi(),
- resultForRequest.getNumAttemptedMeasurements(),
- resultForRequest.getNumSuccessfulMeasurements(),
+ resultForRequest.mDistanceMm,
+ resultForRequest.mDistanceStdDevMm,
+ resultForRequest.mRssi,
+ resultForRequest.mNumAttemptedMeasurements,
+ resultForRequest.mNumSuccessfulMeasurements,
lci,
lcr,
responderLocation,
- resultForRequest.getRangingTimestampMillis()));
+ resultForRequest.mTimestamp));
}
}
}
-
return finalResults;
}
diff --git a/service/tests/wifitests/src/com/android/server/wifi/rtt/RttMetricsTest.java b/service/tests/wifitests/src/com/android/server/wifi/rtt/RttMetricsTest.java
index 57cad2b..2c2f892 100644
--- a/service/tests/wifitests/src/com/android/server/wifi/rtt/RttMetricsTest.java
+++ b/service/tests/wifitests/src/com/android/server/wifi/rtt/RttMetricsTest.java
@@ -610,7 +610,7 @@
for (ResponderConfig peer : request.mRttPeers) {
RangingResult rttResult = new RangingResult(status, peer.macAddress,
- (int) (distance * 1000), 0, 0, 8, 8, null, null, null, 0);
+ (int) (distance * 1000), 0, 0, 8, 8, null, null, null, 0, true);
distance += incrDistanceM;
rangingResults.add(rttResult);
}
diff --git a/service/tests/wifitests/src/com/android/server/wifi/rtt/RttNativeTest.java b/service/tests/wifitests/src/com/android/server/wifi/rtt/RttNativeTest.java
index e3b88e6..dafda86 100644
--- a/service/tests/wifitests/src/com/android/server/wifi/rtt/RttNativeTest.java
+++ b/service/tests/wifitests/src/com/android/server/wifi/rtt/RttNativeTest.java
@@ -17,8 +17,6 @@
package com.android.server.wifi.rtt;
-import static junit.framework.Assert.fail;
-
import static org.hamcrest.core.IsEqual.equalTo;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@@ -183,48 +181,6 @@
}
/**
- * Validate ranging request with a mix of Repsonders with and without IEEE 802.11mc support,
- * from a non- privileged context.
- */
- @Test
- public void testRangeRequestNotPrivilegedNo80211mcSupportMixed() throws Exception {
- int cmdId = 66;
-
- // the request has 3 responders: first AP support 802.11mc, second AP does not, third is
- // Aware (which supports 802.11mc by default)
- RangingRequest request = RttTestUtils.getDummyRangingRequest((byte) 0);
-
- // (1) issue range request
- mDut.rangeRequest(cmdId, request, false);
-
- // (2) verify HAL call and parameters
- verify(mockRttController).rangeRequest(eq(cmdId), mRttConfigCaptor.capture());
-
- // verify contents of HAL request (hard codes knowledge from getDummyRangingRequest()).
- ArrayList<RttConfig> halRequest = mRttConfigCaptor.getValue();
-
- collector.checkThat("number of entries", halRequest.size(), equalTo(2));
-
- RttConfig rttConfig = halRequest.get(0);
- collector.checkThat("entry 0: MAC", rttConfig.addr,
- equalTo(MacAddress.fromString("00:01:02:03:04:00").toByteArray()));
- collector.checkThat("entry 0: rtt type", rttConfig.type, equalTo(RttType.TWO_SIDED));
- collector.checkThat("entry 0: peer type", rttConfig.peer, equalTo(RttPeerType.AP));
- collector.checkThat("entry 0: lci", rttConfig.mustRequestLci, equalTo(true));
- collector.checkThat("entry 0: lcr", rttConfig.mustRequestLcr, equalTo(true));
-
- rttConfig = halRequest.get(1);
- collector.checkThat("entry 1: MAC", rttConfig.addr,
- equalTo(MacAddress.fromString("08:09:08:07:06:05").toByteArray()));
- collector.checkThat("entry 1: rtt type", rttConfig.type, equalTo(RttType.TWO_SIDED));
- collector.checkThat("entry 1: peer type", rttConfig.peer, equalTo(RttPeerType.NAN));
- collector.checkThat("entry 1: lci", rttConfig.mustRequestLci, equalTo(false));
- collector.checkThat("entry 1: lcr", rttConfig.mustRequestLcr, equalTo(false));
-
- verifyNoMoreInteractions(mockRttController, mockRttServiceImpl);
- }
-
- /**
* Validate successful ranging flow - with privileges access but with limited capabilities:
* - No single-sided RTT
* - No LCI/LCR
@@ -324,26 +280,6 @@
}
/**
- * Validate ranging request with all Repsonders without IEEE 802.11mc support, from a non-
- * privileged context.
- */
- @Test
- public void testRangeRequestNotPrivilegedNo80211mcSupportForAny() throws Exception {
- int cmdId = 77;
- RangingRequest request = RttTestUtils.getDummyRangingRequestNo80211mcSupport((byte) 0);
-
- // (1) issue range request
- mDut.rangeRequest(cmdId, request, false);
-
- // (2) verify immediate result callback (empty result set)
- verify(mockRttServiceImpl).onRangingResults(eq(cmdId), mRttResultCaptor.capture());
-
- collector.checkThat("Result set", mRttResultCaptor.getValue().size(), equalTo(0));
-
- verifyNoMoreInteractions(mockRttController, mockRttServiceImpl);
- }
-
- /**
* Validate no range request when Wi-Fi is down
*/
@Test
diff --git a/service/tests/wifitests/src/com/android/server/wifi/rtt/RttServiceImplTest.java b/service/tests/wifitests/src/com/android/server/wifi/rtt/RttServiceImplTest.java
index 687c24f..09522a6 100644
--- a/service/tests/wifitests/src/com/android/server/wifi/rtt/RttServiceImplTest.java
+++ b/service/tests/wifitests/src/com/android/server/wifi/rtt/RttServiceImplTest.java
@@ -763,12 +763,12 @@
RangingResult removed = results.second.remove(1);
results.second.add(
new RangingResult(RangingResult.STATUS_FAIL, removed.getMacAddress(), 0, 0, 0, 0, 0,
- null, null, null, 0));
+ null, null, null, 0, false));
results.first.remove(0); // remove an AP request
removed = results.second.remove(0);
results.second.add(
new RangingResult(RangingResult.STATUS_FAIL, removed.getMacAddress(), 0, 0, 0, 0, 0,
- null, null, null, 0));
+ null, null, null, 0, false));
// (1) request ranging operation
mDut.startRanging(mockIbinder, mPackageName, mFeatureId, null, request, mockCallback);
@@ -810,7 +810,7 @@
for (RangingResult result : results.second) {
allFailResults.add(
new RangingResult(RangingResult.STATUS_FAIL, result.getMacAddress(), 0, 0, 0, 0,
- 0, null, null, null, 0));
+ 0, null, null, null, 0, false));
}
// (1) request ranging operation
@@ -841,59 +841,6 @@
}
/**
- * Validate that when the HAL returns results with "missing" entries (i.e. some requests
- * don't get results) AND these correspond to peers which do not support 802.11mc AND the
- * request is from a non-privileged context: they are filled-in with FAILED results.
- */
- @Test
- public void testMissingResultsForNonSupportOf80211mc() throws Exception {
- RangingRequest request = RttTestUtils.getDummyRangingRequest((byte) 0);
- Pair<List<RangingResult>, List<RangingResult>> results =
- RttTestUtils.getDummyRangingResults(request);
- results.first.remove(1); // remove the entry which doesn't support 802.11mc
- RangingResult removed = results.second.remove(1);
- results.second.add(
- new RangingResult(RangingResult.STATUS_RESPONDER_DOES_NOT_SUPPORT_IEEE80211MC,
- removed.getMacAddress(), 0, 0, 0, 0, 0, null, null, null, 0));
- results.first.remove(
- 0); // remove an AP request (i.e. test combo of missing for different reasons)
- removed = results.second.remove(0);
- results.second.add(
- new RangingResult(RangingResult.STATUS_FAIL, removed.getMacAddress(), 0, 0, 0, 0, 0,
- null, null, null, 0));
-
- when(mockContext.checkCallingOrSelfPermission(
- android.Manifest.permission.LOCATION_HARDWARE)).thenReturn(
- PackageManager.PERMISSION_DENIED);
-
- // (1) request ranging operation
- mDut.startRanging(mockIbinder, mPackageName, mFeatureId, null, request, mockCallback);
- mMockLooper.dispatchAll();
-
- // (2) verify that request issued to native
- verify(mockNative).rangeRequest(mIntCaptor.capture(), eq(request), eq(false));
- verifyWakeupSet(true, 0);
-
- // (3) return results with missing entries
- mDut.onRangingResults(mIntCaptor.getValue(), results.second);
- mMockLooper.dispatchAll();
-
- // (5) verify that (full) results dispatched
- verify(mockCallback).onRangingResults(mListCaptor.capture());
- assertTrue(compareListContentsNoOrdering(results.second, mListCaptor.getValue()));
- verifyWakeupCancelled();
-
- // verify metrics
- verify(mockMetrics).recordRequest(eq(mDefaultWs), eq(request));
- verify(mockMetrics).recordResult(eq(request), eq(results.second), anyInt());
- verify(mockMetrics).recordOverallStatus(WifiMetricsProto.WifiRttLog.OVERALL_SUCCESS);
-
- verify(mockNative, atLeastOnce()).isReady();
- verifyNoMoreInteractions(mockNative, mockMetrics, mockCallback,
- mAlarmManager.getAlarmManager());
- }
-
- /**
* Validate that when the HAL times out we fail, clean-up the queue and move to the next
* request.
*/
diff --git a/service/tests/wifitests/src/com/android/server/wifi/rtt/RttTestUtils.java b/service/tests/wifitests/src/com/android/server/wifi/rtt/RttTestUtils.java
index b5147a0..8e503e6 100644
--- a/service/tests/wifitests/src/com/android/server/wifi/rtt/RttTestUtils.java
+++ b/service/tests/wifitests/src/com/android/server/wifi/rtt/RttTestUtils.java
@@ -69,7 +69,7 @@
MacAddress mac1 = MacAddress.fromString("08:09:08:07:06:05");
builder.addAccessPoint(scan1);
- builder.addAccessPoint(scan2);
+ builder.addNon80211mcCapableAccessPoint(scan2);
builder.addWifiAwarePeer(mac1);
// Changing default RTT burst size to a valid, but maximum, value
builder.setRttBurstSize(RangingRequest.getMaxRttBurstSize());
@@ -105,8 +105,8 @@
ScanResult scan2 = new ScanResult();
scan2.BSSID = "0A:0B:0C:0D:0E:" + String.format("%02d", lastMacByte);
- builder.addAccessPoint(scan1);
- builder.addAccessPoint(scan2);
+ builder.addNon80211mcCapableAccessPoint(scan1);
+ builder.addNon80211mcCapableAccessPoint(scan2);
return builder.build();
}
@@ -127,15 +127,15 @@
List<RangingResult> results = new ArrayList<>();
if (request != null) {
- for (ResponderConfig peer: request.mRttPeers) {
+ for (ResponderConfig peer : request.mRttPeers) {
RangingResult rangingResult;
halResults.add(new RangingResult(RangingResult.STATUS_SUCCESS,
peer.macAddress, rangeCmBase, rangeStdDevCmBase, rssiBase,
- 8, 5, null, null, null, rangeTimestampBase));
+ 8, 5, null, null, null, rangeTimestampBase, true));
if (peer.peerHandle == null) {
rangingResult = new RangingResult(RangingResult.STATUS_SUCCESS,
peer.macAddress, rangeCmBase++, rangeStdDevCmBase++, rssiBase++,
- 8, 5, null, null, null, rangeTimestampBase++);
+ 8, 5, null, null, null, rangeTimestampBase++, true);
} else {
rangingResult = new RangingResult(RangingResult.STATUS_SUCCESS,
peer.peerHandle, rangeCmBase++, rangeStdDevCmBase++, rssiBase++,
@@ -148,15 +148,15 @@
results.add(new RangingResult(RangingResult.STATUS_SUCCESS,
MacAddress.fromString("10:01:02:03:04:05"), rangeCmBase++,
rangeStdDevCmBase++, rssiBase++, 8, 4, null, null,
- null, rangeTimestampBase++));
+ null, rangeTimestampBase++, true));
results.add(new RangingResult(RangingResult.STATUS_SUCCESS,
MacAddress.fromString("1A:0B:0C:0D:0E:0F"), rangeCmBase++,
rangeStdDevCmBase++, rssiBase++, 9, 3, null, null,
- null, rangeTimestampBase++));
+ null, rangeTimestampBase++, true));
results.add(new RangingResult(RangingResult.STATUS_SUCCESS,
MacAddress.fromString("08:09:08:07:06:05"), rangeCmBase++,
rangeStdDevCmBase++, rssiBase++, 10, 2, null, null,
- null, rangeTimestampBase++));
+ null, rangeTimestampBase++, true));
halResults.addAll(results);
}