Wifi系统框架
Wifi流程图:
第一部分:Wifi Framework分析
1,1注册WiFiservice
frameworks/base/services/java/com/android/server/SystemServer.java
1,2 wifi service
frameworks/base/services/java/com/android/server/WifiService.java
wifiservice是整个框架的核心部分,application层触发事件后,会调用这个service里面的方法来处理事件,包括加载驱动,开启wpa_supplicant,扫描AP都是调用这个service里面的方法实现的,实际上这些方法最终调用的是wifistatemachine里面的方法去发送消息。由wifistatemachine里面的描述wifi事件的内部类去处理这些消息。在这个类的构造方法中主要就是实例化了一个描述wifi状态机的类WifiStateMachine,重写了广播事件的onReceive方法。
1,3 WifiStateMachine
frameworks/base/wifi/java/android/net/wifi/WifiStateMachine.java
1,4 WifiMonitor
frameworks/base/wifi/java/android/net/wifi/WifiMonitor.java
1,5Wifinative
frameworks/base/wifi/java/android/net/wifi/WifiNativejava
第二部分: JNI 层分析
frameworks/base/core/jni/android_net_wifi_Wifi.cpp.这个文件里面是调用HAL层的wifi.c里面对应方法的接口的集合,提供给frameswork层的类Wifinative里面的方法调用
第三部分: HAL 层分析
3,1驱动的加载和卸载
wifi_load_driver():驱动的加载。wifi驱动是编译成ko文件, ko文件储存的位置。
defineWIFI_DRIVER_MODULE_PATH”/system/lib/modules/bcmdhd.ko” 。这个方法会被上层调用加载驱动。卸载方法 wpa_unload_driver()
3,2 Wpa_supplicant 相关(上行接口)
3,3 数据传输(涉及wpa_supplicnt的上行接口)
3,3,1 发送数据
wifi_command(const char *command, char*reply, size_t *reply_len):这个方法被jni调用,主要是上层发送命令通过这个方法传递给wpa_supplicant。
3,3,2 接受数据
wifi_wait_for_event(char *buf, size_tbuflen):上层调用这个方法阻塞等待wpa_supplicant传递上来的信息,主要是调用wifi_ctrl_recv(struct wpa_ctrl *ctrl, char *reply, size_t *reply_len)来实现。
3,4 wpa_supplicant
就是wifi驱动和用户的中转站外加对协议和加密认证的支持。
3,4,1上行接口:
wpa_supplicant提供两种方式的上行接口。一种基于传统dbus机制实现与其他进程间的IPC通信;另一种通过Unix domain socket机制实现进程间的IPC通信。
3,4,2下行接口:
wpa_supplicant提供的下行接口主要用于和kernel(driver)进行通信,下发命令和获取信息。wpa_supplicant下行接口主要包括三种重要的接口:
(1)PF_INET socket接口,主要用于向kernel发送ioctl命令,控制并获取相应信息。
(2) PF_NETLINK socket接口,主要用于接收kernel发送上来的event 事件。
(3) PF_PACKET socket接口,主要用于向driver传递802.1X报文
3,5 wpa_supplicant 和kernel 的交互
wpa_supplicant与kernel交互的操作,一般需要先明确驱动接口,以及用户态和kernel态的接口方法,以此来进行调用操作这里分为4个步骤。
1.首先需要明确指定的驱动接口。因为有较多的驱动接口可以使用,如wext、nl80211等。指定了之后,才能调用相应接口的方法。
2.保存驱动接口
3.接口方法的实现(分为用户态和kernel态)。
系统已经定义了,我们只需找到定义的地方,了解有哪些方法。
4.交互
(a)用户态向kernel态发送请求(通过ioctl)
(b)kernel态向用户态发送事件通知(通过netlink)