ADR-071 — Descellement additif couche-0 : setsockopt/getsockopt à valeur entière publics pour la face libc
Statut : Accepté (2026-07-07, décision BDFL — exposer les helpers d’options entières existants plutôt que les redéfinir côté libc ; sous la délégation des re-sceaux additifs du superviseur, ADR-065, cadre libc ADR-051). RFC d’extension de couches scellées (ADR-015). Sert le jalon M4 réseau (ADR-069, Lot 3.d). Compagnon d’ADR-070.
Catégorie : Descellement additif de la couche 0 scellée. Aucun symbole existant
modifié. Tag de re-sceau couche-0-v1.10 DIFFÉRÉ et GROUPÉ avec ADR-070 (les deux
descellements couche 0 du jalon M4 sont scellés ensemble) et le re-sceau
couche-1-v1.6.
Contexte
Les shims libc setsockopt/getsockopt doivent poser/lire les options de socket que
bind/connect/OpenSSH utilisent (SO_REUSEADDR, TCP_NODELAY, SO_KEEPALIVE,
SO_ERROR, IP_TOS, IPV6_V6ONLY…). La quasi-totalité de ces options sont des
valeurs entières (optlen == 4).
La couche 0 possède déjà les helpers getsockopt_i32/setsockopt_i32 (au-dessus des
syscalls bruts), mais en pub(crate) — consommés par les setters typés
(set_so_reuseaddr, set_tcp_nodelay…). La face libc a besoin d’un accès générique
par level/optname bruts (le C fournit ces entiers).
Décision
La couche 0 expose deux fines fonctions publiques déléguant aux helpers internes inchangés :
#![allow(unused)]
fn main() {
// crates/air-sys-syscall/src/net.rs
pub fn set_socket_option_int(sock: BorrowedFd, level: i32, optname: i32, value: i32) -> Result<(), Errno>;
pub fn get_socket_option_int(sock: BorrowedFd, level: i32, optname: i32) -> Result<i32, Errno>;
}
level/optname sont les entiers bruts du C (validés par le kernel). La libc
(air-libc-socketio::sockopt) les appelle et rend la sémantique POSIX
(setsockopt/getsockopt).
Conséquences
- Positif : une seule implémentation du chemin
getsockopt/setsockopt(kernel = bible) ; couverture 100 % des deux fonctions. - ABI : purement additif ; re-sceau
couche-0-v1.10(tag différé, groupé ADR-070). - Limitation (D-M4.1) : les options à structure (
SO_LINGER,SO_RCVTIMEO…) ne sont pas exposées ici ; les shims libc rendentEINVALpouroptlen != 4. Élargissement (variante par octets) = descellement additif ultérieur si un consommateur l’exige. Décision guidée par le scope OpenSSH (options entières).
Alternatives rejetées
- Exposer une variante générique par octets (
&[u8]) : plus large, mais introduit une conversion de longueurusize → u32au bras d’erreur inatteignable (une option > 4 Gio n’existe pas), nuisant à la couverture 100 % de la couche scellée, sans bénéfice pour le scope M4. Reporté jusqu’à un besoin réel. - Réimplémenter le chemin d’option dans la libc : dupliquerait l’appel syscall brut ; rejeté (une seule autorité, cf. ADR-070).