ADR-080 — Additifs air-socket : multicast UDP typé + codec DNS étendu (SRV/TXT/PTR) — descellement additif couche-1-v1.x + couche-0-v1.12 (setsockopt structuré)
Statut : Accepté (délégation additive, ADR-065 §Gouvernance — additifs neutres, non-sécurité). RFC de structure
(ADR-015). Modèle : descellements additifs
ADR-070/ADR-071
(couche 0) et ADR-062 (couche 1). Consommateur cible :
air-mdns (L2) / air-network::AirBrowser.
Catégorie : Descellement additif de la couche 1 scellée (air-socket) +
additif couche 0 (setsockopt structuré). Aucune rupture ; jalons conservés.
Contexte
La spec air-mdns (mDNS/DNS-SD, L2) a révélé deux
manques dans air-socket (L1, scellée) :
- Multicast UDP.
air-socket::udpnote « multicast à ajouter typé au besoin ». mDNS exige de joindre un groupe multicast (224.0.0.251:5353/ff02::fb). Or rejoindre un groupe =setsockopt(IP_ADD_MEMBERSHIP, ip_mreq)— une option à structure, que la couche 0 ne sait pas poser : ADR-071 n’a exposé que les sockopts à valeur entière (optlen == 4), excluant explicitement les options structurées (SO_LINGER,ip_mreq… — limitation D-M4.1). - Codec DNS.
air-socket::dnsne décode que les enregistrements A/AAAA (pour la résolution) et son codec de noms (compression bornée) est privé. mDNS a besoin du même codec de noms + des types SRV/TXT/PTR (DNS-SD). Le réécrire dansair-mdnsdupliquerait une surface de parsing hostile — contraire à la règle des 80 % (ADR-024) et au patron sans-IO (« le parseur hostile, décodé une fois »).
Décision
Deux additifs, purement additifs (aucune signature existante modifiée).
(1) Couche 0 — couche-0-v1.12 : setsockopt structuré
Lève la limitation D-M4.1 d’ADR-071 : ajouter un wrapper setsockopt à optval
octets borné (setsockopt_bytes(sock, level, optname, &[u8])) — permet de poser
ip_mreq/ipv6_mreq (et, plus tard, SO_LINGER/timeouts structurés). Réutilise le
syscall setsockopt déjà appelé en interne (le helper setsockopt_i32 existe) →
aucun nouveau syscall, juste une variante à buffer. level/optname restent les
entiers bruts (validés kernel), l’optval est un slice de longueur bornée fournie par
l’appelant.
(2) Couche 1 — air-socket (descellement additif couche-1-v1.x)
- Multicast UDP typé sur
AirUdpSocket:join_multicast_v4/join_multicast_v6(viaip_mreq/ipv6_mreq+setsockopt_bytescouche 0),leave_multicast_*,set_multicast_loop,set_multicast_ttl/_hops,set_multicast_interface— fonctions dédiées typées (jamais d’setsockoptbrut exposé, cf. ADR-021 conv. 3). - Codec DNS exposé + étendu : promouvoir le codec de noms (encodage/décodage,
compression suivie avec borne — l’invariant anti-boucle existant) en module
public sans-IO
air-socket::dnsréutilisable, et ajouter les types SRV/TXT/PTR (+ A/AAAA existants). Le résolveur A/AAAA existant est inchangé (il consomme le même codec).
Zéro-C maintenu (check-c-surface vert) ; zéro unsafe exposé ; parsing borné.
Gouvernance
- Additifs neutres (non-sécurité) → délégation additive (ADR-065) : traités par le superviseur (ADR de descellement + tags), sans ratification au cas par cas.
- Tags après implémentation + barrière 2 arches (ADR-072) :
couche-0-v1.12(setsockopt_bytes) puiscouche-1-v1.x(air-socketmulticast + DNS codec). - Fuzz : le codec DNS étendu re-fuzzé (
fuzz_dns_parsecouvre déjà les noms compressés ; étendre aux records SRV/TXT/PTR).
Conséquences
air-mdnsdébloqué : joint le groupe multicast (pilote I/O) + réutilise le codec DNS (noms + SRV/TXT/PTR) sans duplication.air-socketgrandit (multicast + DNS public) ; consommateurs existants inchangés.- Précédent : les futures options structurées (
SO_LINGER, timeouts) réutiliserontsetsockopt_bytes(couche 0).
Alternatives rejetées
- Dupliquer le codec DNS dans
air-mdns— duplique une surface de parsing hostile, double le fuzzing, viole la règle des 80 %. Rejeté. - Construire les octets
ip_mreqet les pousser via unsetsockoptentier détourné — impossible (optlen == 4only) ; un vraisetsockoptstructuré est de toute façon nécessaire. Rejeté. - Mettre le multicast/DNS-SD ailleurs qu’
air-socket— le multicast UDP est du ressort du socket (L1) ; le codec DNS y vit déjà. Rejeté.
Suite
- Section « Additifs planifiés » ajoutée à la spec
air-socket. - Implémentation :
couche-0-v1.12(setsockopt_bytes) puisair-socket(multicast + DNS codec) ; tags après barrière 2 arches. Câblage : registre, SUMMARY, INDEX.