Network: Ethernet, Wi-Fi and mobile
FAQ › EUZOS Desktop › Network · Nederlands
What is it?
EUZOS has its own network stack (kernel/src/net): Ethernet, ARP, IPv4, ICMP, UDP and TCP, with DHCP, DNS and NTP on top, and its own TLS 1.3 for HTTPS. Every network adapter implements the same Nic trait, so DHCP, DNS, ping, HTTP and SSH work the same over a cable, Wi-Fi or a mobile modem. Several adapters can be active at once; each is an Iface with its own MAC, IP configuration and ARP table. IPv4 only: the stack does not know IPv6 yet.
Three kinds of adapters (Nic::kind):
- Ethernet: Intel e1000/e1000e/I217/I218/I219, Realtek RTL8111/8168 (PCIe), Realtek RTL8152/RTL8153/RTL8156 (USB, 100 Mbit/1 Gbit/2.5 Gbit; also the Ethernet port of most USB-C docks), virtio-net (QEMU, cloud). Broadcom BCM5717–5720 only exists in EUZOS Server.
- Wi-Fi: the built-in chip (Broadcom SDIO FullMAC, Intel 8000 family SoftMAC) and a USB Wi-Fi stick (Realtek RTL8188SU/RTL8191SU, RTL8712 family). 5 GHz is preferred; a watchdog reconnects by itself.
- Mobile: MBIM modems with a SIM card (e.g. Sierra Wireless EM7305, Huawei Mobile Broadband Module).
The firewall and static IP addresses are EUZOS Server features; see Server network and firewall.
How do I…?
How do I see my IP address and whether the cable is connected?
Type ip. Per adapter it shows the name, MAC, IP/mask, gateway, DNS, frames received and sent (and, if the adapter counts them, how many really went on the wire), and link yes|no. The last line counts TCP connections and repeated/out-of-order/window-full segments. In the desktop: the network icon in the taskbar and Settings › Network.
How do I get a new address after plugging in a cable later?
dhcp asks again on adapter 0; dhcp <adapter> on another adapter. dhcp renew [adapter] only extends the lease. At boot, DHCP runs on the first adapter with a cable (or the first one if none has a cable).
How do I connect to Wi-Fi from the console?
wifi on find and start the built-in chip (SDIO via ACPI, otherwise PCIe)
wifi scan list networks (strongest first, at most 20; * = needs a password)
wifi connect <name> [password]
wifi status of all Wi-Fi adapters and the remembered network
The password is typed as a secret: it is masked on screen and removed from the log, [ssh] lines and the history (main.rs::redact). A successful wifi connect remembers the network on the stick (see below). In the desktop use the Wi-Fi panel of the taskbar or Wi-Fi settings….
How do I connect to a new Wi-Fi network on the desktop?
The Wi-Fi panel of the taskbar and Settings › Network show your connection and the remembered networks that were in range at the last search; opening them does not search, so the screen stays smooth. Other networks… in the panel (or Add network in Settings) opens a pop-in in the middle of the screen: that searches, lists the networks with their security (WPA2-Personal, Open network, Enterprise…) and asks for a password when one is needed. Search again looks once more; rows that stay keep their place. Arrow keys and Enter work, as do the wheel and a finger, and Esc closes it. It closes by itself once the connection works. On the login screen the list opens directly in this form, because without a network nobody can sign in.
How do I add a Bluetooth device?
Settings › Bluetooth shows your paired devices and does not search. Add device opens a pop-in that searches for 30 seconds (this PC is visible to others only during that time), with Search again afterwards. Pair next to a device shows the progress and the result in the same place; a question about a code appears on top of it. Put the device in pairing mode first.
How do I make the PC remember (or forget) a Wi-Fi network?
wifi connect remembers automatically after DHCP succeeded. wifi remember <name> [password] stores it explicitly; without a password while you are connected to that network, it stores the key of the current connection. wifi forget deletes the remembered network. Only the WPA2 key (PMK, 64 hex characters = PBKDF2(password, name)) is stored, never the password. In the Wi-Fi panel the option is Remember on this PC (applies to all users of this PC).
How do I use a USB Wi-Fi stick next to the built-in Wi-Fi?
Put the adapter first: wifi usb scan, wifi usb connect <name> [pw], wifi internal …. wifi choose usb|internal|auto sets where commands without an adapter name, the Wi-Fi panel and the installer go (auto: built-in, otherwise the stick). The stick switches on by itself when plugged in (wifi usb on only says so). In the network stack the adapters are called wifi and wifi-usb.
Why does EUZOS prefer 5 GHz?
The same network often transmits on 2.4 and 5 GHz, and 2.4 GHz almost always has the slightly stronger signal, but only three non-overlapping channels. After all Wi-Fi PCs dropped out at the same moment on a crowded 2.4 GHz channel, euzos_ip::band gives a 5 GHz BSS a 15 dB head start, as long as its signal is at least −75 dBm. wifi::connect makes at most three attempts: after a temporary rejection (802.11 status 1, 17, 30 or 37) the same access point once more after 2 s, otherwise (and after that) another access point of the network; BSSes with recent trouble (the data path hung, connecting failed) come last (euzos_ip::reconnect::choose). See NETWORK-THROUGHPUT.md, "Wi-Fi drops out now and then".
What happens when the Wi-Fi drops?
net::wifi::watchdog runs every second from the dhcp thread. It reconnects to the same network with the same key (kept in memory only) when the driver lost the connection, or when the connection is up but nothing has come in for a long time while we did send (event::needs_recovery: the data path hangs). The address stays until DHCP is done, so open TCP connections survive. After a failed attempt it waits 2 s, 5 s, 10 s, then every 30 s, and it never gives up by itself: only disconnecting or choosing another network stops it. Meanwhile the bar shows "<network> · reconnecting…" and never "connected" (euzos_ip::reconnect, make ip-test). When the data path hangs, the log says which part stopped (the driver's counters, a verdict such as "transmit queue stuck" or "data frames dropped").
How do I use the mobile network (SIM)?
The modem is driven by the thread mobile. By default it connects only when there is no Wi-Fi or Ethernet with link, address and gateway (after 5 s without another network; it disconnects after 15 s of working Wi-Fi/Ethernet). Console:
mobile modem, SIM/PIN state, radio, registration, signal, connection, IP, settings, usage
mobile connect | disconnect connect now | disconnect (the policy only reconnects after 'mobile connect' or a reboot)
mobile on | off the radio switch
mobile when auto|never|always
mobile roaming on|off
mobile apn auto|<apn>
mobile priority ethernet,wifi,mobile
mobile usage [clear]
The PIN is only entered in Settings › Mobile network (never on the console); it goes to the modem in one message and never to the log or disk. In the desktop: the section Mobile network in the Wi-Fi panel, and Settings › Mobile network (PIN, PUK, APN, Roaming, when, Priority, Data usage). On the login screen the mobile card opens the Mobile network panel with a PIN field.
What does "metered" mean?
When outbound traffic goes over mobile (net::metered), EUZOS does not download release files (fetch, install), app packages (apps install, Chromium), and DriverEnricher waits for Wi-Fi or Ethernet.
How do I test the connection?
ping <address> [n] (ICMP echo, default 4, 1–100), dns <name> [server[:port]] (A record, with time), http <address/path> (fetches over EUZOS's own TCP; https:// uses its own TLS 1.3 and checks the certificate against \EOS\FW\ROOTS.PEM). http prints the status line, address, header count, body size, an FNV-1a check value, the TLS details and the first ten lines of the body.
How do I diagnose a network problem?
net log [n]: network events with time since boot and UTC (ARP, DHCP, Wi-Fi scans/deauth/beacon loss, repeated SYNs, silences);net sec [n]: frames received/sent per second per adapter (last 180 s);net arp: ARP table per adapter and what waits for ARP;net stat [reset]: throughput and time per layer (NIC, TCP, SSH, SDIO);net diag,e1000,rtl8168,bcm: registers and counters of the adapters (all, or only Intel / Realtek RTL8111/8168 / Broadcom).
How do I log in over SSH?
The SSH server (port 22) starts by itself once an adapter has an address, if \EOS\FW\AUTHKEYS.TXT exists and \EOS\FW\SSHD.TXT does not contain off (legacy uit). sshd/sshd start, sshd stop, sshd status control it on the console (not over SSH). Only ed25519 keys are accepted. See the console page for what can be run over SSH. In the desktop: SSH settings shows sessions, keys (kind, comment, fingerprint) and the host key fingerprint, and can turn the service on or off.
Details
Ethernet drivers
| Driver | Module | Chips | Notes |
|---|---|---|---|
| Intel e1000 family | net::e1000 | 8254x (e1000), 82574/82583 (e1000e), I217/I218/I219 (PCH) | 32 receive and 32 send descriptors, 2 KiB buffers, polling |
| Realtek RTL8111/8168 | net::rtl8168, libs/rtl8168 | 10ec:8168, 10ec:8161, revisions 8168B to 8168H/EP/FP | no PHY firmware patch; see RTL8168.md |
| Realtek RTL8152 | net::rtl8152, usb/mod.rs | USB 2.0, 10/100 Mbit | the USB layer sets up the bulk endpoints |
| Realtek RTL8153 / RTL8156 | net::rtl8152, usb/rtl815x.rs, libs/rtl8153 | 0bda:8153, 0bda:8156 and 25 OEM ids (Lenovo, Microsoft, Samsung, TP-Link, ...); 1 Gbit/s, RTL8156 2.5 Gbit/s on USB 3 | built from a clean-room spec (docs/drivers/specs/rtl8153-rtl8156.md); no patch firmware; hardware test pending |
| virtio-net | net::virtio | virtio 1.0 PCI | QEMU and cloud servers |
| Broadcom BCM5717–5720 | net::bcm5720, libs/bcm | 14e4:1655/1656/1657/165f/1665 | EUZOS Server only; each PCI function is its own adapter |
net::init probes every PCI device in the order virtio → e1000 → rtl8168 → (bcm5720), then the RTL8152 on USB, and adds all adapters it finds (not only the first).
Routing: outbound traffic goes via the adapter with the target in its subnet, otherwise via the highest-ranked adapter (priority ethernet > wifi > mobile by default) with link, address and gateway (net::Net::route). The DNS server comes from the chosen adapter. A TCP connection stays on the local address it started on. Packets to 127.0.0.0/8 or an own address go through a loopback queue (lo).
Wi-Fi drivers
| Adapter | Module | Chips | Firmware on the stick |
|---|---|---|---|
| Built-in, SDIO FullMAC | net::brcmfmac | Broadcom BCM43241 (Sony VAIO Tap 11) | 43241B4.BIN + NVRAM 43241B4.TXT |
| Built-in, PCIe SoftMAC | net::iwl (trans.rs, connect.rs, regs.rs), libs/iwl | Intel Wireless 8260, 8265 | IWL8000C.UCD, IWL8265.UCD |
| Built-in, CNVi SoftMAC (gen2) | net::iwl (gen2.rs), libs/iwl (gen2.rs) | Intel Wi-Fi 6 AX201, Wireless-AC 9461/9462/9560 (Qu/QuZ) | IWLQU*.UCD |
| Built-in, CNVi SoftMAC (gen3) | net::iwl (gen2.rs, gen3 mode), libs/iwl (gen3.rs) | Intel Wi-Fi 6E AX211 (8086:51F0, e.g. HP ProBook 450 G9): built, not yet tested on hardware | IWLSOGF.UCD + IWLSOGF.PNV |
| USB stick | net::rtl8712, usb/rtl8712.rs, libs/rtl8712 | Realtek RTL8188SU/RTL8191SU (e.g. 0bda:8171) | RTL8712U.BIN (exception U-18) |
net::wifi_pci::identify recognises more PCIe chips (Intel 7260/7265/3165/ 3168/9260/9000, AX200/AX201/AX210/AX211, BE200; Realtek RTL8821/8822/8852/ 8723/8812; MediaTek MT7921/7922; Qualcomm/Atheros; Broadcom PCIe) and names the firmware file it would need, but only the Intel 8000 family is booted; the others print "Under construction". FullMAC chips connect and do WPA2 in their own firmware; for SoftMAC chips EUZOS does 802.11 and WPA2 (4-way handshake, CCMP) itself. Security kinds shown by a scan: open, WEP, WPA, WPA2, WPA3.
Boot: the built-in Wi-Fi boots in its own thread wifi by default and connects to the remembered network; the boot screen shows "Wifi: loading firmware n%". \EOS\FW\WIFISTART.TXT changes that (see below).
Remembered network and security: a WIFI.TXT without a valid key is ignored unless it says the network is open, so a fake open access point with the same name does not win. In the log a network name appears only as a short hash (network #xxxxxx); wifi shows the real name.
Mobile (MBIM)
net::mbim talks MBIM 1.0 to the modem (OPEN, DEVICE_CAPS, SIM, PIN, radio, registration, signal, connect) over the USB control interface; the data side is NCM. The adapter mobiel gets address, gateway and DNS from the modem (IP_CONFIGURATION, not DHCP), adds and strips an Ethernet header, answers ARP itself and clamps the TCP MSS when the MTU is below 1500. The APN is set by hand or automatically: own table on MCC+MNC (libs/mbim/src/apn.rs), then an empty APN, then internet. Roaming is off by default. Usage is counted per month and in total and written to MOBILE.TXT every 10 minutes and on disconnect. See MOBILE.md.
Time (NTP)
net::ntp asks pool.ntp.org (SNTP, RFC 4330) once an adapter has an address, for checking certificates. Only a reply to our own request counts, and a time more than two days away from the RTC is not used. date ntp fetches it again (see Diagnostics).
SSH server
net::sshd (transport from libs/ssh): host key from HOSTKEY.TXT (a temporary key per boot if missing), allowed keys from AUTHKEYS.TXT (OpenSSH lines, ed25519 only). Limits: at most 3 clients, at most 2 per address, a logging-in session closes after 300 s without activity, output of one command at most 112 KiB. Every command still passes the console policy (environment::shell_allowed); otherwise "not available (build or policy)". On EUZOS Server, SSH is only allowed in a test build with the development setting, never on production (sshd::role_allows).
Reference
Console commands
| Command | Arguments | What it does |
|---|---|---|
ip | – | address, mask, gateway, DNS, counters and link per adapter; TCP statistics |
dhcp | [adapter] | request an address again (default adapter 0) |
dhcp renew | [adapter] | extend the lease; legacy alias vernieuw |
ping | <address> [n] | ICMP echo, n = 1..100 (default 4), 1 s apart |
dns | <name> [server[:port]] | look up an A record (default port 53) |
http | <address/path> | fetch a page; https:// with own TLS 1.3 and certificate check |
net diag | – | registers and counters of all adapters with diagnostics |
net stat | [reset] | throughput and time per layer since the reset |
net log | [n] | network events with time |
net sec | [n] | frames per second per adapter |
net arp | – | ARP table per adapter |
net window | [KiB] | TCP receive window of new logged-in SSH sessions; legacy alias venster |
net ack | [N] | TCP acknowledges after N full segments |
e1000 | – | diagnostics of the Intel adapters only |
rtl8168 | – | diagnostics of the Realtek RTL8111/8168 only |
bcm | – | diagnostics of the Broadcom BCM5717–5720 only (server) |
wifi | [status] | status of all Wi-Fi adapters, boot timings, remembered network |
wifi on | – | switch on the built-in Wi-Fi (SDIO via ACPI, else PCIe); legacy alias aan |
wifi scan | – | scan for networks |
wifi connect | <name> [password] | connect, DHCP, and remember on success; legacy alias verbind |
wifi disconnect | – | drop the connection; legacy alias verbreek |
wifi remember | <name> [password] | store the network (key, not password) on the stick; legacy alias onthoud |
wifi forget | – | delete the remembered network; legacy alias vergeet |
wifi choose | usb|internal|auto | default adapter for Wi-Fi commands; stick = usb; legacy aliases kies, intern, ingebouwd |
wifi <adapter> … | adapter usb, stick, internal, builtin (legacy intern, ingebouwd) | run the subcommand on that adapter |
mobile | – | full modem state (legacy command name mobiel) |
mobile usb | – | all USB configurations of the modem and the choice |
mobile connect | – | connect now; legacy alias verbind |
mobile disconnect | – | disconnect; legacy alias verbreek |
mobile on / off | – | radio switch; legacy aliases aan / uit |
mobile when | auto|never|always | when to use mobile; legacy aliases wanneer, nooit, altijd |
mobile roaming | on|off | data abroad; legacy aan/uit |
mobile apn | auto|<apn> | set or clear the APN |
mobile priority | ethernet,wifi,mobile (each once, best first) | adapter priority; legacy alias voorrang |
mobile usage | [clear] | data usage; clear sets it to 0; legacy aliases verbruik, wis |
sshd | [start|stop|status] | SSH server on port 22 (not from SSH itself) |
On EUZOS Server, wifi and mobile answer "not in EUZOS Server".
SSH-side commands (ssh <host> <command>)
| Command | What it does |
|---|---|
put <path> | stdin becomes a file under EOS/ on the boot volume (not KX64.ELF itself; use commit) |
apps receive | receive a signed app package on stdin into apps/ on partition 2 (legacy apps ontvang) |
package receive <name> | receive an app package (.PAK) on stdin (legacy pakket ontvang) |
try | prepare the trial kernel and reboot after the reply |
reboot | reboot after the reply (legacy herstart) |
log [n] | the log (over SSH: everything by default) |
exit, logout | end the interactive session |
| any other console command | run with its output captured, subject to the console policy |
Functions and modules
| Function / module | Role |
|---|---|
crate::net::init | probe and add all wired adapters |
crate::net::with, net::available | access the stack; whether any adapter is active |
crate::net::Net::route | choose the outbound adapter |
crate::net::metered | is outbound traffic going over mobile? |
crate::net::dhcp::run_on, dhcp::renew, dhcp::maintain, dhcp::link_watcher | DHCP client (RFC 2131) |
crate::net::dns::resolve, dns::resolve_via | DNS client (RFC 1035) |
crate::net::ping | ICMP echo |
crate::net::http::get | single-request HTTP/HTTPS client (profile server, DriverEnricher, http) |
crate::net::web | the browser's HTTP/1.1 client with keep-alive, cookies, HSTS |
crate::net::ntp::sync, ntp::query | network time |
crate::net::event::show, event::show_sec, event::needs_recovery | net log, net sec, hang detection |
crate::net::stat::show, stat::reset | net stat |
crate::net::wifi::command | the wifi command |
crate::net::wifi::turn_on, wifi::watchdog, wifi::forget, wifi::peek, wifi::connected_to | Wi-Fi control for console, panel and Settings |
crate::net::wifi::wifi_txt, wifi::current_wifi_txt | build WIFI.TXT content (also for the installer) |
crate::net::wifi::WifiDevice (trait) | what each Wi-Fi chip driver provides: chip, state, scan, connect, disconnect, rssi, off_before_reboot |
crate::net::wifi_pci::identify | identify a PCIe Wi-Fi chip and its firmware file |
euzos_ip::band::choose_band | 5 GHz preference |
crate::net::mbim::command, mbim::settings, mbim::set_on, mbim::enter_pin | mobile modem |
euzos_mbim::policy (Settings, When, Priority, Kind) | mobile policy and MOBILE.TXT format |
crate::net::sshd::command, sshd::role_allows | SSH server |
crate::sshd_settings::collect, set_enabled, disconnect | data for the SSH settings app |
crate::network_services (main.rs) | start NTP and sshd once the network is up |
crate::redact (main.rs) | remove Wi-Fi passwords and pairing keys from logged commands |
Config files
All in \EOS\FW\ on the boot volume (stick or internal ESP).
| File | Key / content | Values | Meaning |
|---|---|---|---|
WIFI.TXT | ssid= | network name | remembered network |
pmk= | 64 hex characters | WPA2 key (PBKDF2 of password and name), never the password | |
beveiliging=open | open | the network is open (no key) | |
WIFISTART.TXT | words, # comment | background (default) or wait/foreground; fast (default) or slow (legacy achtergrond, wacht, voorgrond, snel, traag) | boot Wi-Fi in the background or let the boot wait; fast 4-bit SDIO bus or slow 1-bit download |
MOBILE.TXT (legacy name MOBIEL.TXT still read) | mobile= (legacy mobiel=) | on|off (legacy aan|uit) | radio switch |
when= (legacy wanneer=) | auto|never|always (legacy nooit, altijd) | when to use mobile | |
roaming= | on|off (legacy aan|uit) | roaming | |
apn= | auto or an APN | APN | |
priority= (legacy voorrang=) | e.g. ethernet,wifi,mobile | priority | |
usage-month=, usage-in=, usage-out=, usage-total= (legacy verbruik-maand=, -in=, -uit=, -totaal=) | month YYYYMM, bytes | data usage | |
AUTHKEYS.TXT | OpenSSH lines | ssh-ed25519 AAAA… comment | keys allowed to log in over SSH |
HOSTKEY.TXT | 64 hex characters | – | seed of the ed25519 host key (secret) |
SSHD.TXT | text | off (legacy uit) | do not start sshd automatically |
ROOTS.PEM | PEM certificates | – | trusted roots for HTTPS |
EXTRA.PEM | PEM certificates | – | extra roots for a test server; ignored in a production build |
| firmware | 43241B4.BIN, 43241B4.TXT, IWL8000C.UCD, IWL8265.UCD, … | – | Wi-Fi firmware (exception U-15 for Intel) |
MOBILE.TXT never contains the PIN or PUK. NETWORK.TXT (static addresses) and FIREWALL.TXT belong to EUZOS Server.
Since 27-10-2026 EUZOS writes English config file names, keys, values and confirmation words (for example
WIPE-…,environment=inPROFILE.TXT); the old Dutch names (marked legacy here) are still read and accepted (docs/ENGLISH.md).
Protocol messages and formats
| Protocol | Where | Notes |
|---|---|---|
| DHCP (RFC 2131) | net::dhcp | the old address stays during renewal until the ACK |
| DNS (RFC 1035) | net::dns | A records only |
| SNTP (RFC 4330) | net::ntp | server pool.ntp.org, UDP 123, random originate check |
| TLS 1.3 (RFC 8446) | libs/tls | roots from ROOTS.PEM |
| SSH | libs/ssh, net::sshd | port 22, ed25519 |
| 802.11 + WPA2-PSK (4-way, CCMP) | net::iwl, libs/rtl8712 | SoftMAC chips; FullMAC does this in firmware |
| MBIM 1.0 + NCM | net::mbim, libs/mbim | SEND_ENCAPSULATED_COMMAND / GET_ENCAPSULATED_RESPONSE; response fetched after 300 ms without notification |
See also
- Console · Diagnostics · Installer · Server network and firewall
- docs/WIFI-INTEL.md
- docs/WIFI-USB.md
- docs/MOBILE.md
- docs/RTL8168.md
- docs/NETWORK-THROUGHPUT.md
EUZOS