WPAS是如何与framework通信的

这里先整理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 中的 状态机 对这个消息进行处理

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值