【Android-WIFI】(五) Roaming机制HAL层源码分析

在这里插入图片描述

一 wpa_supplicant 进程

我们首先来看看 wpa_supplicant 进程的初始化。

int main(int argc, char *argv[])
{
    int c, i;
    struct wpa_interface *ifaces, *iface;
    int iface_count, exitcode = -1;
    struct wpa_params params;
    struct wpa_global *global;

    //...

    //处理进程启动参数

    exitcode = 0;
    global = wpa_supplicant_init(&params);
    //创建了 wpa_global 对象,内部有一个 wpa_supplicant 队列。
    //创建了进程的epoll 文件描述符
    //...

    for (i = 0; exitcode == 0 && i < iface_count; i++) {
        struct wpa_supplicant *wpa_s;

        if ((ifaces[i].confname == NULL &&
             ifaces[i].ctrl_interface == NULL) ||
            ifaces[i].ifname == NULL) {
            if (iface_count == 1 && (params.ctrl_interface ||
                         params.dbus_ctrl_interface))
                break;
            usage();
            exitcode = -1;
            break;
        }
        wpa_s = wpa_supplicant_add_iface(global, &ifaces[i], NULL);
        if (wpa_s == NULL) {
            exitcode = -1;
            break;
        }
    }

    if (exitcode == 0)
        //开始事件循环监听
        exitcode = wpa_supplicant_run(global);

    //...

    return exitcode;
}

在 wpa_supplicant 进程的 main 函数中,初始化了 wpa_global 对象供整个进程使用。wpa_supplicant 进程主要是向上接受上层关于 WiFi 的请求,然后向下层内核驱动发送通信。所以这里通过 IO 多路复用来轮询监听相应的事件。

wpa_supplicant_add_iface ->
wpa_supplicant_init_iface ->
wpas_init_driver ->
wpa_supplicant_set_driver ->
//external/wpa_supplicant_8/src/drivers/drivers.c
const struct wpa_driver_ops *const wpa_drivers[] =
{
#ifdef CONFIG_DRIVER_NL80211
    &wpa_driver_nl80211_ops,
#endif /* CONFIG_DRIVER_NL80211 */
#ifdef CONFIG_DRIVER_WEXT
    &wpa_driver_wext_ops,
#endif /* CONFIG_DRIVER_WEXT */
#ifdef CONFIG_DRIVER_HOSTAP
    &wpa_driver_hostap_ops,
#endif /* CONFIG_DRIVER_HOSTAP */
#ifdef CONFIG_DRIVER_BSD
    &wpa_driver_bsd_ops,
#endif /* CONFIG_DRIVER_BSD */
#ifdef CONFIG_DRIVER_OPENBSD
    &wpa_driver_openbsd_ops,
#endif /* CONFIG_DRIVER_OPENBSD */
#ifdef CONFIG_DRIVER_NDIS
    &wpa_driver_ndis_ops,
#endif /* CONFIG_DRIVER_NDIS */
#ifdef CONFIG_DRIVER_WIRED
    &wpa_driver_wired_ops,
#endif /* CONFIG_DRIVER_WIRED */
#ifdef CONFIG_DRIVER_MACSEC_LINUX
    &wpa_driver_macsec_linux_ops,
#endif /* CONFIG_DRIVER_MACSEC_LINUX */
#ifdef CONFIG_DRIVER_MACSEC_QCA
    &wpa_driver_macsec_qca_ops,
#endif /* CONFIG_DRIVER_MACSEC_QCA */
#ifdef CONFIG_DRIVER_ROBOSWITCH
    &wpa_driver_roboswitch_ops,
#endif /* CONFIG_DRIVER_ROBOSWITCH */
#ifdef CONFIG_DRIVER_ATHEROS
    &wpa_driver_atheros_ops,
#endif /* CONFIG_DRIVER_ATHEROS */
#ifdef CONFIG_DRIVER_NONE
    &wpa_driver_none_ops,
#endif /* CONFIG_DRIVER_NONE */
    NULL
};

wpa_global 中的 每一个 wpa_supplicant 对象都是一个 wpa_supplicant 接口,其中都配置了对应的驱动接口。可选驱动如上图所示

二 Framework->HAL

//external/wpa_supplicant_8/wap_supplicant/hidl/1.4/sta_iface.cpp
SupplicantStatus StaIface::reassociateInternal()
{
    //从 wpa_global 中获取到 wpa_supplicant
    struct wpa_supplicant *wpa_s = retrieveIfacePtr();
    if (wpa_s->wpa_state == WPA_INTERFACE_DISABLED) {
        return {SupplicantStatusCode::FAILURE_IFACE_DISABLED, ""};
    }
    wpas_request_connection(wpa_s);
    return {SupplicantStatusCode::SUCCESS, ""};
}

通过 HIDL 调用到 HAL 层中。在 wpa_suplicant 中请求连接到指定网络。

//external/wpa_supplicant_8/wap_supplicant/wap_supplicant.c
void wpas_request_connection(struct wpa_supplicant *wpa_s)
{
    //指定连接类型为 reassociate
    wpa_s->normal_scans = 0;
    wpa_s->scan_req = NORMAL_SCAN_REQ;
    wpa_supplicant_reinit_autoscan(wpa_s);
    wpa
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值