Ø Main.c static voidieee80211_tasklet_handler(unsigned long data)
Everything aboutreceive is started from this function. There is a switch statement:switch(skb->pkt_type), two cases: IEEE80211_RX_MSG IEEE80211_TX_STATUS_MSG. Now we only pay attention to RX, in RX path,kernel invokesieee80211_rx(&local->hw,skb).
Ø ieee80211_rx(&local->hw, skb);
This is thereceive path handler. It is called by a low level driver when an 802.11 MPDU isreceived from the hardware.主要有以下操作:
1. 丢弃部分frame:(status->band>= IEEE80211_NUM_BANDS),local->hw.wiphy->bands[status->band]为空,(local->quiescing ||local->suspended),已经正在配置、正在启动时受到frame;
2. ieee80211_rx_monitor(local,skb, rate)添加radiotap头部,复制帧,上交给各个monitor interface;
3actualRx frames handler
Ø __ieee80211_rx_handle_packet(hw, skb)
1. 如果是prob_resp或者beacon就调用ieee80211_scan_rx(local,skb);
这个函数有两个主要的操作ieee80211_bss_info_update、ieee80211_rx_bss_put。ieee80211_bss_info_update:更新功率,功率值由硬件给出rx_status->signal * 100,如果不支持,则通过这个式子算出(rx_status->signal * 100) / local->hw.max_signal。更新rate,更新ERP value等等,后者好像是用于锁定。
2. 如果是data,ieee80211_prepare_and_rx_handle,调用prepare_for_handlers(rx, hdr),会检查mac地址是否一致,如果是AP就会检查bssid和sdata->vif.addr是否一致。ieee80211_prepare_and_rx_handle有个形参叫consume,如果consume为0,只是把skb复制给rx_skb,consume为1则需要调用ieee80211_invoke_rx_handlers(rx)。这个函数又会调用三个函数
Ø ieee80211_invoke_rx_handlers(rx)
CALL_RXH(ieee80211_rx_h_check)丢弃重传的80211帧,根据sta的关联状态丢弃一些数据帧帧。
ieee80211_rx_reorder_ampdu(rx,&reorder_release);没有继续跟下去,想必是mpdu的重新排序
ieee80211_rx_handlers(rx,&reorder_release);这个函数内容非常多,主要进行的操作列举如下:
CALL_RXH(ieee80211_rx_h_check_more_data)
检查AP还有没有更多的帧要给这个sta发送
CALL_RXH(ieee80211_rx_h_uapsd_and_pspoll)
检查是不是功率调整的控制帧
CALL_RXH(ieee80211_rx_h_sta_process)
1.更新last_rx的时间,2.ieee80211_sta_rx_notify,3.更新平均信号强度,
4.powersave mode changed only at the end of a frame exchange sequence。
CALL_RXH(ieee80211_rx_h_decrypt)
解密过程
CALL_RXH(ieee80211_rx_h_defragment)碎片整理
CALL_RXH(ieee80211_rx_h_michael_mic_verify)
CALL_RXH(ieee80211_rx_h_amsdu)聚合msdu的处理,聚合msdn把多个msdu聚合成一个msdu。然后上交给上层
CALL_RXH(ieee80211_rx_h_data)检查目的地址和接口地址是否一致,如果一致的话提交给上层。
ieee80211_rx_h_ctrl(rx, frames)
至此数据帧都已经处理完毕下面是比较繁琐的mgmt和action frame
CALL_RXH(ieee80211_rx_h_mgmt_check)
CALL_RXH(ieee80211_rx_h_action)
CALL_RXH(ieee80211_rx_h_userspace_mgmt)
CALL_RXH(ieee80211_rx_h_action_return)
CALL_RXH(ieee80211_rx_h_mgmt)
Ø __ieee80211_rx_handle_packet的另一个分支。如果虚拟接口的类型是Monitor或者AP_VLAN,那么需要进行一个避免处理重复包的操作。
本文详细介绍了802.11无线网络的接收路径处理流程,从ieee80211_tasklet_handler开始,经由ieee80211_rx到__ieee80211_rx_handle_packet。主要涉及帧的丢弃、radiotap头的添加、扫描处理、数据帧和管理帧的解密、碎片整理、功率调整、UAPSD处理等多个环节,最终将处理后的帧提交给上层。

6501

被折叠的 条评论
为什么被折叠?



