wpa_supplicant_add_iface()
wpa_supplicant_init_iface(wpa_s, &t_iface)
// 读取wpa_supplicant.conf配置文件, /data/vendor/wifi/wpa/wpa_supplicant.conf , /vendor/etc/wifi/wpa_supplicant_overlay.conf
wpa_config_read(wpa_s->confanother, wpa_s->conf);
wpas_init_driver(wpa_s, iface) // 初始化驱动
wpa_supplicant_set_driver(wpa_s, driver) // 根据-Dnl80211、-Dwired等参数,确定驱动类型
select_driver(wpa_s, i); // 遍历wpa_drivers全局结构体,根据名字查找驱动
wpa_drivers[i]->global_init(global) // 返回struct nl80211_global对象,全局上下文信息
nl80211_global_init()
netlink_init(cfg) // 处理网卡状态变化事件:UP/DORMANT/REMOVED
netlink->sock = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
bind(netlink->sock, (struct sockaddr *) &local, sizeof(local))
eloop_register_read_sock(netlink->sock, netlink_receive, netlink, NULL);
wpa_driver_nl80211_init_nl_global(global)
global->nl = nl_create_handle(global->nl_cb, "nl"); // 用于发送netlink消息
global->nl_event = nl_create_handle(global->nl_cb, "event"); // 用于发送netlink消息
nl_cb_set(global->nl_cb, NL_CB_SEQ_CHECK, NL_CB_CUSTOM,no_seq_check, NULL);
nl_cb_set(global->nl_cb, NL_CB_VALID, NL_CB_CUSTOM,process_global_event, global); // 设置netlink消息回调处理函数
global->ioctl_sock = socket(PF_INET, SOCK_DGRAM, 0)
wpa_drv_init(wpa_s, wpa_s->ifname); // driver的局部上下文信息初始化
wpa_s->driver->init2 / init (wpa_s, ifname, wpa_s->global_drv_priv); // 返回struct i802_bss对象
init2 = wpa_driver_nl80211_init, --> wpa_driver_nl80211_drv_init
nl80211_init_bss(bss)
// 设置bss事件处理回调函数,注意此时并没有创建nl_handle即nl_socket
nl_cb_set(bss->nl_cb, NL_CB_SEQ_CHECK, NL_CB_CUSTOM,no_seq_check, NULL);
nl_cb_set(bss->nl_cb, NL_CB_VALID, NL_CB_CUSTOM,process_bss_event, bss);wpa_driver_nl80211_finish_drv_init(drv, set_addr, 1, driver_params)
wpa_driver_nl80211_capa(drv)
nl80211_set_param(bss, driver_params)
wpa_driver_nl80211_set_mode(bss, nlmode) // 设置接口类型为NL80211_IFTYPE_STATION
wpa_driver_nl80211_drv_init_rfkill(drv);
/*rfkill代表radio frequency( RF) connector kill switch support,
它是Kernel中的一个子系统( subsystem) 。
其功能是控制系统中射频设备的电源( 包括Wi-Fi、 GPS、BlueTooth、 FM等设备。
注意, 这些设备驱动只有把自己注册到rfkill子系统中后, rfkill才能对它们起作用)
的工作以避免浪费电力。 rfkill有软硬两种方式来禁止( block) RF设备。*/drv->rfkill = rfkill_init(rcfg);
eloop_register_read_sock(rfkill->fd, rfkill_receive, rfkill, NULL); // 接收rfkill事件,查看无线设备是开启还是关闭。
drv->eapol_tx_sock = socket(PF_PACKET, SOCK_DGRAM, 0);
wpa_drv_set_param(wpa_s, wpa_s->conf->driver_param)
wpa_drv_get_ifname(wpa_s);
wpa_driver_get_radio_name(wpa_s);
radio_add_interface(wpa_s, rn);
wpa_supplicant_init_wpa(wpa_s) // 初始化wpa_sm相关的资源
wpa_sm_init(ctx); // 初始化wpa_sm状态机
wpa_sm_set_ifname(...)
wpa_sm_set_param(...)
wpa_drv_get_hw_feature_data(wpa_s, &wpa_s->hw.num_modes,&wpa_s->hw.flags) // vht ,ht 20 ...
wpa_drv_get_capa(wpa_s, &capa)
wpa_supplicant_driver_init(wpa_s)
wpa_supplicant_update_mac_addr(wpa_s)
l2_packet_init(wpa_s->ifname, wpa_drv_get_mac_addr(wpa_s), ETH_P_EAPOL, wpa_supplicant_rx_eapol, wpa_s, 0);
wpa_supplicant_req_scan(wpa_s, interface_count % 3, 100000); // 发起有效SSID的扫描
wpa_drv_set_country(wpa_s, wpa_s->conf->country) // set country
wpas_wps_init(wpa_s) // 设置3个callback,处理认证事件
wps->cred_cb = wpa_supplicant_wps_cred;
wps->event_cb = wpa_supplicant_wps_event;
wps->rf_band_cb = wpa_supplicant_wps_rf_band;wpa_supplicant_init_eapol(wpa_s) // 初始化EAPOL
wpa_sm_set_eapol(wpa_s->wpa, wpa_s->eapol);
wpa_supplicant_ctrl_iface_init(wpa_s)
gas_query_init(wpa_s);
wpas_p2p_init(wpa_s->global, wpa_s)
wpa_bss_init(wpa_s)
wpas_set_wowlan_triggers(wpa_s, &capa)
pcsc_reader_init(wpa_s)
wpas_init_ext_pw(wpa_s)
wpas_rrm_reset(wpa_s);
wpas_sched_scan_plans_set(wpa_s, wpa_s->conf->sched_scan_plans);
hs20_init(wpa_s);
wpas_mbo_update_non_pref_chan(wpa_s, wpa_s->conf->non_pref_chan);
wpa_supplicant_set_default_scan_ies(wpa_s);
wpas_notify_iface_added(wpa_s)
wpas_notify_network_added(wpa_s, ssid)
wpa_supplicant_set_state(wpa_s, WPA_DISCONNECTED);
Android wpa_supplicant 源码分析四 -- wpa_supplicant_add_iface()
最新推荐文章于 2025-05-17 13:00:27 发布