Разбор полётов: все 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: почему он молчит на пинг и как сам себя стирает
- Баг
$s7 = 0(0x80001C2C): В процедуреAutoBurn(0x800019D0) текущий адрес записи во флешку лежит в регистре$s7. Когда цикл переходит ко второму сегменту файла, в слоте задержки ветвления отрабатывает забытая программистами инструкцияmove $s7, $s2(где$s2 == 0). Если подать двухчастный образ (cs6cядро +hsqsкорень), второй кусок летит прямо в0x00000000и сносит загрузчикmtd0. Наш сборщик склеивает ядро и SquashFS в один монолитный сегментcs6cс адресом0x00030000— цикл завершается после первой же итерации и до дефектной ветки никогда не доходит. - Тишина на
ping 192.168.1.6и выключенный WAN: На0x80001010загрузчик сверяет поле протокола IPv4 с0x11(UDP) и отбрасывает всё остальное, а на0x8000ED48вызываетrtk_port_phy_power_down(3), гася синий порт WAN. Поэтому кабель втыкаем только в жёлтыеLAN 1–3, ловим MAC50:0F:F5:00:00:01по ARP и сразу пушим прошивку наUDP:69.
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 при ребуте
- Когда включён кремниевый NAPT (
hwnat=1), кабельный трафик летит на940 Мбит/спри0.5%загрузки процессора, но таблица ASIC TLU режет пакеты беспроводных клиентов, приходящие из программного мостаbr-lan. На практике это выглядело дико: на стационарном ПК спидтест выбивает гигабит, а на смартфоне рядом не открывается ни одна страница. Сhwnat=0и включённымfirewall.@defaults[0].flow_offloading='1'одновременно работают и кабель, и Wi-Fi на скорости ~350–500 Мбит/с (чего за глаза хватает на домашние тарифы 100–500 Мбит/с), а для чисто проводного гигабитаhwnat=1включается на лету одной строкой. - Вторая засада всплыла при проверке холодного старта по питанию: функция
wait_netif_mac()в/etc/init.d/dir842-asicждала появления заводского MAC только наeth0.2(LAN) и тут же дёргалаgw_prog, хотяnetifdещё не успел навесить клонированный MAC провайдера наeth0.1. Теперь скрипт честно дожидается обоих интерфейсов перед записью аппаратных таблиц.
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):
- Упор скорости 5 ГГц в
~40 Мбит/сна OpenWrt (VHT20) против200+ Мбит/снаStock+(VHT80): - В
Hybrid OpenWrt 4.14 (r2)открытый драйверrtw88_8822be(backports-5.8) зажат в полосуVHT20(20 МГц), так как на широкой полосеVHT80(80 МГц) илиVHT40на кремнииRTL8822BE B-cutпод шиной PCIeRTL8197FSнарушается синхронизация вторичных подканалов CCA и срывается приём кадров (клиент видит сеть, но застревает на 4-way EAPOL или теряет RX-пакеты). На полосе 20 МГц канальная скорость 1x1 составляет58.5–86.7 Мбит/с, что даёт ровно~40–45 Мбит/среального TCP на iPhone. -
В прошивке
Stock+(V15.03.06.23) работает монолитный заводской драйвер Realtekrtl8192cdс родной библиотекойHalMacи полными таблицами инициализацииRFE Type 6(Skyworth SE5003L1) — он железно держитVHT80(80 МГц,866.7 Мбит/сPHY) и выдаёт полные200–450+ Мбит/спо Wi-Fi. -
Периодические 2-секундные замирания Wi-Fi под тяжёлой нагрузкой в OpenWrt (
FABRIC WEDGE/SIRR FULL_RST): - Во время скачивания
2000 МБприhwnat=0весь поток пакетов междуeth0(свитчRTL8367RBпо шине RGMII) иwlan1(RTL8822BEпо шине PCIe) прокачивается программно одноядерным процессором MIPS 24Kc (1 ГГц). - В моменты пиковой нагрузки прерывания 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). -
На время сброса (
~2 секунды) таблица коммутации очищается, а у клиентов на Wi-Fi создаётся эффект «интернет завис под нагрузкой». НаStock+(V15.03.06.23) трафик обрабатывается ядромfastpath+ аппаратным управлением потоком (802.3x PauseмеждуRTL8367RBиRTL8197F), поэтому переполнения RX-FIFO не возникает. -
Почему нельзя шить двухсегментный сток через
mtd -r write /tmp/stock.bin firmwareиз живого OpenWrt: - В OpenWrt раздел
mtd2(firmware,0x030000..0x7E0000) содержит внутри себя примонтированный на чтениеmtd4(rootfsSquashFS по адресу0x1D9900) и примонтированный на записьmtd5(rootfs_dataJFFS2 по адресу0x3D0000). - Когда утилита
mtdстирает блоки начиная с0x1D9900, ядро теряет страницы живой корневой файловой системы, и запись обрывается до завершения второго сегмента (hsqs). - Полезная находка: при обрыве записи
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. Доработка автономных утилит восстановления и настройки (Выполнено ✅)
- [x]
Restore_Optimized_Config_and_WAN.ps1: Добавлена корректная обработка мгновенного закрытия TCP-сокета веб-сервером Tendahttpdпри вызовеsys_reboot()после приёма/cgi-bin/UploadCfg(больше не выбрасывает ложныйHttpRequestException). - [x]
Offline_TFTP_Recovery_and_Flash.ps1: Добавлена детальная пошаговая индикация таймера записи SPI NOR флеш-памяти (каждые 15 секунд), чтобы окно консоли не выглядело зависшим после 4-секундной передачи TFTP. - [x] Защита
.gitignore: Исключены локальные папкиbackups/и дампы пользовательскихRouterCfm_optimized_v1.cfgиз индексации Git.
Этап 2. Полная скорость VHT80 (80 МГц, 200+ Мбит/с) на 5 ГГц в OpenWrt r3 (Выполнено ✅)
- [x] Портирование последовательности инициализации
HalMac / PHY BBиз заводскогоrtl8192cdвrtw88_8822b.c: - Извлечь из дизассемблированного стокового ядра (
01_Stock_Firmware_and_Partitions/kernel_cr6c_0x030000.bin) точную последовательность переключения ширины канала80 MHz(SetChannelPara8822B/PHY_SetBWMode8822B) и настройки вторичных подканалов CCA (0x838,0x83C,0x9B0) для ревизииB-cut+RFE Type 6. - Устранить таймаут опроса RF-регистра
0x33при калибровке IQK/LCK в режимеVHT80путём увеличения окна ожиданияrtw_read_rfи отключения агрессивногоLPS/ASPMна шине PCIeRTL8197FS. - Альтернативный трек (Vendor Driver): Собрать ядерный модуль
rtl8192cd.koиз GPL-исходников Realtek SDK (linux-3.10/linux-4.14backport) с включёнными флагамиCONFIG_RTL_8822B_SUPPORT=y,CONFIG_PA_SKYWORTH_5003L1=y(RFE Type 6) иCONFIG_PA_SKYWORKS_85303=y(RFE Type 5для 2.4 ГГц).
Этап 3. Ликвидация FABRIC WEDGE (SIRR FULL_RST) под нагрузкой 2000+ МБ в OpenWrt r3 (Выполнено ✅)
- [x] Аппаратный Flow Control (802.3x Pause) между
RTL8367RB(Port 6 RGMII) иRTL8197F(Port 0): - Включить симметричные кадры паузы (
TX/RX Pause) на внутреннем порту CPU (Port 6) и RGMII-портуRTL8367RB, чтобы при пиковой загрузке MIPS 24Kc внешний коммутатор придерживал пакеты в своей буферной памяти SRAM вместо переполнения RX-FIFO (dot3StatsFCSErrors). - [x] Интеграция L2/L3 Bridge Fastpath для связки
wlan1 <-> eth0.1: - Научить модуль
rtl819xпробрасывать установленные потокиnf_flow_tableнапрямую из кольца TX/RXrtw88в DMA-кольцоeth0в обход полного стекаbr-lan, снизив нагрузкуsoftirqна процессор в 2.5–3 раза. - [x] Смягчение ступеней
dir842_sw_watchdog: - Заменить жёсткий
recovery level 3 (SIRR FULL_RST)при одиночных всплескахFCS failпод 100% CPU на мягкую очистку очередей FIFO (level 1) без сброса линка и таблицы MAC.
Этап 4. Безопасный откат OpenWrt -> Stock+ из браузера / SSH без TFTP
- [x] Скрипт
sysupgrade-to-stock.shс переходом вramfs: - Добавить в состав прошивки скрипт, который перед записью
Tenda_AC10_V1_Stock_TFTP_Recovery.binпереключает корневую ФС в оперативную память (switch_rootв/tmpramfsпо аналогии со штатнымstage2вsysupgrade), размонтируетmtd4/mtd5и атомарно записываетcr6c+hsqsв/dev/mtd2без обрыва процессаmtd.