Ouroboros Implementation Overview
This page gives an overview of what the Ouroboros prototype implements today. It follows the directory structure of the repository and, for each component, says what is there, what is partial and what is missing. It reflects the be branch at commit 2ae2baea (0.25.0 plus three commits, 8 October 2026). The to-do list lives on the kanban board. The road to a usable production version is long, and some big items, most prominently management of namespaces (ownership and scalability of service names), have not started.
Status words used below:
- done: implemented and exercised by unit or integration tests;
- partial: implemented with known gaps, listed next to it;
- missing: not implemented.
Library
src/lib builds three shared objects: libouroboros-common (shared-memory transport, crypto, hashing, serialisation, utilities), libouroboros-dev (the application API, FRCT and the points of attachment, compiled into one translation unit) and libouroboros-irm (the management API). Applications link -louroboros-dev; the irm tool links -louroboros-irm. Installed headers: cep.h, cdefs.h, dev.h, errno.h, fccntl.h, fqueue.h, ipcp.h, irm.h, name.h, proto.h, qos.h, version.h.
Application API
Six calls in dev.h: flow_alloc, flow_accept, flow_join, flow_dealloc, flow_read, flow_write. Manual pages: flow_alloc(3), flow_read(3), fccntl(3), fset(3), fqueue(3).
| Function | Status | Notes |
|---|---|---|
| flow_alloc, flow_accept | done | Return a flow descriptor and write the negotiated QoS back. A NULL QoS means qos_raw. Authentication and encryption are set up by the IRMd (OAP, below) before the call returns. A stream service with loss > 0 is rejected. |
| flow_join | done | Joins a broadcast layer by layer name; always raw QoS. |
| flow_dealloc | done | Lingers until unacknowledged data is sent (FRCT linger flag), drains the transmit ring, then tells the IRMd. |
| flow_write | done | Raw flows: one packet per call, -EMSGSIZE above the MTU. FRCT flows: waits for the window; message flows fragment SDUs larger than the MTU (SDU-atomic); stream flows chunk. |
| flow_read | done | Partial reads unless FLOWFRNOPART is set; FRCT reassembles before delivery. |
| fccntl | done | Send and receive timeouts, flags, QoS spec, queue lengths, MTU, transmit queueing delay; FRCT flags, maximum SDU, stream ring size, minimum RTO. Not yet in fccntl(3): FLOWGMTU, FRCTSMAXSDU, FRCTSRRINGSZ, FRCTSRTOMIN and their getters. |
| fset, fqueue, fevent | done | Event types FLOW_PKT, FLOW_UP, FLOW_DOWN, FLOW_DEALLOC and FLOW_PEER (peer timed out). A flow belongs to at most one set; 32 sets per process. FLOW_PEER is not yet in fqueue(3); FLOW_ALLOC is declared but never raised. |
QoS. A qosspec_t carries the service class (raw, message, stream), delay, bandwidth, availability, loss, bit error rate, maximum gap and peer timeout. Six presets exist: qos_raw, qos_raw_safe, qos_rt, qos_rt_safe, qos_msg and qos_stream; _safe adds an integrity check, rt favours latency over reliability. The library acts on four fields: service selects FRCT, loss > 0 disables retransmission, ber = 0 adds a CRC32 trailer, and timeout drives the keepalive. Delay, bandwidth, availability and max_gap only choose the QoS cube (best effort, video, voice) inside the IPCP. The CRC32 trailer is switched off at build time by default (QOS_DISABLE_CRC).
Error codes. Ouroboros adds ENOTALLOC, EIPCPTYPE, EIRMD, EIPCP, EIPCPSTATE, EFLOWDOWN, EFLOWPEER, ENAME, ECRYPT, EAUTH and EREPLAY to errno.
FRCT
The Flow and Retransmission Control Task is the end-to-end protocol in the library. It runs for every flow with a message or stream service. The 16-byte header carries flags, a CRC-16 header checksum, window, sequence number and acknowledgement number; stream packets add an 8-byte byte-range extension.
| Feature | Status | Notes |
|---|---|---|
| Connection management | done | Delta-t style, no handshake: a data run flag on the first packet of a run, random initial sequence numbers rotated after inactivity, sender and receiver inactivity timers derived from MPL, A and R. FIN for teardown, linger on deallocation. |
| Acknowledgements | done | Delayed ACK (10 ms), ACKs piggybacked on data, SACK (up to 2048 blocks, MTU permitting), D-SACK for duplicates. |
| Loss recovery | done | RACK reorder window, tail loss probe, RFC 6582 style recovery, head-of-line retransmission on RTO. Integration-tested under loss, delay, duplication, reordering and corruption. |
| RTT and RTO | done | RFC 6298 estimator with the Linux deviation damping, Karn's rule, RTT probe packets, windowed minimum RTT over five minutes, exponential backoff bounded by the R timer. Minimum RTO about 1 ms, settable per flow. |
| Flow control | done | Receiver-advertised window, initial window of 128 packets, rendezvous when the window is closed. |
| Fragmentation and reassembly | done | SCTP-style first, middle and last flags; maximum reassembled SDU 1 MiB by default. |
| Stream service | done | Reliable ordered byte stream over a receive ring (1 MiB by default, up to 128 MiB). Tutorial 10. |
| Loss-tolerant ordered service | done | loss > 0: ordering and fragmentation without ACKs or retransmission. |
| Keepalive and peer liveness | done | When the QoS timeout is set; raises FLOW_PEER when the peer goes silent. |
| Integrity | done | CRC-16 header checksum always; CRC32 body trailer when ber = 0. |
| Statistics | done | About 70 counters per flow in the RIB under /tmp/ouroboros/proc.<pid> (PROC_FLOW_STATS, needs FUSE). Tutorial 08. |
| Timers | done | One hierarchical timer wheel per process, advanced from the API calls; no timer thread. |
| Congestion control | n/a | Not in FRCT by design; congestion avoidance lives in the unicast IPCP. |
Gaps: retransmissions keep a heap copy of each packet, so that path is not zero-copy; an RTO that exceeds the R timer retries nothing (noted in the source).
Encryption
Needs OpenSSL 3.0 or later. Without it every crypto call returns -ENOTSUP and a sec.conf is refused. libgcrypt is optional and only backs hashing and random numbers.
| Feature | Status | Notes |
|---|---|---|
| Data-plane ciphers | done | AEAD only: aes-128-gcm, aes-192-gcm, aes-256-gcm (default) and chacha20-poly1305. A 6-byte key selector travels as additional authenticated data; 12-byte nonce, 16-byte tag. |
| Key rotation | done | Per-flow HKDF tree: 128 node keys, per-direction leaf keys, one leaf per 2^20 packets; the selector holds a 4-bit epoch, 12-bit node and 32-bit sequence. Anti-replay window of 2048 packets. Lock-free key swap with liburcu, rwlock fallback. |
| Re-keying | done | Triggered by a packet-count watermark or by the IRMd's periodic re-key (every 120 s by default). The new seed comes from the IRMd; transmission switches once the peer is seen on the new key or after a grace period. Tutorial 07. |
| Key exchange | done | ECDH (prime256v1 by default, secp384r1, secp521r1, X25519, X448), FFDHE (2048, 3072, 4096), ML-KEM (512, 768, 1024) and the hybrids X25519MLKEM768, X448MLKEM1024, SecP256r1MLKEM768 and SecP384r1MLKEM1024. KEMs need OpenSSL 3.5. |
| KDF and digests | done | HKDF with sha256 (default), sha384, sha512, sha3-256, sha3-384, sha3-512, blake2b512 or blake2s256. |
| Secure memory | done | OpenSSL secure heap for key material, sized per process. |
Flows between an application and its IPCP are never encrypted: encryption is end-to-end between the applications.
Authentication
| Feature | Status | Notes |
|---|---|---|
| Certificates | done | X.509 from PEM or DER; trust anchors plus untrusted intermediates; chain verification, digitalSignature key usage, optional CA pinning, common-name check against the service name. |
| Signatures | done | Any OpenSSL key type: ECDSA, Ed25519 and Ed448, RSA, and with OpenSSL 3.5 the post-quantum ML-DSA and SLH-DSA. Classical keys sign with the configured digest; post-quantum keys bring their own. |
| Handshake | done | The exchange itself is OAP, in the IRMd (below). |
src/lib/ssm. Packets move between processes as offsets into POSIX shared memory; data is not copied as long as both sides use the same pool.
| Component | Status | Notes |
|---|---|---|
| Packet pools | done | A global shared packet pool (about 60 MB, for root and the ouroboros group) and one per-user pool (about 7.5 MB) per unprivileged user. Nine size classes from 256 B to 1 MiB, four shards per class, robust mutexes, reclaim of orphaned buffers after 60 s. The IRMd creates the pools; the IPCP copies between pools where needed. Tutorial 01. |
| Ring buffers | done | One per flow endpoint, 1024 slots of pool offsets. Out-of-band flags for flow down, peer gone and re-key. A transmit queueing-delay limiter (10 ms target, settable) keeps a reserve for retransmissions. |
| Flow sets | done | Per-process event queues behind fevent; drops redundant packet events when full, never control events. |
Points of attachment
src/lib/poa. A unicast or broadcast IPCP attaches to a lower network with irm ipcp poa attach; up to 16 per IPCP. The PoA code resolves peers, runs the flow request and reply through a 16-byte management message, carries the OAP handshake, and reads and writes the socket directly. A link monitor brings flows down and up with the interface.
| PoA | Status | Notes |
|---|---|---|
| Ethernet | done | DIX framing, ethertype 0xA000 by default, 5-byte header (EID, length, CRC-8). Backends: AF_PACKET raw sockets on Linux, BPF on BSD and macOS, netmap as an opt-in. Peers are found with a broadcast name query. Integration-tested on veth pairs and loopback, including link failover. Tutorial 04. |
| UDP | done | IPv4 and IPv6, port 3435 by default, 4-byte EID header, path MTU from the kernel on Linux. Host names are resolved by the IRMd. Integration-tested, including encrypted flows over an impaired link. Tutorial 05. |
Management API
irm.h, linked with -louroboros-irm. Every call is one request and reply to the IRMd over its Unix socket. IPCPs: create, destroy, bootstrap, enroll, connect, disconnect, list, set flags (transit). PoAs: attach, detach, list. Names: create (with a load-balancing policy and per-name security paths), destroy, list, register and unregister in a layer. Binding: bind and unbind a program (optionally auto-started) or a process to a name. Status: done. This is the API behind the irm tool, pyOuroboros and the configuration file.
Serialisation
protobuf-c messages define the control plane: model.proto (shared types), irm.proto (applications and IPCPs to the IRMd, 36 message codes), ipcp.proto (IRMd to IPCPs, 17 codes), ipcp_config.proto (bootstrap configuration), enroll.proto and cep.proto (connection establishment between IPCP components). Hand-written serialisers cover the hot paths. Hashes: SHA3-224, 256, 384 and 512 (also the directory hash), MD5, CRC-8, CRC-16, CRC-32 and CRC-64/NVMe with PCLMUL and PMULL acceleration.
Unit tests
src/lib/tests: authentication (ECDSA, ML-DSA, SLH-DSA), bitmap, B-tree, capacity estimator, ciphers, hashes, key exchange (DHE, ML-KEM and hybrids), key rotation, MD5, PoA addresses and frames, SHA3, sockets, time macros, thread pool, timer wheel. ssm/tests: pools, sharding, ring buffers, flow sets. crc/tests: known-answer vectors. dev.c, frct.c, irm.c and the PoA sockets have no unit tests; the integration suite covers them.
IRMd
src/irmd. The IPC Resource Manager daemon runs as root, one instance per system. Command line: --stdout (log to the terminal instead of syslog), --config <file>, --version. A systemd unit is installed when systemd is detected.
| Component | Status | Notes |
|---|---|---|
| Lifecycle | done | Opens the socket (/var/run/ouroboros/irm.sock) and the global packet pool, starts a thread pool (8 to 64 threads), loads the trust store from /etc/ouroboros/security/cacert and untrusted, and starts the acceptor, the sanitizer (cleans up after dead processes) and the re-key worker. A stale instance's resources are cleaned at start. On shutdown it terminates applications first, then IPCPs, with SIGKILL after 30 s. SIGHUP shuts down; it does not reload the configuration. |
| Registry | done | Flows, IPCPs, names, processes, programs, per-user pools and spawned children under one lock. Flow states: init, alloc pending, accept pending, allocated, dealloc pending, deallocated. |
| Names and binding | done | A name is bound to processes (by pid) or to programs (by path). Load balancing per name: round-robin or spillover. Auto-instantiation: a program bound with auto is started when a flow arrives for its name and nobody is accepting. Per-name security paths. Tutorial 03. |
| Flow allocation | done | Direct IPC between two processes on the same host without any IPCP, falling back to the first IPCP whose directory knows the name. The flow owner's uid is tracked so that per-user pools stay separate. Flow join for broadcast layers by layer name. |
| PoA flows | done | Flows an IPCP allocates over its own points of attachment are brokered by the IRMd, so they get the same OAP handshake as application flows. |
| Re-key worker | done | Every 120 s it re-keys encrypted flows in batches of 64; collisions are resolved in favour of the initiator; direct flows re-key in-process. |
| Configuration file | partial | TOML (tomlc17); DISABLE_CONFIGFILE builds without it. Stanzas [name.<n>], [local.<ipcp>], [broadcast.<ipcp>], [unicast.<ipcp>]. Creates, bootstraps or enrols IPCPs, attaches PoAs, registers names, binds programs with autostart and connects to peers. Gaps: connections are only made on the enrol path, not after a bootstrap; no disconnect, unbind or destroy; the first error aborts the daemon. |
| Authorisation | partial | The socket is world-writable and management commands carry no uid check. Peer credentials are checked for process announcements and flow updates only. |
OAP
The Ouroboros Allocation Protocol runs inside the IRMd on both sides of a flow allocation and travels as piggybacked data in the IPCP's flow request and reply. src/irmd/oap.
| Feature | Status | Notes |
|---|---|---|
| Header | done | 36-byte fixed part (128-bit id, 64-bit timestamp, cipher, KDF and digest identifiers, lengths), then certificate, key-exchange data, piggybacked data, response tag and signature. |
| Server authentication | done | Required by default on the client; the server's chain is verified and its common name must equal the service name. |
| Client authentication | done | Optional by default; auth=required in the server's sec.conf makes it mutual. |
| Key exchange | done | Ephemeral (EC)DHE, or a KEM with server-encapsulate (default) or client-encapsulate against a cached static server key. Cipher and KDF are negotiated upward only; downgrades are rejected. |
| Sealed responses | done | The server's certificate, data and signature are AEAD-sealed under a handshake key, hiding the server identity from the network. |
| Key confirmation | done | HKDF-derived tag checked in constant time; the session key is bound to the transcript. |
| Replay protection | done | 20 s timestamp window, replay cache of 4096 ids per generation, fails closed when full. |
| Re-keying | done | Certificate-less signed OAP exchange inside a flow update, verified against the cached peer certificate. |
| Anonymous flows | done | No certificates and no sec.conf gives an unauthenticated, unencrypted flow. |
The per-service security directories are /etc/ouroboros/security/server/<name>/ and client/<name>/, each with sec.conf, crt.pem and key.pem. sec.conf keys: kex, cipher, kdf, digest, kem_mode, auth, cacert and encryption=none. Tutorial 06 and Tutorial 07 show this in use.
Unit tests
reg/tests covers the registry objects, binding, waits and the flow state machine. oap/tests covers round trips for every suite, malformed input, downgrade attempts, replay, authentication failures, sealing and re-keying, with separate ML-DSA and ML-KEM tests. main.c, configfile.c and the IPCP RPC have no unit tests; the integration suite covers them.
IPCPs
src/ipcpd. There are three IPCP types: local, unicast and broadcast. Each is a separate binary (ipcpd-local, ipcpd-unicast, ipcpd-broadcast) spawned by the IRMd and implementing struct ipcp_ops.
Framework
ipcp.c provides the common machinery: the Unix socket to the IRMd, a thread pool (4 to 32 threads), the state machine (init, boot, operational, shutdown), the transit flag, PoA attach, detach and list, and the RIB. The RIB is a read-only FUSE file system under /tmp/ouroboros/<ipcp name> with info/ (state, type, layer), flow-allocator/ and dt.<addr>/ per-flow statistics (IPCP_FLOW_STATS), lsdb/ and dht/. Without FUSE the RIB is compiled out.
Common
| Component | Status | Notes |
|---|---|---|
| Enrolment | partial | The enrollee opens an enrolment connection, receives the full layer configuration and the peer's clock, starts its components and acknowledges. The enrolment exchange itself carries no credentials; the flow it runs over can be authenticated and encrypted by the layer below, which is how Tutorial 06 authenticates joining IPCPs. |
| Connection manager | done | Accepts and allocates component connections (Data Transfer, Management, Enrolment) with a connection-establishment exchange (cep.proto) that checks protocol name, version and syntax. Raises connection up, down and delete notifications. |
Local IPCP
Same-host loopback. It keeps a list of registered name hashes; a flow request is handed to the IRMd and the two endpoints are cross-linked; one packet loop moves packets between them, without copying inside one pool and with one copy across pools. MPL 50 ms, MTU 65000 bytes. No enrolment, connections or broadcast. Status: done.
Unicast IPCP
The full layer. Bootstrap parameters (irm ipcp bootstrap): hash (SHA3-224, 256, 384, 512), address size, EID size, maximum TTL, maximum RTT, routing (link_state, lfa, ecmp), DHT parameters (alpha, k, expiry, refresh, replication), congestion (none, mb-ecn), transit on or off, autobind. Tutorial 02.
| Component | Status | Notes |
|---|---|---|
| Flow allocator (fa) | done | Flow request, reply, update (ECN feedback), heartbeat and acknowledgement messages; 64-bit random endpoint ids; piggybacked OAP data; relays IRMd flow updates for re-keying. Per-flow statistics in the RIB. |
| Data transfer (dt) | partial | 16-byte header with the defaults: destination address, QoS cube, TTL, ECN, capacity code, EID. No source address. Forwards per QoS cube, decrements TTL, marks ECN from the egress queue, drops transit traffic when non-transit. By design it never fragments: fragmentation is end-to-end in FRCT, so the network does not repeat the IP fragmentation mistake. Gaps: the layer MTU is a fixed 1400 rather than derived from the path below, and forwarding uses the incoming flow's QoS cube rather than the header's. |
| Packet scheduler (psched) | done | Three QoS cubes (best effort, video, voice), two reader threads per cube, round-robin per flow with deadline-based pacing for congestion-controlled flows; real-time priorities outside containers. |
| Routing | partial | Link state: own-link origination with sequence numbers, flooding over management connections, full database sync to new neighbours, periodic refresh and timeout, Dijkstra with a hop-count metric. Variants: link_state (single next hop), lfa (loop-free alternates, switched in when a flow goes down), ecmp (equal-cost multipath, per-packet round-robin). Gaps: no link weights, no QoS-aware routing, one graph shared by all cubes. |
| Forwarding (pff) | done | A hash table per QoS cube with simple, alternate and multipath policies matching the routing variants. |
| Directory (dir) | partial | A Kademlia-style DHT keyed by name hash that stores the registering IPCP's address, with alpha, k, expiry, refresh and replication parameters, contact bootstrap from the enrolment peer, republish and replicate. Gaps: unregister is local only (remote copies expire), unresponsive contacts are not evicted, distance uses the first 64 bits of the hash. |
| Address authority | partial | Only flat: a random 32-bit address, no collision detection. |
| Congestion avoidance (ca) | done | none or mb-ecn: a rate-based controller with multi-bit ECN marking at every hop, the echoed mark averaged over a pricing window, a capacity code carried in each packet, slow start plus additive increase and proportional decrease, start-time fair queueing between flows sharing a path, heartbeat RTT samples. 64 unit tests, a shared-bottleneck simulation lab and 15 integration tests. Tutorial 09 and Tutorial 10. |
Broadcast IPCP
Enrolment, the connection manager and a flooding forwarder. flow_join checks that the destination is the hash of the layer name and adds the flow as a neighbour; each packet is written to every neighbour except the one it came from; a non-transit IPCP only relays to and from joined applications. Status: partial. Gaps: no header, TTL or duplicate suppression, so the topology must be loop-free; packets are copied once per hop.
Unit tests
All IPCP unit tests are under unicast/: capacity codes, the congestion-avoidance façade, mb-ecn (64 tests plus the lab), the DHT (26), the forwarding table and the routing graph. local, broadcast and common have no unit tests and rely on the integration suite.
Tools
| Tool | Status | Notes |
|---|---|---|
| irm | done | The administration CLI, main page Ouroboros Command Line Interface. irm ipcp {create, destroy, bootstrap, enroll, connect, disconnect, list, set, poa attach, poa detach, poa list}; irm name {create, destroy, register, unregister, list}; irm bind and irm unbind {program, process, ipcp}. Documented in ouroboros(8). |
| oping | done | Ping: count, duration, interval, flood and busy modes, QoS selection, packet size, per-packet timeout, quiet mode; RTT statistics and an out-of-order count. The server has polling and busy-poll modes. |
| oecho | done | Minimal echo client and server with the fixed name oecho. |
| ocbr | done | Constant-bit-rate generator: rate, size, duration, flood, sleep or spin pacing; QoS from the OCBR_QOS environment variable. |
| operf | done | Throughput test, unidirectional or bidirectional, with rate and size limits. |
| oftp | done | File transfer over a reliable stream flow with a CRC-64 check; FRCT minimum RTO and ring size tunable through environment variables. |
| obc | done | Broadcast test: join a broadcast layer and send or listen. |
| ovpn | partial | IP tunnel over a flow through a TUN device, Linux only; no TAP (Ethernet) mode. |
The tools other than irm have no manual pages.
Build and platforms
CMake 3.19 or later, C89 with all warnings as errors. Build types: Release (default), Debug, DebugASan, DebugTSan, DebugLSan, DebugUSan, DebugAnalyzer. make check runs the unit tests, make sbom writes a CycloneDX 1.7 bill of materials, and checkbuild.sh sweeps compilers, build types and feature flags and enforces the 80-column limit. The full option list is on Ouroboros Build Parameters.
| Dependency | Required | Provides | Switch |
|---|---|---|---|
| protobuf-c | yes | control-plane messages | |
| OpenSSL 3.0 | no | encryption, key exchange and signatures; 3.5 adds ML-KEM, ML-DSA and SLH-DSA | DISABLE_OPENSSL, DISABLE_ML, DISABLE_SLH |
| libgcrypt 1.7 | no | hashing and random numbers | DISABLE_LIBGCRYPT |
| libfuse 2.6 | no | the RIB and per-flow statistics | DISABLE_FUSE, IPCP_FLOW_STATS, PROC_FLOW_STATS |
| liburcu | no | lock-free key rotation (rwlock fallback) | DISABLE_LIBURCU |
| tomlc17 | no | the IRMd configuration file | DISABLE_CONFIGFILE |
| raw sockets, BPF or netmap | no | the Ethernet point of attachment | DISABLE_RAW_SOCKETS, DISABLE_BPF, ENABLE_NETMAP |
| systemd | no | the service unit | SYSTEMD_INSTALL_FILES |
Linux is the primary and best-tested platform; the integration suite runs on Linux. FreeBSD and macOS are supported in the code (BPF Ethernet backend, arc4random, Homebrew paths), but ovpn is Linux only. Shared-memory names use the prefix ouroboros and the RIB mounts under /tmp/ouroboros. Install layout: daemons and irm in sbin, the other tools in bin, headers in include/ouroboros, pkg-config files ouroboros-dev.pc and ouroboros-irm.pc, a CMake package, configuration and security directories under /etc/ouroboros, man pages in sections 3, 7 and 8.
Logging
Lines look like this:
==02067== irmd(II): Ouroboros IPC Resource Manager daemon started... ==02084== ipcpd/ipcp(II): Bootstrapping...
that is, ==<pid>== <component>(<level>): <message>. Levels: EE error, WW warning, II info, DB debug, PP protocol dump. Debug and protocol lines exist only in Debug builds, and the protocol dumps for OAP, the DHT, link state and enrolment have their own switches (DEBUG_PROTO_*). The daemons log to syslog by default; --stdout switches to the terminal, with colours. Lines about one OAP exchange carry a 64-bit id in brackets. A machine-parsable format is still to be done.
Programming language support
| Language | Status | Notes |
|---|---|---|
| C | done | The native API. |
| Python 3 | done | pyOuroboros: CFFI bindings for the flow API (Flow objects, fccntl, QoS presets, flow sets and event queues) and the management API (IPCPs, PoAs, names, bindings, configuration dataclasses), plus a mirror of the irm CLI. Python 3.8 or later, version-locked to the installed library. Used by Rumba and the integration suite. |
| Rust | unknown | OuroboRs is a separate project. It is not maintained by this project and has not been checked against the current API, which changes freely before 1.0. |
Other tools
| Project | Notes |
|---|---|
| Rumba | Python framework for defining recursive networks and running scripted experiments. It models unicast, broadcast and local layers, Ethernet and UDP links with delay, loss and rate, nodes with registrations and storyboards. Testbeds: local, localnet (bridges and veth with netem), nstb (one network and mount namespace per node, each with its own IRMd), Docker, Emulab and jFed. It drives the IRMd through pyOuroboros or through generated irm commands over SSH. |
| Ouroboros Metrics | oexport reads the RIB and pushes IPCP, flow allocator, link-state, DHT, data transfer, PoA and FRCT counters to InfluxDB 2, or to a line-protocol file; a Grafana dashboard is included. |
| Integration suite | pytest in a privileged Docker container built on Rumba and pyOuroboros: 38 files with 216 test functions across smoke, IPCP, flow, FRCT, security, congestion avoidance and per-user-pool groups. Runs one container per subsystem in parallel, with options for sanitizer builds, packet capture, endurance and time-series runs. |
| Style checker | o7s-style checks and fixes C, CMake, Dockerfile, man, Markdown, Python, shell and TOML files against the project style, and runs as an editor hook. |
Not started
- Namespace management: ownership and scalability of service names.
- QoS-aware routing and link weights.
- A per-flow layer MTU derived from the path below.
- Authorisation of management commands on the IRMd socket.
- Piggybacking application data in the flow request.
Licenses
The library is LGPLv2.1, the IRMd and the IPCPs are GPLv2, and the tools are 3-clause BSD. The SBOM records the combined expression LGPL-2.1-only AND GPL-2.0-only AND BSD-3-Clause.