分析wpa_supplicant起始函数main源码
wpa_supplicant的目录及文件
本篇blog的源码来源于安卓10,对应的wpa_supplicant版本为8。
先来看下wpa_supplicant代码的目录结构
源码目录:
xxx@ubuntu-07:~/workspace/rk3399-android-10/external/wpa_supplicant_8$ ls
Android.mk CONTRIBUTIONS hostapd MODULE_LICENSE_BSD_LIKE OWNERS src wpa_supplicant
CleanSpec.mk COPYING hs20 NOTICE README tests
xxx@ubuntu-07:~/workspace/rk3399-android-10/external/wpa_supplicant_8$ cd src/
xxx@ubuntu-07:~/workspace/rk3399-android-10/external/wpa_supplicant_8/src$ ls
ap crypto eap_common eapol_supp eap_server l2_packet Makefile pae rsn_supp utils
common drivers eapol_auth eap_peer fst lib.rules p2p radius tls wps
关于上面每个文件夹大致的功能是什么网上有很多blog来讲述,讲的也非常清楚,可自行查看。
main
分析初始化之前,先看下安卓10跑起来后,在控制台输入logcat指令以后输出的系统debug信息。
logcat输出:
[17:16:13][ 46.176721] init: starting service 'wpa_supplicant'...
。。。。。一些其他的init输出
[17:16:13]11-18 11:10:06.091 +0000 2017 2017 I wpa_supplicant: argc = 2
第一句话是系统内核输出的,并非wpa_supplicant;这句话意味着wpas服务被启动,即调用了wpas的开始函数。经对比上方的输出和下方的代码,即可知,wpa_supplicant服务一开始进入的函数就是它~/wpa_supplicant/main.c里的main函数,上面贴出的最后一句输出和对应main里的printf对应上了。
wpa_supplicant的main函数:~/rk3399-android-10/external/wpa_supplicant_8/wpa_supplicant/main.c
#define BROADCOM_MODULE_NAME "[broadcom]"
#define REALTEK_MODULE_NAME "[realtek]"
#define SSV_MODULE_NAME "[ssv]"
#define ESP_MODULE_NAME "[esp]"
int main(int argc, char *argv[])
{
int ret = -1;
char module_type[20]={
0};//实际上没有使用到
wpa_printf(MSG_INFO,"argc = %d\n",argc);
//这就是log里输出的那句,说明这是整个wpas服务的起始函数
//至于谁实际上调用了这个main函数并将argc和argv传进来,我暂时没找到,希望清楚这里的大佬指导一下
if(argc == 2) {
if (check_wifi_chip_type() == REALTEK_WIFI) {
//别的文件里定义的函数和属性,见之后贴出的代码
wpa_printf(MSG_INFO,"Start rtl_wpa_supplicant\n");
ret = read_wpa_param_config(REALTEK_MODULE_NAME,argv[1]);//根据不同的芯片类型,读取wpa_config.txt中的不同属性
//REALTEK_MODULE_NAME为上方定义的全局变量
} else if (check_wifi_chip_type() == BROADCOM_WIFI) {
//以下同上
wpa_printf(MSG_INFO,"Start bcm_wpa_supplicant\n");
ret = read_wpa_param_config(BROADCOM_MODULE_NAME,argv[1]);
} else if (check_wifi_chip_type() == RK912_WIFI ||
check_wifi_chip_type() == SSV_WIFI) {
wpa_printf(MSG_INFO,"Start ssv_wpa_supplicant\n");
ret = read_wpa_param_config(SSV_MODULE_NAME,argv[1]);
}

本文分析了wpa_supplicant v8版本在Android 10系统中的启动过程,包括源码目录结构、main函数解析、不同WiFi芯片类型的处理流程、参数配置文件wpa_config.txt的读取方式等。

680

被折叠的 条评论
为什么被折叠?



