2228 lines
86 KiB
Java
2228 lines
86 KiB
Java
|
/*
|
||
|
* 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;
|
||
|
}
|
||
|
}
|