Android wpa_supplcant 启动之--全局初始化

  1. wpa_supplicant简介

wpa_supplicant是用来用来支持无线中各种加密方式的,包括WEP、WPA/WPA2和WAPI(中国特有)、EAP(8021x)。wpa_s通过socket与上层(framework)和底层(driver)通信,向上接收命令和传递当前状态,向下发送命令到驱动并接收驱动上传的各种event,严格来讲wap_s和driver中还有一层cfg80211,cfg80211可以理解为linux定义的80211管理控制层的框架,例如扫描、连接这些通用的过程,各个厂商按照cfg80211提供的框架编写各自的驱动,实现具体的帧发送与接收。wpa_s是如何处理各个socket中数据的请看 eloop sun章节。

下图是网页(http://zwz94.blog.163.com/blog/static/3206039520120149580531/)上的一张图片,可以清晰的看到wpa_s早整个wifi架构中的位置

  1. wpa_supplicant的启动

在Android手机中,wpa_supplicant的启动是由framework控制的,frameowork设置property来启动写在init rc文件的中service, 同时会生成两条socket,一条向wpa_s发送命令,一条接收wpa_s上传的event

service p2p_supplicant /system/bin/wpa_supplicant \
    -ip2p0 -Dnl80211 -c/data/misc/wifi/p2p_supplicant.conf \
    -I/system/etc/wifi/p2p_supplicant_overlay.conf -N \
    -iwlan0 -Dnl80211 -c/data/misc/wifi/wpa_supplicant.conf \
    -I/system/etc/wifi/wpa_supplicant_overlay.conf \
    -O/data/misc/wifi/sockets -puse_p2p_group_interface=1 -dd \
    -e/data/misc/wifi/entropy.bin -g@android:wpa_wlan0
    class main
    socket wpa_wlan0 dgram 660 wifi wifi
    disabled
    oneshot

其中 socket wpa_wlan0 dgram 660 wifi wifi创建了一个socket,wpa_s使用该socket接收framework的命令和向上传递event。framework同样会调用连接该socket,后面会讲到

  1. wpa_supplicant启动参数

wpa_s允许传入很多参数, 参数区分大小写

参数一共有3中类型,

  • 3.1 不带后续内容的,

有 –BdhKLqstuvW

-h:帮助文件

-L:输出license

-q:提升wpa_s调试级别(输出log减少),与-d相反

-v:输出wpa_s版本号

-W:等到control interface monitor再运行

-N:当需要设置两个network interface时,需要在两个网口参数中间插入 –N, 例如 一个网口为p2p0,需要插入-N后,再新添加另一个wlan0

  • 3.2 带后续内容的,控制wpa_s运行参数的,也可以叫全局参数

结构体 wpa_params在调用 wpa_supplicant_init() 初始化wpa_s使用

struct wpa_params {
    //-B:当做守护进程运行在后台
    int daemonize;
    //-W:等到control interface monitor再运行
    int wait_for_monitor;
    //-P: pid_file - Path to a PID (process ID) file
    char *pid_file;

    //-d:输出log的级别,-d为默认级别,-dd级别降低一级(输出log会增加一级),依次类推,设置代码为params.wpa_debug_level
    int wpa_debug_level;
    //-K:在log中打印key
    int wpa_debug_show_keys;
    //-t:调试信息中增加时间戳
    int wpa_debug_timestamp;

    //ctrl_interface - Global ctrl_iface path/parameter
    //-g:global ctrl_interface(字符串为@android+SOCK_NAME, SOCK_NAME是由init.rc)
    char *ctrl_interface;
    //ctrl_interface_group - Global ctrl_iface group
    //-G:global ctrl_interface group
    char *ctrl_interface_group;

    //-u:支持dbus控制接口
    int dbus_ctrl_interface;
    //-f:将log输出到file中
    const char *wpa_debug_file_path;
    //-s:输出log到 syslog, 默认输出到stdout
    int wpa_debug_syslog;

    //-T:log增加linux trace
    int wpa_debug_tracing;
    //-o:设置linux网口的目录
    char *override_driver;
    //-O:设置wpa_s控制sockets的目录
    char *override_ctrl_interface;
    //-e:entropy_file - Optional entropy file
    char *entropy_file;
};
  • 3.3 带后续内容的,与interface相关的,也可叫接口 参数

存放到结构体 struct wpa_interface 中,运行wpa_supplicant_add_iface()需要传入该结构体

struct wpa_interface {
    //-c:conf配置文件,里面定义了一些参数和一些network节点,一般为wpa_supplicant.conf
    const char *confname;
    //-I:conf配置文件的补充选项,一般为wpa_supplicant_overlay.conf/
    const char *confanother;
    //-m:p2p网口的配置文件
    const char *conf_p2p_dev;
    //-C:控制端口socket的参数
    //功能等同conf 文件
    const char *ctrl_interface;
    //-D:driver的类型,可以设置多个,例如 nl80211,wext
    const char *driver;

    //driver_param - Driver interface parameters
    const char *driver_param;
    //-i:linux的网口,可以定义多个,例如wlan0
    const char *ifname;
    //-b:桥接的interface
    const char *bridge_ifname;

    //p2p_mgmt - Interface used for P2P management (P2P Device operations)
    int p2p_mgmt;
};
  1. wpa_s全局初始化

    主要包括 EAP各种方法的注册,eloop(wpa_s运行的主体)参数,与framework通信socket的初始化

struct wpa_global * wpa_supplicant_init(struct wpa_params *params)
{
    //全局信息,params中的内容都会拷贝到该结构体中
    struct wpa_global *global;

    //初始化eap方法,每种eap方式都有对应的方法
    ret = eap_register_methods();

    //将params中的信息复制到global中
    global = os_zalloc(sizeof(*global));

    //初始化 struct eloop_data,该结构体是个全局变量
    if (eloop_init()) 

    random_init(params->entropy_file);

    //连接与FWKS通信socket(init.rc中定义的),并注册接收cmd的函数
    global->ctrl_iface = wpa_supplicant_global_ctrl_iface_init(global);
    {
        //初始化控制socket
        wpas_global_ctrl_iface_open_sock(global, priv) < 0)
        {
            //获取-g传进来的socket名称,与init.rc中相对应
            os_strncmp(ctrl, "@android:", 9) == 0) {
                priv->sock = android_get_control_socket(ctrl + 9);
            //注册接收socket数据的函数wpa_supplicant_global_ctrl_iface_process,分发处理传入的命令
            eloop_register_read_sock(priv->sock, wpa_supplicant_global_ctrl_iface_receive, global, priv);
            //注册发送event到FWKS的函数wpa_supplicant_ctrl_iface_send
            wpa_msg_register_cb(wpa_supplicant_ctrl_iface_msg_cb);
        }
    }
    return global;
}

下图是简易的全局初始化过程

下一篇为 wpa_supplcant 启动之–linux 网络接口参数初始化

时间: 2024-08-30 11:12:13

Android wpa_supplcant 启动之--全局初始化的相关文章

Android wpa_supplcant 启动之--网络接口初始化

wpa_supplicant结构体与网络接口 在手机adb中运行 netcfg或者ifconfig可以看到相关的网络接口的ip,掩码,mac地址等信息 Wpa_supplicant为每个网络接口都分配了一个struct wpa_supplicant, 该结构体存储了一些必要信息例如 struct dl_list bss(扫描结果); struct wpa_config *conf(配置文件)等等. 每一个网络接口的扫描,连接等操作都是通过struct wpa_supplicant中定义的相关函数

Android init language (安卓初始化语言)

目前在研究framework框架,AIL是Android初始化语言,以下是根据官方文档进行的翻译有助于研究Android启动过程: Android初始化语言包含了四种类型的声明:Actions(行动).Commands(命令).Services(服务)和Options(选项). 所有这些都是以行为单位的,各种记号由空格来隔开.C语言风格的反斜杠号可用于在记号间插入空格.双引号也可用于防止字符串被空格分割成多个记号.行末的反斜杠用于折行. 注释行以井号(#)开头(允许以空格开头). Actions

杂谈——Android从启动到程序运行发生的事情

转载请注明出处 博客地址:http://blog.csdn.net/JonsTank2013/article/details/51118563 作者:李中权 前言 好久没有写博客了,瞬间感觉好多学了的东西不进行一个自我的总结与消化总归变不成自己的.通过博客可能还可以找到一些当初在学习的时候没有想到的问题.想了半天,从大二上学期自学Android以来还没有对Android从启动到程序运行期间进行一个完整的归纳,刚好最近又学到了一些新东西,那就以这篇博客为媒介,总结一下从Android启动到程序运行

Android从启动到程序运行整个过程的整理

1Android是基于Linux的一个操作系统,它可以分为五层,下面是它的层次架构图,可以记一下,因为后面应该会总结到SystemServer这些Application Framework层的东西 Android的五层架构从上到下依次是:应用层,应用框架层,库层,运行时层,Linux内核层. 而在Linux中,它的启动可以归为一下几个流程: Boot Loader——>初始化内核——>...... 当初始化内核之后,就会启动一个相当重要的祖先进程,也就是init进程,在Linux中所有的进程都

Android开机启动过程分析

首先android是基于Linux的内核,只有先加载了kernel才能启动安卓,对于Linux来说android只是其上的一个应用程序.Android的启动大致可以形象的划分为三个过程: Init->init.rc->zygote.从事嵌入式开发的人都知道,Linux加载完内核驱动后会挂载'/'根文件系统,挂载完成后会执行'/init'二进制程序,这也是内核启动后执行的第一个用户程序,android里面也是这样.这个程序的main函数位于android/system/core/init/ini

Android 框架启动流程

As we all know,Android手机系统本质上是一个基于Linux的应用程序,它以Linux系统为内核.因此系统的启动过程包括Linux内核启动和Android框架启动两个阶段. Linux内核启动 1.装载引导程序bootloader Linux内核启动时首先装载执行bootloader引导程序,装载完成后进入内核程序. 2.加载Linux内核 Linux内核加载主要包括初始化kernel核心(内存初始化,打开中断,初始化进程表等).初始化驱动.启动内核后台(daemons)线程.

Android WIFI 启动流程

参考:http://blog.chinaunix.net/uid-26215986-id-3260413.html 一. WIFI 工作步骤 1. Wifi模块初始化 2. Wifi启动 3. 查找热点(AP) 4. 配置AP 5. 配置AP参数 6. Wifi连接 7. IP地址配置 二. WIFI 核心模块 1. WifiService 由SystemServer启动的ConnecttivityService创建, 负责启动关闭wpa_supplicant, WifiMonitor线程, 把

Android WebView启动Chromium渲染引擎的过程分析

Android WebView加载了Chromium动态库之后,就可以启动Chromium渲染引擎了.Chromium渲染引擎由Browser.Render和GPU三端组成.其中,Browser端负责将网页UI合成在屏幕上,Render端负责加载网页的URL和渲染网页的UI,GPU端负责执行Browser端和Render端请求的GPU命令.本文接下来详细分析Chromium渲染引擎三端的启动过程. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! Andro

【转】Android kernel启动流程

;font-family:Arial, Console, Verdana, 'Courier New';line-height:normal;white-space:normal;background-color:#FFFFFF;"> linuxandroidmakefileimagecachealignment 虽然这里的Arm Linux kernel前面加上了Android,但实际上还是和普遍Arm linux kernel启动的过程一样的,这里只是结合一下Android的Makef