2022/02/28更新
AP6212做同样的测试完全没有问题,所以说螃蟹是垃圾。博通无敌。

--------------------------------------------------------------------------------------------------------------

欢迎大家测试并反馈结果

/*
Realtek Wifi module AP 功能压力测试工具
mengxp work & test 2022/01Bug 描述
当满足如下 3 个条件时,若有大流量从 AP 发往 iPhone
有概率导致内核线程 ksoftirqd & RTWHALXT 占满 CPU,并有可能导致系统停止响应
1.realtek wifi 工作在 AP 模式
2.iPhone 作为 STA 接入
3.iPhone wifi 进入 SLEEP 状态(POWERSAVE)Buf 复现步骤
1.realtek 板端建立 wifi AP,并建立 DHCP 服务器(可选,可使用静态IP)
2.iphone 连接该 AP(如果没有 DHCP 需要手动配置 IP)
3.iphone 进入到 设置-蓝牙 界面 (由于 2.4G 天线复用冲突,蓝牙 scan 会导致 Wifi 频繁进入 SLEEP)
4.realtek 板端运行该工具持续向 iPhone 发送 UDP 报文,间隔可修改例: udpflood 192.168.20.100 1234 5其中 192.168.20.100 是 iphone 的 IP,1234是端口号,可任意输入,5 是间隔 5 毫秒发一次报文
5.观察板端是否有卡住的情况。或可将 udpflood 置于后台运行,然后使用命令 top 观察 CPU 占用率Bug 分析
当 STA 进入 SLEEP 模式时,realtek 不能正确处理发包队列,导致发包线程占满 CPU目前我在 rtl8723ds 上测试,bug 复现率 100%,我使用的 wifi 驱动版本有
1.R328 SDK中的 v5.6.5_31752.20181221_COEX20181130-2e2e
2.R329 SDK中的 v5.10.1-26-ga10bc0b8b.20200617_COEX20200103-3535
3.rtl8723DS_WiFi_linux_v5.13.5-29-g0dbf6713f.20210604_COEX20210106-3b3b.tar.gz
上述3个版本全部存在该问题。bug 日志摘抄
sending 1440 bytes every 5 ms via 2 threads
thread bind to cpu 0
thread bind to cpu 1
send iter 100
send iter 200
send iter 300
[  314.114167] INFO: rcu_preempt self-detected stall on CPU
[  314.120151]  1-...: (3000 ticks this GP) idle=551/140000000000001/0 softirq=1858/1858 fqs=0
[  314.129626]   (t=60000 jiffies g=280 c=279 q=1)
[  314.134720] rcu_preempt kthread starved for 60000 jiffies! g280 c279 f0x0 RCU_GP_WAIT_FQS(3) ->state=0x1
[  397.830251] INFO: rcu_preempt detected stalls on CPUs/tasks:
[  397.838564]  0-...: (1 GPs behind) idle=7db/140000000000000/0 softirq=1396/1397 fqs=23
[  397.838577]  (detected by 1, t=60002 jiffies, g=281, c=280, q=3)
[  397.838623] rcu_preempt kthread starved for 2006 jiffies! g281 c280 f0x0 RCU_GP_WAIT_FQS(3) ->state=0x1Mem: 22104K used, 97400K free, 16K shrd, 3668K buff, 6316K cached
CPU:  0.0% usr 95.2% sys  0.0% nic  0.0% idle  0.0% io  0.0% irq  4.7% sirq
Load average: 8.85 6.44 2.98 5/63 899PID  PPID USER     STAT   VSZ %VSZ CPU %CPU COMMAND15     2 root     RW       0  0.0   1 50.0 [ksoftirqd/1]861     2 root     RW       0  0.0   0 49.9 [RTWHALXT]*/#define _GNU_SOURCE     //for pthread CPU_ZERO
#include <stdio.h>
#include <stdint.h>
#include <unistd.h>
#include <errno.h>
#include <arpa/inet.h>
#include <sys/types.h>
#include <poll.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <pthread.h>
#include <sched.h>typedef int32_t atomic32_t;
static __inline atomic32_t atomic32_init(int v) { return v; }
static __inline int atomic32_add(atomic32_t *p, int v) { return __sync_add_and_fetch(p, v); }
static __inline int atomic32_sub(atomic32_t *p, int v) { return __sync_sub_and_fetch(p, v); }
static __inline int atomic32_get(atomic32_t *p) { return *p; }int sock, interval;
struct sockaddr_in sin;
atomic32_t iter, cpuid;
char buf[1440];static int ThreadSetPriority(int priority)
{int ret, policy;struct sched_param param;ret = pthread_getschedparam(pthread_self(), &policy, &param);if (ret)return ret;param.sched_priority = priority;return pthread_setschedparam(pthread_self(), SCHED_RR, &param);
}static int ThreadSetCpuAffinity(int cpuId)
{cpu_set_t mask;CPU_ZERO(&mask);CPU_SET(cpuId, &mask);return pthread_setaffinity_np(pthread_self(), sizeof(mask), &mask);
}static void *SendThread(void *ctx)
{int cpu_num = atomic32_add(&cpuid, 1) - 1;printf("thread bind to cpu %d\n", cpu_num);ThreadSetPriority(62);ThreadSetCpuAffinity(cpu_num);while (1){int n = atomic32_add(&iter, 1);if (!(n % 100)){printf("send iter %d\n", iter);}sendto(sock, buf, sizeof(buf), 0, (struct sockaddr *)&sin, sizeof(sin));poll(NULL, 0, interval);}
}static void UdpFloodTest(char *ipStr, char *portStr, char *intervalStr)
{int i, threads = 2;pthread_t tid;void *tr;memset(&sin, 0, sizeof(sin));sin.sin_family = AF_INET;sin.sin_addr.s_addr = inet_addr(ipStr);sin.sin_port = htons(strtol(portStr, NULL, 10));sock = socket(AF_INET, SOCK_DGRAM, 0);if (sock < 0){printf("socket failed with %d\n", errno);return;}interval = strtoul(intervalStr, NULL, 10);printf("sending %d bytes every %d ms, %d threads\n", sizeof(buf), interval, threads);for (i = 0; i < threads; i++){pthread_create(&tid, NULL, SendThread, NULL);}pthread_join(tid, &tr);
}static void Usage(int argc, char *argv[])
{if (argc == 4)return;printf("Usage: %s [ip] [port] [interval]\n", argv[0]);printf("Exam:  %s 192.168.20.100 1234 5\n", argv[0]);printf("\n");exit(0);
}int main(int argc, char *argv[])
{char *dstIp = argv[1];char *dstPort = argv[2];char *interval = argv[3];Usage(argc, argv);UdpFloodTest(dstIp, dstPort, interval);return 0;
}

螃蟹wifi驱动在AP模式下存在挂死系统的问题相关推荐

  1. Monitor模式和AP模式下获取WiFi的CSI信号

    目的:基于WiFi信号的呼吸和心率检测 说明: 1.自己的一点实践记录,可能有很多地方写的不好或者不对,望指正 2.获取到的CSI数据处理过程:https://blog.csdn.net/qq_203 ...

  2. linux电脑的ap模式,linux下使用7601驱动(AP模式)

    参考GitHub地址: 1,下载7601的AP驱动,编译成linux下专用的Ap模式驱动. 上面 github下载驱动解压MT7601u-master. a,看下Ap配置文件: \etc\Wirele ...

  3. 螃蟹WiFi驱动中的Band Steering功能

    螃蟹WiFi驱动中的Band Steering功能 Band Steering功能简介 基本原理 流程 总结 Band Steering功能简介 在双频路由器中,支持2.4G和5G频段同时接入.当把两 ...

  4. WiFi模块的AP模式和STA模式

    WiFi模块内置无线网络协议IEEE802.11协议栈以及TCP/IP协议栈,实现用户串口或TTL电平信息与无线网络之间的转换. WiFi模块两种拓扑类型:基础网(Infra)和自组网(Adhoc): ...

  5. Android手机AP模式下本机IP

    至今为止Android没有官方IP获取AP模式下的IP的接口,而且由于Android的开放性,各个厂商都发挥自己的想象力修改framework.所以默认的IP并不一定就是AP模式下的IP,要获取真实的 ...

  6. omnipeek抓包(确定设备AP模式下的MAC地址+过滤)

    转载请注明作者和出处:美二 https://blog.csdn.net/qq_32654897/article/details/89217656 这篇教程写给纯小白,大神可在评论处直接指导,哈哈~ 目 ...

  7. WIFI模块中AP模式和STA模式的区别

    WIFI模块中,AP和STA模式中分别意思是: 1.AP:也就是无线接入点,是一个无线网络的创建者,是网络的中心节点.一般家庭或办公室使用的无线路由器就是一个AP. 2.STA站点就是每一个连接到无线 ...

  8. Android AP模式下获取SSID/PASSWORD(反射机制

    Android AP模式下获取SSID/PASSWORD 1.public staticvoidreflect(Objectobj) { if (obj == null) { return; } Fi ...

  9. Android AP模式下获取SSID/PASSWORD

    Android AP模式下获取SSID/PASSWORD(反射机制) 1.test.java文件 WifiManager mWifiManager = (WifiManager) getSystemS ...

最新文章

  1. MySQL高级show profile
  2. 内核中用于数据接收的结构体struct msghdr以及iovec介绍
  3. 【nyoj - 860】 又见0-1背包 (dp,反向0-1背包,好题好思路)
  4. mysql密码命名规则_MySql命名规范
  5. ios图片轮播 (基础篇——UIScrollView实现方式)
  6. 数据结构-一元多项式加减程序
  7. js对象取值的两种方式及区别
  8. mongoDb 给表添加+ 删除字段
  9. 内容可编辑且随内容自增长的div
  10. python中pandas库里的read_table和read_csv的区别
  11. linux抓包及分析
  12. php日历天气预报下载安装手机桌面_日历天气预报下载安装app_手机桌面时钟日历天气软件下载 安卓版 V7.5.1 - 罐头安卓网...
  13. 贴片晶振的焊接方法和注意事项
  14. 无锡高二计算机会考内容,无锡期中考试卷分析,看一看高一高二高三数学都考了哪些...
  15. 滴滴曹乐:如何成为技术大牛?
  16. 合肥高中计算机课程表,合肥普通高中新课程各科目必修学分统计表
  17. 拥抱 Android Studio 之四:Maven 仓库使用与私有仓库搭建
  18. linux查看磁盘及磁盘类型
  19. weblogic修改控制台密码
  20. 【python】N的多次方

热门文章

  1. linux安装pytorch教程,centos下通过conda安装pytorch
  2. java skype 类库_Skype4Java 用 实现的 ,内附具体的开发文档和使用说明 Develop 238万源代码下载- www.pudn.com...
  3. SQL语言学习(四)常见函数学习
  4. Python基础入门:正则re.sub使用自定义替换方法
  5. Python常用模块之sys模块
  6. Python 通过all()判断列表(list)中所有元素是否都包含某个字符串(string)
  7. python3 中print 显示不全问题
  8. python 定制类
  9. Python基础教程:菱形继承问题
  10. linux启动数据库orl,linux5.4下oracle问题