/* * 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 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 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 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; } }