日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

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

發(fā)布時(shí)間:2025/3/19 62 豆豆
生活随笔 收集整理的這篇文章主要介紹了 螃蟹wifi驱动在AP模式下存在挂死系统的问题 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

2022/02/28更新
AP6212做同樣的測(cè)試完全沒有問題,所以說螃蟹是垃圾。博通無敵。

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

歡迎大家測(cè)試并反饋結(jié)果

/* Realtek Wifi module AP 功能壓力測(cè)試工具 mengxp work & test 2022/01Bug 描述 當(dāng)滿足如下 3 個(gè)條件時(shí),若有大流量從 AP 發(fā)往 iPhone 有概率導(dǎo)致內(nèi)核線程 ksoftirqd & RTWHALXT 占滿 CPU,并有可能導(dǎo)致系統(tǒng)停止響應(yīng) 1.realtek wifi 工作在 AP 模式 2.iPhone 作為 STA 接入 3.iPhone wifi 進(jìn)入 SLEEP 狀態(tài)(POWERSAVE)Buf 復(fù)現(xiàn)步驟 1.realtek 板端建立 wifi AP,并建立 DHCP 服務(wù)器(可選,可使用靜態(tài)IP) 2.iphone 連接該 AP(如果沒有 DHCP 需要手動(dòng)配置 IP) 3.iphone 進(jìn)入到 設(shè)置-藍(lán)牙 界面 (由于 2.4G 天線復(fù)用沖突,藍(lán)牙 scan 會(huì)導(dǎo)致 Wifi 頻繁進(jìn)入 SLEEP) 4.realtek 板端運(yùn)行該工具持續(xù)向 iPhone 發(fā)送 UDP 報(bào)文,間隔可修改例: udpflood 192.168.20.100 1234 5其中 192.168.20.100 是 iphone 的 IP,1234是端口號(hào),可任意輸入,5 是間隔 5 毫秒發(fā)一次報(bào)文 5.觀察板端是否有卡住的情況。或可將 udpflood 置于后臺(tái)運(yùn)行,然后使用命令 top 觀察 CPU 占用率Bug 分析 當(dāng) STA 進(jìn)入 SLEEP 模式時(shí),realtek 不能正確處理發(fā)包隊(duì)列,導(dǎo)致發(fā)包線程占滿 CPU目前我在 rtl8723ds 上測(cè)試,bug 復(fù)現(xiàn)率 100%,我使用的 wifi 驅(qū)動(dòng)版本有 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個(gè)版本全部存在該問題。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; }

與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的螃蟹wifi驱动在AP模式下存在挂死系统的问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。