133c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu/* 233c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * Copyright (C) 2016 The Android Open Source Project 333c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * 433c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * Licensed under the Apache License, Version 2.0 (the "License"); 533c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * you may not use this file except in compliance with the License. 633c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * You may obtain a copy of the License at 733c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * 833c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * http://www.apache.org/licenses/LICENSE-2.0 933c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * 1033c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * Unless required by applicable law or agreed to in writing, software 1133c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * distributed under the License is distributed on an "AS IS" BASIS, 1233c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1333c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * See the License for the specific language governing permissions and 1433c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * limitations under the License. 1533c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu */ 1633c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu 1733c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiupackage com.android.server.wifi.hotspot2; 1833c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu 1933c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiuimport android.util.Log; 2033c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu 2133c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiuimport com.android.internal.annotations.VisibleForTesting; 2233c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiuimport com.android.server.wifi.Clock; 2333c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiuimport com.android.server.wifi.hotspot2.anqp.Constants; 2433c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu 2533c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiuimport java.util.ArrayList; 2633c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiuimport java.util.Arrays; 2733c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiuimport java.util.HashMap; 2833c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiuimport java.util.List; 2933c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiuimport java.util.Map; 3033c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu 3133c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu/** 3233c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * Class for managing sending of ANQP requests. This manager will ignore ANQP requests for a 3333c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * period of time (hold off time) to a specified AP if the previous request to that AP goes 3433c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * unanswered or failed. The hold off time will increase exponentially until the max is reached. 3533c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu */ 3633c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiupublic class ANQPRequestManager { 3733c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu private static final String TAG = "ANQPRequestManager"; 3833c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu 3933c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu private final PasspointEventHandler mPasspointHandler; 4033c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu private final Clock mClock; 4133c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu 4233c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu /** 4333c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * List of pending ANQP request associated with an AP (BSSID). 4433c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu */ 45ec28f863c5e46c0a75e8bdb92283304b875ee0f2Peter Qiu private final Map<Long, ANQPNetworkKey> mPendingQueries; 4633c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu 4733c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu /** 4833c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * List of hold off time information associated with APs specified by their BSSID. 4933c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * Used to determine when an ANQP request can be send to the corresponding AP after the 5033c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * previous request goes unanswered or failed. 5133c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu */ 5233c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu private final Map<Long, HoldOffInfo> mHoldOffInfo; 5333c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu 5433c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu /** 5533c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * Minimum number of milliseconds to wait for before attempting ANQP queries to the same AP 5633c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * after previous request goes unanswered or failed. 5733c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu */ 5833c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu @VisibleForTesting 5933c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu public static final int BASE_HOLDOFF_TIME_MILLISECONDS = 10000; 6033c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu 6133c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu /** 6233c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * Max value for the hold off counter for unanswered/failed queries. This limits the maximum 6333c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * hold off time to: 6433c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * BASE_HOLDOFF_TIME_MILLISECONDS * 2^MAX_HOLDOFF_COUNT 6533c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * which is 640 seconds. 6633c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu */ 6733c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu @VisibleForTesting 6833c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu public static final int MAX_HOLDOFF_COUNT = 6; 6933c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu 7033c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu private static final List<Constants.ANQPElementType> R1_ANQP_BASE_SET = Arrays.asList( 7133c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu Constants.ANQPElementType.ANQPVenueName, 7233c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu Constants.ANQPElementType.ANQPIPAddrAvailability, 7333c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu Constants.ANQPElementType.ANQPNAIRealm, 7433c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu Constants.ANQPElementType.ANQP3GPPNetwork, 7533c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu Constants.ANQPElementType.ANQPDomName); 7633c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu 7733c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu private static final List<Constants.ANQPElementType> R2_ANQP_BASE_SET = Arrays.asList( 7833c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu Constants.ANQPElementType.HSFriendlyName, 7933c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu Constants.ANQPElementType.HSWANMetrics, 80e8fd83b34e2d7e7ac275fef0baa1f33b9982a0b1Peter Qiu Constants.ANQPElementType.HSConnCapability, 81e8fd83b34e2d7e7ac275fef0baa1f33b9982a0b1Peter Qiu Constants.ANQPElementType.HSOSUProviders); 8233c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu 8333c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu /** 8433c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * Class to keep track of AP status for ANQP requests. 8533c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu */ 8633c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu private class HoldOffInfo { 8733c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu /** 8833c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * Current hold off count. Will max out at {@link #MAX_HOLDOFF_COUNT}. 8933c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu */ 9033c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu public int holdOffCount; 9133c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu /** 9233c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * The time stamp in milliseconds when we're allow to send ANQP request to the 9333c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * corresponding AP. 9433c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu */ 9533c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu public long holdOffExpirationTime; 9633c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu } 9733c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu 9833c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu public ANQPRequestManager(PasspointEventHandler handler, Clock clock) { 9933c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu mPasspointHandler = handler; 10033c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu mClock = clock; 10133c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu mPendingQueries = new HashMap<>(); 10233c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu mHoldOffInfo = new HashMap<>(); 10333c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu } 10433c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu 10533c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu /** 10633c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * Request ANQP elements from the specified AP. This will request the basic Release 1 ANQP 10733c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * elements {@link #R1_ANQP_BASE_SET}. Additional elements will be requested based on the 10833c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * information provided in the Information Element (Roaming Consortium OI count and the 10933c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * supported Hotspot 2.0 release version). 11033c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * 11133c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * @param bssid The BSSID of the AP 112ec28f863c5e46c0a75e8bdb92283304b875ee0f2Peter Qiu * @param anqpNetworkKey The unique network key associated with this request 11333c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * @param rcOIs Flag indicating the inclusion of roaming consortium OIs. When set to true, 11433c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * Roaming Consortium ANQP element will be requested 11533c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * @param hsReleaseR2 Flag indicating the support of Hotspot 2.0 Release 2. When set to true, 11633c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * the Release 2 ANQP elements {@link #R2_ANQP_BASE_SET} will be requested 11733c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * @return true if a request was sent successfully 11833c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu */ 119ec28f863c5e46c0a75e8bdb92283304b875ee0f2Peter Qiu public boolean requestANQPElements(long bssid, ANQPNetworkKey anqpNetworkKey, boolean rcOIs, 12033c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu boolean hsReleaseR2) { 12133c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu // Check if we are allow to send the request now. 12233c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu if (!canSendRequestNow(bssid)) { 12333c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu return false; 12433c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu } 12533c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu 12633c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu // No need to hold off future requests for send failures. 12733c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu if (!mPasspointHandler.requestANQP(bssid, getRequestElementIDs(rcOIs, hsReleaseR2))) { 12833c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu return false; 12933c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu } 13033c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu 13133c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu // Update hold off info on when we are allowed to send the next ANQP request to 13233c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu // the given AP. 13333c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu updateHoldOffInfo(bssid); 13433c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu 135ec28f863c5e46c0a75e8bdb92283304b875ee0f2Peter Qiu mPendingQueries.put(bssid, anqpNetworkKey); 13633c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu return true; 13733c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu } 13833c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu 13933c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu /** 14033c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * Notification of the completion of an ANQP request. 14133c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * 14233c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * @param bssid The BSSID of the AP 14333c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * @param success Flag indicating the result of the query 144ec28f863c5e46c0a75e8bdb92283304b875ee0f2Peter Qiu * @return {@link ANQPNetworkKey} associated with the completed request 14533c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu */ 146ec28f863c5e46c0a75e8bdb92283304b875ee0f2Peter Qiu public ANQPNetworkKey onRequestCompleted(long bssid, boolean success) { 14733c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu if (success) { 14833c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu // Query succeeded. No need to hold off request to the given AP. 14933c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu mHoldOffInfo.remove(bssid); 15033c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu } 15133c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu return mPendingQueries.remove(bssid); 15233c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu } 15333c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu 15433c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu /** 15533c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * Check if we are allowed to send ANQP request to the specified AP now. 15633c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * 15733c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * @param bssid The BSSID of an AP 15833c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * @return true if we are allowed to send the request now 15933c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu */ 16033c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu private boolean canSendRequestNow(long bssid) { 16133c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu long currentTime = mClock.getElapsedSinceBootMillis(); 16233c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu HoldOffInfo info = mHoldOffInfo.get(bssid); 16333c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu if (info != null && info.holdOffExpirationTime > currentTime) { 16433c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu Log.d(TAG, "Not allowed to send ANQP request to " + bssid + " for another " 16533c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu + (info.holdOffExpirationTime - currentTime) / 1000 + " seconds"); 16633c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu return false; 16733c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu } 16833c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu 16933c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu return true; 17033c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu } 17133c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu 17233c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu /** 17333c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * Update the ANQP request hold off info associated with the given AP. 17433c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * 17533c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * @param bssid The BSSID of an AP 17633c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu */ 17733c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu private void updateHoldOffInfo(long bssid) { 17833c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu HoldOffInfo info = mHoldOffInfo.get(bssid); 17933c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu if (info == null) { 18033c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu info = new HoldOffInfo(); 18133c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu mHoldOffInfo.put(bssid, info); 18233c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu } 18333c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu info.holdOffExpirationTime = mClock.getElapsedSinceBootMillis() 18433c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu + BASE_HOLDOFF_TIME_MILLISECONDS * (1 << info.holdOffCount); 18533c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu if (info.holdOffCount < MAX_HOLDOFF_COUNT) { 18633c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu info.holdOffCount++; 18733c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu } 18833c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu } 18933c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu 19033c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu /** 19133c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * Get the list of ANQP element IDs to request based on the Hotspot 2.0 release number 19233c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * and the ANQP OI count indicated in the Information Element. 19333c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * 19433c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * @param rcOIs Flag indicating the inclusion of roaming consortium OIs 19533c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * @param hsReleaseR2 Flag indicating support of Hotspot 2.0 Release 2 19633c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu * @return List of ANQP Element ID 19733c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu */ 19833c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu private static List<Constants.ANQPElementType> getRequestElementIDs(boolean rcOIs, 19933c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu boolean hsReleaseR2) { 20033c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu List<Constants.ANQPElementType> requestList = new ArrayList<>(); 20133c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu requestList.addAll(R1_ANQP_BASE_SET); 20233c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu if (rcOIs) { 20333c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu requestList.add(Constants.ANQPElementType.ANQPRoamingConsortium); 20433c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu } 20533c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu 20633c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu if (hsReleaseR2) { 20733c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu requestList.addAll(R2_ANQP_BASE_SET); 20833c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu } 20933c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu return requestList; 21033c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu } 21133c46cd7132df4ce72eee0ed2783e1a1e15bc007Peter Qiu} 212