supplicant扫描的调用过程(使用nl80211)
supplicant接收到”SCAN”命令后,由wpa_supplicant_ctrl_iface_process处理。
wpa_supplicant_ctrl_iface_process
wpas_ctrl_scan // 处理扫描命令
wpa_supplicant_req_scan
wpa_supplicant_scan
wpa_supplicant_trigger_scan
wpas_trigger_scan_cb
wpa_drv_scan // wpa_s->driver->scan2调用到driver_nl80211_scan2
driver_nl80211_scan2
wpa_driver_nl80211_scan
nl80211_scan_common
send_and_recv_msgs
触发扫描的内核调用过程
SYSCALL_DEFINE3(sendmsg, int, fd, struct msghdr __user *, msg, unsigned, flags)
__sys_sendmsg (net\socket.c)
sock_sendmsg
__sock_sendmsg
__sock_sendmsg_nosec (sock->ops->sendmsg调用netlink_sendmsg)
netlink_sendmsg
netlink_unicast
netlink_unicast_kernel (nlk->netlink_rcv调用genl_rcv)
genl_rcv (cb 为genl_rcv_msg)
genl_rcv_msg (ops->doit调用到nl80211_trigger_scan)
nl80211_trigger_scan (net\wireless\nl80211.c)
Wifi驱动的扫描行为
◆上层发起一次scan命令->wifi进行各个信道的sacn->驱动包扫描结果存储在scanned_queue->扫面完成->通过rtw_cfg80211_surveydone_event_callback(cfg80211_inform_bss_frame)把扫描的ap结果通知内核net/wireless/scan.c->通过rtw_indicate_scan_done(cfg80211_scan_done)通知内核、上层扫描结束。
◆Wifi驱动每次发起扫面前,都会检查上次扫描到的ap到现在的时间是否超过20s(SCANQUEUE_LIFETIME),若超过20s,就会调用rtw_list_delete把ap从scanned_queue中去掉,接下来再扫面到新的ap时,再加入scanned_queue。
◆每次扫描完所有信道后,会再次扫描一个信道,连接ap的情况下,扫描的信道为所连接ap的信道,没连接ap的情况下,为最后一个扫描信道。
◆对于接收到的beacon帧,由OnBeacon处理,只有在扫描状态的时候,beacon的ap才会被加入到scanned_queue,其它情况根据WIFI_FW状态进行不同操作,有触发start_clnt_auth,有更新ap信息等操作。
◆net/wireless中使用bss_list保存扫描到的ap结果,扫描结束后,应用层通过NL80211_CMD_GET_SCAN命令,由内核nl80211_dump_scan函数把结果发送给应用层,内核中保存ap有效时间为3s,超过3s该ap的信息会从bss_lis移除。
◆supplicant中通过wpa_s->bss保存扫描的ap,如果一个ap在180s(DEFAULT_BSS_EXPIRATION_AGE)内没有更新,就会删除该ap,每10s进行一次检测,由wpa_bss_timeout函数检查。
————————————————
版权声明:本文为CSDN博主「简单的过客」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zjli321/article/details/52004521