SupplicantStaIfaceHal.java revision 03fea88ccab149c07391d38f3c406bb04ab0a3a9
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; 275f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Piusimport android.hardware.wifi.supplicant.V1_0.WpsConfigMethods; 28240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhneimport android.hidl.manager.V1_0.IServiceManager; 29240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhneimport android.hidl.manager.V1_0.IServiceNotification; 30f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Piusimport android.net.IpConfiguration; 3166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhneimport android.net.wifi.WifiConfiguration; 32240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhneimport android.os.RemoteException; 33240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhneimport android.util.Log; 34f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Piusimport android.util.SparseArray; 3596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne 36d95fa596d07855b70ff18a50a48e773155a919f5Roshan Piusimport com.android.server.wifi.util.NativeUtil; 37240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne 385f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Piusimport java.nio.ByteBuffer; 395f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Piusimport java.nio.ByteOrder; 40240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhneimport java.util.ArrayList; 41f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Piusimport java.util.HashMap; 42f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Piusimport java.util.List; 43f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Piusimport java.util.Map; 445f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Piusimport java.util.regex.Matcher; 455f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Piusimport java.util.regex.Pattern; 46d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 47240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne/** 48240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne * Hal calls for bring up/shut down of the supplicant daemon and for 49240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne * sending requests to the supplicant daemon 50240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne */ 51b4419d876beda78c29836726e43d80203b4a656cRoshan Piuspublic class SupplicantStaIfaceHal { 52240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne private static final boolean DBG = false; 53b4419d876beda78c29836726e43d80203b4a656cRoshan Pius private static final String TAG = "SupplicantStaIfaceHal"; 5498152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne private static final String SERVICE_MANAGER_NAME = "manager"; 555f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius /** 565f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * Regex pattern for extracting the wps device type bytes. 575f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * Matches a strings like the following: "<categ>-<OUI>-<subcateg>"; 585f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius */ 595f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius private static final Pattern WPS_DEVICE_TYPE_PATTERN = 605f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius Pattern.compile("^(\\d{1,2})-([0-9a-fA-F]{8})-(\\d{1,2})$"); 615f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius 6298152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne private IServiceManager mIServiceManager = null; 6398152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne // Supplicant HAL interface objects 6498152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne private ISupplicant mISupplicant; 6598152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne private ISupplicantStaIface mISupplicantStaIface; 6603fea88ccab149c07391d38f3c406bb04ab0a3a9Roshan Pius private String mIfaceName; 677c0ec884188660f72977c8a80366049705c48ffaRoshan Pius // Currently configured network in wpa_supplicant 687c0ec884188660f72977c8a80366049705c48ffaRoshan Pius private SupplicantStaNetworkHal mCurrentNetwork; 697c0ec884188660f72977c8a80366049705c48ffaRoshan Pius // Currently configured network's framework network Id. 707c0ec884188660f72977c8a80366049705c48ffaRoshan Pius private int mFrameworkNetworkId; 71240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne private final Object mLock = new Object(); 72c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius private final Context mContext; 73c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius private final WifiMonitor mWifiMonitor; 747c0ec884188660f72977c8a80366049705c48ffaRoshan Pius 75c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius public SupplicantStaIfaceHal(Context context, WifiMonitor monitor) { 76c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius mContext = context; 77c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius mWifiMonitor = monitor; 788c6d09c03532b3936fab2fed6f8b84c895333565Roshan Pius } 79240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne 80240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne /** 8198152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne * Registers a service notification for the ISupplicant service, which triggers intialization of 8298152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne * the ISupplicantStaIface 83240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne * @return true if the service notification was successfully registered 84240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne */ 85240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne public boolean initialize() { 8698152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne if (DBG) Log.i(TAG, "Registering ISupplicant service ready callback."); 87240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne synchronized (mLock) { 8898152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne mISupplicant = null; 8998152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne mISupplicantStaIface = null; 9098152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne if (mIServiceManager != null) { 9198152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne // Already have an IServiceManager and serviceNotification registered, don't 9298152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne // don't register another. 9398152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne return true; 9498152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne } 95240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne try { 9698152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne mIServiceManager = getServiceManagerMockable(); 9798152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne if (mIServiceManager == null) { 98240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne Log.e(TAG, "Failed to get HIDL Service Manager"); 99240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne return false; 100240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 10198152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne if (!mIServiceManager.linkToDeath(cookie -> { 102240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne Log.wtf(TAG, "IServiceManager died: cookie=" + cookie); 103240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne synchronized (mLock) { 104240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne supplicantServiceDiedHandler(); 10598152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne mIServiceManager = null; // Will need to register a new ServiceNotification 106240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 107240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne }, 0)) { 108240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne Log.wtf(TAG, "Error on linkToDeath on IServiceManager"); 109240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne supplicantServiceDiedHandler(); 11098152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne mIServiceManager = null; // Will need to register a new ServiceNotification 111240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne return false; 112240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 113240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne IServiceNotification serviceNotificationCb = new IServiceNotification.Stub() { 114240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne public void onRegistration(String fqName, String name, boolean preexisting) { 11598152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne synchronized (mLock) { 11698152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne if (DBG) { 11798152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne Log.i(TAG, "IServiceNotification.onRegistration for: " + fqName 11898152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne + ", " + name + " preexisting=" + preexisting); 11998152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne } 12098152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne if (!initSupplicantService() || !initSupplicantStaIface()) { 12198152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne Log.e(TAG, "initalizing ISupplicantIfaces failed."); 12298152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne supplicantServiceDiedHandler(); 12398152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne } else { 12498152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne Log.i(TAG, "Completed initialization of ISupplicant interfaces."); 12598152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne } 126240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 127240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 128240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne }; 129240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne /* TODO(b/33639391) : Use the new ISupplicant.registerForNotifications() once it 130240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne exists */ 13198152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne if (!mIServiceManager.registerForNotifications(ISupplicant.kInterfaceName, 132240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne "", serviceNotificationCb)) { 133240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne Log.e(TAG, "Failed to register for notifications to " 134240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne + ISupplicant.kInterfaceName); 13598152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne mIServiceManager = null; // Will need to register a new ServiceNotification 136240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne return false; 137240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 138240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } catch (RemoteException e) { 139240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne Log.e(TAG, "Exception while trying to register a listener for ISupplicant service: " 140240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne + e); 14198152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne supplicantServiceDiedHandler(); 142240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 143240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne return true; 144240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 145240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 146240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne 14798152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne private boolean initSupplicantService() { 148240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne synchronized (mLock) { 149240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne try { 15098152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne mISupplicant = getSupplicantMockable(); 151240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } catch (RemoteException e) { 152240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne Log.e(TAG, "ISupplicant.getService exception: " + e); 153240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne return false; 154240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 15598152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne if (mISupplicant == null) { 156240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne Log.e(TAG, "Got null ISupplicant service. Stopping supplicant HIDL startup"); 157240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne return false; 158240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 159240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 160240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne return true; 161240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 162240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne 16398152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne private boolean initSupplicantStaIface() { 164240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne synchronized (mLock) { 165240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne /** List all supplicant Ifaces */ 166240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne final ArrayList<ISupplicant.IfaceInfo> supplicantIfaces = new ArrayList<>(); 167240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne try { 16898152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne mISupplicant.listInterfaces((SupplicantStatus status, 169240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne ArrayList<ISupplicant.IfaceInfo> ifaces) -> { 170240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne if (status.code != SupplicantStatusCode.SUCCESS) { 171240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne Log.e(TAG, "Getting Supplicant Interfaces failed: " + status.code); 172240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne return; 173240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 174240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne supplicantIfaces.addAll(ifaces); 175240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne }); 176240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } catch (RemoteException e) { 177240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne Log.e(TAG, "ISupplicant.listInterfaces exception: " + e); 17898152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne return false; 179240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 180240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne if (supplicantIfaces.size() == 0) { 181240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne Log.e(TAG, "Got zero HIDL supplicant ifaces. Stopping supplicant HIDL startup."); 18298152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne return false; 183240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 184240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne Mutable<ISupplicantIface> supplicantIface = new Mutable<>(); 18503fea88ccab149c07391d38f3c406bb04ab0a3a9Roshan Pius Mutable<String> ifaceName = new Mutable<>(); 186240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne for (ISupplicant.IfaceInfo ifaceInfo : supplicantIfaces) { 18798152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne if (ifaceInfo.type == IfaceType.STA) { 188240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne try { 18998152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne mISupplicant.getInterface(ifaceInfo, 190240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne (SupplicantStatus status, ISupplicantIface iface) -> { 191240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne if (status.code != SupplicantStatusCode.SUCCESS) { 192240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne Log.e(TAG, "Failed to get ISupplicantIface " + status.code); 193240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne return; 194240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 195240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne supplicantIface.value = iface; 196240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne }); 197240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } catch (RemoteException e) { 198240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne Log.e(TAG, "ISupplicant.getInterface exception: " + e); 19998152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne return false; 200240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 20103fea88ccab149c07391d38f3c406bb04ab0a3a9Roshan Pius ifaceName.value = ifaceInfo.name; 202240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne break; 203240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 204240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 20598152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne if (supplicantIface.value == null) { 20698152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne Log.e(TAG, "initSupplicantStaIface got null iface"); 207240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne return false; 208240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 20998152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne mISupplicantStaIface = getStaIfaceMockable(supplicantIface.value); 21003fea88ccab149c07391d38f3c406bb04ab0a3a9Roshan Pius mIfaceName = ifaceName.value; 211240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne return true; 212240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 213240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 214240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne 21598152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne private void supplicantServiceDiedHandler() { 216240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne synchronized (mLock) { 21798152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne mISupplicant = null; 21898152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne mISupplicantStaIface = null; 219240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 220240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 221240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne 22298152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne /** 22398152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne * Signals whether Initialization completed successfully. Only necessary for testing, is not 22498152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne * needed to guard calls etc. 22598152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne */ 22698152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne public boolean isInitializationComplete() { 22798152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne return mISupplicantStaIface != null; 2288c6d09c03532b3936fab2fed6f8b84c895333565Roshan Pius } 2298c6d09c03532b3936fab2fed6f8b84c895333565Roshan Pius 2308c6d09c03532b3936fab2fed6f8b84c895333565Roshan Pius /** 23198152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne * Wrapper functions to access static HAL methods, created to be mockable in unit tests 2328c6d09c03532b3936fab2fed6f8b84c895333565Roshan Pius */ 23398152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne protected IServiceManager getServiceManagerMockable() throws RemoteException { 23498152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne return IServiceManager.getService(SERVICE_MANAGER_NAME); 23598152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne } 23698152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne 23798152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne protected ISupplicant getSupplicantMockable() throws RemoteException { 23898152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne return ISupplicant.getService(); 23998152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne } 24098152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne 24198152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne protected ISupplicantStaIface getStaIfaceMockable(ISupplicantIface iface) { 24298152bd4a4e36ea2097abd474248a4c7884f55b5Glen Kuhne return ISupplicantStaIface.asInterface(iface.asBinder()); 2438c6d09c03532b3936fab2fed6f8b84c895333565Roshan Pius } 2448c6d09c03532b3936fab2fed6f8b84c895333565Roshan Pius 24596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne /** 2467c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * Add a network configuration to wpa_supplicant. 247d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 24866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne * @param config Config corresponding to the network. 24966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne * @return SupplicantStaNetwork of the added network in wpa_supplicant. 25066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne */ 251d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius private SupplicantStaNetworkHal addNetwork(WifiConfiguration config) { 25266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne logi("addSupplicantStaNetwork via HIDL"); 25366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne if (config == null) { 25466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne loge("Cannot add NULL network!"); 25566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne return null; 25666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 25766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne SupplicantStaNetworkHal network = addNetwork(); 25866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne if (network == null) { 25966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne loge("Failed to add a network!"); 26066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne return null; 26166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 26266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne if (network.saveWifiConfiguration(config)) { 26366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne return network; 26466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } else { 26566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne loge("Failed to save variables for: " + config.configKey()); 26666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne return null; 26766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 26866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 26966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne 27066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne /** 2717c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * Add the provided network configuration to wpa_supplicant and initiate connection to it. 2727c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * This method does the following: 2737c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * 1. Triggers disconnect command to wpa_supplicant (if |shouldDisconnect| is true). 2747c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * 2. Remove any existing network in wpa_supplicant. 2757c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * 3. Add a new network to wpa_supplicant. 2767c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * 4. Save the provided configuration to wpa_supplicant. 2777c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * 5. Select the new network in wpa_supplicant. 278d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 2797c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * @param config WifiConfiguration parameters for the provided network. 2807c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * @param shouldDisconnect whether to trigger a disconnection or not. 2817c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * @return {@code true} if it succeeds, {@code false} otherwise 28266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne */ 283d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean connectToNetwork(WifiConfiguration config, boolean shouldDisconnect) { 2847c0ec884188660f72977c8a80366049705c48ffaRoshan Pius mFrameworkNetworkId = WifiConfiguration.INVALID_NETWORK_ID; 2857c0ec884188660f72977c8a80366049705c48ffaRoshan Pius mCurrentNetwork = null; 286d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius logd("connectToNetwork " + config.configKey() 28766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne + " (shouldDisconnect " + shouldDisconnect + ")"); 28866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne if (shouldDisconnect && !disconnect()) { 28966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne loge("Failed to trigger disconnect"); 29066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne return false; 29166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 29266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne if (!removeAllNetworks()) { 29366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne loge("Failed to remove existing networks"); 29466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne return false; 29566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 2967c0ec884188660f72977c8a80366049705c48ffaRoshan Pius mCurrentNetwork = addNetwork(config); 2977c0ec884188660f72977c8a80366049705c48ffaRoshan Pius if (mCurrentNetwork == null) { 298d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius loge("Failed to add/save network configuration: " + config.configKey()); 29966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne return false; 30066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 3017c0ec884188660f72977c8a80366049705c48ffaRoshan Pius if (!mCurrentNetwork.select()) { 302d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius loge("Failed to select network configuration: " + config.configKey()); 30366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne return false; 30466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 3057c0ec884188660f72977c8a80366049705c48ffaRoshan Pius mFrameworkNetworkId = config.networkId; 3067c0ec884188660f72977c8a80366049705c48ffaRoshan Pius return true; 3077c0ec884188660f72977c8a80366049705c48ffaRoshan Pius } 3087c0ec884188660f72977c8a80366049705c48ffaRoshan Pius 3097c0ec884188660f72977c8a80366049705c48ffaRoshan Pius /** 3107c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * Initiates roaming to the already configured network in wpa_supplicant. If the network 3117c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * configuration provided does not match the already configured network, then this triggers 3127c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * a new connection attempt (instead of roam). 3137c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * 1. First check if we're attempting to connect to the same network as we currently have 3147c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * configured. 3157c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * 2. Set the new bssid for the network in wpa_supplicant. 3167c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * 3. Trigger reassociate command to wpa_supplicant. 3177c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * 3187c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * @param config WifiConfiguration parameters for the provided network. 3197c0ec884188660f72977c8a80366049705c48ffaRoshan Pius * @return {@code true} if it succeeds, {@code false} otherwise 3207c0ec884188660f72977c8a80366049705c48ffaRoshan Pius */ 3217c0ec884188660f72977c8a80366049705c48ffaRoshan Pius public boolean roamToNetwork(WifiConfiguration config) { 3227c0ec884188660f72977c8a80366049705c48ffaRoshan Pius if (mFrameworkNetworkId != config.networkId || mCurrentNetwork == null) { 3237c0ec884188660f72977c8a80366049705c48ffaRoshan Pius Log.w(TAG, "Cannot roam to a different network, initiate new connection. " 3247c0ec884188660f72977c8a80366049705c48ffaRoshan Pius + "Current network ID: " + mFrameworkNetworkId); 3257c0ec884188660f72977c8a80366049705c48ffaRoshan Pius return connectToNetwork(config, false); 3267c0ec884188660f72977c8a80366049705c48ffaRoshan Pius } 3277c0ec884188660f72977c8a80366049705c48ffaRoshan Pius String bssid = config.getNetworkSelectionStatus().getNetworkSelectionBSSID(); 3287c0ec884188660f72977c8a80366049705c48ffaRoshan Pius logd("roamToNetwork" + config.configKey() + " (bssid " + bssid + ")"); 3297c0ec884188660f72977c8a80366049705c48ffaRoshan Pius if (!mCurrentNetwork.setBssid(bssid)) { 3307c0ec884188660f72977c8a80366049705c48ffaRoshan Pius loge("Failed to set new bssid on network: " + config.configKey()); 3317c0ec884188660f72977c8a80366049705c48ffaRoshan Pius return false; 3327c0ec884188660f72977c8a80366049705c48ffaRoshan Pius } 3337c0ec884188660f72977c8a80366049705c48ffaRoshan Pius if (!reassociate()) { 3347c0ec884188660f72977c8a80366049705c48ffaRoshan Pius loge("Failed to trigger reassociate"); 3357c0ec884188660f72977c8a80366049705c48ffaRoshan Pius return false; 3367c0ec884188660f72977c8a80366049705c48ffaRoshan Pius } 33766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne return true; 33866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 33966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne 34066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne /** 341f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius * Load all the configured networks from wpa_supplicant. 342f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius * 343f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius * @param configs Map of configuration key to configuration objects corresponding to all 344f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius * the networks. 345f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius * @param networkExtras Map of extra configuration parameters stored in wpa_supplicant.conf 346f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius * @return true if succeeds, false otherwise. 347f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius */ 348f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius public boolean loadNetworks(Map<String, WifiConfiguration> configs, 349f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius SparseArray<Map<String, String>> networkExtras) { 350f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius List<Integer> networkIds = listNetworks(); 351f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius if (networkIds == null) { 352f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius Log.e(TAG, "Failed to list networks"); 353f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius return false; 354f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius } 355f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius for (Integer networkId : networkIds) { 356f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius SupplicantStaNetworkHal network = getNetwork(networkId); 357f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius if (network == null) { 358f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius Log.e(TAG, "Failed to get network with ID: " + networkId); 359f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius return false; 360f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius } 361f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius WifiConfiguration config = new WifiConfiguration(); 362f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius Map<String, String> networkExtra = new HashMap<>(); 363f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius if (!network.loadWifiConfiguration(config, networkExtra)) { 364f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius Log.e(TAG, "Failed to load wifi configuration for network with ID: " + networkId); 365f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius return false; 366f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius } 367f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius // Set the default IP assignments. 368f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius config.setIpAssignment(IpConfiguration.IpAssignment.DHCP); 369f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius config.setProxySettings(IpConfiguration.ProxySettings.NONE); 370f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius 371f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius networkExtras.put(networkId, networkExtra); 372f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius String configKey = networkExtra.get(SupplicantStaNetworkHal.ID_STRING_KEY_CONFIG_KEY); 373f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius final WifiConfiguration duplicateConfig = configs.put(configKey, config); 374f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius if (duplicateConfig != null) { 375f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius // The network is already known. Overwrite the duplicate entry. 376f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius Log.i(TAG, "Replacing duplicate network: " + duplicateConfig.networkId); 377f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius removeNetwork(duplicateConfig.networkId); 378f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius networkExtras.remove(duplicateConfig.networkId); 379f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius } 380f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius } 381f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius return true; 382f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius } 383f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius 384f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius /** 38566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne * Remove all networks from supplicant 38666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne */ 38766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne public boolean removeAllNetworks() { 38866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne synchronized (mLock) { 38966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne ArrayList<Integer> networks = listNetworks(); 39066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne if (networks == null) { 39166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne Log.e(TAG, "removeAllNetworks failed, got null networks"); 39266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne return false; 39366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 39466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne for (int id : networks) { 39566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne if (!removeNetwork(id)) { 39666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne Log.e(TAG, "removeAllNetworks failed to remove network: " + id); 39766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne return false; 39866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 39966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 40066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 40166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne return true; 40266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 40366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne 40466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne /** 4050a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius * Set the currently configured network's bssid. 4060a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius * 4070a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius * @param bssidStr Bssid to set in the form of "XX:XX:XX:XX:XX:XX" 4080a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius * @return true if succeeds, false otherwise. 4090a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius */ 4100a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius public boolean setCurrentNetworkBssid(String bssidStr) { 4110a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius if (mCurrentNetwork == null) return false; 4120a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius return mCurrentNetwork.setBssid(bssidStr); 4130a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius } 4140a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius 4150a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius /** 4160a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius * Get the currently configured network's WPS NFC token. 4170a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius * 4180a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius * @return Hex string corresponding to the WPS NFC token. 4190a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius */ 4200a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius public String getCurrentNetworkWpsNfcConfigurationToken() { 4210a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius if (mCurrentNetwork == null) return null; 4220a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius return mCurrentNetwork.getWpsNfcConfigurationToken(); 4230a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius } 4240a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius 4250a3dcd72290481cb1fcbaaec268cccf343e4ff48Roshan Pius /** 426d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Adds a new network. 427d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 42896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * @return The ISupplicantNetwork object for the new network, or null if the call fails 42996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne */ 43096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne private SupplicantStaNetworkHal addNetwork() { 43196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 43296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "addNetwork"; 43396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 43496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return null; 4353aa9b7e616f685ded8fade523317e96cedcdcc2dRoshan Pius Mutable<ISupplicantNetwork> newNetwork = new Mutable<>(); 43696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 43796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne mISupplicantStaIface.addNetwork((SupplicantStatus status, 43896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne ISupplicantNetwork network) -> { 4393aa9b7e616f685ded8fade523317e96cedcdcc2dRoshan Pius if (checkStatusAndLogFailure(status, methodStr)) { 44096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne newNetwork.value = network; 44196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 44296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne }); 44396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 44496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception: " + e); 44596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 44696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 4473aa9b7e616f685ded8fade523317e96cedcdcc2dRoshan Pius if (newNetwork.value != null) { 448c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius return getStaNetworkMockable( 449c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius ISupplicantStaNetwork.asInterface(newNetwork.value.asBinder())); 45096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } else { 45196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return null; 45296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 45396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 45496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 455d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 45696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne /** 45796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * Remove network from supplicant with network Id 458d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 459d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 46096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne */ 46196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne private boolean removeNetwork(int id) { 46296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 46396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "removeNetwork"; 46496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 46596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 46696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 46796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.removeNetwork(id); 46896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 46996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 47096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 47196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 47296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 47396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 47496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 47596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 476d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 47796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne /** 478f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius * Use this to mock the creation of SupplicantStaNetworkHal instance. 479f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius * 480f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius * @param iSupplicantStaNetwork ISupplicantStaNetwork instance retrieved from HIDL. 481f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius * @return The ISupplicantNetwork object for the given SupplicantNetworkId int, returns null if 482f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius * the call fails 483f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius */ 484f180b0109b3fce79609b03ae2f7fbeff02d96b80Roshan Pius protected SupplicantStaNetworkHal getStaNetworkMockable( 485c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius ISupplicantStaNetwork iSupplicantStaNetwork) { 48603fea88ccab149c07391d38f3c406bb04ab0a3a9Roshan Pius return new SupplicantStaNetworkHal( 48703fea88ccab149c07391d38f3c406bb04ab0a3a9Roshan Pius iSupplicantStaNetwork, mIfaceName, 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 final String methodStr = "getNetwork"; 49796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 4983aa9b7e616f685ded8fade523317e96cedcdcc2dRoshan Pius Mutable<ISupplicantNetwork> gotNetwork = new Mutable<>(); 49996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return null; 50096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 50196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne mISupplicantStaIface.getNetwork(id, (SupplicantStatus status, 50296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne ISupplicantNetwork network) -> { 5033aa9b7e616f685ded8fade523317e96cedcdcc2dRoshan Pius if (checkStatusAndLogFailure(status, methodStr)) { 50496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne gotNetwork.value = network; 50596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 50696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne }); 50796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 50896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception: " + e); 50996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 51096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 5113aa9b7e616f685ded8fade523317e96cedcdcc2dRoshan Pius if (gotNetwork.value != null) { 512c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius return getStaNetworkMockable( 513c7a4b6706fa09042bb36a64036d86d88eb6e4126Roshan Pius ISupplicantStaNetwork.asInterface(gotNetwork.value.asBinder())); 51496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } else { 51596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return null; 51696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 51796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 51896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 51996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne 52096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne /** 52196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * @return a list of SupplicantNetworkID ints for all networks controlled by supplicant, returns 52296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * null if the call fails 52396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne */ 52496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne private java.util.ArrayList<Integer> listNetworks() { 52596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 52696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "listNetworks"; 52796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 5283aa9b7e616f685ded8fade523317e96cedcdcc2dRoshan Pius Mutable<ArrayList<Integer>> networkIdList = new Mutable<>(); 52996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return null; 53096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 53196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne mISupplicantStaIface.listNetworks((SupplicantStatus status, 53296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne java.util.ArrayList<Integer> networkIds) -> { 5333aa9b7e616f685ded8fade523317e96cedcdcc2dRoshan Pius if (checkStatusAndLogFailure(status, methodStr)) { 53496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne networkIdList.value = networkIds; 53596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 53696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne }); 53796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 53896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception: " + e); 53996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 54096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 5413aa9b7e616f685ded8fade523317e96cedcdcc2dRoshan Pius return networkIdList.value; 54296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 54396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 544d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 5455f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius /** 5465f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * Set WPS device name. 5475f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * 5485f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @param name String to be set. 5495f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @return true if request is sent successfully, false otherwise. 5505f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius */ 5515f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius public boolean setWpsDeviceName(String name) { 5527651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius synchronized (mLock) { 5537651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius final String methodStr = "setWpsDeviceName"; 5547651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (DBG) Log.i(TAG, methodStr); 5557651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 5567651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius try { 5577651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius SupplicantStatus status = mISupplicantStaIface.setWpsDeviceName(name); 5587651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return checkStatusAndLogFailure(status, methodStr); 5597651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } catch (RemoteException e) { 5607651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 5617651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius supplicantServiceDiedHandler(); 5627651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return false; 5637651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 5647651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 5657651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 5667651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius 5675f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius /** 5685f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * Set WPS device type. 5695f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * 5705f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @param typeStr Type specified as a string. Used format: <categ>-<OUI>-<subcateg> 5715f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @return true if request is sent successfully, false otherwise. 5725f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius */ 5735f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius public boolean setWpsDeviceType(String typeStr) { 5745f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius Matcher match = WPS_DEVICE_TYPE_PATTERN.matcher(typeStr); 5755f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius if (!match.find() || match.groupCount() != 3) { 5765f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius Log.e(TAG, "Malformed WPS device type " + typeStr); 5775f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius return false; 5785f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius } 5795f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius short categ = Short.parseShort(match.group(1)); 5805f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius byte[] oui = NativeUtil.hexStringToByteArray(match.group(2)); 5815f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius short subCateg = Short.parseShort(match.group(3)); 5825f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius 5835f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius byte[] bytes = new byte[8]; 5845f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius ByteBuffer byteBuffer = ByteBuffer.wrap(bytes).order(ByteOrder.BIG_ENDIAN); 5855f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius byteBuffer.putShort(categ); 5865f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius byteBuffer.put(oui); 5875f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius byteBuffer.putShort(subCateg); 5885f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius return setWpsDeviceType(bytes); 5895f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius } 5905f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius 5917651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius private boolean setWpsDeviceType(byte[/* 8 */] type) { 5927651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius synchronized (mLock) { 5937651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius final String methodStr = "setWpsDeviceType"; 5947651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (DBG) Log.i(TAG, methodStr); 5957651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 5967651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius try { 5977651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius SupplicantStatus status = mISupplicantStaIface.setWpsDeviceType(type); 5987651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return checkStatusAndLogFailure(status, methodStr); 5997651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } catch (RemoteException e) { 6007651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 6017651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius supplicantServiceDiedHandler(); 6027651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return false; 6037651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 6047651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 6057651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 6067651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius 6075f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius /** 6085f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * Set WPS manufacturer. 6095f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * 6105f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @param manufacturer String to be set. 6115f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @return true if request is sent successfully, false otherwise. 6125f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius */ 6135f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius public boolean setWpsManufacturer(String manufacturer) { 6147651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius synchronized (mLock) { 6157651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius final String methodStr = "setWpsManufacturer"; 6167651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (DBG) Log.i(TAG, methodStr); 6177651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 6187651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius try { 6197651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius SupplicantStatus status = mISupplicantStaIface.setWpsManufacturer(manufacturer); 6207651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return checkStatusAndLogFailure(status, methodStr); 6217651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } catch (RemoteException e) { 6227651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 6237651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius supplicantServiceDiedHandler(); 6247651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return false; 6257651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 6267651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 6277651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 6287651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius 6295f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius /** 6305f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * Set WPS model name. 6315f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * 6325f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @param modelName String to be set. 6335f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @return true if request is sent successfully, false otherwise. 6345f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius */ 6355f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius public boolean setWpsModelName(String modelName) { 6367651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius synchronized (mLock) { 6377651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius final String methodStr = "setWpsModelName"; 6387651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (DBG) Log.i(TAG, methodStr); 6397651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 6407651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius try { 6417651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius SupplicantStatus status = mISupplicantStaIface.setWpsModelName(modelName); 6427651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return checkStatusAndLogFailure(status, methodStr); 6437651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } catch (RemoteException e) { 6447651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 6457651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius supplicantServiceDiedHandler(); 6467651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return false; 6477651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 6487651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 6497651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 6507651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius 6515f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius /** 6525f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * Set WPS model number. 6535f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * 6545f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @param modelNumber String to be set. 6555f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @return true if request is sent successfully, false otherwise. 6565f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius */ 6575f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius public boolean setWpsModelNumber(String modelNumber) { 6587651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius synchronized (mLock) { 6597651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius final String methodStr = "setWpsModelNumber"; 6607651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (DBG) Log.i(TAG, methodStr); 6617651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 6627651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius try { 6637651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius SupplicantStatus status = mISupplicantStaIface.setWpsModelNumber(modelNumber); 6647651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return checkStatusAndLogFailure(status, methodStr); 6657651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } catch (RemoteException e) { 6667651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 6677651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius supplicantServiceDiedHandler(); 6687651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return false; 6697651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 6707651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 6717651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 6727651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius 6735f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius /** 6745f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * Set WPS serial number. 6755f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * 6765f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @param serialNumber String to be set. 6775f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @return true if request is sent successfully, false otherwise. 6785f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius */ 6795f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius public boolean setWpsSerialNumber(String serialNumber) { 6807651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius synchronized (mLock) { 6817651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius final String methodStr = "setWpsSerialNumber"; 6827651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (DBG) Log.i(TAG, methodStr); 6837651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 6847651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius try { 6857651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius SupplicantStatus status = mISupplicantStaIface.setWpsSerialNumber(serialNumber); 6867651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return checkStatusAndLogFailure(status, methodStr); 6877651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } catch (RemoteException e) { 6887651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 6897651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius supplicantServiceDiedHandler(); 6907651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return false; 6917651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 6927651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 6937651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 6947651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius 6955f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius /** 6965f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * Set WPS config methods 6975f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * 6985f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @param configMethodsStr List of config methods. 6995f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @return true if request is sent successfully, false otherwise. 7005f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius */ 7015f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius public boolean setWpsConfigMethods(String configMethodsStr) { 7025f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius short configMethodsMask = 0; 7035f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius String[] configMethodsStrArr = configMethodsStr.split("\\s+"); 7045f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius for (int i = 0; i < configMethodsStrArr.length; i++) { 7055f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius configMethodsMask |= stringToWpsConfigMethod(configMethodsStrArr[i]); 7065f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius } 7075f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius return setWpsConfigMethods(configMethodsMask); 7085f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius } 7095f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius 7107651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius private boolean setWpsConfigMethods(short configMethods) { 7117651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius synchronized (mLock) { 7127651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius final String methodStr = "setWpsConfigMethods"; 7137651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (DBG) Log.i(TAG, methodStr); 7147651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 7157651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius try { 7167651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius SupplicantStatus status = mISupplicantStaIface.setWpsConfigMethods(configMethods); 7177651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return checkStatusAndLogFailure(status, methodStr); 7187651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } catch (RemoteException e) { 7197651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 7207651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius supplicantServiceDiedHandler(); 7217651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return false; 7227651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 7237651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 7247651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 7257651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius 726d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** 727d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Trigger a reassociation even if the iface is currently connected. 728d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 729d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 730d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 731d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean reassociate() { 73296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 73396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "reassociate"; 73496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 73596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 73696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 73796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.reassociate(); 73896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 73996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 74096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 74196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 74296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 74396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 74496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 74596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 746d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 747d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** 748d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Trigger a reconnection if the iface is disconnected. 749d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 750d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 751d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 752d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean reconnect() { 75396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 75496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "reconnect"; 75596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 75696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 75796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 75896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.reconnect(); 75996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 76096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 76196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 76296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 76396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 76496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 76596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 76696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 767d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 768d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** 769d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Trigger a disconnection from the currently connected network. 770d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 771d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 772d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 773d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean disconnect() { 77496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 77596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "disconnect"; 77696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 77796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 77896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 77996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.disconnect(); 78096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 78196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 78296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 78396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 78496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 78596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 78696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 78796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 788d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 789d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** 790d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Enable or disable power save mode. 791d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 792d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @param enable true to enable, false to disable. 793d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 794d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 795d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean setPowerSave(boolean enable) { 79696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 79796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "setPowerSave"; 79896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 79996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 80096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 80196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.setPowerSave(enable); 80296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 80396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 80496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 80596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 80696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 80796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 80896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 80996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 810d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 811d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** 812d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Initiate TDLS discover with the specified AP. 813d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 814d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @param macAddress MAC Address of the AP. 815d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 816d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 817d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean initiateTdlsDiscover(String macAddress) { 818d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius return initiateTdlsDiscover(NativeUtil.macAddressToByteArray(macAddress)); 819d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius } 820b4419d876beda78c29836726e43d80203b4a656cRoshan Pius /** See ISupplicantStaIface.hal for documentation */ 82196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne private boolean initiateTdlsDiscover(byte[/* 6 */] macAddress) { 82296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 82396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "initiateTdlsDiscover"; 82496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 82596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 82696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 82796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.initiateTdlsDiscover(macAddress); 82896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 82996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 83096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 83196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 83296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 83396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 83496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 83596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 836d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 837d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** 838d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Initiate TDLS setup with the specified AP. 839d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 840d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @param macAddress MAC Address of the AP. 841d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 842d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 843d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean initiateTdlsSetup(String macAddress) { 844d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius return initiateTdlsSetup(NativeUtil.macAddressToByteArray(macAddress)); 845d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius } 846b4419d876beda78c29836726e43d80203b4a656cRoshan Pius /** See ISupplicantStaIface.hal for documentation */ 84796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne private boolean initiateTdlsSetup(byte[/* 6 */] macAddress) { 84896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 84996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "initiateTdlsSetup"; 85096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 85196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 85296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 85396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.initiateTdlsSetup(macAddress); 85496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 85596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 85696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 85796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 85896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 85996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 86096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 86196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 862d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 863d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** 864d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Initiate TDLS teardown with the specified AP. 865d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @param macAddress MAC Address of the AP. 866d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 867d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 868d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean initiateTdlsTeardown(String macAddress) { 869d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius return initiateTdlsTeardown(NativeUtil.macAddressToByteArray(macAddress)); 870d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius } 871d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 872b4419d876beda78c29836726e43d80203b4a656cRoshan Pius /** See ISupplicantStaIface.hal for documentation */ 87396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne private boolean initiateTdlsTeardown(byte[/* 6 */] macAddress) { 87496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 87596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "initiateTdlsTeardown"; 87696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 87796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 87896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 87996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.initiateTdlsTeardown(macAddress); 88096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 88196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 88296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 88396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 88496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 88596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 88696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 88796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 888d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 889d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** 890d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Request the specified ANQP elements |elements| from the specified AP |bssid|. 891d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 892d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @param bssid BSSID of the AP 893d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @param infoElements ANQP elements to be queried. Refer to ISupplicantStaIface.AnqpInfoId. 894d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @param hs20SubTypes HS subtypes to be queried. Refer to ISupplicantStaIface.Hs20AnqpSubTypes. 895d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 896d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 897d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean initiateAnqpQuery(String bssid, ArrayList<Short> infoElements, 898d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius ArrayList<Integer> hs20SubTypes) { 899d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius return initiateAnqpQuery( 900d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius NativeUtil.macAddressToByteArray(bssid), infoElements, hs20SubTypes); 901d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius } 902d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 903b4419d876beda78c29836726e43d80203b4a656cRoshan Pius /** See ISupplicantStaIface.hal for documentation */ 90496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne private boolean initiateAnqpQuery(byte[/* 6 */] macAddress, 90596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne java.util.ArrayList<Short> infoElements, java.util.ArrayList<Integer> subTypes) { 90696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 90796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "initiateAnqpQuery"; 90896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 90996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 91096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 91196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.initiateAnqpQuery(macAddress, 91296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne infoElements, subTypes); 91396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 91496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 91596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 91696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 91796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 91896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 91996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 92096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 921d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 922d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** 923d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Request the specified ANQP ICON from the specified AP |bssid|. 924d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 925d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @param bssid BSSID of the AP 926d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @param fileName Name of the file to request. 927d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 928d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 929d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean initiateHs20IconQuery(String bssid, String fileName) { 930d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius return initiateHs20IconQuery(NativeUtil.macAddressToByteArray(bssid), fileName); 931d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius } 932d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 933b4419d876beda78c29836726e43d80203b4a656cRoshan Pius /** See ISupplicantStaIface.hal for documentation */ 93496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne private boolean initiateHs20IconQuery(byte[/* 6 */] macAddress, String fileName) { 93596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 93696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "initiateHs20IconQuery"; 93796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 93896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 93996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 94096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.initiateHs20IconQuery(macAddress, 94196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne fileName); 94296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 94396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 94496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 94596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 94696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 94796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 94896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 94996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 950d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 95196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne /** 95296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * Makes a callback to HIDL to getMacAddress from supplicant 953d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 95496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * @return string containing the MAC address, or null on a failed call 95596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne */ 956d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public String getMacAddress() { 95796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 95896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "getMacAddress"; 95996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 96096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return null; 96196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Mutable<String> gotMac = new Mutable<>(); 96296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 96396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne mISupplicantStaIface.getMacAddress((SupplicantStatus status, 96496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne byte[/* 6 */] macAddr) -> { 9653aa9b7e616f685ded8fade523317e96cedcdcc2dRoshan Pius if (checkStatusAndLogFailure(status, methodStr)) { 966d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius gotMac.value = NativeUtil.macAddressFromByteArray(macAddr); 96796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 96896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne }); 96996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 97096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception: " + e); 97196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 97296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 9733aa9b7e616f685ded8fade523317e96cedcdcc2dRoshan Pius return gotMac.value; 97496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 97596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 976d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 977d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** 978d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Start using the added RX filters. 979d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 980d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 981d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 982d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean startRxFilter() { 98396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 98496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "startRxFilter"; 98596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 98696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 98796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 98896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.startRxFilter(); 98996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 99096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 99196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 99296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 99396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 99496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 99596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 99696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 997d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 998d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** 999d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Stop using the added RX filters. 1000d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 1001d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 1002d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 1003d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean stopRxFilter() { 100496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 100596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "stopRxFilter"; 100696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 100796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 100896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 100996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.stopRxFilter(); 101096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 101196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 101296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 101396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 101496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 101596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 101696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 101796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 1018d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 1019d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public static final byte RX_FILTER_TYPE_V4_MULTICAST = 1020d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius ISupplicantStaIface.RxFilterType.V6_MULTICAST; 1021d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public static final byte RX_FILTER_TYPE_V6_MULTICAST = 1022d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius ISupplicantStaIface.RxFilterType.V6_MULTICAST; 1023d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** 1024d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Add an RX filter. 1025d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 1026d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @param type one of {@link #RX_FILTER_TYPE_V4_MULTICAST} or 1027d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * {@link #RX_FILTER_TYPE_V6_MULTICAST} values. 1028d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 1029d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 103096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne private boolean addRxFilter(byte type) { 103196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 103296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "addRxFilter"; 103396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 103496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 103596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 103696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.addRxFilter(type); 103796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 103896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 103996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 104096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 104196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 104296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 104396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 104496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 1045d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 1046d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** 1047d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Remove an RX filter. 1048d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 1049d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @param type one of {@link #RX_FILTER_TYPE_V4_MULTICAST} or 1050d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * {@link #RX_FILTER_TYPE_V6_MULTICAST} values. 1051d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 1052d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 105396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne private boolean removeRxFilter(byte type) { 105496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 105596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "removeRxFilter"; 105696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 105796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 105896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 105996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.removeRxFilter(type); 106096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 106196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 106296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 106396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 106496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 106596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 106696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 106796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 1068d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 1069d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public static final byte BT_COEX_MODE_ENABLED = ISupplicantStaIface.BtCoexistenceMode.ENABLED; 1070d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public static final byte BT_COEX_MODE_DISABLED = ISupplicantStaIface.BtCoexistenceMode.DISABLED; 1071d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public static final byte BT_COEX_MODE_SENSE = ISupplicantStaIface.BtCoexistenceMode.SENSE; 1072d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** 1073d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Set Bt co existense mode. 1074d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 1075d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @param mode one of the above {@link #BT_COEX_MODE_ENABLED}, {@link #BT_COEX_MODE_DISABLED} 1076d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * or {@link #BT_COEX_MODE_SENSE} values. 1077d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 1078d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 1079d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean setBtCoexistenceMode(byte mode) { 108096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 108196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "setBtCoexistenceMode"; 108296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 108396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 108496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 108596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.setBtCoexistenceMode(mode); 108696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 108796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 108896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 108996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 109096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 109196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 109296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 109396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 1094d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 1095d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** Enable or disable BT coexistence mode. 1096d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 1097d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @param enable true to enable, false to disable. 1098d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 1099d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 1100d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean setBtCoexistenceScanModeEnabled(boolean enable) { 110196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 110296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "setBtCoexistenceScanModeEnabled"; 110396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 110496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 110596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 110696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = 110796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne mISupplicantStaIface.setBtCoexistenceScanModeEnabled(enable); 110896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 110996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 111096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 111196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 111296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 111396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 111496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 111596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 1116d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 1117d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** 1118d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Enable or disable suspend mode optimizations. 1119d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 1120d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @param enable true to enable, false otherwise. 11215f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @return true if request is sent successfully, false otherwise. 1122d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 1123d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean setSuspendModeEnabled(boolean enable) { 112496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 112596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "setSuspendModeEnabled"; 112696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 112796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 112896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 112996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.setSuspendModeEnabled(enable); 113096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 113196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 113296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 113396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 113496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 113596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 113696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 113796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 1138d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 1139d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius /** 1140d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * Set country code. 1141d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * 1142d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @param codeStr 2 byte ASCII string. For ex: US, CA. 1143d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius * @return true if request is sent successfully, false otherwise. 1144d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius */ 1145d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius public boolean setCountryCode(String codeStr) { 1146d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius return setCountryCode(NativeUtil.stringToByteArray(codeStr)); 1147d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius } 1148d95fa596d07855b70ff18a50a48e773155a919f5Roshan Pius 1149b4419d876beda78c29836726e43d80203b4a656cRoshan Pius /** See ISupplicantStaIface.hal for documentation */ 115096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne private boolean setCountryCode(byte[/* 2 */] code) { 115196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne synchronized (mLock) { 115296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr = "setCountryCode"; 115396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 115496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 115596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne try { 115696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne SupplicantStatus status = mISupplicantStaIface.setCountryCode(code); 115796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return checkStatusAndLogFailure(status, methodStr); 115896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } catch (RemoteException e) { 115996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 116096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne supplicantServiceDiedHandler(); 116196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 116296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 116396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 116496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 116596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne 11665f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius /** 11675f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * Start WPS pin registrar operation with the specified peer and pin. 11685f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * 11695f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @param bssidStr BSSID of the peer. 11705f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @param pin Pin to be used. 11715f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @return true if request is sent successfully, false otherwise. 11725f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius */ 11735f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius public boolean startWpsRegistrar(String bssidStr, String pin) { 11745f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius return startWpsRegistrar(NativeUtil.macAddressToByteArray(bssidStr), pin); 11755f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius } 11765f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius 11777651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius /** See ISupplicantStaIface.hal for documentation */ 11787651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius private boolean startWpsRegistrar(byte[/* 6 */] bssid, String pin) { 11797651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius synchronized (mLock) { 11807651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius final String methodStr = "startWpsRegistrar"; 11817651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (DBG) Log.i(TAG, methodStr); 11827651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 11837651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius try { 11847651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius SupplicantStatus status = mISupplicantStaIface.startWpsRegistrar(bssid, pin); 11857651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return checkStatusAndLogFailure(status, methodStr); 11867651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } catch (RemoteException e) { 11877651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 11887651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius supplicantServiceDiedHandler(); 11897651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return false; 11907651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 11917651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 11927651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 11937651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius 11945f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius /** 11955f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * Start WPS pin display operation with the specified peer. 11965f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * 11975f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @param bssidStr BSSID of the peer. 11985f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @return true if request is sent successfully, false otherwise. 11995f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius */ 12005f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius public boolean startWpsPbc(String bssidStr) { 12015f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius return startWpsPbc(NativeUtil.macAddressToByteArray(bssidStr)); 12025f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius } 12035f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius 12047651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius /** See ISupplicantStaIface.hal for documentation */ 12057651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius private boolean startWpsPbc(byte[/* 6 */] bssid) { 12067651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius synchronized (mLock) { 12077651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius final String methodStr = "startWpsPbc"; 12087651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (DBG) Log.i(TAG, methodStr); 12097651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 12107651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius try { 12117651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius SupplicantStatus status = mISupplicantStaIface.startWpsPbc(bssid); 12127651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return checkStatusAndLogFailure(status, methodStr); 12137651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } catch (RemoteException e) { 12147651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 12157651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius supplicantServiceDiedHandler(); 12167651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return false; 12177651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 12187651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 12197651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 12207651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius 12215f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius /** 12225f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * Start WPS pin keypad operation with the specified pin. 12235f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * 12245f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @param pin Pin to be used. 12255f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @return true if request is sent successfully, false otherwise. 12265f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius */ 12275f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius public boolean startWpsPinKeypad(String pin) { 12287651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius synchronized (mLock) { 12297651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius final String methodStr = "startWpsPinKeypad"; 12307651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (DBG) Log.i(TAG, methodStr); 12317651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 12327651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius try { 12337651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius SupplicantStatus status = mISupplicantStaIface.startWpsPinKeypad(pin); 12347651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return checkStatusAndLogFailure(status, methodStr); 12357651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } catch (RemoteException e) { 12367651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 12377651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius supplicantServiceDiedHandler(); 12387651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return false; 12397651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 12407651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 12417651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 12427651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius 12435f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius /** 12445f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * Start WPS pin display operation with the specified peer. 12455f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * 12465f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @param bssidStr BSSID of the peer. 12475f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @return new pin generated on success, null otherwise. 12485f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius */ 12495f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius public String startWpsPinDisplay(String bssidStr) { 12505f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius return startWpsPinDisplay(NativeUtil.macAddressToByteArray(bssidStr)); 12515f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius } 12525f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius 12537651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius /** See ISupplicantStaIface.hal for documentation */ 12547651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius private String startWpsPinDisplay(byte[/* 6 */] bssid) { 12557651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius synchronized (mLock) { 12567651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius final String methodStr = "startWpsPinDisplay"; 12577651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (DBG) Log.i(TAG, methodStr); 12587651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return null; 12597651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius final Mutable<String> gotPin = new Mutable<>(); 12607651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius try { 12617651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius mISupplicantStaIface.startWpsPinDisplay(bssid, 12627651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius (SupplicantStatus status, String pin) -> { 12637651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (checkStatusAndLogFailure(status, methodStr)) { 12647651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius gotPin.value = pin; 12657651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 12667651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius }); 12677651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } catch (RemoteException e) { 12687651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 12697651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius supplicantServiceDiedHandler(); 12707651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 12717651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return gotPin.value; 12727651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 12737651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 12747651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius 12755f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius /** 12765f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * Cancels any ongoing WPS requests. 12775f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * 12785f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @return true if request is sent successfully, false otherwise. 12795f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius */ 12805f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius public boolean cancelWps() { 12817651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius synchronized (mLock) { 12827651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius final String methodStr = "cancelWps"; 12837651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (DBG) Log.i(TAG, methodStr); 12847651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 12857651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius try { 12867651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius SupplicantStatus status = mISupplicantStaIface.cancelWps(); 12877651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return checkStatusAndLogFailure(status, methodStr); 12887651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } catch (RemoteException e) { 12897651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 12907651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius supplicantServiceDiedHandler(); 12917651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return false; 12927651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 12937651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 12947651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 12957651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius 12965f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius /** 12975f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * Sets whether to use external sim for SIM/USIM processing. 12985f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * 12995f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @param useExternalSim true to enable, false otherwise. 13005f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * @return true if request is sent successfully, false otherwise. 13015f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius */ 13025f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius public boolean setExternalSim(boolean useExternalSim) { 13037651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius synchronized (mLock) { 13047651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius final String methodStr = "setExternalSim"; 13057651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (DBG) Log.i(TAG, methodStr); 13067651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius if (!checkSupplicantStaIfaceAndLogFailure(methodStr)) return false; 13077651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius try { 13087651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius SupplicantStatus status = mISupplicantStaIface.setExternalSim(useExternalSim); 13097651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return checkStatusAndLogFailure(status, methodStr); 13107651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } catch (RemoteException e) { 13117651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius Log.e(TAG, "ISupplicantStaIface." + methodStr + ": exception:" + e); 13127651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius supplicantServiceDiedHandler(); 13137651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius return false; 13147651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 13157651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 13167651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius } 13177651e69b6f5e2b28a4fee7284ac2522faa002c9fRoshan Pius 1318cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius public static final int LOG_LEVEL_EXCESSIVE = ISupplicant.DebugLevel.EXCESSIVE; 1319cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius public static final int LOG_LEVEL_MSGDUMP = ISupplicant.DebugLevel.MSGDUMP; 1320cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius public static final int LOG_LEVEL_DEBUG = ISupplicant.DebugLevel.DEBUG; 1321cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius public static final int LOG_LEVEL_INFO = ISupplicant.DebugLevel.INFO; 1322cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius public static final int LOG_LEVEL_WARNING = ISupplicant.DebugLevel.WARNING; 1323cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius public static final int LOG_LEVEL_ERROR = ISupplicant.DebugLevel.ERROR; 1324cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius /** 1325cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius * Set the debug log level for wpa_supplicant 1326cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius * @param level One of the above {@link #LOG_LEVEL_EXCESSIVE} - {@link #LOG_LEVEL_ERROR} value. 1327cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius * @return true if request is sent successfully, false otherwise. 1328cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius */ 1329cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius public boolean setLogLevel(int level) { 1330cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius return setDebugParams(level, false, false); 1331cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius } 1332cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius 1333cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius /** See ISupplicant.hal for documentation */ 1334cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius private boolean setDebugParams(int level, boolean showTimestamp, boolean showKeys) { 1335cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius synchronized (mLock) { 1336cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius final String methodStr = "setDebugParams"; 1337cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius if (DBG) Log.i(TAG, methodStr); 1338cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius if (!checkSupplicantAndLogFailure(methodStr)) return false; 1339cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius try { 1340cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius SupplicantStatus status = 1341cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius mISupplicant.setDebugParams(level, showTimestamp, showKeys); 1342cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius return checkStatusAndLogFailure(status, methodStr); 1343cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius } catch (RemoteException e) { 1344cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius Log.e(TAG, "ISupplicant." + methodStr + ": exception:" + e); 1345cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius supplicantServiceDiedHandler(); 1346cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius return false; 1347cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius } 1348cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius } 1349cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius } 1350cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius 1351cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius /** 1352cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius * Set concurrency priority between P2P & STA operations. 1353cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius * 1354cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius * @param isStaHigherPriority Set to true to prefer STA over P2P during concurrency operations, 1355cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius * false otherwise. 1356cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius * @return true if request is sent successfully, false otherwise. 1357cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius */ 1358cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius public boolean setConcurrencyPriority(boolean isStaHigherPriority) { 1359cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius if (isStaHigherPriority) { 1360cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius return setConcurrencyPriority(IfaceType.STA); 1361cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius } else { 1362cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius return setConcurrencyPriority(IfaceType.P2P); 1363cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius } 1364cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius } 1365cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius 1366cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius /** See ISupplicant.hal for documentation */ 1367cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius private boolean setConcurrencyPriority(int type) { 1368cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius synchronized (mLock) { 1369cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius final String methodStr = "setConcurrencyPriority"; 1370cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius if (DBG) Log.i(TAG, methodStr); 1371cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius if (!checkSupplicantAndLogFailure(methodStr)) return false; 1372cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius try { 1373cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius SupplicantStatus status = mISupplicant.setConcurrencyPriority(type); 1374cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius return checkStatusAndLogFailure(status, methodStr); 1375cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius } catch (RemoteException e) { 1376cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius Log.e(TAG, "ISupplicant." + methodStr + ": exception:" + e); 1377cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius supplicantServiceDiedHandler(); 1378cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius return false; 1379cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius } 1380cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius } 1381cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius } 1382cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius 1383cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius /** 1384cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius * Returns false if Supplicant is null, and logs failure to call methodStr 1385cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius */ 1386cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius private boolean checkSupplicantAndLogFailure(final String methodStr) { 1387cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius if (DBG) Log.i(TAG, methodStr); 1388cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius if (mISupplicant == null) { 1389cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius Log.e(TAG, "Can't call " + methodStr + ", ISupplicant is null"); 1390cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius return false; 1391cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius } 1392cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius return true; 1393cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius } 1394cb9565f0cb8fa92346549bcacdfbf91cdf8e6bd3Roshan Pius 139596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne /** 139696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * Returns false if SupplicantStaIface is null, and logs failure to call methodStr 139796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne */ 139896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne private boolean checkSupplicantStaIfaceAndLogFailure(final String methodStr) { 139996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 140096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (mISupplicantStaIface == null) { 140196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, "Can't call " + methodStr + ", ISupplicantStaIface is null"); 140296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 140396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 140496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return true; 140596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 140696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne 140796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne /** 140896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * Returns true if provided status code is SUCCESS, logs debug message and returns false 140996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * otherwise 141096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne */ 141196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne private static boolean checkStatusAndLogFailure(SupplicantStatus status, 141296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne final String methodStr) { 141396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (DBG) Log.i(TAG, methodStr); 141496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne if (status.code != SupplicantStatusCode.SUCCESS) { 141596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne Log.e(TAG, methodStr + " failed: " + supplicantStatusCodeToString(status.code) + ", " 141696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne + status.debugMessage); 141796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return false; 141896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 141996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return true; 142096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 142196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne 142296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne /** 142396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * Converts SupplicantStatus code values to strings for debug logging 142496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne * TODO(b/34811152) Remove this, or make it more break resistance 142596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne */ 142696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne public static String supplicantStatusCodeToString(int code) { 142796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne switch (code) { 142896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne case 0: 142996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return "SUCCESS"; 143096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne case 1: 143196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return "FAILURE_UNKNOWN"; 143296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne case 2: 143396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return "FAILURE_ARGS_INVALID"; 143496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne case 3: 143596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return "FAILURE_IFACE_INVALID"; 143696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne case 4: 143796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return "FAILURE_IFACE_UNKNOWN"; 143896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne case 5: 143996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return "FAILURE_IFACE_EXISTS"; 144096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne case 6: 144196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return "FAILURE_IFACE_DISABLED"; 144296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne case 7: 144396013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return "FAILURE_IFACE_NOT_DISCONNECTED"; 144496013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne case 8: 144596013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return "FAILURE_NETWORK_INVALID"; 144696013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne case 9: 144796013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return "FAILURE_NETWORK_UNKNOWN"; 144896013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne default: 144996013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne return "??? UNKNOWN_CODE"; 145096013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 145196013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne } 145296013ebe01c095e2bac5ff7a490a2f9b69876e3cGlen Kuhne 14535f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius 14545f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius /** 14555f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius * Converts the Wps config method string to the equivalent enum value. 14565f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius */ 14575f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius private static short stringToWpsConfigMethod(String configMethod) { 14585f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius switch (configMethod) { 14595f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius case "usba": 14605f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius return WpsConfigMethods.USBA; 14615f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius case "ethernet": 14625f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius return WpsConfigMethods.ETHERNET; 14635f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius case "label": 14645f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius return WpsConfigMethods.LABEL; 14655f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius case "display": 14665f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius return WpsConfigMethods.DISPLAY; 14675f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius case "int_nfc_token": 14685f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius return WpsConfigMethods.INT_NFC_TOKEN; 14695f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius case "ext_nfc_token": 14705f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius return WpsConfigMethods.EXT_NFC_TOKEN; 14715f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius case "nfc_interface": 14725f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius return WpsConfigMethods.NFC_INTERFACE; 14735f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius case "push_button": 14745f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius return WpsConfigMethods.PUSHBUTTON; 14755f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius case "keypad": 14765f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius return WpsConfigMethods.KEYPAD; 14775f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius case "virtual_push_button": 14785f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius return WpsConfigMethods.VIRT_PUSHBUTTON; 14795f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius case "physical_push_button": 14805f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius return WpsConfigMethods.PHY_PUSHBUTTON; 14815f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius case "p2ps": 14825f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius return WpsConfigMethods.P2PS; 14835f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius case "virtual_display": 14845f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius return WpsConfigMethods.VIRT_DISPLAY; 14855f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius case "physical_display": 14865f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius return WpsConfigMethods.PHY_DISPLAY; 14875f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius default: 14885f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius throw new IllegalArgumentException( 14895f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius "Invalid WPS config method: " + configMethod); 14905f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius } 14915f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius } 14925f39baacf16b55c5551574bd1d973cdb14f70c45Roshan Pius 1493240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne private static class Mutable<E> { 1494240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne public E value; 1495240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne 1496240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne Mutable() { 1497240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne value = null; 1498240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 1499240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne 1500240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne Mutable(E value) { 1501240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne this.value = value; 1502240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 1503240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne } 150466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne 150566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne private void logd(String s) { 150666e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne Log.d(TAG, s); 150766e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 150866e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne 150966e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne private void logi(String s) { 151066e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne Log.i(TAG, s); 151166e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 151266e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne 151366e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne private void loge(String s) { 151466e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne Log.e(TAG, s); 151566e9f4ab597136cbf4accadb8e009fc68ff071a7Glen Kuhne } 1516240671db659a4f7ca7e217d41c7aee9d85e22c33Glen Kuhne} 1517