Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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) :

  1. Multicast UDP. air-socket::udp note « 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).
  2. Codec DNS. air-socket::dns ne 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 dans air-mdns dupliquerait 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 (via ip_mreq/ipv6_mreq + setsockopt_bytes couche 0), leave_multicast_*, set_multicast_loop, set_multicast_ttl/_hops, set_multicast_interfacefonctions dédiées typées (jamais d’setsockopt brut 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::dns ré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) puis couche-1-v1.x (air-socket multicast + DNS codec).
  • Fuzz : le codec DNS étendu re-fuzzé (fuzz_dns_parse couvre déjà les noms compressés ; étendre aux records SRV/TXT/PTR).

Conséquences

  • air-mdns débloqué : joint le groupe multicast (pilote I/O) + réutilise le codec DNS (noms + SRV/TXT/PTR) sans duplication.
  • air-socket grandit (multicast + DNS public) ; consommateurs existants inchangés.
  • Précédent : les futures options structurées (SO_LINGER, timeouts) réutiliseront setsockopt_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_mreq et les pousser via un setsockopt entier détourné — impossible (optlen == 4 only) ; un vrai setsockopt structuré 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) puis air-socket (multicast + DNS codec) ; tags après barrière 2 arches. Câblage : registre, SUMMARY, INDEX.