WificondControl.java revision d45b46b01f8562219468291bdc19363f0540ced0
170603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang/*
270603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang * Copyright (C) 2017 The Android Open Source Project
370603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang *
470603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang * Licensed under the Apache License, Version 2.0 (the "License");
570603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang * you may not use this file except in compliance with the License.
670603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang * You may obtain a copy of the License at
770603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang *
870603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang *      http://www.apache.org/licenses/LICENSE-2.0
970603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang *
1070603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang * Unless required by applicable law or agreed to in writing, software
1170603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang * distributed under the License is distributed on an "AS IS" BASIS,
1270603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1370603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang * See the License for the specific language governing permissions and
1470603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang * limitations under the License.
1570603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang */
1670603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang
1770603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wangpackage com.android.server.wifi;
1870603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang
1970603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wangimport android.net.wifi.IApInterface;
2070603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wangimport android.net.wifi.IClientInterface;
2170603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wangimport android.net.wifi.IWificond;
2270603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wangimport android.os.Binder;
2370603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wangimport android.os.RemoteException;
2470603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wangimport android.util.Log;
2570603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang
2670603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang/**
2770603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang * This class provides methods for WifiNative to send control commands to wificond.
2870603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang * NOTE: This class should only be used from WifiNative.
2970603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang */
3070603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wangpublic class WificondControl {
3170603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang
3270603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    private static final String TAG = "WificondControl";
3370603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    private IWificond mWificond;
3470603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    private IClientInterface mClientInterface;
3570603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    private IApInterface mApInterface;
3670603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    private WifiInjector mWifiInjector;
3770603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang
3870603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    WificondControl(WifiInjector wifiInjector) {
3970603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        mWifiInjector = wifiInjector;
4070603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    }
4170603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang
4270603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    /**
4370603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    * Setup driver for client mode via wificond.
4470603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    * @return An IClientInterface as wificond client interface binder handler.
4570603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    * Returns null on failure.
4670603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    */
4770603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    public IClientInterface setupDriverForClientMode() {
4870603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        mWificond = mWifiInjector.makeWificond();
4970603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        if (mWificond == null) {
5070603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang            Log.e(TAG, "Failed to get reference to wificond");
5170603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang            return null;
5270603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        }
5370603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang
5470603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        IClientInterface clientInterface = null;
5570603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        try {
5670603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang            clientInterface = mWificond.createClientInterface();
5770603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        } catch (RemoteException e1) {
5870603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang            Log.e(TAG, "Failed to get IClientInterface due to remote exception");
5970603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang            return null;
6070603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        }
6170603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang
6270603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        if (clientInterface == null) {
6370603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang            Log.e(TAG, "Could not get IClientInterface instance from wificond");
6470603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang            return null;
6570603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        }
6670603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        Binder.allowBlocking(clientInterface.asBinder());
6770603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang
6870603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        // Refresh Handlers
6970603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        mClientInterface = clientInterface;
7070603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang
7170603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        return clientInterface;
7270603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    }
7370603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang
7470603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    /**
7570603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    * Setup driver for softAp mode via wificond.
7670603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    * @return An IApInterface as wificond Ap interface binder handler.
7770603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    * Returns null on failure.
7870603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    */
7970603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    public IApInterface setupDriverForSoftApMode() {
8070603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        mWificond = mWifiInjector.makeWificond();
8170603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        if (mWificond == null) {
8270603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang            Log.e(TAG, "Failed to get reference to wificond");
8370603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang            return null;
8470603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        }
8570603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang
8670603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        IApInterface apInterface = null;
8770603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        try {
8870603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang            apInterface = mWificond.createApInterface();
8970603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        } catch (RemoteException e1) {
9070603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang            Log.e(TAG, "Failed to get IApInterface due to remote exception");
9170603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang            return null;
9270603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        }
9370603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang
9470603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        if (apInterface == null) {
9570603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang            Log.e(TAG, "Could not get IApInterface instance from wificond");
9670603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang            return null;
9770603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        }
9870603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        Binder.allowBlocking(apInterface.asBinder());
9970603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang
10070603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        // Refresh Handlers
10170603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        mApInterface = apInterface;
10270603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang
10370603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        return apInterface;
10470603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    }
10570603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang
10670603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    /**
10770603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    * Teardown all interfaces configured in wificond.
10870603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    * @return Returns true on success.
10970603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    */
11070603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    public boolean tearDownInterfaces() {
11170603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        // Explicitly refresh the wificodn handler because |tearDownInterfaces()|
11270603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        // could be used to cleanup before we setup any interfaces.
11370603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        mWificond = mWifiInjector.makeWificond();
11470603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        if (mWificond == null) {
11570603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang            Log.e(TAG, "Failed to get reference to wificond");
11670603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang            return false;
11770603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        }
11870603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang
11970603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        try {
12070603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang            mWificond.tearDownInterfaces();
12170603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang            return true;
12270603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        } catch (RemoteException e) {
12370603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang            Log.e(TAG, "Failed to tear down interfaces due to remote exception");
12470603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        }
12570603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        return false;
12670603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    }
12770603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang
12870603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    /**
12970603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    * Disable wpa_supplicant via wificond.
13070603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    * @return Returns true on success.
13170603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    */
13270603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    public boolean disableSupplicant() {
13370603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        if (mClientInterface == null) {
13470603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang            Log.e(TAG, "No valid wificond client interface handler");
13570603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang            return false;
13670603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        }
13770603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        try {
13870603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang            return mClientInterface.disableSupplicant();
13970603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        } catch (RemoteException e) {
14070603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang            Log.e(TAG, "Failed to disable supplicant due to remote exception");
14170603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        }
14270603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        return false;
14370603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    }
14470603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang
14570603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    /**
14670603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    * Enable wpa_supplicant via wificond.
14770603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    * @return Returns true on success.
14870603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    */
14970603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    public boolean enableSupplicant() {
15070603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        if (mClientInterface == null) {
15170603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang            Log.e(TAG, "No valid wificond client interface handler");
15270603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang            return false;
15370603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        }
15470603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang
15570603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        try {
15670603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang            return mClientInterface.enableSupplicant();
15770603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        } catch (RemoteException e) {
15870603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang            Log.e(TAG, "Failed to enable supplicant due to remote exception");
15970603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        }
16070603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang        return false;
16170603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang    }
162d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang
163d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang    /**
164d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang    * Request signal polling to wificond.
165d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang    * Returns an SignalPollResult object.
166d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang    * Returns null on failure.
167d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang    */
168d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang    public WifiNative.SignalPollResult signalPoll() {
169d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang        if (mClientInterface == null) {
170d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang            Log.e(TAG, "No valid wificond client interface handler");
171d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang            return null;
172d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang        }
173d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang
174d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang        int[] resultArray;
175d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang        try {
176d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang            resultArray = mClientInterface.signalPoll();
177d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang            if (resultArray == null || resultArray.length != 3) {
178d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang                Log.e(TAG, "Invalid signal poll result from wificond");
179d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang                return null;
180d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang            }
181d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang        } catch (RemoteException e) {
182d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang            Log.e(TAG, "Failed to do signal polling  due to remote exception");
183d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang            return null;
184d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang        }
185d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang        WifiNative.SignalPollResult pollResult = new WifiNative.SignalPollResult();
186d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang        pollResult.currentRssi = resultArray[0];
187d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang        pollResult.txBitrate = resultArray[1];
188d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang        pollResult.associationFrequency = resultArray[2];
189d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang        return pollResult;
190d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang    }
191d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang
192d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang    /**
193d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang    * Fetch TX packet counters on current connection from wificond.
194d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang    * Returns an TxPacketCounters object.
195d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang    * Returns null on failure.
196d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang    */
197d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang    public WifiNative.TxPacketCounters getTxPacketCounters() {
198d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang        if (mClientInterface == null) {
199d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang            Log.e(TAG, "No valid wificond client interface handler");
200d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang            return null;
201d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang        }
202d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang
203d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang        int[] resultArray;
204d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang        try {
205d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang            resultArray = mClientInterface.getPacketCounters();
206d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang            if (resultArray == null || resultArray.length != 2) {
207d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang                Log.e(TAG, "Invalid signal poll result from wificond");
208d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang                return null;
209d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang            }
210d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang        } catch (RemoteException e) {
211d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang            Log.e(TAG, "Failed to do signal polling  due to remote exception");
212d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang            return null;
213d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang        }
214d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang        WifiNative.TxPacketCounters counters = new WifiNative.TxPacketCounters();
215d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang        counters.txSucceeded = resultArray[0];
216d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang        counters.txFailed = resultArray[1];
217d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang        return counters;
218d45b46b01f8562219468291bdc19363f0540ced0Ningyuan Wang    }
21970603901b67c48202ecbb1818e59d487bbcceedaNingyuan Wang}
220