上層應用與wpa_supplicant,wpa_supplicant與kernel 相關socket建立交互分析

單獨拿出來,分析如下上層應用與wpa_supplicant   wpa_supplicant與kernel 的socket交互。socket

關聯上層應用與wpa_supplicant的socket的建立、鏈接流程分析函數

[-->./wpa_supplicant/ctrl_iface_unix.c]  oop

1.wpa_supplicant初始化時,在wpa_supplicant_ctrl_iface_init方法中,會通priv->sock = socket(PF_UNIX, SOCK_DGRAM, 0); 建立了一個socket,而後bind到指定的地址中的路徑(/data/misc/wifi/sockets/p2p0)。spa

這以後,便會把socket的fd保存到eloop_run中發rfds中了。由select監聽變化。unix

 

2.而後在打開wifi以後,應用層會去鏈接wpa_supplicant,在wifi.c:: wifi_connect_to_supplicant--->wifi_connect_on_socket_path方法中,會建立ctrl_conn與monitor_conn來和wpa_supplicant交互,它們各自經過wpa_ctrl_open方法建立了一個socket(它們的目的端地址路徑都是/data/misc/wifi/sockets/p2p0,可在wifi_connect_to_supplicant方法中打log查看)。而後,經過bind、connect方法與wpa_supplicant初始化時建立的priv->sock創建了鏈接。code

 

ps:以前已經討論過monitor_conn的做用是監聽wpa_supplicant傳遞過來的消息。爲何呢,實際上是由於經過wpa_ctrl_attach(monitor_conn[index])語句,將monitor_conn中的socket信息(包括源端地址)保存到wpa_supplicant的某個鏈表結構中,這樣wpa_supplicant就能經過socket發送消息給上層應用了。blog

 

貼出部分log:接口

//wpa_supplicant初始化時,建立的socket關聯的路徑
D/wpa_supplicant(2575): cb--1-addr.sun_path is wpa_/data/misc/wifi/sockets
D/wpa_supplicant(2575): cb--2-addr.sun_path is /data/misc/wifi/sockets/p2p0
D/wpa_supplicant(2575): cb--1-addr.sun_path is wpa_wlan0
//建立ctrl_conn和monitor_conn時,socket關聯的源端、目的端地址
I/wpa_ctrl(595): cb---fd is 254, ctrl->local.sun_path is /data/misc/wifi/sockets/wpa_ctrl_595-3, ctrl->dest.sun_path is /data/misc/wifi/sockets/p2p0
I/wpa_ctrl(595): cb---fd is 255, ctrl->local.sun_path is /data/misc/wifi/sockets/wpa_ctrl_595-4, ctrl->dest.sun_path is /data/misc/wifi/sockets/p2p0

 

 

關聯kernel與wpa_supplicant的socket的建立流程分析        ---可參考」 wpa_supplicant與kernel交互"事件

由於在」保存驅動接口」,select_driver方法中調用了global_init方法(會根據用戶態的結構體wpa_driver_nl80211_ops中查找對應方法,即nl80211_global_init)。it

在nl80211_global_init方法中,有兩條關鍵語句:

//(1) 初始化netlink,並註冊事件接收函數 
global->netlink = netlink_init(cfg); 

//(2) 此global->ioctl_sock用做爲ioctl命令的fd
global->ioctl_sock = socket(PF_INET, SOCK_DGRAM, 0);

 

(1)netlink_init方法中建立了一個socket,並添加到eloop_run方法中的rfds中。用於從kernel態發送事件給用戶態

netlink->sock = socket(PF_NETLINK, SOCK_RAW, NETLINK_ROUTE);
......
eloop_register_read_sock(netlink->sock, netlink_receive, netlink,NULL); 

(2)該socket用於從用戶態發送請求給kernel態

相關文章
相關標籤/搜索