Update travel-router/README.md
This commit is contained in:
+170
-14
@@ -1,26 +1,182 @@
|
||||
cat > /root/README-no-rrm.txt <<'EOF'
|
||||
Wi-Fi uplink fix.
|
||||
# Отключение RRM-сканирования на OpenWrt
|
||||
|
||||
Problem:
|
||||
Upstream AP sends 802.11k/RRM Beacon Measurement Requests.
|
||||
wpa_supplicant responds by triggering a full 2.4 GHz scan.
|
||||
On MT7981 this scan lasts ~6.5 seconds and causes packet loss.
|
||||
## Проблема
|
||||
|
||||
Fix:
|
||||
Add driver_param=no_rrm=1 to wpa_supplicant interface configuration.
|
||||
На Wi‑Fi uplink периодически возникали провалы связи примерно на 6.5 секунд.
|
||||
|
||||
Modified file:
|
||||
Диагностика показала следующую цепочку:
|
||||
|
||||
1. Точка доступа отправляет клиенту 802.11k / RRM Beacon Measurement Request.
|
||||
2. `wpa_supplicant` получает этот management frame.
|
||||
3. `wpa_supplicant` запускает полный scan 2.4 GHz через `NL80211_CMD_TRIGGER_SCAN`.
|
||||
4. Во время scan uplink практически перестаёт передавать пользовательский трафик.
|
||||
5. В результате появляются потери пакетов и скачки latency.
|
||||
|
||||
На MT7981 это проявлялось как:
|
||||
|
||||
```text
|
||||
event 33 -> примерно 6.5 сек -> event 34
|
||||
```
|
||||
|
||||
где `event 33` соответствует запуску scan, а `event 34` — завершению scan.
|
||||
|
||||
## Рабочее решение
|
||||
|
||||
Для `wpa_supplicant` используется:
|
||||
|
||||
```ini
|
||||
driver_param=no_rrm=1
|
||||
```
|
||||
|
||||
Важно: параметр должен присутствовать **в момент создания STA-интерфейса**. Установка его уже после запуска через control interface проблему не устраняла.
|
||||
|
||||
В используемой версии OpenWrt конфигурация STA генерируется через:
|
||||
|
||||
```text
|
||||
/usr/share/ucode/wifi/supplicant.uc
|
||||
```
|
||||
|
||||
Added:
|
||||
### Изменения
|
||||
|
||||
В функции:
|
||||
|
||||
```ucode
|
||||
export function generate(config_list, data, interface)
|
||||
```
|
||||
|
||||
после:
|
||||
|
||||
```ucode
|
||||
interface.config.country = data.config.country_code;
|
||||
interface.config.beacon_int = data.config.beacon_int;
|
||||
```
|
||||
|
||||
добавлено:
|
||||
|
||||
```ucode
|
||||
interface.config.driver_param = "no_rrm=1";
|
||||
```
|
||||
|
||||
Также строка:
|
||||
|
||||
```ucode
|
||||
append_vars(interface.config, [ 'country', 'beacon_int', 'freq_list' ]);
|
||||
```
|
||||
|
||||
заменена на:
|
||||
|
||||
```ucode
|
||||
append_vars(interface.config, [ 'country', 'beacon_int', 'freq_list', 'driver_param' ]);
|
||||
```
|
||||
|
||||
Итоговый участок:
|
||||
|
||||
```ucode
|
||||
interface.config.country = data.config.country_code;
|
||||
interface.config.beacon_int = data.config.beacon_int;
|
||||
interface.config.driver_param = "no_rrm=1";
|
||||
|
||||
And added driver_param to:
|
||||
if (!data.config.scan_list)
|
||||
data.config.scan_list = wiphy_frequencies(data.phy, data.config.band, data.config.radio);
|
||||
|
||||
if (data.config.scan_list)
|
||||
interface.config.freq_list = join(" ", data.config.scan_list);
|
||||
|
||||
append_vars(interface.config, [ 'country', 'beacon_int', 'freq_list', 'driver_param' ]);
|
||||
```
|
||||
|
||||
After OpenWrt/package upgrades verify:
|
||||
## Применение
|
||||
|
||||
После изменения файла:
|
||||
|
||||
```bash
|
||||
wifi down radio0
|
||||
sleep 2
|
||||
wifi up radio0
|
||||
```
|
||||
|
||||
Проверить сгенерированный конфиг:
|
||||
|
||||
```bash
|
||||
grep driver_param /var/run/wpa-supplicant-phy0-sta0.conf
|
||||
```
|
||||
|
||||
Expected:
|
||||
Ожидаемый результат:
|
||||
|
||||
```text
|
||||
driver_param=no_rrm=1
|
||||
EOF
|
||||
```
|
||||
|
||||
Также можно проверить runtime:
|
||||
|
||||
```bash
|
||||
ubus call wpa_supplicant.phy0-sta0 control '{"command":"GET driver_param"}'
|
||||
```
|
||||
|
||||
Ожидаемый результат:
|
||||
|
||||
```json
|
||||
{
|
||||
"result": "no_rrm=1"
|
||||
}
|
||||
```
|
||||
|
||||
## Проверка результата
|
||||
|
||||
Для контроля:
|
||||
|
||||
```bash
|
||||
iw event -t
|
||||
```
|
||||
|
||||
и параллельно:
|
||||
|
||||
```bash
|
||||
ping 192.168.0.1
|
||||
```
|
||||
|
||||
После применения `no_rrm=1` проблемные длительные RRM-сканы и связанные с ними потери пакетов исчезли.
|
||||
|
||||
## Резервная копия и патч
|
||||
|
||||
Перед изменением рекомендуется сохранить оригинал:
|
||||
|
||||
```bash
|
||||
cp /usr/share/ucode/wifi/supplicant.uc /usr/share/ucode/wifi/supplicant.uc.bak
|
||||
```
|
||||
|
||||
Для создания patch нужен пакет:
|
||||
|
||||
```bash
|
||||
apk add diffutils
|
||||
```
|
||||
|
||||
Создать patch:
|
||||
|
||||
```bash
|
||||
diff -u /usr/share/ucode/wifi/supplicant.uc.bak /usr/share/ucode/wifi/supplicant.uc > /root/no-rrm.patch
|
||||
```
|
||||
|
||||
Посмотреть patch:
|
||||
|
||||
```bash
|
||||
cat /root/no-rrm.patch
|
||||
```
|
||||
|
||||
## После обновления OpenWrt
|
||||
|
||||
Обновление OpenWrt или пакетов Wi‑Fi может перезаписать:
|
||||
|
||||
```text
|
||||
/usr/share/ucode/wifi/supplicant.uc
|
||||
```
|
||||
|
||||
После обновления проверить:
|
||||
|
||||
```bash
|
||||
grep driver_param /var/run/wpa-supplicant-phy0-sta0.conf
|
||||
```
|
||||
|
||||
Если параметр исчез, повторно применить изменение вручную либо использовать сохранённый patch.
|
||||
|
||||
> Примечание: patch, созданный для одной версии `supplicant.uc`, может не примениться автоматически после существенного обновления OpenWrt. В таком случае лучше повторить две небольшие правки вручную.
|
||||
|
||||
Reference in New Issue
Block a user