SupplicantStaIfaceHal.java revision 7651e69b6f5e2b28a4fee7284ac2522faa002c9f
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; 2396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhneimport android.hardware.wifi.supplicant.V1_0.ISupplicantStaNetwork; 24240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhneimport android.hardware.wifi.supplicant.V1_0.IfaceType; 25240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhneimport android.hardware.wifi.supplicant.V1_0.SupplicantStatus; 26240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhneimport android.hardware.wifi.supplicant.V1_0.SupplicantStatusCode; 27240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhneimport android.hidl.manager.V1_0.IServiceManager; 28240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhneimport android.hidl.manager.V1_0.IServiceNotification; 29f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Piusimport android.net.IpConfiguration; 3066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhneimport android.net.wifi.WifiConfiguration; 31240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhneimport android.os.RemoteException; 32240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhneimport android.util.Log; 3396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhneimport android.util.MutableBoolean; 34f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Piusimport android.util.SparseArray; 3596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne 36d95fa596d07855b70ff18a50a48e773155a919f5Roshan Piusimport com.android.server.wifi.util.NativeUtil; 37240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne 38240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhneimport java.util.ArrayList; 39f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Piusimport java.util.HashMap; 40f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Piusimport java.util.List; 41f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Piusimport java.util.Map; 42d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 43240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne/** 44240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne * Hal calls for bring up/shut down of the supplicant daemon and for 45240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne * sending requests to the supplicant daemon 46240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne */ 47b4419d876beda78c29836726e43d80203b4a656cRoshan Piuspublic class SupplicantStaIfaceHal { 48240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne private static final boolean DBG = false; 49b4419d876beda78c29836726e43d80203b4a656cRoshan Pius private static final String TAG = "SupplicantStaIfaceHal"; 5098152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne private static final String SERVICE_MANAGER_NAME = "manager"; 5198152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne private IServiceManager mIServiceManager = null; 5298152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne // Supplicant HAL interface objects 5398152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne private ISupplicant mISupplicant; 5498152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne private ISupplicantStaIface mISupplicantStaIface; 557c0ec884188660f72977c8a80366049705c48ffaRoshan Pius // Currently configured network in wpa_supplicant 567c0ec884188660f72977c8a80366049705c48ffaRoshan Pius private SupplicantStaNetworkHal mCurrentNetwork; 577c0ec884188660f72977c8a80366049705c48ffaRoshan Pius // Currently configured network's framework network Id. 587c0ec884188660f72977c8a80366049705c48ffaRoshan Pius private int mFrameworkNetworkId; 59240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne private final Object mLock = new Object(); 60c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius private final Context mContext; 61c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius private final WifiMonitor mWifiMonitor; 627c0ec884188660f72977c8a80366049705c48ffaRoshan Pius 63c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius public SupplicantStaIfaceHal(Context context, WifiMonitor monitor) { 64c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius mContext = context; 65c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius mWifiMonitor = monitor; 668c6d09c03532b3936fab2fed6f8b84c895333565Roshan Pius } 67240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne 68240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne /** 6998152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne * Registers a service notification for the ISupplicant service, which triggers intialization of 7098152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne * the ISupplicantStaIface 71240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne * @return true if the service notification was successfully registered 72240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne */ 73240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne public boolean initialize() { 7498152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne if (DBG) Log.i(TAG, "Registering ISupplicant service ready callback."); 75240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne synchronized (mLock) { 7698152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne mISupplicant = null; 7798152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne mISupplicantStaIface = null; 7898152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne if (mIServiceManager != null) { 7998152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne // Already have an IServiceManager and serviceNotification registered, don't 8098152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne // don't register another. 8198152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne return true; 8298152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne } 83240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne try { 8498152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne mIServiceManager = getServiceManagerMockable(); 8598152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne if (mIServiceManager == null) { 86240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne Log.e(TAG, "Failed to get HIDL Service Manager"); 87240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne return false; 88240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 8998152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne if (!mIServiceManager.linkToDeath(cookie -> { 90240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne Log.wtf(TAG, "IServiceManager died: cookie=" + cookie); 91240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne synchronized (mLock) { 92240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne supplicantServiceDiedHandler(); 9398152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne mIServiceManager = null; // Will need to register a new ServiceNotification 94240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 95240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne }, 0)) { 96240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne Log.wtf(TAG, "Error on linkToDeath on IServiceManager"); 97240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne supplicantServiceDiedHandler(); 9898152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne mIServiceManager = null; // Will need to register a new ServiceNotification 99240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne return false; 100240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 101240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne IServiceNotification serviceNotificationCb = new IServiceNotification.Stub() { 102240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne public void onRegistration(String fqName, String name, boolean preexisting) { 10398152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne synchronized (mLock) { 10498152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne if (DBG) { 10598152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne Log.i(TAG, "IServiceNotification.onRegistration for: " + fqName 10698152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne + ", " + name + " preexisting=" + preexisting); 10798152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne } 10898152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne if (!initSupplicantService() || !initSupplicantStaIface()) { 10998152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne Log.e(TAG, "initalizing ISupplicantIfaces failed."); 11098152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne supplicantServiceDiedHandler(); 11198152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne } else { 11298152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne Log.i(TAG, "Completed initialization of ISupplicant interfaces."); 11398152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne } 114240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 115240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 116240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne }; 117240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne /* TODO(b/33639391) : Use the new ISupplicant.registerForNotifications() once it 118240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne exists */ 11998152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne if (!mIServiceManager.registerForNotifications(ISupplicant.kInterfaceName, 120240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne "", serviceNotificationCb)) { 121240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne Log.e(TAG, "Failed to register for notifications to " 122240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne + ISupplicant.kInterfaceName); 12398152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne mIServiceManager = null; // Will need to register a new ServiceNotification 124240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne return false; 125240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 126240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } catch (RemoteException e) { 127240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne Log.e(TAG, "Exception while trying to register a listener for ISupplicant service: " 128240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne + e); 12998152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne supplicantServiceDiedHandler(); 130240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 131240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne return true; 132240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 133240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 134240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne 13598152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne private boolean initSupplicantService() { 136240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne synchronized (mLock) { 137240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne try { 13898152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne mISupplicant = getSupplicantMockable(); 139240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } catch (RemoteException e) { 140240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne Log.e(TAG, "ISupplicant.getService exception: " + e); 141240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne return false; 142240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 14398152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne if (mISupplicant == null) { 144240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne Log.e(TAG, "Got null ISupplicant service. Stopping supplicant HIDL startup"); 145240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne return false; 146240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 147240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 148240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne return true; 149240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 150240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne 15198152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne private boolean initSupplicantStaIface() { 152240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne synchronized (mLock) { 153240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne /** List all supplicant Ifaces */ 154240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne final ArrayList<ISupplicant.IfaceInfo> supplicantIfaces = new ArrayList<>(); 155240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne try { 15698152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne mISupplicant.listInterfaces((SupplicantStatus status, 157240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne ArrayList<ISupplicant.IfaceInfo> ifaces) -> { 158240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne if (status.code != SupplicantStatusCode.SUCCESS) { 159240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne Log.e(TAG, "Getting Supplicant Interfaces failed: " + status.code); 160240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne return; 161240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 162240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne supplicantIfaces.addAll(ifaces); 163240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne }); 164240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } catch (RemoteException e) { 165240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne Log.e(TAG, "ISupplicant.listInterfaces exception: " + e); 16698152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne return false; 167240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 168240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne if (supplicantIfaces.size() == 0) { 169240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne Log.e(TAG, "Got zero HIDL supplicant ifaces. Stopping supplicant HIDL startup."); 17098152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne return false; 171240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 172240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne Mutable<ISupplicantIface> supplicantIface = new Mutable<>(); 173240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne for (ISupplicant.IfaceInfo ifaceInfo : supplicantIfaces) { 17498152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne if (ifaceInfo.type == IfaceType.STA) { 175240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne try { 17698152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne mISupplicant.getInterface(ifaceInfo, 177240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne (SupplicantStatus status, ISupplicantIface iface) -> { 178240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne if (status.code != SupplicantStatusCode.SUCCESS) { 179240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne Log.e(TAG, "Failed to get ISupplicantIface " + status.code); 180240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne return; 181240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 182240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne supplicantIface.value = iface; 183240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne }); 184240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } catch (RemoteException e) { 185240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne Log.e(TAG, "ISupplicant.getInterface exception: " + e); 18698152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne return false; 187240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 188240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne break; 189240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 190240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 19198152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne if (supplicantIface.value == null) { 19298152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne Log.e(TAG, "initSupplicantStaIface got null iface"); 193240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne return false; 194240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 19598152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne mISupplicantStaIface = getStaIfaceMockable(supplicantIface.value); 196240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne return true; 197240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 198240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 199240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne 20098152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne private void supplicantServiceDiedHandler() { 201240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne synchronized (mLock) { 20298152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne mISupplicant = null; 20398152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne mISupplicantStaIface = null; 204240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 205240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 206240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne 20798152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne /** 20898152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne * Signals whether Initialization completed successfully. Only necessary for testing, is not 20998152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne * needed to guard calls etc. 21098152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne */ 21198152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne public boolean isInitializationComplete() { 21298152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne return mISupplicantStaIface != null; 2138c6d09c03532b3936fab2fed6f8b84c895333565Roshan Pius } 2148c6d09c03532b3936fab2fed6f8b84c895333565Roshan Pius 2158c6d09c03532b3936fab2fed6f8b84c895333565Roshan Pius /** 21698152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne * Wrapper functions to access static HAL methods, created to be mockable in unit tests 2178c6d09c03532b3936fab2fed6f8b84c895333565Roshan Pius */ 21898152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne protected IServiceManager getServiceManagerMockable() throws RemoteException { 21998152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne return IServiceManager.getService(SERVICE_MANAGER_NAME); 22098152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne } 22198152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne 22298152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne protected ISupplicant getSupplicantMockable() throws RemoteException { 22398152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne return ISupplicant.getService(); 22498152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne } 22598152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne 22698152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne protected ISupplicantStaIface getStaIfaceMockable(ISupplicantIface iface) { 22798152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne return ISupplicantStaIface.asInterface(iface.asBinder()); 2288c6d09c03532b3936fab2fed6f8b84c895333565Roshan Pius } 2298c6d09c03532b3936fab2fed6f8b84c895333565Roshan Pius 23096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne /** 2317c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * Add a network configuration to wpa_supplicant. 232d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 23366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne * @param config Config corresponding to the network. 23466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne * @return SupplicantStaNetwork of the added network in wpa_supplicant. 23566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne */ 236d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius private SupplicantStaNetworkHal addNetwork(WifiConfiguration config) { 23766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne logi("addSupplicantStaNetwork via HIDL"); 23866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne if (config == null) { 23966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne loge("Cannot add NULL network!"); 24066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne return null; 24166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 24266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne SupplicantStaNetworkHal network = addNetwork(); 24366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne if (network == null) { 24466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne loge("Failed to add a network!"); 24566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne return null; 24666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 24766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne if (network.saveWifiConfiguration(config)) { 24866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne return network; 24966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } else { 25066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne loge("Failed to save variables for: " + config.configKey()); 25166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne return null; 25266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 25366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 25466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne 25566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne /** 2567c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * Add the provided network configuration to wpa_supplicant and initiate connection to it. 2577c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * This method does the following: 2587c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * 1. Triggers disconnect command to wpa_supplicant (if |shouldDisconnect| is true). 2597c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * 2. Remove any existing network in wpa_supplicant. 2607c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * 3. Add a new network to wpa_supplicant. 2617c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * 4. Save the provided configuration to wpa_supplicant. 2627c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * 5. Select the new network in wpa_supplicant. 263d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 2647c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * @param config WifiConfiguration parameters for the provided network. 2657c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * @param shouldDisconnect whether to trigger a disconnection or not. 2667c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * @return {@code true} if it succeeds, {@code false} otherwise 26766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne */ 268d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean connectToNetwork(WifiConfiguration config, boolean shouldDisconnect) { 2697c0ec884188660f72977c8a80366049705c48ffaRoshan Pius mFrameworkNetworkId = WifiConfiguration.INVALID_NETWORK_ID; 2707c0ec884188660f72977c8a80366049705c48ffaRoshan Pius mCurrentNetwork = null; 271d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius logd("connectToNetwork " + config.configKey() 27266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne + " (shouldDisconnect " + shouldDisconnect + ")"); 27366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne if (shouldDisconnect && !disconnect()) { 27466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne loge("Failed to trigger disconnect"); 27566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne return false; 27666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 27766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne if (!removeAllNetworks()) { 27866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne loge("Failed to remove existing networks"); 27966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne return false; 28066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 2817c0ec884188660f72977c8a80366049705c48ffaRoshan Pius mCurrentNetwork = addNetwork(config); 2827c0ec884188660f72977c8a80366049705c48ffaRoshan Pius if (mCurrentNetwork == null) { 283d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius loge("Failed to add/save network configuration: " + config.configKey()); 28466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne return false; 28566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 2867c0ec884188660f72977c8a80366049705c48ffaRoshan Pius if (!mCurrentNetwork.select()) { 287d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius loge("Failed to select network configuration: " + config.configKey()); 28866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne return false; 28966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 2907c0ec884188660f72977c8a80366049705c48ffaRoshan Pius mFrameworkNetworkId = config.networkId; 2917c0ec884188660f72977c8a80366049705c48ffaRoshan Pius return true; 2927c0ec884188660f72977c8a80366049705c48ffaRoshan Pius } 2937c0ec884188660f72977c8a80366049705c48ffaRoshan Pius 2947c0ec884188660f72977c8a80366049705c48ffaRoshan Pius /** 2957c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * Initiates roaming to the already configured network in wpa_supplicant. If the network 2967c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * configuration provided does not match the already configured network, then this triggers 2977c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * a new connection attempt (instead of roam). 2987c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * 1. First check if we're attempting to connect to the same network as we currently have 2997c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * configured. 3007c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * 2. Set the new bssid for the network in wpa_supplicant. 3017c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * 3. Trigger reassociate command to wpa_supplicant. 3027c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * 3037c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * @param config WifiConfiguration parameters for the provided network. 3047c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * @return {@code true} if it succeeds, {@code false} otherwise 3057c0ec884188660f72977c8a80366049705c48ffaRoshan Pius */ 3067c0ec884188660f72977c8a80366049705c48ffaRoshan Pius public boolean roamToNetwork(WifiConfiguration config) { 3077c0ec884188660f72977c8a80366049705c48ffaRoshan Pius if (mFrameworkNetworkId != config.networkId || mCurrentNetwork == null) { 3087c0ec884188660f72977c8a80366049705c48ffaRoshan Pius Log.w(TAG, "Cannot roam to a different network, initiate new connection. " 3097c0ec884188660f72977c8a80366049705c48ffaRoshan Pius + "Current network ID: " + mFrameworkNetworkId); 3107c0ec884188660f72977c8a80366049705c48ffaRoshan Pius return connectToNetwork(config, false); 3117c0ec884188660f72977c8a80366049705c48ffaRoshan Pius } 3127c0ec884188660f72977c8a80366049705c48ffaRoshan Pius String bssid = config.getNetworkSelectionStatus().getNetworkSelectionBSSID(); 3137c0ec884188660f72977c8a80366049705c48ffaRoshan Pius logd("roamToNetwork" + config.configKey() + " (bssid " + bssid + ")"); 3147c0ec884188660f72977c8a80366049705c48ffaRoshan Pius if (!mCurrentNetwork.setBssid(bssid)) { 3157c0ec884188660f72977c8a80366049705c48ffaRoshan Pius loge("Failed to set new bssid on network: " + config.configKey()); 3167c0ec884188660f72977c8a80366049705c48ffaRoshan Pius return false; 3177c0ec884188660f72977c8a80366049705c48ffaRoshan Pius } 3187c0ec884188660f72977c8a80366049705c48ffaRoshan Pius if (!reassociate()) { 3197c0ec884188660f72977c8a80366049705c48ffaRoshan Pius loge("Failed to trigger reassociate"); 3207c0ec884188660f72977c8a80366049705c48ffaRoshan Pius return false; 3217c0ec884188660f72977c8a80366049705c48ffaRoshan Pius } 32266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne return true; 32366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 32466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne 32566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne /** 326f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius * Load all the configured networks from wpa_supplicant. 327f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius * 328f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius * @param configs Map of configuration key to configuration objects corresponding to all 329f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius * the networks. 330f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius * @param networkExtras Map of extra configuration parameters stored in wpa_supplicant.conf 331f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius * @return true if succeeds, false otherwise. 332f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius */ 333f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius public boolean loadNetworks(Map<String, WifiConfiguration> configs, 334f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius SparseArray<Map<String, String>> networkExtras) { 335f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius List<Integer> networkIds = listNetworks(); 336f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius if (networkIds == null) { 337f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius Log.e(TAG, "Failed to list networks"); 338f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius return false; 339f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius } 340f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius for (Integer networkId : networkIds) { 341f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius SupplicantStaNetworkHal network = getNetwork(networkId); 342f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius if (network == null) { 343f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius Log.e(TAG, "Failed to get network with ID: " + networkId); 344f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius return false; 345f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius } 346f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius WifiConfiguration config = new WifiConfiguration(); 347f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius Map<String, String> networkExtra = new HashMap<>(); 348f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius if (!network.loadWifiConfiguration(config, networkExtra)) { 349f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius Log.e(TAG, "Failed to load wifi configuration for network with ID: " + networkId); 350f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius return false; 351f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius } 352f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius // Set the default IP assignments. 353f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius config.setIpAssignment(IpConfiguration.IpAssignment.DHCP); 354f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius config.setProxySettings(IpConfiguration.ProxySettings.NONE); 355f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius 356f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius networkExtras.put(networkId, networkExtra); 357f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius String configKey = networkExtra.get(SupplicantStaNetworkHal.ID_STRING_KEY_CONFIG_KEY); 358f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius final WifiConfiguration duplicateConfig = configs.put(configKey, config); 359f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius if (duplicateConfig != null) { 360f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius // The network is already known. Overwrite the duplicate entry. 361f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius Log.i(TAG, "Replacing duplicate network: " + duplicateConfig.networkId); 362f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius removeNetwork(duplicateConfig.networkId); 363f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius networkExtras.remove(duplicateConfig.networkId); 364f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius } 365f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius } 366f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius return true; 367f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius } 368f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius 369f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius /** 37066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne * Remove all networks from supplicant 37166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne */ 37266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne public boolean removeAllNetworks() { 37366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne synchronized (mLock) { 37466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne ArrayList<Integer> networks = listNetworks(); 37566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne if (networks == null) { 37666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne Log.e(TAG, "removeAllNetworks failed, got null networks"); 37766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne return false; 37866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 37966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne for (int id : networks) { 38066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne if (!removeNetwork(id)) { 38166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne Log.e(TAG, "removeAllNetworks failed to remove network: " + id); 38266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne return false; 38366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 38466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 38566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 38666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne return true; 38766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 38866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne 38966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne /** 390d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Gets the interface name. 391d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 39296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * @return returns the name of Iface or null if the call fails 39396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne */ 39496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne private String getName() { 39596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 39696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne MutableBoolean statusSuccess = new MutableBoolean(false); 39796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "getName"; 39896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 39996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return null; 40096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final StringBuilder builder = new StringBuilder(); 40196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 40296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne mISupplicantStaIface.getName((SupplicantStatus status, String name) -> { 40396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne statusSuccess.value = status.code == SupplicantStatusCode.SUCCESS; 40496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!statusSuccess.value) { 40596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, methodStr + " failed: " + status.debugMessage); 40696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } else { 40796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne builder.append(name); 40896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 40996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne }); 41096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 41196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception: " + e); 41296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 41396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 41496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (statusSuccess.value) { 41596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return builder.toString(); 41696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } else { 41796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return null; 41896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 41996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 42096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 421d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 42296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne /** 423d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Adds a new network. 424d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 42596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * @return The ISupplicantNetwork object for the new network, or null if the call fails 42696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne */ 42796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne private SupplicantStaNetworkHal addNetwork() { 42896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 42996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne MutableBoolean statusSuccess = new MutableBoolean(false); 43096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Mutable<ISupplicantNetwork> newNetwork = new Mutable<>(); 43196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "addNetwork"; 43296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 43396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return null; 43496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 43596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne mISupplicantStaIface.addNetwork((SupplicantStatus status, 43696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne ISupplicantNetwork network) -> { 43796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne statusSuccess.value = status.code == SupplicantStatusCode.SUCCESS; 43896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!statusSuccess.value) { 43996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, methodStr + " failed: " + status.debugMessage); 44096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } else { 44196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne newNetwork.value = network; 44296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 44396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne }); 44496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 44596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception: " + e); 44696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 44796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 44896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (statusSuccess.value) { 449c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius return getStaNetworkMockable( 450c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius ISupplicantStaNetwork.asInterface(newNetwork.value.asBinder())); 45196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } else { 45296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return null; 45396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 45496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 45596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 456d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 45796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne /** 45896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * Remove network from supplicant with network Id 459d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 460d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 46196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne */ 46296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne private boolean removeNetwork(int id) { 46396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 46496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "removeNetwork"; 46596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 46696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 46796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 46896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.removeNetwork(id); 46996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 47096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 47196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 47296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 47396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 47496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 47596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 47696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 477d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 47896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne /** 479f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius * Use this to mock the creation of SupplicantStaNetworkHal instance. 480f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius * 481f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius * @param iSupplicantStaNetwork ISupplicantStaNetwork instance retrieved from HIDL. 482f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius * @return The ISupplicantNetwork object for the given SupplicantNetworkId int, returns null if 483f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius * the call fails 484f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius */ 485f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius protected SupplicantStaNetworkHal getStaNetworkMockable( 486c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius ISupplicantStaNetwork iSupplicantStaNetwork) { 487c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius return new SupplicantStaNetworkHal(iSupplicantStaNetwork, mContext, mWifiMonitor); 488f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius } 489f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius 490f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius /** 49196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * @return The ISupplicantNetwork object for the given SupplicantNetworkId int, returns null if 49296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * the call fails 49396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne */ 49496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne private SupplicantStaNetworkHal getNetwork(int id) { 49596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 49696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne MutableBoolean statusSuccess = new MutableBoolean(false); 49796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Mutable<ISupplicantNetwork> gotNetwork = new Mutable<>(); 49896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "getNetwork"; 49996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 50096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return null; 50196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 50296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne mISupplicantStaIface.getNetwork(id, (SupplicantStatus status, 50396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne ISupplicantNetwork network) -> { 50496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne statusSuccess.value = status.code == SupplicantStatusCode.SUCCESS; 50596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!statusSuccess.value) { 50696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, methodStr + " failed: " + status.debugMessage); 50796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } else { 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 } 51596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (statusSuccess.value) { 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 52496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne /** 52596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * @return a list of SupplicantNetworkID ints for all networks controlled by supplicant, returns 52696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * null if the call fails 52796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne */ 52896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne private java.util.ArrayList<Integer> listNetworks() { 52996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 53096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne MutableBoolean statusSuccess = new MutableBoolean(false); 53196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Mutable<ArrayList<Integer>> networkIdList = new Mutable<>(); 53296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "listNetworks"; 53396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 53496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return null; 53596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 53696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne mISupplicantStaIface.listNetworks((SupplicantStatus status, 53796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne java.util.ArrayList<Integer> networkIds) -> { 53896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne statusSuccess.value = status.code == SupplicantStatusCode.SUCCESS; 53996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!statusSuccess.value) { 54096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, methodStr + " failed: " + status.debugMessage); 54196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } else { 54296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne networkIdList.value = networkIds; 54396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 54496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne }); 54596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 54696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception: " + e); 54796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 54896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 54996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (statusSuccess.value) { 55096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return networkIdList.value; 55196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } else { 55296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return null; 55396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 55496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 55596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 556d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 5577651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius /** See ISupplicantIface.hal for documentation */ 5587651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius private boolean setWpsDeviceName(String name) { 5597651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius synchronized (mLock) { 5607651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius final String methodStr = "setWpsDeviceName"; 5617651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (DBG) Log.i(TAG, methodStr); 5627651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 5637651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius try { 5647651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius SupplicantStatus status = mISupplicantStaIface.setWpsDeviceName(name); 5657651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return checkStatusAndLogFailure(status, methodStr); 5667651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } catch (RemoteException e) { 5677651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 5687651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius supplicantServiceDiedHandler(); 5697651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return false; 5707651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 5717651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 5727651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 5737651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius 5747651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius /** See ISupplicantIface.hal for documentation */ 5757651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius private boolean setWpsDeviceType(byte[/* 8 */] type) { 5767651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius synchronized (mLock) { 5777651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius final String methodStr = "setWpsDeviceType"; 5787651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (DBG) Log.i(TAG, methodStr); 5797651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 5807651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius try { 5817651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius SupplicantStatus status = mISupplicantStaIface.setWpsDeviceType(type); 5827651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return checkStatusAndLogFailure(status, methodStr); 5837651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } catch (RemoteException e) { 5847651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 5857651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius supplicantServiceDiedHandler(); 5867651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return false; 5877651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 5887651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 5897651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 5907651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius 5917651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius /** See ISupplicantIface.hal for documentation */ 5927651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius private boolean setWpsManufacturer(String manufacturer) { 5937651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius synchronized (mLock) { 5947651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius final String methodStr = "setWpsManufacturer"; 5957651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (DBG) Log.i(TAG, methodStr); 5967651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 5977651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius try { 5987651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius SupplicantStatus status = mISupplicantStaIface.setWpsManufacturer(manufacturer); 5997651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return checkStatusAndLogFailure(status, methodStr); 6007651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } catch (RemoteException e) { 6017651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 6027651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius supplicantServiceDiedHandler(); 6037651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return false; 6047651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 6057651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 6067651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 6077651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius 6087651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius /** See ISupplicantIface.hal for documentation */ 6097651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius private boolean setWpsModelName(String modelName) { 6107651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius synchronized (mLock) { 6117651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius final String methodStr = "setWpsModelName"; 6127651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (DBG) Log.i(TAG, methodStr); 6137651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 6147651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius try { 6157651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius SupplicantStatus status = mISupplicantStaIface.setWpsModelName(modelName); 6167651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return checkStatusAndLogFailure(status, methodStr); 6177651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } catch (RemoteException e) { 6187651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 6197651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius supplicantServiceDiedHandler(); 6207651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return false; 6217651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 6227651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 6237651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 6247651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius 6257651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius /** See ISupplicantIface.hal for documentation */ 6267651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius private boolean setWpsModelNumber(String modelNumber) { 6277651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius synchronized (mLock) { 6287651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius final String methodStr = "setWpsModelNumber"; 6297651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (DBG) Log.i(TAG, methodStr); 6307651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 6317651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius try { 6327651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius SupplicantStatus status = mISupplicantStaIface.setWpsModelNumber(modelNumber); 6337651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return checkStatusAndLogFailure(status, methodStr); 6347651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } catch (RemoteException e) { 6357651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 6367651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius supplicantServiceDiedHandler(); 6377651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return false; 6387651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 6397651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 6407651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 6417651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius 6427651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius /** See ISupplicantIface.hal for documentation */ 6437651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius private boolean setWpsSerialNumber(String serialNumber) { 6447651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius synchronized (mLock) { 6457651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius final String methodStr = "setWpsSerialNumber"; 6467651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (DBG) Log.i(TAG, methodStr); 6477651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 6487651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius try { 6497651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius SupplicantStatus status = mISupplicantStaIface.setWpsSerialNumber(serialNumber); 6507651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return checkStatusAndLogFailure(status, methodStr); 6517651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } catch (RemoteException e) { 6527651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 6537651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius supplicantServiceDiedHandler(); 6547651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return false; 6557651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 6567651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 6577651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 6587651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius 6597651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius /** See ISupplicantIface.hal for documentation */ 6607651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius private boolean setWpsConfigMethods(short configMethods) { 6617651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius synchronized (mLock) { 6627651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius final String methodStr = "setWpsConfigMethods"; 6637651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (DBG) Log.i(TAG, methodStr); 6647651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 6657651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius try { 6667651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius SupplicantStatus status = mISupplicantStaIface.setWpsConfigMethods(configMethods); 6677651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return checkStatusAndLogFailure(status, methodStr); 6687651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } catch (RemoteException e) { 6697651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 6707651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius supplicantServiceDiedHandler(); 6717651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return false; 6727651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 6737651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 6747651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 6757651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius 676d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** 677d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Trigger a reassociation even if the iface is currently connected. 678d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 679d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 680d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 681d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean reassociate() { 68296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 68396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "reassociate"; 68496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 68596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 68696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 68796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.reassociate(); 68896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 68996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 69096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 69196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 69296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 69396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 69496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 69596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 696d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 697d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** 698d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Trigger a reconnection if the iface is disconnected. 699d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 700d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 701d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 702d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean reconnect() { 70396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 70496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "reconnect"; 70596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 70696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 70796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 70896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.reconnect(); 70996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 71096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 71196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 71296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 71396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 71496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 71596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 71696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 717d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 718d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** 719d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Trigger a disconnection from the currently connected network. 720d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 721d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 722d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 723d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean disconnect() { 72496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 72596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "disconnect"; 72696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 72796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 72896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 72996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.disconnect(); 73096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 73196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 73296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 73396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 73496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 73596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 73696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 73796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 738d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 739d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** 740d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Enable or disable power save mode. 741d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 742d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @param enable true to enable, false to disable. 743d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 744d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 745d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean setPowerSave(boolean enable) { 74696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 74796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "setPowerSave"; 74896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 74996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 75096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 75196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.setPowerSave(enable); 75296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 75396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 75496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 75596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 75696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 75796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 75896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 75996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 760d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 761d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** 762d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Initiate TDLS discover with the specified AP. 763d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 764d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @param macAddress MAC Address of the AP. 765d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 766d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 767d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean initiateTdlsDiscover(String macAddress) { 768d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius return initiateTdlsDiscover(NativeUtil.macAddressToByteArray(macAddress)); 769d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius } 770b4419d876beda78c29836726e43d80203b4a656cRoshan Pius /** See ISupplicantStaIface.hal for documentation */ 77196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne private boolean initiateTdlsDiscover(byte[/* 6 */] macAddress) { 77296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 77396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "initiateTdlsDiscover"; 77496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 77596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 77696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 77796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.initiateTdlsDiscover(macAddress); 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 * Initiate TDLS setup with the specified AP. 789d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 790d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @param macAddress MAC Address of the AP. 791d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 792d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 793d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean initiateTdlsSetup(String macAddress) { 794d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius return initiateTdlsSetup(NativeUtil.macAddressToByteArray(macAddress)); 795d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius } 796b4419d876beda78c29836726e43d80203b4a656cRoshan Pius /** See ISupplicantStaIface.hal for documentation */ 79796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne private boolean initiateTdlsSetup(byte[/* 6 */] macAddress) { 79896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 79996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "initiateTdlsSetup"; 80096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 80196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 80296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 80396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.initiateTdlsSetup(macAddress); 80496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 80596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 80696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 80796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 80896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 80996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 81096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 81196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 812d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 813d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** 814d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Initiate TDLS teardown with the specified AP. 815d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @param macAddress MAC Address of the AP. 816d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 817d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 818d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean initiateTdlsTeardown(String macAddress) { 819d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius return initiateTdlsTeardown(NativeUtil.macAddressToByteArray(macAddress)); 820d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius } 821d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 822b4419d876beda78c29836726e43d80203b4a656cRoshan Pius /** See ISupplicantStaIface.hal for documentation */ 82396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne private boolean initiateTdlsTeardown(byte[/* 6 */] macAddress) { 82496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 82596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "initiateTdlsTeardown"; 82696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 82796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 82896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 82996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.initiateTdlsTeardown(macAddress); 83096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 83196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 83296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 83396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 83496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 83596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 83696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 83796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 838d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 839d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** 840d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Request the specified ANQP elements |elements| from the specified AP |bssid|. 841d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 842d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @param bssid BSSID of the AP 843d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @param infoElements ANQP elements to be queried. Refer to ISupplicantStaIface.AnqpInfoId. 844d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @param hs20SubTypes HS subtypes to be queried. Refer to ISupplicantStaIface.Hs20AnqpSubTypes. 845d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 846d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 847d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean initiateAnqpQuery(String bssid, ArrayList<Short> infoElements, 848d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius ArrayList<Integer> hs20SubTypes) { 849d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius return initiateAnqpQuery( 850d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius NativeUtil.macAddressToByteArray(bssid), infoElements, hs20SubTypes); 851d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius } 852d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 853b4419d876beda78c29836726e43d80203b4a656cRoshan Pius /** See ISupplicantStaIface.hal for documentation */ 85496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne private boolean initiateAnqpQuery(byte[/* 6 */] macAddress, 85596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne java.util.ArrayList<Short> infoElements, java.util.ArrayList<Integer> subTypes) { 85696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 85796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "initiateAnqpQuery"; 85896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 85996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 86096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 86196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.initiateAnqpQuery(macAddress, 86296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne infoElements, subTypes); 86396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 86496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 86596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 86696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 86796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 86896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 86996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 87096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 871d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 872d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** 873d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Request the specified ANQP ICON from the specified AP |bssid|. 874d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 875d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @param bssid BSSID of the AP 876d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @param fileName Name of the file to request. 877d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 878d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 879d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean initiateHs20IconQuery(String bssid, String fileName) { 880d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius return initiateHs20IconQuery(NativeUtil.macAddressToByteArray(bssid), fileName); 881d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius } 882d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 883b4419d876beda78c29836726e43d80203b4a656cRoshan Pius /** See ISupplicantStaIface.hal for documentation */ 88496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne private boolean initiateHs20IconQuery(byte[/* 6 */] macAddress, String fileName) { 88596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 88696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "initiateHs20IconQuery"; 88796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 88896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 88996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 89096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.initiateHs20IconQuery(macAddress, 89196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne fileName); 89296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 89396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 89496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 89596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 89696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 89796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 89896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 89996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 900d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 90196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne /** 90296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * Makes a callback to HIDL to getMacAddress from supplicant 903d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 90496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * @return string containing the MAC address, or null on a failed call 90596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne */ 906d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public String getMacAddress() { 90796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 90896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne MutableBoolean statusSuccess = new MutableBoolean(false); 90996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "getMacAddress"; 91096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 91196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return null; 91296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Mutable<String> gotMac = new Mutable<>(); 91396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 91496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne mISupplicantStaIface.getMacAddress((SupplicantStatus status, 91596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne byte[/* 6 */] macAddr) -> { 91696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne statusSuccess.value = status.code == SupplicantStatusCode.SUCCESS; 91796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!statusSuccess.value) { 91896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, methodStr + " failed: " + status.debugMessage); 91996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } else { 920d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius gotMac.value = NativeUtil.macAddressFromByteArray(macAddr); 92196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 92296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne }); 92396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 92496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception: " + e); 92596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 92696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 92796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (statusSuccess.value) { 92896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return gotMac.value; 92996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } else { 93096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return null; 93196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 93296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 93396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 934d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 935d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** 936d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Start using the added RX filters. 937d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 938d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 939d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 940d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean startRxFilter() { 94196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 94296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "startRxFilter"; 94396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 94496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 94596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 94696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.startRxFilter(); 94796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 94896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 94996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 95096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 95196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 95296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 95396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 95496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 955d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 956d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** 957d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Stop using the added RX filters. 958d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 959d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 960d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 961d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean stopRxFilter() { 96296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 96396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "stopRxFilter"; 96496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 96596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 96696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 96796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.stopRxFilter(); 96896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 96996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 97096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 97196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 97296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 97396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 97496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 97596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 976d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 977d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public static final byte RX_FILTER_TYPE_V4_MULTICAST = 978d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius ISupplicantStaIface.RxFilterType.V6_MULTICAST; 979d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public static final byte RX_FILTER_TYPE_V6_MULTICAST = 980d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius ISupplicantStaIface.RxFilterType.V6_MULTICAST; 981d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** 982d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Add an RX filter. 983d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 984d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @param type one of {@link #RX_FILTER_TYPE_V4_MULTICAST} or 985d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * {@link #RX_FILTER_TYPE_V6_MULTICAST} values. 986d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 987d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 98896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne private boolean addRxFilter(byte type) { 98996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 99096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "addRxFilter"; 99196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 99296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 99396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 99496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.addRxFilter(type); 99596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 99696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 99796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 99896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 99996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 100096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 100196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 100296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 1003d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 1004d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** 1005d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Remove an RX filter. 1006d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 1007d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @param type one of {@link #RX_FILTER_TYPE_V4_MULTICAST} or 1008d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * {@link #RX_FILTER_TYPE_V6_MULTICAST} values. 1009d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 1010d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 101196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne private boolean removeRxFilter(byte type) { 101296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 101396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "removeRxFilter"; 101496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 101596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 101696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 101796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.removeRxFilter(type); 101896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 101996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 102096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 102196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 102296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 102396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 102496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 102596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 1026d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 1027d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public static final byte BT_COEX_MODE_ENABLED = ISupplicantStaIface.BtCoexistenceMode.ENABLED; 1028d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public static final byte BT_COEX_MODE_DISABLED = ISupplicantStaIface.BtCoexistenceMode.DISABLED; 1029d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public static final byte BT_COEX_MODE_SENSE = ISupplicantStaIface.BtCoexistenceMode.SENSE; 1030d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** 1031d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Set Bt co existense mode. 1032d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 1033d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @param mode one of the above {@link #BT_COEX_MODE_ENABLED}, {@link #BT_COEX_MODE_DISABLED} 1034d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * or {@link #BT_COEX_MODE_SENSE} values. 1035d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 1036d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 1037d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean setBtCoexistenceMode(byte mode) { 103896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 103996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "setBtCoexistenceMode"; 104096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 104196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 104296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 104396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.setBtCoexistenceMode(mode); 104496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 104596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 104696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 104796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 104896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 104996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 105096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 105196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 1052d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 1053d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** Enable or disable BT coexistence mode. 1054d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 1055d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @param enable true to enable, false to disable. 1056d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 1057d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 1058d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean setBtCoexistenceScanModeEnabled(boolean enable) { 105996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 106096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "setBtCoexistenceScanModeEnabled"; 106196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 106296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 106396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 106496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = 106596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne mISupplicantStaIface.setBtCoexistenceScanModeEnabled(enable); 106696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 106796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 106896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 106996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 107096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 107196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 107296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 107396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 1074d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 1075d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** 1076d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Enable or disable suspend mode optimizations. 1077d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 1078d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @param enable true to enable, false otherwise. 1079d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 1080d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean setSuspendModeEnabled(boolean enable) { 108196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 108296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "setSuspendModeEnabled"; 108396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 108496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 108596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 108696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.setSuspendModeEnabled(enable); 108796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 108896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 108996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 109096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 109196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 109296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 109396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 109496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 1095d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 1096d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** 1097d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Set country code. 1098d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 1099d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @param codeStr 2 byte ASCII string. For ex: US, CA. 1100d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 1101d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 1102d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean setCountryCode(String codeStr) { 1103d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius return setCountryCode(NativeUtil.stringToByteArray(codeStr)); 1104d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius } 1105d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 1106b4419d876beda78c29836726e43d80203b4a656cRoshan Pius /** See ISupplicantStaIface.hal for documentation */ 110796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne private boolean setCountryCode(byte[/* 2 */] code) { 110896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 110996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "setCountryCode"; 111096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 111196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 111296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 111396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.setCountryCode(code); 111496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 111596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 111696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 111796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 111896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 111996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 112096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 112196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 112296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne 11237651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius /** See ISupplicantStaIface.hal for documentation */ 11247651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius private boolean startWpsRegistrar(byte[/* 6 */] bssid, String pin) { 11257651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius synchronized (mLock) { 11267651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius final String methodStr = "startWpsRegistrar"; 11277651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (DBG) Log.i(TAG, methodStr); 11287651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 11297651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius try { 11307651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius SupplicantStatus status = mISupplicantStaIface.startWpsRegistrar(bssid, pin); 11317651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return checkStatusAndLogFailure(status, methodStr); 11327651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } catch (RemoteException e) { 11337651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 11347651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius supplicantServiceDiedHandler(); 11357651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return false; 11367651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 11377651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 11387651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 11397651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius 11407651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius /** See ISupplicantStaIface.hal for documentation */ 11417651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius private boolean startWpsPbc(byte[/* 6 */] bssid) { 11427651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius synchronized (mLock) { 11437651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius final String methodStr = "startWpsPbc"; 11447651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (DBG) Log.i(TAG, methodStr); 11457651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 11467651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius try { 11477651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius SupplicantStatus status = mISupplicantStaIface.startWpsPbc(bssid); 11487651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return checkStatusAndLogFailure(status, methodStr); 11497651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } catch (RemoteException e) { 11507651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 11517651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius supplicantServiceDiedHandler(); 11527651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return false; 11537651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 11547651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 11557651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 11567651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius 11577651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius /** See ISupplicantStaIface.hal for documentation */ 11587651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius private boolean startWpsPinKeypad(String pin) { 11597651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius synchronized (mLock) { 11607651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius final String methodStr = "startWpsPinKeypad"; 11617651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (DBG) Log.i(TAG, methodStr); 11627651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 11637651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius try { 11647651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius SupplicantStatus status = mISupplicantStaIface.startWpsPinKeypad(pin); 11657651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return checkStatusAndLogFailure(status, methodStr); 11667651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } catch (RemoteException e) { 11677651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 11687651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius supplicantServiceDiedHandler(); 11697651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return false; 11707651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 11717651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 11727651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 11737651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius 11747651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius /** See ISupplicantStaIface.hal for documentation */ 11757651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius private String startWpsPinDisplay(byte[/* 6 */] bssid) { 11767651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius synchronized (mLock) { 11777651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius final String methodStr = "startWpsPinDisplay"; 11787651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (DBG) Log.i(TAG, methodStr); 11797651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return null; 11807651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius final Mutable<String> gotPin = new Mutable<>(); 11817651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius try { 11827651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius mISupplicantStaIface.startWpsPinDisplay(bssid, 11837651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius (SupplicantStatus status, String pin) -> { 11847651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (checkStatusAndLogFailure(status, methodStr)) { 11857651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius gotPin.value = pin; 11867651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 11877651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius }); 11887651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } catch (RemoteException e) { 11897651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 11907651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius supplicantServiceDiedHandler(); 11917651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 11927651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return gotPin.value; 11937651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 11947651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 11957651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius 11967651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius /** See ISupplicantStaIface.hal for documentation */ 11977651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius private boolean cancelWps() { 11987651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius synchronized (mLock) { 11997651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius final String methodStr = "cancelWps"; 12007651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (DBG) Log.i(TAG, methodStr); 12017651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 12027651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius try { 12037651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius SupplicantStatus status = mISupplicantStaIface.cancelWps(); 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 12137651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius /** See ISupplicantStaIface.hal for documentation */ 12147651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius private boolean setExternalSim(boolean useExternalSim) { 12157651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius synchronized (mLock) { 12167651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius final String methodStr = "setExternalSim"; 12177651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (DBG) Log.i(TAG, methodStr); 12187651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 12197651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius try { 12207651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius SupplicantStatus status = mISupplicantStaIface.setExternalSim(useExternalSim); 12217651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return checkStatusAndLogFailure(status, methodStr); 12227651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } catch (RemoteException e) { 12237651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 12247651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius supplicantServiceDiedHandler(); 12257651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return false; 12267651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 12277651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 12287651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 12297651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius 123096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne /** 123196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * Returns false if SupplicantStaIface is null, and logs failure to call methodStr 123296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne */ 123396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne private boolean checkSupplicantStaIfaceAndLogFailure(final String methodStr) { 123496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 123596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (mISupplicantStaIface == null) { 123696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "Can't call " + methodStr + ", ISupplicantStaIface is null"); 123796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 123896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 123996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return true; 124096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 124196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne 124296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne /** 124396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * Returns true if provided status code is SUCCESS, logs debug message and returns false 124496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * otherwise 124596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne */ 124696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne private static boolean checkStatusAndLogFailure(SupplicantStatus status, 124796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr) { 124896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 124996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (status.code != SupplicantStatusCode.SUCCESS) { 125096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, methodStr + " failed: " + supplicantStatusCodeToString(status.code) + ", " 125196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne + status.debugMessage); 125296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 125396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 125496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return true; 125596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 125696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne 125796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne /** 125896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * Converts SupplicantStatus code values to strings for debug logging 125996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * TODO(b/34811152) Remove this, or make it more break resistance 126096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne */ 126196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne public static String supplicantStatusCodeToString(int code) { 126296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne switch (code) { 126396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne case 0: 126496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return "SUCCESS"; 126596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne case 1: 126696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return "FAILURE_UNKNOWN"; 126796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne case 2: 126896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return "FAILURE_ARGS_INVALID"; 126996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne case 3: 127096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return "FAILURE_IFACE_INVALID"; 127196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne case 4: 127296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return "FAILURE_IFACE_UNKNOWN"; 127396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne case 5: 127496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return "FAILURE_IFACE_EXISTS"; 127596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne case 6: 127696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return "FAILURE_IFACE_DISABLED"; 127796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne case 7: 127896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return "FAILURE_IFACE_NOT_DISCONNECTED"; 127996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne case 8: 128096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return "FAILURE_NETWORK_INVALID"; 128196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne case 9: 128296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return "FAILURE_NETWORK_UNKNOWN"; 128396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne default: 128496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return "??? UNKNOWN_CODE"; 128596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 128696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 128796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne 1288240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne private static class Mutable<E> { 1289240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne public E value; 1290240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne 1291240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne Mutable() { 1292240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne value = null; 1293240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 1294240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne 1295240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne Mutable(E value) { 1296240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne this.value = value; 1297240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 1298240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 129966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne 130066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne private void logd(String s) { 130166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne Log.d(TAG, s); 130266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 130366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne 130466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne private void logi(String s) { 130566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne Log.i(TAG, s); 130666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 130766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne 130866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne private void loge(String s) { 130966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne Log.e(TAG, s); 131066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 1311240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne} 1312