rx_path

本文详细介绍了802.11无线网络的接收路径处理流程,从ieee80211_tasklet_handler开始,经由ieee80211_rx到__ieee80211_rx_handle_packet。主要涉及帧的丢弃、radiotap头的添加、扫描处理、数据帧和管理帧的解密、碎片整理、功率调整、UAPSD处理等多个环节,最终将处理后的帧提交给上层。

Ø  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,那么需要进行一个避免处理重复包的操作。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值