Repository navigation
Conversation
W4 of issues/there-is-no-wifi.md, its WPA2 half: what needs no SAE. - toyos-radio (lib/radio): the protocol between wlan and each Wi-Fi driver. wlan serves `radio` and each driver connects, as each NIC driver connects to netstack's `link`: a port has one server, and there is one driver per radio function. #876's table had the driver serving. - toyos-wifi (lib/wifi): the protocol between wlan and the settings programs. A passphrase travels to wlan and never back. - toyos-wlan-station (system/wlan/station): every decision wlan makes, sans-IO. BSS choice (WPA2-Personal as the handshake crate keys it, a strong BSS before a weak one, then band, then signal), connect, disconnect and status, a wrong passphrase refused because message 2 went unanswered, a lost connection joined again once, and a radio that breaks its protocol or misses a bound ended by name. - wlan (system/wlan) and wifi (system/wifi): the programs. wlan is in `[boot] start`; the build lets only `wifi` receive `wifi` and only `ax2xx` receive `radio`. - toyos-wlan-handshake: `Refused::verified`, so the caller knows which refusals follow a verified MIC and leaves on them. `Plaintext` is split so that each reason arises on one side of the MIC check only. Not built until W2b: SAE before PSK, the Transition Disable mark and its PSK refusal. No image ships a radio driver until W5. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A message 3 whose MIC does not verify is counted and dropped, so a frame anyone can forge cannot end the association; the join test now holds that. A join made again after a loss is no different from any other: one that fails is not made again, so the flag that said so and the refusal only it reached are gone. The radio protocol's header states the leave rule wlan enforces: each Leave is answered by its own Left::Asked. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The owner's direction, through the orchestrator: ToyOS later serves as an access point on the AX2xx, with Linux the independent station; a ToyOS station joining it is a later regression row, never the exit. Its firmware facts (AP-mode support, band and regulatory limits) are a reader's question for the specification. W5's test network is the AMD bench's AX200 as a transient Linux access point, with a generated SSID and passphrase; W7's swaps the roles, the T14's AX210 serving while the AMD bench runs ToyOS. Whether it offers SAE by hash-to-element, PMF and HE is still to be read on the bench. The port direction #1140 chose is recorded as accepted. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Review r1 of #1140 at
|
…iped - radio: Join carries the SSID and the elements of the Beacon or Probe Response the BSS was chosen by, so a driver keeps no scan results. Its association request has the SSID (§9.3.3.6), and its configuration has the operation elements. - wlan reads a settings program's frame where it was received and wipes the buffer (FrameRx::wipe, volatile) once the station has it. Key commands' payloads are Secrets. The wifi program's request and its passphrase line are Secrets too. What is still copied elsewhere (the kernel's message frames, std's stdin buffer, the terminal's echo) is issues/a-wi-fi-passphrase-leaves-copies-outside-wlans-wiped-buffers.md. - The station logs what it dropped: per scan, the malformed, off-channel and past-bound frames; per join, the stray and refused EAPOL frames. - The scan bound's arithmetic is corrected and the handshake bound is called policy. The passphrase bound is MAX_PASSPHRASE, Security is encoded by a match, and the selector check says why HT, VHT and HE's are met. - wlan's poller is sized by construction: each ready token is handled once a pass, and MAX_WATCHES counts what a pass registers. A client ended for what it sent has its later frames ignored. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… is true `wifi` reads standard input's first line from the descriptor itself. std's canonical stdin echoes each byte and keeps the line in a static buffer; reading the descriptor directly does neither. The issue drops those two rows and keeps the kernel's message frames. The track says `wlan` runs in the system image, where `wifi status` answered `no radio` in a QEMU boot. Console and diag images do not start it. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Round 2: review r1 answeredHead Blockers
Suggestions
Checks at the head
|
std's canonical stdin (sdk/std/sys/stdio.rs) echoes every byte and holds the line in a static buffer, so no program reads a secret through it unseen. The issue is the orchestrator's. wifi's own read of descriptor 0 says it works around it, and goes when the issue closes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
W4a of
issues/there-is-no-wifi.md:wlan, theradioandwifiprotocols and the settings programwifi, for WPA2-Personal. Host-tested. No radio says hello until W5 shipsax2xx. Headda9369136onorigin/main190f3b164. Round 2 answers review r1: #1140 (comment)What it builds
toyos-radio(lib/radio): the protocol betweenwlanand each Wi-Fi driver. The driver says hello (address, bands), then answers scans with the Beacons and Probe Responses it heard, and joins by Open System. A join names its BSS whole: the SSID, the station's RSNE, and the elements of the Beacon or Probe Response the BSS was chosen by, so the driver keeps no scan results. It carries EAPOL both ways. It installs the keyswlanderives, an install taking effect after every frame sent before it, opens the link on Authorize, and reports the association's end. Every frame is decoded once and refused by name.toyos-wifi(lib/wifi): the protocol betweenwlanand the settings programs: scan, connect, disconnect and status. A passphrase travels towlanand never back.toyos-wlan-station(system/wlan/station): every decisionwlanmakes, sans-IO.toyos-wlan-handshakekeys it. Any BSS at or above −70 dBm ranks before every weaker one. Among those, the higher band wins, then the stronger signal; among weaker ones, the stronger signal wins. Every unjoinable BSS is refused by name: open/WEP, SAE-only, no PSK, no CCMP-128, another group cipher, protection required under another cipher, a membership selector not met, a band the radio lacks.wlan(system/wlan, in the system image's[boot] start,service = true) andwifi(system/wifi; the shell starts it).wifi connect <network>reads the passphrase from standard input's descriptor itself, so no argument list, std echo or std buffer holds it.wlanlogs, as counts only, what each scan and each join dropped.FrameRx::wipe(SDK): zeroes a receive buffer with volatile stores.wlancalls it once the station has a settings program's frame, and again before the buffer is freed.toyos-wlan-handshake:Refused::verified, an exhaustive match, tellswlanwhich refusals follow a verified MIC.Plaintextis split (EncryptedMessage1is message 1's) so each reason arises on one side of the MIC check only.Decisions for review
wlanservesradioand each driver connects, as each NIC driver connects to netstack'slink.HELD_ALONElets onlyax2xxreceiveradioand onlywifireceivewifi.lib/crypto'sPairwiseMasterKeyhas no constructor from bytes, and P6 is paused.wlandrives one radio at a time and refuses a second by name.issues/the-wlan-handshakes-readings-…becomesissues/wlans-readings-of-802-11-are-unchecked-against-its-text.md, with rows 25–30 for this pull request's readings: Annex J.4.1, membership selectors, a BSS's own channel, hidden SSIDs, channel numbering, field widths. They were written without the text at hand.Checks and evidence
Round 2, https://github.com/ToyOSOrg/evidence/blob/744977e5371d1de74b1af8e782dc54e2b5a71074/w4-r2/README.md:
cargo run -- --ci hostat5958bdc5f: exit 0, 108 steps green.da9369136changes one type inwifi, a ToyOS-only program no host step builds.cargo run -- --build-onlyatda9369136: exit 0,bin/wlanandbin/wifiin ROOT.wifi statusin a guest: a one-off, reverted patch tolaunchcasestartedwlanand had its job launchwifi status, which saidno radio. That exercises the supervisor's acceptors and thewificonnector. It ran on71bad9cf0's tree, andstatusreaches nothing changed since.5958bdc5f, each red only its target: an unanswered message 2 named as no message 1; the band ignored; a BSS outside a scan accepted; a verified refusal not left on; a positive signal decoded; no rejoin;Micclassed as verified.mac80211_hwsim). The station sends the recorded message 4 byte for byte, installs the recorded station's TK, GTK and IGTK, and hands the driver the recorded Probe Response's elements. Wrong-passphrase, loss and rekey cases run against the handshake crate's test authenticator, which shares no crypto code with the station.wlan: serving radio and wifi.wlanthrough a test job holdingwifi.Risks and limits
kernel/src/frame_bytes.rs), and the compiler's own copies. These are recorded inissues/a-wi-fi-passphrase-leaves-copies-outside-wlans-wiped-buffers.md.Supplicant::newrefusal of the chosen BSS fails the join rather than trying the next one.planchecks the same rules, so the refusal is a disagreement between the two, refused by name.Next
W5 (bring-up and passive scan on the T14's AX210) depends on P1's bench exits, P4 (landed), W3 (landed) and this. It also needs the test networks: a WPA2-Personal and a WPA3-Personal access point at the T14's bench, which the orchestrator owns. A WPA2 join on the T14 is W6. W6 also needs P8, because a platform with no transmit table transmits nothing. The AMD bench's AX200 is W7, after P2 and P3.
🤖 Generated with Claude Code