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加密流程:

img

WPA2

使用AES加密算法,需要更新的设备支撑(不懂为什么非得要硬件支撑,软件也可以实现AES算法啊,难道是软件效率太低、占用内存太多,对性能造成严重影响,导致不能用?)(有专门硬件实现加密算法的话,会极大地提高处理效率和降低存储空间)。

wlanhdr_to_ethhdr()

wlanhdr_to_ethhdr-icmp

wlanhdr_to_ethhdr-tcp

由以上两次转化来看,数据帧在进入 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

搜集的内核协议栈大图

img

参考:

802.11协议笔记(二)——PHY物理层的帧格式(802.11b)

物理层(PHY)规范

无线局域网安全(一)———WEP加密

AES专用指令处理器的研究与实现

志强处理器为什么不支持AES? - 知乎

使用CPU硬件指令对AES加解密进行加速