ieee80211_parse_beacon analysis

问题描述

开启内核kmemleak 选项后,捕获如下泄漏

每个泄漏快大小为64 字节。

在ALPHA环境,一天泄漏可达16M。

复现方法

创建open-ssid 手机关联后,将手机移动到信号覆盖不到的地方,触发AP 的T下线动作。观察 /sys/kernel/debug/kmemleak,发现 parse_beacon 内核泄露。

问题原因

在关联的station 离开AP的通信范围,被T下线时未释放 ieee80211_node 节点中的 ni_supp_chan_ie 占用的内存(64字节)

解决方案

在 qca/src/qca-wifi/umac/base/ieee80211_node.c

node_free() 中添加 free的操作

问题分析

backtrace 分析

添加调试语句,确认泄漏点

编译固件 并 复现,确认泄漏信息地址与打印是否一致

再次添加调试,确认是 station 的ni ie泄漏

代码分析

确认泄漏点后,开始分析相关代码

看到有 ni_supp_chan_ie 的free 相关代码

那一定是存在 未释放的地方。

查看 SDK11 的引用,发现 当前AC 的代码中在 base/ieee80211_node.c 无 ni_supp_chan_ie 的释放。

在 AC 仓库中 qca/src/qca-wifi/umac/base/ieee80211_node.c

node_free() 中添加 free的操作

验证结果

编译复现,8小时未复现。