| /* |
| * Copyright (C) 2017 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 android.annotation.IntDef; |
| import android.annotation.NonNull; |
| import android.content.Context; |
| import android.net.MacAddress; |
| import android.net.wifi.SecurityParams; |
| import android.net.wifi.WifiConfiguration; |
| import android.os.Handler; |
| import android.util.Log; |
| import android.util.Range; |
| |
| import com.android.internal.annotations.VisibleForTesting; |
| |
| import java.lang.annotation.Retention; |
| import java.lang.annotation.RetentionPolicy; |
| import java.net.InetAddress; |
| import java.net.UnknownHostException; |
| import java.util.ArrayList; |
| import java.util.List; |
| import java.util.Map; |
| |
| import javax.annotation.concurrent.ThreadSafe; |
| |
| /** |
| * To maintain thread-safety, the locking protocol is that every non-static method (regardless of |
| * access level) acquires mLock. |
| */ |
| @ThreadSafe |
| public class SupplicantStaIfaceHal { |
| private static final String TAG = "SupplicantStaIfaceHal"; |
| private final Object mLock = new Object(); |
| private final Context mContext; |
| private final WifiMonitor mWifiMonitor; |
| private final FrameworkFacade mFrameworkFacade; |
| private final Handler mEventHandler; |
| private final Clock mClock; |
| private final WifiMetrics mWifiMetrics; |
| private final WifiGlobals mWifiGlobals; |
| |
| // HAL interface object - might be implemented by HIDL or AIDL |
| private ISupplicantStaIfaceHal mStaIfaceHal; |
| |
| // Common enums declared here to be independent from HIDL/AIDL. |
| // See HAL comments for more information on each. |
| protected static class DppAkm { |
| public static final int PSK = 0; |
| public static final int PSK_SAE = 1; |
| public static final int SAE = 2; |
| public static final int DPP = 3; |
| } |
| |
| protected static class DppCurve { |
| public static final int PRIME256V1 = 0; |
| public static final int SECP384R1 = 1; |
| public static final int SECP521R1 = 2; |
| public static final int BRAINPOOLP256R1 = 3; |
| public static final int BRAINPOOLP384R1 = 4; |
| public static final int BRAINPOOLP512R1 = 5; |
| } |
| |
| protected static class DppNetRole { |
| public static final int STA = 0; |
| public static final int AP = 1; |
| } |
| |
| protected static class DppEventType { |
| public static final int CONFIGURATION_SENT = 0; |
| public static final int CONFIGURATION_APPLIED = 1; |
| } |
| |
| protected static class DppFailureCode { |
| public static final int INVALID_URI = 0; |
| public static final int AUTHENTICATION = 1; |
| public static final int NOT_COMPATIBLE = 2; |
| public static final int CONFIGURATION = 3; |
| public static final int BUSY = 4; |
| public static final int TIMEOUT = 5; |
| public static final int FAILURE = 6; |
| public static final int NOT_SUPPORTED = 7; |
| public static final int CONFIGURATION_REJECTED = 8; |
| public static final int CANNOT_FIND_NETWORK = 9; |
| public static final int ENROLLEE_AUTHENTICATION = 10; |
| public static final int URI_GENERATION = 11; |
| } |
| |
| protected static class DppProgressCode { |
| public static final int AUTHENTICATION_SUCCESS = 0; |
| public static final int RESPONSE_PENDING = 1; |
| public static final int CONFIGURATION_SENT_WAITING_RESPONSE = 2; |
| public static final int CONFIGURATION_ACCEPTED = 3; |
| } |
| |
| protected static class MboAssocDisallowedReasonCode { |
| public static final byte RESERVED = 0; |
| public static final byte UNSPECIFIED = 1; |
| public static final byte MAX_NUM_STA_ASSOCIATED = 2; |
| public static final byte AIR_INTERFACE_OVERLOADED = 3; |
| public static final byte AUTH_SERVER_OVERLOADED = 4; |
| public static final byte INSUFFICIENT_RSSI = 5; |
| } |
| |
| protected static class StaIfaceReasonCode { |
| public static final int UNSPECIFIED = 1; |
| public static final int PREV_AUTH_NOT_VALID = 2; |
| public static final int DEAUTH_LEAVING = 3; |
| public static final int DISASSOC_DUE_TO_INACTIVITY = 4; |
| public static final int DISASSOC_AP_BUSY = 5; |
| public static final int CLASS2_FRAME_FROM_NONAUTH_STA = 6; |
| public static final int CLASS3_FRAME_FROM_NONASSOC_STA = 7; |
| public static final int DISASSOC_STA_HAS_LEFT = 8; |
| public static final int STA_REQ_ASSOC_WITHOUT_AUTH = 9; |
| public static final int PWR_CAPABILITY_NOT_VALID = 10; |
| public static final int SUPPORTED_CHANNEL_NOT_VALID = 11; |
| public static final int BSS_TRANSITION_DISASSOC = 12; |
| public static final int INVALID_IE = 13; |
| public static final int MICHAEL_MIC_FAILURE = 14; |
| public static final int FOURWAY_HANDSHAKE_TIMEOUT = 15; |
| public static final int GROUP_KEY_UPDATE_TIMEOUT = 16; |
| public static final int IE_IN_4WAY_DIFFERS = 17; |
| public static final int GROUP_CIPHER_NOT_VALID = 18; |
| public static final int PAIRWISE_CIPHER_NOT_VALID = 19; |
| public static final int AKMP_NOT_VALID = 20; |
| public static final int UNSUPPORTED_RSN_IE_VERSION = 21; |
| public static final int INVALID_RSN_IE_CAPAB = 22; |
| public static final int IEEE_802_1X_AUTH_FAILED = 23; |
| public static final int CIPHER_SUITE_REJECTED = 24; |
| public static final int TDLS_TEARDOWN_UNREACHABLE = 25; |
| public static final int TDLS_TEARDOWN_UNSPECIFIED = 26; |
| public static final int SSP_REQUESTED_DISASSOC = 27; |
| public static final int NO_SSP_ROAMING_AGREEMENT = 28; |
| public static final int BAD_CIPHER_OR_AKM = 29; |
| public static final int NOT_AUTHORIZED_THIS_LOCATION = 30; |
| public static final int SERVICE_CHANGE_PRECLUDES_TS = 31; |
| public static final int UNSPECIFIED_QOS_REASON = 32; |
| public static final int NOT_ENOUGH_BANDWIDTH = 33; |
| public static final int DISASSOC_LOW_ACK = 34; |
| public static final int EXCEEDED_TXOP = 35; |
| public static final int STA_LEAVING = 36; |
| public static final int END_TS_BA_DLS = 37; |
| public static final int UNKNOWN_TS_BA = 38; |
| public static final int TIMEOUT = 39; |
| public static final int PEERKEY_MISMATCH = 45; |
| public static final int AUTHORIZED_ACCESS_LIMIT_REACHED = 46; |
| public static final int EXTERNAL_SERVICE_REQUIREMENTS = 47; |
| public static final int INVALID_FT_ACTION_FRAME_COUNT = 48; |
| public static final int INVALID_PMKID = 49; |
| public static final int INVALID_MDE = 50; |
| public static final int INVALID_FTE = 51; |
| public static final int MESH_PEERING_CANCELLED = 52; |
| public static final int MESH_MAX_PEERS = 53; |
| public static final int MESH_CONFIG_POLICY_VIOLATION = 54; |
| public static final int MESH_CLOSE_RCVD = 55; |
| public static final int MESH_MAX_RETRIES = 56; |
| public static final int MESH_CONFIRM_TIMEOUT = 57; |
| public static final int MESH_INVALID_GTK = 58; |
| public static final int MESH_INCONSISTENT_PARAMS = 59; |
| public static final int MESH_INVALID_SECURITY_CAP = 60; |
| public static final int MESH_PATH_ERROR_NO_PROXY_INFO = 61; |
| public static final int MESH_PATH_ERROR_NO_FORWARDING_INFO = 62; |
| public static final int MESH_PATH_ERROR_DEST_UNREACHABLE = 63; |
| public static final int MAC_ADDRESS_ALREADY_EXISTS_IN_MBSS = 64; |
| public static final int MESH_CHANNEL_SWITCH_REGULATORY_REQ = 65; |
| public static final int MESH_CHANNEL_SWITCH_UNSPECIFIED = 66; |
| |
| public static String toString(int code) { |
| switch(code) { |
| case UNSPECIFIED: |
| return "UNSPECIFIED"; |
| case PREV_AUTH_NOT_VALID: |
| return "PREV_AUTH_NOT_VALID"; |
| case DEAUTH_LEAVING: |
| return "DEAUTH_LEAVING"; |
| case DISASSOC_DUE_TO_INACTIVITY: |
| return "DISASSOC_DUE_TO_INACTIVITY"; |
| case DISASSOC_AP_BUSY: |
| return "DISASSOC_AP_BUSY"; |
| case CLASS2_FRAME_FROM_NONAUTH_STA: |
| return "CLASS2_FRAME_FROM_NONAUTH_STA"; |
| case CLASS3_FRAME_FROM_NONASSOC_STA: |
| return "CLASS3_FRAME_FROM_NONASSOC_STA"; |
| case DISASSOC_STA_HAS_LEFT: |
| return "DISASSOC_STA_HAS_LEFT"; |
| case STA_REQ_ASSOC_WITHOUT_AUTH: |
| return "STA_REQ_ASSOC_WITHOUT_AUTH"; |
| case PWR_CAPABILITY_NOT_VALID: |
| return "PWR_CAPABILITY_NOT_VALID"; |
| case SUPPORTED_CHANNEL_NOT_VALID: |
| return "SUPPORTED_CHANNEL_NOT_VALID"; |
| case BSS_TRANSITION_DISASSOC: |
| return "BSS_TRANSITION_DISASSOC"; |
| case INVALID_IE: |
| return "INVALID_IE"; |
| case MICHAEL_MIC_FAILURE: |
| return "MICHAEL_MIC_FAILURE"; |
| case FOURWAY_HANDSHAKE_TIMEOUT: |
| return "FOURWAY_HANDSHAKE_TIMEOUT"; |
| case GROUP_KEY_UPDATE_TIMEOUT: |
| return "GROUP_KEY_UPDATE_TIMEOUT"; |
| case IE_IN_4WAY_DIFFERS: |
| return "IE_IN_4WAY_DIFFERS"; |
| case GROUP_CIPHER_NOT_VALID: |
| return "GROUP_CIPHER_NOT_VALID"; |
| case PAIRWISE_CIPHER_NOT_VALID: |
| return "PAIRWISE_CIPHER_NOT_VALID"; |
| case AKMP_NOT_VALID: |
| return "AKMP_NOT_VALID"; |
| case UNSUPPORTED_RSN_IE_VERSION: |
| return "UNSUPPORTED_RSN_IE_VERSION"; |
| case INVALID_RSN_IE_CAPAB: |
| return "INVALID_RSN_IE_CAPAB"; |
| case IEEE_802_1X_AUTH_FAILED: |
| return "IEEE_802_1X_AUTH_FAILED"; |
| case CIPHER_SUITE_REJECTED: |
| return "CIPHER_SUITE_REJECTED"; |
| case TDLS_TEARDOWN_UNREACHABLE: |
| return "TDLS_TEARDOWN_UNREACHABLE"; |
| case TDLS_TEARDOWN_UNSPECIFIED: |
| return "TDLS_TEARDOWN_UNSPECIFIED"; |
| case SSP_REQUESTED_DISASSOC: |
| return "SSP_REQUESTED_DISASSOC"; |
| case NO_SSP_ROAMING_AGREEMENT: |
| return "NO_SSP_ROAMING_AGREEMENT"; |
| case BAD_CIPHER_OR_AKM: |
| return "BAD_CIPHER_OR_AKM"; |
| case NOT_AUTHORIZED_THIS_LOCATION: |
| return "NOT_AUTHORIZED_THIS_LOCATION"; |
| case SERVICE_CHANGE_PRECLUDES_TS: |
| return "SERVICE_CHANGE_PRECLUDES_TS"; |
| case UNSPECIFIED_QOS_REASON: |
| return "UNSPECIFIED_QOS_REASON"; |
| case NOT_ENOUGH_BANDWIDTH: |
| return "NOT_ENOUGH_BANDWIDTH"; |
| case DISASSOC_LOW_ACK: |
| return "DISASSOC_LOW_ACK"; |
| case EXCEEDED_TXOP: |
| return "EXCEEDED_TXOP"; |
| case STA_LEAVING: |
| return "STA_LEAVING"; |
| case END_TS_BA_DLS: |
| return "END_TS_BA_DLS"; |
| case UNKNOWN_TS_BA: |
| return "UNKNOWN_TS_BA"; |
| case TIMEOUT: |
| return "TIMEOUT"; |
| case PEERKEY_MISMATCH: |
| return "PEERKEY_MISMATCH"; |
| case AUTHORIZED_ACCESS_LIMIT_REACHED: |
| return "AUTHORIZED_ACCESS_LIMIT_REACHED"; |
| case EXTERNAL_SERVICE_REQUIREMENTS: |
| return "EXTERNAL_SERVICE_REQUIREMENTS"; |
| case INVALID_FT_ACTION_FRAME_COUNT: |
| return "INVALID_FT_ACTION_FRAME_COUNT"; |
| case INVALID_PMKID: |
| return "INVALID_PMKID"; |
| case INVALID_MDE: |
| return "INVALID_MDE"; |
| case INVALID_FTE: |
| return "INVALID_FTE"; |
| case MESH_PEERING_CANCELLED: |
| return "MESH_PEERING_CANCELLED"; |
| case MESH_MAX_PEERS: |
| return "MESH_MAX_PEERS"; |
| case MESH_CONFIG_POLICY_VIOLATION: |
| return "MESH_CONFIG_POLICY_VIOLATION"; |
| case MESH_CLOSE_RCVD: |
| return "MESH_CLOSE_RCVD"; |
| case MESH_MAX_RETRIES: |
| return "MESH_MAX_RETRIES"; |
| case MESH_CONFIRM_TIMEOUT: |
| return "MESH_CONFIRM_TIMEOUT"; |
| case MESH_INVALID_GTK: |
| return "MESH_INVALID_GTK"; |
| case MESH_INCONSISTENT_PARAMS: |
| return "MESH_INCONSISTENT_PARAMS"; |
| case MESH_INVALID_SECURITY_CAP: |
| return "MESH_INVALID_SECURITY_CAP"; |
| case MESH_PATH_ERROR_NO_PROXY_INFO: |
| return "MESH_PATH_ERROR_NO_PROXY_INFO"; |
| case MESH_PATH_ERROR_NO_FORWARDING_INFO: |
| return "MESH_PATH_ERROR_NO_FORWARDING_INFO"; |
| case MESH_PATH_ERROR_DEST_UNREACHABLE: |
| return "MESH_PATH_ERROR_DEST_UNREACHABLE"; |
| case MAC_ADDRESS_ALREADY_EXISTS_IN_MBSS: |
| return "MAC_ADDRESS_ALREADY_EXISTS_IN_MBSS"; |
| case MESH_CHANNEL_SWITCH_REGULATORY_REQ: |
| return "MESH_CHANNEL_SWITCH_REGULATORY_REQ"; |
| case MESH_CHANNEL_SWITCH_UNSPECIFIED: |
| return "MESH_CHANNEL_SWITCH_UNSPECIFIED"; |
| default: |
| return "Unknown StaIfaceReasonCode: " + code; |
| } |
| } |
| } |
| |
| protected static class StaIfaceStatusCode { |
| public static final int SUCCESS = 0; |
| public static final int UNSPECIFIED_FAILURE = 1; |
| public static final int TDLS_WAKEUP_ALTERNATE = 2; |
| public static final int TDLS_WAKEUP_REJECT = 3; |
| public static final int SECURITY_DISABLED = 5; |
| public static final int UNACCEPTABLE_LIFETIME = 6; |
| public static final int NOT_IN_SAME_BSS = 7; |
| public static final int CAPS_UNSUPPORTED = 10; |
| public static final int REASSOC_NO_ASSOC = 11; |
| public static final int ASSOC_DENIED_UNSPEC = 12; |
| public static final int NOT_SUPPORTED_AUTH_ALG = 13; |
| public static final int UNKNOWN_AUTH_TRANSACTION = 14; |
| public static final int CHALLENGE_FAIL = 15; |
| public static final int AUTH_TIMEOUT = 16; |
| public static final int AP_UNABLE_TO_HANDLE_NEW_STA = 17; |
| public static final int ASSOC_DENIED_RATES = 18; |
| public static final int ASSOC_DENIED_NOSHORT = 19; |
| public static final int SPEC_MGMT_REQUIRED = 22; |
| public static final int PWR_CAPABILITY_NOT_VALID = 23; |
| public static final int SUPPORTED_CHANNEL_NOT_VALID = 24; |
| public static final int ASSOC_DENIED_NO_SHORT_SLOT_TIME = 25; |
| public static final int ASSOC_DENIED_NO_HT = 27; |
| public static final int R0KH_UNREACHABLE = 28; |
| public static final int ASSOC_DENIED_NO_PCO = 29; |
| public static final int ASSOC_REJECTED_TEMPORARILY = 30; |
| public static final int ROBUST_MGMT_FRAME_POLICY_VIOLATION = 31; |
| public static final int UNSPECIFIED_QOS_FAILURE = 32; |
| public static final int DENIED_INSUFFICIENT_BANDWIDTH = 33; |
| public static final int DENIED_POOR_CHANNEL_CONDITIONS = 34; |
| public static final int DENIED_QOS_NOT_SUPPORTED = 35; |
| public static final int REQUEST_DECLINED = 37; |
| public static final int INVALID_PARAMETERS = 38; |
| public static final int REJECTED_WITH_SUGGESTED_CHANGES = 39; |
| public static final int INVALID_IE = 40; |
| public static final int GROUP_CIPHER_NOT_VALID = 41; |
| public static final int PAIRWISE_CIPHER_NOT_VALID = 42; |
| public static final int AKMP_NOT_VALID = 43; |
| public static final int UNSUPPORTED_RSN_IE_VERSION = 44; |
| public static final int INVALID_RSN_IE_CAPAB = 45; |
| public static final int CIPHER_REJECTED_PER_POLICY = 46; |
| public static final int TS_NOT_CREATED = 47; |
| public static final int DIRECT_LINK_NOT_ALLOWED = 48; |
| public static final int DEST_STA_NOT_PRESENT = 49; |
| public static final int DEST_STA_NOT_QOS_STA = 50; |
| public static final int ASSOC_DENIED_LISTEN_INT_TOO_LARGE = 51; |
| public static final int INVALID_FT_ACTION_FRAME_COUNT = 52; |
| public static final int INVALID_PMKID = 53; |
| public static final int INVALID_MDIE = 54; |
| public static final int INVALID_FTIE = 55; |
| public static final int REQUESTED_TCLAS_NOT_SUPPORTED = 56; |
| public static final int INSUFFICIENT_TCLAS_PROCESSING_RESOURCES = 57; |
| public static final int TRY_ANOTHER_BSS = 58; |
| public static final int GAS_ADV_PROTO_NOT_SUPPORTED = 59; |
| public static final int NO_OUTSTANDING_GAS_REQ = 60; |
| public static final int GAS_RESP_NOT_RECEIVED = 61; |
| public static final int STA_TIMED_OUT_WAITING_FOR_GAS_RESP = 62; |
| public static final int GAS_RESP_LARGER_THAN_LIMIT = 63; |
| public static final int REQ_REFUSED_HOME = 64; |
| public static final int ADV_SRV_UNREACHABLE = 65; |
| public static final int REQ_REFUSED_SSPN = 67; |
| public static final int REQ_REFUSED_UNAUTH_ACCESS = 68; |
| public static final int INVALID_RSNIE = 72; |
| public static final int U_APSD_COEX_NOT_SUPPORTED = 73; |
| public static final int U_APSD_COEX_MODE_NOT_SUPPORTED = 74; |
| public static final int BAD_INTERVAL_WITH_U_APSD_COEX = 75; |
| public static final int ANTI_CLOGGING_TOKEN_REQ = 76; |
| public static final int FINITE_CYCLIC_GROUP_NOT_SUPPORTED = 77; |
| public static final int CANNOT_FIND_ALT_TBTT = 78; |
| public static final int TRANSMISSION_FAILURE = 79; |
| public static final int REQ_TCLAS_NOT_SUPPORTED = 80; |
| public static final int TCLAS_RESOURCES_EXCHAUSTED = 81; |
| public static final int REJECTED_WITH_SUGGESTED_BSS_TRANSITION = 82; |
| public static final int REJECT_WITH_SCHEDULE = 83; |
| public static final int REJECT_NO_WAKEUP_SPECIFIED = 84; |
| public static final int SUCCESS_POWER_SAVE_MODE = 85; |
| public static final int PENDING_ADMITTING_FST_SESSION = 86; |
| public static final int PERFORMING_FST_NOW = 87; |
| public static final int PENDING_GAP_IN_BA_WINDOW = 88; |
| public static final int REJECT_U_PID_SETTING = 89; |
| public static final int REFUSED_EXTERNAL_REASON = 92; |
| public static final int REFUSED_AP_OUT_OF_MEMORY = 93; |
| public static final int REJECTED_EMERGENCY_SERVICE_NOT_SUPPORTED = 94; |
| public static final int QUERY_RESP_OUTSTANDING = 95; |
| public static final int REJECT_DSE_BAND = 96; |
| public static final int TCLAS_PROCESSING_TERMINATED = 97; |
| public static final int TS_SCHEDULE_CONFLICT = 98; |
| public static final int DENIED_WITH_SUGGESTED_BAND_AND_CHANNEL = 99; |
| public static final int MCCAOP_RESERVATION_CONFLICT = 100; |
| public static final int MAF_LIMIT_EXCEEDED = 101; |
| public static final int MCCA_TRACK_LIMIT_EXCEEDED = 102; |
| public static final int DENIED_DUE_TO_SPECTRUM_MANAGEMENT = 103; |
| public static final int ASSOC_DENIED_NO_VHT = 104; |
| public static final int ENABLEMENT_DENIED = 105; |
| public static final int RESTRICTION_FROM_AUTHORIZED_GDB = 106; |
| public static final int AUTHORIZATION_DEENABLED = 107; |
| public static final int FILS_AUTHENTICATION_FAILURE = 112; |
| public static final int UNKNOWN_AUTHENTICATION_SERVER = 113; |
| |
| public static String toString(int code) { |
| switch(code) { |
| case SUCCESS: |
| return "SUCCESS"; |
| case UNSPECIFIED_FAILURE: |
| return "UNSPECIFIED_FAILURE"; |
| case TDLS_WAKEUP_ALTERNATE: |
| return "TDLS_WAKEUP_ALTERNATE"; |
| case TDLS_WAKEUP_REJECT: |
| return "TDLS_WAKEUP_REJECT"; |
| case SECURITY_DISABLED: |
| return "SECURITY_DISABLED"; |
| case UNACCEPTABLE_LIFETIME: |
| return "UNACCEPTABLE_LIFETIME"; |
| case NOT_IN_SAME_BSS: |
| return "NOT_IN_SAME_BSS"; |
| case CAPS_UNSUPPORTED: |
| return "CAPS_UNSUPPORTED"; |
| case REASSOC_NO_ASSOC: |
| return "REASSOC_NO_ASSOC"; |
| case ASSOC_DENIED_UNSPEC: |
| return "ASSOC_DENIED_UNSPEC"; |
| case NOT_SUPPORTED_AUTH_ALG: |
| return "NOT_SUPPORTED_AUTH_ALG"; |
| case UNKNOWN_AUTH_TRANSACTION: |
| return "UNKNOWN_AUTH_TRANSACTION"; |
| case CHALLENGE_FAIL: |
| return "CHALLENGE_FAIL"; |
| case AUTH_TIMEOUT: |
| return "AUTH_TIMEOUT"; |
| case AP_UNABLE_TO_HANDLE_NEW_STA: |
| return "AP_UNABLE_TO_HANDLE_NEW_STA"; |
| case ASSOC_DENIED_RATES: |
| return "ASSOC_DENIED_RATES"; |
| case ASSOC_DENIED_NOSHORT: |
| return "ASSOC_DENIED_NOSHORT"; |
| case SPEC_MGMT_REQUIRED: |
| return "SPEC_MGMT_REQUIRED"; |
| case PWR_CAPABILITY_NOT_VALID: |
| return "PWR_CAPABILITY_NOT_VALID"; |
| case SUPPORTED_CHANNEL_NOT_VALID: |
| return "SUPPORTED_CHANNEL_NOT_VALID"; |
| case ASSOC_DENIED_NO_SHORT_SLOT_TIME: |
| return "ASSOC_DENIED_NO_SHORT_SLOT_TIME"; |
| case ASSOC_DENIED_NO_HT: |
| return "ASSOC_DENIED_NO_HT"; |
| case R0KH_UNREACHABLE: |
| return "R0KH_UNREACHABLE"; |
| case ASSOC_DENIED_NO_PCO: |
| return "ASSOC_DENIED_NO_PCO"; |
| case ASSOC_REJECTED_TEMPORARILY: |
| return "ASSOC_REJECTED_TEMPORARILY"; |
| case ROBUST_MGMT_FRAME_POLICY_VIOLATION: |
| return "ROBUST_MGMT_FRAME_POLICY_VIOLATION"; |
| case UNSPECIFIED_QOS_FAILURE: |
| return "UNSPECIFIED_QOS_FAILURE"; |
| case DENIED_INSUFFICIENT_BANDWIDTH: |
| return "DENIED_INSUFFICIENT_BANDWIDTH"; |
| case DENIED_POOR_CHANNEL_CONDITIONS: |
| return "DENIED_POOR_CHANNEL_CONDITIONS"; |
| case DENIED_QOS_NOT_SUPPORTED: |
| return "DENIED_QOS_NOT_SUPPORTED"; |
| case REQUEST_DECLINED: |
| return "REQUEST_DECLINED"; |
| case INVALID_PARAMETERS: |
| return "INVALID_PARAMETERS"; |
| case REJECTED_WITH_SUGGESTED_CHANGES: |
| return "REJECTED_WITH_SUGGESTED_CHANGES"; |
| case INVALID_IE: |
| return "INVALID_IE"; |
| case GROUP_CIPHER_NOT_VALID: |
| return "GROUP_CIPHER_NOT_VALID"; |
| case PAIRWISE_CIPHER_NOT_VALID: |
| return "PAIRWISE_CIPHER_NOT_VALID"; |
| case AKMP_NOT_VALID: |
| return "AKMP_NOT_VALID"; |
| case UNSUPPORTED_RSN_IE_VERSION: |
| return "UNSUPPORTED_RSN_IE_VERSION"; |
| case INVALID_RSN_IE_CAPAB: |
| return "INVALID_RSN_IE_CAPAB"; |
| case CIPHER_REJECTED_PER_POLICY: |
| return "CIPHER_REJECTED_PER_POLICY"; |
| case TS_NOT_CREATED: |
| return "TS_NOT_CREATED"; |
| case DIRECT_LINK_NOT_ALLOWED: |
| return "DIRECT_LINK_NOT_ALLOWED"; |
| case DEST_STA_NOT_PRESENT: |
| return "DEST_STA_NOT_PRESENT"; |
| case DEST_STA_NOT_QOS_STA: |
| return "DEST_STA_NOT_QOS_STA"; |
| case ASSOC_DENIED_LISTEN_INT_TOO_LARGE: |
| return "ASSOC_DENIED_LISTEN_INT_TOO_LARGE"; |
| case INVALID_FT_ACTION_FRAME_COUNT: |
| return "INVALID_FT_ACTION_FRAME_COUNT"; |
| case INVALID_PMKID: |
| return "INVALID_PMKID"; |
| case INVALID_MDIE: |
| return "INVALID_MDIE"; |
| case INVALID_FTIE: |
| return "INVALID_FTIE"; |
| case REQUESTED_TCLAS_NOT_SUPPORTED: |
| return "REQUESTED_TCLAS_NOT_SUPPORTED"; |
| case INSUFFICIENT_TCLAS_PROCESSING_RESOURCES: |
| return "INSUFFICIENT_TCLAS_PROCESSING_RESOURCES"; |
| case TRY_ANOTHER_BSS: |
| return "TRY_ANOTHER_BSS"; |
| case GAS_ADV_PROTO_NOT_SUPPORTED: |
| return "GAS_ADV_PROTO_NOT_SUPPORTED"; |
| case NO_OUTSTANDING_GAS_REQ: |
| return "NO_OUTSTANDING_GAS_REQ"; |
| case GAS_RESP_NOT_RECEIVED: |
| return "GAS_RESP_NOT_RECEIVED"; |
| case STA_TIMED_OUT_WAITING_FOR_GAS_RESP: |
| return "STA_TIMED_OUT_WAITING_FOR_GAS_RESP"; |
| case GAS_RESP_LARGER_THAN_LIMIT: |
| return "GAS_RESP_LARGER_THAN_LIMIT"; |
| case REQ_REFUSED_HOME: |
| return "REQ_REFUSED_HOME"; |
| case ADV_SRV_UNREACHABLE: |
| return "ADV_SRV_UNREACHABLE"; |
| case REQ_REFUSED_SSPN: |
| return "REQ_REFUSED_SSPN"; |
| case REQ_REFUSED_UNAUTH_ACCESS: |
| return "REQ_REFUSED_UNAUTH_ACCESS"; |
| case INVALID_RSNIE: |
| return "INVALID_RSNIE"; |
| case U_APSD_COEX_NOT_SUPPORTED: |
| return "U_APSD_COEX_NOT_SUPPORTED"; |
| case U_APSD_COEX_MODE_NOT_SUPPORTED: |
| return "U_APSD_COEX_MODE_NOT_SUPPORTED"; |
| case BAD_INTERVAL_WITH_U_APSD_COEX: |
| return "BAD_INTERVAL_WITH_U_APSD_COEX"; |
| case ANTI_CLOGGING_TOKEN_REQ: |
| return "ANTI_CLOGGING_TOKEN_REQ"; |
| case FINITE_CYCLIC_GROUP_NOT_SUPPORTED: |
| return "FINITE_CYCLIC_GROUP_NOT_SUPPORTED"; |
| case CANNOT_FIND_ALT_TBTT: |
| return "CANNOT_FIND_ALT_TBTT"; |
| case TRANSMISSION_FAILURE: |
| return "TRANSMISSION_FAILURE"; |
| case REQ_TCLAS_NOT_SUPPORTED: |
| return "REQ_TCLAS_NOT_SUPPORTED"; |
| case TCLAS_RESOURCES_EXCHAUSTED: |
| return "TCLAS_RESOURCES_EXCHAUSTED"; |
| case REJECTED_WITH_SUGGESTED_BSS_TRANSITION: |
| return "REJECTED_WITH_SUGGESTED_BSS_TRANSITION"; |
| case REJECT_WITH_SCHEDULE: |
| return "REJECT_WITH_SCHEDULE"; |
| case REJECT_NO_WAKEUP_SPECIFIED: |
| return "REJECT_NO_WAKEUP_SPECIFIED"; |
| case SUCCESS_POWER_SAVE_MODE: |
| return "SUCCESS_POWER_SAVE_MODE"; |
| case PENDING_ADMITTING_FST_SESSION: |
| return "PENDING_ADMITTING_FST_SESSION"; |
| case PERFORMING_FST_NOW: |
| return "PERFORMING_FST_NOW"; |
| case PENDING_GAP_IN_BA_WINDOW: |
| return "PENDING_GAP_IN_BA_WINDOW"; |
| case REJECT_U_PID_SETTING: |
| return "REJECT_U_PID_SETTING"; |
| case REFUSED_EXTERNAL_REASON: |
| return "REFUSED_EXTERNAL_REASON"; |
| case REFUSED_AP_OUT_OF_MEMORY: |
| return "REFUSED_AP_OUT_OF_MEMORY"; |
| case REJECTED_EMERGENCY_SERVICE_NOT_SUPPORTED: |
| return "REJECTED_EMERGENCY_SERVICE_NOT_SUPPORTED"; |
| case QUERY_RESP_OUTSTANDING: |
| return "QUERY_RESP_OUTSTANDING"; |
| case REJECT_DSE_BAND: |
| return "REJECT_DSE_BAND"; |
| case TCLAS_PROCESSING_TERMINATED: |
| return "TCLAS_PROCESSING_TERMINATED"; |
| case TS_SCHEDULE_CONFLICT: |
| return "TS_SCHEDULE_CONFLICT"; |
| case DENIED_WITH_SUGGESTED_BAND_AND_CHANNEL: |
| return "DENIED_WITH_SUGGESTED_BAND_AND_CHANNEL"; |
| case MCCAOP_RESERVATION_CONFLICT: |
| return "MCCAOP_RESERVATION_CONFLICT"; |
| case MAF_LIMIT_EXCEEDED: |
| return "MAF_LIMIT_EXCEEDED"; |
| case MCCA_TRACK_LIMIT_EXCEEDED: |
| return "MCCA_TRACK_LIMIT_EXCEEDED"; |
| case DENIED_DUE_TO_SPECTRUM_MANAGEMENT: |
| return "DENIED_DUE_TO_SPECTRUM_MANAGEMENT"; |
| case ASSOC_DENIED_NO_VHT: |
| return "ASSOC_DENIED_NO_VHT"; |
| case ENABLEMENT_DENIED: |
| return "ENABLEMENT_DENIED"; |
| case RESTRICTION_FROM_AUTHORIZED_GDB: |
| return "RESTRICTION_FROM_AUTHORIZED_GDB"; |
| case AUTHORIZATION_DEENABLED: |
| return "AUTHORIZATION_DEENABLED"; |
| case FILS_AUTHENTICATION_FAILURE: |
| return "FILS_AUTHENTICATION_FAILURE"; |
| case UNKNOWN_AUTHENTICATION_SERVER: |
| return "UNKNOWN_AUTHENTICATION_SERVER"; |
| default: |
| return "Unknown StaIfaceStatusCode: " + code; |
| } |
| } |
| } |
| |
| protected static final int SUPPLICANT_EVENT_CONNECTED = 0; |
| protected static final int SUPPLICANT_EVENT_DISCONNECTED = 1; |
| protected static final int SUPPLICANT_EVENT_ASSOCIATING = 2; |
| protected static final int SUPPLICANT_EVENT_ASSOCIATED = 3; |
| protected static final int SUPPLICANT_EVENT_EAP_METHOD_SELECTED = 4; |
| protected static final int SUPPLICANT_EVENT_EAP_FAILURE = 5; |
| protected static final int SUPPLICANT_EVENT_SSID_TEMP_DISABLED = 6; |
| protected static final int SUPPLICANT_EVENT_OPEN_SSL_FAILURE = 7; |
| |
| @IntDef(prefix = { "SUPPLICANT_EVENT_" }, value = { |
| SUPPLICANT_EVENT_CONNECTED, |
| SUPPLICANT_EVENT_DISCONNECTED, |
| SUPPLICANT_EVENT_ASSOCIATING, |
| SUPPLICANT_EVENT_ASSOCIATED, |
| SUPPLICANT_EVENT_EAP_METHOD_SELECTED, |
| SUPPLICANT_EVENT_EAP_FAILURE, |
| SUPPLICANT_EVENT_SSID_TEMP_DISABLED, |
| SUPPLICANT_EVENT_OPEN_SSL_FAILURE, |
| }) |
| @Retention(RetentionPolicy.SOURCE) |
| protected @interface SupplicantEventCode {} |
| |
| protected static String supplicantEventCodeToString(@SupplicantEventCode int eventCode) { |
| switch (eventCode) { |
| case SUPPLICANT_EVENT_CONNECTED: |
| return "CONNECTED"; |
| case SUPPLICANT_EVENT_DISCONNECTED: |
| return "DISCONNECTED"; |
| case SUPPLICANT_EVENT_ASSOCIATING: |
| return "ASSOCIATING"; |
| case SUPPLICANT_EVENT_ASSOCIATED: |
| return "ASSOCIATED"; |
| case SUPPLICANT_EVENT_EAP_METHOD_SELECTED: |
| return "EAP_METHOD_SELECTED"; |
| case SUPPLICANT_EVENT_EAP_FAILURE: |
| return "EAP_FAILURE"; |
| case SUPPLICANT_EVENT_SSID_TEMP_DISABLED: |
| return "SSID_TEMP_DISABLED"; |
| case SUPPLICANT_EVENT_OPEN_SSL_FAILURE: |
| return "OPEN_SSL_FAILURE"; |
| default: |
| return "Invalid SupplicantEventCode: " + eventCode; |
| } |
| } |
| |
| protected static final int QOS_POLICY_REQUEST_ADD = 0; |
| protected static final int QOS_POLICY_REQUEST_REMOVE = 1; |
| |
| @IntDef(prefix = { "QOS_POLICY_REQUEST_" }, value = { |
| QOS_POLICY_REQUEST_ADD, |
| QOS_POLICY_REQUEST_REMOVE |
| }) |
| @Retention(RetentionPolicy.SOURCE) |
| protected @interface QosPolicyRequestType {} |
| |
| protected static class QosPolicyRequest { |
| public final byte policyId; |
| public final @QosPolicyRequestType int requestType; |
| public final byte dscp; |
| public final QosPolicyClassifierParams classifierParams; |
| |
| public QosPolicyRequest(byte halPolicyId, @QosPolicyRequestType int halRequestType, |
| byte halDscp, @NonNull QosPolicyClassifierParams frameworkClassifierParams) { |
| policyId = halPolicyId; |
| dscp = halDscp; |
| requestType = halRequestType; |
| classifierParams = frameworkClassifierParams; |
| } |
| |
| public boolean isAddRequest() { |
| return requestType == QOS_POLICY_REQUEST_ADD; |
| } |
| |
| public boolean isRemoveRequest() { |
| return requestType == QOS_POLICY_REQUEST_REMOVE; |
| } |
| |
| @Override |
| public String toString() { |
| return "policyId: " + policyId + ", isAddRequest: " + this.isAddRequest() |
| + ", isRemoveRequest: " + this.isRemoveRequest() + ", dscp: " + dscp |
| + ", classifierParams: {" + classifierParams + "}"; |
| } |
| } |
| |
| protected static class QosPolicyClassifierParams { |
| public InetAddress srcIp = null; |
| public InetAddress dstIp = null; |
| public Range dstPortRange = null; |
| public final int srcPort; |
| public final int protocol; |
| |
| public final boolean hasSrcIp; |
| public final boolean hasDstIp; |
| public boolean isValid = true; |
| |
| public QosPolicyClassifierParams(boolean halHasSrcIp, byte[] halSrcIp, boolean halHasDstIp, |
| byte[] halDstIp, int halSrcPort, @NonNull int[] halDstPortRange, |
| int halProtocol) { |
| srcPort = halSrcPort; |
| protocol = halProtocol; |
| |
| hasSrcIp = halHasSrcIp; |
| if (hasSrcIp) { |
| try { |
| srcIp = InetAddress.getByAddress(halSrcIp); |
| } catch (UnknownHostException e) { |
| isValid = false; |
| } |
| } |
| |
| hasDstIp = halHasDstIp; |
| if (hasDstIp) { |
| try { |
| dstIp = InetAddress.getByAddress(halDstIp); |
| } catch (UnknownHostException e) { |
| isValid = false; |
| } |
| } |
| |
| if (halDstPortRange[0] > halDstPortRange[1]) { |
| isValid = false; |
| } else { |
| dstPortRange = new Range(halDstPortRange[0], halDstPortRange[1]); |
| } |
| } |
| |
| @Override |
| public String toString() { |
| return "isValid: " + isValid + ", hasSrcIp: " + hasSrcIp + ", hasDstIp: " + hasDstIp |
| + ", srcIp: " + srcIp + ", dstIp: " + dstIp + ", dstPortRange: " + dstPortRange |
| + ", srcPort: " + srcPort + ", protocol: " + protocol; |
| } |
| } |
| |
| protected static class QosPolicyStatus { |
| public final int policyId; |
| public final int dscpPolicyStatus; |
| |
| public QosPolicyStatus(int id, int status) { |
| policyId = id; |
| dscpPolicyStatus = status; |
| } |
| } |
| |
| public SupplicantStaIfaceHal(Context context, WifiMonitor monitor, |
| FrameworkFacade frameworkFacade, Handler handler, |
| Clock clock, WifiMetrics wifiMetrics, |
| WifiGlobals wifiGlobals) { |
| mContext = context; |
| mWifiMonitor = monitor; |
| mFrameworkFacade = frameworkFacade; |
| mEventHandler = handler; |
| mClock = clock; |
| mWifiMetrics = wifiMetrics; |
| mWifiGlobals = wifiGlobals; |
| mStaIfaceHal = createStaIfaceHalMockable(); |
| if (mStaIfaceHal == null) { |
| Log.wtf(TAG, "Failed to get internal ISupplicantStaIfaceHal instance."); |
| } |
| } |
| |
| /** |
| * Enable/Disable verbose logging. |
| * @param verboseEnabled Verbose flag set in overlay XML. |
| * @param halVerboseEnabled Verbose flag set by the user. |
| */ |
| void enableVerboseLogging(boolean verboseEnabled, boolean halVerboseEnabled) { |
| synchronized (mLock) { |
| if (mStaIfaceHal != null) { |
| mStaIfaceHal.enableVerboseLogging(verboseEnabled, halVerboseEnabled); |
| } |
| } |
| } |
| |
| /** |
| * Initialize the STA Iface HAL. Creates the internal ISupplicantStaIfaceHal |
| * object and calls its initialize method. |
| * |
| * @return true if the initialization succeeded |
| */ |
| public boolean initialize() { |
| synchronized (mLock) { |
| if (mStaIfaceHal == null) { |
| Log.wtf(TAG, "Internal ISupplicantStaIfaceHal instance does not exist."); |
| return false; |
| } |
| if (!mStaIfaceHal.initialize()) { |
| Log.e(TAG, "Failed to init ISupplicantStaIfaceHal, stopping startup."); |
| return false; |
| } |
| return true; |
| } |
| } |
| |
| /** |
| * Wrapper function to create the ISupplicantStaIfaceHal object. |
| * Created to be mockable in unit tests. |
| */ |
| @VisibleForTesting |
| protected ISupplicantStaIfaceHal createStaIfaceHalMockable() { |
| synchronized (mLock) { |
| // Prefer AIDL implementation if service is declared. |
| if (SupplicantStaIfaceHalAidlImpl.serviceDeclared()) { |
| Log.i(TAG, "Initializing SupplicantStaIfaceHal using AIDL implementation."); |
| return new SupplicantStaIfaceHalAidlImpl(mContext, mWifiMonitor, |
| mEventHandler, mClock, mWifiMetrics, mWifiGlobals); |
| |
| } else if (SupplicantStaIfaceHalHidlImpl.serviceDeclared()) { |
| Log.i(TAG, "Initializing SupplicantStaIfaceHal using HIDL implementation."); |
| return new SupplicantStaIfaceHalHidlImpl(mContext, mWifiMonitor, mFrameworkFacade, |
| mEventHandler, mClock, mWifiMetrics, mWifiGlobals); |
| } |
| Log.e(TAG, "No HIDL or AIDL service available for SupplicantStaIfaceHal."); |
| return null; |
| } |
| } |
| |
| /** |
| * Setup a STA interface for the specified iface name. |
| * |
| * @param ifaceName Name of the interface. |
| * @return true on success, false otherwise. |
| */ |
| public boolean setupIface(@NonNull String ifaceName) { |
| synchronized (mLock) { |
| String methodStr = "setupIface"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.setupIface(ifaceName); |
| } |
| } |
| |
| /** |
| * Teardown a STA interface for the specified iface name. |
| * |
| * @param ifaceName Name of the interface. |
| * @return true on success, false otherwise. |
| */ |
| public boolean teardownIface(@NonNull String ifaceName) { |
| synchronized (mLock) { |
| String methodStr = "teardownIface"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.teardownIface(ifaceName); |
| } |
| } |
| |
| /** |
| * Registers a death notification for supplicant. |
| * @return Returns true on success. |
| */ |
| public boolean registerDeathHandler(@NonNull WifiNative.SupplicantDeathEventHandler handler) { |
| synchronized (mLock) { |
| String methodStr = "registerDeathHandler"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.registerDeathHandler(handler); |
| } |
| } |
| |
| /** |
| * Deregisters a death notification for supplicant. |
| * @return Returns true on success. |
| */ |
| public boolean deregisterDeathHandler() { |
| synchronized (mLock) { |
| String methodStr = "deregisterDeathHandler"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.deregisterDeathHandler(); |
| } |
| } |
| |
| /** |
| * Signals whether initialization started successfully. |
| */ |
| public boolean isInitializationStarted() { |
| synchronized (mLock) { |
| String methodStr = "isInitializationStarted"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.isInitializationStarted(); |
| } |
| } |
| |
| /** |
| * Signals whether initialization completed successfully. |
| */ |
| public boolean isInitializationComplete() { |
| synchronized (mLock) { |
| String methodStr = "isInitializationComplete"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.isInitializationComplete(); |
| } |
| } |
| |
| /** |
| * Start the supplicant daemon. |
| * |
| * @return true on success, false otherwise. |
| */ |
| public boolean startDaemon() { |
| synchronized (mLock) { |
| String methodStr = "startDaemon"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.startDaemon(); |
| } |
| } |
| |
| /** |
| * Terminate the supplicant daemon & wait for its death. |
| */ |
| public void terminate() { |
| synchronized (mLock) { |
| String methodStr = "terminate"; |
| if (mStaIfaceHal == null) { |
| handleNullHal(methodStr); |
| return; |
| } |
| mStaIfaceHal.terminate(); |
| } |
| } |
| |
| /** |
| * Add the provided network configuration to wpa_supplicant and initiate connection to it. |
| * This method does the following: |
| * 1. If |config| is different to the current supplicant network, removes all supplicant |
| * networks and saves |config|. |
| * 2. Select the new network in wpa_supplicant. |
| * |
| * @param ifaceName Name of the interface. |
| * @param config WifiConfiguration parameters for the provided network. |
| * @return {@code true} if it succeeds, {@code false} otherwise |
| */ |
| public boolean connectToNetwork(@NonNull String ifaceName, @NonNull WifiConfiguration config) { |
| synchronized (mLock) { |
| String methodStr = "connectToNetwork"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.connectToNetwork(ifaceName, config); |
| } |
| } |
| |
| /** |
| * Initiates roaming to the already configured network in wpa_supplicant. If the network |
| * configuration provided does not match the already configured network, then this triggers |
| * a new connection attempt (instead of roam). |
| * |
| * @param ifaceName Name of the interface. |
| * @param config WifiConfiguration parameters for the provided network. |
| * @return {@code true} if it succeeds, {@code false} otherwise |
| */ |
| public boolean roamToNetwork(@NonNull String ifaceName, WifiConfiguration config) { |
| synchronized (mLock) { |
| String methodStr = "roamToNetwork"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.roamToNetwork(ifaceName, config); |
| } |
| } |
| |
| /** |
| * Clean HAL cached data for |networkId| in the framework. |
| * |
| * @param networkId Network id of the network to be removed from supplicant. |
| */ |
| public void removeNetworkCachedData(int networkId) { |
| synchronized (mLock) { |
| String methodStr = "removeNetworkCachedData"; |
| if (mStaIfaceHal == null) { |
| handleNullHal(methodStr); |
| return; |
| } |
| mStaIfaceHal.removeNetworkCachedData(networkId); |
| } |
| } |
| |
| /** |
| * Clear HAL cached data if MAC address is changed. |
| * |
| * @param networkId Network id of the network to be checked. |
| * @param curMacAddress Current MAC address |
| */ |
| public void removeNetworkCachedDataIfNeeded(int networkId, MacAddress curMacAddress) { |
| synchronized (mLock) { |
| String methodStr = "removeNetworkCachedDataIfNeeded"; |
| if (mStaIfaceHal == null) { |
| handleNullHal(methodStr); |
| return; |
| } |
| mStaIfaceHal.removeNetworkCachedDataIfNeeded(networkId, curMacAddress); |
| } |
| } |
| |
| /** |
| * Remove all networks from supplicant |
| * |
| * @param ifaceName Name of the interface. |
| */ |
| public boolean removeAllNetworks(@NonNull String ifaceName) { |
| synchronized (mLock) { |
| String methodStr = "removeAllNetworks"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.removeAllNetworks(ifaceName); |
| } |
| } |
| |
| /** |
| * Disable the current network in supplicant |
| * |
| * @param ifaceName Name of the interface. |
| */ |
| public boolean disableCurrentNetwork(@NonNull String ifaceName) { |
| synchronized (mLock) { |
| String methodStr = "disableCurrentNetwork"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.disableCurrentNetwork(ifaceName); |
| } |
| } |
| |
| /** |
| * Set the currently configured network's bssid. |
| * |
| * @param ifaceName Name of the interface. |
| * @param bssidStr Bssid to set in the form of "XX:XX:XX:XX:XX:XX" |
| * @return true if succeeds, false otherwise. |
| */ |
| public boolean setCurrentNetworkBssid(@NonNull String ifaceName, String bssidStr) { |
| synchronized (mLock) { |
| String methodStr = "setCurrentNetworkBssid"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.setCurrentNetworkBssid(ifaceName, bssidStr); |
| } |
| } |
| |
| /** |
| * Get the currently configured network's WPS NFC token. |
| * |
| * @param ifaceName Name of the interface. |
| * @return Hex string corresponding to the WPS NFC token. |
| */ |
| public String getCurrentNetworkWpsNfcConfigurationToken(@NonNull String ifaceName) { |
| synchronized (mLock) { |
| String methodStr = "getCurrentNetworkWpsNfcConfigurationToken"; |
| if (mStaIfaceHal == null) { |
| handleNullHal(methodStr); |
| return null; |
| } |
| return mStaIfaceHal.getCurrentNetworkWpsNfcConfigurationToken(ifaceName); |
| } |
| } |
| |
| /** |
| * Get the eap anonymous identity for the currently configured network. |
| * |
| * @param ifaceName Name of the interface. |
| * @return anonymous identity string if succeeds, null otherwise. |
| */ |
| public String getCurrentNetworkEapAnonymousIdentity(@NonNull String ifaceName) { |
| synchronized (mLock) { |
| String methodStr = "getCurrentNetworkEapAnonymousIdentity"; |
| if (mStaIfaceHal == null) { |
| handleNullHal(methodStr); |
| return null; |
| } |
| return mStaIfaceHal.getCurrentNetworkEapAnonymousIdentity(ifaceName); |
| } |
| } |
| |
| /** |
| * Send the eap identity response for the currently configured network. |
| * |
| * @param ifaceName Name of the interface. |
| * @param identity Identity used for EAP-Identity |
| * @param encryptedIdentity Encrypted identity used for EAP-AKA/EAP-SIM |
| * @return true if succeeds, false otherwise. |
| */ |
| public boolean sendCurrentNetworkEapIdentityResponse( |
| @NonNull String ifaceName, @NonNull String identity, String encryptedIdentity) { |
| synchronized (mLock) { |
| String methodStr = "sendCurrentNetworkEapIdentityResponse"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.sendCurrentNetworkEapIdentityResponse( |
| ifaceName, identity, encryptedIdentity); |
| } |
| } |
| |
| /** |
| * Send the eap sim gsm auth response for the currently configured network. |
| * |
| * @param ifaceName Name of the interface. |
| * @param paramsStr String to send. |
| * @return true if succeeds, false otherwise. |
| */ |
| public boolean sendCurrentNetworkEapSimGsmAuthResponse( |
| @NonNull String ifaceName, String paramsStr) { |
| synchronized (mLock) { |
| String methodStr = "sendCurrentNetworkEapSimGsmAuthResponse"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.sendCurrentNetworkEapSimGsmAuthResponse(ifaceName, paramsStr); |
| } |
| } |
| |
| /** |
| * Send the eap sim gsm auth failure for the currently configured network. |
| * |
| * @param ifaceName Name of the interface. |
| * @return true if succeeds, false otherwise. |
| */ |
| public boolean sendCurrentNetworkEapSimGsmAuthFailure(@NonNull String ifaceName) { |
| synchronized (mLock) { |
| String methodStr = "sendCurrentNetworkEapSimGsmAuthFailure"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.sendCurrentNetworkEapSimGsmAuthFailure(ifaceName); |
| } |
| } |
| |
| /** |
| * Send the eap sim umts auth response for the currently configured network. |
| * |
| * @param ifaceName Name of the interface. |
| * @param paramsStr String to send. |
| * @return true if succeeds, false otherwise. |
| */ |
| public boolean sendCurrentNetworkEapSimUmtsAuthResponse( |
| @NonNull String ifaceName, String paramsStr) { |
| synchronized (mLock) { |
| String methodStr = "sendCurrentNetworkEapSimUmtsAuthResponse"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.sendCurrentNetworkEapSimUmtsAuthResponse(ifaceName, paramsStr); |
| } |
| } |
| |
| /** |
| * Send the eap sim umts auts response for the currently configured network. |
| * |
| * @param ifaceName Name of the interface. |
| * @param paramsStr String to send. |
| * @return true if succeeds, false otherwise. |
| */ |
| public boolean sendCurrentNetworkEapSimUmtsAutsResponse( |
| @NonNull String ifaceName, String paramsStr) { |
| synchronized (mLock) { |
| String methodStr = "sendCurrentNetworkEapSimUmtsAutsResponse"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.sendCurrentNetworkEapSimUmtsAutsResponse(ifaceName, paramsStr); |
| } |
| } |
| |
| /** |
| * Send the eap sim umts auth failure for the currently configured network. |
| * |
| * @param ifaceName Name of the interface. |
| * @return true if succeeds, false otherwise. |
| */ |
| public boolean sendCurrentNetworkEapSimUmtsAuthFailure(@NonNull String ifaceName) { |
| synchronized (mLock) { |
| String methodStr = "sendCurrentNetworkEapSimUmtsAuthFailure"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.sendCurrentNetworkEapSimUmtsAuthFailure(ifaceName); |
| } |
| } |
| |
| /** |
| * Set WPS device name. |
| * |
| * @param ifaceName Name of the interface. |
| * @param deviceName String to be set. |
| * @return true if request is sent successfully, false otherwise. |
| */ |
| public boolean setWpsDeviceName(@NonNull String ifaceName, String deviceName) { |
| synchronized (mLock) { |
| String methodStr = "setWpsDeviceName"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.setWpsDeviceName(ifaceName, deviceName); |
| } |
| } |
| |
| /** |
| * Set WPS device type. |
| * |
| * @param ifaceName Name of the interface. |
| * @param typeStr Type specified as a string. Used format: <categ>-<OUI>-<subcateg> |
| * @return true if request is sent successfully, false otherwise. |
| */ |
| public boolean setWpsDeviceType(@NonNull String ifaceName, String typeStr) { |
| synchronized (mLock) { |
| String methodStr = "setWpsDeviceType"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.setWpsDeviceType(ifaceName, typeStr); |
| } |
| } |
| |
| /** |
| * Set WPS manufacturer. |
| * |
| * @param ifaceName Name of the interface. |
| * @param manufacturer String to be set. |
| * @return true if request is sent successfully, false otherwise. |
| */ |
| public boolean setWpsManufacturer(@NonNull String ifaceName, String manufacturer) { |
| synchronized (mLock) { |
| String methodStr = "setWpsManufacturer"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.setWpsManufacturer(ifaceName, manufacturer); |
| } |
| } |
| |
| /** |
| * Set WPS model name. |
| * |
| * @param ifaceName Name of the interface. |
| * @param modelName String to be set. |
| * @return true if request is sent successfully, false otherwise. |
| */ |
| public boolean setWpsModelName(@NonNull String ifaceName, String modelName) { |
| synchronized (mLock) { |
| String methodStr = "setWpsModelName"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.setWpsModelName(ifaceName, modelName); |
| } |
| } |
| |
| /** |
| * Set WPS model number. |
| * |
| * @param ifaceName Name of the interface. |
| * @param modelNumber String to be set. |
| * @return true if request is sent successfully, false otherwise. |
| */ |
| public boolean setWpsModelNumber(@NonNull String ifaceName, String modelNumber) { |
| synchronized (mLock) { |
| String methodStr = "setWpsModelNumber"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.setWpsModelNumber(ifaceName, modelNumber); |
| } |
| } |
| |
| /** |
| * Set WPS serial number. |
| * |
| * @param ifaceName Name of the interface. |
| * @param serialNumber String to be set. |
| * @return true if request is sent successfully, false otherwise. |
| */ |
| public boolean setWpsSerialNumber(@NonNull String ifaceName, String serialNumber) { |
| synchronized (mLock) { |
| String methodStr = "setWpsSerialNumber"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.setWpsSerialNumber(ifaceName, serialNumber); |
| } |
| } |
| |
| /** |
| * Set WPS config methods |
| * |
| * @param ifaceName Name of the interface. |
| * @param configMethodsStr List of config methods. |
| * @return true if request is sent successfully, false otherwise. |
| */ |
| public boolean setWpsConfigMethods(@NonNull String ifaceName, String configMethodsStr) { |
| synchronized (mLock) { |
| String methodStr = "setWpsConfigMethods"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.setWpsConfigMethods(ifaceName, configMethodsStr); |
| } |
| } |
| |
| /** |
| * Trigger a reassociation even if the iface is currently connected. |
| * |
| * @param ifaceName Name of the interface. |
| * @return true if request is sent successfully, false otherwise. |
| */ |
| public boolean reassociate(@NonNull String ifaceName) { |
| synchronized (mLock) { |
| String methodStr = "reassociate"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.reassociate(ifaceName); |
| } |
| } |
| |
| /** |
| * Trigger a reconnection if the iface is disconnected. |
| * |
| * @param ifaceName Name of the interface. |
| * @return true if request is sent successfully, false otherwise. |
| */ |
| public boolean reconnect(@NonNull String ifaceName) { |
| synchronized (mLock) { |
| String methodStr = "reconnect"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.reconnect(ifaceName); |
| } |
| } |
| |
| /** |
| * Trigger a disconnection from the currently connected network. |
| * |
| * @param ifaceName Name of the interface. |
| * @return true if request is sent successfully, false otherwise. |
| */ |
| public boolean disconnect(@NonNull String ifaceName) { |
| synchronized (mLock) { |
| String methodStr = "disconnect"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.disconnect(ifaceName); |
| } |
| } |
| |
| /** |
| * Enable or disable power save mode. |
| * |
| * @param ifaceName Name of the interface. |
| * @param enable true to enable, false to disable. |
| * @return true if request is sent successfully, false otherwise. |
| */ |
| public boolean setPowerSave(@NonNull String ifaceName, boolean enable) { |
| synchronized (mLock) { |
| String methodStr = "setPowerSave"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.setPowerSave(ifaceName, enable); |
| } |
| } |
| |
| /** |
| * Initiate TDLS discover with the specified AP. |
| * |
| * @param ifaceName Name of the interface. |
| * @param macAddress MAC Address of the AP. |
| * @return true if request is sent successfully, false otherwise. |
| */ |
| public boolean initiateTdlsDiscover(@NonNull String ifaceName, String macAddress) { |
| synchronized (mLock) { |
| String methodStr = "initiateTdlsDiscover"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.initiateTdlsDiscover(ifaceName, macAddress); |
| } |
| } |
| |
| /** |
| * Initiate TDLS setup with the specified AP. |
| * |
| * @param ifaceName Name of the interface. |
| * @param macAddress MAC Address of the AP. |
| * @return true if request is sent successfully, false otherwise. |
| */ |
| public boolean initiateTdlsSetup(@NonNull String ifaceName, String macAddress) { |
| synchronized (mLock) { |
| String methodStr = "initiateTdlsSetup"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.initiateTdlsSetup(ifaceName, macAddress); |
| } |
| } |
| |
| /** |
| * Initiate TDLS teardown with the specified AP. |
| * @param ifaceName Name of the interface. |
| * @param macAddress MAC Address of the AP. |
| * @return true if request is sent successfully, false otherwise. |
| */ |
| public boolean initiateTdlsTeardown(@NonNull String ifaceName, String macAddress) { |
| synchronized (mLock) { |
| String methodStr = "initiateTdlsTeardown"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.initiateTdlsTeardown(ifaceName, macAddress); |
| } |
| } |
| |
| /** |
| * Request the specified ANQP elements |elements| from the specified AP |bssid|. |
| * |
| * @param ifaceName Name of the interface. |
| * @param bssid BSSID of the AP |
| * @param infoElements ANQP elements to be queried. Refer to ISupplicantStaIface.AnqpInfoId. |
| * @param hs20SubTypes HS subtypes to be queried. Refer to ISupplicantStaIface.Hs20AnqpSubTypes. |
| * @return true if request is sent successfully, false otherwise. |
| */ |
| public boolean initiateAnqpQuery(@NonNull String ifaceName, String bssid, |
| ArrayList<Short> infoElements, |
| ArrayList<Integer> hs20SubTypes) { |
| synchronized (mLock) { |
| String methodStr = "initiateAnqpQuery"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.initiateAnqpQuery(ifaceName, bssid, infoElements, hs20SubTypes); |
| } |
| } |
| |
| /** |
| * Request Venue URL ANQP element from the specified AP |bssid|. |
| * |
| * @param ifaceName Name of the interface. |
| * @param bssid BSSID of the AP |
| * @return true if request is sent successfully, false otherwise. |
| */ |
| public boolean initiateVenueUrlAnqpQuery(@NonNull String ifaceName, String bssid) { |
| synchronized (mLock) { |
| String methodStr = "initiateVenueUrlAnqpQuery"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.initiateVenueUrlAnqpQuery(ifaceName, bssid); |
| } |
| } |
| |
| /** |
| * Request the specified ANQP ICON from the specified AP |bssid|. |
| * |
| * @param ifaceName Name of the interface. |
| * @param bssid BSSID of the AP |
| * @param fileName Name of the file to request. |
| * @return true if request is sent successfully, false otherwise. |
| */ |
| public boolean initiateHs20IconQuery(@NonNull String ifaceName, String bssid, String fileName) { |
| synchronized (mLock) { |
| String methodStr = "initiateHs20IconQuery"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.initiateHs20IconQuery(ifaceName, bssid, fileName); |
| } |
| } |
| |
| /** |
| * Gets MAC address from the supplicant. |
| * |
| * @param ifaceName Name of the interface. |
| * @return string containing the MAC address, or null on a failed call |
| */ |
| public String getMacAddress(@NonNull String ifaceName) { |
| synchronized (mLock) { |
| String methodStr = "getMacAddress"; |
| if (mStaIfaceHal == null) { |
| handleNullHal(methodStr); |
| return null; |
| } |
| return mStaIfaceHal.getMacAddress(ifaceName); |
| } |
| } |
| |
| /** |
| * Start using the added RX filters. |
| * |
| * @param ifaceName Name of the interface. |
| * @return true if request is sent successfully, false otherwise. |
| */ |
| public boolean startRxFilter(@NonNull String ifaceName) { |
| synchronized (mLock) { |
| String methodStr = "startRxFilter"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.startRxFilter(ifaceName); |
| } |
| } |
| |
| /** |
| * Stop using the added RX filters. |
| * |
| * @param ifaceName Name of the interface. |
| * @return true if request is sent successfully, false otherwise. |
| */ |
| public boolean stopRxFilter(@NonNull String ifaceName) { |
| synchronized (mLock) { |
| String methodStr = "stopRxFilter"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.stopRxFilter(ifaceName); |
| } |
| } |
| |
| /** |
| * Add an RX filter. |
| * |
| * @param ifaceName Name of the interface. |
| * @param type one of {@link WifiNative#RX_FILTER_TYPE_V4_MULTICAST} |
| * {@link WifiNative#RX_FILTER_TYPE_V6_MULTICAST} values. |
| * @return true if request is sent successfully, false otherwise. |
| */ |
| public boolean addRxFilter(@NonNull String ifaceName, int type) { |
| synchronized (mLock) { |
| String methodStr = "addRxFilter"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.addRxFilter(ifaceName, type); |
| } |
| } |
| |
| /** |
| * Remove an RX filter. |
| * |
| * @param ifaceName Name of the interface. |
| * @param type one of {@link WifiNative#RX_FILTER_TYPE_V4_MULTICAST} |
| * {@link WifiNative#RX_FILTER_TYPE_V6_MULTICAST} values. |
| * @return true if request is sent successfully, false otherwise. |
| */ |
| public boolean removeRxFilter(@NonNull String ifaceName, int type) { |
| synchronized (mLock) { |
| String methodStr = "removeRxFilter"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.removeRxFilter(ifaceName, type); |
| } |
| } |
| |
| /** |
| * Set Bt coexistence mode. |
| * |
| * @param ifaceName Name of the interface. |
| * @param mode one of the above {@link WifiNative#BLUETOOTH_COEXISTENCE_MODE_DISABLED}, |
| * {@link WifiNative#BLUETOOTH_COEXISTENCE_MODE_ENABLED} or |
| * {@link WifiNative#BLUETOOTH_COEXISTENCE_MODE_SENSE}. |
| * @return true if request is sent successfully, false otherwise. |
| */ |
| public boolean setBtCoexistenceMode(@NonNull String ifaceName, int mode) { |
| synchronized (mLock) { |
| String methodStr = "setBtCoexistenceMode"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.setBtCoexistenceMode(ifaceName, mode); |
| } |
| } |
| |
| /** Enable or disable BT coexistence mode. |
| * |
| * @param ifaceName Name of the interface. |
| * @param enable true to enable, false to disable. |
| * @return true if request is sent successfully, false otherwise. |
| */ |
| public boolean setBtCoexistenceScanModeEnabled(@NonNull String ifaceName, boolean enable) { |
| synchronized (mLock) { |
| String methodStr = "setBtCoexistenceScanModeEnabled"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.setBtCoexistenceScanModeEnabled(ifaceName, enable); |
| } |
| } |
| |
| /** |
| * Enable or disable suspend mode optimizations. |
| * |
| * @param ifaceName Name of the interface. |
| * @param enable true to enable, false otherwise. |
| * @return true if request is sent successfully, false otherwise. |
| */ |
| public boolean setSuspendModeEnabled(@NonNull String ifaceName, boolean enable) { |
| synchronized (mLock) { |
| String methodStr = "setSuspendModeEnabled"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.setSuspendModeEnabled(ifaceName, enable); |
| } |
| } |
| |
| /** |
| * Set country code. |
| * |
| * @param ifaceName Name of the interface. |
| * @param codeStr 2 byte ASCII string. For ex: US, CA. |
| * @return true if request is sent successfully, false otherwise. |
| */ |
| public boolean setCountryCode(@NonNull String ifaceName, String codeStr) { |
| synchronized (mLock) { |
| String methodStr = "setCountryCode"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.setCountryCode(ifaceName, codeStr); |
| } |
| } |
| |
| /** |
| * Flush all previously configured HLPs. |
| * |
| * @param ifaceName Name of the interface. |
| * @return true if request is sent successfully, false otherwise. |
| */ |
| public boolean flushAllHlp(@NonNull String ifaceName) { |
| synchronized (mLock) { |
| String methodStr = "flushAllHlp"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.flushAllHlp(ifaceName); |
| } |
| } |
| |
| /** |
| * Set FILS HLP packet. |
| * |
| * @param ifaceName Name of the interface. |
| * @param dst Destination MAC address. |
| * @param hlpPacket Hlp Packet data in hex. |
| * @return true if request is sent successfully, false otherwise. |
| */ |
| public boolean addHlpReq(@NonNull String ifaceName, byte [] dst, byte [] hlpPacket) { |
| synchronized (mLock) { |
| String methodStr = "addHlpReq"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.addHlpReq(ifaceName, dst, hlpPacket); |
| } |
| } |
| |
| /** |
| * Start WPS pin registrar operation with the specified peer and pin. |
| * |
| * @param ifaceName Name of the interface. |
| * @param bssidStr BSSID of the peer. |
| * @param pin Pin to be used. |
| * @return true if request is sent successfully, false otherwise. |
| */ |
| public boolean startWpsRegistrar(@NonNull String ifaceName, String bssidStr, String pin) { |
| synchronized (mLock) { |
| String methodStr = "startWpsRegistrar"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.startWpsRegistrar(ifaceName, bssidStr, pin); |
| } |
| } |
| |
| /** |
| * Start WPS pin display operation with the specified peer. |
| * |
| * @param ifaceName Name of the interface. |
| * @param bssidStr BSSID of the peer. Use empty bssid to indicate wildcard. |
| * @return true if request is sent successfully, false otherwise. |
| */ |
| public boolean startWpsPbc(@NonNull String ifaceName, String bssidStr) { |
| synchronized (mLock) { |
| String methodStr = "startWpsPbc"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.startWpsPbc(ifaceName, bssidStr); |
| } |
| } |
| |
| /** |
| * Start WPS pin keypad operation with the specified pin. |
| * |
| * @param ifaceName Name of the interface. |
| * @param pin Pin to be used. |
| * @return true if request is sent successfully, false otherwise. |
| */ |
| public boolean startWpsPinKeypad(@NonNull String ifaceName, String pin) { |
| synchronized (mLock) { |
| String methodStr = "startWpsPinKeypad"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.startWpsPinKeypad(ifaceName, pin); |
| } |
| } |
| |
| /** |
| * Start WPS pin display operation with the specified peer. |
| * |
| * @param ifaceName Name of the interface. |
| * @param bssidStr BSSID of the peer. Use empty bssid to indicate wildcard. |
| * @return new pin generated on success, null otherwise. |
| */ |
| public String startWpsPinDisplay(@NonNull String ifaceName, String bssidStr) { |
| synchronized (mLock) { |
| String methodStr = "startWpsPinDisplay"; |
| if (mStaIfaceHal == null) { |
| handleNullHal(methodStr); |
| return null; |
| } |
| return mStaIfaceHal.startWpsPinDisplay(ifaceName, bssidStr); |
| } |
| } |
| |
| /** |
| * Cancels any ongoing WPS requests. |
| * |
| * @param ifaceName Name of the interface. |
| * @return true if request is sent successfully, false otherwise. |
| */ |
| public boolean cancelWps(@NonNull String ifaceName) { |
| synchronized (mLock) { |
| String methodStr = "cancelWps"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.cancelWps(ifaceName); |
| } |
| } |
| |
| /** |
| * Sets whether to use external sim for SIM/USIM processing. |
| * |
| * @param ifaceName Name of the interface. |
| * @param useExternalSim true to enable, false otherwise. |
| * @return true if request is sent successfully, false otherwise. |
| */ |
| public boolean setExternalSim(@NonNull String ifaceName, boolean useExternalSim) { |
| synchronized (mLock) { |
| String methodStr = "setExternalSim"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.setExternalSim(ifaceName, useExternalSim); |
| } |
| } |
| |
| /** |
| * Enable/Disable auto reconnect to networks. |
| * Use this to prevent wpa_supplicant from trying to connect to networks |
| * on its own. |
| * |
| * @param enable true to enable, false to disable. |
| * @return true if no exceptions occurred, false otherwise |
| */ |
| public boolean enableAutoReconnect(@NonNull String ifaceName, boolean enable) { |
| synchronized (mLock) { |
| String methodStr = "enableAutoReconnect"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.enableAutoReconnect(ifaceName, enable); |
| } |
| } |
| |
| /** |
| * Set the debug log level for wpa_supplicant |
| * |
| * @param turnOnVerbose Whether to turn on verbose logging or not. |
| * @return true if request is sent successfully, false otherwise. |
| */ |
| public boolean setLogLevel(boolean turnOnVerbose) { |
| synchronized (mLock) { |
| String methodStr = "setLogLevel"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.setLogLevel(turnOnVerbose); |
| } |
| } |
| |
| /** |
| * Set concurrency priority between P2P & STA operations. |
| * |
| * @param isStaHigherPriority Set to true to prefer STA over P2P during concurrency operations, |
| * false otherwise. |
| * @return true if request is sent successfully, false otherwise. |
| */ |
| public boolean setConcurrencyPriority(boolean isStaHigherPriority) { |
| synchronized (mLock) { |
| String methodStr = "setConcurrencyPriority"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.setConcurrencyPriority(isStaHigherPriority); |
| } |
| } |
| |
| /** |
| * Returns a bitmask of advanced capabilities: WPA3 SAE/SUITE B and OWE |
| * Bitmask used is: |
| * - WIFI_FEATURE_WPA3_SAE |
| * - WIFI_FEATURE_WPA3_SUITE_B |
| * - WIFI_FEATURE_OWE |
| * |
| * On error, or if these features are not supported, 0 is returned. |
| */ |
| public long getAdvancedCapabilities(@NonNull String ifaceName) { |
| synchronized (mLock) { |
| String methodStr = "getAdvancedCapabilities"; |
| if (mStaIfaceHal == null) { |
| handleNullHal(methodStr); |
| return 0; |
| } |
| return mStaIfaceHal.getAdvancedCapabilities(ifaceName); |
| } |
| } |
| |
| /** |
| * Get the driver supported features through supplicant. |
| * |
| * @param ifaceName Name of the interface. |
| * @return bitmask defined by WifiManager.WIFI_FEATURE_*. |
| */ |
| public long getWpaDriverFeatureSet(@NonNull String ifaceName) { |
| synchronized (mLock) { |
| String methodStr = "getWpaDriverFeatureSet"; |
| if (mStaIfaceHal == null) { |
| handleNullHal(methodStr); |
| return 0; |
| } |
| return mStaIfaceHal.getWpaDriverFeatureSet(ifaceName); |
| } |
| } |
| |
| /** |
| * Returns connection capabilities of the current network |
| * |
| * @param ifaceName Name of the interface. |
| * @return connection capabilities of the current network |
| */ |
| public WifiNative.ConnectionCapabilities getConnectionCapabilities(@NonNull String ifaceName) { |
| synchronized (mLock) { |
| String methodStr = "getConnectionCapabilities"; |
| if (mStaIfaceHal == null) { |
| handleNullHal(methodStr); |
| return new WifiNative.ConnectionCapabilities(); |
| } |
| return mStaIfaceHal.getConnectionCapabilities(ifaceName); |
| } |
| } |
| |
| /** |
| * Returns connection MLO links info |
| * |
| * @param ifaceName Name of the interface. |
| * @return connection MLO links info |
| */ |
| public WifiNative.ConnectionMloLinksInfo getConnectionMloLinksInfo(@NonNull String ifaceName) { |
| synchronized (mLock) { |
| String methodStr = "getConnectionMloLinksInfo"; |
| if (mStaIfaceHal == null) { |
| handleNullHal(methodStr); |
| return null; |
| } |
| return mStaIfaceHal.getConnectionMloLinksInfo(ifaceName); |
| } |
| } |
| |
| /** |
| * Adds a DPP peer URI to the URI list. |
| * |
| * Returns an ID to be used later to refer to this URI (>0). |
| * On error, or if these features are not supported, -1 is returned. |
| */ |
| public int addDppPeerUri(@NonNull String ifaceName, @NonNull String uri) { |
| synchronized (mLock) { |
| String methodStr = "addDppPeerUri"; |
| if (mStaIfaceHal == null) { |
| handleNullHal(methodStr); |
| return -1; |
| } |
| return mStaIfaceHal.addDppPeerUri(ifaceName, uri); |
| } |
| } |
| |
| /** |
| * Removes a DPP URI to the URI list given an ID. |
| * |
| * Returns true when operation is successful |
| * On error, or if these features are not supported, false is returned. |
| */ |
| public boolean removeDppUri(@NonNull String ifaceName, int bootstrapId) { |
| synchronized (mLock) { |
| String methodStr = "removeDppUri"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.removeDppUri(ifaceName, bootstrapId); |
| } |
| } |
| |
| /** |
| * Stops/aborts DPP Initiator request |
| * |
| * Returns true when operation is successful |
| * On error, or if these features are not supported, false is returned. |
| */ |
| public boolean stopDppInitiator(@NonNull String ifaceName) { |
| synchronized (mLock) { |
| String methodStr = "stopDppInitiator"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.stopDppInitiator(ifaceName); |
| } |
| } |
| |
| /** |
| * Starts DPP Configurator-Initiator request |
| * |
| * Returns true when operation is successful |
| * On error, or if these features are not supported, false is returned. |
| */ |
| public boolean startDppConfiguratorInitiator(@NonNull String ifaceName, int peerBootstrapId, |
| int ownBootstrapId, @NonNull String ssid, String password, String psk, |
| int netRole, int securityAkm, byte[] privEcKey) { |
| synchronized (mLock) { |
| String methodStr = "startDppConfiguratorInitiator"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.startDppConfiguratorInitiator(ifaceName, peerBootstrapId, |
| ownBootstrapId, ssid, password, psk, netRole, securityAkm, privEcKey); |
| } |
| } |
| |
| /** |
| * Starts DPP Enrollee-Initiator request |
| * |
| * Returns true when operation is successful |
| * On error, or if these features are not supported, false is returned. |
| */ |
| public boolean startDppEnrolleeInitiator(@NonNull String ifaceName, int peerBootstrapId, |
| int ownBootstrapId) { |
| synchronized (mLock) { |
| String methodStr = "startDppEnrolleeInitiator"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.startDppEnrolleeInitiator( |
| ifaceName, peerBootstrapId, ownBootstrapId); |
| } |
| } |
| |
| /** |
| * Generate a DPP QR code based on boot strap info |
| * |
| * Returns DppBootstrapQrCodeInfo |
| */ |
| public WifiNative.DppBootstrapQrCodeInfo generateDppBootstrapInfoForResponder( |
| @NonNull String ifaceName, String macAddress, @NonNull String deviceInfo, |
| int dppCurve) { |
| synchronized (mLock) { |
| String methodStr = "generateDppBootstrapInfoForResponder"; |
| if (mStaIfaceHal == null) { |
| handleNullHal(methodStr); |
| return new WifiNative.DppBootstrapQrCodeInfo(); |
| } |
| return mStaIfaceHal.generateDppBootstrapInfoForResponder( |
| ifaceName, macAddress, deviceInfo, dppCurve); |
| } |
| } |
| |
| /** |
| * Starts DPP Enrollee-Responder request |
| * |
| * Returns true when operation is successful |
| * On error, or if these features are not supported, false is returned. |
| */ |
| public boolean startDppEnrolleeResponder(@NonNull String ifaceName, int listenChannel) { |
| synchronized (mLock) { |
| String methodStr = "startDppEnrolleeResponder"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.startDppEnrolleeResponder(ifaceName, listenChannel); |
| } |
| } |
| |
| /** |
| * Stops/aborts DPP Responder request. |
| * |
| * Returns true when operation is successful |
| * On error, or if these features are not supported, false is returned. |
| */ |
| public boolean stopDppResponder(@NonNull String ifaceName, int ownBootstrapId) { |
| synchronized (mLock) { |
| String methodStr = "stopDppResponder"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.stopDppResponder(ifaceName, ownBootstrapId); |
| } |
| } |
| |
| /** |
| * Register callbacks for DPP events. |
| * |
| * @param dppCallback DPP callback object. |
| */ |
| public void registerDppCallback(WifiNative.DppEventCallback dppCallback) { |
| synchronized (mLock) { |
| String methodStr = "registerDppCallback"; |
| if (mStaIfaceHal == null) { |
| handleNullHal(methodStr); |
| return; |
| } |
| mStaIfaceHal.registerDppCallback(dppCallback); |
| } |
| } |
| |
| /** |
| * Set MBO cellular data availability. |
| * |
| * @param ifaceName Name of the interface. |
| * @param available true means cellular data available, false otherwise. |
| * Returns true when operation is successful |
| */ |
| public boolean setMboCellularDataStatus(@NonNull String ifaceName, boolean available) { |
| synchronized (mLock) { |
| String methodStr = "setMboCellularDataStatus"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.setMboCellularDataStatus(ifaceName, available); |
| } |
| } |
| |
| /** |
| * Set whether the network-centric QoS policy feature is enabled or not for this interface. |
| * |
| * @param ifaceName name of the interface. |
| * @param isEnabled true if feature is enabled, false otherwise. |
| * @return true if operation is successful, false otherwise. |
| */ |
| public boolean setNetworkCentricQosPolicyFeatureEnabled(@NonNull String ifaceName, |
| boolean isEnabled) { |
| synchronized (mLock) { |
| String methodStr = "setNetworkCentricQosPolicyFeatureEnabled"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.setNetworkCentricQosPolicyFeatureEnabled(ifaceName, isEnabled); |
| } |
| } |
| |
| /** |
| * Check if we've roamed to a linked network and make the linked network the current network |
| * if we have. |
| * |
| * @param ifaceName Name of the interface. |
| * @param newNetworkId Network id of the new network we've roamed to. If fromFramework is |
| * {@code true}, this will be a framework network id. Otherwise, this will |
| * be a remote network id. |
| * @param fromFramework {@code true} if the network id is a framework network id, {@code false} |
| if the network id is a remote network id. |
| * @return true if we've roamed to a linked network, false if not. |
| */ |
| public boolean updateOnLinkedNetworkRoaming( |
| @NonNull String ifaceName, int newNetworkId, boolean fromFramework) { |
| synchronized (mLock) { |
| String methodStr = "updateOnLinkedNetworkRoaming"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.updateOnLinkedNetworkRoaming( |
| ifaceName, newNetworkId, fromFramework); |
| } |
| } |
| |
| /** |
| * Updates the linked networks for the current network and sends them to the supplicant. |
| * |
| * @param ifaceName Name of the interface. |
| * @param networkId Network id of the network to link the configurations to. |
| * @param linkedConfigurations Map of config profile key to config for linking. |
| * @return true if networks were successfully linked, false otherwise. |
| */ |
| public boolean updateLinkedNetworks(@NonNull String ifaceName, int networkId, |
| Map<String, WifiConfiguration> linkedConfigurations) { |
| synchronized (mLock) { |
| String methodStr = "updateLinkedNetworks"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.updateLinkedNetworks(ifaceName, networkId, linkedConfigurations); |
| } |
| } |
| |
| /** |
| * Gets the security params of the current network associated with this interface |
| * |
| * @param ifaceName Name of the interface |
| * @return Security params of the current network associated with the interface |
| */ |
| public SecurityParams getCurrentNetworkSecurityParams(@NonNull String ifaceName) { |
| synchronized (mLock) { |
| String methodStr = "getCurrentNetworkSecurityParams"; |
| if (mStaIfaceHal == null) { |
| handleNullHal(methodStr); |
| return null; |
| } |
| return mStaIfaceHal.getCurrentNetworkSecurityParams(ifaceName); |
| } |
| } |
| |
| /** |
| * Sends a QoS policy response. |
| * |
| * @param ifaceName Name of the interface. |
| * @param qosPolicyRequestId Dialog token to identify the request. |
| * @param morePolicies Flag to indicate more QoS policies can be accommodated. |
| * @param qosPolicyStatusList List of framework QosPolicyStatus objects. |
| * @return true if response is sent successfully, false otherwise. |
| */ |
| public boolean sendQosPolicyResponse(String ifaceName, int qosPolicyRequestId, |
| boolean morePolicies, @NonNull List<QosPolicyStatus> qosPolicyStatusList) { |
| String methodStr = "sendQosPolicyResponse"; |
| if (mStaIfaceHal == null) { |
| handleNullHal(methodStr); |
| return false; |
| } |
| return mStaIfaceHal.sendQosPolicyResponse(ifaceName, qosPolicyRequestId, |
| morePolicies, qosPolicyStatusList); |
| } |
| |
| /** |
| * Indicates the removal of all active QoS policies configured by the AP. |
| * |
| * @param ifaceName Name of the interface. |
| */ |
| public boolean removeAllQosPolicies(String ifaceName) { |
| String methodStr = "removeAllQosPolicies"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.removeAllQosPolicies(ifaceName); |
| } |
| |
| /** |
| * Generate DPP credential for network access |
| * |
| * @param ifaceName Name of the interface. |
| * @param ssid ssid of the network |
| * @param privEcKey Private EC Key for DPP Configurator |
| * Returns true when operation is successful. On error, false is returned. |
| */ |
| public boolean generateSelfDppConfiguration(@NonNull String ifaceName, @NonNull String ssid, |
| byte[] privEcKey) { |
| synchronized (mLock) { |
| String methodStr = "generateSelfDppConfiguration"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.generateSelfDppConfiguration(ifaceName, ssid, privEcKey); |
| } |
| } |
| |
| /** |
| * This set anonymous identity to supplicant. |
| * |
| * @param ifaceName Name of the interface. |
| * @param anonymousIdentity the anonymouns identity. |
| * @return true if succeeds, false otherwise. |
| */ |
| public boolean setEapAnonymousIdentity(@NonNull String ifaceName, String anonymousIdentity) { |
| String methodStr = "setEapAnonymousIdentity"; |
| if (mStaIfaceHal == null) { |
| return handleNullHal(methodStr); |
| } |
| return mStaIfaceHal.setEapAnonymousIdentity(ifaceName, anonymousIdentity); |
| } |
| |
| private boolean handleNullHal(String methodStr) { |
| Log.e(TAG, "Cannot call " + methodStr + " because HAL object is null."); |
| return false; |
| } |
| } |