Отключение RRM-сканирования на OpenWrt
Проблема
На Wi‑Fi uplink периодически возникали провалы связи примерно на 6.5 секунд.
Диагностика показала следующую цепочку:
- Точка доступа отправляет клиенту 802.11k / RRM Beacon Measurement Request.
wpa_supplicantполучает этот management frame.wpa_supplicantзапускает полный scan 2.4 GHz черезNL80211_CMD_TRIGGER_SCAN.- Во время scan uplink практически перестаёт передавать пользовательский трафик.
- В результате появляются потери пакетов и скачки 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.
Примечание: patch, созданный для одной версии
supplicant.uc, может не примениться автоматически после существенного обновления OpenWrt. В таком случае лучше повторить две небольшие правки вручную.