Android16 打开热点和有线网后,关闭有线网出现ifconfig网络节点卡死解决
文章目录
- [Android16 打开热点和有线网后,关闭有线网出现ifconfig网络节点卡死解决](#Android16 打开热点和有线网后,关闭有线网出现ifconfig网络节点卡死解决)
一、前言
Android16 在有些方案上,打开热点+打开有线网,并且两个节点都获取到ip的情况;
如果这时候关闭有线网,不管是使用上层接口,还是ifconfig eth0 down都是会导致网络节点卡死。
后续会出现:串口ifconfig卡死,app应用获取网络信息的界面卡死(五秒后ANR)
串口卡死如下图所示:

这个问题之前Android13 是有遇到过的,是问供应商分析解决的。
Android16 也遇到了,虽然解决过程不太一样,但是参考价值很大。
有兴趣的,收藏看看。
二、解决
这个解决方法是咨询供应商解决的。
内核目录:release\common\common16-6.12\XXX\stmmac_main.c
ret = stmmac_tc_init(priv, priv);
if (!ret) {
//ndev->hw_features |= NETIF_F_HW_TC; //把这行注释掉就可以了。
}
这个文件是内核里面的,如果内核和系统分开的代码是搜不到的。
如果内核代码和系统代码是一起的,可以在release根目录搜索一下文件,
比如311D2 Android16:
SY-3000-A311D2-AN16-GM-EDLA-IFPD/release$ find . -name stmmac_main.c
./common/common16-6.12/common/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
./common/common16-6.12/out/bazel/output_user_root/732ac6fbc8e9cd33c335a93a5d0c1eeb/sandbox/sandbox_stash/KernelHeaders/64/execroot/_main/common/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
./common/common16-6.12/out/bazel/output_user_root/732ac6fbc8e9cd33c335a93a5d0c1eeb/sandbox/sandbox_stash/KernelUapiHeaders/36/execroot/_main/common/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
./common/common16-6.12/common_drivers/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
SY-3000-A311D2-AN16-GM-EDLA-IFPD/release$
排除out目录的文件,剩下的是这两个文件;
./common/common16-6.12/common/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
./common/common16-6.12/common_drivers/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
之前Android13 在内核源码修改 common/drivers 下的stmmac_main.c文件就可以了;
但是在Android16 需要两个stmmac_main.c 都修改才有用;
具体原因无法进一步进行分析,因为我对内核的代码逻辑也是半窍不通。
之前311D2 Android13的代码,内核是分开的,只能内核底层开发人员进行编译处理。
不同方案和不同Android版本的代码估计都是有差异的,这个问题估计就是内核异常。
三、其他
1、小结
打开热点后和有线网后,关闭有线网会导致网络节点卡死,这个问题估计是资源占用有关。
关闭有线网后,不去释放正在占用的资源,就能规避解决;
解决方法是:在内核的 stmmac_main.c 文件中不设置 NETIF_F_HW_TC 属性。
有些方案安装上面的修改是有可能无法解决的,这个可以进一步咨询供应商。
2、相关思考
注释掉这里代码的作用是啥?
ret = stmmac_tc_init(priv, priv);
if (!ret) {
//ndev->hw_features |= NETIF_F_HW_TC; //把这行注释掉就可以了。
}
这个我是看不懂的,只能AI看看了,这里把大概的理解搞下来看看:
1. 第一行:ret = stmmac_tc_init(priv, priv); //驱动的硬件 TC 初始化函数
关键背景:TC 是什么?
TC(Traffic Control,流量控制)是 Linux 网络子系统的核心功能,
负责:流量调度、速率限制、队列管理、流量分类
2、后续逻辑判断
if (!ret) { // 若硬件 TC 初始化成功(ret=0)
ndev->hw_features |= NETIF_F_HW_TC; // 向内核声明该网卡支持硬件 TC
}
开启支持硬件TC有什么好处:
启用网卡的硬件流量控制(TC)加速功能,并向 Linux 内核注册该特性,最终实现:
提升网络性能:
硬件直接处理流量调度 / 限速,不占用 CPU 资源,适合高带宽、低延迟场景(如视频通话、文件传输);
支持 QoS(服务质量):
通过硬件级优先级调度,确保关键业务(如语音、控制信令)的数据包优先转发;
降低系统负载:
避免内核通过软件 TC 处理大量数据包,减少 CPU 开销,提升系统整体响应速度。
所以注释了开启硬件TC,并不会造成很大影响,只会多使用一些cpu控制网络数据的流量。
3、之前也有打开网络共享后关闭有线网异常
不确定是否和这个TC加速有关。
grep -nr "ndev->hw_features |= NETIF_F_HW_TC"
内核源码可以过滤这个内容看看其他文件还有什么是相关的。这个是瞎说的,需要自己验证。