docs(core): add Network Membrane technical documentation

This commit is contained in:
Markus Maiwald 2026-01-06 18:40:30 +01:00
parent 068fc732a6
commit 96ee0a0112
1 changed files with 60 additions and 0 deletions

60
docs/Network_Membrane.md Normal file
View File

@ -0,0 +1,60 @@
# Nexus Network Membrane (Grafted LwIP)
**Status:** Experimental / Grafted (Phase 1)
**Version:** v0.1 (Hybrid Polling)
**Location:** `core/rumpk/libs/membrane`
## Overview
The Network Membrane is a userland networking stack running inside the `init` process (Subject Zero). It provides TCP/IP capabilities to the Nexus Sovereign Core by "grafting" the lightweight IP (LwIP) stack onto the Nexus ION (Input/Output Nexus) ring architecture.
This implementation follows **SPEC-017 (The Network Membrane)** and **SPEC-701 (The Sovereign Network)**.
## Architecture
### 1. The Graft (LwIP Integration)
Nexus avoids writing a TCP/IP stack from scratch for Phase 1. Instead, we compile LwIP as a static library (`libnexus.a`) linked into the userland payload.
* **Mode:** `NO_SYS` (No OS threads). LwIP is driven by a single event loop.
* **Memory:** Static buffers (Pbufs) managed by `ion_client`.
### 2. The Glue (`net_glue.nim`)
Bridging Nim userland and C LwIP:
* **`pump_membrane_stack()`**: The heartbeat function. It must be called repeatedly by the main loop. It:
* Checks `sys_now()` for timer expiration (DHCP fine/coarse, TCP fast/slow).
* Polls `ion_net_rx` for inbound packets from the Kernel (NetSwitch).
* Injects packets into `netif->input`.
* **`ion_linkoutput`**: The LwIP callback to send packets. Uses `ion_net_tx` to push packets to the Kernel.
### 3. Syscall Interface
LwIP requires system services provided via `libc.nim` and the `SysTable`:
* **`sys_now()`**: Returns monotonic time in milliseconds using `rdtime` (via `syscall_get_time_ns`).
* **`printf/abort`**: Mapped to `console_write` syscalls.
## Current Limitations (v1.1.1)
### 1. The "Busy Wait" Workaround
**Issue:** The kernel Scheduler currently lacks a hardware Timer Driver for `wfi` (Wait For Interrupt).
**Symptom:** Calling `nanosleep` (0x65) puts the fiber to sleep forever because no timer interrupt wakes the CPU.
**Workaround:** `init.nim` uses a busy-wait loop (`while sys_now() - start < 10: yield()`). This keeps the network stack responsive but results in high CPU usage.
**Fix Planned:** Implement ACLINT/SBI Timer driver in HAL.
### 2. No IP Acquisition (Ingress)
**Issue:** While Egress (DHCP DISCOVER) works and is verified, no Ingress packets (DHCP OFFER) are received.
**Suspected Cause:** VirtIO interrupts might be masked or not delegated correctly, preventing `NetSwitch` from seeing inbound traffic.
## Usage
The stack is initialized automatically by `init`:
```nim
import libs/membrane/net_glue
membrane_init()
while true:
pump_membrane_stack()
# Sleep/Yield
```
## Logs & Debugging
* **Egress:** grep for `[Membrane] Egress Packet`
* **Timers:** grep for `[Membrane] DHCP Fine Timer`
* **Packet Dump:** Enable `LWIP_DEBUG` in `lwipopts.h` (requires recompile).