wifi driver and wpa_supplicant p2p


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM