1 wpa_supplicant_init_iface
static int wpa_supplicant_init_iface(struct wpa_supplicant *wpa_s,
const struct wpa_interface *iface)
{
struct wpa_driver_capa capa;
int capa_res;
u8 dfs_domain;
if (iface->confname) {
#ifdef CONFIG_BACKEND_FILE
//此宏表明WPAS使用的配置项信息来源于文件
wpa_s->confname = os_rel2abs_path(iface->confname);
if (wpa_s->confname == NULL) {
wpa_printf(MSG_ERROR, "Failed to get absolute path "
"for configuration file '%s'.",
iface->confname);
return -1;
}
#else /* CONFIG_BACKEND_FILE */
wpa_s->confname = os_strdup(iface->confname);
#endif /* CONFIG_BACKEND_FILE */
wpa_s->conf = wpa_config_read(wpa_s->confname, NULL);
init_iface初始化的第一个工作是解析运行时配置文件
//下面这两个函数和EAPOL状态机有关
/* RSNA Supplicant Key Management - INITIALIZE */
eapol_sm_notify_portEnabled(wpa_s->eapol, false);
eapol_sm_notify_portValid(wpa_s->eapol, false);
2 rfkill及其他背景知识
rfkill代表radio frequency(RF) connector kill switch support
它是kernel中的一个子系统,功能是控制系统中射频设备的电源(包括Wi-Fi、GPS、BT、FM)的工作以避免浪费电力
这些设备驱动只有把自己注册到rfkill子系统中后,rfkill才能对它们起作用
rfkill有软硬两种方式来禁止(block)RF设备
1.hard block
不能通过软件来重新启用RF设备,Android设备应该还没有hard block功能
2.soft block
用软件来重新启用RF设备
rfkill对用户空间提供了相应的控制接口,主要是通过/dev/rfkill设备文件来完成相关操作
一般而言,一块网络接口设备只有一个MAC地址,但现在很多设备都支持多个所谓的虚拟设备(Virtual Interface)
每一个虚拟设备都对应有一个虚拟MAC地址
下面是Wi-Fi P2P中一种名为并发设备(concurrent device)的示意图
位于中间的Wi-Fi设备一方面以P2P Device的身份和左下角的另一个P2P Device相连
另一方面又以STA的身份和右边的AP相连
它们工作方式不尽相同,通过虚拟设备,使P2P Device和STA分别使用不同的Virtual Interface和Virtual MAC
3 capability信息及含义
1.max_match_sets
使用计划扫描时,给驱动指定一个ssid过滤列表,只有扫描结果符合过滤列表的那些无线网络才会通知WPAS已开展后续处理
2.max_reamin_on_chan
和off-channel transmition功能有关
该功能使得Wi-Fi硬件能在某个特定信道上保持awake状态一定时间用于传输某些帧(例如Action帧)
STA实际上在另一个信道(on-channel)上和AP保持连接
某些时候,STA会转移到onChannel信道以外的其他信道以接收和处理其他STA(P2P的情况)或AP发送的帧
max_remain_on_chan用于指明STA在off-channel中工作的最长时间
3.max_stations
手机做AP使用时(无线网络接口设备的类型为NL80211_IFTYPE_AP),表示最多支持多少个STA与之关联
4 wpa_bss_init
wpa_supplicant注册了一个定时任务用于定时更新其保存的wpa_bss信息,一旦某个无线网络在一定时间内没有更新或使用,则需要从链表中把它去掉
注册一个超时任务,超时时间为 WPA_BSS_EXPIRATION_PERIOD ,值为10秒
在当前源码中没找到这个值
后面是EAP模块和EAPOL模块的解读,暂且跳过