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-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 rendent EINVAL pour optlen != 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 longueur usize → u32 au 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).