usb wifi驅動接收底層硬件數據:
1. hal/hal_hci/hal_usb.c/usb_init_recv_priv()調用tasklet_init,設置數據接收處理函數usb_recv_tasklet()
usb_recv_tasklet() -> recvbuf2recvframe() -> rtw_recv_entry() -> recv_func() -> recv_func_prehandle() -> validate_recv_frame()
2. 在validate_recv_frame()中根據type區分MGT幀、Ctrl幀、Data幀。對於MGT幀,調用validate_recv_mgnt_frame() -> mgt_dispatcher()
3. 在mgt_dispatcher()中根據subtype區分beacon幀、probe幀、action幀、auth幀、assoc幀等
驅動接收到底層硬件數據之后,一種情況是自己處理掉,一種情況是向上層傳遞。
驅動上傳數據方式:
1. napi方式:混合使用中斷和輪詢,比netif_rx新,效率高。
2. netif_rx方式:中斷處理方式,通過netif_rx() -> netif_rx_schedule()觸發軟中斷NET_RX_SOFTIRQ,調用net_rx_action() -> poll() -> netif_receive_skb() -> func()[ip_rcv() ...]
3. cfg80211方式:如cfg80211_rx_mgmt()
wpa_supplicant接收數據
wpa_supplicant通過nl80211與驅動中的cfg80211通過netlink socket通信,使用libnl庫。
1. wpa_supplicant中通過nl_cb_set()設置的回調函數process_bss_event()
2. process_bss_event() -> mlme_event()根據不同的類型(如auth、assoc、frame、status等)進入不同路線
3. 以frame(NL80211_CMD_FRAME)為例:mlme_event() -> mlme_event_mgmt() -> wpa_supplicant_event(EVENT_RX_MGMT)
4. events.c/wpa_supplicant_event()根據不同的event類型,如EVENT_AUTH,EVENT_ASSOC,EVENT_RX_MGMT等進行不同處理
5. 以EVENT_RX_MGMT為例,wpa_supplicant_event()再根據子類型進入不同路線,如probe,action等。
wpa_supplicant發送數據
1. 初始化時設置struct p2p_config的接口函數,如p2p.send_probe_resp = wpas_send_probe_resp等
2. send_probe_resp() -> wpas_send_probe_resp() -> driver的send_mlme() -> driver_nl80211_send_mlme() -> nl_send_auto_complete()
usb wifi驅動接收上層協議棧數據:
1. 驅動初始化時調用rtw_wdev_alloc()設置cfg80211接口struct cfg80211_ops
2. 協議棧調用接口如mgmt_tx() -> cfg80211_rtw_mgmt_tx() -> _cfg80211_rtw_mgmt_tx() -> dump_mgntframe_and_wait_ack() -> rtw_hal_mgnt_xmit()
wpa_supplicant設備查找:
1. wpa_cli發送命令:wpa_cli.c/wpa_cli_cmd_p2p_find() -> "P2P_FIND"
2. wpa_supplicant接收命令:ctrl_iface.c/wpa_supplicant_ctrl_iface_process() -> p2p_ctrl_find() -> wpas_p2p_find() -> p2p_supplicant.c/p2p_find() -> p2p->cfg->p2p_scan()
3. p2p_supplicant.c/wpas_p2p_init()/p2p.p2p_scan=wpas_p2p_scan() -> radio_add_work(wpas_p2p_trigger_scan_cb)
wpas_p2p_trigger_scan_cb()
wpa_drv_scan()
wpa_s->driver->scan2()/driver_nl80211_scan2() -> wpa_driver_nl80211_scan()
send_and_recv_msgs() // 觸發驅動掃描
驅動事件:wpa_supplicant_event(EVENT_SCAN_STARTED)
eloop_register_timeout(wpa_driver_nl80211_scan_timeout)
Timer事件:wpa_supplicant_event(EVENT_SCAN_RESULTS)
wpa_supplicant_event_scan_results() -> _wpa_supplicant_event_scan_results()
scan_res = wpa_supplicant_get_scan_results()
wpa_drv_get_scan_results2()
wpa_s->driver->get_scan_results2()/wpa_driver_nl80211_get_scan_results()
filter_scan_res()
wpa_bss_update_scan_res() // 注意這里P2P的probe requst不會更新到bss鏈表中
wpa_s->scan_res_handler(scan_res)=wpas_p2p_scan_res_handler(scan_res) // 在wpas_p2p_trigger_scan_cb中設置的
p2p_scan_res_handler()
p2p_scan_res_handled()
p2p_notify_scan_trigger_status()
eloop_register_timeout(p2p_scan_timeout)
wpa_s->scan_res_handler = wpas_p2p_scan_res_handler
