android frmework直接與wpa_supplicant進行交互,使用aidl或者hidl
二、事件
framework注冊事件的地方:
packages/modules/Wifi/service/java/com/android/server/wifi/SupplicantStaIfaceCallbackImpl.java
class SupplicantStaIfaceCallbackImpl extends ISupplicantStaIfaceCallback.Stub {
????????public void onStateChanged(int newState, byte?bssid, int id, ArrayList<Byte> ssid..);
????????public void onDisconnected(byte[/* 6 */] bssid, boolean locallyGenerated, int reasonCode);
????????private void handleAssocRejectEvent(AssocRejectEventInfo assocRejectInfo)
}
注冊此事件的地方
packages/modules/Wifi/service/java/com/android/server/wifi/SupplicantStaIfaceHal.java
這兒還需要進一步看是調用的哪個?這兒有v1、v2等
private boolean trySetupStaIfaceV1_4(String ifaceName,ISupplicantStaIface iface)? {
????????SupplicantStaIfaceHalCallbackV1_4 callbackV14 =
????????????????new SupplicantStaIfaceHalCallbackV1_4(ifaceName);
????????if (!registerCallbackV1_4(getStaIfaceMockableV1_4(iface), callbackV14)) {
????????????????throw new RemoteException("Init StaIface V1_4 failed.");
????????}
????????/* keep this in a store to avoid recycling by garbage collector. */
????????mISupplicantStaIfaceCallbacks.put(ifaceName, callbackV14);
????????return true;
}
setupIface->setupStaIface->vendor_setupIface(new SupplicantStaIfaceHalCallback)
setupStaIface->trySetupStaIfaceV1_1->trySetupStaIfaceV1_2->....
hidl定義callback和接口的地方
hardware/interfaces/wifi/supplicant/1.0/ISupplicantStaIfaceCallback.hal?
ISupplicantStaIfaceCallback在v1.1里有onDisconnected回調,后續的v1.2->v1.3->v1.4 的ISupplicantCallback.hal 都繼承前面的版本
zheli
這里還有連接wifi失敗時的ReasonCode、StatusCode、還有連接State
ReasonCode常見的有:
DEAUTH_LEAVING = 3、UNSPECIFIED = 1、INVALID_IE = 13、STA_LEAVING = 36、TIMEOUT = 39
State常見的有:
DISCONNECTED = 0、AUTHENTICATING = 4等
hardware/interfaces/wifi/supplicant/1.0/ISupplicantIface.hal
ISupplicantIface.hal 里有listNetworks、addNetwork接口
hardware/interfaces/wifi/supplicant/1.0/ISupplicantStaIface.hal
ISupplicantStaIface.hal里有定義接口?
registerCallback(ISupplicantStaIfaceCallback callback)、reassociate、disconnect、setPowerSave、getMacAddress、setBtCoexistenceMode、setCountryCode等
hardware/interfaces/wifi/supplicant/1.0/ISupplicantCallback.hal
ISupplicantCallback.hal里有onInterfaceCreated、onInterfaceRemoved接口
wpa_supplicant接口事件注冊的地方
以連接失敗為例:
external/wpa_supplicant_8/wpa_supplicant/hidl/1.4/hidl_manager.h
這里include了很多hidl生成的.h文件,可以在out目錄下查看
hidl_manager.h
#include <android/hardware/wifi/supplicant/1.0/ISupplicantCallback.h>
#include <android/hardware/wifi/supplicant/1.0/ISupplicantP2pIfaceCallback.h>
#include <android/hardware/wifi/supplicant/1.0/ISupplicantP2pNetworkCallback.h>
#include <android/hardware/wifi/supplicant/1.4/ISupplicantStaIfaceCallback.h>
#include <android/hardware/wifi/supplicant/1.0/ISupplicantStaNetworkCallback.h>
#include <android/hardware/wifi/supplicant/1.4/ISupplicantStaNetworkCallback.h>
在out目錄下類似:
./soong/.intermediates/hardware/interfaces/wifi/supplicant/1.4/
android.hardware.wifi.supplicant@1.4_genc++_headers/gen/android/hardware/wifi/、supplicant/1.4/ISupplicantStaIfaceCallback.h
external/wpa_supplicant_8/wpa_supplicant/hidl/1.4/hidl_manager.cpp
void HidlManager::notifyDisconnectReason(struct wpa_supplicant *wpa_s) {
????????callWithEachStaIfaceCallback(
????????????????&ISupplicantStaIfaceCallback::onDisconnected,? wpa_s->disconnect_reason);
}
如果連接密碼失敗,可以看下大致的如下路徑 :
events.wpa_supplicant_event_disassoc_finish? (wpa_supplicant/events.c)
notify.wpas_notify_disconnect_reason->? (wpa_supplicant/notify.c)
hidl.wpas_hidl_notify_disconnect_reason->? (wpa_supplicant/hidl/1.4/hidl.cpp)
hidl_manager->notifyDisconnectReason
events.c
static void wpa_supplicant_event_disassoc_finish () {
????????if (could_be_psk_mismatch(wpa_s, reason_code, locally_generated)) {
????????????????wpa_msg(wpa_s, MSG_INFO, "WPA: 4-Way Handshake failed - ""pre-shared key may be incorrect");
????????????????wpas_auth_failed(wpa_s, "WRONG_KEY");
????????????????wpas_notify_disconnect_reason(wpa_s);
????????}
}
????????