-
Notifications
You must be signed in to change notification settings - Fork 0
Network Layers
JNode's three-layer OSI network architecture (LinkLayer, NetworkLayer, TransportLayer) with SocketBuffer as the packet container and NetworkLayerManager as the central registry.
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.
| 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 |
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
SocketBuffer is the packet container inspired by Linux's sk_buff. As a packet travels up the stack, each layer:
- Parses its header by creating a
*Headerobject from the buffer - Strips the header bytes via
skbuf.pull(header.getLength()) - 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.
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.,0x0800for IPv4) -
getNetworkLayers()— enumerate all registered layers
Implemented by DefaultNetworkLayerManager which loads layers from plugin extension points.
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).
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.
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.
-
Packet cloning: If multiple NetworkLayers match a packet's type and device, the manager clones the
SocketBufferbefore 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
IPv4FragmentListwith 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:
IPv4Protocolis both aNetworkLayer(registered withNetworkLayerManager) and aTransportLayer(registered withIPv4NetworkLayer).
- Network-Stack — Hub page for the complete network stack
- Sockets-Implementation — How TCP/UDP sockets connect to TransportLayers
- ARP — IPv4-to-MAC resolution at the link layer
- Driver-Framework — How network device drivers expose NetDeviceAPI