Update MX8500 report: 5G fix, watchdog v2, HE overrides for next build
This commit is contained in:
@@ -18,6 +18,14 @@
|
|||||||
|
|
||||||
现象:wwan2 / wwan5 断流后会一直不通,要手动重启 Wi-Fi 才恢复。其他设备连同样的 SSID 没有问题。
|
现象:wwan2 / wwan5 断流后会一直不通,要手动重启 Wi-Fi 才恢复。其他设备连同样的 SSID 没有问题。
|
||||||
|
|
||||||
|
## 结论
|
||||||
|
|
||||||
|
| 接口 | 状态 | 处理 |
|
||||||
|
|---|---|---|
|
||||||
|
| wwan5(5G) | 已解决 | radio0 HE160 → HE40,观察 63 分钟无故障 |
|
||||||
|
| wwan2(2.4G) | 已缓解,看门狗兜底 | radio1 HE40 → HE20,故障频率大幅下降;**下次编译固件加入 `CONFIG_HE_OVERRIDES`,对 wwan2 设置 `disable_he=1`**(见“未处理 / 后续”) |
|
||||||
|
| 两者 | 自动恢复 | 新增 `wwan-watchdog`,断流约 2 分钟内自动重连 |
|
||||||
|
|
||||||
## 排查结果
|
## 排查结果
|
||||||
|
|
||||||
### 故障时的状态(wwan2)
|
### 故障时的状态(wwan2)
|
||||||
@@ -45,42 +53,65 @@ wwan5 在日志中也有连续丢失 224 个 ping、手动重载 Wi-Fi 后才恢
|
|||||||
|
|
||||||
### 根因
|
### 根因
|
||||||
|
|
||||||
radio1 的配置是 `htmode='HE40'`,本地热点工作在 40 MHz(主信道 6,中心 2447 MHz),而上游 AP 只给 STA 20 MHz(信道 6,中心 2437 MHz)。同一射频上 AP 与 STA 带宽不一致时,ath11k 的 STA 上行会进入大量 tx failed 的状态。
|
主要原因:同一射频上,本地热点的频宽比 STA 宽。
|
||||||
|
|
||||||
把 radio1 改成 `HE20` 后,AP 和 STA 都在 20 MHz,上行恢复正常(见“验证”)。
|
| 射频 | 热点(修改前) | STA(上游给的) |
|
||||||
|
|---|---|---|
|
||||||
|
| radio1(2.4G) | HE40,中心 2447 MHz | 20 MHz,中心 2437 MHz |
|
||||||
|
| radio0(5G) | HE160,中心 5815 MHz | 40 MHz,中心 5795 MHz |
|
||||||
|
|
||||||
radio0(5G)的情况相同:热点 HE160,STA 40 MHz,观察期间 wwan5 也出现了一次同样的故障。
|
AP 与 STA 频宽不一致时,ath11k 的 STA 上行会进入大量 tx failed 的状态。把热点频宽改成和 STA 一致后:
|
||||||
|
|
||||||
这是根据对比测试得出的结论,没有在驱动层面确认具体机制。
|
- wwan5(5G,HE40):观察 66 分钟以上未再出现故障。
|
||||||
|
- wwan2(2.4G,HE20):故障从“每次重连后约 5 分钟”降到“几十分钟一次”,但没有完全消失。
|
||||||
|
|
||||||
|
2.4G 剩下最可疑的是 HE(Wi-Fi 6)本身:ath11k 作为客户端连 HE AP 时有已知的兼容问题。但无法在现有固件上验证,原因见“未处理 / 后续”。
|
||||||
|
|
||||||
|
以上是根据对比测试得出的结论,没有在驱动层面确认具体机制。
|
||||||
|
|
||||||
## 修改内容
|
## 修改内容
|
||||||
|
|
||||||
所有修改都在路由器上完成,原文件已备份。
|
所有修改都在路由器上完成,原文件已备份。
|
||||||
|
|
||||||
### 1. radio1 改为 HE20(根因修复)
|
### 1. 热点频宽与 STA 对齐(根因修复)
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
uci set wireless.radio1.htmode='HE20'
|
uci set wireless.radio1.htmode='HE20' # 原 HE40
|
||||||
|
uci set wireless.radio0.htmode='HE40' # 原 HE160
|
||||||
uci commit wireless
|
uci commit wireless
|
||||||
wifi up radio1
|
wifi up radio1
|
||||||
|
wifi up radio0
|
||||||
```
|
```
|
||||||
|
|
||||||
代价:2.4G 本地热点的带宽从 40 MHz 降到 20 MHz。
|
代价:2.4G 热点从 40 MHz 降到 20 MHz,5G 热点从 160 MHz 降到 40 MHz。高带宽需求由 6 GHz 热点(radio2,HE160)承担,未改动。
|
||||||
|
|
||||||
`txpower='13'` 保持不变,改带宽后已经足够。
|
`txpower='13'` 保持不变。
|
||||||
|
|
||||||
|
注意:`wifi up radioX` 会断开该射频上的 STA。如果 SSH 正好走这条上联,命令可能执行到一半就断,应在路由器上放到后台执行(BusyBox 没有 `nohup`):
|
||||||
|
|
||||||
|
```sh
|
||||||
|
( trap '' HUP; uci set ...; uci commit wireless; wifi up radio0 ) </dev/null >/tmp/change.log 2>&1 &
|
||||||
|
```
|
||||||
|
|
||||||
### 2. 新增无线看门狗 `/usr/sbin/wwan-watchdog`(兜底)
|
### 2. 新增无线看门狗 `/usr/sbin/wwan-watchdog`(兜底)
|
||||||
|
|
||||||
每分钟由 cron 运行一次,mwan3 判定接口 offline 时也会立即触发。逻辑:
|
每分钟由 cron 运行一次,mwan3 判定接口 offline 时也会立即触发。
|
||||||
|
|
||||||
|
“不通”指网关和两个外网探测地址(223.5.5.5、1.1.1.1)全部 ping 不通,任一能通就算正常。
|
||||||
|
|
||||||
| 检测结果 | 处理 |
|
| 检测结果 | 处理 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| 网关 ping 通,接口在线 | 清零计数 |
|
| 正常 | 清零计数 |
|
||||||
| 网关 ping 通,mwan3 显示 offline | 只记日志(wwan5 可能是登录过期,重连 Wi-Fi 无用) |
|
| 网关通,但 mwan3 显示 offline | 只记日志(wwan5 可能是登录过期,重连 Wi-Fi 无用) |
|
||||||
| 网关不通,第 1、2 次 | `REASSOCIATE`(不换 MAC,wwan5 登录状态保留) |
|
| 不通,第 1 次 | 只记日志,等下一次确认 |
|
||||||
| 网关不通,第 3 次 | `wifi up radioX` |
|
| 不通,第 2、3 次 | `REASSOCIATE`(不换 MAC,wwan5 登录状态保留) |
|
||||||
|
| 不通,第 4 次 | `wifi up radioX` |
|
||||||
| 之后仍不通 | 每 10 次检测重启一次射频,避免频繁打断热点 |
|
| 之后仍不通 | 每 10 次检测重启一次射频,避免频繁打断热点 |
|
||||||
|
|
||||||
|
判定故障时,日志会附上当时的 `tx packets / tx failed / tx bitrate`,便于区分是无线卡死(tx failed 暴涨、速率掉到 MCS0)还是上游问题。
|
||||||
|
|
||||||
|
第一版只 ping 网关,且第一次失败就重连。上游 Nomadix 网关偶尔不回 ping,23:11 因此误触发了一次:wwan2 原本正常,被重连后反而断了约 1 分钟。改成上面的逻辑后没有再误触发。第一版备份在 `/root/wwan-watchdog.v1.bak`。
|
||||||
|
|
||||||
相关改动:
|
相关改动:
|
||||||
|
|
||||||
- `crontab`:新增 `* * * * * /usr/sbin/wwan-watchdog`
|
- `crontab`:新增 `* * * * * /usr/sbin/wwan-watchdog`
|
||||||
@@ -121,11 +152,24 @@ wifi up radio1
|
|||||||
| tx 速率 | HE-MCS0 NSS1,8.6 Mbit/s | HE-MCS4–6 NSS2,68–172 Mbit/s |
|
| tx 速率 | HE-MCS0 NSS1,8.6 Mbit/s | HE-MCS4–6 NSS2,68–172 Mbit/s |
|
||||||
| 网关 ping | 不通 | 每分钟检测全部通过 |
|
| 网关 ping | 不通 | 每分钟检测全部通过 |
|
||||||
|
|
||||||
观察结束时 mwan3:`wwan2 is online (online 00h:33m:09s)`。
|
之后继续观察到 23:43:
|
||||||
|
|
||||||
### wwan5:看门狗实际触发一次
|
```
|
||||||
|
23:22 tx failed 2 / 7500
|
||||||
|
23:33 tx failed 165 / 20807 # 10 分钟内上涨,前兆
|
||||||
|
23:36:40 mwan3track 开始连续失败(共丢 22 个)
|
||||||
|
23:37:09 wwan-watchdog: 网关和探测地址都不通,等待确认
|
||||||
|
23:38:09 wwan-watchdog: 仍不通,reassociating
|
||||||
|
23:38:15 wwan-watchdog: link passing traffic again
|
||||||
|
```
|
||||||
|
|
||||||
观察期间 wwan5 出现了同样的故障,看门狗自动恢复:
|
断流约 1.5 分钟,看门狗自动恢复。同一时间 wwan5 正常(两条 SSID 走同一个 Nomadix 网关),说明是 2.4G 本机无线问题,不是上游故障。HE20 大幅降低了频率,但没有根治 wwan2。
|
||||||
|
|
||||||
|
另外试过把 radio1 改成 `HT20`:只有热点变成 HT,wwan2 仍然以 HE 连接上游(`tx bitrate ... HE-MCS 6`),没有意义,已改回 HE20。
|
||||||
|
|
||||||
|
### wwan5:HE160 时看门狗触发一次,HE40 后稳定
|
||||||
|
|
||||||
|
radio0 仍为 HE160 时,wwan5 出现了同样的故障,看门狗自动恢复:
|
||||||
|
|
||||||
```
|
```
|
||||||
22:00:23 mwan3track 开始连续 ping 失败(共丢 16 个)
|
22:00:23 mwan3track 开始连续 ping 失败(共丢 16 个)
|
||||||
@@ -134,27 +178,105 @@ wifi up radio1
|
|||||||
22:01:16 mwan3track: Interface wwan5 is online
|
22:01:16 mwan3track: Interface wwan5 is online
|
||||||
```
|
```
|
||||||
|
|
||||||
从断流到恢复约 50 秒,修改前需要手动处理。这也说明 5G 上存在同样的问题(见“未处理 / 后续”)。
|
从断流到恢复约 50 秒,修改前需要手动处理。
|
||||||
|
|
||||||
|
22:40 把 radio0 改为 HE40 后(热点和 STA 都是 40 MHz,中心 5795 MHz):
|
||||||
|
|
||||||
|
| 时间 | 连接时长 | tx failed / tx packets |
|
||||||
|
|---|---|---|
|
||||||
|
| 22:41 | 52 s | 8 / 14358 |
|
||||||
|
| 23:02 | 21 min | 49 / 83677 |
|
||||||
|
| 23:22 | 42 min | 98 / 154419 |
|
||||||
|
| 23:43 | 63 min | 126 / 228395 |
|
||||||
|
|
||||||
|
全程网关 ping 正常,看门狗未触发,mwan3:`wwan5 is online (online 01h:02m:50s)`。修改前大约 17 分钟就会出故障。
|
||||||
|
|
||||||
### 路由规则
|
### 路由规则
|
||||||
|
|
||||||
`wifi up radio1` 后 wwan2 换了随机 MAC,IP 从 172.20.8.60 变为 172.20.9.230。新脚本自动删除了旧 IP 的规则:
|
每次 `wifi up radio1` 后 wwan2 都会换随机 MAC 和 IP(172.20.8.60 → 172.20.9.230 → 172.20.11.106),新脚本每次都自动删除了旧 IP 的规则,始终只保留两条:
|
||||||
|
|
||||||
```
|
```
|
||||||
100: from 172.20.9.230 lookup 1
|
100: from 10.33.13.15 lookup 2
|
||||||
100: from 10.33.13.15 lookup 2
|
100: from 172.20.11.106 lookup 1
|
||||||
```
|
```
|
||||||
|
|
||||||
## 未处理 / 后续
|
## 未处理 / 后续
|
||||||
|
|
||||||
- **radio0(5G)**:本地热点为 HE160,上游 STA 为 40 MHz,与 2.4G 改动前的情况相同,22:00 也确实出现了一次同样的故障(看门狗已自动恢复)。按 2.4G 的经验,把 radio0 改为 `HE40` 应能根治,但 5G 热点带宽会从 160 MHz 降到 40 MHz,所以暂未修改,目前靠看门狗兜底。可以用 `logread -e wwan-watchdog | grep wwan5` 看触发频率再决定。
|
### wwan2:下次编译固件时加入 HE overrides,对 wwan2 关闭 HE
|
||||||
|
|
||||||
|
目前 wwan2 靠看门狗兜底:wwan2 只是副线路(mwan3 权重 3),断流期间流量会自动走 wwan5,约 2 分钟内恢复。
|
||||||
|
|
||||||
|
要根治,需要让 wwan2 不用 HE(Wi-Fi 6)连上游,只用 HT(Wi-Fi 4)。wpa_supplicant 有网络级参数 `disable_he=1`,但现有固件不支持:
|
||||||
|
|
||||||
|
| 检查项 | 结果 |
|
||||||
|
|---|---|
|
||||||
|
| 路由器上的 wpad | `wpad-basic-mbedtls` |
|
||||||
|
| `GET_NETWORK <id> disable_vht` | `0`(支持) |
|
||||||
|
| `GET_NETWORK <id> disable_he` | `FAIL`(不支持) |
|
||||||
|
| OpenWrt 25.12 `wpa_supplicant-basic.config` / `-full.config` | 只有 `CONFIG_HT_OVERRIDES=y`、`CONFIG_VHT_OVERRIDES=y`,**没有** `CONFIG_HE_OVERRIDES` |
|
||||||
|
| hostap `wpa_supplicant/Makefile` | 支持 `CONFIG_HE_OVERRIDES` → `-DCONFIG_HE_OVERRIDES` |
|
||||||
|
|
||||||
|
所以单纯换成完整版 `wpad-mbedtls`(本仓库 `e749002` 已改)也不够,下次编译需要改三处(路径基于 OpenWrt 25.12 源码树):
|
||||||
|
|
||||||
|
1. **wpa_supplicant 打开 HE overrides。** 在 `package/network/services/hostapd/files/wpa_supplicant-full.config` 中,`CONFIG_VHT_OVERRIDES=y` 下面加:
|
||||||
|
|
||||||
|
```
|
||||||
|
# Support HE overrides (disable HE)
|
||||||
|
CONFIG_HE_OVERRIDES=y
|
||||||
|
```
|
||||||
|
|
||||||
|
本仓库的包列表用的是完整版 `wpad-mbedtls`,改 `-full.config` 即可;如果改用 basic 版,要改 `wpa_supplicant-basic.config`。
|
||||||
|
|
||||||
|
2. **wifi-scripts 把 `disable_he` 传给 wpa_supplicant。** 在 `package/network/config/wifi-scripts/files-ucode/usr/share/ucode/wifi/supplicant.uc` 的 `setup_sta()` 里,`network_append_vars` 列表中 `'disable_vht'` 旁边加上 `'disable_he'`:
|
||||||
|
|
||||||
|
```
|
||||||
|
'disable_ht', 'disable_ht40', 'disable_vht', 'disable_he', 'vht', 'max_oper_chwidth',
|
||||||
|
```
|
||||||
|
|
||||||
|
3. **schema 登记 `disable_he`。** 在 `package/network/config/wifi-scripts/files-ucode/usr/share/schema/wireless.wifi-iface.json` 的 `properties` 中加入:
|
||||||
|
|
||||||
|
```json
|
||||||
|
"disable_he": {
|
||||||
|
"description": "Disable HE (802.11ax) for this station",
|
||||||
|
"type": "boolean"
|
||||||
|
},
|
||||||
|
```
|
||||||
|
|
||||||
|
不加的话 `validate.uc` 只会打印 `disable_he is not present in the schema`,值仍会传下去,但不会被转换成布尔值。加上更干净。
|
||||||
|
|
||||||
|
刷机后在路由器上:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
uci set wireless.wifinet_radio1.disable_he='1'
|
||||||
|
uci commit wireless
|
||||||
|
wifi up radio1
|
||||||
|
```
|
||||||
|
|
||||||
|
验证方法:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# 应返回 1,而不是 FAIL
|
||||||
|
ubus call wpa_supplicant.phy1-sta0 control '{"command":"LIST_NETWORKS"}'
|
||||||
|
ubus call wpa_supplicant.phy1-sta0 control '{"command":"GET_NETWORK <id> disable_he"}'
|
||||||
|
# tx bitrate 应显示 MCS x(HT),不再是 HE-MCS
|
||||||
|
iw dev phy1-sta0 station dump | grep bitrate
|
||||||
|
# 观察数小时,看门狗不应再触发 wwan2
|
||||||
|
logread -e wwan-watchdog | grep wwan2
|
||||||
|
```
|
||||||
|
|
||||||
|
注意:sysupgrade 只保留 `/etc/config/` 和 `/etc/sysupgrade.conf` 里列出的文件,`/usr/share/` 下的文件会被新固件替换。所以第 2、3 步必须进固件,在路由器上手改会在下次升级时丢失;而且第 1 步不进固件的话,手改 2、3 也没用。`disable_he` 只影响 wwan2 这个 STA,不影响 2.4G 热点。wwan5 已经稳定,不需要关 HE。
|
||||||
|
|
||||||
|
### 其他
|
||||||
|
|
||||||
- **wwan5 登录过期**:看门狗只记录日志,不会自动登录。如果上游登录页能用简单的 HTTP 表单提交,可以再加自动登录。
|
- **wwan5 登录过期**:看门狗只记录日志,不会自动登录。如果上游登录页能用简单的 HTTP 表单提交,可以再加自动登录。
|
||||||
|
- **txpower**:radio1 的 `txpower='13'` 没有动。如果关 HE 后 wwan2 仍有问题,下一个可以试的是去掉这个限制。
|
||||||
- 每天 07:00 的定时重启(`0 7 * * * reboot`)保持不变。
|
- 每天 07:00 的定时重启(`0 7 * * * reboot`)保持不变。
|
||||||
|
|
||||||
## 回滚
|
## 回滚
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
uci set wireless.radio1.htmode='HE40' && uci commit wireless && wifi up radio1
|
uci set wireless.radio1.htmode='HE40' && uci set wireless.radio0.htmode='HE160' && uci commit wireless
|
||||||
|
wifi up radio1 && wifi up radio0
|
||||||
cp /root/99-fix-same-subnet-routing.bak /etc/hotplug.d/iface/99-fix-same-subnet-routing
|
cp /root/99-fix-same-subnet-routing.bak /etc/hotplug.d/iface/99-fix-same-subnet-routing
|
||||||
cp /root/mwan3.user.bak /etc/mwan3.user
|
cp /root/mwan3.user.bak /etc/mwan3.user
|
||||||
crontab -l | grep -v wwan-watchdog | crontab -
|
crontab -l | grep -v wwan-watchdog | crontab -
|
||||||
@@ -174,6 +296,7 @@ sed -i '\#^/usr/sbin/wwan-watchdog$#d; \#^/etc/mwan3.user$#d' /etc/sysupgrade.co
|
|||||||
PATH=/usr/sbin:/usr/bin:/sbin:/bin
|
PATH=/usr/sbin:/usr/bin:/sbin:/bin
|
||||||
STATE_DIR=/tmp/wwan-watchdog
|
STATE_DIR=/tmp/wwan-watchdog
|
||||||
TAG=wwan-watchdog
|
TAG=wwan-watchdog
|
||||||
|
PROBE_IPS="223.5.5.5 1.1.1.1"
|
||||||
|
|
||||||
exec 9>/var/lock/wwan-watchdog.lock
|
exec 9>/var/lock/wwan-watchdog.lock
|
||||||
flock -n 9 || exit 0
|
flock -n 9 || exit 0
|
||||||
@@ -181,8 +304,21 @@ mkdir -p "$STATE_DIR"
|
|||||||
|
|
||||||
log() { logger -t "$TAG" "$*"; }
|
log() { logger -t "$TAG" "$*"; }
|
||||||
|
|
||||||
gw_ok() {
|
tx_stats() {
|
||||||
ping -c 3 -W 1 -I "$1" "$2" >/dev/null 2>&1
|
iw dev "$1" station dump 2>/dev/null | awk '
|
||||||
|
/tx packets/ { p = $3 }
|
||||||
|
/tx failed/ { f = $3 }
|
||||||
|
/tx bitrate/ { r = $3 " " $4 " " $5 }
|
||||||
|
END { print "tx=" p " failed=" f " rate=" r }'
|
||||||
|
}
|
||||||
|
|
||||||
|
# Healthy if the gateway or any probe address answers through this device
|
||||||
|
link_ok() {
|
||||||
|
local dev="$1" gw="$2" ip
|
||||||
|
for ip in "$gw" $PROBE_IPS; do
|
||||||
|
ping -c 2 -W 2 -I "$dev" "$ip" >/dev/null 2>&1 && return 0
|
||||||
|
done
|
||||||
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
check() {
|
check() {
|
||||||
@@ -195,11 +331,12 @@ check() {
|
|||||||
gw=$(ifstatus "$iface" | jsonfilter -e '@.route[@.target="0.0.0.0"].nexthop' | head -n 1)
|
gw=$(ifstatus "$iface" | jsonfilter -e '@.route[@.target="0.0.0.0"].nexthop' | head -n 1)
|
||||||
[ -n "$gw" ] || return
|
[ -n "$gw" ] || return
|
||||||
|
|
||||||
if gw_ok "$dev" "$gw"; then
|
if link_ok "$dev" "$gw"; then
|
||||||
[ -f "$count_file" ] && log "$iface: gateway $gw reachable again"
|
[ -f "$count_file" ] && log "$iface: link passing traffic again"
|
||||||
rm -f "$count_file"
|
rm -f "$count_file"
|
||||||
if mwan3 interfaces 2>/dev/null | grep -q "interface $iface is offline"; then
|
if ping -c 2 -W 2 -I "$dev" "$gw" >/dev/null 2>&1 && \
|
||||||
log "$iface: gateway reachable but internet offline (login expired or upstream down?)"
|
mwan3 interfaces 2>/dev/null | grep -q "interface $iface is offline"; then
|
||||||
|
log "$iface: gateway reachable but mwan3 offline (login expired or upstream down?)"
|
||||||
fi
|
fi
|
||||||
return
|
return
|
||||||
fi
|
fi
|
||||||
@@ -208,17 +345,20 @@ check() {
|
|||||||
echo "$count" > "$count_file"
|
echo "$count" > "$count_file"
|
||||||
|
|
||||||
case "$count" in
|
case "$count" in
|
||||||
1|2)
|
1)
|
||||||
log "$iface: gateway $gw unreachable via $dev (attempt $count), reassociating"
|
log "$iface: gateway $gw and probes unreachable via $dev ($(tx_stats "$dev")), confirming next check"
|
||||||
|
;;
|
||||||
|
2|3)
|
||||||
|
log "$iface: still unreachable (check $count, $(tx_stats "$dev")), reassociating"
|
||||||
ubus call "wpa_supplicant.$dev" control '{"command":"REASSOCIATE"}' >/dev/null 2>&1
|
ubus call "wpa_supplicant.$dev" control '{"command":"REASSOCIATE"}' >/dev/null 2>&1
|
||||||
;;
|
;;
|
||||||
3)
|
4)
|
||||||
log "$iface: still unreachable after reassociate, restarting $radio"
|
log "$iface: still unreachable after reassociate ($(tx_stats "$dev")), restarting $radio"
|
||||||
wifi up "$radio"
|
wifi up "$radio"
|
||||||
;;
|
;;
|
||||||
*)
|
*)
|
||||||
# Back off: retry the radio restart every 10 failed checks
|
# Back off: retry the radio restart every 10 failed checks
|
||||||
if [ $(( count % 10 )) -eq 3 ]; then
|
if [ $(( count % 10 )) -eq 4 ]; then
|
||||||
log "$iface: unreachable for $count checks, restarting $radio again"
|
log "$iface: unreachable for $count checks, restarting $radio again"
|
||||||
wifi up "$radio"
|
wifi up "$radio"
|
||||||
fi
|
fi
|
||||||
|
|||||||
Reference in New Issue
Block a user