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