您的位置:首页 > 移动开发 > Android开发

[RK3288][Android6.0] WiFi之wpa_supplicant扫描过程

2017-07-03 17:55 302 查看
Platform: Rockchip

OS: Android 6.0

Kernel: 3.10.92

wpa_supplicant_req_scan ->

  wpa_supplicant_scan ->

    wpa_supplicant_enabled_networks    //检查是否有已经使能的无线网络

    wpa_supplicant_build_filter_ssids    //过滤掉不符合条件的无线网络

      wpa_supplicant_trigger_scan -> 触发扫描

        wpas_trigger_scan_cb ->

          wpa_drv_scan ->

            wpa_s->driver->scan2 ->

              driver_nl80211_scan2 ->

                wpa_driver_nl80211_scan ->

                  nl80211_scan_common  //cmd是NL80211_CMD_TRIGGER_SCAN,填充要发送的信息到buffer中

                  send_and_recv_msgs    //发送给driver,这里通过netlink,之前有分析过

                  eloop_register_timeout //注册一个回调wpa_driver_nl80211_scan_timeout(),如果10秒之内,扫描完成事件还没发上来,那么会触发此回调去主动获取扫描完成事件

 

假设没有超时,那么会调用之前提过的和driver通信的socket回调函数wpa_driver_nl80211_event_receive()

wpa_driver_nl80211_event_receive ->

    nl_recvmsgs ->

      process_global_event ->

        do_process_drv_event ->

          do_process_drv_event    //cmd: NL80211_CMD_NEW_SCAN_RESULTS

            send_scan_event ->

              wpa_supplicant_event -> //driver wrapper想WPAS通知driver event的接口函数

                wpa_supplicant_event_scan_results -> //cmd:EVENT_SCAN_RESULTS

                  _wpa_supplicant_event_scan_results ->

                    wpa_supplicant_get_scan_results -> //获得扫描结果,无线网络频率,信号强度等

                      wpa_drv_get_scan_results2 ->

                        wpa_s->driver->get_scan_results2 ->

                          wpa_driver_nl80211_get_scan_results ->    //调用80211驱动

                            nl80211_get_scan_results ->

                              send_and_recv_msgs //cmd:NL80211_CMD_GET_SCAN, 从driver获取信息, 处理函数是bss_info_handler

                      filter_scan_res //根据bssid过滤

                      scan_snr //得到每个网络的信噪比,也就是信号强度

                      qsort //根据信号强度排序

                      wpa_bss_update_scan_res    //更新WPAS中bss信息,无线网络信息存在wpa_bss中

                  wpas_select_network_from_last_scan ->

                    wpa_supplicant_pick_network //根据ssid,安全设置,速率是否匹配,选择最合适的网络,这里直接返回我们设定的网络

参考:
wifi的扫描调用过程(从supplicant到kernel)
《深入理解android Wi-Fi、NFC和GPS卷》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: