Files
openwrt/travel-router
2026-09-29 14:32:49 +05:00
..
2026-09-29 14:28:12 +05:00
2026-09-29 14:32:49 +05:00

Отключение RRM-сканирования на OpenWrt

Проблема

На Wi‑Fi uplink периодически возникали провалы связи примерно на 6.5 секунд.

Диагностика показала следующую цепочку:

  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 это проявлялось как:

event 33 -> примерно 6.5 сек -> event 34

где event 33 соответствует запуску scan, а event 34 — завершению scan.

Рабочее решение

Для wpa_supplicant используется:

driver_param=no_rrm=1

Важно: параметр должен присутствовать в момент создания STA-интерфейса. Установка его уже после запуска через control interface проблему не устраняла.

В используемой версии OpenWrt конфигурация STA генерируется через:

/usr/share/ucode/wifi/supplicant.uc

Изменения

В функции:

export function generate(config_list, data, interface)

после:

interface.config.country = data.config.country_code;
interface.config.beacon_int = data.config.beacon_int;

добавлено:

interface.config.driver_param = "no_rrm=1";

Также строка:

append_vars(interface.config, [ 'country', 'beacon_int', 'freq_list' ]);

заменена на:

append_vars(interface.config, [ 'country', 'beacon_int', 'freq_list', 'driver_param' ]);

Итоговый участок:

interface.config.country = data.config.country_code;
interface.config.beacon_int = data.config.beacon_int;
interface.config.driver_param = "no_rrm=1";

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' ]);

Применение

После изменения файла:

wifi down radio0
sleep 2
wifi up radio0

Проверить сгенерированный конфиг:

grep driver_param /var/run/wpa-supplicant-phy0-sta0.conf

Ожидаемый результат:

driver_param=no_rrm=1

Также можно проверить runtime:

ubus call wpa_supplicant.phy0-sta0 control '{"command":"GET driver_param"}'

Ожидаемый результат:

{
        "result": "no_rrm=1"
}

Проверка результата

Для контроля:

iw event -t

и параллельно:

ping 192.168.0.1

После применения no_rrm=1 проблемные длительные RRM-сканы и связанные с ними потери пакетов исчезли.

Резервная копия и патч

Перед изменением рекомендуется сохранить оригинал:

cp /usr/share/ucode/wifi/supplicant.uc    /usr/share/ucode/wifi/supplicant.uc.bak

Для создания patch нужен пакет:

apk add diffutils

Создать patch:

diff -u   /usr/share/ucode/wifi/supplicant.uc.bak   /usr/share/ucode/wifi/supplicant.uc   > /root/no-rrm.patch

Посмотреть patch:

cat /root/no-rrm.patch

После обновления OpenWrt

Обновление OpenWrt или пакетов Wi‑Fi может перезаписать:

/usr/share/ucode/wifi/supplicant.uc

После обновления проверить:

grep driver_param /var/run/wpa-supplicant-phy0-sta0.conf

После обновления применить патч если изменения пропали:

patch -p0 < /root/no-rrm.patch

Если параметр исчез, повторно применить изменение вручную либо использовать сохранённый patch.

Примечание: patch, созданный для одной версии supplicant.uc, может не примениться автоматически после существенного обновления OpenWrt. В таком случае лучше повторить две небольшие правки вручную.