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帧等
wpa_supplicant通过nl80211接收数据
1. wpa_supplicant中通过nl_cb_set设置netlink的回调函数process_bss_event() -> mlme_event()
2. mlme_event()根据不同的类型进入不同路线,如auth、assoc、frame、status等,此处以frame(NL80211_CMD_FRAME)为例
3. 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等。
wifi driver and wpa_supplicant
原文:http://www.cnblogs.com/qmdlinux/p/5104775.html