//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;
//...
}
//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);
}