Update travel-router/README.md
This commit is contained in:
+170
-14
@@ -1,26 +1,182 @@
|
|||||||
cat > /root/README-no-rrm.txt <<'EOF'
|
# Отключение RRM-сканирования на OpenWrt
|
||||||
Wi-Fi uplink fix.
|
|
||||||
|
|
||||||
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:
|
На Wi‑Fi uplink периодически возникали провалы связи примерно на 6.5 секунд.
|
||||||
Add driver_param=no_rrm=1 to wpa_supplicant interface configuration.
|
|
||||||
|
|
||||||
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
|
/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";
|
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' ]);
|
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
|
grep driver_param /var/run/wpa-supplicant-phy0-sta0.conf
|
||||||
|
```
|
||||||
|
|
||||||
Expected:
|
Ожидаемый результат:
|
||||||
|
|
||||||
|
```text
|
||||||
driver_param=no_rrm=1
|
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