docs(core): add Network Membrane technical documentation
This commit is contained in:
parent
068fc732a6
commit
96ee0a0112
|
|
@ -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).
|
||||||
Loading…
Reference in New Issue