这里先整理WPAS通知framework事件的源码
external\wpa_supplicant_8\wpa_supplicant\hidl\1.3\hidl.cpp 中定义了一些 wpas_hidl_notify 前缀的方法
这些方法是 WPAS 通知 hal 事件的接口
以 wpas_hidl_notify_disconnect_reason 为例
实际调用的是 HidlManager 这个类的 notifyDisconnectReason 方法
(wpas_hidl_notify 方法都是这种形式)
//hidl.cpp
void wpas_hidl_notify_disconnect_reason(struct wpa_supplicant *wpa_s)
{
if (!wpa_s)
return;
wpa_printf(
MSG_DEBUG, "Notifying disconnect reason to hidl control: %d",
wpa_s->disconnect_reason);
HidlManager *hidl_manager = HidlManager::getInstance();
if (!hidl_manager)
return;
hidl_manager->notifyDisconnectReason(wpa_s);
}
//hidl_manager.cpp
/**
* Notify all listeners about the reason code for disconnection from the
* currently connected network.
*
* @param wpa_s |wpa_supplicant| struct corresponding to the interface on which
* the network is present.
*/
void HidlManager::notifyDisconnectReason(struct wpa_supplicant *wpa_s)
{
if (!wpa_s)
return;
if (sta_iface_object_map_.find(wpa_s->ifname) ==
sta_iface_object_map_.end())
return;
const u8 *bssid = wpa_s->bssid;
if (is_zero_ether_addr(bssid)) {
bssid = wpa_s->pending_bssid;
}
callWithEachStaIfaceCallback(
wpa_s->ifname,
std::bind(
&ISupplicantStaIfaceCallback::onDisconnected,
std::placeholders::_1, bssid, wpa_s->disconnect_reason < 0,
static_cast<ISupplicantStaIfaceCallback::ReasonCode>(
abs(wpa_s->disconnect_reason))));
}
ISupplicantStaIfaceCallback 的实际实现是 SupplicantStaIfaceCallbackImpl(Binder概念中的server端)
callWithEachStaIfaceCallback 的第二个参数,包含了将要调起的方法(HAL层)及其参数
注:当前代码中实际有四个版本
SupplicantStaIfaceCallbackImpl
SupplicantStaIfaceCallbackV1_1Impl
SupplicantStaIfaceCallbackV1_2Impl
SupplicantStaIfaceCallbackV1_3Impl
这四个 Callback 均由 SupplicantStaIfaceHal 管理
//SupplicantStaIfaceCallbackV1_3Impl.java
@Override
public void onDisconnected(byte[/* 6 */] bssid, boolean locallyGenerated,
int reasonCode) {
mStaIfaceHal.logCallback("onDisconnected");
if (mStateIsFourwayV13
&& (!locallyGenerated || reasonCode != ReasonCode.IE_IN_4WAY_DIFFERS)) {
mWifiMonitor.broadcastAuthenticationFailureEvent(
mIfaceName, WifiManager.ERROR_AUTH_FAILURE_WRONG_PSWD, -1);
}
mWifiMonitor.broadcastNetworkDisconnectionEvent(
mIfaceName, locallyGenerated ? 1 : 0, reasonCode,
NativeUtil.macAddressFromByteArray(bssid));
}
//WifiMonitor.java
/**
* Broadcast the network disconnection event to all the handlers registered for this event.
*
* @param iface Name of iface on which this occurred.
* @param local Whether the disconnect was locally triggered.
* @param reason Disconnect reason code.
* @param bssid BSSID of the access point.
*/
public void broadcastNetworkDisconnectionEvent(String iface, int local, int reason,
String bssid) {
sendMessage(iface, NETWORK_DISCONNECTION_EVENT, local, reason, bssid);
}
HAL 层里 ISupplicantStaIfaceCallbackImpl 通过 WifiMonitor 发送广播给所有注册了此事件的 handler
这些 handler 在 ClientModeImpl 中与事件进行绑定
所以,最终消息传递到了 framework 层
ClientModeImpl 中的 状态机 对这个消息进行处理