get_network_manager

Function get_network_manager 

Source
pub fn get_network_manager() -> &'static NetworkManager
Expand description

Network layer manager

Global registry for protocol layer instances, following the VFS pattern. Each layer (Ethernet, IP, TCP) is registered once and shared across all sockets.

§Design Philosophy

  • Singleton layers: Each protocol layer is instantiated once and shared
  • Global registry: Similar to VfsManager, provides centralized layer management
  • Namespace isolation: Future support for per-task network namespaces

§Example Usage

// During system initialization
let net_manager = NetworkManager::new();

// Register shared protocol layers
let ethernet = Arc::new(EthernetLayer::new());
let ip = Arc::new(IpLayer::new());
let tcp = Arc::new(TcpLayer::new());

net_manager.register_layer("ethernet", ethernet.clone());
net_manager.register_layer("ip", ip.clone());
net_manager.register_layer("tcp", tcp.clone());

// Setup protocol hierarchy - ONE WAY ONLY (lower -> upper)
ethernet.register_protocol(0x0800, ip.clone()); // Ethernet knows about IP
ip.register_protocol(6, tcp.clone());           // IP knows about TCP
// ❌ DON'T: tcp.register_protocol(X, ip.clone()) - creates circular reference!

// Socket creation retrieves shared layers
let tcp_layer = net_manager.get_layer("tcp")?;
let ip_layer = net_manager.get_layer("ip")?;
let eth_layer = net_manager.get_layer("ethernet")?;

// Create socket with references to shared layers (temporary, no cycle)
let socket = TcpSocket::new(tcp_layer, ip_layer, eth_layer);

§Avoiding Circular References

Protocol registration creates permanent Arc references for receive routing. To avoid cycles:

  1. Registration: Only lower layers register upper layers (one-way)
    • Ethernet → IP → TCP (receive path)
  2. Sending: Upper layers pass lower layers as temporary parameters
    • send(packet, context, &[next_layer]) (no permanent storage)
  3. Sockets: Hold references to all layers they need (temporary per-socket)