【Android-WIFI】(六) wpa_supplicant to kernel

  1. Global nl_socket 创建

//external/wpa_supplicant8/wpa_supplicant/main.c
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;
    
    iface = ifaces = os_zalloc(sizeof(struct wpa_interface));
    iface_count = 1;
    //...

    for (i = 0; exitcode == 0 && i < iface_count; i++) {
        struct wpa_supplicant *wpa_s;
        //...
        wpa_s = wpa_supplicant_add_iface(global, &ifaces[i], NULL);
        if (wpa_s == NULL) {
            exitcode = -1;
            break;
        }
    }
    //...
}

main -> wpa_supplicant_add_iface;

//external/wpa_supplicant8/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
 * @parent: Parent interface or %NULL to assign new interface as parent
 * 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 *parent)
{
    //...
    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;
    }
    //...
}

wpa_supplicant_add_iface -> wpa_supplicant_init_iface

//external/wpa_supplicant8/wpa_supplicant/wpa_supplicant.c
static int wpa_supplicant_init_iface(struct wpa_supplicant *wpa_s,
                     const struct wpa_interface *iface)
{
    //...
    /* Initialize driver interface and register driver event handler before
     * L2 receive handler so that association events are processed before
     * EAPOL-Key packets if both become available for the same select()
     * call. */
    if (wpas_init_driver(wpa_s, iface) < 0)
        return -1;
    //...

}

wpa_supplicant_init_iface -> wpas_init_driver

//external/wpa_supplicant8/wpa_supplicant/wpa_supplicant.c
static int wpas_init_driver(struct wpa_supplicant *wpa_s,
                const struct wpa_interface *iface)
{
    const char *ifname, *driver, *rn;

    driver = iface->driver;
next_driver:
    if (wpa_supplicant_set_driver(wpa_s, driver) < 0)
        return -1;

    wpa_s->drv_priv = wpa_drv_init(wpa_s, wpa_s->ifname);
    //...
}

wpas_init_driver -> wpa_supplicant_set_driver

//external/wpa_supplicant8/wpa_supplicant/wpa_supplicant.c
static int wpa_supplicant_set_driver(struct wpa_supplicant *wpa_s,
                     const char *name)
{

    do {
        pos = os_strchr(driver, ',');
        for (i = 0; wpa_drivers[i]; i++) {
            if (os_strlen(wpa_drivers[i]->name) == len &&
                os_strncmp(driver, wpa_drivers[i]->name, len) ==
                0) {
                /* First driver that succeeds wins */
                if (select_driver(wpa_s, i) == 0)
                    return 0;
            }
        }

        driver = pos + 1;
    } while (pos);
}

wpa_supplicant_set_driver -> select_driver

//external/wpa_supplicant8/wpa_supplicant/wpa_supplicant.c
static int select_driver(struct wpa_supplicant *wpa_s, int i)
{
    struct wpa_global *global = wpa_s->global;

    if (wpa_drivers[i]->global_init && global->drv_priv[i] == NULL) {
        global->drv_priv[i] = wpa_drivers[i]->global_init(global);
        if (global->drv_priv[i] == NULL) {
            wpa_printf(MSG_ERROR, "Failed to initialize driver "
                   "'%s'", wpa_drivers[i]->name);
            return -1;
        }
    }
}

select_driver -> global_init

//external/wpa_supplicant8/wpa_supplicant/src/drivers/driver_nl80211.c
static void * nl80211_global_init(void *ctx)
{
    //...

    if (wpa_driver_nl80211_init_nl_global(global) < 0)
        goto err;
    //...
}

global_init -> wpa_driver_nl80211_init_nl_global

static int wpa_driver_nl80211_init_nl_global(struct nl80211_global *global)
{
    //...
    global->nl = nl_create_handle(global->nl_cb, "nl");
    if (global->nl == NULL)
        goto err;
    //...
}
  1. bss nl_socket 创建

//external/wpa_supplicant8/wpa_supplicant/main.c
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;
    
    iface = ifaces = os_zalloc(sizeof(struct wpa_interface));
    iface_count = 1;
    //...

    for (i = 0; exitcode == 0 && i < iface_count; i++) {
        struct wpa_supplicant *wpa_s;
        //...
        wpa_s = wpa_supplicant_add_iface(global, &ifaces[i], NULL);
        if (wpa_s == NULL) {
            exitcode = -1;
            break;
        }
    }
    //...
}

main -> wpa_supplicant_add_iface;

//external/wpa_supplicant8/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
 * @parent: Parent interface or %NULL to assign new interface as parent
 * 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 *parent)
{
    //...
    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;
    }
    //...
}

wpa_supplicant_add_iface -> wpa_supplicant_init_iface

//external/wpa_supplicant8/wpa_supplicant/wpa_supplicant.c
static int wpa_supplicant_init_iface(struct wpa_supplicant *wpa_s,
                     const struct wpa_interface *iface)
{
    //...
    /* Initialize driver interface and register driver event handler before
     * L2 receive handler so that association events are processed before
     * EAPOL-Key packets if both become available for the same select()
     * call. */
    if (wpas_init_driver(wpa_s, iface) < 0)
        return -1;
    //...

}

wpa_supplicant_init_iface -> wpas_init_driver

//external/wpa_supplicant8/wpa_supplicant/wpa_supplicant.c
static int wpas_init_driver(struct wpa_supplicant *wpa_s,
                const struct wpa_interface *iface)
{
    const char *ifname, *driver, *rn;

    driver = iface->driver;
next_driver:
    if (wpa_supplicant_set_driver(wpa_s, driver) < 0)
        return -1;

    wpa_s->drv_priv = wpa_drv_init(wpa_s, wpa_s->ifname);
    //...
}

wpas_init_driver -> wpa_drv_init

//external/wpa_supplicant8/wpa_supplicant/driver_i.h
static inline void * wpa_drv_init(struct wpa_supplicant *wpa_s,
                  const char *ifname)
{
    return wpa_s->driver->init2(wpa_s, ifname,
                        wpa_s->global_drv_priv);
}
//external/wpa_supplicant8/wpa_supplicant/src/drivers/driver_nl80211.c
const struct wpa_driver_ops wpa_driver_nl80211_ops = {
    .name = "nl80211",
    .desc = "Linux nl80211/cfg80211",
    //...
    .init2 = wpa_driver_nl80211_init,
    //...
}

wpa_drv_init -> wpa_driver_nl80211_init

//external/wpa_supplicant8/wpa_supplicant/src/drivers/driver_nl80211.c
static void * wpa_driver_nl80211_init(void *ctx, const char *ifname,
                      void *global_priv)
{
    return wpa_driver_nl80211_drv_init(ctx, ifname, global_priv, 0, NULL,
                       NULL);
}

static void * wpa_driver_nl80211_drv_init(void *ctx, const char *ifname,
                      void *global_priv, int hostapd,
                      const u8 *set_addr,
                      const char *driver_params)
{
    //...

    if (nl80211_init_bss(bss))
        goto failed;

    //...
}

wpa_driver_nl80211_drv_init -> nl80211_init_bss

//external/wpa_supplicant8/wpa_supplicant/src/drivers/driver_nl80211.c
static int nl80211_init_bss(struct i802_bss *bss)
{
    //...

    nl80211_init_connect_handle(bss);

    return 0;
}

nl80211_init_bss -> nl80211_init_connect_handle

//external/wpa_supplicant8/wpa_supplicant/src/drivers/driver_nl80211.c
static int nl80211_init_connect_handle(struct i802_bss *bss)
{
    //...
    bss->nl_connect = nl_create_handle(bss->nl_cb, "connect");
    //...
}

nl_create_handle -> nl_create_handle

//external/wpa_supplicant8/wpa_supplicant/src/drivers/driver_nl80211.c
static struct nl_sock * nl_create_handle(struct nl_cb *cb, const char *dbg)
{
    struct nl_sock *handle;
    if (genl_connect(handle)) {
        nl_socket_free(handle);
        return NULL;
    }
}

nl_create_handle -> genl_connect

//external/libnl/lib/genl/genl.c
int genl_connect(struct nl_sock *sk)
{
    return nl_connect(sk, NETLINK_GENERIC);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值