Skip to content

Network Layers

opencode-agent[bot] edited this page May 10, 2026 · 1 revision

Network Layers

JNode's three-layer OSI network architecture (LinkLayer, NetworkLayer, TransportLayer) with SocketBuffer as the packet container and NetworkLayerManager as the central registry.

Overview

JNode implements a strict three-layer OSI protocol architecture. Each layer is an interface that receives SocketBuffer packets, strips its own header, and passes the buffer upward. NetworkLayerManager is the central registry that routes incoming packets from link layer to the appropriate network layer based on protocol ID.

Key Components

Class / File Role
net/src/net/org/jnode/net/LinkLayer.java OSI datalink layer interface; handles frame type filtering
net/src/net/org/jnode/net/NetworkLayer.java OSI network layer interface; registers TransportLayers, routes packets
net/src/net/org/jnode/net/TransportLayer.java OSI transport layer interface; provides SocketImplFactory for sockets
net/src/net/org/jnode/net/SocketBuffer.java Packet container with header chaining (LinkLayerHeader/NetworkLayerHeader/TransportLayerHeader)
net/src/net/org/jnode/net/LayerHeader.java Base header interface with prefixTo() and finalizeHeader()
net/src/net/org/jnode/net/NetworkLayerManager.java Central registry: bind network layers by protocol ID, deliver packets
net/src/net/org/jnode/net/service/DefaultNetworkLayerManager.java Plugin-based implementation of NetworkLayerManager
net/src/net/org/jnode/net/ipv4/layer/IPv4NetworkLayer.java Concrete IPv4 network layer implementation

How It Works

1. Packet Flow

Network Device (RTL8139, etc.)
  → NetDeviceAPI.receive(SocketBuffer)
    → NetworkLayerManager.receive(skbuf)
      → NetworkLayer.receive(skbuf, NetDeviceAPI)  [based on protocol ID]
        → TransportLayer.receive(skbuf)             [based on IP protocol field]
          → SocketImplFactory → java.net.Socket

2. SocketBuffer (sk_buff)

SocketBuffer is the packet container inspired by Linux's sk_buff. As a packet travels up the stack, each layer:

  1. Parses its header by creating a *Header object from the buffer
  2. Strips the header bytes via skbuf.pull(header.getLength())
  3. Stores the header object via skbuf.setNetworkLayerHeader(header) for upper layers

The buffer maintains three header slots:

private LinkLayerHeader linkLayerHeader;
private NetworkLayerHeader networkLayerHeader;
private TransportLayerHeader transportLayerHeader;

LayerHeader provides prefixTo(SocketBuffer) for outgoing packets and finalizeHeader() for checksum finalization.

3. NetworkLayerManager

The manager is obtained via InitialNaming.lookup(NetworkLayerManager.NAME) and provides:

  • receive(SocketBuffer) — broadcasts to all matching NetworkLayers (clones if needed)
  • getNetworkLayer(int protocolID) — lookup by protocol ID (e.g., 0x0800 for IPv4)
  • getNetworkLayers() — enumerate all registered layers

Implemented by DefaultNetworkLayerManager which loads layers from plugin extension points.

4. NetworkLayer Interface

NetworkLayer is the core routing layer. Key responsibilities:

  • getProtocolID() — returns the Ethernet protocol ID (e.g., ETH_P_IP = 0x0800)
  • registerTransportLayer(TransportLayer) — attach transport protocols (TCP, UDP, ICMP)
  • receive(SocketBuffer, NetDeviceAPI) — process incoming packets

The IPv4 implementation (IPv4NetworkLayer) maintains a HashMap<Integer, IPv4Protocol> of transport protocols and routes packets via deliver(hdr, skbuf).

5. TransportLayer Interface

TransportLayer delivers data to socket factories:

  • getSocketImplFactory() — for stream sockets (TCP)
  • getDatagramSocketImplFactory() — for datagram sockets (UDP)
  • receive(SocketBuffer) — process incoming data

TCPProtocol registers its TCPSocketImplFactory with the JVM at startup. UDPProtocol similarly provides UDPDatagramSocketImplFactory.

Layer Manager Plugin Registration

Layers are registered via plugin descriptors using JNode's extension point mechanism:

<extension-point id="networkLayers"/>
<extension point="...networkLayers">
  <networkLayer class="org.jnode.net.ipv4.layer.IPv4NetworkLayer"/>
</extension>

NetPlugin creates the DefaultNetworkLayerManager from the extension point and binds it to InitialNaming.

Gotchas

  • Packet cloning: If multiple NetworkLayers match a packet's type and device, the manager clones the SocketBuffer before delivering to each, to avoid concurrent modification.
  • Checksum validation: Each layer validates checksums before processing. IPv4NetworkLayer.receive() drops packets with bad IP checksums; similarly for TCP and UDP.
  • Fragment reassembly: IPv4 handles fragments via IPv4FragmentList with a timeout (IP_FRAGTIMEOUT). Fragments are reassembled before delivery to transport layers.
  • ARP cache update: IPv4NetworkLayer.receive() automatically updates the ARP cache from the incoming packet's source addresses before processing.
  • IPv4Protocol duality: IPv4Protocol is both a NetworkLayer (registered with NetworkLayerManager) and a TransportLayer (registered with IPv4NetworkLayer).

Related Pages

Clone this wiki locally