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