mirror of
https://github.com/jmcorgan/fips.git
synced 2026-08-09 00:04:54 +00:00
Node::enable_app_owned_tun() lets an embedder that owns the TUN fd (e.g. an Android VpnService) exchange IPv6 packet bytes with FIPS over channels instead of FIPS creating a system TUN device. It returns (app_outbound_tx, app_inbound_rx): the embedder pushes packets read from its fd into the outbound sender (app -> mesh) and pulls packets destined for its fd from the inbound receiver (mesh -> app). Called after Node::new and before start(), mirroring control_read_handle(). start() now gates TunDevice::create on tun_tx being unset, so when the app-owned channels are pre-installed it skips system-TUN creation and does no system-TUN ops. The inbound IPv6-shim delivery already writes to tun_tx, and run_rx_loop already drains tun_outbound_rx into handle_tun_outbound, so both directions reuse the existing wiring. Packets entering via app_outbound_tx bypass the system-TUN reader's handle_tun_packet, so the embedder must push only fd::/8-destined packets (FIPS no longer filters the destination) and clamp TCP MSS on outbound SYNs; the rustdoc and the IPv6-adapter design doc spell this out. Tests: app_owned_tun_seam_wires_channels covers the channel round-trip and the Active state; start_skips_system_tun_when_app_owned runs start() and asserts no named system device is created (tun_name stays unset).