J’ai acheté une carte Wi-Fi 6E, puis le noyau publié a contredit sa propre branche `master`
L’A8000 voyait 92,5 % de trafic qu’une carte ac aurait manqué ; sa fonction active monitor avait disparu seulement dans un futur de Linux que je ne faisais pas tourner.
Le Wi-Fi a conservé une qualité des radios analogiques : pour savoir ce qui se passe dans l’air, il faut être au bon endroit avec le bon récepteur. Il y a ajouté une pile logicielle où le constructeur, le micrologiciel, le pilote, le noyau et iw peuvent chacun décrire une capacité différente. L’onde ne lit aucune de ces fiches ; elle se contente de passer, ce qui manque franchement d’esprit d’équipe.
Je cherchais un renifleur permanent pour un réseau Wi-Fi 6. Une carte 802.11ac ancienne aurait offert un pilote mûr et un mode moniteur connu. Elle aurait aussi été incapable de démoduler les PPDU HE qui portent les données 802.11ax. J’ai donc acheté une NETGEAR A8000, adaptateur 6E fondé sur le MediaTek MT7921AU, puis j’ai lu le code du noyau pour vérifier sa capacité la plus étrange : active monitor, le mode où un renifleur acquitte les trames unicast qu’il reçoit.
La branche master disait que la famille désactivait cette fonction. La carte branchée disait l’inverse. Pour une fois, le matériel n’avait pas trahi la documentation : j’avais consulté un futur du pilote qui n’existait dans aucun noyau publié.
Une carte ac aurait observé le préambule et raté la conversation
Le mode moniteur n’est pas une caméra universelle. Le récepteur doit encore savoir démoduler la couche physique employée. Une radio 802.11ac sait lire les balises et les trames de contrôle héritées d’un réseau ax, puis peut rester aveugle aux données HE. Elle produit alors un fichier PCAP très vivant où les clients semblent s’acquitter abondamment de paquets que personne n’a vus.
Vingt-cinq secondes de transfert réel sur le canal 40 ont quantifié le choix :
| Couche physique | Trames reçues | Vue par une radio ac |
|---|---|---|
| 802.11ax HE | 337 469 | aucune |
| 802.11a OFDM hérité | 27 286 | toutes |
| 802.11ac | 7 | toutes |
Une carte ac aurait ignoré 92,5 % des trames. Elle aurait pourtant capturé les balises, RTS, CTS et block-ack nécessaires pour rendre son mensonge plausible. Le surcoût d’une radio ax n’achetait donc pas une ligne plus longue dans une fiche produit ; il achetait le droit de voir ce que le réseau transportait réellement.
Le radiotap fourni par l’A8000 contenait HE_SU, le BSS Color 0x27, le MCS, le garde de 0,8 µs, l’allocation de RU et des débits jusqu’à 286,8 Mbit/s. La documentation mac80211 décrit les champs HE que la pile remplit depuis l’état de réception. Deux chaînes rendaient aussi leur signal en dBm. Pour suivre une approche, cette paire de mesures vaut davantage qu’une puissance recomposée après coup.
Le poste est resté associé pendant toute la capture. La carte USB observait le canal pendant que l’interface interne transportait le transfert, sans la coupure de quatre-vingts secondes imposée par certains outils embarqués qui balayent les canaux. Linux Wireless rappelle qu’une interface moniteur peut coexister avec une interface normale, tout en précisant que le résultat reste best effort selon le matériel. La réserve était documentée ; l’absence de coupure, elle, était mesurée.
master avait déjà retiré une fonction encore livrée partout
mac80211 ajoute inconditionnellement le type d’interface moniteur aux pilotes qui s’appuient sur lui. Active monitor est autre chose : un drapeau de fonction indique que la radio peut acquitter les trames reçues. Dans mt76, la garde était simple :
if (!phy->no_active_monitor)
wiphy->features |= NL80211_FEATURE_ACTIVE_MONITOR;
La branche master de mt792x_core.c posait no_active_monitor. J’en ai conclu que l’A8000 ne pouvait pas fournir cette capacité. La lecture semblait plus solide qu’une fiche commerciale : le code du pilote, sous les yeux, au plus près du matériel.
La carte a répondu en une seconde :
$ iw phy phy1 info | grep -i "active monitor"
Device supports active monitor (which will ACK incoming frames)
Les six drapeaux de moniteur, dont active, étaient acceptés. L’AX201 interne du portable, sur la même pile mac80211, ne publiait pas la fonction : ce n’était donc pas une annonce générique ajoutée à tous les périphériques.
Il restait à comparer le code réellement livré. La ligne qui désactive la fonction était absente de Linux 6.8, des versions 6.9 à 6.17, du 6.18 du Raspberry Pi et même de 6.19. Elle vivait seulement dans master. La source amont était vraie ; elle répondait à la question « que fera une prochaine version ? ». Mon noyau répondait à « que fait cette machine ? ». J’avais posé la seconde et apporté la première au tribunal.
Le pilote et sa branche publiée sont donc devenus des coordonnées de la mesure, pas des oracles. Une lecture de HEAD sans uname -r reste une documentation d’anticipation, catégorie très appréciée lorsque l’on veut diagnostiquer le présent avec des faits qui ne lui sont pas encore arrivés.
Le drapeau none n’était pas vide
Le même piège s’est ensuite présenté dans une commande apparemment inoffensive. Pour une écoute passive, je voulais désactiver active monitor et remettre les options « à rien » :
iw dev wlan1 set monitor none
Sur le Raspberry Pi, quatre captures successives dans la même position ont donné ceci :
| Configuration | Trames | Balises | Émetteurs |
|---|---|---|---|
| interface neuve, défaut du pilote | 1 159 | 487 | 8 |
set monitor none |
84 | 0 | 3 |
| interface neuve, témoin répété | 1 053 | 485 | 8 |
otherbss control |
1 068 | 484 | 8 |
none ne signifiait pas « aucun drapeau spécial ». Il effaçait notamment otherbss, donc la radio cessait de remonter les autres BSS. Le PCAP restait non vide et techniquement valide ; il ne contenait plus aucune des 487 balises qui auraient signalé son angle mort. Le défaut du pilote était le bon réglage. La commande destinée à ne rien imposer imposait précisément l’aveuglement.
Pour retrouver un vrai défaut, modifier une interface encore en mode managed ne suffisait pas : set freq rendait Device or resource busy et la capture zéro trame. Il fallait supprimer l’interface puis la recréer explicitement :
iw dev wlan1 del
iw phy phy1 interface add wlan1 type monitor
Les drapeaux ne se relisent pas tous dans iw dev info. Le témoin reste donc la capture comparative : balises connues, autres BSS et trames de contrôle, pas seulement un code de sortie nul.
La radio émettait ; sa propre capture ne pouvait pas le prouver
Active monitor transforme le capteur en participant : il acquitte et devient détectable. La surveillance passive le laisse éteint ; une session active doit être explicite. Avant même de mesurer les ACK, il fallait savoir si l’injection traversait réellement l’antenne.
Une socket brute a accepté 80 trames inoffensives avec un en-tête radiotap minimal. La propre capture de l’A8000 les montrait toutes. Cette présence ne prouvait rien sur l’air : mac80211 reboucle la voie d’émission vers l’interface moniteur, avec le radiotap fourni par l’émetteur. Le paquet pouvait être visible avant la radio et ne jamais quitter le câble USB.
Une borne indépendante, figée sur le canal 40, a servi d’oreille. Elle a reçu les 80 trames sur 80 à environ −60 dBm, avec son radiotap de réception plutôt que celui de l’injecteur. Le code de sortie, le compteur TX et la capture locale établissaient que le noyau acceptait l’opération ; le second récepteur établissait que l’antenne rayonnait. La documentation radiotap explique ce contrat entre pilotes et mac80211, mais seule une autre radio ferme la couture physique.
L’acquittement automatique promis par active monitor n’a pas encore été observé sur une trame tierce. L’injection est donc prouvée, la fonction est annoncée et acceptée, mais son effet ACK reste ouvert. Une ligne de iw phy n’a pas gagné le droit de se faire passer pour une capture aérienne simplement parce qu’elle confirmait enfin mon achat.
Le bon récepteur, au mauvais bout de la pièce
Déplacée sur le Pi destiné à la collecte, la carte a rencontré un autre type de limite. Les trames HE de la station proche à −73,8 dBm étaient décodées ; celles du portable à −86,3 dBm ne l’étaient pas. Pourtant 8 517 block-ack de ce portable arrivaient. Les données existaient, leurs accusés existaient et seul leur débit robuste différait. Une trame de contrôle à 24 Mbit/s survivait là où un PPDU HE à 86,7 Mbit/s n’offrait plus assez de rapport signal/bruit.
Le mode moniteur fonctionnait. La carte savait démoduler HE. La pièce décidait quelles stations lui accordaient les conditions nécessaires. Un capteur n’est pas « compatible Wi-Fi 6 » dans l’absolu ; il est compatible à une puissance, un canal, un MCS et un emplacement.
Les prises à conserver forment donc une petite matrice :
PHY compter HE et OFDM, pas seulement les trames totales
version uname -r puis tag Git correspondant, jamais master seul
capacité iw phy ... info avec un témoin négatif sur une autre carte
drapeaux comparer interface neuve, none et otherbss control
injection second récepteur et radiotap de réception indépendant
couverture données HE croisées avec signal et block-ack hérités
Le chantier a acheté une carte 6E pour écouter un réseau 5 GHz, consulté un noyau futur pour diagnostiquer un noyau présent et rendu une radio presque aveugle en lui demandant de n’appliquer aucun drapeau. En échange, 92,5 % du trafic ont cessé d’être invisibles et chaque limite restante porte désormais son témoin.
La branche master finira peut-être par rejoindre la machine et retirer active monitor. Pour l’instant, le matériel supporte une fonction que son avenir logiciel refuse déjà. L’obsolescence programmée gagne du temps : elle commence maintenant avant la sortie de la version qui la programme.