blob: 16538ef5f9e376c5083b55c009f1ed563f6a32ae [file] [log] [blame]
/*
* 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;
}
}