Android Wi-Fi源码分析之wpa_supplicant初始化(三):wpa_supplicant_add_iface函数分析

本文深入分析了Android中wpa_supplicant的初始化过程,特别是`wpa_supplicant_add_iface`函数,该函数涉及`wpa_supplicant`和`wpa_ssid`数据结构,以及`wpa_supplicant_init_iface`关键操作。`wpa_ssid`结构体用于存储无线网络配置,与配置文件`wpa_supplicant.conf`中的network条目相对应。
摘要由CSDN通过智能技术生成

路径为:external\wpa_supplicant_8\wpa_supplicant\wpa_supplicant.c

/**
 * wpa_supplicant_add_iface - Add a new network interface
 * @global: Pointer to global data from wpa_supplicant_init()
 * @iface: Interface configuration options
 * Returns: Pointer to the created interface or %NULL on failure
 *
 * This function is used to add new network interfaces for %wpa_supplicant.
 * This can be called before wpa_supplicant_run() to add interfaces before the
 * main event loop has been started. In addition, new interfaces can be added
 * dynamically while %wpa_supplicant is already running. This could happen,
 * e.g., when a hotplug network adapter is inserted.
 */
struct wpa_supplicant * wpa_supplicant_add_iface(struct wpa_global *global,
                         struct wpa_interface *iface)
{
    struct wpa_supplicant *wpa_s;
    struct wpa_interface t_iface;
    struct wpa_ssid *ssid;

    if (global == NULL || iface == NULL)
        return NULL;

    wpa_s = wpa_supplicant_alloc();
    if (wpa_s == NULL)
        return NULL;

    wpa_s->global = global;

    t_iface = *iface;
    if (global->params.override_driver) {
        wpa_printf(MSG_DEBUG, "Override interface parameter: driver "
               "('%s' -> '%s')",
               iface->driver, global->params.override_driver);
        t_iface.driver = global->params.override_driver;
    }
    if (global->params.override_ctrl_interface) {
        wpa_printf(MSG_DEBUG, "Override interface parameter: "
               "ctrl_interface ('%s' -> '%s')",
               iface->ctrl_interface,
               global->params.override_ctrl_interface);
        t_iface.ctrl_interface =
            global->params.override_ctrl_interface;
    }

    /*重要*/
    if (wpa_supplicant_init_iface(wpa_s, &t_iface)) {
        wpa_printf(MSG_DEBUG, "Failed to add interface %s",
               iface->ifname);
        wpa_supplicant_deinit_iface(wpa_s, 0, 0);
        return NULL;
    }

    /* 通过dbus通知外接有新的iface加入 Notify the control interfaces about new iface */
    if (wpas_notify_iface_added(wpa_s)) {
        wpa_supplicant_deinit_iface(wpa_s, 1, 0);
        return NULL;
    }

    /*通过dbus通知外界有新的无线网络加入*/
    for (ssid = wpa_s->conf->ssid; ssid; ssid = ssid->next)
        wpas_notify_network_added(wpa_s, ssid);

    /* wpa_global的ifaces变量指向一个wpa_supplicant对象,
     * 而wpa_supplicant又通过next变量将自己链接到一个单项链表中*/
    wpa_s->next = global->ifaces;
    global->ifaces = wpa_s;

    wpa_dbg(wpa_s, MSG_DEBUG, "Added interface %s", wpa_s->ifname);
    wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);

    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值