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