| /* |
| * Copyright (C) 2021 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.server.wifi; |
| |
| import static com.android.server.wifi.hotspot2.anqp.Constants.ANQPElementType.ANQP3GPPNetwork; |
| import static com.android.server.wifi.hotspot2.anqp.Constants.ANQPElementType.ANQPDomName; |
| import static com.android.server.wifi.hotspot2.anqp.Constants.ANQPElementType.ANQPIPAddrAvailability; |
| import static com.android.server.wifi.hotspot2.anqp.Constants.ANQPElementType.ANQPNAIRealm; |
| import static com.android.server.wifi.hotspot2.anqp.Constants.ANQPElementType.ANQPRoamingConsortium; |
| import static com.android.server.wifi.hotspot2.anqp.Constants.ANQPElementType.ANQPVenueName; |
| import static com.android.server.wifi.hotspot2.anqp.Constants.ANQPElementType.ANQPVenueUrl; |
| import static com.android.server.wifi.hotspot2.anqp.Constants.ANQPElementType.HSConnCapability; |
| import static com.android.server.wifi.hotspot2.anqp.Constants.ANQPElementType.HSFriendlyName; |
| import static com.android.server.wifi.hotspot2.anqp.Constants.ANQPElementType.HSOSUProviders; |
| import static com.android.server.wifi.hotspot2.anqp.Constants.ANQPElementType.HSWANMetrics; |
| |
| import android.annotation.NonNull; |
| import android.content.Context; |
| import android.hardware.wifi.supplicant.AnqpData; |
| import android.hardware.wifi.supplicant.AssociationRejectionData; |
| import android.hardware.wifi.supplicant.AuxiliarySupplicantEventCode; |
| import android.hardware.wifi.supplicant.BssTmData; |
| import android.hardware.wifi.supplicant.BssTmDataFlagsMask; |
| import android.hardware.wifi.supplicant.BssTmStatusCode; |
| import android.hardware.wifi.supplicant.BssidChangeReason; |
| import android.hardware.wifi.supplicant.DppAkm; |
| import android.hardware.wifi.supplicant.DppConnectionKeys; |
| import android.hardware.wifi.supplicant.DppEventType; |
| import android.hardware.wifi.supplicant.DppFailureCode; |
| import android.hardware.wifi.supplicant.DppProgressCode; |
| import android.hardware.wifi.supplicant.Hs20AnqpData; |
| import android.hardware.wifi.supplicant.ISupplicantStaIfaceCallback; |
| import android.hardware.wifi.supplicant.MboAssocDisallowedReasonCode; |
| import android.hardware.wifi.supplicant.MboCellularDataConnectionPrefValue; |
| import android.hardware.wifi.supplicant.MboTransitionReasonCode; |
| import android.hardware.wifi.supplicant.QosPolicyData; |
| import android.hardware.wifi.supplicant.StaIfaceCallbackState; |
| import android.hardware.wifi.supplicant.StaIfaceReasonCode; |
| import android.hardware.wifi.supplicant.StaIfaceStatusCode; |
| import android.hardware.wifi.supplicant.WpsConfigError; |
| import android.hardware.wifi.supplicant.WpsErrorIndication; |
| import android.net.MacAddress; |
| import android.net.wifi.SecurityParams; |
| import android.net.wifi.SupplicantState; |
| import android.net.wifi.WifiConfiguration; |
| import android.net.wifi.WifiManager; |
| import android.net.wifi.WifiSsid; |
| import android.os.Process; |
| import android.util.Log; |
| |
| import com.android.server.wifi.SupplicantStaIfaceHal.QosPolicyRequest; |
| import com.android.server.wifi.SupplicantStaIfaceHal.SupplicantEventCode; |
| import com.android.server.wifi.hotspot2.AnqpEvent; |
| import com.android.server.wifi.hotspot2.IconEvent; |
| import com.android.server.wifi.hotspot2.WnmData; |
| import com.android.server.wifi.hotspot2.anqp.ANQPElement; |
| import com.android.server.wifi.hotspot2.anqp.ANQPParser; |
| import com.android.server.wifi.hotspot2.anqp.Constants; |
| import com.android.server.wifi.util.NativeUtil; |
| |
| import java.io.IOException; |
| import java.nio.BufferUnderflowException; |
| import java.nio.ByteBuffer; |
| import java.util.ArrayList; |
| import java.util.Arrays; |
| import java.util.HashMap; |
| import java.util.List; |
| import java.util.Map; |
| |
| class SupplicantStaIfaceCallbackAidlImpl extends ISupplicantStaIfaceCallback.Stub { |
| private static final String TAG = "SupplicantStaIfaceCallbackAidlImpl"; |
| private final SupplicantStaIfaceHalAidlImpl mStaIfaceHal; |
| private final String mIfaceName; |
| private final Context mContext; |
| private final WifiMonitor mWifiMonitor; |
| private final Object mLock; |
| // Used to help check for PSK password mismatch & EAP connection failure. |
| private int mStateBeforeDisconnect = StaIfaceCallbackState.INACTIVE; |
| private String mCurrentSsid = null; |
| |
| SupplicantStaIfaceCallbackAidlImpl(@NonNull SupplicantStaIfaceHalAidlImpl staIfaceHal, |
| @NonNull String ifaceName, @NonNull Object lock, |
| @NonNull Context context, @NonNull WifiMonitor wifiMonitor) { |
| mStaIfaceHal = staIfaceHal; |
| mIfaceName = ifaceName; |
| mLock = lock; |
| mContext = context; |
| mWifiMonitor = wifiMonitor; |
| } |
| |
| @Override |
| public void onNetworkAdded(int id) { |
| synchronized (mLock) { |
| mStaIfaceHal.logCallback("onNetworkAdded id=" + id); |
| } |
| } |
| |
| @Override |
| public void onNetworkRemoved(int id) { |
| synchronized (mLock) { |
| mStaIfaceHal.logCallback("onNetworkRemoved id=" + id); |
| // Reset state since network has been removed. |
| mStateBeforeDisconnect = StaIfaceCallbackState.INACTIVE; |
| } |
| } |
| |
| /** |
| * Converts the supplicant state received from AIDL to the equivalent framework state. |
| */ |
| protected static SupplicantState supplicantAidlStateToFrameworkState(int state) { |
| switch (state) { |
| case StaIfaceCallbackState.DISCONNECTED: |
| return SupplicantState.DISCONNECTED; |
| case StaIfaceCallbackState.IFACE_DISABLED: |
| return SupplicantState.INTERFACE_DISABLED; |
| case StaIfaceCallbackState.INACTIVE: |
| return SupplicantState.INACTIVE; |
| case StaIfaceCallbackState.SCANNING: |
| return SupplicantState.SCANNING; |
| case StaIfaceCallbackState.AUTHENTICATING: |
| return SupplicantState.AUTHENTICATING; |
| case StaIfaceCallbackState.ASSOCIATING: |
| return SupplicantState.ASSOCIATING; |
| case StaIfaceCallbackState.ASSOCIATED: |
| return SupplicantState.ASSOCIATED; |
| case StaIfaceCallbackState.FOURWAY_HANDSHAKE: |
| return SupplicantState.FOUR_WAY_HANDSHAKE; |
| case StaIfaceCallbackState.GROUP_HANDSHAKE: |
| return SupplicantState.GROUP_HANDSHAKE; |
| case StaIfaceCallbackState.COMPLETED: |
| return SupplicantState.COMPLETED; |
| default: |
| throw new IllegalArgumentException("Invalid state: " + state); |
| } |
| } |
| |
| @Override |
| public void onStateChanged(int newState, byte[/* 6 */] bssid, int id, |
| byte[] ssid, boolean filsHlpSent) { |
| synchronized (mLock) { |
| mStaIfaceHal.logCallback("onStateChanged"); |
| SupplicantState newSupplicantState = |
| supplicantAidlStateToFrameworkState(newState); |
| WifiSsid wifiSsid = WifiSsid.fromBytes(ssid); |
| String bssidStr = NativeUtil.macAddressFromByteArray(bssid); |
| if (newState != StaIfaceCallbackState.DISCONNECTED) { |
| // onStateChanged(DISCONNECTED) may come before onDisconnected(), so add this |
| // cache to track the state before the disconnect. |
| mStateBeforeDisconnect = newState; |
| } |
| |
| if (newState == StaIfaceCallbackState.ASSOCIATING |
| || newState == StaIfaceCallbackState.ASSOCIATED |
| || newState == StaIfaceCallbackState.COMPLETED) { |
| mStaIfaceHal.updateOnLinkedNetworkRoaming(mIfaceName, id, false); |
| } |
| |
| if (newState == StaIfaceCallbackState.COMPLETED) { |
| mWifiMonitor.broadcastNetworkConnectionEvent( |
| mIfaceName, mStaIfaceHal.getCurrentNetworkId(mIfaceName), filsHlpSent, |
| wifiSsid, bssidStr); |
| } else if (newState == StaIfaceCallbackState.ASSOCIATING) { |
| mCurrentSsid = NativeUtil.encodeSsid(NativeUtil.byteArrayToArrayList(ssid)); |
| } |
| mWifiMonitor.broadcastSupplicantStateChangeEvent( |
| mIfaceName, mStaIfaceHal.getCurrentNetworkId(mIfaceName), wifiSsid, |
| bssidStr, newSupplicantState); |
| } |
| } |
| |
| /** |
| * Parses the provided payload into an ANQP element. |
| * |
| * @param infoID Element type. |
| * @param payload Raw payload bytes. |
| * @return AnqpElement instance on success, null on failure. |
| */ |
| private ANQPElement parseAnqpElement(Constants.ANQPElementType infoID, byte[] payload) { |
| synchronized (mLock) { |
| try { |
| return Constants.getANQPElementID(infoID) != null |
| ? ANQPParser.parseElement(infoID, ByteBuffer.wrap(payload)) |
| : ANQPParser.parseHS20Element(infoID, ByteBuffer.wrap(payload)); |
| } catch (IOException | BufferUnderflowException e) { |
| Log.e(TAG, "Failed parsing ANQP element payload: " + infoID, e); |
| return null; |
| } |
| } |
| } |
| |
| /** |
| * Parse the ANQP element data and add to the provided elements map if successful. |
| * |
| * @param elementsMap Map to add the parsed out element to. |
| * @param infoID Element type. |
| * @param payload Raw payload bytes. |
| */ |
| private void addAnqpElementToMap(Map<Constants.ANQPElementType, ANQPElement> elementsMap, |
| Constants.ANQPElementType infoID, byte[] payload) { |
| synchronized (mLock) { |
| if (payload == null || payload.length == 0) { |
| return; |
| } |
| ANQPElement element = parseAnqpElement(infoID, payload); |
| if (element != null) { |
| elementsMap.put(infoID, element); |
| } |
| } |
| } |
| |
| @Override |
| public void onAnqpQueryDone(byte[/* 6 */] bssid, AnqpData data, Hs20AnqpData hs20Data) { |
| synchronized (mLock) { |
| mStaIfaceHal.logCallback("onAnqpQueryDone"); |
| Map<Constants.ANQPElementType, ANQPElement> elementsMap = new HashMap<>(); |
| addAnqpElementToMap(elementsMap, ANQPVenueName, data.venueName); |
| addAnqpElementToMap(elementsMap, ANQPRoamingConsortium, data.roamingConsortium); |
| addAnqpElementToMap(elementsMap, ANQPIPAddrAvailability, data.ipAddrTypeAvailability); |
| addAnqpElementToMap(elementsMap, ANQPNAIRealm, data.naiRealm); |
| addAnqpElementToMap(elementsMap, ANQP3GPPNetwork, data.anqp3gppCellularNetwork); |
| addAnqpElementToMap(elementsMap, ANQPDomName, data.domainName); |
| addAnqpElementToMap(elementsMap, ANQPVenueUrl, data.venueUrl); |
| addAnqpElementToMap(elementsMap, HSFriendlyName, hs20Data.operatorFriendlyName); |
| addAnqpElementToMap(elementsMap, HSWANMetrics, hs20Data.wanMetrics); |
| addAnqpElementToMap(elementsMap, HSConnCapability, hs20Data.connectionCapability); |
| addAnqpElementToMap(elementsMap, HSOSUProviders, hs20Data.osuProvidersList); |
| mWifiMonitor.broadcastAnqpDoneEvent( |
| mIfaceName, new AnqpEvent(NativeUtil.macAddressToLong(bssid), elementsMap)); |
| } |
| } |
| |
| @Override |
| public void onHs20IconQueryDone(byte[/* 6 */] bssid, String fileName, byte[] data) { |
| synchronized (mLock) { |
| mStaIfaceHal.logCallback("onHs20IconQueryDone"); |
| mWifiMonitor.broadcastIconDoneEvent( |
| mIfaceName, |
| new IconEvent(NativeUtil.macAddressToLong(bssid), fileName, data.length, data)); |
| } |
| } |
| |
| @Override |
| public void onHs20SubscriptionRemediation(byte[/* 6 */] bssid, byte osuMethod, String url) { |
| synchronized (mLock) { |
| mStaIfaceHal.logCallback("onHs20SubscriptionRemediation"); |
| mWifiMonitor.broadcastWnmEvent( |
| mIfaceName, |
| WnmData.createRemediationEvent(NativeUtil.macAddressToLong(bssid), url, |
| osuMethod)); |
| } |
| } |
| |
| @Override |
| public void onHs20DeauthImminentNotice(byte[/* 6 */] bssid, int reasonCode, |
| int reAuthDelayInSec, String url) { |
| synchronized (mLock) { |
| mStaIfaceHal.logCallback("onHs20DeauthImminentNotice"); |
| mWifiMonitor.broadcastWnmEvent( |
| mIfaceName, |
| WnmData.createDeauthImminentEvent(NativeUtil.macAddressToLong(bssid), url, |
| reasonCode == WnmData.ESS, reAuthDelayInSec)); |
| } |
| } |
| |
| @Override |
| public void onDisconnected(byte[/* 6 */] bssid, boolean locallyGenerated, int reasonCode) { |
| synchronized (mLock) { |
| mStaIfaceHal.logCallback("onDisconnected"); |
| if (mStaIfaceHal.isVerboseLoggingEnabled()) { |
| Log.e(TAG, "onDisconnected state=" + mStateBeforeDisconnect |
| + " locallyGenerated=" + locallyGenerated |
| + " reasonCode=" + reasonCode); |
| } |
| WifiConfiguration curConfiguration = |
| mStaIfaceHal.getCurrentNetworkLocalConfig(mIfaceName); |
| if (curConfiguration != null) { |
| if (mStateBeforeDisconnect == StaIfaceCallbackState.FOURWAY_HANDSHAKE |
| && WifiConfigurationUtil.isConfigForPskNetwork(curConfiguration) |
| && (!locallyGenerated || reasonCode |
| != StaIfaceReasonCode.IE_IN_4WAY_DIFFERS)) { |
| mWifiMonitor.broadcastAuthenticationFailureEvent( |
| mIfaceName, WifiManager.ERROR_AUTH_FAILURE_WRONG_PSWD, -1, |
| mCurrentSsid, MacAddress.fromBytes(bssid)); |
| } else if (mStateBeforeDisconnect == StaIfaceCallbackState.ASSOCIATED |
| && WifiConfigurationUtil.isConfigForEapNetwork(curConfiguration)) { |
| mWifiMonitor.broadcastAuthenticationFailureEvent( |
| mIfaceName, WifiManager.ERROR_AUTH_FAILURE_EAP_FAILURE, -1, |
| mCurrentSsid, MacAddress.fromBytes(bssid)); |
| } |
| } |
| mWifiMonitor.broadcastNetworkDisconnectionEvent( |
| mIfaceName, locallyGenerated, halToFrameworkReasonCode(reasonCode), |
| mCurrentSsid, NativeUtil.macAddressFromByteArray(bssid)); |
| } |
| } |
| |
| private void handleAssocRejectEvent(AssocRejectEventInfo assocRejectInfo) { |
| boolean isWrongPwd = false; |
| WifiConfiguration curConfiguration = mStaIfaceHal.getCurrentNetworkLocalConfig(mIfaceName); |
| if (curConfiguration != null) { |
| if (!assocRejectInfo.timedOut) { |
| Log.d(TAG, "flush PMK cache due to association rejection for config id " |
| + curConfiguration.networkId + "."); |
| mStaIfaceHal.removePmkCacheEntry(curConfiguration.networkId); |
| } |
| // Special handling for WPA3-Personal networks. If the password is |
| // incorrect, the AP will send association rejection, with status code 1 |
| // (unspecified failure). In SAE networks, the password authentication |
| // is not related to the 4-way handshake. In this case, we will send an |
| // authentication failure event up. |
| if (assocRejectInfo.statusCode |
| == SupplicantStaIfaceHal.StaIfaceStatusCode.UNSPECIFIED_FAILURE) { |
| // Network Selection status is guaranteed to be initialized |
| SecurityParams params = curConfiguration.getNetworkSelectionStatus() |
| .getCandidateSecurityParams(); |
| if (params != null |
| && params.getSecurityType() == WifiConfiguration.SECURITY_TYPE_SAE) { |
| // If this is ever connected, the password should be correct. |
| isWrongPwd = !curConfiguration.getNetworkSelectionStatus().hasEverConnected(); |
| if (isWrongPwd) { |
| mStaIfaceHal.logCallback("SAE incorrect password"); |
| } else { |
| mStaIfaceHal.logCallback("SAE association rejection"); |
| } |
| } |
| } else if (assocRejectInfo.statusCode |
| == SupplicantStaIfaceHal.StaIfaceStatusCode.CHALLENGE_FAIL |
| && WifiConfigurationUtil.isConfigForWepNetwork(curConfiguration)) { |
| mStaIfaceHal.logCallback("WEP incorrect password"); |
| isWrongPwd = true; |
| } |
| } |
| |
| if (isWrongPwd) { |
| MacAddress bssidAsMacAddress; |
| try { |
| bssidAsMacAddress = MacAddress.fromString(assocRejectInfo.bssid); |
| } catch (IllegalArgumentException e) { |
| Log.e(TAG, "Invalid bssid obtained from supplicant " + assocRejectInfo.bssid); |
| bssidAsMacAddress = WifiManager.ALL_ZEROS_MAC_ADDRESS; |
| } |
| mWifiMonitor.broadcastAuthenticationFailureEvent( |
| mIfaceName, WifiManager.ERROR_AUTH_FAILURE_WRONG_PSWD, -1, |
| mCurrentSsid, bssidAsMacAddress); |
| } |
| mWifiMonitor.broadcastAssociationRejectionEvent(mIfaceName, assocRejectInfo); |
| mStateBeforeDisconnect = StaIfaceCallbackState.INACTIVE; |
| } |
| |
| @Override |
| public void onAssociationRejected(AssociationRejectionData assocRejectData) { |
| synchronized (mLock) { |
| mStaIfaceHal.logCallback("onAssociationRejected"); |
| assocRejectData.statusCode = halToFrameworkStatusCode(assocRejectData.statusCode); |
| assocRejectData.mboAssocDisallowedReason = halToFrameworkMboAssocDisallowedReasonCode( |
| assocRejectData.mboAssocDisallowedReason); |
| AssocRejectEventInfo assocRejectInfo = new AssocRejectEventInfo(assocRejectData); |
| handleAssocRejectEvent(assocRejectInfo); |
| } |
| } |
| |
| @Override |
| public void onAuthenticationTimeout(byte[/* 6 */] bssid) { |
| synchronized (mLock) { |
| mStaIfaceHal.logCallback("onAuthenticationTimeout"); |
| mWifiMonitor.broadcastAuthenticationFailureEvent( |
| mIfaceName, WifiManager.ERROR_AUTH_FAILURE_TIMEOUT, -1, |
| mCurrentSsid, MacAddress.fromBytes(bssid)); |
| } |
| } |
| |
| @Override |
| public void onBssidChanged(byte reason, byte[/* 6 */] bssid) { |
| synchronized (mLock) { |
| mStaIfaceHal.logCallback("onBssidChanged"); |
| if (reason == BssidChangeReason.ASSOC_START) { |
| mWifiMonitor.broadcastTargetBssidEvent( |
| mIfaceName, NativeUtil.macAddressFromByteArray(bssid)); |
| } else if (reason == BssidChangeReason.ASSOC_COMPLETE) { |
| mWifiMonitor.broadcastAssociatedBssidEvent( |
| mIfaceName, NativeUtil.macAddressFromByteArray(bssid)); |
| } |
| } |
| } |
| |
| @Override |
| public void onEapFailure(byte[/* 6 */] bssid, int errorCode) { |
| synchronized (mLock) { |
| mStaIfaceHal.logCallback("onEapFailure"); |
| try { |
| mWifiMonitor.broadcastAuthenticationFailureEvent( |
| mIfaceName, WifiManager.ERROR_AUTH_FAILURE_EAP_FAILURE, errorCode, |
| mCurrentSsid, MacAddress.fromBytes(bssid)); |
| } catch (IllegalArgumentException e) { |
| Log.i(TAG, "Invalid bssid received"); |
| } |
| } |
| } |
| |
| @Override |
| public void onWpsEventSuccess() { |
| synchronized (mLock) { |
| mStaIfaceHal.logCallback("onWpsEventSuccess"); |
| mWifiMonitor.broadcastWpsSuccessEvent(mIfaceName); |
| } |
| } |
| |
| @Override |
| public void onWpsEventFail(byte[/* 6 */] bssid, int configError, int errorInd) { |
| synchronized (mLock) { |
| mStaIfaceHal.logCallback("onWpsEventFail"); |
| if (configError == WpsConfigError.MSG_TIMEOUT |
| && errorInd == WpsErrorIndication.NO_ERROR) { |
| mWifiMonitor.broadcastWpsTimeoutEvent(mIfaceName); |
| } else { |
| mWifiMonitor.broadcastWpsFailEvent(mIfaceName, configError, errorInd); |
| } |
| } |
| } |
| |
| @Override |
| public void onWpsEventPbcOverlap() { |
| synchronized (mLock) { |
| mStaIfaceHal.logCallback("onWpsEventPbcOverlap"); |
| mWifiMonitor.broadcastWpsOverlapEvent(mIfaceName); |
| } |
| } |
| |
| @Override |
| public void onExtRadioWorkStart(int id) { |
| synchronized (mLock) { |
| mStaIfaceHal.logCallback("onExtRadioWorkStart"); |
| } |
| } |
| |
| @Override |
| public void onExtRadioWorkTimeout(int id) { |
| synchronized (mLock) { |
| mStaIfaceHal.logCallback("onExtRadioWorkTimeout"); |
| } |
| } |
| |
| @Override |
| public void onDppSuccessConfigReceived(byte[] ssid, String password, |
| byte[] psk, int securityAkm, DppConnectionKeys keys) { |
| if (mStaIfaceHal.getDppCallback() == null) { |
| Log.e(TAG, "onDppSuccessConfigReceived callback is null"); |
| return; |
| } |
| |
| WifiConfiguration newWifiConfiguration = new WifiConfiguration(); |
| |
| // Set up SSID |
| WifiSsid wifiSsid = WifiSsid.fromBytes(ssid); |
| newWifiConfiguration.SSID = wifiSsid.toString(); |
| |
| // Set up password or PSK |
| if (password != null) { |
| newWifiConfiguration.preSharedKey = "\"" + password + "\""; |
| } else if (psk != null) { |
| newWifiConfiguration.preSharedKey = Arrays.toString(psk); |
| } |
| |
| // Set up key management: SAE or PSK or DPP |
| if (securityAkm == DppAkm.SAE) { |
| newWifiConfiguration.setSecurityParams(WifiConfiguration.SECURITY_TYPE_SAE); |
| } else if (securityAkm == DppAkm.PSK_SAE || securityAkm == DppAkm.PSK) { |
| newWifiConfiguration.setSecurityParams(WifiConfiguration.SECURITY_TYPE_PSK); |
| } else if (securityAkm == DppAkm.DPP) { |
| newWifiConfiguration.setSecurityParams(WifiConfiguration.SECURITY_TYPE_DPP); |
| } else { |
| // No other AKMs are currently supported |
| onDppFailure(DppFailureCode.NOT_SUPPORTED, null, null, null); |
| return; |
| } |
| |
| // Set DPP connection Keys for SECURITY_TYPE_DPP |
| if (keys != null && securityAkm == DppAkm.DPP) { |
| newWifiConfiguration.setDppConnectionKeys(keys.connector, keys.cSign, |
| keys.netAccessKey); |
| } |
| |
| // Set up default values |
| newWifiConfiguration.creatorName = mContext.getPackageManager() |
| .getNameForUid(Process.WIFI_UID); |
| newWifiConfiguration.status = WifiConfiguration.Status.ENABLED; |
| |
| mStaIfaceHal.getDppCallback().onSuccessConfigReceived(newWifiConfiguration); |
| } |
| |
| @Override |
| public void onDppSuccessConfigSent() { |
| if (mStaIfaceHal.getDppCallback() != null) { |
| mStaIfaceHal.getDppCallback().onSuccess( |
| SupplicantStaIfaceHal.DppEventType.CONFIGURATION_SENT); |
| } else { |
| Log.e(TAG, "onSuccessConfigSent callback is null"); |
| } |
| } |
| |
| @Override |
| public void onDppProgress(int code) { |
| if (mStaIfaceHal.getDppCallback() != null) { |
| mStaIfaceHal.getDppCallback().onProgress(halToFrameworkDppProgressCode(code)); |
| } else { |
| Log.e(TAG, "onDppProgress callback is null"); |
| } |
| } |
| |
| @Override |
| public void onDppFailure(int code, String ssid, String channelList, char[] bandList) { |
| if (mStaIfaceHal.getDppCallback() != null) { |
| int[] bandListArray = null; |
| |
| // Convert char array to int array |
| if (bandList != null) { |
| bandListArray = new int[bandList.length]; |
| |
| for (int i = 0; i < bandList.length; i++) { |
| bandListArray[i] = bandList[i]; |
| } |
| } |
| mStaIfaceHal.getDppCallback().onFailure( |
| halToFrameworkDppFailureCode(code), ssid, channelList, bandListArray); |
| } else { |
| Log.e(TAG, "onDppFailure callback is null"); |
| } |
| } |
| |
| @Override |
| public void onPmkCacheAdded(long expirationTimeInSec, byte[] serializedEntry) { |
| WifiConfiguration curConfig = mStaIfaceHal.getCurrentNetworkLocalConfig(mIfaceName); |
| if (curConfig == null) { |
| return; |
| } |
| |
| SecurityParams params = curConfig.getNetworkSelectionStatus().getCandidateSecurityParams(); |
| if (params == null || params.isSecurityType(WifiConfiguration.SECURITY_TYPE_PSK) |
| || params.isSecurityType(WifiConfiguration.SECURITY_TYPE_DPP)) { |
| return; |
| } |
| |
| mStaIfaceHal.addPmkCacheEntry(mIfaceName, curConfig.networkId, expirationTimeInSec, |
| NativeUtil.byteArrayToArrayList(serializedEntry)); |
| mStaIfaceHal.logCallback( |
| "onPmkCacheAdded: update pmk cache for config id " |
| + curConfig.networkId + " on " + mIfaceName); |
| } |
| |
| @Override |
| public void onDppSuccess(int code) { |
| if (mStaIfaceHal.getDppCallback() != null) { |
| mStaIfaceHal.getDppCallback().onSuccess(halToFrameworkDppEventType(code)); |
| } else { |
| Log.e(TAG, "onDppSuccess callback is null"); |
| } |
| } |
| |
| private @MboOceConstants.BtmResponseStatus int halToFrameworkBtmResponseStatus(int status) { |
| switch (status) { |
| case BssTmStatusCode.ACCEPT: |
| return MboOceConstants.BTM_RESPONSE_STATUS_ACCEPT; |
| case BssTmStatusCode.REJECT_UNSPECIFIED: |
| return MboOceConstants.BTM_RESPONSE_STATUS_REJECT_UNSPECIFIED; |
| case BssTmStatusCode.REJECT_INSUFFICIENT_BEACON: |
| return MboOceConstants.BTM_RESPONSE_STATUS_REJECT_INSUFFICIENT_BEACON; |
| case BssTmStatusCode.REJECT_INSUFFICIENT_CAPABITY: |
| return MboOceConstants.BTM_RESPONSE_STATUS_REJECT_INSUFFICIENT_CAPABITY; |
| case BssTmStatusCode.REJECT_BSS_TERMINATION_UNDESIRED: |
| return MboOceConstants.BTM_RESPONSE_STATUS_REJECT_BSS_TERMINATION_UNDESIRED; |
| case BssTmStatusCode.REJECT_BSS_TERMINATION_DELAY_REQUEST: |
| return MboOceConstants.BTM_RESPONSE_STATUS_REJECT_BSS_TERMINATION_DELAY_REQUEST; |
| case BssTmStatusCode.REJECT_STA_CANDIDATE_LIST_PROVIDED: |
| return MboOceConstants.BTM_RESPONSE_STATUS_REJECT_STA_CANDIDATE_LIST_PROVIDED; |
| case BssTmStatusCode.REJECT_NO_SUITABLE_CANDIDATES: |
| return MboOceConstants.BTM_RESPONSE_STATUS_REJECT_NO_SUITABLE_CANDIDATES; |
| case BssTmStatusCode.REJECT_LEAVING_ESS: |
| return MboOceConstants.BTM_RESPONSE_STATUS_REJECT_LEAVING_ESS; |
| default: |
| return MboOceConstants.BTM_RESPONSE_STATUS_REJECT_RESERVED; |
| } |
| } |
| |
| private int halToFrameworkBssTmDataFlagsMask(int flags) { |
| int tmDataflags = 0; |
| if ((flags & BssTmDataFlagsMask.WNM_MODE_PREFERRED_CANDIDATE_LIST_INCLUDED) != 0) { |
| tmDataflags |= MboOceConstants.BTM_DATA_FLAG_PREFERRED_CANDIDATE_LIST_INCLUDED; |
| } |
| if ((flags & BssTmDataFlagsMask.WNM_MODE_ABRIDGED) != 0) { |
| tmDataflags |= MboOceConstants.BTM_DATA_FLAG_MODE_ABRIDGED; |
| } |
| if ((flags & BssTmDataFlagsMask.WNM_MODE_DISASSOCIATION_IMMINENT) != 0) { |
| tmDataflags |= MboOceConstants.BTM_DATA_FLAG_DISASSOCIATION_IMMINENT; |
| } |
| if ((flags & BssTmDataFlagsMask.WNM_MODE_BSS_TERMINATION_INCLUDED) != 0) { |
| tmDataflags |= MboOceConstants.BTM_DATA_FLAG_BSS_TERMINATION_INCLUDED; |
| } |
| if ((flags & BssTmDataFlagsMask.WNM_MODE_ESS_DISASSOCIATION_IMMINENT) != 0) { |
| tmDataflags |= MboOceConstants.BTM_DATA_FLAG_ESS_DISASSOCIATION_IMMINENT; |
| } |
| if ((flags & BssTmDataFlagsMask.MBO_TRANSITION_REASON_CODE_INCLUDED) != 0) { |
| tmDataflags |= MboOceConstants.BTM_DATA_FLAG_MBO_TRANSITION_REASON_CODE_INCLUDED; |
| } |
| if ((flags & BssTmDataFlagsMask.MBO_ASSOC_RETRY_DELAY_INCLUDED) != 0) { |
| tmDataflags |= MboOceConstants.BTM_DATA_FLAG_MBO_ASSOC_RETRY_DELAY_INCLUDED; |
| } |
| if ((flags & BssTmDataFlagsMask.MBO_CELLULAR_DATA_CONNECTION_PREFERENCE_INCLUDED) != 0) { |
| tmDataflags |= |
| MboOceConstants.BTM_DATA_FLAG_MBO_CELL_DATA_CONNECTION_PREFERENCE_INCLUDED; |
| } |
| return tmDataflags; |
| } |
| |
| private @MboOceConstants.MboTransitionReason int halToFrameworkMboTransitionReason( |
| int reason) { |
| switch (reason) { |
| case MboTransitionReasonCode.UNSPECIFIED: |
| return MboOceConstants.MBO_TRANSITION_REASON_UNSPECIFIED; |
| case MboTransitionReasonCode.EXCESSIVE_FRAME_LOSS: |
| return MboOceConstants.MBO_TRANSITION_REASON_EXCESSIVE_FRAME_LOSS; |
| case MboTransitionReasonCode.EXCESSIVE_TRAFFIC_DELAY: |
| return MboOceConstants.MBO_TRANSITION_REASON_EXCESSIVE_TRAFFIC_DELAY; |
| case MboTransitionReasonCode.INSUFFICIENT_BANDWIDTH: |
| return MboOceConstants.MBO_TRANSITION_REASON_INSUFFICIENT_BANDWIDTH; |
| case MboTransitionReasonCode.LOAD_BALANCING: |
| return MboOceConstants.MBO_TRANSITION_REASON_LOAD_BALANCING; |
| case MboTransitionReasonCode.LOW_RSSI: |
| return MboOceConstants.MBO_TRANSITION_REASON_LOW_RSSI; |
| case MboTransitionReasonCode.RX_EXCESSIVE_RETRIES: |
| return MboOceConstants.MBO_TRANSITION_REASON_RX_EXCESSIVE_RETRIES; |
| case MboTransitionReasonCode.HIGH_INTERFERENCE: |
| return MboOceConstants.MBO_TRANSITION_REASON_HIGH_INTERFERENCE; |
| case MboTransitionReasonCode.GRAY_ZONE: |
| return MboOceConstants.MBO_TRANSITION_REASON_GRAY_ZONE; |
| default: |
| return MboOceConstants.MBO_TRANSITION_REASON_RESERVED; |
| } |
| } |
| |
| private @MboOceConstants.MboTransitionReason int |
| halToFrameworkMboCellularDataConnectionPreference(int cellPref) { |
| switch (cellPref) { |
| case MboCellularDataConnectionPrefValue.EXCLUDED: |
| return MboOceConstants.MBO_CELLULAR_DATA_CONNECTION_EXCLUDED; |
| case MboCellularDataConnectionPrefValue.NOT_PREFERRED: |
| return MboOceConstants.MBO_CELLULAR_DATA_CONNECTION_NOT_PREFERRED; |
| case MboCellularDataConnectionPrefValue.PREFERRED: |
| return MboOceConstants.MBO_CELLULAR_DATA_CONNECTION_PREFERRED; |
| default: |
| return MboOceConstants.MBO_CELLULAR_DATA_CONNECTION_RESERVED; |
| } |
| } |
| |
| private int halToFrameworkDppEventType(int eventType) { |
| switch(eventType) { |
| case DppEventType.CONFIGURATION_SENT: |
| return SupplicantStaIfaceHal.DppEventType.CONFIGURATION_SENT; |
| case DppEventType.CONFIGURATION_APPLIED: |
| return SupplicantStaIfaceHal.DppEventType.CONFIGURATION_APPLIED; |
| default: |
| Log.e(TAG, "Invalid DppEventType received"); |
| return -1; |
| } |
| } |
| |
| private int halToFrameworkDppProgressCode(int progressCode) { |
| switch(progressCode) { |
| case DppProgressCode.AUTHENTICATION_SUCCESS: |
| return SupplicantStaIfaceHal.DppProgressCode.AUTHENTICATION_SUCCESS; |
| case DppProgressCode.RESPONSE_PENDING: |
| return SupplicantStaIfaceHal.DppProgressCode.RESPONSE_PENDING; |
| case DppProgressCode.CONFIGURATION_SENT_WAITING_RESPONSE: |
| return SupplicantStaIfaceHal.DppProgressCode.CONFIGURATION_SENT_WAITING_RESPONSE; |
| case DppProgressCode.CONFIGURATION_ACCEPTED: |
| return SupplicantStaIfaceHal.DppProgressCode.CONFIGURATION_ACCEPTED; |
| default: |
| Log.e(TAG, "Invalid DppProgressCode received"); |
| return -1; |
| } |
| } |
| |
| private int halToFrameworkDppFailureCode(int failureCode) { |
| switch(failureCode) { |
| case DppFailureCode.INVALID_URI: |
| return SupplicantStaIfaceHal.DppFailureCode.INVALID_URI; |
| case DppFailureCode.AUTHENTICATION: |
| return SupplicantStaIfaceHal.DppFailureCode.AUTHENTICATION; |
| case DppFailureCode.NOT_COMPATIBLE: |
| return SupplicantStaIfaceHal.DppFailureCode.NOT_COMPATIBLE; |
| case DppFailureCode.CONFIGURATION: |
| return SupplicantStaIfaceHal.DppFailureCode.CONFIGURATION; |
| case DppFailureCode.BUSY: |
| return SupplicantStaIfaceHal.DppFailureCode.BUSY; |
| case DppFailureCode.TIMEOUT: |
| return SupplicantStaIfaceHal.DppFailureCode.TIMEOUT; |
| case DppFailureCode.FAILURE: |
| return SupplicantStaIfaceHal.DppFailureCode.FAILURE; |
| case DppFailureCode.NOT_SUPPORTED: |
| return SupplicantStaIfaceHal.DppFailureCode.NOT_SUPPORTED; |
| case DppFailureCode.CONFIGURATION_REJECTED: |
| return SupplicantStaIfaceHal.DppFailureCode.CONFIGURATION_REJECTED; |
| case DppFailureCode.CANNOT_FIND_NETWORK: |
| return SupplicantStaIfaceHal.DppFailureCode.CANNOT_FIND_NETWORK; |
| case DppFailureCode.ENROLLEE_AUTHENTICATION: |
| return SupplicantStaIfaceHal.DppFailureCode.ENROLLEE_AUTHENTICATION; |
| case DppFailureCode.URI_GENERATION: |
| return SupplicantStaIfaceHal.DppFailureCode.URI_GENERATION; |
| default: |
| Log.e(TAG, "Invalid DppFailureCode received"); |
| return -1; |
| } |
| } |
| |
| private byte halToFrameworkMboAssocDisallowedReasonCode(byte reasonCode) { |
| switch (reasonCode) { |
| case MboAssocDisallowedReasonCode.RESERVED: |
| return SupplicantStaIfaceHal.MboAssocDisallowedReasonCode.RESERVED; |
| case MboAssocDisallowedReasonCode.UNSPECIFIED: |
| return SupplicantStaIfaceHal.MboAssocDisallowedReasonCode.UNSPECIFIED; |
| case MboAssocDisallowedReasonCode.MAX_NUM_STA_ASSOCIATED: |
| return SupplicantStaIfaceHal.MboAssocDisallowedReasonCode.MAX_NUM_STA_ASSOCIATED; |
| case MboAssocDisallowedReasonCode.AIR_INTERFACE_OVERLOADED: |
| return SupplicantStaIfaceHal.MboAssocDisallowedReasonCode.AIR_INTERFACE_OVERLOADED; |
| case MboAssocDisallowedReasonCode.AUTH_SERVER_OVERLOADED: |
| return SupplicantStaIfaceHal.MboAssocDisallowedReasonCode.AUTH_SERVER_OVERLOADED; |
| case MboAssocDisallowedReasonCode.INSUFFICIENT_RSSI: |
| return SupplicantStaIfaceHal.MboAssocDisallowedReasonCode.INSUFFICIENT_RSSI; |
| default: |
| Log.e(TAG, "Invalid MboAssocDisallowedReasonCode received"); |
| return -1; |
| } |
| } |
| |
| private int halToFrameworkReasonCode(int reason) { |
| switch (reason) { |
| case StaIfaceReasonCode.UNSPECIFIED: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.UNSPECIFIED; |
| case StaIfaceReasonCode.PREV_AUTH_NOT_VALID: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.PREV_AUTH_NOT_VALID; |
| case StaIfaceReasonCode.DEAUTH_LEAVING: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.DEAUTH_LEAVING; |
| case StaIfaceReasonCode.DISASSOC_DUE_TO_INACTIVITY: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.DISASSOC_DUE_TO_INACTIVITY; |
| case StaIfaceReasonCode.DISASSOC_AP_BUSY: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.DISASSOC_AP_BUSY; |
| case StaIfaceReasonCode.CLASS2_FRAME_FROM_NONAUTH_STA: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.CLASS2_FRAME_FROM_NONAUTH_STA; |
| case StaIfaceReasonCode.CLASS3_FRAME_FROM_NONASSOC_STA: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.CLASS3_FRAME_FROM_NONASSOC_STA; |
| case StaIfaceReasonCode.DISASSOC_STA_HAS_LEFT: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.DISASSOC_STA_HAS_LEFT; |
| case StaIfaceReasonCode.STA_REQ_ASSOC_WITHOUT_AUTH: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.STA_REQ_ASSOC_WITHOUT_AUTH; |
| case StaIfaceReasonCode.PWR_CAPABILITY_NOT_VALID: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.PWR_CAPABILITY_NOT_VALID; |
| case StaIfaceReasonCode.SUPPORTED_CHANNEL_NOT_VALID: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.SUPPORTED_CHANNEL_NOT_VALID; |
| case StaIfaceReasonCode.BSS_TRANSITION_DISASSOC: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.BSS_TRANSITION_DISASSOC; |
| case StaIfaceReasonCode.INVALID_IE: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.INVALID_IE; |
| case StaIfaceReasonCode.MICHAEL_MIC_FAILURE: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.MICHAEL_MIC_FAILURE; |
| case StaIfaceReasonCode.FOURWAY_HANDSHAKE_TIMEOUT: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.FOURWAY_HANDSHAKE_TIMEOUT; |
| case StaIfaceReasonCode.GROUP_KEY_UPDATE_TIMEOUT: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.GROUP_KEY_UPDATE_TIMEOUT; |
| case StaIfaceReasonCode.IE_IN_4WAY_DIFFERS: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.IE_IN_4WAY_DIFFERS; |
| case StaIfaceReasonCode.GROUP_CIPHER_NOT_VALID: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.GROUP_CIPHER_NOT_VALID; |
| case StaIfaceReasonCode.PAIRWISE_CIPHER_NOT_VALID: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.PAIRWISE_CIPHER_NOT_VALID; |
| case StaIfaceReasonCode.AKMP_NOT_VALID: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.AKMP_NOT_VALID; |
| case StaIfaceReasonCode.UNSUPPORTED_RSN_IE_VERSION: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.UNSUPPORTED_RSN_IE_VERSION; |
| case StaIfaceReasonCode.INVALID_RSN_IE_CAPAB: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.INVALID_RSN_IE_CAPAB; |
| case StaIfaceReasonCode.IEEE_802_1X_AUTH_FAILED: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.IEEE_802_1X_AUTH_FAILED; |
| case StaIfaceReasonCode.CIPHER_SUITE_REJECTED: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.CIPHER_SUITE_REJECTED; |
| case StaIfaceReasonCode.TDLS_TEARDOWN_UNREACHABLE: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.TDLS_TEARDOWN_UNREACHABLE; |
| case StaIfaceReasonCode.TDLS_TEARDOWN_UNSPECIFIED: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.TDLS_TEARDOWN_UNSPECIFIED; |
| case StaIfaceReasonCode.SSP_REQUESTED_DISASSOC: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.SSP_REQUESTED_DISASSOC; |
| case StaIfaceReasonCode.NO_SSP_ROAMING_AGREEMENT: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.NO_SSP_ROAMING_AGREEMENT; |
| case StaIfaceReasonCode.BAD_CIPHER_OR_AKM: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.BAD_CIPHER_OR_AKM; |
| case StaIfaceReasonCode.NOT_AUTHORIZED_THIS_LOCATION: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.NOT_AUTHORIZED_THIS_LOCATION; |
| case StaIfaceReasonCode.SERVICE_CHANGE_PRECLUDES_TS: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.SERVICE_CHANGE_PRECLUDES_TS; |
| case StaIfaceReasonCode.UNSPECIFIED_QOS_REASON: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.UNSPECIFIED_QOS_REASON; |
| case StaIfaceReasonCode.NOT_ENOUGH_BANDWIDTH: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.NOT_ENOUGH_BANDWIDTH; |
| case StaIfaceReasonCode.DISASSOC_LOW_ACK: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.DISASSOC_LOW_ACK; |
| case StaIfaceReasonCode.EXCEEDED_TXOP: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.EXCEEDED_TXOP; |
| case StaIfaceReasonCode.STA_LEAVING: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.STA_LEAVING; |
| case StaIfaceReasonCode.END_TS_BA_DLS: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.END_TS_BA_DLS; |
| case StaIfaceReasonCode.UNKNOWN_TS_BA: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.UNKNOWN_TS_BA; |
| case StaIfaceReasonCode.TIMEOUT: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.TIMEOUT; |
| case StaIfaceReasonCode.PEERKEY_MISMATCH: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.PEERKEY_MISMATCH; |
| case StaIfaceReasonCode.AUTHORIZED_ACCESS_LIMIT_REACHED: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.AUTHORIZED_ACCESS_LIMIT_REACHED; |
| case StaIfaceReasonCode.EXTERNAL_SERVICE_REQUIREMENTS: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.EXTERNAL_SERVICE_REQUIREMENTS; |
| case StaIfaceReasonCode.INVALID_FT_ACTION_FRAME_COUNT: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.INVALID_FT_ACTION_FRAME_COUNT; |
| case StaIfaceReasonCode.INVALID_PMKID: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.INVALID_PMKID; |
| case StaIfaceReasonCode.INVALID_MDE: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.INVALID_MDE; |
| case StaIfaceReasonCode.INVALID_FTE: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.INVALID_FTE; |
| case StaIfaceReasonCode.MESH_PEERING_CANCELLED: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.MESH_PEERING_CANCELLED; |
| case StaIfaceReasonCode.MESH_MAX_PEERS: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.MESH_MAX_PEERS; |
| case StaIfaceReasonCode.MESH_CONFIG_POLICY_VIOLATION: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.MESH_CONFIG_POLICY_VIOLATION; |
| case StaIfaceReasonCode.MESH_CLOSE_RCVD: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.MESH_CLOSE_RCVD; |
| case StaIfaceReasonCode.MESH_MAX_RETRIES: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.MESH_MAX_RETRIES; |
| case StaIfaceReasonCode.MESH_CONFIRM_TIMEOUT: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.MESH_CONFIRM_TIMEOUT; |
| case StaIfaceReasonCode.MESH_INVALID_GTK: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.MESH_INVALID_GTK; |
| case StaIfaceReasonCode.MESH_INCONSISTENT_PARAMS: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.MESH_INCONSISTENT_PARAMS; |
| case StaIfaceReasonCode.MESH_INVALID_SECURITY_CAP: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.MESH_INVALID_SECURITY_CAP; |
| case StaIfaceReasonCode.MESH_PATH_ERROR_NO_PROXY_INFO: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.MESH_PATH_ERROR_NO_PROXY_INFO; |
| case StaIfaceReasonCode.MESH_PATH_ERROR_NO_FORWARDING_INFO: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.MESH_PATH_ERROR_NO_FORWARDING_INFO; |
| case StaIfaceReasonCode.MESH_PATH_ERROR_DEST_UNREACHABLE: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.MESH_PATH_ERROR_DEST_UNREACHABLE; |
| case StaIfaceReasonCode.MAC_ADDRESS_ALREADY_EXISTS_IN_MBSS: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.MAC_ADDRESS_ALREADY_EXISTS_IN_MBSS; |
| case StaIfaceReasonCode.MESH_CHANNEL_SWITCH_REGULATORY_REQ: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.MESH_CHANNEL_SWITCH_REGULATORY_REQ; |
| case StaIfaceReasonCode.MESH_CHANNEL_SWITCH_UNSPECIFIED: |
| return SupplicantStaIfaceHal.StaIfaceReasonCode.MESH_CHANNEL_SWITCH_UNSPECIFIED; |
| default: |
| Log.e(TAG, "Invalid reason code received"); |
| return -1; |
| } |
| } |
| |
| protected static int halToFrameworkStatusCode(int reason) { |
| switch (reason) { |
| case StaIfaceStatusCode.SUCCESS: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.SUCCESS; |
| case StaIfaceStatusCode.UNSPECIFIED_FAILURE: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.UNSPECIFIED_FAILURE; |
| case StaIfaceStatusCode.TDLS_WAKEUP_ALTERNATE: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.TDLS_WAKEUP_ALTERNATE; |
| case StaIfaceStatusCode.TDLS_WAKEUP_REJECT: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.TDLS_WAKEUP_REJECT; |
| case StaIfaceStatusCode.SECURITY_DISABLED: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.SECURITY_DISABLED; |
| case StaIfaceStatusCode.UNACCEPTABLE_LIFETIME: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.UNACCEPTABLE_LIFETIME; |
| case StaIfaceStatusCode.NOT_IN_SAME_BSS: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.NOT_IN_SAME_BSS; |
| case StaIfaceStatusCode.CAPS_UNSUPPORTED: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.CAPS_UNSUPPORTED; |
| case StaIfaceStatusCode.REASSOC_NO_ASSOC: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.REASSOC_NO_ASSOC; |
| case StaIfaceStatusCode.ASSOC_DENIED_UNSPEC: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.ASSOC_DENIED_UNSPEC; |
| case StaIfaceStatusCode.NOT_SUPPORTED_AUTH_ALG: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.NOT_SUPPORTED_AUTH_ALG; |
| case StaIfaceStatusCode.UNKNOWN_AUTH_TRANSACTION: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.UNKNOWN_AUTH_TRANSACTION; |
| case StaIfaceStatusCode.CHALLENGE_FAIL: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.CHALLENGE_FAIL; |
| case StaIfaceStatusCode.AUTH_TIMEOUT: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.AUTH_TIMEOUT; |
| case StaIfaceStatusCode.AP_UNABLE_TO_HANDLE_NEW_STA: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.AP_UNABLE_TO_HANDLE_NEW_STA; |
| case StaIfaceStatusCode.ASSOC_DENIED_RATES: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.ASSOC_DENIED_RATES; |
| case StaIfaceStatusCode.ASSOC_DENIED_NOSHORT: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.ASSOC_DENIED_NOSHORT; |
| case StaIfaceStatusCode.SPEC_MGMT_REQUIRED: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.SPEC_MGMT_REQUIRED; |
| case StaIfaceStatusCode.PWR_CAPABILITY_NOT_VALID: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.PWR_CAPABILITY_NOT_VALID; |
| case StaIfaceStatusCode.SUPPORTED_CHANNEL_NOT_VALID: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.SUPPORTED_CHANNEL_NOT_VALID; |
| case StaIfaceStatusCode.ASSOC_DENIED_NO_SHORT_SLOT_TIME: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.ASSOC_DENIED_NO_SHORT_SLOT_TIME; |
| case StaIfaceStatusCode.ASSOC_DENIED_NO_HT: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.ASSOC_DENIED_NO_HT; |
| case StaIfaceStatusCode.R0KH_UNREACHABLE: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.R0KH_UNREACHABLE; |
| case StaIfaceStatusCode.ASSOC_DENIED_NO_PCO: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.ASSOC_DENIED_NO_PCO; |
| case StaIfaceStatusCode.ASSOC_REJECTED_TEMPORARILY: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.ASSOC_REJECTED_TEMPORARILY; |
| case StaIfaceStatusCode.ROBUST_MGMT_FRAME_POLICY_VIOLATION: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.ROBUST_MGMT_FRAME_POLICY_VIOLATION; |
| case StaIfaceStatusCode.UNSPECIFIED_QOS_FAILURE: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.UNSPECIFIED_QOS_FAILURE; |
| case StaIfaceStatusCode.DENIED_INSUFFICIENT_BANDWIDTH: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.DENIED_INSUFFICIENT_BANDWIDTH; |
| case StaIfaceStatusCode.DENIED_POOR_CHANNEL_CONDITIONS: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.DENIED_POOR_CHANNEL_CONDITIONS; |
| case StaIfaceStatusCode.DENIED_QOS_NOT_SUPPORTED: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.DENIED_QOS_NOT_SUPPORTED; |
| case StaIfaceStatusCode.REQUEST_DECLINED: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.REQUEST_DECLINED; |
| case StaIfaceStatusCode.INVALID_PARAMETERS: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.INVALID_PARAMETERS; |
| case StaIfaceStatusCode.REJECTED_WITH_SUGGESTED_CHANGES: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.REJECTED_WITH_SUGGESTED_CHANGES; |
| case StaIfaceStatusCode.INVALID_IE: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.INVALID_IE; |
| case StaIfaceStatusCode.GROUP_CIPHER_NOT_VALID: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.GROUP_CIPHER_NOT_VALID; |
| case StaIfaceStatusCode.PAIRWISE_CIPHER_NOT_VALID: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.PAIRWISE_CIPHER_NOT_VALID; |
| case StaIfaceStatusCode.AKMP_NOT_VALID: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.AKMP_NOT_VALID; |
| case StaIfaceStatusCode.UNSUPPORTED_RSN_IE_VERSION: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.UNSUPPORTED_RSN_IE_VERSION; |
| case StaIfaceStatusCode.INVALID_RSN_IE_CAPAB: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.INVALID_RSN_IE_CAPAB; |
| case StaIfaceStatusCode.CIPHER_REJECTED_PER_POLICY: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.CIPHER_REJECTED_PER_POLICY; |
| case StaIfaceStatusCode.TS_NOT_CREATED: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.TS_NOT_CREATED; |
| case StaIfaceStatusCode.DIRECT_LINK_NOT_ALLOWED: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.DIRECT_LINK_NOT_ALLOWED; |
| case StaIfaceStatusCode.DEST_STA_NOT_PRESENT: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.DEST_STA_NOT_PRESENT; |
| case StaIfaceStatusCode.DEST_STA_NOT_QOS_STA: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.DEST_STA_NOT_QOS_STA; |
| case StaIfaceStatusCode.ASSOC_DENIED_LISTEN_INT_TOO_LARGE: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.ASSOC_DENIED_LISTEN_INT_TOO_LARGE; |
| case StaIfaceStatusCode.INVALID_FT_ACTION_FRAME_COUNT: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.INVALID_FT_ACTION_FRAME_COUNT; |
| case StaIfaceStatusCode.INVALID_PMKID: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.INVALID_PMKID; |
| case StaIfaceStatusCode.INVALID_MDIE: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.INVALID_MDIE; |
| case StaIfaceStatusCode.INVALID_FTIE: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.INVALID_FTIE; |
| case StaIfaceStatusCode.REQUESTED_TCLAS_NOT_SUPPORTED: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.REQUESTED_TCLAS_NOT_SUPPORTED; |
| case StaIfaceStatusCode.INSUFFICIENT_TCLAS_PROCESSING_RESOURCES: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode |
| .INSUFFICIENT_TCLAS_PROCESSING_RESOURCES; |
| case StaIfaceStatusCode.TRY_ANOTHER_BSS: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.TRY_ANOTHER_BSS; |
| case StaIfaceStatusCode.GAS_ADV_PROTO_NOT_SUPPORTED: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.GAS_ADV_PROTO_NOT_SUPPORTED; |
| case StaIfaceStatusCode.NO_OUTSTANDING_GAS_REQ: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.NO_OUTSTANDING_GAS_REQ; |
| case StaIfaceStatusCode.GAS_RESP_NOT_RECEIVED: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.GAS_RESP_NOT_RECEIVED; |
| case StaIfaceStatusCode.STA_TIMED_OUT_WAITING_FOR_GAS_RESP: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.STA_TIMED_OUT_WAITING_FOR_GAS_RESP; |
| case StaIfaceStatusCode.GAS_RESP_LARGER_THAN_LIMIT: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.GAS_RESP_LARGER_THAN_LIMIT; |
| case StaIfaceStatusCode.REQ_REFUSED_HOME: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.REQ_REFUSED_HOME; |
| case StaIfaceStatusCode.ADV_SRV_UNREACHABLE: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.ADV_SRV_UNREACHABLE; |
| case StaIfaceStatusCode.REQ_REFUSED_SSPN: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.REQ_REFUSED_SSPN; |
| case StaIfaceStatusCode.REQ_REFUSED_UNAUTH_ACCESS: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.REQ_REFUSED_UNAUTH_ACCESS; |
| case StaIfaceStatusCode.INVALID_RSNIE: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.INVALID_RSNIE; |
| case StaIfaceStatusCode.U_APSD_COEX_NOT_SUPPORTED: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.U_APSD_COEX_NOT_SUPPORTED; |
| case StaIfaceStatusCode.U_APSD_COEX_MODE_NOT_SUPPORTED: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.U_APSD_COEX_MODE_NOT_SUPPORTED; |
| case StaIfaceStatusCode.BAD_INTERVAL_WITH_U_APSD_COEX: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.BAD_INTERVAL_WITH_U_APSD_COEX; |
| case StaIfaceStatusCode.ANTI_CLOGGING_TOKEN_REQ: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.ANTI_CLOGGING_TOKEN_REQ; |
| case StaIfaceStatusCode.FINITE_CYCLIC_GROUP_NOT_SUPPORTED: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.FINITE_CYCLIC_GROUP_NOT_SUPPORTED; |
| case StaIfaceStatusCode.CANNOT_FIND_ALT_TBTT: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.CANNOT_FIND_ALT_TBTT; |
| case StaIfaceStatusCode.TRANSMISSION_FAILURE: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.TRANSMISSION_FAILURE; |
| case StaIfaceStatusCode.REQ_TCLAS_NOT_SUPPORTED: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.REQ_TCLAS_NOT_SUPPORTED; |
| case StaIfaceStatusCode.TCLAS_RESOURCES_EXCHAUSTED: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.TCLAS_RESOURCES_EXCHAUSTED; |
| case StaIfaceStatusCode.REJECTED_WITH_SUGGESTED_BSS_TRANSITION: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode |
| .REJECTED_WITH_SUGGESTED_BSS_TRANSITION; |
| case StaIfaceStatusCode.REJECT_WITH_SCHEDULE: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.REJECT_WITH_SCHEDULE; |
| case StaIfaceStatusCode.REJECT_NO_WAKEUP_SPECIFIED: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.REJECT_NO_WAKEUP_SPECIFIED; |
| case StaIfaceStatusCode.SUCCESS_POWER_SAVE_MODE: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.SUCCESS_POWER_SAVE_MODE; |
| case StaIfaceStatusCode.PENDING_ADMITTING_FST_SESSION: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.PENDING_ADMITTING_FST_SESSION; |
| case StaIfaceStatusCode.PERFORMING_FST_NOW: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.PERFORMING_FST_NOW; |
| case StaIfaceStatusCode.PENDING_GAP_IN_BA_WINDOW: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.PENDING_GAP_IN_BA_WINDOW; |
| case StaIfaceStatusCode.REJECT_U_PID_SETTING: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.REJECT_U_PID_SETTING; |
| case StaIfaceStatusCode.REFUSED_EXTERNAL_REASON: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.REFUSED_EXTERNAL_REASON; |
| case StaIfaceStatusCode.REFUSED_AP_OUT_OF_MEMORY: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.REFUSED_AP_OUT_OF_MEMORY; |
| case StaIfaceStatusCode.REJECTED_EMERGENCY_SERVICE_NOT_SUPPORTED: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode |
| .REJECTED_EMERGENCY_SERVICE_NOT_SUPPORTED; |
| case StaIfaceStatusCode.QUERY_RESP_OUTSTANDING: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.QUERY_RESP_OUTSTANDING; |
| case StaIfaceStatusCode.REJECT_DSE_BAND: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.REJECT_DSE_BAND; |
| case StaIfaceStatusCode.TCLAS_PROCESSING_TERMINATED: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.TCLAS_PROCESSING_TERMINATED; |
| case StaIfaceStatusCode.TS_SCHEDULE_CONFLICT: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.TS_SCHEDULE_CONFLICT; |
| case StaIfaceStatusCode.DENIED_WITH_SUGGESTED_BAND_AND_CHANNEL: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode |
| .DENIED_WITH_SUGGESTED_BAND_AND_CHANNEL; |
| case StaIfaceStatusCode.MCCAOP_RESERVATION_CONFLICT: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.MCCAOP_RESERVATION_CONFLICT; |
| case StaIfaceStatusCode.MAF_LIMIT_EXCEEDED: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.MAF_LIMIT_EXCEEDED; |
| case StaIfaceStatusCode.MCCA_TRACK_LIMIT_EXCEEDED: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.MCCA_TRACK_LIMIT_EXCEEDED; |
| case StaIfaceStatusCode.DENIED_DUE_TO_SPECTRUM_MANAGEMENT: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.DENIED_DUE_TO_SPECTRUM_MANAGEMENT; |
| case StaIfaceStatusCode.ASSOC_DENIED_NO_VHT: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.ASSOC_DENIED_NO_VHT; |
| case StaIfaceStatusCode.ENABLEMENT_DENIED: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.ENABLEMENT_DENIED; |
| case StaIfaceStatusCode.RESTRICTION_FROM_AUTHORIZED_GDB: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.RESTRICTION_FROM_AUTHORIZED_GDB; |
| case StaIfaceStatusCode.AUTHORIZATION_DEENABLED: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.AUTHORIZATION_DEENABLED; |
| case StaIfaceStatusCode.FILS_AUTHENTICATION_FAILURE: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.FILS_AUTHENTICATION_FAILURE; |
| case StaIfaceStatusCode.UNKNOWN_AUTHENTICATION_SERVER: |
| return SupplicantStaIfaceHal.StaIfaceStatusCode.UNKNOWN_AUTHENTICATION_SERVER; |
| default: |
| Log.e(TAG, "Invalid status code received"); |
| return -1; |
| } |
| } |
| |
| private static @SupplicantEventCode int halAuxiliaryEventToFrameworkSupplicantEventCode( |
| int eventCode) { |
| switch (eventCode) { |
| case AuxiliarySupplicantEventCode.EAP_METHOD_SELECTED: |
| return SupplicantStaIfaceHal.SUPPLICANT_EVENT_EAP_METHOD_SELECTED; |
| case AuxiliarySupplicantEventCode.SSID_TEMP_DISABLED: |
| return SupplicantStaIfaceHal.SUPPLICANT_EVENT_SSID_TEMP_DISABLED; |
| case AuxiliarySupplicantEventCode.OPEN_SSL_FAILURE: |
| return SupplicantStaIfaceHal.SUPPLICANT_EVENT_OPEN_SSL_FAILURE; |
| default: |
| Log.e(TAG, "Invalid auxiliary event code received"); |
| return -1; |
| } |
| } |
| |
| @Override |
| public void onBssTmHandlingDone(BssTmData tmData) { |
| MboOceController.BtmFrameData btmFrmData = new MboOceController.BtmFrameData(); |
| |
| btmFrmData.mStatus = halToFrameworkBtmResponseStatus(tmData.status); |
| btmFrmData.mBssTmDataFlagsMask = halToFrameworkBssTmDataFlagsMask(tmData.flags); |
| btmFrmData.mBlockListDurationMs = tmData.assocRetryDelayMs; |
| if ((tmData.flags & BssTmDataFlagsMask.MBO_TRANSITION_REASON_CODE_INCLUDED) != 0) { |
| btmFrmData.mTransitionReason = halToFrameworkMboTransitionReason( |
| tmData.mboTransitionReason); |
| } |
| if ((tmData.flags |
| & BssTmDataFlagsMask.MBO_CELLULAR_DATA_CONNECTION_PREFERENCE_INCLUDED) != 0) { |
| btmFrmData.mCellPreference = |
| halToFrameworkMboCellularDataConnectionPreference(tmData.mboCellPreference); |
| } |
| mStaIfaceHal.logCallback( |
| "onBssTmHandlingDone: Handle BTM handling event"); |
| mWifiMonitor.broadcastBssTmHandlingDoneEvent(mIfaceName, btmFrmData); |
| } |
| |
| @Override |
| public void onHs20TermsAndConditionsAcceptanceRequestedNotification(byte[/* 6 */] bssid, |
| String url) { |
| synchronized (mLock) { |
| mStaIfaceHal.logCallback("onHs20TermsAndConditionsAcceptanceRequestedNotification"); |
| mWifiMonitor.broadcastWnmEvent(mIfaceName, |
| WnmData.createTermsAndConditionsAccetanceRequiredEvent( |
| NativeUtil.macAddressToLong(bssid), url)); |
| } |
| } |
| |
| @Override |
| public void onNetworkNotFound(byte[] ssid) { |
| mStaIfaceHal.logCallback("onNetworkNotFoundNotification"); |
| mWifiMonitor.broadcastNetworkNotFoundEvent(mIfaceName, |
| NativeUtil.encodeSsid(NativeUtil.byteArrayToArrayList(ssid))); |
| } |
| |
| @Override |
| public void onQosPolicyReset() { |
| synchronized (mLock) { |
| mStaIfaceHal.logCallback("onQosPolicyReset"); |
| mWifiMonitor.broadcastQosPolicyResetEvent(mIfaceName); |
| } |
| } |
| |
| @Override |
| public void onQosPolicyRequest(int qosPolicyRequestId, QosPolicyData[] qosPolicyData) { |
| synchronized (mLock) { |
| mStaIfaceHal.logCallback("onQosPolicyRequest"); |
| // Convert QoS policies from HAL to framework representation. |
| List<QosPolicyRequest> frameworkQosPolicies = new ArrayList(); |
| if (qosPolicyData != null) { |
| for (QosPolicyData halPolicy : qosPolicyData) { |
| frameworkQosPolicies.add( |
| SupplicantStaIfaceHalAidlImpl.halToFrameworkQosPolicy(halPolicy)); |
| } |
| } |
| mWifiMonitor.broadcastQosPolicyRequestEvent(mIfaceName, qosPolicyRequestId, |
| frameworkQosPolicies); |
| } |
| } |
| |
| @Override |
| public void onAuxiliarySupplicantEvent(int eventCode, byte[] bssid, |
| String reasonString) { |
| synchronized (mLock) { |
| @SupplicantEventCode int supplicantEventCode = |
| halAuxiliaryEventToFrameworkSupplicantEventCode(eventCode); |
| mStaIfaceHal.logCallback("onAuxiliarySupplicantEvent event=" + supplicantEventCode); |
| if (supplicantEventCode != -1) { |
| try { |
| mWifiMonitor.broadcastAuxiliarySupplicantEvent(mIfaceName, supplicantEventCode, |
| MacAddress.fromBytes(bssid), reasonString); |
| } catch (IllegalArgumentException e) { |
| Log.i(TAG, "Invalid bssid received"); |
| } |
| } |
| } |
| } |
| |
| @Override |
| public String getInterfaceHash() { |
| return ISupplicantStaIfaceCallback.HASH; |
| } |
| |
| @Override |
| public int getInterfaceVersion() { |
| return ISupplicantStaIfaceCallback.VERSION; |
| } |
| } |