summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHai Shalom <haishalom@google.com>2020-01-30 14:38:34 -0800
committerHai Shalom <haishalom@google.com>2020-02-02 05:11:48 +0000
commitc1ba21c701f8415a0aa7e360611e7a81e79bbbda (patch)
treef6ecac379fb9190bd46f6a72d3666e873124fad3
parentf18e839a744ae97c074c97815ef3afd18c65332f (diff)
[Passpoint] Detect R3 APs
Detect R3 Passpoint APs. Add R3 as a valid information element and modify internal APIs to use the release version. Bug: 148284444 Test: atest ANQPRequestManagerTest PasspointManagerTest Change-Id: Ib164eaec36d360e6ceb18fd432212c277accb32a
-rw-r--r--service/java/com/android/server/wifi/hotspot2/ANQPRequestManager.java10
-rw-r--r--service/java/com/android/server/wifi/hotspot2/NetworkDetail.java1
-rw-r--r--service/java/com/android/server/wifi/hotspot2/PasspointManager.java3
-rw-r--r--service/java/com/android/server/wifi/util/InformationElementUtil.java3
-rw-r--r--tests/wifitests/src/com/android/server/wifi/hotspot2/ANQPRequestManagerTest.java117
-rw-r--r--tests/wifitests/src/com/android/server/wifi/hotspot2/PasspointManagerTest.java31
6 files changed, 119 insertions, 46 deletions
diff --git a/service/java/com/android/server/wifi/hotspot2/ANQPRequestManager.java b/service/java/com/android/server/wifi/hotspot2/ANQPRequestManager.java
index a050b1606..7c5b518be 100644
--- a/service/java/com/android/server/wifi/hotspot2/ANQPRequestManager.java
+++ b/service/java/com/android/server/wifi/hotspot2/ANQPRequestManager.java
@@ -112,19 +112,23 @@ public class ANQPRequestManager {
* @param anqpNetworkKey The unique network key associated with this request
* @param rcOIs Flag indicating the inclusion of roaming consortium OIs. When set to true,
* Roaming Consortium ANQP element will be requested
- * @param hsReleaseR2 Flag indicating the support of Hotspot 2.0 Release 2. When set to true,
+ * @param hsReleaseVer Indicates Hotspot 2.0 Release version. When set to R2 or higher,
* the Release 2 ANQP elements {@link #R2_ANQP_BASE_SET} will be requested
* @return true if a request was sent successfully
*/
public boolean requestANQPElements(long bssid, ANQPNetworkKey anqpNetworkKey, boolean rcOIs,
- boolean hsReleaseR2) {
+ NetworkDetail.HSRelease hsReleaseVer) {
// Check if we are allow to send the request now.
if (!canSendRequestNow(bssid)) {
return false;
}
+ boolean requestHs20Elements = (hsReleaseVer != NetworkDetail.HSRelease.R1
+ && hsReleaseVer != NetworkDetail.HSRelease.Unknown);
+
// No need to hold off future requests for send failures.
- if (!mPasspointHandler.requestANQP(bssid, getRequestElementIDs(rcOIs, hsReleaseR2))) {
+ if (!mPasspointHandler.requestANQP(bssid, getRequestElementIDs(rcOIs,
+ requestHs20Elements))) {
return false;
}
diff --git a/service/java/com/android/server/wifi/hotspot2/NetworkDetail.java b/service/java/com/android/server/wifi/hotspot2/NetworkDetail.java
index 743bc76ac..06fb52591 100644
--- a/service/java/com/android/server/wifi/hotspot2/NetworkDetail.java
+++ b/service/java/com/android/server/wifi/hotspot2/NetworkDetail.java
@@ -49,6 +49,7 @@ public class NetworkDetail {
public enum HSRelease {
R1,
R2,
+ R3,
Unknown
}
diff --git a/service/java/com/android/server/wifi/hotspot2/PasspointManager.java b/service/java/com/android/server/wifi/hotspot2/PasspointManager.java
index 4eac3222e..9caa0ea36 100644
--- a/service/java/com/android/server/wifi/hotspot2/PasspointManager.java
+++ b/service/java/com/android/server/wifi/hotspot2/PasspointManager.java
@@ -667,8 +667,7 @@ public class PasspointManager {
if (anqpEntry == null) {
if (anqpRequestAllowed) {
mAnqpRequestManager.requestANQPElements(bssid, anqpKey,
- roamingConsortium.anqpOICount > 0,
- vsa.hsRelease == NetworkDetail.HSRelease.R2);
+ roamingConsortium.anqpOICount > 0, vsa.hsRelease);
}
Log.d(TAG, "ANQP entry not found for: " + anqpKey);
return allMatches;
diff --git a/service/java/com/android/server/wifi/util/InformationElementUtil.java b/service/java/com/android/server/wifi/util/InformationElementUtil.java
index a00cf3143..1a326fbfd 100644
--- a/service/java/com/android/server/wifi/util/InformationElementUtil.java
+++ b/service/java/com/android/server/wifi/util/InformationElementUtil.java
@@ -770,6 +770,9 @@ public class InformationElementUtil {
case 1:
hsRelease = NetworkDetail.HSRelease.R2;
break;
+ case 2:
+ hsRelease = NetworkDetail.HSRelease.R3;
+ break;
default:
hsRelease = NetworkDetail.HSRelease.Unknown;
break;
diff --git a/tests/wifitests/src/com/android/server/wifi/hotspot2/ANQPRequestManagerTest.java b/tests/wifitests/src/com/android/server/wifi/hotspot2/ANQPRequestManagerTest.java
index bc9d02d31..6559ac448 100644
--- a/tests/wifitests/src/com/android/server/wifi/hotspot2/ANQPRequestManagerTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/hotspot2/ANQPRequestManagerTest.java
@@ -87,8 +87,10 @@ public class ANQPRequestManagerTest extends WifiBaseTest {
Constants.ANQPElementType.HSConnCapability,
Constants.ANQPElementType.HSOSUProviders);
- @Mock PasspointEventHandler mHandler;
- @Mock Clock mClock;
+ @Mock
+ PasspointEventHandler mHandler;
+ @Mock
+ Clock mClock;
ANQPRequestManager mManager;
/**
@@ -110,20 +112,22 @@ public class ANQPRequestManagerTest extends WifiBaseTest {
@Test
public void requestR1ANQPElementsWithoutRC() throws Exception {
when(mHandler.requestANQP(TEST_BSSID, R1_ANQP_WITHOUT_RC)).thenReturn(true);
- assertTrue(mManager.requestANQPElements(TEST_BSSID, TEST_ANQP_KEY, false, false));
+ assertTrue(mManager.requestANQPElements(TEST_BSSID, TEST_ANQP_KEY, false,
+ NetworkDetail.HSRelease.R1));
}
/**
- * Verify that the expected set of ANQP elements are being requested when the targeted AP
- * does provide roaming consortium OIs and doesn't support Hotspot 2.0 Release ANQP elements,
- * based on the IEs in the scan result.
+ * Verify that the expected set of ANQP elements are being requested when the targeted AP does
+ * provide roaming consortium OIs and doesn't support Hotspot 2.0 Release ANQP elements, based
+ * on the IEs in the scan result.
*
* @throws Exception
*/
@Test
public void requestR1ANQPElementsWithRC() throws Exception {
when(mHandler.requestANQP(TEST_BSSID, R1_ANQP_WITH_RC)).thenReturn(true);
- assertTrue(mManager.requestANQPElements(TEST_BSSID, TEST_ANQP_KEY, true, false));
+ assertTrue(mManager.requestANQPElements(TEST_BSSID, TEST_ANQP_KEY, true,
+ NetworkDetail.HSRelease.R1));
}
/**
@@ -136,20 +140,22 @@ public class ANQPRequestManagerTest extends WifiBaseTest {
@Test
public void requestR1R2ANQPElementsWithoutRC() throws Exception {
when(mHandler.requestANQP(TEST_BSSID, R1R2_ANQP_WITHOUT_RC)).thenReturn(true);
- assertTrue(mManager.requestANQPElements(TEST_BSSID, TEST_ANQP_KEY, false, true));
+ assertTrue(mManager.requestANQPElements(TEST_BSSID, TEST_ANQP_KEY, false,
+ NetworkDetail.HSRelease.R2));
}
/**
- * Verify that the expected set of ANQP elements are being requested when the targeted AP
- * does provide roaming consortium OIs and support Hotspot 2.0 Release ANQP elements,
- * based on the IEs in the scan result.
+ * Verify that the expected set of ANQP elements are being requested when the targeted AP does
+ * provide roaming consortium OIs and support Hotspot 2.0 Release ANQP elements, based on the
+ * IEs in the scan result.
*
* @throws Exception
*/
@Test
public void requestR1R2ANQPElementsWithRC() throws Exception {
when(mHandler.requestANQP(TEST_BSSID, R1R2_ANQP_WITH_RC)).thenReturn(true);
- assertTrue(mManager.requestANQPElements(TEST_BSSID, TEST_ANQP_KEY, true, true));
+ assertTrue(mManager.requestANQPElements(TEST_BSSID, TEST_ANQP_KEY, true,
+ NetworkDetail.HSRelease.R2));
}
/**
@@ -164,13 +170,15 @@ public class ANQPRequestManagerTest extends WifiBaseTest {
long startTime = 0;
when(mHandler.requestANQP(TEST_BSSID, R1_ANQP_WITHOUT_RC)).thenReturn(true);
when(mClock.getElapsedSinceBootMillis()).thenReturn(startTime);
- assertTrue(mManager.requestANQPElements(TEST_BSSID, TEST_ANQP_KEY, false, false));
+ assertTrue(mManager.requestANQPElements(TEST_BSSID, TEST_ANQP_KEY, false,
+ NetworkDetail.HSRelease.R1));
reset(mHandler);
// Attempt another request will fail while one is still pending and hold off time is not up
// yet.
when(mClock.getElapsedSinceBootMillis()).thenReturn(startTime + 1);
- assertFalse(mManager.requestANQPElements(TEST_BSSID, TEST_ANQP_KEY, false, false));
+ assertFalse(mManager.requestANQPElements(TEST_BSSID, TEST_ANQP_KEY, false,
+ NetworkDetail.HSRelease.R1));
verify(mHandler, never()).requestANQP(anyLong(), anyObject());
reset(mHandler);
@@ -178,12 +186,13 @@ public class ANQPRequestManagerTest extends WifiBaseTest {
when(mHandler.requestANQP(TEST_BSSID, R1_ANQP_WITHOUT_RC)).thenReturn(true);
when(mClock.getElapsedSinceBootMillis())
.thenReturn(startTime + ANQPRequestManager.BASE_HOLDOFF_TIME_MILLISECONDS);
- assertTrue(mManager.requestANQPElements(TEST_BSSID, TEST_ANQP_KEY, false, false));
+ assertTrue(mManager.requestANQPElements(TEST_BSSID, TEST_ANQP_KEY, false,
+ NetworkDetail.HSRelease.R1));
}
/**
- * Verify that an immediate attempt to request ANQP elements from an AP will succeed when
- * the previous request is failed on sending.
+ * Verify that an immediate attempt to request ANQP elements from an AP will succeed when the
+ * previous request is failed on sending.
*
* @throws Exception
*/
@@ -193,18 +202,20 @@ public class ANQPRequestManagerTest extends WifiBaseTest {
long startTime = 0;
when(mHandler.requestANQP(TEST_BSSID, R1_ANQP_WITHOUT_RC)).thenReturn(false);
when(mClock.getElapsedSinceBootMillis()).thenReturn(startTime);
- assertFalse(mManager.requestANQPElements(TEST_BSSID, TEST_ANQP_KEY, false, false));
+ assertFalse(mManager.requestANQPElements(TEST_BSSID, TEST_ANQP_KEY, false,
+ NetworkDetail.HSRelease.R1));
reset(mHandler);
// Verify that new request is not being held off after previous send failure.
when(mHandler.requestANQP(TEST_BSSID, R1_ANQP_WITHOUT_RC)).thenReturn(true);
when(mClock.getElapsedSinceBootMillis()).thenReturn(startTime);
- assertTrue(mManager.requestANQPElements(TEST_BSSID, TEST_ANQP_KEY, false, false));
+ assertTrue(mManager.requestANQPElements(TEST_BSSID, TEST_ANQP_KEY, false,
+ NetworkDetail.HSRelease.R1));
}
/**
- * Verify that an immediate attempt to request ANQP elements from an AP will succeed when
- * the previous request is completed with success.
+ * Verify that an immediate attempt to request ANQP elements from an AP will succeed when the
+ * previous request is completed with success.
*
* @throws Exception
*/
@@ -214,7 +225,8 @@ public class ANQPRequestManagerTest extends WifiBaseTest {
long startTime = 0;
when(mHandler.requestANQP(TEST_BSSID, R1_ANQP_WITHOUT_RC)).thenReturn(true);
when(mClock.getElapsedSinceBootMillis()).thenReturn(startTime);
- assertTrue(mManager.requestANQPElements(TEST_BSSID, TEST_ANQP_KEY, false, false));
+ assertTrue(mManager.requestANQPElements(TEST_BSSID, TEST_ANQP_KEY, false,
+ NetworkDetail.HSRelease.R1));
reset(mHandler);
// Request completed with success. Verify that the key associated with the request
@@ -223,13 +235,14 @@ public class ANQPRequestManagerTest extends WifiBaseTest {
when(mHandler.requestANQP(TEST_BSSID, R1_ANQP_WITHOUT_RC)).thenReturn(true);
when(mClock.getElapsedSinceBootMillis()).thenReturn(startTime + 1);
- assertTrue(mManager.requestANQPElements(TEST_BSSID, TEST_ANQP_KEY, false, false));
+ assertTrue(mManager.requestANQPElements(TEST_BSSID, TEST_ANQP_KEY, false,
+ NetworkDetail.HSRelease.R1));
}
/**
- * Verify that an immediate attempt to request ANQP elements from an AP will fail when
- * the previous request is completed with failure. The request will succeed after the
- * hold off time is up.
+ * Verify that an immediate attempt to request ANQP elements from an AP will fail when the
+ * previous request is completed with failure. The request will succeed after the hold off time
+ * is up.
*
* @throws Exception
*/
@@ -239,7 +252,8 @@ public class ANQPRequestManagerTest extends WifiBaseTest {
long startTime = 0;
when(mHandler.requestANQP(TEST_BSSID, R1_ANQP_WITHOUT_RC)).thenReturn(true);
when(mClock.getElapsedSinceBootMillis()).thenReturn(startTime);
- assertTrue(mManager.requestANQPElements(TEST_BSSID, TEST_ANQP_KEY, false, false));
+ assertTrue(mManager.requestANQPElements(TEST_BSSID, TEST_ANQP_KEY, false,
+ NetworkDetail.HSRelease.R1));
reset(mHandler);
// Request completed with failure. Verify that the key associated with the request
@@ -248,14 +262,16 @@ public class ANQPRequestManagerTest extends WifiBaseTest {
// Attempt another request will fail since the hold off time is not up yet.
when(mClock.getElapsedSinceBootMillis()).thenReturn(startTime + 1);
- assertFalse(mManager.requestANQPElements(TEST_BSSID, TEST_ANQP_KEY, false, false));
+ assertFalse(mManager.requestANQPElements(TEST_BSSID, TEST_ANQP_KEY, false,
+ NetworkDetail.HSRelease.R1));
verify(mHandler, never()).requestANQP(anyLong(), anyObject());
// Attempt another request will succeed after the hold off time is up.
when(mHandler.requestANQP(TEST_BSSID, R1_ANQP_WITHOUT_RC)).thenReturn(true);
when(mClock.getElapsedSinceBootMillis())
.thenReturn(startTime + ANQPRequestManager.BASE_HOLDOFF_TIME_MILLISECONDS);
- assertTrue(mManager.requestANQPElements(TEST_BSSID, TEST_ANQP_KEY, false, false));
+ assertTrue(mManager.requestANQPElements(TEST_BSSID, TEST_ANQP_KEY, false,
+ NetworkDetail.HSRelease.R1));
}
/**
@@ -271,7 +287,8 @@ public class ANQPRequestManagerTest extends WifiBaseTest {
// Initial request.
when(mHandler.requestANQP(TEST_BSSID, R1_ANQP_WITHOUT_RC)).thenReturn(true);
when(mClock.getElapsedSinceBootMillis()).thenReturn(currentTime);
- assertTrue(mManager.requestANQPElements(TEST_BSSID, TEST_ANQP_KEY, false, false));
+ assertTrue(mManager.requestANQPElements(TEST_BSSID, TEST_ANQP_KEY, false,
+ NetworkDetail.HSRelease.R1));
reset(mHandler);
// Sending the request with the hold off time based on the current hold off count.
@@ -281,14 +298,16 @@ public class ANQPRequestManagerTest extends WifiBaseTest {
// Request will fail before the hold off time is up.
when(mClock.getElapsedSinceBootMillis()).thenReturn(currentTime);
- assertFalse(mManager.requestANQPElements(TEST_BSSID, TEST_ANQP_KEY, false, false));
+ assertFalse(mManager.requestANQPElements(TEST_BSSID, TEST_ANQP_KEY, false,
+ NetworkDetail.HSRelease.R1));
verify(mHandler, never()).requestANQP(anyLong(), anyObject());
// Request will succeed when the hold off time is up.
currentTime += 1;
when(mHandler.requestANQP(TEST_BSSID, R1_ANQP_WITHOUT_RC)).thenReturn(true);
when(mClock.getElapsedSinceBootMillis()).thenReturn(currentTime);
- assertTrue(mManager.requestANQPElements(TEST_BSSID, TEST_ANQP_KEY, false, false));
+ assertTrue(mManager.requestANQPElements(TEST_BSSID, TEST_ANQP_KEY, false,
+ NetworkDetail.HSRelease.R1));
reset(mHandler);
}
@@ -297,13 +316,43 @@ public class ANQPRequestManagerTest extends WifiBaseTest {
* (1 << ANQPRequestManager.MAX_HOLDOFF_COUNT) - 1);
when(mClock.getElapsedSinceBootMillis()).thenReturn(currentTime);
- assertFalse(mManager.requestANQPElements(TEST_BSSID, TEST_ANQP_KEY, false, false));
+ assertFalse(mManager.requestANQPElements(TEST_BSSID, TEST_ANQP_KEY, false,
+ NetworkDetail.HSRelease.R1));
verify(mHandler, never()).requestANQP(anyLong(), anyObject());
currentTime += 1;
when(mHandler.requestANQP(TEST_BSSID, R1_ANQP_WITHOUT_RC)).thenReturn(true);
when(mClock.getElapsedSinceBootMillis()).thenReturn(currentTime);
- assertTrue(mManager.requestANQPElements(TEST_BSSID, TEST_ANQP_KEY, false, false));
+ assertTrue(mManager.requestANQPElements(TEST_BSSID, TEST_ANQP_KEY, false,
+ NetworkDetail.HSRelease.R1));
reset(mHandler);
}
+
+ /**
+ * Verify that the expected set of ANQP elements are being requested when the targeted AP
+ * doesn't provide roaming consortium OIs and does support Hotspot 2.0 Release 3 ANQP elements,
+ * based on the IEs in the scan result.
+ *
+ * @throws Exception
+ */
+ @Test
+ public void requestR1R2ANQPElementsWithoutRCForR3() throws Exception {
+ when(mHandler.requestANQP(TEST_BSSID, R1R2_ANQP_WITHOUT_RC)).thenReturn(true);
+ assertTrue(mManager.requestANQPElements(TEST_BSSID, TEST_ANQP_KEY, false,
+ NetworkDetail.HSRelease.R3));
+ }
+
+ /**
+ * Verify that the expected set of ANQP elements are being requested when the targeted AP does
+ * provide roaming consortium OIs and support Hotspot 2.0 Release 3 ANQP elements, based on the
+ * IEs in the scan result.
+ *
+ * @throws Exception
+ */
+ @Test
+ public void requestR1R2ANQPElementsWithRCForR3() throws Exception {
+ when(mHandler.requestANQP(TEST_BSSID, R1R2_ANQP_WITH_RC)).thenReturn(true);
+ assertTrue(mManager.requestANQPElements(TEST_BSSID, TEST_ANQP_KEY, true,
+ NetworkDetail.HSRelease.R3));
+ }
}
diff --git a/tests/wifitests/src/com/android/server/wifi/hotspot2/PasspointManagerTest.java b/tests/wifitests/src/com/android/server/wifi/hotspot2/PasspointManagerTest.java
index cc4b3dc93..257453f82 100644
--- a/tests/wifitests/src/com/android/server/wifi/hotspot2/PasspointManagerTest.java
+++ b/tests/wifitests/src/com/android/server/wifi/hotspot2/PasspointManagerTest.java
@@ -943,13 +943,30 @@ public class PasspointManagerTest extends WifiBaseTest {
*/
@Test
public void matchProviderWithAnqpCacheMissed() throws Exception {
- addTestProvider(TEST_FQDN, TEST_FRIENDLY_NAME, TEST_PACKAGE, false);
+ // static mocking
+ MockitoSession session =
+ com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession().mockStatic(
+ InformationElementUtil.class).startMocking();
+ try {
+ addTestProvider(TEST_FQDN, TEST_FRIENDLY_NAME, TEST_PACKAGE, false);
- when(mAnqpCache.getEntry(TEST_ANQP_KEY)).thenReturn(null);
- assertTrue(mManager.matchProvider(createTestScanResult()).isEmpty());
- // Verify that a request for ANQP elements is initiated.
- verify(mAnqpRequestManager).requestANQPElements(eq(TEST_BSSID), any(ANQPNetworkKey.class),
- anyBoolean(), anyBoolean());
+ when(mAnqpCache.getEntry(TEST_ANQP_KEY)).thenReturn(null);
+ InformationElementUtil.Vsa vsa = new InformationElementUtil.Vsa();
+ vsa.hsRelease = NetworkDetail.HSRelease.R1;
+ when(InformationElementUtil.getHS2VendorSpecificIE(isNull())).thenReturn(vsa);
+ InformationElementUtil.RoamingConsortium roamingConsortium =
+ new InformationElementUtil.RoamingConsortium();
+ roamingConsortium.anqpOICount = 0;
+ when(InformationElementUtil.getRoamingConsortiumIE(isNull()))
+ .thenReturn(roamingConsortium);
+ assertTrue(mManager.matchProvider(createTestScanResult()).isEmpty());
+ // Verify that a request for ANQP elements is initiated.
+ verify(mAnqpRequestManager).requestANQPElements(eq(TEST_BSSID),
+ any(ANQPNetworkKey.class),
+ anyBoolean(), any(NetworkDetail.HSRelease.class));
+ } finally {
+ session.finishMocking();
+ }
}
/**
@@ -2373,6 +2390,6 @@ public class PasspointManagerTest extends WifiBaseTest {
reset(mWifiConfigManager);
when(mAnqpCache.getEntry(TEST_ANQP_KEY2)).thenReturn(null);
verify(mAnqpRequestManager, never()).requestANQPElements(any(long.class),
- any(ANQPNetworkKey.class), any(boolean.class), any(boolean.class));
+ any(ANQPNetworkKey.class), any(boolean.class), any(NetworkDetail.HSRelease.class));
}
}