TCP/IP for Plurix
The Plurix Operating System implements a persistent Distributed Shared Memory (DSM). Within the Plurix Cluster all nodes communicate via the DSM avoiding traditional message-passing techniques. Additionally, we need access to the Internet and non-Plurix machines for data exchange and backup services. Connectivity to the non-Plurix world requires TCP/IP networking. Therefore an implementation of a TCP/IP network protocol stack is the goal of this project. TCP/IP includes also protocols like UDP, ARP, and ICMP. The protocol suite will be a clean-room implementation using Plurix Java. Existing source texts cannot be adopted due to the transactional DSM and runtime restrictions of Plurix Java.

All Plurix transactions should be short to minimize collision probability with other nodes. However, network connections may be long-living and must be partitioned into several small transactions. Of course the state must survive between these transactions. A blocking receive behaviour should be emulated to simplify message-passing programming. Unfortunately, Plurix transactions cannot block as traditional processes and threads can.

The existing IO-Interface named "SmartBuffers" residing between transaction and interrupt-space will be the base for the network protocols to be developed in this project. Interrupt driven events like network packets are preserved in the SmartBuffer until the event comsuming transaction commits successfully.

One of the design goals is small and readable code, while providing reasonable functionality. This can be achieved using an object-oriented approach. On reception each network packet is converted into an object. We avoid heavy use of casts, record mapping, pointer-arithmetics, and bit-field-puzzling which is done only once in serialize/deserialize methods.

Another important design goal is security and stability. All possible input values need to be tested, and incorrect packets must be silently ignored e.g. teardrop, winnuke, and ping of death. Buffer overflow exploits are impossible as we do not use pointers, and arrays access is guarded by boundary checks.

Markus Schaber - Semester Project 2000
Department of Distributed Systems, University of Ulm