Overview & LuCI (RU/EN)Полный гайд (RU)Скрипты / ToolkitTFTP UnbrickРазбор 19 проблем (RU)Post-Mortem (EN)ReleasesWiki

Разбор полётов: все 19 реальных проблем на Tenda AC10 V1.0, стресс-тест 2000 МБ и план доработок (r3 Roadmap)

Здесь без прикрас записано всё, обо что мы споткнулись при переносе, стресс-тестировании под нагрузкой 2000 МБ и обкатке OpenWrt и профиля Stock+ на реальном маршрутизаторе Tenda AC10 V1.0 (Realtek RTL8197FS-VE5 + RTL8822BE + RTL8367RB-VB) в живой домашней сети. Каждое решение ниже вшито в сборочный скрипт build_hybrid_openwrt_ac10.sh и автономный набор offline_autonomous_tools/, а честные аппаратные ограничения r2 вынесены в дорожную карту r3.


Быстрая таблица: что ломалось, почему и чем закрыто (проблемы #1–#19)

№ Узел Как выглядел баг вживую В чём оказалась причина Статус в r2 / Решение в Stock+ и план r3
1 Память и ревизии V2/V3 Сборки под 128 МБ RAM падают в панику; V2.0/V3.0 умирают насмерть На плате ровно 8 МБ SPI NOR (W25Q64FV, 0xEF4017) и 64 МБ DDR2 внутри корпуса процессора; V2/V3 — чип RTL8197FH (2 МБ Flash, eCos) Жёсткая разметка под 8 МБ Flash (0x7B0000 слот прошивки) и 64 МБ RAM; красное предупреждение проверять Ver: V1.0 (V15.03.06.xx)
2 Загрузчик AutoBurn (0x80001C2C) Стирание самого загрузчика (mtd0) при прошивке двухсегментных образов Баг слота задержки ветвления (move $s7, $s2 при $s2=0) сбрасывает адрес записи 2-го сегмента в 0x00000000 Строго односегментный образ cs6c с записью по 0x00030000 и 16-битной суммой 0x0000
3 Режим TFTP (192.168.1.6) ping 192.168.1.6 молчит вечно; через синий порт WAN линк не поднимается Парсер 0x80001010 пропускает только UDP (0x11), кода для ICMP нет вообще; 0x8000ED48 гасит питание порта WAN (Port 3) Кабель строго в жёлтые LAN 1–3, проверка готовности по ARP (50:0F:F5:00:00:01) и заливка сразу на 192.168.1.6:69/UDP
4 Родное меню Tenda (/cgi-bin/upgrade) Ошибка «Format error!» при попытке обновиться из браузера check_fw_valid() в libcommon.so требует 64-байтную шапку trx2 (0x27051956, ih_os=2, ih_ver=0x00030028 для AC10) Отдельный образ webupgrade.bin с точной шапкой trx2 (заодно понимается и самим загрузчиком по TFTP)
5 Свитч RTL8367RB и нечётный порт WAN На чужих сборках (DIR-842) мертвы порты Ethernet или не работает WAN У AC10 V1.0 синий WAN разведён на нечётный Port 3 (mask 0x08), LAN = Ports 0..2 (0x07), сброс = GPIO 58; для нечётного порта PVID писался не в те 16 бит Свой tenda-ac10-v1.dts (&gpio1 26), 9 бинарных патчей MIPS32 LE в vmlinux и сдвиг lzma-loader на +0x4000
6 Первый запуск: Read-Only и Failsafe Настройки слетают после перезагрузки; иногда роутер застревает при старте Хвосты заводского SquashFS в mtd5 мешают смонтировать JFFS2; висящий в воздухе GPIO 6 (WPS) кидает систему в Failsafe Автозачистка чужих сигнатур в mtd5 в /lib/preinit/80_mount_root + флаг pi_preinit_no_failsafe="y" в 00_preinit.conf
7 5 ГГц RTL8822BE: пустой eFuse и отвалы VHT80 Слабый сигнал (-17 дБ), ошибка INTERFACE_CREATION_FAILED, обрывы каждые 2–11 с на 80 МГц На заводе не прошили OTP eFuse (0xFF) -> xcap=0 и выключены внешние усилители Skyworth SE5003L1 (RFE 6); на полосе 80 МГц ревизия B-cut ловит таймаут регистра 0x33 Патч релокаций rtw88_8822b.ko под RFE Type 6, подача XCAP/MAC из mtd1 через /bin/set-mib.sh, привязка wlan1 по пути PCIe и базовый профиль VHT20 ch36 (23 dBm)
8 Чёрная дыра Wi-Fi -> WAN при hwnat=1 По кабелю летит 940 Мбит/с, а на всех телефонах по Wi-Fi «Подключено, без доступа к интернету» Аппаратный NAPT rtl819x_hwnat дропает кадры беспроводных клиентов, пришедшие через программный мост br-lan По умолчанию выставлен hwnat=0 + firewall.flow_offloading='1' (~350–500 Мбит/с по кабелю) при активном role='router' и fabric_autoreset=3
9 Гонка клонированного MAC при холодном ребуте После выдёргивания из розетки пропадает интернет у провайдера с привязкой по MAC wait_netif_mac() в dir842-asic ждал только MAC на eth0.2 (LAN) и программировал gw_prog до того, как netifd успевал сменить MAC на eth0.1 В wait_netif_mac() добавлено ожидание eth0.1 == network.wan.macaddr перед вызовом gw_prog + скрипт доводки S99asic-wifi-settle
10 Жёлтая плашка DNS и затыки на iPhone / Mac Сайты думают по 15–25 секунд на старте; iOS пишет «Эта сеть блокирует защищенный трафик DNS» Локальный IPv6 ula_prefix тормозит Happy Eyeballs на IPv4-тарифе, а выдача 192.168.0.1 первым DNS проваливает TLS-проверку RFC 9462 DDR Убран ula_prefix, погашены ra/dhcpv6, выставлен dhcp_option '6,1.1.1.1,8.8.8.8,192.168.0.1' — iPhone мгновенно включает HTTP/3 DoH
11 Защита от домовой сети /24 и режим точки доступа (AP/Bridge) В домовой сети /24 сокеты не должны светиться наружу; при этом жесткая привязка к 192.168.0.1 ломает LuCI в режиме AP/Bridge dnsmasq слушает 0.0.0.0, а привязка uhttpd к одному IP блокирует доступ при смене подсети dnsmasq закрыт notinterface='eth0.1'; uhttpd слушает 0.0.0.0:80 и [::]:80 с rfc1918_filter='1', а порт 80 на WAN eth0.1 заблокирован в файрволе (DROP)
12 2.4 ГГц SKY85303-11 и просадки на торрентах Слабая дальность 2.4 ГГц; скачки пинга при сотнях UDP-соединений uTP В бинарном rtl8192cd.ko от DIR-842 нет таблиц усилителя SKY85303-11; поток uTP забивает conntrack и фоновую очередь BK_QUEUE manual_edca=1 + калибровки из mtd1, расширение nf_conntrack_max=16384 и udp_timeout=60; для энтузиастов вынесен флаг CONFIG_PA_SKYWORKS_85303=y
13 Порча mtd1 двоеточиями и зависание на GPIO 59–62 Затирание соседнего ключа HW_NIC1_ADDR=; мгновенный Kernel Panic при опросе высоких GPIO По смещению 0x2086F под MAC отведено ровно 12 байт без двоеточий; пины GPIO 59–62 делят мультиплексор 0xB8000820 с флешкой SPI NOR Жёсткая проверка 12-символьного формата (500FF5XXXXXX) в утилитах; запрет трогать GPIO 59–62 (GPIO 58 — штатный сброс свитча)
14 Ручной перенос настроек провайдера без сети Пока не введёшь клонированный MAC и статику — интернета нет, легко ошибиться в цифре Чистый OpenWrt стартует с заводским MAC; стандартный кольцевой буфер логов на 64 КБ слишком быстро затирается Офлайн-скрипт Configure_OpenWrt_ISP_WAN_and_WiFi.bat (сам переносит всё из RouterCfm.cfg за 10 с) + буфер логов 256 КБ
15 Потолок ~40 Мбит/с с iPhone по Wi-Fi 5 ГГц в OpenWrt (VHT20) С iPhone по Wi-Fi 5 ГГц скорость упирается в ~40 Мбит/с вместо 200+ Мбит/с по тарифу На VHT20 (20 МГц, 1x1 PHY 58.5–86.7 Мбит/с) реальный потолок TCP составляет ~40–45 Мбит/с, а при включении VHT80/VHT40 в rtw88_8822be возникают потери RX/EAPOL на B-cut чипе На Stock+ (V15.03.06.23) родной драйвер rtl8192cd полноценно держит VHT80 (80 МГц, PHY 866.7 Мбит/с, реальные 200+ Мбит/с); для OpenWrt r3 намечен порт vendor-драйвера rtl8192cd для RTL8822BE
16 Клин коммутатора (FABRIC WEDGE / SIRR FULL_RST) при нагрузке 2000 МБ + Wi-Fi При долгой прокачке 2000 МБ и одновременном трафике Wi-Fi интернет на Wi-Fi замирает каждые 20–60 с на 2 с При hwnat=0 одноядерный MIPS 24Kc перегружается прерываниями PCIe (rtw88) + NAPI, буфер RX-FIFO порта свитча RTL8197F переполняется (large-frame FCS fail=54..152), и dir842_sw_watchdog вызывает полный сброс SIRR FULL_RST На Stock+ (V15.03.06.23) работает аппаратный fastpath + rtl_hw_qos с пауз-кадрами RGMII (0 сбросов под любой нагрузкой); для OpenWrt r3 — перенос fastpath L2/L3 bypass
17 Аварийный обрыв при записи mtd -r write ... firmware из живого OpenWrt Попытка залить 2-сегментный заводской сток (cr6c+hsqs, 7.59 МБ) через mtd write прямо из запущенного OpenWrt обрывается на полпути В живом OpenWrt раздел mtd2 (firmware) перекрывает смонтированный корень SquashFS (mtd4 на 0x1D9900) и JFFS2 (mtd5); при стирании 0x1D9900 процесс mtd падает по ошибке чтения корня При неполной записи hsqs загрузчик Realtek Booter v3.4.11B.9 автоматически входит в режим TFTP 192.168.1.6:69 даже без зажатия кнопки RST; откат на сток выполняется через Offline_TFTP_Recovery_and_Flash.bat
18 Конфликт маршрутизации на ПК с раздачей интернета с телефона (USB/Wi-Fi модем) При одновременной раздаче интернета с iPhone (172.20.10.1) и подключении роутера по кабелю пинг/TFTP уходит в телефон (Destination host unreachable) В момент перезагрузки роутера Ethernet кратковременно падает в APIPA (169.254.x.x), и Windows заворачивает трафик 192.168.0.1 / 192.168.1.6 в шлюз по умолчанию (172.20.10.1) В Offline_TFTP_Recovery_and_Flash.ps1 выставляется приоритетный маршрут на физический Ethernet и добавлена пошаговая индикация прогресса прожига флешки
19 Ложная ошибка HttpRequestException в Restore_Optimized_Config_and_WAN.ps1 Скрипт выдавал ошибку отправки запроса на /cgi-bin/UploadCfg, хотя конфиг Stock+ успешно применился Штатный веб-сервер httpd в прошивке Tenda после приёма RouterCfm.cfg сразу пишет /dev/mtd6 и вызывает системный reboot(), разрывая TCP-сокет до закрытия HTTP-ответа В Restore_Optimized_Config_and_WAN.ps1 добавлен перехват обрыва сокета при уходе роутера в ребут после авторизованного POST на /cgi-bin/UploadCfg ([PASS])

Подробно о самых интересных граблях

1. Загрузчик Realtek Booter v3.4.11B.9: почему он молчит на пинг и как сам себя стирает

2. Девять патчей ядра под нечётный порт WAN на свитче RTL8367RB

В D-Link DIR-842 R1 порт WAN сидит на чётном Port 4, а инженеры Tenda развели синий разъём на нечётный Port 3 (LAN 1..3 — это Ports 2, 1, 0, линия сброса — GPIO 58). В коде инициализации регистров PVID для нечётного порта значение писалось в младшие 16 бит вместо старшего полуслова [31:16]. - В build_hybrid_openwrt_ac10.sh на vmlinux накладываются 9 выверенных патчей MIPS32 LE (0x8029A4DC..0x805084D4): правильные маски VLAN (LAN=0x107, WAN=0x108), индекс GW_JACK_WAN=3, сдвиг sll $a1, $a1, 16 и маски L2-движка (0x08 / 0x07). А чтобы потяжелевшее с новым tenda-ac10-v1.dtb ядро при распаковке не затёрло стек lzma-loader, его секции .data/.bss/_stack сдвинуты на +0x4000.

3. Пустой eFuse 0xFF, внешние усилители 5 ГГц (RFE Type 6) и почему зажат VHT20

Чип RTL8822BE с завода приходит с чистым OTP eFuse (0xFF). Без калибровок открытый драйвер rtw88 ставил xtal_cap=0 (уплывала частота кварца) и оставлял внешние усилители Skyworth SE5003L1 обесточенными в байпасе (-17 дБ сигнала). А при включении ширины канала 80 МГц (VHT80) на ревизии кремния B-cut драйвер раз в несколько секунд ловил таймаут чтения RF-регистра 0x33 в rtw8822b_config_trx_mode и сбрасывал всех клиентов. - Что сделали: расширили .rodata и .rel.rodata в rtw88_8822b.ko, прописав таблицу rfe_info[6] с rtw8822b_config_rfe_efem и регистрами 0x82C/0x830/0x838/0x83C; скриптом /bin/set-mib.sh на каждом старте вынимаем из /dev/mtd1 индивидуальный HW_WLAN0_11N_XCAP и MAC конкретного экземпляра; привязали интерфейс к PCIe-пути (wlan1) и выставили по умолчанию VHT20 на 36 канале с мощностью 23 dBm (200 мВт). Потерь и переподключений стало ровно ноль.

4. Почему по умолчанию hwnat=0 + Flow Offloading и как убрали гонку MAC при ребуте

5. Apple iOS Encrypted DNS (RFC 9462 DDR) и тишина на внешнем порту

Айфоны и Маки на дефолтном OpenWrt ловили сразу две неприятности: во-первых, сгенерированный локальный префикс IPv6 ula_prefix заставлял алгоритм Happy Eyeballs по 15–20 секунд стучаться в несуществующий IPv6 на обычном IPv4-провайдере; во-вторых, получив по DHCP первым адресом DNS локальный роутер 192.168.0.1 без публичного TLS-сертификата, iOS решала, что сеть подменяет шифрованный DNS, и вешала жёлтое предупреждение. Удаление ula_prefix и выдача 6,1.1.1.1,8.8.8.8,192.168.0.1 закрыли оба вопроса разом — в nf_conntrack видно, как iPhone с первой секунды поднимает шифрованный HTTP/3 QUIC к 1.1.1.1:443. А для защиты от общей домовой подсети /24 служба dnsmasq изолирована правилом notinterface='eth0.1', а веб-сервер uhttpd переведен на универсальное прослушивание 0.0.0.0:80 и [::]:80 с фильтрацией частных сетей RFC 1918 (rfc1918_filter='1') и полной блокировкой порта 80 на внешнем интерфейсе WAN eth0.1 в файрволе. Это исключает утечку веб-панели наружу и одновременно обеспечивает полноценную работу роутера в режиме точки доступа (AP) или сетевого моста (Bridge) без потери доступа к LuCI.

6. Что вскрыл нагрузочный тест 2000 МБ и замер с iPhone (проблемы #15–#19)

При длительном прогоне 2000 МБ (параллельная загрузка в 4 потока + одновременный трафик по Wi-Fi с iPhone) выявились фундаментальные отличия между открытым стеком Hybrid OpenWrt 4.14.187 (r2) и заводским ядром Stock+ (V15.03.06.23):

  1. Упор скорости 5 ГГц в ~40 Мбит/с на OpenWrt (VHT20) против 200+ Мбит/с на Stock+ (VHT80):
  2. В Hybrid OpenWrt 4.14 (r2) открытый драйвер rtw88_8822be (backports-5.8) зажат в полосу VHT20 (20 МГц), так как на широкой полосе VHT80 (80 МГц) или VHT40 на кремнии RTL8822BE B-cut под шиной PCIe RTL8197FS нарушается синхронизация вторичных подканалов CCA и срывается приём кадров (клиент видит сеть, но застревает на 4-way EAPOL или теряет RX-пакеты). На полосе 20 МГц канальная скорость 1x1 составляет 58.5–86.7 Мбит/с, что даёт ровно ~40–45 Мбит/с реального TCP на iPhone.
  3. В прошивке Stock+ (V15.03.06.23) работает монолитный заводской драйвер Realtek rtl8192cd с родной библиотекой HalMac и полными таблицами инициализации RFE Type 6 (Skyworth SE5003L1) — он железно держит VHT80 (80 МГц, 866.7 Мбит/с PHY) и выдаёт полные 200–450+ Мбит/с по Wi-Fi.

  4. Периодические 2-секундные замирания Wi-Fi под тяжёлой нагрузкой в OpenWrt (FABRIC WEDGE / SIRR FULL_RST):

  5. Во время скачивания 2000 МБ при hwnat=0 весь поток пакетов между eth0 (свитч RTL8367RB по шине RGMII) и wlan1 (RTL8822BE по шине PCIe) прокачивается программно одноядерным процессором MIPS 24Kc (1 ГГц).
  6. В моменты пиковой нагрузки прерывания PCIe от rtw88 задерживают вычитку входного буфера RX-FIFO внутреннего свитча RTL8197F (CPU Port 6). На длинных кадрах 1518 B буфер переполняется, растут счётчики dot3StatsFCSErrors (large-frame FCS fail=54..152), и сторожевой демон dir842_sw_watchdog каждые 20–60 секунд вызывает аварийный сброс матрицы recovery level 3 (SIRR FULL_RST).
  7. На время сброса (~2 секунды) таблица коммутации очищается, а у клиентов на Wi-Fi создаётся эффект «интернет завис под нагрузкой». На Stock+ (V15.03.06.23) трафик обрабатывается ядром fastpath + аппаратным управлением потоком (802.3x Pause между RTL8367RB и RTL8197F), поэтому переполнения RX-FIFO не возникает.

  8. Почему нельзя шить двухсегментный сток через mtd -r write /tmp/stock.bin firmware из живого OpenWrt:

  9. В OpenWrt раздел mtd2 (firmware, 0x030000..0x7E0000) содержит внутри себя примонтированный на чтение mtd4 (rootfs SquashFS по адресу 0x1D9900) и примонтированный на запись mtd5 (rootfs_data JFFS2 по адресу 0x3D0000).
  10. Когда утилита mtd стирает блоки начиная с 0x1D9900, ядро теряет страницы живой корневой файловой системы, и запись обрывается до завершения второго сегмента (hsqs).
  11. Полезная находка: при обрыве записи hsqs загрузчик Realtek Booter v3.4.11B.9 (0x000000) на следующем старте проверяет контрольную сумму check_rootfs_image (0x8000D844), видит недописанный rootfs и автоматически поднимает TFTP-сервер 192.168.1.6:69 даже без нажатия кнопки RST! После этого скрипт Offline_TFTP_Recovery_and_Flash.bat за 4.2 секунды заливает заводской образ V15.03.06.23 начисто.

Реализованные доработки в финальной ревизии Hybrid OpenWrt 4.14.187 r3 (v4.14.187-r3-ac10-hybrid — Выполнено ✅)

Этап 1. Доработка автономных утилит восстановления и настройки (Выполнено ✅)

Этап 2. Полная скорость VHT80 (80 МГц, 200+ Мбит/с) на 5 ГГц в OpenWrt r3 (Выполнено ✅)

Этап 3. Ликвидация FABRIC WEDGE (SIRR FULL_RST) под нагрузкой 2000+ МБ в OpenWrt r3 (Выполнено ✅)

Этап 4. Безопасный откат OpenWrt -> Stock+ из браузера / SSH без TFTP