帧转换
MSDU——Ethernet 帧
(MAC Service Data Unit, MAC 服务数据单元),是 Ethernet 帧。由 IP 层下发到 MAC 层, MAC 层加入 MAC header 后,再作为 MPDU 下发到 PHY 层。MPDU = MAC header + MSDU。MAC header 包括完整性校验 MIC、分帧、省电模式下报文缓存、加密、序列号赋值、CRC校验。
MPDU——802.11 帧
(MAC Protocol Data Unit, MAC 协议数据单元),是 802.11 帧。
MPDU 帧类型
- 管理帧:负责监督,用来加入或退出无线网络,以及处理基站之间连接的转移事宜。
- 控制帧:负责区域的清空、信道的取得以及载波监听的维护、受到数据时的正面应答,通常与数据帧搭配使用。
- 数据帧:负责传输数据。
加密
无线数据的加密处理是在 MAC 和 LLC 两个阶段中间做的事情,加密的对象就是 MSDU,MSDU 经过加密变成 MPDU。
所以没有 MSDU 的无线帧是不用加密的,比如,管理帧只携带 layer 2 的信息,不需要加密;控制帧只有头部和尾部,不需要加密;空帧没有数据域(但有特定的功能),也不需要加密;总之,需要加密的帧,往往是数据帧。
加密也需要硬件支撑,列入可以通过软件方式,将 WEP 升级到 TKIP,但是无法继续升级为 CCMP,应为老的硬件不支持。
TKIP加密流程:
WPA2
使用AES加密算法,需要更新的设备支撑(不懂为什么非得要硬件支撑,软件也可以实现AES算法啊,难道是软件效率太低、占用内存太多,对性能造成严重影响,导致不能用?)(有专门硬件实现加密算法的话,会极大地提高处理效率和降低存储空间)。
wlanhdr_to_ethhdr()
由以上两次转化来看,数据帧在进入 wlanhdr_to_ethhdr() 函数之前已经是解密之后的明文了,那解密操作在哪边进行的呢?
USB –> CPU
usb_read_port_complete() // usb 中断触发会调用
skb_put() // 准备数据
skb_queue_tail() // 收到的数据入队,队列是 rx_skb_queue,接下来 usb_recv_tasklet() 会处理
tasklet_schedule() // 任务调度,调度 usb_recv_tasklet() 任务
usb_recv_tasklet()
skb_dequeue() // 循环取出队列 rx_skb_queue 里面的内容;即取出一个 skb,处理一个 skb
recvbuf2recvframe() // skb -->
recvbuf2recvframe_proccess_normal_rx()
recvframe_put() // 硬件层 // --> frame
pre_recv_entry() // rtw 层
rtw_recv_entry()
recv_func()
recv_func_posthandle()
recv_process_mpdu()
wlanhdr_to_ethhdr()
Linux TCP/IP stack
参考: