SupplicantStaIfaceHal.java revision c224fb554deca894818490c9416ff35d18a79d76
1240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne/* 298152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne * Copyright (C) 2017 The Android Open Source Project 3240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne * 4240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne * Licensed under the Apache License, Version 2.0 (the "License"); 5240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne * you may not use this file except in compliance with the License. 6240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne * You may obtain a copy of the License at 7240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne * 8240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne * http://www.apache.org/licenses/LICENSE-2.0 9240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne * 10240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne * Unless required by applicable law or agreed to in writing, software 11240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne * distributed under the License is distributed on an "AS IS" BASIS, 12240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne * See the License for the specific language governing permissions and 14240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne * limitations under the License. 15240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne */ 16240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhnepackage com.android.server.wifi; 17240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne 18c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Piusimport android.content.Context; 19240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhneimport android.hardware.wifi.supplicant.V1_0.ISupplicant; 20240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhneimport android.hardware.wifi.supplicant.V1_0.ISupplicantIface; 2196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhneimport android.hardware.wifi.supplicant.V1_0.ISupplicantNetwork; 22240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhneimport android.hardware.wifi.supplicant.V1_0.ISupplicantStaIface; 23c224fb554deca894818490c9416ff35d18a79d76Roshan Piusimport android.hardware.wifi.supplicant.V1_0.ISupplicantStaIfaceCallback; 2496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhneimport android.hardware.wifi.supplicant.V1_0.ISupplicantStaNetwork; 25240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhneimport android.hardware.wifi.supplicant.V1_0.IfaceType; 26240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhneimport android.hardware.wifi.supplicant.V1_0.SupplicantStatus; 27240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhneimport android.hardware.wifi.supplicant.V1_0.SupplicantStatusCode; 285f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Piusimport android.hardware.wifi.supplicant.V1_0.WpsConfigMethods; 29240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhneimport android.hidl.manager.V1_0.IServiceManager; 30240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhneimport android.hidl.manager.V1_0.IServiceNotification; 31f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Piusimport android.net.IpConfiguration; 3266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhneimport android.net.wifi.WifiConfiguration; 33240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhneimport android.os.RemoteException; 34240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhneimport android.util.Log; 35f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Piusimport android.util.SparseArray; 3696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne 37d95fa596d07855b70ff18a50a48e773155a919f5Roshan Piusimport com.android.server.wifi.util.NativeUtil; 38240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne 395f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Piusimport java.nio.ByteBuffer; 405f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Piusimport java.nio.ByteOrder; 41240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhneimport java.util.ArrayList; 42f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Piusimport java.util.HashMap; 43f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Piusimport java.util.List; 44f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Piusimport java.util.Map; 455f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Piusimport java.util.regex.Matcher; 465f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Piusimport java.util.regex.Pattern; 47d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 48240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne/** 49240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne * Hal calls for bring up/shut down of the supplicant daemon and for 50240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne * sending requests to the supplicant daemon 51240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne */ 52b4419d876beda78c29836726e43d80203b4a656cRoshan Piuspublic class SupplicantStaIfaceHal { 53240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne private static final boolean DBG = false; 54b4419d876beda78c29836726e43d80203b4a656cRoshan Pius private static final String TAG = "SupplicantStaIfaceHal"; 5598152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne private static final String SERVICE_MANAGER_NAME = "manager"; 565f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius /** 575f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * Regex pattern for extracting the wps device type bytes. 585f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * Matches a strings like the following: "<categ>-<OUI>-<subcateg>"; 595f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius */ 605f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius private static final Pattern WPS_DEVICE_TYPE_PATTERN = 615f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius Pattern.compile("^(\\d{1,2})-([0-9a-fA-F]{8})-(\\d{1,2})$"); 625f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius 6398152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne private IServiceManager mIServiceManager = null; 6498152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne // Supplicant HAL interface objects 6598152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne private ISupplicant mISupplicant; 6698152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne private ISupplicantStaIface mISupplicantStaIface; 6703fea88ccab149c07391d38f3c406bb04ab0a3a9Roshan Pius private String mIfaceName; 687c0ec884188660f72977c8a80366049705c48ffaRoshan Pius // Currently configured network in wpa_supplicant 697c0ec884188660f72977c8a80366049705c48ffaRoshan Pius private SupplicantStaNetworkHal mCurrentNetwork; 707c0ec884188660f72977c8a80366049705c48ffaRoshan Pius // Currently configured network's framework network Id. 717c0ec884188660f72977c8a80366049705c48ffaRoshan Pius private int mFrameworkNetworkId; 72240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne private final Object mLock = new Object(); 73c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius private final Context mContext; 74c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius private final WifiMonitor mWifiMonitor; 757c0ec884188660f72977c8a80366049705c48ffaRoshan Pius 76c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius public SupplicantStaIfaceHal(Context context, WifiMonitor monitor) { 77c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius mContext = context; 78c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius mWifiMonitor = monitor; 798c6d09c03532b3936fab2fed6f8b84c895333565Roshan Pius } 80240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne 81240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne /** 8298152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne * Registers a service notification for the ISupplicant service, which triggers intialization of 8398152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne * the ISupplicantStaIface 84240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne * @return true if the service notification was successfully registered 85240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne */ 86240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne public boolean initialize() { 8798152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne if (DBG) Log.i(TAG, "Registering ISupplicant service ready callback."); 88240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne synchronized (mLock) { 8998152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne mISupplicant = null; 9098152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne mISupplicantStaIface = null; 9198152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne if (mIServiceManager != null) { 9298152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne // Already have an IServiceManager and serviceNotification registered, don't 9398152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne // don't register another. 9498152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne return true; 9598152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne } 96240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne try { 9798152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne mIServiceManager = getServiceManagerMockable(); 9898152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne if (mIServiceManager == null) { 99240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne Log.e(TAG, "Failed to get HIDL Service Manager"); 100240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne return false; 101240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 10298152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne if (!mIServiceManager.linkToDeath(cookie -> { 103240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne Log.wtf(TAG, "IServiceManager died: cookie=" + cookie); 104240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne synchronized (mLock) { 105240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne supplicantServiceDiedHandler(); 10698152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne mIServiceManager = null; // Will need to register a new ServiceNotification 107240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 108240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne }, 0)) { 109240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne Log.wtf(TAG, "Error on linkToDeath on IServiceManager"); 110240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne supplicantServiceDiedHandler(); 11198152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne mIServiceManager = null; // Will need to register a new ServiceNotification 112240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne return false; 113240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 114240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne IServiceNotification serviceNotificationCb = new IServiceNotification.Stub() { 115240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne public void onRegistration(String fqName, String name, boolean preexisting) { 11698152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne synchronized (mLock) { 11798152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne if (DBG) { 11898152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne Log.i(TAG, "IServiceNotification.onRegistration for: " + fqName 11998152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne + ", " + name + " preexisting=" + preexisting); 12098152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne } 12198152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne if (!initSupplicantService() || !initSupplicantStaIface()) { 12298152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne Log.e(TAG, "initalizing ISupplicantIfaces failed."); 12398152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne supplicantServiceDiedHandler(); 12498152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne } else { 12598152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne Log.i(TAG, "Completed initialization of ISupplicant interfaces."); 12698152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne } 127240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 128240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 129240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne }; 130240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne /* TODO(b/33639391) : Use the new ISupplicant.registerForNotifications() once it 131240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne exists */ 13298152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne if (!mIServiceManager.registerForNotifications(ISupplicant.kInterfaceName, 133240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne "", serviceNotificationCb)) { 134240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne Log.e(TAG, "Failed to register for notifications to " 135240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne + ISupplicant.kInterfaceName); 13698152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne mIServiceManager = null; // Will need to register a new ServiceNotification 137240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne return false; 138240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 139240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } catch (RemoteException e) { 140240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne Log.e(TAG, "Exception while trying to register a listener for ISupplicant service: " 141240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne + e); 14298152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne supplicantServiceDiedHandler(); 143240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 144240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne return true; 145240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 146240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 147240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne 14898152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne private boolean initSupplicantService() { 149240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne synchronized (mLock) { 150240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne try { 15198152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne mISupplicant = getSupplicantMockable(); 152240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } catch (RemoteException e) { 153240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne Log.e(TAG, "ISupplicant.getService exception: " + e); 154240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne return false; 155240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 15698152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne if (mISupplicant == null) { 157240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne Log.e(TAG, "Got null ISupplicant service. Stopping supplicant HIDL startup"); 158240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne return false; 159240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 160240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 161240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne return true; 162240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 163240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne 16498152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne private boolean initSupplicantStaIface() { 165240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne synchronized (mLock) { 166240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne /** List all supplicant Ifaces */ 167240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne final ArrayList<ISupplicant.IfaceInfo> supplicantIfaces = new ArrayList<>(); 168240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne try { 16998152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne mISupplicant.listInterfaces((SupplicantStatus status, 170240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne ArrayList<ISupplicant.IfaceInfo> ifaces) -> { 171240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne if (status.code != SupplicantStatusCode.SUCCESS) { 172240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne Log.e(TAG, "Getting Supplicant Interfaces failed: " + status.code); 173240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne return; 174240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 175240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne supplicantIfaces.addAll(ifaces); 176240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne }); 177240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } catch (RemoteException e) { 178240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne Log.e(TAG, "ISupplicant.listInterfaces exception: " + e); 17998152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne return false; 180240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 181240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne if (supplicantIfaces.size() == 0) { 182240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne Log.e(TAG, "Got zero HIDL supplicant ifaces. Stopping supplicant HIDL startup."); 18398152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne return false; 184240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 185240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne Mutable<ISupplicantIface> supplicantIface = new Mutable<>(); 18603fea88ccab149c07391d38f3c406bb04ab0a3a9Roshan Pius Mutable<String> ifaceName = new Mutable<>(); 187240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne for (ISupplicant.IfaceInfo ifaceInfo : supplicantIfaces) { 18898152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne if (ifaceInfo.type == IfaceType.STA) { 189240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne try { 19098152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne mISupplicant.getInterface(ifaceInfo, 191240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne (SupplicantStatus status, ISupplicantIface iface) -> { 192240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne if (status.code != SupplicantStatusCode.SUCCESS) { 193240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne Log.e(TAG, "Failed to get ISupplicantIface " + status.code); 194240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne return; 195240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 196240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne supplicantIface.value = iface; 197240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne }); 198240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } catch (RemoteException e) { 199240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne Log.e(TAG, "ISupplicant.getInterface exception: " + e); 20098152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne return false; 201240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 20203fea88ccab149c07391d38f3c406bb04ab0a3a9Roshan Pius ifaceName.value = ifaceInfo.name; 203240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne break; 204240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 205240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 20698152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne if (supplicantIface.value == null) { 20798152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne Log.e(TAG, "initSupplicantStaIface got null iface"); 208240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne return false; 209240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 21098152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne mISupplicantStaIface = getStaIfaceMockable(supplicantIface.value); 21103fea88ccab149c07391d38f3c406bb04ab0a3a9Roshan Pius mIfaceName = ifaceName.value; 212c224fb554deca894818490c9416ff35d18a79d76Roshan Pius if (!registerCallback(new SupplicantStaIfaceHalCallback())) { 213c224fb554deca894818490c9416ff35d18a79d76Roshan Pius return false; 214c224fb554deca894818490c9416ff35d18a79d76Roshan Pius } 215240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne return true; 216240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 217240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 218240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne 21998152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne private void supplicantServiceDiedHandler() { 220240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne synchronized (mLock) { 22198152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne mISupplicant = null; 22298152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne mISupplicantStaIface = null; 223240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 224240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 225240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne 22698152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne /** 22798152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne * Signals whether Initialization completed successfully. Only necessary for testing, is not 22898152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne * needed to guard calls etc. 22998152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne */ 23098152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne public boolean isInitializationComplete() { 23198152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne return mISupplicantStaIface != null; 2328c6d09c03532b3936fab2fed6f8b84c895333565Roshan Pius } 2338c6d09c03532b3936fab2fed6f8b84c895333565Roshan Pius 2348c6d09c03532b3936fab2fed6f8b84c895333565Roshan Pius /** 23598152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne * Wrapper functions to access static HAL methods, created to be mockable in unit tests 2368c6d09c03532b3936fab2fed6f8b84c895333565Roshan Pius */ 23798152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne protected IServiceManager getServiceManagerMockable() throws RemoteException { 23898152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne return IServiceManager.getService(SERVICE_MANAGER_NAME); 23998152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne } 24098152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne 24198152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne protected ISupplicant getSupplicantMockable() throws RemoteException { 24298152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne return ISupplicant.getService(); 24398152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne } 24498152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne 24598152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne protected ISupplicantStaIface getStaIfaceMockable(ISupplicantIface iface) { 24698152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne return ISupplicantStaIface.asInterface(iface.asBinder()); 2478c6d09c03532b3936fab2fed6f8b84c895333565Roshan Pius } 2488c6d09c03532b3936fab2fed6f8b84c895333565Roshan Pius 24996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne /** 2507c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * Add a network configuration to wpa_supplicant. 251d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 25266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne * @param config Config corresponding to the network. 25366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne * @return SupplicantStaNetwork of the added network in wpa_supplicant. 25466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne */ 255d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius private SupplicantStaNetworkHal addNetwork(WifiConfiguration config) { 25666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne logi("addSupplicantStaNetwork via HIDL"); 25766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne if (config == null) { 25866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne loge("Cannot add NULL network!"); 25966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne return null; 26066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 26166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne SupplicantStaNetworkHal network = addNetwork(); 26266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne if (network == null) { 26366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne loge("Failed to add a network!"); 26466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne return null; 26566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 26666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne if (network.saveWifiConfiguration(config)) { 26766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne return network; 26866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } else { 26966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne loge("Failed to save variables for: " + config.configKey()); 27066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne return null; 27166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 27266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 27366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne 27466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne /** 2757c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * Add the provided network configuration to wpa_supplicant and initiate connection to it. 2767c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * This method does the following: 2777c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * 1. Triggers disconnect command to wpa_supplicant (if |shouldDisconnect| is true). 2787c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * 2. Remove any existing network in wpa_supplicant. 2797c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * 3. Add a new network to wpa_supplicant. 2807c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * 4. Save the provided configuration to wpa_supplicant. 2817c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * 5. Select the new network in wpa_supplicant. 282d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 2837c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * @param config WifiConfiguration parameters for the provided network. 2847c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * @param shouldDisconnect whether to trigger a disconnection or not. 2857c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * @return {@code true} if it succeeds, {@code false} otherwise 28666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne */ 287d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean connectToNetwork(WifiConfiguration config, boolean shouldDisconnect) { 2887c0ec884188660f72977c8a80366049705c48ffaRoshan Pius mFrameworkNetworkId = WifiConfiguration.INVALID_NETWORK_ID; 2897c0ec884188660f72977c8a80366049705c48ffaRoshan Pius mCurrentNetwork = null; 290d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius logd("connectToNetwork " + config.configKey() 29166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne + " (shouldDisconnect " + shouldDisconnect + ")"); 29266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne if (shouldDisconnect && !disconnect()) { 29366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne loge("Failed to trigger disconnect"); 29466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne return false; 29566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 29666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne if (!removeAllNetworks()) { 29766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne loge("Failed to remove existing networks"); 29866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne return false; 29966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 3007c0ec884188660f72977c8a80366049705c48ffaRoshan Pius mCurrentNetwork = addNetwork(config); 3017c0ec884188660f72977c8a80366049705c48ffaRoshan Pius if (mCurrentNetwork == null) { 302d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius loge("Failed to add/save network configuration: " + config.configKey()); 30366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne return false; 30466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 3057c0ec884188660f72977c8a80366049705c48ffaRoshan Pius if (!mCurrentNetwork.select()) { 306d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius loge("Failed to select network configuration: " + config.configKey()); 30766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne return false; 30866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 3097c0ec884188660f72977c8a80366049705c48ffaRoshan Pius mFrameworkNetworkId = config.networkId; 3107c0ec884188660f72977c8a80366049705c48ffaRoshan Pius return true; 3117c0ec884188660f72977c8a80366049705c48ffaRoshan Pius } 3127c0ec884188660f72977c8a80366049705c48ffaRoshan Pius 3137c0ec884188660f72977c8a80366049705c48ffaRoshan Pius /** 3147c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * Initiates roaming to the already configured network in wpa_supplicant. If the network 3157c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * configuration provided does not match the already configured network, then this triggers 3167c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * a new connection attempt (instead of roam). 3177c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * 1. First check if we're attempting to connect to the same network as we currently have 3187c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * configured. 3197c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * 2. Set the new bssid for the network in wpa_supplicant. 3207c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * 3. Trigger reassociate command to wpa_supplicant. 3217c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * 3227c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * @param config WifiConfiguration parameters for the provided network. 3237c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * @return {@code true} if it succeeds, {@code false} otherwise 3247c0ec884188660f72977c8a80366049705c48ffaRoshan Pius */ 3257c0ec884188660f72977c8a80366049705c48ffaRoshan Pius public boolean roamToNetwork(WifiConfiguration config) { 3267c0ec884188660f72977c8a80366049705c48ffaRoshan Pius if (mFrameworkNetworkId != config.networkId || mCurrentNetwork == null) { 3277c0ec884188660f72977c8a80366049705c48ffaRoshan Pius Log.w(TAG, "Cannot roam to a different network, initiate new connection. " 3287c0ec884188660f72977c8a80366049705c48ffaRoshan Pius + "Current network ID: " + mFrameworkNetworkId); 3297c0ec884188660f72977c8a80366049705c48ffaRoshan Pius return connectToNetwork(config, false); 3307c0ec884188660f72977c8a80366049705c48ffaRoshan Pius } 3317c0ec884188660f72977c8a80366049705c48ffaRoshan Pius String bssid = config.getNetworkSelectionStatus().getNetworkSelectionBSSID(); 3327c0ec884188660f72977c8a80366049705c48ffaRoshan Pius logd("roamToNetwork" + config.configKey() + " (bssid " + bssid + ")"); 3337c0ec884188660f72977c8a80366049705c48ffaRoshan Pius if (!mCurrentNetwork.setBssid(bssid)) { 3347c0ec884188660f72977c8a80366049705c48ffaRoshan Pius loge("Failed to set new bssid on network: " + config.configKey()); 3357c0ec884188660f72977c8a80366049705c48ffaRoshan Pius return false; 3367c0ec884188660f72977c8a80366049705c48ffaRoshan Pius } 3377c0ec884188660f72977c8a80366049705c48ffaRoshan Pius if (!reassociate()) { 3387c0ec884188660f72977c8a80366049705c48ffaRoshan Pius loge("Failed to trigger reassociate"); 3397c0ec884188660f72977c8a80366049705c48ffaRoshan Pius return false; 3407c0ec884188660f72977c8a80366049705c48ffaRoshan Pius } 34166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne return true; 34266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 34366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne 34466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne /** 345f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius * Load all the configured networks from wpa_supplicant. 346f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius * 347f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius * @param configs Map of configuration key to configuration objects corresponding to all 348f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius * the networks. 349f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius * @param networkExtras Map of extra configuration parameters stored in wpa_supplicant.conf 350f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius * @return true if succeeds, false otherwise. 351f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius */ 352f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius public boolean loadNetworks(Map<String, WifiConfiguration> configs, 353f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius SparseArray<Map<String, String>> networkExtras) { 354f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius List<Integer> networkIds = listNetworks(); 355f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius if (networkIds == null) { 356f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius Log.e(TAG, "Failed to list networks"); 357f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius return false; 358f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius } 359f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius for (Integer networkId : networkIds) { 360f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius SupplicantStaNetworkHal network = getNetwork(networkId); 361f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius if (network == null) { 362f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius Log.e(TAG, "Failed to get network with ID: " + networkId); 363f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius return false; 364f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius } 365f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius WifiConfiguration config = new WifiConfiguration(); 366f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius Map<String, String> networkExtra = new HashMap<>(); 367f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius if (!network.loadWifiConfiguration(config, networkExtra)) { 368f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius Log.e(TAG, "Failed to load wifi configuration for network with ID: " + networkId); 369f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius return false; 370f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius } 371f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius // Set the default IP assignments. 372f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius config.setIpAssignment(IpConfiguration.IpAssignment.DHCP); 373f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius config.setProxySettings(IpConfiguration.ProxySettings.NONE); 374f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius 375f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius networkExtras.put(networkId, networkExtra); 376f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius String configKey = networkExtra.get(SupplicantStaNetworkHal.ID_STRING_KEY_CONFIG_KEY); 377f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius final WifiConfiguration duplicateConfig = configs.put(configKey, config); 378f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius if (duplicateConfig != null) { 379f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius // The network is already known. Overwrite the duplicate entry. 380f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius Log.i(TAG, "Replacing duplicate network: " + duplicateConfig.networkId); 381f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius removeNetwork(duplicateConfig.networkId); 382f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius networkExtras.remove(duplicateConfig.networkId); 383f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius } 384f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius } 385f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius return true; 386f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius } 387f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius 388f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius /** 38966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne * Remove all networks from supplicant 39066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne */ 39166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne public boolean removeAllNetworks() { 39266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne synchronized (mLock) { 39366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne ArrayList<Integer> networks = listNetworks(); 39466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne if (networks == null) { 39566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne Log.e(TAG, "removeAllNetworks failed, got null networks"); 39666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne return false; 39766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 39866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne for (int id : networks) { 39966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne if (!removeNetwork(id)) { 40066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne Log.e(TAG, "removeAllNetworks failed to remove network: " + id); 40166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne return false; 40266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 40366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 40466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 40566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne return true; 40666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 40766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne 40866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne /** 4090a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius * Set the currently configured network's bssid. 4100a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius * 4110a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius * @param bssidStr Bssid to set in the form of "XX:XX:XX:XX:XX:XX" 4120a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius * @return true if succeeds, false otherwise. 4130a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius */ 4140a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius public boolean setCurrentNetworkBssid(String bssidStr) { 4150a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius if (mCurrentNetwork == null) return false; 4160a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius return mCurrentNetwork.setBssid(bssidStr); 4170a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius } 4180a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius 4190a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius /** 4200a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius * Get the currently configured network's WPS NFC token. 4210a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius * 4220a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius * @return Hex string corresponding to the WPS NFC token. 4230a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius */ 4240a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius public String getCurrentNetworkWpsNfcConfigurationToken() { 4250a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius if (mCurrentNetwork == null) return null; 4260a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius return mCurrentNetwork.getWpsNfcConfigurationToken(); 4270a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius } 4280a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius 4290a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius /** 430d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Adds a new network. 431d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 43296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * @return The ISupplicantNetwork object for the new network, or null if the call fails 43396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne */ 43496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne private SupplicantStaNetworkHal addNetwork() { 43596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 43696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "addNetwork"; 43796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 43896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return null; 4393aa9b7e616f685ded8fade523317e96cedcdcc2dRoshan Pius Mutable<ISupplicantNetwork> newNetwork = new Mutable<>(); 44096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 44196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne mISupplicantStaIface.addNetwork((SupplicantStatus status, 44296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne ISupplicantNetwork network) -> { 4433aa9b7e616f685ded8fade523317e96cedcdcc2dRoshan Pius if (checkStatusAndLogFailure(status, methodStr)) { 44496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne newNetwork.value = network; 44596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 44696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne }); 44796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 44896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception: " + e); 44996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 45096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 4513aa9b7e616f685ded8fade523317e96cedcdcc2dRoshan Pius if (newNetwork.value != null) { 452c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius return getStaNetworkMockable( 453c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius ISupplicantStaNetwork.asInterface(newNetwork.value.asBinder())); 45496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } else { 45596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return null; 45696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 45796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 45896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 459d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 46096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne /** 46196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * Remove network from supplicant with network Id 462d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 463d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 46496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne */ 46596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne private boolean removeNetwork(int id) { 46696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 46796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "removeNetwork"; 46896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 46996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 47096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 47196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.removeNetwork(id); 47296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 47396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 47496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 47596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 47696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 47796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 47896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 47996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 480d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 48196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne /** 482f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius * Use this to mock the creation of SupplicantStaNetworkHal instance. 483f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius * 484f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius * @param iSupplicantStaNetwork ISupplicantStaNetwork instance retrieved from HIDL. 485f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius * @return The ISupplicantNetwork object for the given SupplicantNetworkId int, returns null if 486f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius * the call fails 487f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius */ 488f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius protected SupplicantStaNetworkHal getStaNetworkMockable( 489c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius ISupplicantStaNetwork iSupplicantStaNetwork) { 49003fea88ccab149c07391d38f3c406bb04ab0a3a9Roshan Pius return new SupplicantStaNetworkHal( 49103fea88ccab149c07391d38f3c406bb04ab0a3a9Roshan Pius iSupplicantStaNetwork, mIfaceName, mContext, mWifiMonitor); 492f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius } 493f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius 494f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius /** 49596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * @return The ISupplicantNetwork object for the given SupplicantNetworkId int, returns null if 49696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * the call fails 49796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne */ 49896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne private SupplicantStaNetworkHal getNetwork(int id) { 49996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 50096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "getNetwork"; 50196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 5023aa9b7e616f685ded8fade523317e96cedcdcc2dRoshan Pius Mutable<ISupplicantNetwork> gotNetwork = new Mutable<>(); 50396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return null; 50496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 50596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne mISupplicantStaIface.getNetwork(id, (SupplicantStatus status, 50696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne ISupplicantNetwork network) -> { 5073aa9b7e616f685ded8fade523317e96cedcdcc2dRoshan Pius if (checkStatusAndLogFailure(status, methodStr)) { 50896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne gotNetwork.value = network; 50996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 51096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne }); 51196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 51296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception: " + e); 51396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 51496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 5153aa9b7e616f685ded8fade523317e96cedcdcc2dRoshan Pius if (gotNetwork.value != null) { 516c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius return getStaNetworkMockable( 517c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius ISupplicantStaNetwork.asInterface(gotNetwork.value.asBinder())); 51896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } else { 51996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return null; 52096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 52196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 52296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 52396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne 524c224fb554deca894818490c9416ff35d18a79d76Roshan Pius /** See ISupplicantStaNetwork.hal for documentation */ 525c224fb554deca894818490c9416ff35d18a79d76Roshan Pius private boolean registerCallback(ISupplicantStaIfaceCallback callback) { 526c224fb554deca894818490c9416ff35d18a79d76Roshan Pius synchronized (mLock) { 527c224fb554deca894818490c9416ff35d18a79d76Roshan Pius final String methodStr = "registerCallback"; 528c224fb554deca894818490c9416ff35d18a79d76Roshan Pius if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 529c224fb554deca894818490c9416ff35d18a79d76Roshan Pius try { 530c224fb554deca894818490c9416ff35d18a79d76Roshan Pius SupplicantStatus status = mISupplicantStaIface.registerCallback(callback); 531c224fb554deca894818490c9416ff35d18a79d76Roshan Pius return checkStatusAndLogFailure(status, methodStr); 532c224fb554deca894818490c9416ff35d18a79d76Roshan Pius } catch (RemoteException e) { 533c224fb554deca894818490c9416ff35d18a79d76Roshan Pius supplicantServiceDiedHandler(); 534c224fb554deca894818490c9416ff35d18a79d76Roshan Pius return false; 535c224fb554deca894818490c9416ff35d18a79d76Roshan Pius } 536c224fb554deca894818490c9416ff35d18a79d76Roshan Pius } 537c224fb554deca894818490c9416ff35d18a79d76Roshan Pius } 538c224fb554deca894818490c9416ff35d18a79d76Roshan Pius 53996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne /** 54096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * @return a list of SupplicantNetworkID ints for all networks controlled by supplicant, returns 54196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * null if the call fails 54296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne */ 54396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne private java.util.ArrayList<Integer> listNetworks() { 54496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 54596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "listNetworks"; 54696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 5473aa9b7e616f685ded8fade523317e96cedcdcc2dRoshan Pius Mutable<ArrayList<Integer>> networkIdList = new Mutable<>(); 54896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return null; 54996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 55096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne mISupplicantStaIface.listNetworks((SupplicantStatus status, 55196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne java.util.ArrayList<Integer> networkIds) -> { 5523aa9b7e616f685ded8fade523317e96cedcdcc2dRoshan Pius if (checkStatusAndLogFailure(status, methodStr)) { 55396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne networkIdList.value = networkIds; 55496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 55596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne }); 55696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 55796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception: " + e); 55896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 55996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 5603aa9b7e616f685ded8fade523317e96cedcdcc2dRoshan Pius return networkIdList.value; 56196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 56296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 563d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 5645f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius /** 5655f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * Set WPS device name. 5665f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * 5675f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @param name String to be set. 5685f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @return true if request is sent successfully, false otherwise. 5695f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius */ 5705f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius public boolean setWpsDeviceName(String name) { 5717651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius synchronized (mLock) { 5727651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius final String methodStr = "setWpsDeviceName"; 5737651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (DBG) Log.i(TAG, methodStr); 5747651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 5757651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius try { 5767651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius SupplicantStatus status = mISupplicantStaIface.setWpsDeviceName(name); 5777651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return checkStatusAndLogFailure(status, methodStr); 5787651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } catch (RemoteException e) { 5797651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 5807651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius supplicantServiceDiedHandler(); 5817651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return false; 5827651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 5837651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 5847651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 5857651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius 5865f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius /** 5875f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * Set WPS device type. 5885f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * 5895f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @param typeStr Type specified as a string. Used format: <categ>-<OUI>-<subcateg> 5905f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @return true if request is sent successfully, false otherwise. 5915f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius */ 5925f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius public boolean setWpsDeviceType(String typeStr) { 5935f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius Matcher match = WPS_DEVICE_TYPE_PATTERN.matcher(typeStr); 5945f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius if (!match.find() || match.groupCount() != 3) { 5955f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius Log.e(TAG, "Malformed WPS device type " + typeStr); 5965f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius return false; 5975f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius } 5985f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius short categ = Short.parseShort(match.group(1)); 5995f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius byte[] oui = NativeUtil.hexStringToByteArray(match.group(2)); 6005f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius short subCateg = Short.parseShort(match.group(3)); 6015f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius 6025f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius byte[] bytes = new byte[8]; 6035f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius ByteBuffer byteBuffer = ByteBuffer.wrap(bytes).order(ByteOrder.BIG_ENDIAN); 6045f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius byteBuffer.putShort(categ); 6055f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius byteBuffer.put(oui); 6065f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius byteBuffer.putShort(subCateg); 6075f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius return setWpsDeviceType(bytes); 6085f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius } 6095f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius 6107651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius private boolean setWpsDeviceType(byte[/* 8 */] type) { 6117651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius synchronized (mLock) { 6127651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius final String methodStr = "setWpsDeviceType"; 6137651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (DBG) Log.i(TAG, methodStr); 6147651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 6157651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius try { 6167651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius SupplicantStatus status = mISupplicantStaIface.setWpsDeviceType(type); 6177651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return checkStatusAndLogFailure(status, methodStr); 6187651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } catch (RemoteException e) { 6197651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 6207651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius supplicantServiceDiedHandler(); 6217651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return false; 6227651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 6237651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 6247651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 6257651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius 6265f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius /** 6275f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * Set WPS manufacturer. 6285f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * 6295f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @param manufacturer String to be set. 6305f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @return true if request is sent successfully, false otherwise. 6315f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius */ 6325f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius public boolean setWpsManufacturer(String manufacturer) { 6337651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius synchronized (mLock) { 6347651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius final String methodStr = "setWpsManufacturer"; 6357651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (DBG) Log.i(TAG, methodStr); 6367651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 6377651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius try { 6387651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius SupplicantStatus status = mISupplicantStaIface.setWpsManufacturer(manufacturer); 6397651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return checkStatusAndLogFailure(status, methodStr); 6407651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } catch (RemoteException e) { 6417651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 6427651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius supplicantServiceDiedHandler(); 6437651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return false; 6447651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 6457651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 6467651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 6477651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius 6485f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius /** 6495f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * Set WPS model name. 6505f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * 6515f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @param modelName String to be set. 6525f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @return true if request is sent successfully, false otherwise. 6535f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius */ 6545f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius public boolean setWpsModelName(String modelName) { 6557651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius synchronized (mLock) { 6567651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius final String methodStr = "setWpsModelName"; 6577651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (DBG) Log.i(TAG, methodStr); 6587651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 6597651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius try { 6607651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius SupplicantStatus status = mISupplicantStaIface.setWpsModelName(modelName); 6617651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return checkStatusAndLogFailure(status, methodStr); 6627651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } catch (RemoteException e) { 6637651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 6647651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius supplicantServiceDiedHandler(); 6657651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return false; 6667651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 6677651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 6687651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 6697651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius 6705f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius /** 6715f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * Set WPS model number. 6725f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * 6735f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @param modelNumber String to be set. 6745f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @return true if request is sent successfully, false otherwise. 6755f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius */ 6765f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius public boolean setWpsModelNumber(String modelNumber) { 6777651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius synchronized (mLock) { 6787651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius final String methodStr = "setWpsModelNumber"; 6797651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (DBG) Log.i(TAG, methodStr); 6807651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 6817651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius try { 6827651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius SupplicantStatus status = mISupplicantStaIface.setWpsModelNumber(modelNumber); 6837651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return checkStatusAndLogFailure(status, methodStr); 6847651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } catch (RemoteException e) { 6857651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 6867651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius supplicantServiceDiedHandler(); 6877651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return false; 6887651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 6897651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 6907651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 6917651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius 6925f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius /** 6935f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * Set WPS serial number. 6945f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * 6955f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @param serialNumber String to be set. 6965f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @return true if request is sent successfully, false otherwise. 6975f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius */ 6985f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius public boolean setWpsSerialNumber(String serialNumber) { 6997651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius synchronized (mLock) { 7007651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius final String methodStr = "setWpsSerialNumber"; 7017651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (DBG) Log.i(TAG, methodStr); 7027651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 7037651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius try { 7047651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius SupplicantStatus status = mISupplicantStaIface.setWpsSerialNumber(serialNumber); 7057651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return checkStatusAndLogFailure(status, methodStr); 7067651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } catch (RemoteException e) { 7077651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 7087651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius supplicantServiceDiedHandler(); 7097651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return false; 7107651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 7117651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 7127651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 7137651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius 7145f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius /** 7155f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * Set WPS config methods 7165f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * 7175f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @param configMethodsStr List of config methods. 7185f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @return true if request is sent successfully, false otherwise. 7195f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius */ 7205f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius public boolean setWpsConfigMethods(String configMethodsStr) { 7215f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius short configMethodsMask = 0; 7225f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius String[] configMethodsStrArr = configMethodsStr.split("\\s+"); 7235f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius for (int i = 0; i < configMethodsStrArr.length; i++) { 7245f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius configMethodsMask |= stringToWpsConfigMethod(configMethodsStrArr[i]); 7255f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius } 7265f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius return setWpsConfigMethods(configMethodsMask); 7275f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius } 7285f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius 7297651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius private boolean setWpsConfigMethods(short configMethods) { 7307651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius synchronized (mLock) { 7317651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius final String methodStr = "setWpsConfigMethods"; 7327651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (DBG) Log.i(TAG, methodStr); 7337651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 7347651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius try { 7357651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius SupplicantStatus status = mISupplicantStaIface.setWpsConfigMethods(configMethods); 7367651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return checkStatusAndLogFailure(status, methodStr); 7377651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } catch (RemoteException e) { 7387651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 7397651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius supplicantServiceDiedHandler(); 7407651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return false; 7417651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 7427651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 7437651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 7447651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius 745d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** 746d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Trigger a reassociation even if the iface is currently connected. 747d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 748d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 749d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 750d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean reassociate() { 75196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 75296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "reassociate"; 75396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 75496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 75596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 75696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.reassociate(); 75796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 75896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 75996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 76096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 76196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 76296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 76396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 76496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 765d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 766d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** 767d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Trigger a reconnection if the iface is disconnected. 768d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 769d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 770d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 771d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean reconnect() { 77296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 77396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "reconnect"; 77496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 77596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 77696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 77796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.reconnect(); 77896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 77996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 78096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 78196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 78296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 78396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 78496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 78596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 786d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 787d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** 788d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Trigger a disconnection from the currently connected network. 789d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 790d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 791d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 792d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean disconnect() { 79396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 79496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "disconnect"; 79596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 79696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 79796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 79896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.disconnect(); 79996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 80096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 80196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 80296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 80396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 80496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 80596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 80696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 807d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 808d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** 809d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Enable or disable power save mode. 810d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 811d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @param enable true to enable, false to disable. 812d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 813d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 814d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean setPowerSave(boolean enable) { 81596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 81696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "setPowerSave"; 81796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 81896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 81996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 82096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.setPowerSave(enable); 82196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 82296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 82396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 82496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 82596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 82696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 82796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 82896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 829d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 830d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** 831d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Initiate TDLS discover with the specified AP. 832d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 833d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @param macAddress MAC Address of the AP. 834d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 835d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 836d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean initiateTdlsDiscover(String macAddress) { 837d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius return initiateTdlsDiscover(NativeUtil.macAddressToByteArray(macAddress)); 838d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius } 839b4419d876beda78c29836726e43d80203b4a656cRoshan Pius /** See ISupplicantStaIface.hal for documentation */ 84096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne private boolean initiateTdlsDiscover(byte[/* 6 */] macAddress) { 84196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 84296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "initiateTdlsDiscover"; 84396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 84496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 84596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 84696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.initiateTdlsDiscover(macAddress); 84796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 84896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 84996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 85096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 85196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 85296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 85396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 85496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 855d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 856d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** 857d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Initiate TDLS setup with the specified AP. 858d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 859d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @param macAddress MAC Address of the AP. 860d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 861d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 862d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean initiateTdlsSetup(String macAddress) { 863d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius return initiateTdlsSetup(NativeUtil.macAddressToByteArray(macAddress)); 864d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius } 865b4419d876beda78c29836726e43d80203b4a656cRoshan Pius /** See ISupplicantStaIface.hal for documentation */ 86696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne private boolean initiateTdlsSetup(byte[/* 6 */] macAddress) { 86796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 86896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "initiateTdlsSetup"; 86996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 87096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 87196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 87296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.initiateTdlsSetup(macAddress); 87396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 87496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 87596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 87696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 87796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 87896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 87996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 88096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 881d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 882d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** 883d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Initiate TDLS teardown with the specified AP. 884d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @param macAddress MAC Address of the AP. 885d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 886d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 887d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean initiateTdlsTeardown(String macAddress) { 888d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius return initiateTdlsTeardown(NativeUtil.macAddressToByteArray(macAddress)); 889d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius } 890d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 891b4419d876beda78c29836726e43d80203b4a656cRoshan Pius /** See ISupplicantStaIface.hal for documentation */ 89296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne private boolean initiateTdlsTeardown(byte[/* 6 */] macAddress) { 89396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 89496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "initiateTdlsTeardown"; 89596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 89696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 89796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 89896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.initiateTdlsTeardown(macAddress); 89996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 90096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 90196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 90296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 90396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 90496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 90596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 90696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 907d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 908d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** 909d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Request the specified ANQP elements |elements| from the specified AP |bssid|. 910d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 911d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @param bssid BSSID of the AP 912d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @param infoElements ANQP elements to be queried. Refer to ISupplicantStaIface.AnqpInfoId. 913d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @param hs20SubTypes HS subtypes to be queried. Refer to ISupplicantStaIface.Hs20AnqpSubTypes. 914d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 915d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 916d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean initiateAnqpQuery(String bssid, ArrayList<Short> infoElements, 917d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius ArrayList<Integer> hs20SubTypes) { 918d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius return initiateAnqpQuery( 919d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius NativeUtil.macAddressToByteArray(bssid), infoElements, hs20SubTypes); 920d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius } 921d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 922b4419d876beda78c29836726e43d80203b4a656cRoshan Pius /** See ISupplicantStaIface.hal for documentation */ 92396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne private boolean initiateAnqpQuery(byte[/* 6 */] macAddress, 92496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne java.util.ArrayList<Short> infoElements, java.util.ArrayList<Integer> subTypes) { 92596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 92696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "initiateAnqpQuery"; 92796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 92896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 92996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 93096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.initiateAnqpQuery(macAddress, 93196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne infoElements, subTypes); 93296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 93396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 93496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 93596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 93696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 93796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 93896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 93996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 940d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 941d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** 942d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Request the specified ANQP ICON from the specified AP |bssid|. 943d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 944d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @param bssid BSSID of the AP 945d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @param fileName Name of the file to request. 946d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 947d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 948d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean initiateHs20IconQuery(String bssid, String fileName) { 949d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius return initiateHs20IconQuery(NativeUtil.macAddressToByteArray(bssid), fileName); 950d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius } 951d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 952b4419d876beda78c29836726e43d80203b4a656cRoshan Pius /** See ISupplicantStaIface.hal for documentation */ 95396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne private boolean initiateHs20IconQuery(byte[/* 6 */] macAddress, String fileName) { 95496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 95596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "initiateHs20IconQuery"; 95696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 95796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 95896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 95996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.initiateHs20IconQuery(macAddress, 96096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne fileName); 96196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 96296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 96396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 96496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 96596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 96696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 96796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 96896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 969d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 97096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne /** 97196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * Makes a callback to HIDL to getMacAddress from supplicant 972d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 97396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * @return string containing the MAC address, or null on a failed call 97496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne */ 975d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public String getMacAddress() { 97696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 97796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "getMacAddress"; 97896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 97996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return null; 98096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Mutable<String> gotMac = new Mutable<>(); 98196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 98296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne mISupplicantStaIface.getMacAddress((SupplicantStatus status, 98396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne byte[/* 6 */] macAddr) -> { 9843aa9b7e616f685ded8fade523317e96cedcdcc2dRoshan Pius if (checkStatusAndLogFailure(status, methodStr)) { 985d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius gotMac.value = NativeUtil.macAddressFromByteArray(macAddr); 98696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 98796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne }); 98896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 98996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception: " + e); 99096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 99196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 9923aa9b7e616f685ded8fade523317e96cedcdcc2dRoshan Pius return gotMac.value; 99396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 99496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 995d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 996d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** 997d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Start using the added RX filters. 998d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 999d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 1000d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 1001d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean startRxFilter() { 100296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 100396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "startRxFilter"; 100496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 100596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 100696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 100796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.startRxFilter(); 100896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 100996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 101096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 101196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 101296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 101396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 101496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 101596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 1016d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 1017d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** 1018d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Stop using the added RX filters. 1019d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 1020d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 1021d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 1022d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean stopRxFilter() { 102396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 102496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "stopRxFilter"; 102596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 102696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 102796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 102896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.stopRxFilter(); 102996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 103096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 103196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 103296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 103396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 103496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 103596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 103696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 1037d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 1038d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public static final byte RX_FILTER_TYPE_V4_MULTICAST = 1039d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius ISupplicantStaIface.RxFilterType.V6_MULTICAST; 1040d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public static final byte RX_FILTER_TYPE_V6_MULTICAST = 1041d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius ISupplicantStaIface.RxFilterType.V6_MULTICAST; 1042d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** 1043d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Add an RX filter. 1044d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 1045d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @param type one of {@link #RX_FILTER_TYPE_V4_MULTICAST} or 1046d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * {@link #RX_FILTER_TYPE_V6_MULTICAST} values. 1047d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 1048d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 104996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne private boolean addRxFilter(byte type) { 105096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 105196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "addRxFilter"; 105296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 105396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 105496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 105596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.addRxFilter(type); 105696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 105796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 105896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 105996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 106096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 106196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 106296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 106396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 1064d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 1065d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** 1066d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Remove an RX filter. 1067d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 1068d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @param type one of {@link #RX_FILTER_TYPE_V4_MULTICAST} or 1069d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * {@link #RX_FILTER_TYPE_V6_MULTICAST} values. 1070d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 1071d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 107296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne private boolean removeRxFilter(byte type) { 107396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 107496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "removeRxFilter"; 107596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 107696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 107796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 107896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.removeRxFilter(type); 107996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 108096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 108196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 108296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 108396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 108496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 108596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 108696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 1087d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 1088d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public static final byte BT_COEX_MODE_ENABLED = ISupplicantStaIface.BtCoexistenceMode.ENABLED; 1089d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public static final byte BT_COEX_MODE_DISABLED = ISupplicantStaIface.BtCoexistenceMode.DISABLED; 1090d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public static final byte BT_COEX_MODE_SENSE = ISupplicantStaIface.BtCoexistenceMode.SENSE; 1091d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** 1092d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Set Bt co existense mode. 1093d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 1094d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @param mode one of the above {@link #BT_COEX_MODE_ENABLED}, {@link #BT_COEX_MODE_DISABLED} 1095d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * or {@link #BT_COEX_MODE_SENSE} values. 1096d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 1097d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 1098d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean setBtCoexistenceMode(byte mode) { 109996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 110096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "setBtCoexistenceMode"; 110196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 110296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 110396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 110496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.setBtCoexistenceMode(mode); 110596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 110696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 110796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 110896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 110996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 111096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 111196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 111296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 1113d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 1114d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** Enable or disable BT coexistence mode. 1115d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 1116d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @param enable true to enable, false to disable. 1117d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 1118d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 1119d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean setBtCoexistenceScanModeEnabled(boolean enable) { 112096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 112196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "setBtCoexistenceScanModeEnabled"; 112296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 112396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 112496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 112596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = 112696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne mISupplicantStaIface.setBtCoexistenceScanModeEnabled(enable); 112796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 112896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 112996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 113096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 113196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 113296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 113396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 113496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 1135d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 1136d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** 1137d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Enable or disable suspend mode optimizations. 1138d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 1139d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @param enable true to enable, false otherwise. 11405f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @return true if request is sent successfully, false otherwise. 1141d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 1142d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean setSuspendModeEnabled(boolean enable) { 114396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 114496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "setSuspendModeEnabled"; 114596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 114696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 114796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 114896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.setSuspendModeEnabled(enable); 114996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 115096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 115196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 115296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 115396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 115496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 115596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 115696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 1157d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 1158d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** 1159d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Set country code. 1160d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 1161d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @param codeStr 2 byte ASCII string. For ex: US, CA. 1162d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 1163d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 1164d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean setCountryCode(String codeStr) { 1165d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius return setCountryCode(NativeUtil.stringToByteArray(codeStr)); 1166d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius } 1167d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 1168b4419d876beda78c29836726e43d80203b4a656cRoshan Pius /** See ISupplicantStaIface.hal for documentation */ 116996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne private boolean setCountryCode(byte[/* 2 */] code) { 117096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 117196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "setCountryCode"; 117296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 117396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 117496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 117596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.setCountryCode(code); 117696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 117796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 117896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 117996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 118096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 118196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 118296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 118396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 118496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne 11855f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius /** 11865f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * Start WPS pin registrar operation with the specified peer and pin. 11875f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * 11885f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @param bssidStr BSSID of the peer. 11895f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @param pin Pin to be used. 11905f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @return true if request is sent successfully, false otherwise. 11915f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius */ 11925f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius public boolean startWpsRegistrar(String bssidStr, String pin) { 11935f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius return startWpsRegistrar(NativeUtil.macAddressToByteArray(bssidStr), pin); 11945f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius } 11955f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius 11967651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius /** See ISupplicantStaIface.hal for documentation */ 11977651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius private boolean startWpsRegistrar(byte[/* 6 */] bssid, String pin) { 11987651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius synchronized (mLock) { 11997651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius final String methodStr = "startWpsRegistrar"; 12007651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (DBG) Log.i(TAG, methodStr); 12017651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 12027651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius try { 12037651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius SupplicantStatus status = mISupplicantStaIface.startWpsRegistrar(bssid, pin); 12047651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return checkStatusAndLogFailure(status, methodStr); 12057651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } catch (RemoteException e) { 12067651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 12077651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius supplicantServiceDiedHandler(); 12087651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return false; 12097651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 12107651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 12117651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 12127651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius 12135f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius /** 12145f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * Start WPS pin display operation with the specified peer. 12155f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * 12165f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @param bssidStr BSSID of the peer. 12175f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @return true if request is sent successfully, false otherwise. 12185f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius */ 12195f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius public boolean startWpsPbc(String bssidStr) { 12205f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius return startWpsPbc(NativeUtil.macAddressToByteArray(bssidStr)); 12215f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius } 12225f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius 12237651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius /** See ISupplicantStaIface.hal for documentation */ 12247651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius private boolean startWpsPbc(byte[/* 6 */] bssid) { 12257651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius synchronized (mLock) { 12267651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius final String methodStr = "startWpsPbc"; 12277651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (DBG) Log.i(TAG, methodStr); 12287651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 12297651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius try { 12307651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius SupplicantStatus status = mISupplicantStaIface.startWpsPbc(bssid); 12317651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return checkStatusAndLogFailure(status, methodStr); 12327651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } catch (RemoteException e) { 12337651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 12347651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius supplicantServiceDiedHandler(); 12357651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return false; 12367651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 12377651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 12387651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 12397651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius 12405f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius /** 12415f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * Start WPS pin keypad operation with the specified pin. 12425f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * 12435f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @param pin Pin to be used. 12445f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @return true if request is sent successfully, false otherwise. 12455f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius */ 12465f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius public boolean startWpsPinKeypad(String pin) { 12477651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius synchronized (mLock) { 12487651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius final String methodStr = "startWpsPinKeypad"; 12497651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (DBG) Log.i(TAG, methodStr); 12507651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 12517651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius try { 12527651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius SupplicantStatus status = mISupplicantStaIface.startWpsPinKeypad(pin); 12537651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return checkStatusAndLogFailure(status, methodStr); 12547651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } catch (RemoteException e) { 12557651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 12567651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius supplicantServiceDiedHandler(); 12577651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return false; 12587651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 12597651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 12607651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 12617651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius 12625f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius /** 12635f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * Start WPS pin display operation with the specified peer. 12645f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * 12655f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @param bssidStr BSSID of the peer. 12665f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @return new pin generated on success, null otherwise. 12675f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius */ 12685f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius public String startWpsPinDisplay(String bssidStr) { 12695f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius return startWpsPinDisplay(NativeUtil.macAddressToByteArray(bssidStr)); 12705f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius } 12715f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius 12727651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius /** See ISupplicantStaIface.hal for documentation */ 12737651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius private String startWpsPinDisplay(byte[/* 6 */] bssid) { 12747651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius synchronized (mLock) { 12757651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius final String methodStr = "startWpsPinDisplay"; 12767651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (DBG) Log.i(TAG, methodStr); 12777651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return null; 12787651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius final Mutable<String> gotPin = new Mutable<>(); 12797651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius try { 12807651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius mISupplicantStaIface.startWpsPinDisplay(bssid, 12817651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius (SupplicantStatus status, String pin) -> { 12827651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (checkStatusAndLogFailure(status, methodStr)) { 12837651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius gotPin.value = pin; 12847651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 12857651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius }); 12867651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } catch (RemoteException e) { 12877651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 12887651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius supplicantServiceDiedHandler(); 12897651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 12907651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return gotPin.value; 12917651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 12927651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 12937651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius 12945f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius /** 12955f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * Cancels any ongoing WPS requests. 12965f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * 12975f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @return true if request is sent successfully, false otherwise. 12985f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius */ 12995f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius public boolean cancelWps() { 13007651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius synchronized (mLock) { 13017651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius final String methodStr = "cancelWps"; 13027651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (DBG) Log.i(TAG, methodStr); 13037651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 13047651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius try { 13057651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius SupplicantStatus status = mISupplicantStaIface.cancelWps(); 13067651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return checkStatusAndLogFailure(status, methodStr); 13077651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } catch (RemoteException e) { 13087651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 13097651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius supplicantServiceDiedHandler(); 13107651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return false; 13117651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 13127651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 13137651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 13147651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius 13155f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius /** 13165f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * Sets whether to use external sim for SIM/USIM processing. 13175f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * 13185f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @param useExternalSim true to enable, false otherwise. 13195f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @return true if request is sent successfully, false otherwise. 13205f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius */ 13215f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius public boolean setExternalSim(boolean useExternalSim) { 13227651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius synchronized (mLock) { 13237651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius final String methodStr = "setExternalSim"; 13247651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (DBG) Log.i(TAG, methodStr); 13257651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 13267651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius try { 13277651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius SupplicantStatus status = mISupplicantStaIface.setExternalSim(useExternalSim); 13287651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return checkStatusAndLogFailure(status, methodStr); 13297651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } catch (RemoteException e) { 13307651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 13317651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius supplicantServiceDiedHandler(); 13327651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return false; 13337651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 13347651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 13357651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 13367651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius 1337cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius public static final int LOG_LEVEL_EXCESSIVE = ISupplicant.DebugLevel.EXCESSIVE; 1338cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius public static final int LOG_LEVEL_MSGDUMP = ISupplicant.DebugLevel.MSGDUMP; 1339cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius public static final int LOG_LEVEL_DEBUG = ISupplicant.DebugLevel.DEBUG; 1340cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius public static final int LOG_LEVEL_INFO = ISupplicant.DebugLevel.INFO; 1341cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius public static final int LOG_LEVEL_WARNING = ISupplicant.DebugLevel.WARNING; 1342cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius public static final int LOG_LEVEL_ERROR = ISupplicant.DebugLevel.ERROR; 1343cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius /** 1344cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius * Set the debug log level for wpa_supplicant 1345cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius * @param level One of the above {@link #LOG_LEVEL_EXCESSIVE} - {@link #LOG_LEVEL_ERROR} value. 1346cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius * @return true if request is sent successfully, false otherwise. 1347cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius */ 1348cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius public boolean setLogLevel(int level) { 1349cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius return setDebugParams(level, false, false); 1350cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius } 1351cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius 1352cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius /** See ISupplicant.hal for documentation */ 1353cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius private boolean setDebugParams(int level, boolean showTimestamp, boolean showKeys) { 1354cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius synchronized (mLock) { 1355cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius final String methodStr = "setDebugParams"; 1356cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius if (DBG) Log.i(TAG, methodStr); 1357cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius if (!checkSupplicantAndLogFailure(methodStr)) return false; 1358cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius try { 1359cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius SupplicantStatus status = 1360cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius mISupplicant.setDebugParams(level, showTimestamp, showKeys); 1361cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius return checkStatusAndLogFailure(status, methodStr); 1362cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius } catch (RemoteException e) { 1363cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius Log.e(TAG, "ISupplicant." + methodStr + ": exception:" + e); 1364cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius supplicantServiceDiedHandler(); 1365cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius return false; 1366cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius } 1367cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius } 1368cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius } 1369cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius 1370cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius /** 1371cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius * Set concurrency priority between P2P & STA operations. 1372cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius * 1373cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius * @param isStaHigherPriority Set to true to prefer STA over P2P during concurrency operations, 1374cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius * false otherwise. 1375cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius * @return true if request is sent successfully, false otherwise. 1376cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius */ 1377cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius public boolean setConcurrencyPriority(boolean isStaHigherPriority) { 1378cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius if (isStaHigherPriority) { 1379cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius return setConcurrencyPriority(IfaceType.STA); 1380cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius } else { 1381cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius return setConcurrencyPriority(IfaceType.P2P); 1382cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius } 1383cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius } 1384cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius 1385cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius /** See ISupplicant.hal for documentation */ 1386cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius private boolean setConcurrencyPriority(int type) { 1387cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius synchronized (mLock) { 1388cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius final String methodStr = "setConcurrencyPriority"; 1389cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius if (DBG) Log.i(TAG, methodStr); 1390cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius if (!checkSupplicantAndLogFailure(methodStr)) return false; 1391cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius try { 1392cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius SupplicantStatus status = mISupplicant.setConcurrencyPriority(type); 1393cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius return checkStatusAndLogFailure(status, methodStr); 1394cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius } catch (RemoteException e) { 1395cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius Log.e(TAG, "ISupplicant." + methodStr + ": exception:" + e); 1396cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius supplicantServiceDiedHandler(); 1397cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius return false; 1398cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius } 1399cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius } 1400cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius } 1401cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius 1402cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius /** 1403cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius * Returns false if Supplicant is null, and logs failure to call methodStr 1404cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius */ 1405cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius private boolean checkSupplicantAndLogFailure(final String methodStr) { 1406cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius if (DBG) Log.i(TAG, methodStr); 1407cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius if (mISupplicant == null) { 1408cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius Log.e(TAG, "Can't call " + methodStr + ", ISupplicant is null"); 1409cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius return false; 1410cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius } 1411cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius return true; 1412cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius } 1413cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius 141496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne /** 141596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * Returns false if SupplicantStaIface is null, and logs failure to call methodStr 141696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne */ 141796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne private boolean checkSupplicantStaIfaceAndLogFailure(final String methodStr) { 141896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 141996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (mISupplicantStaIface == null) { 142096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "Can't call " + methodStr + ", ISupplicantStaIface is null"); 142196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 142296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 142396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return true; 142496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 142596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne 142696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne /** 142796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * Returns true if provided status code is SUCCESS, logs debug message and returns false 142896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * otherwise 142996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne */ 143096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne private static boolean checkStatusAndLogFailure(SupplicantStatus status, 143196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr) { 143296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 143396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (status.code != SupplicantStatusCode.SUCCESS) { 143496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, methodStr + " failed: " + supplicantStatusCodeToString(status.code) + ", " 143596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne + status.debugMessage); 143696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 143796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 143896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return true; 143996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 144096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne 144196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne /** 144296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * Converts SupplicantStatus code values to strings for debug logging 144396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * TODO(b/34811152) Remove this, or make it more break resistance 144496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne */ 144596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne public static String supplicantStatusCodeToString(int code) { 144696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne switch (code) { 144796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne case 0: 144896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return "SUCCESS"; 144996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne case 1: 145096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return "FAILURE_UNKNOWN"; 145196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne case 2: 145296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return "FAILURE_ARGS_INVALID"; 145396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne case 3: 145496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return "FAILURE_IFACE_INVALID"; 145596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne case 4: 145696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return "FAILURE_IFACE_UNKNOWN"; 145796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne case 5: 145896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return "FAILURE_IFACE_EXISTS"; 145996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne case 6: 146096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return "FAILURE_IFACE_DISABLED"; 146196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne case 7: 146296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return "FAILURE_IFACE_NOT_DISCONNECTED"; 146396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne case 8: 146496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return "FAILURE_NETWORK_INVALID"; 146596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne case 9: 146696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return "FAILURE_NETWORK_UNKNOWN"; 146796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne default: 146896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return "??? UNKNOWN_CODE"; 146996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 147096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 147196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne 14725f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius 14735f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius /** 14745f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * Converts the Wps config method string to the equivalent enum value. 14755f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius */ 14765f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius private static short stringToWpsConfigMethod(String configMethod) { 14775f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius switch (configMethod) { 14785f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius case "usba": 14795f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius return WpsConfigMethods.USBA; 14805f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius case "ethernet": 14815f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius return WpsConfigMethods.ETHERNET; 14825f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius case "label": 14835f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius return WpsConfigMethods.LABEL; 14845f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius case "display": 14855f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius return WpsConfigMethods.DISPLAY; 14865f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius case "int_nfc_token": 14875f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius return WpsConfigMethods.INT_NFC_TOKEN; 14885f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius case "ext_nfc_token": 14895f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius return WpsConfigMethods.EXT_NFC_TOKEN; 14905f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius case "nfc_interface": 14915f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius return WpsConfigMethods.NFC_INTERFACE; 14925f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius case "push_button": 14935f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius return WpsConfigMethods.PUSHBUTTON; 14945f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius case "keypad": 14955f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius return WpsConfigMethods.KEYPAD; 14965f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius case "virtual_push_button": 14975f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius return WpsConfigMethods.VIRT_PUSHBUTTON; 14985f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius case "physical_push_button": 14995f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius return WpsConfigMethods.PHY_PUSHBUTTON; 15005f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius case "p2ps": 15015f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius return WpsConfigMethods.P2PS; 15025f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius case "virtual_display": 15035f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius return WpsConfigMethods.VIRT_DISPLAY; 15045f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius case "physical_display": 15055f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius return WpsConfigMethods.PHY_DISPLAY; 15065f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius default: 15075f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius throw new IllegalArgumentException( 15085f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius "Invalid WPS config method: " + configMethod); 15095f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius } 15105f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius } 15115f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius 1512240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne private static class Mutable<E> { 1513240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne public E value; 1514240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne 1515240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne Mutable() { 1516240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne value = null; 1517240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 1518240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne 1519240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne Mutable(E value) { 1520240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne this.value = value; 1521240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 1522240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 152366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne 1524c224fb554deca894818490c9416ff35d18a79d76Roshan Pius private class SupplicantStaIfaceHalCallback extends ISupplicantStaIfaceCallback.Stub { 1525c224fb554deca894818490c9416ff35d18a79d76Roshan Pius @Override 1526c224fb554deca894818490c9416ff35d18a79d76Roshan Pius public void onNetworkAdded(int id) { 1527c224fb554deca894818490c9416ff35d18a79d76Roshan Pius } 1528c224fb554deca894818490c9416ff35d18a79d76Roshan Pius 1529c224fb554deca894818490c9416ff35d18a79d76Roshan Pius @Override 1530c224fb554deca894818490c9416ff35d18a79d76Roshan Pius public void onNetworkRemoved(int id) { 1531c224fb554deca894818490c9416ff35d18a79d76Roshan Pius } 1532c224fb554deca894818490c9416ff35d18a79d76Roshan Pius 1533c224fb554deca894818490c9416ff35d18a79d76Roshan Pius @Override 1534c224fb554deca894818490c9416ff35d18a79d76Roshan Pius public void onStateChanged(int newState, byte[/* 6 */] bssid, int id, 1535c224fb554deca894818490c9416ff35d18a79d76Roshan Pius ArrayList<Byte> ssid) { 1536c224fb554deca894818490c9416ff35d18a79d76Roshan Pius } 1537c224fb554deca894818490c9416ff35d18a79d76Roshan Pius 1538c224fb554deca894818490c9416ff35d18a79d76Roshan Pius @Override 1539c224fb554deca894818490c9416ff35d18a79d76Roshan Pius public void onAnqpQueryDone(byte[/* 6 */] macAddress, 1540c224fb554deca894818490c9416ff35d18a79d76Roshan Pius ISupplicantStaIfaceCallback.AnqpData data, 1541c224fb554deca894818490c9416ff35d18a79d76Roshan Pius ISupplicantStaIfaceCallback.Hs20AnqpData hs20Data) { 1542c224fb554deca894818490c9416ff35d18a79d76Roshan Pius } 1543c224fb554deca894818490c9416ff35d18a79d76Roshan Pius 1544c224fb554deca894818490c9416ff35d18a79d76Roshan Pius @Override 1545c224fb554deca894818490c9416ff35d18a79d76Roshan Pius public void onHs20IconQueryDone(byte[/* 6 */] macAddress, String fileName, 1546c224fb554deca894818490c9416ff35d18a79d76Roshan Pius ArrayList<Byte> data) { 1547c224fb554deca894818490c9416ff35d18a79d76Roshan Pius } 1548c224fb554deca894818490c9416ff35d18a79d76Roshan Pius 1549c224fb554deca894818490c9416ff35d18a79d76Roshan Pius @Override 1550c224fb554deca894818490c9416ff35d18a79d76Roshan Pius public void onHs20SubscriptionRemediation(byte osuMethod, String url) { 1551c224fb554deca894818490c9416ff35d18a79d76Roshan Pius } 1552c224fb554deca894818490c9416ff35d18a79d76Roshan Pius 1553c224fb554deca894818490c9416ff35d18a79d76Roshan Pius @Override 1554c224fb554deca894818490c9416ff35d18a79d76Roshan Pius public void onHs20DeauthImminentNotice(int reasonCode, int reAuthDelayInSec, String url) { 1555c224fb554deca894818490c9416ff35d18a79d76Roshan Pius } 1556c224fb554deca894818490c9416ff35d18a79d76Roshan Pius 1557c224fb554deca894818490c9416ff35d18a79d76Roshan Pius @Override 1558c224fb554deca894818490c9416ff35d18a79d76Roshan Pius public void onDisconnected(byte[/* 6 */] bssid, boolean locallyGenerated, int reasonCode) { 1559c224fb554deca894818490c9416ff35d18a79d76Roshan Pius } 1560c224fb554deca894818490c9416ff35d18a79d76Roshan Pius 1561c224fb554deca894818490c9416ff35d18a79d76Roshan Pius @Override 1562c224fb554deca894818490c9416ff35d18a79d76Roshan Pius public void onAssociationRejected(byte[/* 6 */] bssid, int statusCode) { 1563c224fb554deca894818490c9416ff35d18a79d76Roshan Pius } 1564c224fb554deca894818490c9416ff35d18a79d76Roshan Pius 1565c224fb554deca894818490c9416ff35d18a79d76Roshan Pius @Override 1566c224fb554deca894818490c9416ff35d18a79d76Roshan Pius public void onAuthenticationTimeout(byte[/* 6 */] bssid) { 1567c224fb554deca894818490c9416ff35d18a79d76Roshan Pius } 1568c224fb554deca894818490c9416ff35d18a79d76Roshan Pius 1569c224fb554deca894818490c9416ff35d18a79d76Roshan Pius @Override 1570c224fb554deca894818490c9416ff35d18a79d76Roshan Pius public void onEapFailure() { 1571c224fb554deca894818490c9416ff35d18a79d76Roshan Pius } 1572c224fb554deca894818490c9416ff35d18a79d76Roshan Pius 1573c224fb554deca894818490c9416ff35d18a79d76Roshan Pius @Override 1574c224fb554deca894818490c9416ff35d18a79d76Roshan Pius public void onWpsEventSuccess() { 1575c224fb554deca894818490c9416ff35d18a79d76Roshan Pius } 1576c224fb554deca894818490c9416ff35d18a79d76Roshan Pius 1577c224fb554deca894818490c9416ff35d18a79d76Roshan Pius @Override 1578c224fb554deca894818490c9416ff35d18a79d76Roshan Pius public void onWpsEventFail(byte[/* 6 */] bssid, short configError, short errorInd) { 1579c224fb554deca894818490c9416ff35d18a79d76Roshan Pius } 1580c224fb554deca894818490c9416ff35d18a79d76Roshan Pius 1581c224fb554deca894818490c9416ff35d18a79d76Roshan Pius @Override 1582c224fb554deca894818490c9416ff35d18a79d76Roshan Pius public void onWpsEventPbcOverlap() { 1583c224fb554deca894818490c9416ff35d18a79d76Roshan Pius } 1584c224fb554deca894818490c9416ff35d18a79d76Roshan Pius 1585c224fb554deca894818490c9416ff35d18a79d76Roshan Pius @Override 1586c224fb554deca894818490c9416ff35d18a79d76Roshan Pius public void onExtRadioWorkStart(int id) { 1587c224fb554deca894818490c9416ff35d18a79d76Roshan Pius } 1588c224fb554deca894818490c9416ff35d18a79d76Roshan Pius 1589c224fb554deca894818490c9416ff35d18a79d76Roshan Pius @Override 1590c224fb554deca894818490c9416ff35d18a79d76Roshan Pius public void onExtRadioWorkTimeout(int id) { 1591c224fb554deca894818490c9416ff35d18a79d76Roshan Pius } 1592c224fb554deca894818490c9416ff35d18a79d76Roshan Pius } 1593c224fb554deca894818490c9416ff35d18a79d76Roshan Pius 159466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne private void logd(String s) { 159566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne Log.d(TAG, s); 159666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 159766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne 159866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne private void logi(String s) { 159966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne Log.i(TAG, s); 160066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 160166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne 160266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne private void loge(String s) { 160366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne Log.e(TAG, s); 160466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 1605240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne} 1606