diff options
author | Hai Shalom <haishalom@google.com> | 2020-01-30 14:38:34 -0800 |
---|---|---|
committer | Hai Shalom <haishalom@google.com> | 2020-02-02 05:11:48 +0000 |
commit | c1ba21c701f8415a0aa7e360611e7a81e79bbbda (patch) | |
tree | f6ecac379fb9190bd46f6a72d3666e873124fad3 | |
parent | f18e839a744ae97c074c97815ef3afd18c65332f (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
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)); } } |