<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://ouroboros.rocks/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Thijs</id>
	<title>Ouroboros - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://ouroboros.rocks/mediawiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Thijs"/>
	<link rel="alternate" type="text/html" href="https://ouroboros.rocks/wiki/Special:Contributions/Thijs"/>
	<updated>2026-04-28T03:11:50Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.39.17</generator>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Rumba&amp;diff=1885</id>
		<title>Rumba</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Rumba&amp;diff=1885"/>
		<updated>2026-01-10T12:02:55Z</updated>

		<summary type="html">&lt;p&gt;Thijs: fix link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Under construction}} (see https://ouroboros.rocks/docs/tools/rumba/)&lt;br /&gt;
&lt;br /&gt;
Rumba is a Python framework for setting up Ouroboros and RINA networks in a test environment that was developed during the [[History of Ouroboros#2016:_ARCFIRE_and_the_start_of_Ouroboros | ARCFIRE]] project. Its main objectives are to configure networks and to evaluate the impact of the architecture on configuration management and devops in computer and telecommunications networks. The original Rumba project page is [https://gitlab.com/ARCFIRE/Rumba here].&lt;br /&gt;
&lt;br /&gt;
Rumba can quickly set up test networks for Ouroboros that are made up of many IPCPs and Layers. We keep a version on this site up-to-date with the Ouroboros prototype.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
* easily define network topologies&lt;br /&gt;
&lt;br /&gt;
* Support for different prototypes:&lt;br /&gt;
** Ouroboros&amp;lt;ref&amp;gt;Only Ouroboros is maintained in our git clone, it may not work anymore with rlite and IRATI.&amp;lt;/ref&amp;gt;&lt;br /&gt;
** rlite&lt;br /&gt;
** IRATI&lt;br /&gt;
&lt;br /&gt;
* create these networks using different possible environments:&lt;br /&gt;
** local PC (Ouroboros only)&lt;br /&gt;
** docker container&lt;br /&gt;
** virtual machine (qemu)&lt;br /&gt;
** [https://jfed.ilabt.imec.be/ jFed] testbeds&lt;br /&gt;
&lt;br /&gt;
* script experiments&lt;br /&gt;
&lt;br /&gt;
* rudimentary support for drawing these networks (using pydot)&lt;br /&gt;
&lt;br /&gt;
== Install Rumba ==&lt;br /&gt;
We forked Rumba with the Ouroboros website, and you should get this forked version for use with Ouroboros.&lt;br /&gt;
It should work with most python versions, but I recommend using a recent version (currently &amp;gt;= Python3.9).&lt;br /&gt;
&lt;br /&gt;
 git clone https://ouroboros.rocks/git/rumba&lt;br /&gt;
 cd rumba&lt;br /&gt;
 # Recommended: create/enter python virtual environment (e.g. the same created for [[Ouroboros Metrics|InfluxDB &amp;amp; grafana]])&lt;br /&gt;
 # If not, then it will install system-wide (use sudo in that case)&lt;br /&gt;
 pip install .&lt;br /&gt;
 # OR, if you want all 3 extra features&lt;br /&gt;
 pip install &amp;quot;.[NumpyAcceleration,graphs,visualizer]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Use Rumba ==&lt;br /&gt;
The Rumba model is heavily based on [[RINA]] terminology (since it was originally developed within a RINA research project). We will probably align the terminology in Rumba with Ouroboros in the near future. I will break down a typical Rumba experiment definition and show how to use Rumba in Python interactive mode. You can download the complete example experiment definition [https://{{SERVERNAME}}/docs/tools/rumba_example.py here]. The example uses the Ouroboros prototype, and we will run the setup on the local testbed since that is available on any machine and doesn’t require additional dependencies. We use the local testbed a lot for quick development testing and debugging. I will also show the experiment definition for the virtual wall server testbed at Ghent University as an example for researchers who have access to this testbed. If you have docker or qemu installed, feel free to experiment with these at your leisure.&lt;br /&gt;
&lt;br /&gt;
If you want to test Ouroboros locally (no docker/qemu), then the only example script you can run without modification is:&lt;br /&gt;
 python3 examples/scalingtime.py --prototype ouroboros local&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Glossary&amp;diff=1770</id>
		<title>Glossary</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Glossary&amp;diff=1770"/>
		<updated>2025-12-06T11:22:43Z</updated>

		<summary type="html">&lt;p&gt;Thijs: Add O7s&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Under construction}}&lt;br /&gt;
;Automated Repeat-reQuest (ARQ)&lt;br /&gt;
:Packets are identified by a sequence number and acknowledged by the receiver. Lost packets are retransmitted, usually after receiving a number of duplicate ACKs or a certain timeout.&lt;br /&gt;
&lt;br /&gt;
;Bind&lt;br /&gt;
:The action of associating a name with a program or process. A process bound to a name will respond to incoming flow allocation requests for that name in that system. If a program is bound to a name, all subsequently instantiated processes will be bound to that name.&lt;br /&gt;
&lt;br /&gt;
;Broadcast Flow&lt;br /&gt;
:A broadcast flow is the abstraction for a packet stream that is sent from a source node to a set of nodes. A Broadcast Flow is implemented by a Broadcast Layer.&lt;br /&gt;
&lt;br /&gt;
;Broadcast IPCP&lt;br /&gt;
:A type of IPCP that is used to build Broadcast Layers.&lt;br /&gt;
&lt;br /&gt;
;Broadcast Layer&lt;br /&gt;
:A Layer consisting of Broadcast IPCPs.&lt;br /&gt;
&lt;br /&gt;
;Connection&lt;br /&gt;
:Shared state between two protocol machines.&lt;br /&gt;
&lt;br /&gt;
;Connection establishment&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
;EFCP&lt;br /&gt;
:The protocol inside RINA IPCPs that is responsible for enabling IPC. It is a 2-component protocol consisting of the Data Transfer Protocol (DTP) and a Data Transfer Control protocol (DTCP) which share a state vector.&lt;br /&gt;
&lt;br /&gt;
;Enrollment&lt;br /&gt;
:The action of adding an IPCP or a set of IPCPs to a Layer as an active member.&lt;br /&gt;
&lt;br /&gt;
;Flow&lt;br /&gt;
:A [[Flow Allocation|flow]] is the abstraction for a packet stream between a number of application processes. Ouroboros makes a clear distinction between [[Glossary#Unicast Flow|Unicast flows]] and [[Glossary#Broadcast Flow|Broadcast flows]].&lt;br /&gt;
&lt;br /&gt;
;Flow Allocation&lt;br /&gt;
:The process of [[Flow Allocation|creating a flow between two processes]].&lt;br /&gt;
&lt;br /&gt;
;Flow Allocator&lt;br /&gt;
:The component in the IPCP that is responsible for &#039;&#039;flow allocation&#039;&#039;, managing flow state and congestion avoidance. &lt;br /&gt;
&lt;br /&gt;
;Flow Descriptor&lt;br /&gt;
:A handle used by an application to manipulate and read/write from/to flows, similar to a file descriptor for files.&lt;br /&gt;
&lt;br /&gt;
;Flooding&lt;br /&gt;
:The algorithm that takes a packet on the incoming flow and then sends it out on all other (outgoing) flows. Flooding is the main algorithm implemented by the Data Transfer component of a Broadcast IPCP.&lt;br /&gt;
&lt;br /&gt;
;Forwarding&lt;br /&gt;
:Any algorithm that takes as input a destination address and gives as output a set of flows. The forwarding algorithm is the main algorithm in the Data Transfer component of the unicast IPCP.&lt;br /&gt;
&lt;br /&gt;
;IPC&lt;br /&gt;
:See Inter-Process Communication.&lt;br /&gt;
&lt;br /&gt;
;IPCP&lt;br /&gt;
:See Inter-Process Communication Process.&lt;br /&gt;
&lt;br /&gt;
;IRMd&lt;br /&gt;
:See Inter-Process Communication Resource Management Daemon.&lt;br /&gt;
&lt;br /&gt;
;Inter-Process Communication (IPC)&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
;Inter-Process Communication Process (IPCP)&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
;Inter-Process Communication Resource Management Daemon (IRMd)&lt;br /&gt;
:The IRMd is the central daemon that performs management functions for Ouroboros. It listens for management commands such as creating/destroying IPCPs, bootstrapping and enrolling IPCPs, binding programs and processes to service names and registering names with an IPCP. &lt;br /&gt;
&lt;br /&gt;
;IP fragmentation problem&lt;br /&gt;
:Retransmission logic is handled by TCP, so the loss of an single IP datagram results in the retransmission of all the fragments constituting a (potentially much larger) TCP frame, instead of just this lost datagram.&lt;br /&gt;
&lt;br /&gt;
;Layer / layer&lt;br /&gt;
:The Ouroboros model is subdivided in [[Ouroboros Functional Layering|layers]] (lowercase), with similar intent as the TCP/IP model (5 layers) or OSI (7 layers) model which it aims to improve upon.&lt;br /&gt;
:Ouroboros is [[Network_Layering|multi-Layered]] (capitalized), allowing networks to overlay each other. There are 2 types of Layers: Unicast Layers and Broadcast Layers, consisting of Unicast IPCPs and Broadcast IPCPs respectively. Note that they can&#039;t be mixed (a Unicast IPCP can&#039;t enroll with a Broadcast IPCP), but it is of course possible for a program to implement both the Unicast and Broadcast IPCP functionality. The different use of &#039;&#039;layer/Layer&#039;&#039; can be initially confusing, and have considered other options such as &#039;&#039;stratum&#039;&#039;, but for the time being, we stick to Layer / layer.&lt;br /&gt;
&lt;br /&gt;
;Name&lt;br /&gt;
:&#039;&#039;also known as &#039;&#039;&#039;Service Name&#039;&#039;&#039;&lt;br /&gt;
:A non-descript string of characters in some namespace that can be bound to a program or process.&lt;br /&gt;
&lt;br /&gt;
;O7s&lt;br /&gt;
:Abbreviation for &amp;quot;Ouroboros&amp;quot; (a [https://en.wikipedia.org/wiki/Numeronym#Numerical_contractions numeronym] to be specific).&lt;br /&gt;
&lt;br /&gt;
;Process&lt;br /&gt;
:In the Ouroboros framework, the instantiation of a program. It is logically identified by a local Process Identifier (PID), which on POSIX systems maps directly to the process ID (pid).&lt;br /&gt;
&lt;br /&gt;
;Program&lt;br /&gt;
:In the Ouroboros framework, the code (for instance a compiled binary or a script) that can be executed as a Process.&lt;br /&gt;
&lt;br /&gt;
;Raw Flow&lt;br /&gt;
:A best-effort Unicast Flow between two peers without any QoS guarantees.&lt;br /&gt;
&lt;br /&gt;
;RINA&lt;br /&gt;
:[[Recursive InterNetwork Architecture]]&lt;br /&gt;
&lt;br /&gt;
;Routing&lt;br /&gt;
:Any algorithm that can construct a distance function to all other nodes in a Unicast Layer. The literature discerns at least 3 classes of [[Routing]] algorithms: geometric, link-state and distance/path-vector.&lt;br /&gt;
:The output of a routing algorithm is needed to construct a forwarding algorithm. The routing algorithm is the main algorithm in the routing component of the unicast IPCP.&lt;br /&gt;
&lt;br /&gt;
;Unenrollment&lt;br /&gt;
::The action of removing an IPCP or a set of IPCPs to a Layer.&lt;br /&gt;
&lt;br /&gt;
;Unicast Flow&lt;br /&gt;
:A unicast flow is a point-to-point packet stream between two processes. A flow is identified at each end by a &#039;&#039;flow descriptor&#039;&#039;. A unicast flow is implemented as a &#039;&#039;network flow&#039;&#039; between two &#039;&#039;unicast IPCPs&#039;&#039;. A network flow is identified by a 4-tuple &amp;lt;source address, source EID, destination address, destination EID&amp;gt;. The Endpoint Identifiers (EIDs) are agreed upon during [[Flow Allocation]]. A Unicast Flow is not implying an application protocol. &lt;br /&gt;
&lt;br /&gt;
;Unicast IPCP&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
;Unicast Layer&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Whatevercast&lt;br /&gt;
:A proposed RINA concept for the &#039;&#039;unification of unicast, anycast, multicast and broadcast&#039;&#039;. The RINA DIF will resolve the correct set of destination nodes based on the &#039;&#039;whatevercast&#039;&#039; name and a &#039;&#039;set of rules&#039;&#039; associated with it. Our attempt at implementing whatevercast led to us formulating the [[Ouroboros multicast conjecture]].&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Rumba&amp;diff=1769</id>
		<title>Rumba</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Rumba&amp;diff=1769"/>
		<updated>2025-11-29T23:14:16Z</updated>

		<summary type="html">&lt;p&gt;Thijs: Add usage hint&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Under construction}} (see https://ouroboros.rocks/docs/tools/rumba/)&lt;br /&gt;
&lt;br /&gt;
Rumba is a Python framework for setting up Ouroboros and RINA networks in a test environment that was developed during the [[History of Ouroboros#ARCFIRE | ARCFIRE]] project. Its main objectives are to configure networks and to evaluate the impact of the architecture on configuration management and devops in computer and telecommunications networks. The original Rumba project page is [https://gitlab.com/ARCFIRE/Rumba here].&lt;br /&gt;
&lt;br /&gt;
Rumba can quickly set up test networks for Ouroboros that are made up of many IPCPs and Layers. We keep a version on this site up-to-date with the Ouroboros prototype.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
* easily define network topologies&lt;br /&gt;
&lt;br /&gt;
* Support for different prototypes:&lt;br /&gt;
** Ouroboros&amp;lt;ref&amp;gt;Only Ouroboros is maintained in our git clone, it may not work anymore with rlite and IRATI.&amp;lt;/ref&amp;gt;&lt;br /&gt;
** rlite&lt;br /&gt;
** IRATI&lt;br /&gt;
&lt;br /&gt;
* create these networks using different possible environments:&lt;br /&gt;
** local PC (Ouroboros only)&lt;br /&gt;
** docker container&lt;br /&gt;
** virtual machine (qemu)&lt;br /&gt;
** [https://jfed.ilabt.imec.be/ jFed] testbeds&lt;br /&gt;
&lt;br /&gt;
* script experiments&lt;br /&gt;
&lt;br /&gt;
* rudimentary support for drawing these networks (using pydot)&lt;br /&gt;
&lt;br /&gt;
== Install Rumba ==&lt;br /&gt;
We forked Rumba with the Ouroboros website, and you should get this forked version for use with Ouroboros.&lt;br /&gt;
It should work with most python versions, but I recommend using a recent version (currently &amp;gt;= Python3.9).&lt;br /&gt;
&lt;br /&gt;
 git clone https://ouroboros.rocks/git/rumba&lt;br /&gt;
 cd rumba&lt;br /&gt;
 # Recommended: create/enter python virtual environment (e.g. the same created for [[Ouroboros Metrics|InfluxDB &amp;amp; grafana]])&lt;br /&gt;
 # If not, then it will install system-wide (use sudo in that case)&lt;br /&gt;
 pip install .&lt;br /&gt;
 # OR, if you want all 3 extra features&lt;br /&gt;
 pip install &amp;quot;.[NumpyAcceleration,graphs,visualizer]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Use Rumba ==&lt;br /&gt;
The Rumba model is heavily based on [[RINA]] terminology (since it was originally developed within a RINA research project). We will probably align the terminology in Rumba with Ouroboros in the near future. I will break down a typical Rumba experiment definition and show how to use Rumba in Python interactive mode. You can download the complete example experiment definition [https://{{SERVERNAME}}/docs/tools/rumba_example.py here]. The example uses the Ouroboros prototype, and we will run the setup on the local testbed since that is available on any machine and doesn’t require additional dependencies. We use the local testbed a lot for quick development testing and debugging. I will also show the experiment definition for the virtual wall server testbed at Ghent University as an example for researchers who have access to this testbed. If you have docker or qemu installed, feel free to experiment with these at your leisure.&lt;br /&gt;
&lt;br /&gt;
If you want to test Ouroboros locally (no docker/qemu), then the only example script you can run without modification is:&lt;br /&gt;
 python3 examples/scalingtime.py --prototype ouroboros local&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Contributions&amp;diff=1768</id>
		<title>Ouroboros Contributions</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Contributions&amp;diff=1768"/>
		<updated>2025-11-24T13:08:28Z</updated>

		<summary type="html">&lt;p&gt;Thijs: Add git signoff pre-push hook&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ouroboros is far from complete. Plenty of things need to be researched and implemented. We don’t really keep a list, but this [https://tree.taiga.io/project/dstaesse-ouroboros/kanban kanban board] can give you some ideas of what is still on our mind and where you may be able to contribute.&lt;br /&gt;
Our coding guidelines can be found in the [[Source Code Guide]].&lt;br /&gt;
&lt;br /&gt;
= Contact =&lt;br /&gt;
&lt;br /&gt;
There are 2 ways that are used to communicate.&lt;br /&gt;
&lt;br /&gt;
For daily chat we use a [https://matrix.to/#/#ODecentralize:matrix.org matrix space] bridged to a [https://join.slack.com/t/odecentralize/shared_invite/enQtOTU2NjI5OTk3NDYzLTM2ZjkwZjAxMTcyZjI5N2Y1NGZlNWJjODA0MDU2Y2MzN2Q3MjA5ZTAwYjIyMDMzNGNhZTc1NWQwNWYyMjBhMWU public slack channel]. Use the tool you prefer and whatever login name you desire. Just hop on and ask away.&lt;br /&gt;
&lt;br /&gt;
The [https://www.freelists.org/list/ouroboros mailing list] is mostly used for sending software patches, but can be used to contact us about almost anything. Participation requires you to register for this list.&lt;br /&gt;
&lt;br /&gt;
= Bug reports =&lt;br /&gt;
&lt;br /&gt;
Bugs are reported through [https://codeberg.org/o7s/ouroboros/issues codeberg].&lt;br /&gt;
&lt;br /&gt;
When reporting bugs, check if the bug is still present in the &#039;be&#039; branch, and try to include the following:&lt;br /&gt;
&lt;br /&gt;
* Provide a description of the bug&lt;br /&gt;
* Provide system logs of the IRMd and IPCPs&lt;br /&gt;
* Provide a minimal code example to reproduce the bug&lt;br /&gt;
* Sync with the HEAD of the most stable branch where the bug is present&lt;br /&gt;
* Provide a bug fix if you can, send a patch to the mailing list&lt;br /&gt;
&lt;br /&gt;
= Feature requests =&lt;br /&gt;
&lt;br /&gt;
New features can be always be requested through the mailing list or alternatively &lt;br /&gt;
[https://codeberg/o7s/ouroboros/issues codeberg]. They will be taken into account when a next version of the prototype is discussed.&lt;br /&gt;
&lt;br /&gt;
= Contributions =&lt;br /&gt;
&lt;br /&gt;
== Patches ==&lt;br /&gt;
We accept pull requests (PRs) on [https://codeberg.org/o7s/ouroboros/pulls codeberg].&lt;br /&gt;
&lt;br /&gt;
== Commit messages ==&lt;br /&gt;
&lt;br /&gt;
A commit message should follow these 10 simple rules, based on [http://chris.beams.io/posts/git-commit/ Chris Beams]&#039; excellent guide.&lt;br /&gt;
&lt;br /&gt;
* Separate subject from body with a blank line&lt;br /&gt;
* Limit the subject line to 50 characters&lt;br /&gt;
* Capitalize the subject line&lt;br /&gt;
* Do not end the subject line with a period&lt;br /&gt;
* Use the imperative mood in the subject line&lt;br /&gt;
* Precede the subject line by indicating the component where changes were made&lt;br /&gt;
* Wrap the body at 72 characters&lt;br /&gt;
* Use the body to explain what and why vs. how&lt;br /&gt;
* If the commit addresses a bug, reference it in the body&lt;br /&gt;
* Sign off your commits using the signoff feature in git (&amp;lt;code&amp;gt;--signoff&amp;lt;/code&amp;gt;)&lt;br /&gt;
** Git does not allow to automate signing off on commits, since this needs to be a conscious decision. You can prevent pushing non-signed-off commits by using the following hook: &amp;lt;code&amp;gt;.git/hooks/pre-push&amp;lt;/code&amp;gt; &amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot; class=&amp;quot;mw-collapsible mw-collapsed&amp;quot;&amp;gt;&lt;br /&gt;
#!/bin/sh&lt;br /&gt;
&lt;br /&gt;
# An example hook script to verify what is about to be pushed.  Called by &amp;quot;git&lt;br /&gt;
# push&amp;quot; after it has checked the remote status, but before anything has been&lt;br /&gt;
# pushed.  If this script exits with a non-zero status nothing will be pushed.&lt;br /&gt;
#&lt;br /&gt;
# This hook is called with the following parameters:&lt;br /&gt;
#&lt;br /&gt;
# $1 -- Name of the remote to which the push is being done&lt;br /&gt;
# $2 -- URL to which the push is being done&lt;br /&gt;
#&lt;br /&gt;
# If pushing without using a named remote those arguments will be equal.&lt;br /&gt;
#&lt;br /&gt;
# Information about the commits which are being pushed is supplied as lines to&lt;br /&gt;
# the standard input in the form:&lt;br /&gt;
#&lt;br /&gt;
#   &amp;lt;local ref&amp;gt; &amp;lt;local sha1&amp;gt; &amp;lt;remote ref&amp;gt; &amp;lt;remote sha1&amp;gt;&lt;br /&gt;
#&lt;br /&gt;
# This sample shows how to prevent push of commits where the log message starts&lt;br /&gt;
# with &amp;quot;WIP&amp;quot; (work in progress).&lt;br /&gt;
&lt;br /&gt;
remote=&amp;quot;$1&amp;quot;&lt;br /&gt;
url=&amp;quot;$2&amp;quot;&lt;br /&gt;
# Unsure if AUTHOR &amp;amp; COMMITTER can differ when using this locally as a hook?&lt;br /&gt;
local_author=$(git var GIT_AUTHOR_IDENT | sed -E &#039;s/( [^ ]+){2}$//&#039;)&lt;br /&gt;
&lt;br /&gt;
z40=0000000000000000000000000000000000000000&lt;br /&gt;
&lt;br /&gt;
while read local_ref local_sha remote_ref remote_sha&lt;br /&gt;
do&lt;br /&gt;
	if [ &amp;quot;$local_sha&amp;quot; = $z40 ]&lt;br /&gt;
	then&lt;br /&gt;
		# Handle delete&lt;br /&gt;
		:&lt;br /&gt;
	else&lt;br /&gt;
		if [ &amp;quot;$remote_sha&amp;quot; = $z40 ]&lt;br /&gt;
		then&lt;br /&gt;
			# New branch, examine all commits&lt;br /&gt;
			range=&amp;quot;$local_sha&amp;quot;&lt;br /&gt;
		else&lt;br /&gt;
			# Update to existing branch, examine new commits&lt;br /&gt;
			range=&amp;quot;$remote_sha..$local_sha&amp;quot;&lt;br /&gt;
		fi&lt;br /&gt;
&lt;br /&gt;
		# Check for WIP commit&lt;br /&gt;
		commit=`git rev-list -n 1 --grep &#039;^WIP&#039; &amp;quot;$range&amp;quot;`&lt;br /&gt;
		if [ -n &amp;quot;$commit&amp;quot; ]&lt;br /&gt;
		then&lt;br /&gt;
			echo &amp;gt;&amp;amp;2 &amp;quot;Found WIP commit in $local_ref, not pushing&amp;quot;&lt;br /&gt;
			exit 1&lt;br /&gt;
		fi&lt;br /&gt;
&lt;br /&gt;
		# Check for missing signoff&#039;s&lt;br /&gt;
		commit=`git rev-list -n 1 --grep &amp;quot;^Signed-off-by: ${local_author}$&amp;quot; &amp;quot;$range&amp;quot; --invert-grep`&lt;br /&gt;
		if [ -n &amp;quot;$commit&amp;quot; ]&lt;br /&gt;
		then&lt;br /&gt;
  			echo &amp;gt;&amp;amp;2 &amp;quot;Found commit $commit which is not signed off in $local_ref, not pushing&amp;quot;&lt;br /&gt;
  			exit 1&lt;br /&gt;
  		fi&lt;br /&gt;
	fi&lt;br /&gt;
done&lt;br /&gt;
&lt;br /&gt;
exit 0&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here is an example of a change in the lib/ folder:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
lib: Add support for Linux RTT estimator&lt;br /&gt;
&lt;br /&gt;
This adds the option to use the Round-Trip-Time (RTT) estimation&lt;br /&gt;
algorithm as it is implemented in the TCP implementation in Linux. It&lt;br /&gt;
looks like it outperforms the TCP default algorithm, so I enabled this&lt;br /&gt;
one by default. Also adds the option to change the RTO timeout&lt;br /&gt;
calculation to include more (or less) than 4 times the mdev (specified&lt;br /&gt;
as a power of 2. Left the default value to 2 (so, 4 mdevs), but 3 (8&lt;br /&gt;
mdevs) gives better results in my tests.&lt;br /&gt;
&lt;br /&gt;
Signed-off-by: Dimitri Staessens &amp;lt;dimitri@ouroboros.rocks&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Versioning ==&lt;br /&gt;
&lt;br /&gt;
Git is used as a version tooling for the code. Releases are identified through a git tag by a number MAJOR.MICRO.PATCHLEVEL. &lt;br /&gt;
* Incrementing MAJOR is done to indicate a big step ahead in terms of features; it is discussed when new features are planned. &lt;br /&gt;
* Incrementing MICRO is done when APIs/ABIs are not necessarily compatible. &lt;br /&gt;
* The PATCHLEVEL is incremented when an urgent bugfix is incorporated.&lt;br /&gt;
&lt;br /&gt;
Version 1.0.0 would be the first minimum viable prototype version.&lt;br /&gt;
&lt;br /&gt;
== Repository structure==&lt;br /&gt;
&lt;br /&gt;
The main git repository can be found at: https://ouroboros.rocks/cgit/ouroboros&lt;br /&gt;
The main mirror is on [https://codeberg.org/o7s/ouroboros codeberg]&lt;br /&gt;
&lt;br /&gt;
It contains the following branches:&lt;br /&gt;
&lt;br /&gt;
* master: Contains the most stable versions of Ouroboros.&lt;br /&gt;
* testing: Contains tested code but may still contain bugs.&lt;br /&gt;
* be: Contains untested but compiling code (&#039;bleeding edge&#039;).&lt;br /&gt;
&lt;br /&gt;
All new contributions are integrated into ‘be’ through patches sent to the mailing list. Once a version of ‘be’ is tested enough, it is merged into ‘testing’. When a ‘testing’ version is considered stable enough, it is merged into ‘master’. Most users should probably use master.&lt;br /&gt;
&lt;br /&gt;
New development is always done against the ‘be’ branch of the main git repository. Contributions are always made using your real name and real e-mail address.&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Contributions&amp;diff=1707</id>
		<title>Ouroboros Contributions</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Contributions&amp;diff=1707"/>
		<updated>2025-08-14T13:28:03Z</updated>

		<summary type="html">&lt;p&gt;Thijs: Clarify term&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ouroboros is far from complete. Plenty of things need to be researched and implemented. We don’t really keep a list, but this [https://tree.taiga.io/project/dstaesse-ouroboros/kanban kanban board] can give you some ideas of what is still on our mind and where you may be able to contribute.&lt;br /&gt;
Our coding guidelines can be found in the [[Source Code Guide]].&lt;br /&gt;
&lt;br /&gt;
= Contact =&lt;br /&gt;
&lt;br /&gt;
There are 2 ways that are used to communicate.&lt;br /&gt;
&lt;br /&gt;
For daily chat we use a [https://matrix.to/#/#ODecentralize:matrix.org matrix space] bridged to a [https://join.slack.com/t/odecentralize/shared_invite/enQtOTU2NjI5OTk3NDYzLTM2ZjkwZjAxMTcyZjI5N2Y1NGZlNWJjODA0MDU2Y2MzN2Q3MjA5ZTAwYjIyMDMzNGNhZTc1NWQwNWYyMjBhMWU public slack channel]. Use the tool you prefer and whatever login name you desire. Just hop on and ask away.&lt;br /&gt;
&lt;br /&gt;
The [https://www.freelists.org/list/ouroboros mailing list] is mostly used for sending software patches, but can be used to contact us about almost anything. Participation requires you to register for this list.&lt;br /&gt;
&lt;br /&gt;
= Bug reports =&lt;br /&gt;
&lt;br /&gt;
Bugs are reported through [https://codeberg.org/o7s/ouroboros/issues codeberg].&lt;br /&gt;
&lt;br /&gt;
When reporting bugs, check if the bug is still present in the &#039;be&#039; branch, and try to include the following:&lt;br /&gt;
&lt;br /&gt;
* Provide a description of the bug&lt;br /&gt;
* Provide system logs of the IRMd and IPCPs&lt;br /&gt;
* Provide a minimal code example to reproduce the bug&lt;br /&gt;
* Sync with the HEAD of the most stable branch where the bug is present&lt;br /&gt;
* Provide a bug fix if you can, send a patch to the mailing list&lt;br /&gt;
&lt;br /&gt;
= Feature requests =&lt;br /&gt;
&lt;br /&gt;
New features can be always be requested through the mailing list or alternatively &lt;br /&gt;
[https://codeberg/o7s/ouroboros/issues codeberg]. They will be taken into account when a next version of the prototype is discussed.&lt;br /&gt;
&lt;br /&gt;
= Contributions =&lt;br /&gt;
&lt;br /&gt;
== Patches ==&lt;br /&gt;
&lt;br /&gt;
Git patches can be sent to the [https://www.freelists.org/list/ouroboros mailing list]. You will need to use an email address that is registered to the mailing list.&lt;br /&gt;
Sending commits by mail can be done with [https://git-scm.com/docs/git-send-email git send-email], which might need to be installed separately.&lt;br /&gt;
&lt;br /&gt;
To set this up, open your git config &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git config --global --edit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and add your email settings, e.g. for a gmail account (don&#039;t forget to &#039;&#039;&#039;edit your email address&#039;&#039;&#039; in this snippet):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
[sendemail]&lt;br /&gt;
    smtpserver = smtp.googlemail.com&lt;br /&gt;
    smtpencryption = tls&lt;br /&gt;
    smtpserverport = 587&lt;br /&gt;
    smtpuser = youremail@ymail.com&lt;br /&gt;
    confirm=auto&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For other email providers it is similar.&lt;br /&gt;
&lt;br /&gt;
When this is set up, the last commit on the current branch is sent as a patch from the command line using [https://git-scm.com/docs/git-send-email git send-email]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git send-email -1 --to=ouroboros@freelists.org&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Commit messages ==&lt;br /&gt;
&lt;br /&gt;
A commit message should follow these 10 simple rules, based on [http://chris.beams.io/posts/git-commit/ Chris Beams]&#039; excellent guide.&lt;br /&gt;
&lt;br /&gt;
* Separate subject from body with a blank line&lt;br /&gt;
* Limit the subject line to 50 characters&lt;br /&gt;
* Capitalize the subject line&lt;br /&gt;
* Do not end the subject line with a period&lt;br /&gt;
* Use the imperative mood in the subject line&lt;br /&gt;
* Precede the subject line by indicating the component where changes were made&lt;br /&gt;
* Wrap the body at 72 characters&lt;br /&gt;
* Use the body to explain what and why vs. how&lt;br /&gt;
* If the commit addresses a bug, reference it in the body&lt;br /&gt;
* Sign off your commits using the signoff feature in git&lt;br /&gt;
&lt;br /&gt;
Here is an example of a change in the lib/ folder:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
lib: Add support for Linux RTT estimator&lt;br /&gt;
&lt;br /&gt;
This adds the option to use the Round-Trip-Time (RTT) estimation&lt;br /&gt;
algorithm as it is implemented in the TCP implementation in Linux. It&lt;br /&gt;
looks like it outperforms the TCP default algorithm, so I enabled this&lt;br /&gt;
one by default. Also adds the option to change the RTO timeout&lt;br /&gt;
calculation to include more (or less) than 4 times the mdev (specified&lt;br /&gt;
as a power of 2. Left the default value to 2 (so, 4 mdevs), but 3 (8&lt;br /&gt;
mdevs) gives better results in my tests.&lt;br /&gt;
&lt;br /&gt;
Signed-off-by: Dimitri Staessens &amp;lt;dimitri@ouroboros.rocks&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Versioning ==&lt;br /&gt;
&lt;br /&gt;
Git is used as a version tooling for the code. Releases are identified through a git tag by a number MAJOR.MICRO.PATCHLEVEL. &lt;br /&gt;
* Incrementing MAJOR is done to indicate a big step ahead in terms of features; it is discussed when new features are planned. &lt;br /&gt;
* Incrementing MICRO is done when APIs/ABIs are not necessarily compatible. &lt;br /&gt;
* The PATCHLEVEL is incremented when an urgent bugfix is incorporated.&lt;br /&gt;
&lt;br /&gt;
Version 1.0.0 would be the first minimum viable prototype version.&lt;br /&gt;
&lt;br /&gt;
== Repository structure==&lt;br /&gt;
&lt;br /&gt;
The main git repository can be found at: https://ouroboros.rocks/cgit/ouroboros&lt;br /&gt;
&lt;br /&gt;
It contains the following branches:&lt;br /&gt;
&lt;br /&gt;
* master: Contains the most stable versions of Ouroboros.&lt;br /&gt;
* testing: Contains tested code but may still contain bugs.&lt;br /&gt;
* be: Contains untested but compiling code (&#039;bleeding edge&#039;).&lt;br /&gt;
&lt;br /&gt;
All new contributions are integrated into ‘be’ through patches sent to the mailing list. Once a version of ‘be’ is tested enough, it is merged into ‘testing’. When a ‘testing’ version is considered stable enough, it is merged into ‘master’. Most users should probably use master.&lt;br /&gt;
&lt;br /&gt;
New development is always done against the ‘be’ branch of the main git repository. Contributions are always made using your real name and real e-mail address.&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Prototype&amp;diff=1703</id>
		<title>Ouroboros Prototype</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Prototype&amp;diff=1703"/>
		<updated>2025-06-06T08:31:55Z</updated>

		<summary type="html">&lt;p&gt;Thijs: Specify correct fuse version&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Under construction}}&lt;br /&gt;
&lt;br /&gt;
The Ouroboros prototype is a user-space decentralized packet network implementation based on an overhauled [[Ouroboros Model| networking model]]. It is being developed in C for POSIX operating systems.&lt;br /&gt;
&lt;br /&gt;
This prototype is very much a work in progress.&lt;br /&gt;
&lt;br /&gt;
On this page are instructions for installing the prototype. Once done, head to the [[Ouroboros Tutorials | tutorials]] section. The [https://ouroboros.rocks/docs old documentation website] is still available for reference, but only this wiki is maintained. &lt;br /&gt;
&lt;br /&gt;
= Install the Prototype =&lt;br /&gt;
&lt;br /&gt;
The prototype consists of the &#039;&#039;&#039;library&#039;&#039;&#039;, which provides the core Application Programming Interfaces (Unicast API and Broadcast API), the functions of the [[Ouroboros Functional Layering | application end-to-end layer]] and various functions used by the other components in the prototype; the IPC Resource Management daemon &#039;&#039;&#039;IRMd&#039;&#039;&#039;, which is the core component for administering Ouroboros; the &#039;&#039;&#039;IPCPs&#039;&#039;&#039; that actually forward packets and make up the (peer-to-peer) packet network; and a collection of &#039;&#039;&#039;tools&#039;&#039;&#039;, of which the most important is the IPC Resource Management (IRM) Command Line Interface (CLI) for management and some basic tools for demo purposes. In addition, there is an [[Rumba | orchestration framework]] for setting up experiments and an [[Ouroboros metrics | InfluxDB exporter]] for observability. The prototype is written in C, but we provide some APIs for other popular languages, currently [[pyOuroboros | Python]] and [[OuroboRs | Rust]].&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
Ouroboros builds on most POSIX compliant systems. Below you will find instructions for GNU/Linux, FreeBSD and OS X. On Windows 10, you can build Ouroboros using the [https://learn.microsoft.com/en-us/windows/wsl/install Linux Subsystem for Windows].&lt;br /&gt;
&lt;br /&gt;
== Get Ouroboros ==&lt;br /&gt;
&lt;br /&gt;
You can clone Ouroboros using the command line from its website or, if you prefer you can clone and/or fork from our [https://github.com/dstaesse/ouroboros Github] or [https://bitbucket.org/dstaesse/ouroboros BitBucket] mirrors.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
$ git clone https://ouroboros.rocks/git/ouroboros&lt;br /&gt;
$ git clone git://ouroboros.rocks/ouroboros&lt;br /&gt;
$ git clone https://github.com/dstaesse/ouroboros&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Another option is downloading a [https://{{SERVERNAME}}/cgit/ouroboros snapshot] tarball and extracting it.&lt;br /&gt;
Optional repositories are [[pyOuroboros]], a Python wrapper to write Ouroboros programs in Python, and [[Ouroboros metrics | ouroboros-metrics]] that contains an [https://influxdb.com InfluxDB] exporter.&lt;br /&gt;
&lt;br /&gt;
== Dependencies ==&lt;br /&gt;
&lt;br /&gt;
To build Ouroboros, you need cmake, google protocol buffers installed in addition to a C compiler (gcc or clang) and make.&lt;br /&gt;
&lt;br /&gt;
On GNU/Linux you will need either libgcrypt (≥ 1.7.0) or libssl if your glibc is older than version 2.25.&lt;br /&gt;
&lt;br /&gt;
On OS X, you will need homebrew. [https://developer.apple.com/library/archive/documentation/Security/Conceptual/System_Integrity_Protection_Guide/ConfiguringSystemIntegrityProtection/ConfiguringSystemIntegrityProtection.html Disable System Integrity Protection] during the installation and/or removal of Ouroboros.&lt;br /&gt;
&lt;br /&gt;
Optionally, you can also install libgcrypt, libssl (to enable encryption), fuse 2.x (to enable exporting internal metrics), and dnsutils (to enable use of a DynDNS server to be used as a naming directory for a UDP layer). Setting up a DNS server (e.g. bind) is out of scope of this installation guide.&lt;br /&gt;
&lt;br /&gt;
=== Debian/Ubuntu Linux ===&lt;br /&gt;
&lt;br /&gt;
 $ apt-get install git protobuf-c-compiler cmake&lt;br /&gt;
 $ apt-get install libgcrypt20-dev libssl-dev libfuse-dev dnsutils cmake-curses-gui&lt;br /&gt;
&lt;br /&gt;
If during the build process cmake complains that the Protobuf C compiler is required but not found, and you installed the protobuf-c-compiler package, you will also need this:&lt;br /&gt;
&lt;br /&gt;
 $ apt-get install libprotobuf-c-dev&lt;br /&gt;
&lt;br /&gt;
=== Arch Linux ===&lt;br /&gt;
&lt;br /&gt;
 $ pacman -S git protobuf-c cmake&lt;br /&gt;
 $ pacman -S libgcrypt openssl fuse dnsutils&lt;br /&gt;
&lt;br /&gt;
=== FreeBSD 11/12/13/14 ===&lt;br /&gt;
&lt;br /&gt;
 $ pkg install git protobuf-c cmake&lt;br /&gt;
 $ pkg install libgcrypt openssl fusefs-libs bind-tools&lt;br /&gt;
&lt;br /&gt;
=== Mac OS X 10/11/12/13/14 ===&lt;br /&gt;
&lt;br /&gt;
 $ brew install git protobuf-c cmake&lt;br /&gt;
 $ brew install libgcrypt openssl&lt;br /&gt;
&lt;br /&gt;
On mac OS X, you may also need to add /usr/local/include/ to your build path (e.g. when compiling with libtomlc99):&lt;br /&gt;
&lt;br /&gt;
 $ export C_INCLUDE_PATH=/usr/local/include&lt;br /&gt;
&lt;br /&gt;
There is a known issue with homebrew and protobuf-c 1.5.0.4:&lt;br /&gt;
 https://github.com/Homebrew/homebrew-core/issues/168501&lt;br /&gt;
 https://github.com/protobuf-c/protobuf-c/pull/711&lt;br /&gt;
&lt;br /&gt;
A confirmed workaround is to replace &amp;quot;protoc-c&amp;quot; with &amp;quot;protoc&amp;quot; in the build.cmake scripts for the following components before running make:&lt;br /&gt;
 libouroboros-common&lt;br /&gt;
 libouroboros-irm&lt;br /&gt;
 ipcpd-unicast&lt;br /&gt;
&lt;br /&gt;
== Configuration file support ==&lt;br /&gt;
&lt;br /&gt;
It is highly recommended you install [https://github.com/cktan/tomlc99 libtomlc99] &#039;&#039;before&#039;&#039; building O7s to enable configuration file support.&lt;br /&gt;
&lt;br /&gt;
=== GNU/Linux and mac OS X ===&lt;br /&gt;
&lt;br /&gt;
 git clone https://github.com/cktan/tomlc99&lt;br /&gt;
 cd tomlc99&lt;br /&gt;
 make &amp;amp;&amp;amp; sudo make install&lt;br /&gt;
&lt;br /&gt;
=== FreeBSD ===&lt;br /&gt;
&lt;br /&gt;
The tomlc99 makefiles contain directives specific to GNU make. You will need to install and use gmake instead of make: &lt;br /&gt;
&lt;br /&gt;
 pkg install gmake&lt;br /&gt;
&lt;br /&gt;
 git clone https://github.com/cktan/tomlc99&lt;br /&gt;
 cd tomlc99&lt;br /&gt;
 gmake &amp;amp;&amp;amp; sudo gmake install&lt;br /&gt;
&lt;br /&gt;
== Installation instructions ==&lt;br /&gt;
&lt;br /&gt;
=== Arch Linux ===&lt;br /&gt;
&lt;br /&gt;
Ouroboros is available as an [https://aur.archlinux.org/packages/ouroboros-git AUR package], which will install all dependencies (except configfile support) and a Release build from the master branch. To enable configfile support, install tomlc99 before building this AUR package.&lt;br /&gt;
&lt;br /&gt;
=== From source ===&lt;br /&gt;
&lt;br /&gt;
When installing from source, go to the cloned git repository or extract the tarball and enter the main directory. We recommend creating a build directory inside this directory.&lt;br /&gt;
Run cmake providing the path to where you cloned the Ouroboros repository. Assuming you created the build directory inside the repository directory, the following commands build and install O7s:&lt;br /&gt;
&lt;br /&gt;
 $ cd &amp;lt;path/to/ouroboros/repo&amp;gt;&lt;br /&gt;
 $ mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
 $ cmake ..    # optional: configure build parameters&lt;br /&gt;
 $ make &amp;amp;&amp;amp; sudo make install&lt;br /&gt;
&lt;br /&gt;
== Running the unit tests ==&lt;br /&gt;
&lt;br /&gt;
To compile and run the unit tests, do&lt;br /&gt;
&lt;br /&gt;
 $ make check&lt;br /&gt;
&lt;br /&gt;
Note that &amp;quot;make test&amp;quot; will only try to run the tests, not compile the necessary sources and may result in errors.&lt;br /&gt;
&lt;br /&gt;
== Build configuration parameters ==&lt;br /&gt;
&lt;br /&gt;
At compile time, there are a number of parameters that can be tweaked, for instance to enable debug logging, enable various sanitizers, to increase performance or decrease memory consumption. You can find a full list on the [[Ouroboros Build Parameters]] page.&lt;br /&gt;
&lt;br /&gt;
== Remove Ouroboros ==&lt;br /&gt;
&lt;br /&gt;
To uninstall Ouroboros, simply execute the following command from your build directory:&lt;br /&gt;
&lt;br /&gt;
 $ sudo make uninstall&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Implementation_Overview&amp;diff=1484</id>
		<title>Ouroboros Implementation Overview</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Implementation_Overview&amp;diff=1484"/>
		<updated>2024-02-18T22:48:03Z</updated>

		<summary type="html">&lt;p&gt;Thijs: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{under construction}}&lt;br /&gt;
&lt;br /&gt;
The Ouroboros prototype is far from complete. In order to come to a usable [[Prototype Version History| production version]], a lot more implementation is needed. We have a [https://tree.taiga.io/project/dstaesse-ouroboros/kanban kanban board] tracking to-do items.&lt;br /&gt;
&lt;br /&gt;
This page provides an overview of the current implementation status of the O7s prototype. It follows the directory structure of the repository and for each item explains what is currently implemented, stability of the current implementation, what is planned and the direction we would like to move towards. Some big items, the most prominent one being management of namespaces (ownership and scalability of service names) have not started yet.&lt;br /&gt;
&lt;br /&gt;
Ironically, this page is currently even less complete than the prototype. Bear with me.&lt;br /&gt;
&lt;br /&gt;
= Library =&lt;br /&gt;
&lt;br /&gt;
The ouroboros library &lt;br /&gt;
&lt;br /&gt;
== Application end-to-end functions ==&lt;br /&gt;
&lt;br /&gt;
These are the functions that are typically called by an application programmer to interact with the network.&lt;br /&gt;
&lt;br /&gt;
=== Application flow allocation API ===&lt;br /&gt;
&lt;br /&gt;
==== Byte-Stream ====&lt;br /&gt;
&lt;br /&gt;
=== Application flow management API ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Synchronous IPC API ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Asynchronous IPC API ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Application end-to-end background tasks ==&lt;br /&gt;
&lt;br /&gt;
These functions are background tasks that are not directly visible to the application programmer.&lt;br /&gt;
&lt;br /&gt;
=== FRCT ===&lt;br /&gt;
&lt;br /&gt;
[[FRCT]], implements [[FRCP]]&lt;br /&gt;
&lt;br /&gt;
=== Encryption ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Authentication ===&lt;br /&gt;
&lt;br /&gt;
Not yet implemented.&lt;br /&gt;
&lt;br /&gt;
=== Integrity ===&lt;br /&gt;
&lt;br /&gt;
CRC&lt;br /&gt;
&lt;br /&gt;
= IRMd =&lt;br /&gt;
&lt;br /&gt;
= IPCPs =&lt;br /&gt;
&lt;br /&gt;
== Common ==&lt;br /&gt;
This implements &lt;br /&gt;
&lt;br /&gt;
=== Enrollment ===&lt;br /&gt;
&lt;br /&gt;
=== Connection Manager ===&lt;br /&gt;
&lt;br /&gt;
== Unicast ==&lt;br /&gt;
&lt;br /&gt;
== Broadcast ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Directory ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Flow allocator ==&lt;br /&gt;
&lt;br /&gt;
[[Ouroboros Flow Allocation Protocol]]&lt;br /&gt;
&lt;br /&gt;
== Packet Transfer ==&lt;br /&gt;
&lt;br /&gt;
[[ODTP]]&lt;br /&gt;
&lt;br /&gt;
= Tools =&lt;br /&gt;
&lt;br /&gt;
== irm ==&lt;br /&gt;
Main page: [[Ouroboros Command Line Interface]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== oecho ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== oping ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== operf ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ocbr ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ovpn ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Programming language support =&lt;br /&gt;
&lt;br /&gt;
The prototype itself is written in C for performance, but bindings for other languages are available or planned&lt;br /&gt;
&lt;br /&gt;
== Golang ==&lt;br /&gt;
&lt;br /&gt;
Planned&lt;br /&gt;
&lt;br /&gt;
== Python 3 ==&lt;br /&gt;
&lt;br /&gt;
[[pyOuroboros]]&lt;br /&gt;
&lt;br /&gt;
== Rust ==&lt;br /&gt;
&lt;br /&gt;
A [[OuroboRs|rust interface]] is available.&lt;br /&gt;
&lt;br /&gt;
= Other tools =&lt;br /&gt;
&lt;br /&gt;
== Logging ==&lt;br /&gt;
The Ouroboros log format:&amp;lt;/br&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
 ==06773== irmd(II): Created IPCP 6794.&lt;br /&gt;
 ==06794== ipcpd/ipcp(II): Bootstrapping...&lt;br /&gt;
 ==06794== ipcpd/ipcp(II): Finished bootstrapping:  0.&lt;br /&gt;
 ==06773== irmd(II): Bootstrapped IPCP 6794 in layer local-layer.&lt;br /&gt;
With &amp;lt;code&amp;gt;==&amp;lt;process number&amp;gt;== &amp;lt;O7s component&amp;gt;(&amp;lt;log level&amp;gt;): &amp;lt;log message&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* II = info&lt;br /&gt;
* DB = Debug&lt;br /&gt;
* WW = Warning&lt;br /&gt;
* EE = Error&lt;br /&gt;
&lt;br /&gt;
A parsable format for observation is still to be implemented.&lt;br /&gt;
Logging to syslog is interesting, since the format is more standard.&lt;br /&gt;
&lt;br /&gt;
== Rumba orchestration framework ==&lt;br /&gt;
&lt;br /&gt;
Main page: [[Rumba]]&lt;br /&gt;
&lt;br /&gt;
== Ouroboros metrics ==&lt;br /&gt;
Main page: [[Ouroboros Metrics]]&lt;br /&gt;
&lt;br /&gt;
= Ports =&lt;br /&gt;
&lt;br /&gt;
== netcat ==&lt;br /&gt;
&lt;br /&gt;
== ioq3 ==&lt;br /&gt;
&lt;br /&gt;
= Licenses =&lt;br /&gt;
&lt;br /&gt;
The Ouroboros Library is Licensed under LGPL2.1. The IRMd and IPCPs are Licensed under GPL2.1. Tools are licensed under 3-clause BSD.&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Metrics&amp;diff=1482</id>
		<title>Ouroboros Metrics</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Metrics&amp;diff=1482"/>
		<updated>2024-01-18T22:39:33Z</updated>

		<summary type="html">&lt;p&gt;Thijs: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Under construction}}&lt;br /&gt;
&lt;br /&gt;
[[File: Grafana_dashboard_demo.png|border|right|thumb|frame|Ouroboros Dashboard]]&lt;br /&gt;
&lt;br /&gt;
A collection of observability tools for exporting and visualising metrics collected from Ouroboros.&lt;br /&gt;
&lt;br /&gt;
Currently has one very simple exporter for InfluxDB, and provides additional visualization via grafana.&lt;br /&gt;
&lt;br /&gt;
More features will be added over time.&lt;br /&gt;
&lt;br /&gt;
= Requirements =&lt;br /&gt;
See also [[#Step by step instructions| the step-by-step instructions]] for the python dependencies, including using a virtual environment.&lt;br /&gt;
&lt;br /&gt;
* Ouroboros version &amp;gt;= 0.18.3&lt;br /&gt;
* [https://docs.influxdata.com/influxdb/v2.0/ InfluxDB OSS 2.0]&lt;br /&gt;
* python influxdb-client, install via &amp;lt;code&amp;gt;pip install &#039;influxdb-client[ciso]&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
* And you might also need pytz: &amp;lt;code&amp;gt;pip install pytz&amp;lt;/code&amp;gt;&lt;br /&gt;
* It is highly recommended to install [https://grafana.com/ grafana] for visualization.&lt;br /&gt;
&lt;br /&gt;
= Setup InfluxDB  =&lt;br /&gt;
&lt;br /&gt;
Install and run InfluxDB and create a bucket in InfluxDB for exporting Ouroboros metrics, and an API token for (reading and) writing to that bucket. Consult the [https://docs.influxdata.com/influxdb/v2.0/get-started/#set-up-influxdb InfluxDB documentation] on how to do this. The default bucket name for the exporter is &#039;&#039;ouroboros-metrics&#039;&#039;, and it is simplest to use that name.&lt;br /&gt;
&lt;br /&gt;
= Set up Grafana =&lt;br /&gt;
&lt;br /&gt;
To use grafana, [https://grafana.com/grafana/download install and run grafana open source]. &lt;br /&gt;
&lt;br /&gt;
Go to the grafana UI (usually [http://localhost:3000 http://localhost:3000]) and set up InfluxDB as your datasource: Go to Configuration -&amp;gt; Datasources -&amp;gt; Add datasource and select InfluxDB Set “flux” as the Query Language, and under “InfluxDB Details” set your Organization as in InfluxDB and set the copy/paste an API token for reading the bucket to the Token field.&lt;br /&gt;
&lt;br /&gt;
To add the Ouroboros dashboard, select Dashboards -&amp;gt; Manage -&amp;gt; Import&lt;br /&gt;
&lt;br /&gt;
and then either upload the json file from the metrics repository in&lt;br /&gt;
&lt;br /&gt;
dashboards-grafana/general.json&lt;br /&gt;
&lt;br /&gt;
or copy the contents of that file to the “Import via panel json” textbox and click “Load”.&lt;br /&gt;
&lt;br /&gt;
The dashboard in the repository assumes the bucket name to be &#039;&#039;ouroboros-metrics&#039;&#039;, and will require editing if you want to use a different bucket name.&lt;br /&gt;
&lt;br /&gt;
== Step by step instructions ==&lt;br /&gt;
&lt;br /&gt;
On each of the machines running O7s, install the exporter&lt;br /&gt;
&lt;br /&gt;
 git clone https://ouroboros.rocks/git/ouroboros-metrics&lt;br /&gt;
 cd ouroboros-metrics&lt;br /&gt;
 cd exporters-influxdb/pyExporter/&lt;br /&gt;
&lt;br /&gt;
It is common to create a virtual environment for Python and install the dependencies&lt;br /&gt;
&lt;br /&gt;
 python -m venv ./venv&lt;br /&gt;
 source venv/bin/activate&lt;br /&gt;
 pip install --upgrade pip&lt;br /&gt;
 pip install influxdb_client[ciso] pytz&lt;br /&gt;
 &lt;br /&gt;
Edit the config.ini.example file and fill out the InfluxDB information (token, org). This file will be identical on all machines.&lt;br /&gt;
 [influx2]&lt;br /&gt;
 url=http://&amp;lt;IP address of machine running InfluxDB&amp;gt;:8086&lt;br /&gt;
 org=&amp;lt;your-org&amp;gt;&lt;br /&gt;
 token=&amp;lt;your-token&amp;gt;&lt;br /&gt;
 timeout=6000&lt;br /&gt;
 verify_ssl=False&lt;br /&gt;
&lt;br /&gt;
Save it as config.ini.&lt;br /&gt;
&lt;br /&gt;
Now you can run the exporter:&lt;br /&gt;
&lt;br /&gt;
 python oexport.py&lt;br /&gt;
&lt;br /&gt;
Options for the exporter can be shown using&lt;br /&gt;
&lt;br /&gt;
 $ python oexport.py --help&lt;br /&gt;
 usage: oexport.py [-h] [-i INTERVAL] [-b BUCKET]&lt;br /&gt;
 &lt;br /&gt;
 Ouroboros InfluxDB metrics exporter&lt;br /&gt;
 &lt;br /&gt;
 options:&lt;br /&gt;
   -h, --help            show this help message and exit&lt;br /&gt;
   -i INTERVAL, --interval INTERVAL&lt;br /&gt;
                         Interval at which to collect metrics (milliseconds)&lt;br /&gt;
   -b BUCKET, --bucket BUCKET&lt;br /&gt;
                         InfluxDB bucket to write to&lt;br /&gt;
&lt;br /&gt;
For instance, if you chose a different InfluxDB bucket name, run the exporter using the --bucket &amp;lt;yourbucketname&amp;gt; option.&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Rumba&amp;diff=1481</id>
		<title>Rumba</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Rumba&amp;diff=1481"/>
		<updated>2024-01-18T21:58:32Z</updated>

		<summary type="html">&lt;p&gt;Thijs: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Under construction}} (see https://ouroboros.rocks/docs/tools/rumba/)&lt;br /&gt;
&lt;br /&gt;
Rumba is a Python framework for setting up Ouroboros and RINA networks in a test environment that was developed during the [[History of Ouroboros#ARCFIRE | ARCFIRE]] project. Its main objectives are to configure networks and to evaluate the impact of the architecture on configuration management and devops in computer and telecommunications networks. The original Rumba project page is [https://gitlab.com/ARCFIRE/Rumba here].&lt;br /&gt;
&lt;br /&gt;
Rumba can quickly set up test networks for Ouroboros that are made up of many IPCPs and Layers. We keep a version on this site up-to-date with the Ouroboros prototype.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
* easily define network topologies&lt;br /&gt;
&lt;br /&gt;
* Support for different prototypes:&lt;br /&gt;
** Ouroboros&amp;lt;ref&amp;gt;Only Ouroboros is maintained in our git clone, it may not work anymore with rlite and IRATI.&amp;lt;/ref&amp;gt;&lt;br /&gt;
** rlite&lt;br /&gt;
** IRATI&lt;br /&gt;
&lt;br /&gt;
* create these networks using different possible environments:&lt;br /&gt;
** local PC (Ouroboros only)&lt;br /&gt;
** docker container&lt;br /&gt;
** virtual machine (qemu)&lt;br /&gt;
** [https://jfed.ilabt.imec.be/ jFed] testbeds&lt;br /&gt;
&lt;br /&gt;
* script experiments&lt;br /&gt;
&lt;br /&gt;
* rudimentary support for drawing these networks (using pydot)&lt;br /&gt;
&lt;br /&gt;
== Install Rumba ==&lt;br /&gt;
We forked Rumba with the Ouroboros website, and you should get this forked version for use with Ouroboros.&lt;br /&gt;
It should work with most python versions, but I recommend using a recent version (currently &amp;gt;= Python3.9).&lt;br /&gt;
&lt;br /&gt;
 git clone https://ouroboros.rocks/git/rumba&lt;br /&gt;
 cd rumba&lt;br /&gt;
 # Recommended: create/enter python virtual environment (e.g. the same created for [[Ouroboros Metrics|InfluxDB &amp;amp; grafana]])&lt;br /&gt;
 # If not, then it will install system-wide (use sudo in that case)&lt;br /&gt;
 pip install .&lt;br /&gt;
 # OR, if you want all 3 extra features&lt;br /&gt;
 pip install &amp;quot;.[NumpyAcceleration,graphs,visualizer]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Use Rumba ==&lt;br /&gt;
The Rumba model is heavily based on [[RINA]] terminology (since it was originally developed within a RINA research project). We will probably align the terminology in Rumba with Ouroboros in the near future. I will break down a typical Rumba experiment definition and show how to use Rumba in Python interactive mode. You can download the complete example experiment definition [https://{{SERVERNAME}}/docs/tools/rumba_example.py here]. The example uses the Ouroboros prototype, and we will run the setup on the local testbed since that is available on any machine and doesn’t require additional dependencies. We use the local testbed a lot for quick development testing and debugging. I will also show the experiment definition for the virtual wall server testbed at Ghent University as an example for researchers who have access to this testbed. If you have docker or qemu installed, feel free to experiment with these at your leisure.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Prototype&amp;diff=1480</id>
		<title>Ouroboros Prototype</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Prototype&amp;diff=1480"/>
		<updated>2024-01-17T10:15:35Z</updated>

		<summary type="html">&lt;p&gt;Thijs: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Under construction}}&lt;br /&gt;
&lt;br /&gt;
The Ouroboros prototype is a user-space decentralized packet network implementation based on an overhauled [[Ouroboros Model| networking model]]. It is being developed in C for POSIX operating systems.&lt;br /&gt;
&lt;br /&gt;
This prototype is very much a work in progress.&lt;br /&gt;
&lt;br /&gt;
On this page are instructions for installing the prototype. Once done, head to the [[Ouroboros Tutorials | tutorials]] section. The [https://ouroboros.rocks/docs old documentation website] is still available for reference, but only this wiki is maintained. &lt;br /&gt;
&lt;br /&gt;
= Install the Prototype =&lt;br /&gt;
&lt;br /&gt;
The prototype consists of the &#039;&#039;&#039;library&#039;&#039;&#039;, which provides the core Application Programming Interfaces (Unicast API and Broadcast API), the functions of the [[Ouroboros Functional Layering | application end-to-end layer]] and various functions used by the other components in the prototype; the IPC Resource Management daemon &#039;&#039;&#039;IRMd&#039;&#039;&#039;, which is the core component for administering Ouroboros; the &#039;&#039;&#039;IPCPs&#039;&#039;&#039; that actually forward packets and make up the (peer-to-peer) packet network; and a collection of &#039;&#039;&#039;tools&#039;&#039;&#039;, of which the most important is the IPC Resource Management (IRM) Command Line Interface (CLI) for management and some basic tools for demo purposes. In addition, there is an [[Rumba | orchestration framework]] for setting up experiments and an [[Ouroboros metrics | InfluxDB exporter]] for observability. The prototype is written in C, but we provide some APIs for other popular languages, currently [[pyOuroboros | Python]] and [[OuroboRs | Rust]].&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
Ouroboros builds on most POSIX compliant systems. Below you will find instructions for GNU/Linux, FreeBSD and OS X. On Windows 10, you can build Ouroboros using the [https://learn.microsoft.com/en-us/windows/wsl/install Linux Subsystem for Windows].&lt;br /&gt;
&lt;br /&gt;
== Get Ouroboros ==&lt;br /&gt;
&lt;br /&gt;
You can clone Ouroboros using the command line from its website or, if you prefer you can clone and/or fork from our [https://github.com/dstaesse/ouroboros Github] or [https://bitbucket.org/dstaesse/ouroboros BitBucket] mirrors.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
$ git clone https://ouroboros.rocks/git/ouroboros&lt;br /&gt;
$ git clone git://ouroboros.rocks/ouroboros&lt;br /&gt;
$ git clone https://github.com/dstaesse/ouroboros&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Another option is downloading a [https://{{SERVERNAME}}/cgit/ouroboros snapshot] tarball and extracting it.&lt;br /&gt;
Optional repositories are [[pyOuroboros]], a Python wrapper to write Ouroboros programs in Python, and [[Ouroboros metrics | ouroboros-metrics]] that contains an [https://influxdb.com InfluxDB] exporter.&lt;br /&gt;
&lt;br /&gt;
== Dependencies ==&lt;br /&gt;
&lt;br /&gt;
To build Ouroboros, you need cmake, google protocol buffers installed in addition to a C compiler (gcc or clang) and make.&lt;br /&gt;
&lt;br /&gt;
On GNU/Linux you will need either libgcrypt (≥ 1.7.0) or libssl if your glibc is older than version 2.25.&lt;br /&gt;
&lt;br /&gt;
On OS X, you will need homebrew. [https://developer.apple.com/library/archive/documentation/Security/Conceptual/System_Integrity_Protection_Guide/ConfiguringSystemIntegrityProtection/ConfiguringSystemIntegrityProtection.html Disable System Integrity Protection] during the installation and/or removal of Ouroboros.&lt;br /&gt;
&lt;br /&gt;
Optionally, you can also install libgcrypt, libssl (to enable encryption), fuse (to enable exporting internal metrics), and dnsutils (to enable use of a DynDNS server to be used as a naming directory for a UDP layer). Setting up a DNS server (e.g. bind) is out of scope of this installation guide.&lt;br /&gt;
&lt;br /&gt;
=== Debian/Ubuntu Linux ===&lt;br /&gt;
&lt;br /&gt;
 $ apt-get install git protobuf-c-compiler cmake&lt;br /&gt;
 $ apt-get install libgcrypt20-dev libssl-dev libfuse-dev dnsutils cmake-curses-gui&lt;br /&gt;
&lt;br /&gt;
If during the build process cmake complains that the Protobuf C compiler is required but not found, and you installed the protobuf-c-compiler package, you will also need this:&lt;br /&gt;
&lt;br /&gt;
 $ apt-get install libprotobuf-c-dev&lt;br /&gt;
&lt;br /&gt;
=== Arch Linux ===&lt;br /&gt;
&lt;br /&gt;
 $ pacman -S git protobuf-c cmake&lt;br /&gt;
 $ pacman -S libgcrypt openssl fuse dnsutils&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width:400px; overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Note AUR: &lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
There is an unmaintained [https://aur.archlinux.org/packages/ouroboros-git AUR] package which installs also the dependencies. It clones directly from the git repository and builds. Please report any issues since it&#039;s not actively supported at the moment.&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FreeBSD 11/12/13 ===&lt;br /&gt;
&lt;br /&gt;
 $ pkg install git protobuf-c cmake&lt;br /&gt;
 $ pkg install libgcrypt openssl fusefs-libs bind-tools&lt;br /&gt;
&lt;br /&gt;
=== Mac OS X 10/11/12 ===&lt;br /&gt;
&lt;br /&gt;
 $ brew install git protobuf-c cmake&lt;br /&gt;
 $ brew install libgcrypt openssl&lt;br /&gt;
&lt;br /&gt;
== Configuration file support ==&lt;br /&gt;
&lt;br /&gt;
It is highly recommended you install [https://github.com/cktan/tomlc99 libtomlc99] &#039;&#039;before&#039;&#039; building O7s to enable configuration file support.&lt;br /&gt;
&lt;br /&gt;
To install (on GNU/Linux):&lt;br /&gt;
&lt;br /&gt;
 git clone https://github.com/cktan/tomlc99&lt;br /&gt;
 cd tomlc99&lt;br /&gt;
 make &amp;amp;&amp;amp; sudo make install&lt;br /&gt;
&lt;br /&gt;
== Installation instructions ==&lt;br /&gt;
&lt;br /&gt;
When installing from source, go to the cloned git repository or extract the tarball and enter the main directory. We recommend creating a build directory inside this directory.&lt;br /&gt;
Run cmake providing the path to where you cloned the Ouroboros repository. Assuming you created the build directory inside the repository directory, the following commands build and install O7s:&lt;br /&gt;
&lt;br /&gt;
 $ cd &amp;lt;path/to/ouroboros/repo&amp;gt;&lt;br /&gt;
 $ mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
 $ cmake ..    # optional: configure build parameters&lt;br /&gt;
 $ make &amp;amp;&amp;amp; sudo make install&lt;br /&gt;
&lt;br /&gt;
== Running the unit tests ==&lt;br /&gt;
&lt;br /&gt;
To compile and run the unit tests, do&lt;br /&gt;
&lt;br /&gt;
 $ make check&lt;br /&gt;
&lt;br /&gt;
Note that &amp;quot;make test&amp;quot; will only try to run the tests, not compile the necessary sources and may result in errors.&lt;br /&gt;
&lt;br /&gt;
== Build configuration parameters ==&lt;br /&gt;
&lt;br /&gt;
At compile time, there are a number of parameters that can be tweaked, for instance to enable debug logging, enable various sanitizers, to increase performance or decrease memory consumption. You can find a full list on the [[Ouroboros Build Parameters]] page.&lt;br /&gt;
&lt;br /&gt;
== Remove Ouroboros ==&lt;br /&gt;
&lt;br /&gt;
To uninstall Ouroboros, simply execute the following command from your build directory:&lt;br /&gt;
&lt;br /&gt;
 $ sudo make uninstall&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Prototype&amp;diff=1479</id>
		<title>Ouroboros Prototype</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Prototype&amp;diff=1479"/>
		<updated>2024-01-17T10:03:25Z</updated>

		<summary type="html">&lt;p&gt;Thijs: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Under construction}}&lt;br /&gt;
&lt;br /&gt;
The Ouroboros prototype is a user-space decentralized packet network implementation based on an overhauled [[Ouroboros Model| networking model]]. It is being developed in C for POSIX operating systems.&lt;br /&gt;
&lt;br /&gt;
This prototype is very much a work in progress.&lt;br /&gt;
&lt;br /&gt;
On this page are instructions for installing the prototype. Once done, head to the [[Ouroboros Tutorials | tutorials]] section. The [https://ouroboros.rocks/docs old documentation website] is still available for reference, but only this wiki is maintained. &lt;br /&gt;
&lt;br /&gt;
= Install the Prototype =&lt;br /&gt;
&lt;br /&gt;
The prototype consists of the &#039;&#039;&#039;library&#039;&#039;&#039;, which provides the core Application Programming Interfaces (Unicast API and Broadcast API), the functions of the [[Ouroboros Functional Layering | application end-to-end layer]] and various functions used by the other components in the prototype; the IPC Resource Management daemon &#039;&#039;&#039;IRMd&#039;&#039;&#039;, which is the core component for administering Ouroboros; the &#039;&#039;&#039;IPCPs&#039;&#039;&#039; that actually forward packets and make up the (peer-to-peer) packet network; and a collection of &#039;&#039;&#039;tools&#039;&#039;&#039;, of which the most important is the IPC Resource Management (IRM) Command Line Interface (CLI) for management and some basic tools for demo purposes. In addition, there is an [[Rumba | orchestration framework]] for setting up experiments and an [[Ouroboros metrics | InfluxDB exporter]] for observability. The prototype is written in C, but we provide some APIs for other popular languages, currently [[pyOuroboros | Python]] and [https://github.com/chritchens/ouroboros-rs Rust].&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
Ouroboros builds on most POSIX compliant systems. Below you will find instructions for GNU/Linux, FreeBSD and OS X. On Windows 10, you can build Ouroboros using the Linux Subsystem for Windows .&lt;br /&gt;
&lt;br /&gt;
== Get Ouroboros ==&lt;br /&gt;
&lt;br /&gt;
You can clone Ouroboros using the command line from its website or, if you prefer you can clone and/or fork from our [https://github.com/dstaesse/ouroboros Github] or [https://bitbucket.org/dstaesse/ouroboros BitBucket] mirrors.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
$ git clone https://ouroboros.rocks/git/ouroboros&lt;br /&gt;
$ git clone git://ouroboros.rocks/ouroboros&lt;br /&gt;
$ git clone https://github.com/dstaesse/ouroboros&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional repositories are [[pyOuroboros]], a Python wrapper to write Ouroboros programs in Python, and [[Ouroboros metrics | ouroboros-metrics]] that contains an [https://influxdb.com InfluxDB] exporter.&lt;br /&gt;
&lt;br /&gt;
== Dependencies ==&lt;br /&gt;
&lt;br /&gt;
To build Ouroboros, you need cmake, google protocol buffers installed in addition to a C compiler (gcc or clang) and make.&lt;br /&gt;
&lt;br /&gt;
On GNU/Linux you will need either libgcrypt (≥ 1.7.0) or libssl if your glibc is older than version 2.25.&lt;br /&gt;
&lt;br /&gt;
On OS X, you will need homebrew. [https://developer.apple.com/library/archive/documentation/Security/Conceptual/System_Integrity_Protection_Guide/ConfiguringSystemIntegrityProtection/ConfiguringSystemIntegrityProtection.html Disable System Integrity Protection] during the installation and/or removal of Ouroboros.&lt;br /&gt;
&lt;br /&gt;
Optionally, you can also install libgcrypt, libssl (to enable encryption), fuse (to enable exporting internal metrics), and dnsutils (to enable use of a DynDNS server to be used as a naming directory for a UDP layer). Setting up a DNS server (e.g. bind) is out of scope of this installation guide.&lt;br /&gt;
&lt;br /&gt;
=== Debian/Ubuntu Linux ===&lt;br /&gt;
&lt;br /&gt;
 $ apt-get install git protobuf-c-compiler cmake&lt;br /&gt;
 $ apt-get install libgcrypt20-dev libssl-dev libfuse-dev dnsutils cmake-curses-gui&lt;br /&gt;
&lt;br /&gt;
If during the build process cmake complains that the Protobuf C compiler is required but not found, and you installed the protobuf-c-compiler package, you will also need this:&lt;br /&gt;
&lt;br /&gt;
 $ apt-get install libprotobuf-c-dev&lt;br /&gt;
&lt;br /&gt;
=== Arch Linux ===&lt;br /&gt;
&lt;br /&gt;
 $ pacman -S git protobuf-c cmake&lt;br /&gt;
 $ pacman -S libgcrypt openssl fuse dnsutils&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible mw-collapsed&amp;quot; style=&amp;quot;width:400px; overflow:auto;&amp;quot;&amp;gt;&lt;br /&gt;
Note AUR: &lt;br /&gt;
&amp;lt;div class=&amp;quot;mw-collapsible-content&amp;quot;&amp;gt;&lt;br /&gt;
There is an unmaintained [https://aur.archlinux.org/packages/ouroboros-git AUR] package which installs also the dependencies. It clones directly from the git repository and builds. Please report any issues since it&#039;s not actively supported at the moment.&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== FreeBSD 11/12/13 ===&lt;br /&gt;
&lt;br /&gt;
 $ pkg install git protobuf-c cmake&lt;br /&gt;
 $ pkg install libgcrypt openssl fusefs-libs bind-tools&lt;br /&gt;
&lt;br /&gt;
=== Mac OS X 10/11/12 ===&lt;br /&gt;
&lt;br /&gt;
 $ brew install git protobuf-c cmake&lt;br /&gt;
 $ brew install libgcrypt openssl&lt;br /&gt;
&lt;br /&gt;
== Configuration file support ==&lt;br /&gt;
&lt;br /&gt;
It is highly recommended you install [https://github.com/cktan/tomlc99 libtomlc99] &#039;&#039;before&#039;&#039; building O7s to enable configuration file support.&lt;br /&gt;
&lt;br /&gt;
To install (on GNU/Linux):&lt;br /&gt;
&lt;br /&gt;
 git clone https://github.com/cktan/tomlc99&lt;br /&gt;
 cd tomlc99&lt;br /&gt;
 make &amp;amp;&amp;amp; sudo make install&lt;br /&gt;
&lt;br /&gt;
== Installation instructions ==&lt;br /&gt;
&lt;br /&gt;
When installing from source, go to the cloned git repository or extract the tarball and enter the main directory. We recommend creating a build directory inside this directory.&lt;br /&gt;
Run cmake providing the path to where you cloned the Ouroboros repository. Assuming you created the build directory inside the repository directory, the following commands build and install O7s:&lt;br /&gt;
&lt;br /&gt;
 $ cd &amp;lt;path/to/ouroboros/repo&amp;gt;&lt;br /&gt;
 $ mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
 $ cmake ..    # optional: configure build parameters&lt;br /&gt;
 $ make &amp;amp;&amp;amp; sudo make install&lt;br /&gt;
&lt;br /&gt;
== Running the unit tests ==&lt;br /&gt;
&lt;br /&gt;
To compile and run the unit tests, do&lt;br /&gt;
&lt;br /&gt;
 $ make check&lt;br /&gt;
&lt;br /&gt;
Note that &amp;quot;make test&amp;quot; will only try to run the tests, not compile the necessary sources and may result in errors.&lt;br /&gt;
&lt;br /&gt;
== Build configuration parameters ==&lt;br /&gt;
&lt;br /&gt;
At compile time, there are a number of parameters that can be tweaked, for instance to enable debug logging, enable various sanitizers, to increase performance or decrease memory consumption. You can find a full list on the [[Ouroboros Build Parameters]] page.&lt;br /&gt;
&lt;br /&gt;
== Remove Ouroboros ==&lt;br /&gt;
&lt;br /&gt;
To uninstall Ouroboros, simply execute the following command from your build directory:&lt;br /&gt;
&lt;br /&gt;
 $ sudo make uninstall&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Rumba&amp;diff=1474</id>
		<title>Rumba</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Rumba&amp;diff=1474"/>
		<updated>2024-01-06T00:41:04Z</updated>

		<summary type="html">&lt;p&gt;Thijs: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Under construction}} (see https://ouroboros.rocks/docs/tools/rumba/)&lt;br /&gt;
&lt;br /&gt;
Rumba is a Python framework for setting up Ouroboros and RINA networks in a test environment that was developed during the [[History of Ouroboros#ARCFIRE | ARCFIRE]] project. Its main objectives are to configure networks and to evaluate the impact of the architecture on configuration management and devops in computer and telecommunications networks. The original Rumba project page is [https://gitlab.com/ARCFIRE/Rumba here].&lt;br /&gt;
&lt;br /&gt;
Rumba can quickly set up test networks for Ouroboros that are made up of many IPCPs and Layers. We keep a version on this site up-to-date with the Ouroboros prototype.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
* easily define network topologies&lt;br /&gt;
&lt;br /&gt;
* Support for different prototypes:&lt;br /&gt;
** Ouroboros&amp;lt;ref&amp;gt;Only Ouroboros is maintained in our git clone, it may not work anymore with rlite and IRATI.&amp;lt;/ref&amp;gt;&lt;br /&gt;
** rlite&lt;br /&gt;
** IRATI&lt;br /&gt;
&lt;br /&gt;
* create these networks using different possible environments:&lt;br /&gt;
** local PC (Ouroboros only)&lt;br /&gt;
** docker container&lt;br /&gt;
** virtual machine (qemu)&lt;br /&gt;
** [https://jfed.ilabt.imec.be/ jFed] testbeds&lt;br /&gt;
&lt;br /&gt;
* script experiments&lt;br /&gt;
&lt;br /&gt;
* rudimentary support for drawing these networks (using pydot)&lt;br /&gt;
&lt;br /&gt;
== Install Rumba ==&lt;br /&gt;
We forked Rumba with the Ouroboros website, and you should get this forked version for use with Ouroboros.&lt;br /&gt;
It should work with most python versions, but I recommend using a recent version (currently &amp;gt;= Python3.9).&lt;br /&gt;
&lt;br /&gt;
 git clone https://ouroboros.rocks/git/rumba&lt;br /&gt;
 cd rumba&lt;br /&gt;
 # Recommended: create/enter python virtual environment (e.g. the same created for [[Ouroboros Metrics|InfluxDB &amp;amp; grafana]])&lt;br /&gt;
 # If not, then it will install system-wide (use sudo in that case)&lt;br /&gt;
 pip install .&lt;br /&gt;
 # OR, if you want all 3 extra features&lt;br /&gt;
 pip install &amp;quot;.[NumpyAcceleration,graphs,visualizer]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
== Use Rumba ==&lt;br /&gt;
The Rumba model is heavily based on [[RINA]] terminology (since it was originally developed within a RINA research project). We will probably align the terminology in Rumba with Ouroboros in the near future. I will break down a typical Rumba experiment definition and show how to use Rumba in Python interactive mode. You can download the complete example experiment definition here. The example uses the Ouroboros prototype, and we will run the setup on the local testbed since that is available on any machine and doesn’t require additional dependencies. We use the local testbed a lot for quick development testing and debugging. I will also show the experiment definition for the virtual wall server testbed at Ghent University as an example for researchers who have access to this testbed. If you have docker or qemu installed, feel free to experiment with these at your leisure.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Source_Code_Guide&amp;diff=1473</id>
		<title>Source Code Guide</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Source_Code_Guide&amp;diff=1473"/>
		<updated>2024-01-05T12:03:24Z</updated>

		<summary type="html">&lt;p&gt;Thijs: Add library lifespan&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Under construction}}&lt;br /&gt;
&lt;br /&gt;
The [https://ouroboros.rocks/cgit/ouroboros main git repository] can be browsed online. We have mirrors on [https://github.com/dstaesse/ouroboros github] or [https://bitbucket.org/dstaesse/ouroboros bitbucket] if you prefer. &amp;lt;br/&amp;gt;&lt;br /&gt;
For bug reports, feature requests or contributions (including git guidelines), see [[Ouroboros Contributions|the contact page]].&lt;br /&gt;
&lt;br /&gt;
== Directory structure ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cmake&#039;&#039;&#039;: This directory contains some CMake additions for building O7s.&lt;br /&gt;
* &#039;&#039;&#039;doc&#039;&#039;&#039;: This directory holds some documentation, most notably the man pages.&lt;br /&gt;
* &#039;&#039;&#039;include&#039;&#039;&#039;: Includes public O7s headers for implementing Ouroboros programs and management tools, and some internal headers that expose functions of the library needed by other O7s components.&lt;br /&gt;
* &#039;&#039;&#039;src&#039;&#039;&#039;: The main implementation, which holds&lt;br /&gt;
** &#039;&#039;&#039;ipcpd&#039;&#039;&#039;: Reference implementation of the different [[IPCP]]s.&lt;br /&gt;
*** &#039;&#039;&#039;common&#039;&#039;&#039;: Elements common to Broadcast and Unicast IPCP&lt;br /&gt;
**** &#039;&#039;&#039;connmgr&#039;&#039;&#039;: Connection manager&lt;br /&gt;
**** &#039;&#039;&#039;enroll&#039;&#039;&#039;: Enrollment&lt;br /&gt;
*** &#039;&#039;&#039;broadcast&#039;&#039;&#039;: Broadcast IPCP &lt;br /&gt;
*** &#039;&#039;&#039;unicast&#039;&#039;&#039;: The unicast IPCP implementation has the following components:&lt;br /&gt;
**** &#039;&#039;&#039;main&#039;&#039;&#039;: The main entry point into the IPCP.&lt;br /&gt;
**** &#039;&#039;&#039;addr-auth&#039;&#039;&#039;: Address authority. This component is used to assign the addresses to the IPCPs. This is an relic from the RINA implementation and will be redesigned to reflect more accurately that addresses are composed of names of forwarding elements.&lt;br /&gt;
**** &#039;&#039;&#039;ca&#039;&#039;&#039;: Congestion avoidance module allowing to select different congestion avoidance strategies. Has multiple policies.&lt;br /&gt;
**** &#039;&#039;&#039;connmgr&#039;&#039;&#039;: Connection manager, it is uses to allocate data transfer (and management) flows between IPCPS. &lt;br /&gt;
***** Data transfer flows carry &#039;&#039;N + 1&#039;&#039; traffic and some internal traffic for the directory and flow allocator. &lt;br /&gt;
***** Management flows are used for the routing component. Will be removed as management flows should be implemented by &#039;&#039;N - 1&#039;&#039; [[broadcast layer]]s. This component is shared with the broadcast IPCP.&lt;br /&gt;
**** &#039;&#039;&#039;dir&#039;&#039;&#039;: Directory module that is backed by a key-value store mapping hashed &#039;&#039;N + 1&#039;&#039; application names to &#039;&#039;N&#039;&#039; addresses. A Distributed Hash Table (dht) is the currently implemented policy.&lt;br /&gt;
**** &#039;&#039;&#039;dt&#039;&#039;&#039;: The data transfer component creates and manages the actual forwarding elements.&lt;br /&gt;
**** &#039;&#039;&#039;fa&#039;&#039;&#039;: The flow allocator, which contains the logic and state needed to create, manage and destroy &#039;&#039;N + 1&#039;&#039; flows.&lt;br /&gt;
**** &#039;&#039;&#039;pff&#039;&#039;&#039;: The packet forwarding function that selects the outgoing flow(s) on which to forward an incoming DT packet. Currently implemented policies allow for a simple, loop-free alternate or multipath capable forwarding table (PFT).&lt;br /&gt;
**** &#039;&#039;&#039;psched&#039;&#039;&#039;: The packet schedulers that schedule packets coming from &#039;&#039;N - 1&#039;&#039; or &#039;&#039;N + 1&#039;&#039; flows, prioritizing them to be handled by the data transfer component.&lt;br /&gt;
**** &#039;&#039;&#039;routing&#039;&#039;&#039;: The component that implements the mechanism to populate the PFTs. Currently holds a link-state routing policy to build an adjacency graph of the layer.&lt;br /&gt;
*** &#039;&#039;&#039;eth&#039;&#039;&#039;: Ethernet IPCs, tunneling O7s over Ethernet DIX or Ethernet 802.2 (LLC).&lt;br /&gt;
*** &#039;&#039;&#039;udp&#039;&#039;&#039;: UDP IPCP, tunneling O7s over UDP/IPv4.&lt;br /&gt;
*** &#039;&#039;&#039;local&#039;&#039;&#039;: A loopback IPCP for local IPC, used for testing.&lt;br /&gt;
** &#039;&#039;&#039;irmd&#039;&#039;&#039;: Reference implementation of a basic IRMd.&lt;br /&gt;
** &#039;&#039;&#039;lib&#039;&#039;&#039;: Implementation of various library functions.&lt;br /&gt;
** &#039;&#039;&#039;tools&#039;&#039;&#039;: Some tools, such as small test programs and the &#039;&#039;IPC Resource Management&#039;&#039; CLI for managing O7s.&lt;br /&gt;
&lt;br /&gt;
== Variables ==&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Ouroboros index of commonly used variable names&lt;br /&gt;
! type !! name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| int&lt;br /&gt;
| fd&lt;br /&gt;
| flow descriptor. It&#039;s the flow analogue to a file descriptor.&lt;br /&gt;
|-&lt;br /&gt;
| struct fcrti *&lt;br /&gt;
| frcti&lt;br /&gt;
| State associated with the [[FRCT | flow and retransmission control task]], the logic that implements the [[FRCP]] protocol.&lt;br /&gt;
|-&lt;br /&gt;
| size_t&lt;br /&gt;
| idx&lt;br /&gt;
| This &#039;&#039;idx&#039;&#039; is an index in the packet buffer (rdrbuff) and used to calculate the location of the packet in reference the base pointer at which the rdrbuff is mapped into each process&#039; memory space.&lt;br /&gt;
|-&lt;br /&gt;
| struct shm_du_buff *&lt;br /&gt;
| sdb&lt;br /&gt;
| shared memory (shm) data unit (du) buffer. The ouroboros &#039;flavored&#039; [https://ftp.gnumonks.org/pub/doc/skb-doc.html skb]. An sdb is a (fixed size) buffer that contains the actual packet data and spare space for (future) packet headers (and packet tails such as CRC), in addition to some metadata for managing the buffer (head and tail offset to the start of the packet, total size of the buffer, ...). The term &#039;data unit&#039; stems from the OSI SDU (service data unit) and PDU (protocol data unit), which were adopted by RINA. &lt;br /&gt;
|-&lt;br /&gt;
| struct shm_rbuff *&lt;br /&gt;
| tx_rb, rx_rb, rb&lt;br /&gt;
| ring buffer. These (small) ring buffers are shared between 2 processes, used to efficiently move packets through the local pipeline. They pass an index that points to an &#039;&#039;sdb&#039;&#039; in the rdrbuff, and are the entry and exit structures with which the application (either a user application or an IPCP) interacts with the end-to-end [[Flow | flow]]. Writing happens to the transmit ring buffer &#039;&#039;tx_rb&#039;&#039;, reading from the receive ring buffer &#039;&#039;rx_rb&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
| struct shm_rdrbuff *&lt;br /&gt;
| rdrb&lt;br /&gt;
| random deletion ring buffer, a quick-and-dirty memory allocator. The block of memory in which Ouroboros stores actual packet data (and metadata) in a (ring buffer) of &#039;&#039;sdb&#039;&#039;s. Packets are allocated at the head of the ringbuffer and removed from the tail. Packets are marked on deletion, and deleting the tail causes a cleanup operation of all marked packets. Needs to be replaced with a more efficient memory allocator at some point.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Coding Guidelines ==&lt;br /&gt;
&lt;br /&gt;
Coding guidelines&lt;br /&gt;
&lt;br /&gt;
The coding guidelines of the main Ouroboros stack are similar as those of the Linux kernel (https://www.kernel.org/doc/html/latest/process/coding-style.html) with the following exceptions:&lt;br /&gt;
&lt;br /&gt;
* Soft tabs are to be used instead of hard tabs&lt;br /&gt;
* A space is to be inserted between a pointer and its object name upon declaration or in function signatures. Example:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
   int * a;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
instead of&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
   int *a;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Don’t explicitly cast malloc, but do&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
   ptr = malloc(sizeof(*ptr) * len);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When checking for invalid pointers use&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
   if (ptr == NULL)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
instead of&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
   if (!ptr)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When in doubt, just browse the code a bit.&lt;br /&gt;
&lt;br /&gt;
== Component lifespan ==&lt;br /&gt;
&lt;br /&gt;
All (sub)components have a similar structure to them.&lt;br /&gt;
&lt;br /&gt;
First their static objects are allocated. If the base object is allocated on the stack, the functions are called init (some internals may be allocated on the heap). If the base object is allocated on the heap (malloc) the functions are called create.&lt;br /&gt;
&lt;br /&gt;
If the object has active components (e.g. spawns internal threads), they will activate as part of a start() call. Do not start threads in an init or create call!&lt;br /&gt;
&lt;br /&gt;
At the end of the object&#039;s lifetime, first the threads are stopped (stop()) call, and the object is destroyed via a fini() call if it was living on the stack, or a destroy() call if it was allocated on the heap. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
   init() / create()&lt;br /&gt;
   &lt;br /&gt;
   start()&lt;br /&gt;
 &lt;br /&gt;
   stop()&lt;br /&gt;
&lt;br /&gt;
   fini() / destroy()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Library lifespan ====&lt;br /&gt;
Ouroboros is provided as a shared library &amp;lt;ref&amp;gt;the &amp;lt;code&amp;gt;*.so&amp;lt;/code&amp;gt; files on Linux, in the ELF format&amp;lt;/ref&amp;gt; to dynamically link against.&lt;br /&gt;
When a program dynamically linking to &amp;lt;code&amp;gt;ouroboros-dev&amp;lt;/code&amp;gt; (like e.g. &amp;lt;code&amp;gt;oecho&amp;lt;/code&amp;gt;) is started, it automatically loads this shared library at load time.&lt;br /&gt;
The Ouroboros dynamic library has some [http://ftp.math.utah.edu/u/ma/hohn/linux/misc/elf/node3.html .init and .fini sections]&lt;br /&gt;
&amp;lt;ref&amp;gt;Actually, for O7s they are &amp;lt;code&amp;gt;.init_array&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;.fini_array&amp;lt;/code&amp;gt; on most platforms, but [https://maskray.me/blog/2021-11-07-init-ctors-init-array the idea remains the same].&amp;lt;/ref&amp;gt;&lt;br /&gt;
containing the &amp;lt;code&amp;gt;init()&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;fini()&amp;lt;/code&amp;gt; functions, which are run when (un)loaded.&lt;br /&gt;
&lt;br /&gt;
Interesting to know is that this &amp;lt;code&amp;gt;init()&amp;lt;/code&amp;gt; function will &amp;lt;code&amp;gt;exit&amp;lt;/code&amp;gt; the process if the IRMd is not reachable.&lt;br /&gt;
Thus, the process is stopped at load time, meaning that even a simple &amp;lt;code&amp;gt;oecho --help&amp;lt;/code&amp;gt; will not work.&lt;br /&gt;
This is intended, because ultimately, the IRMd is considered part of the always present Operating System (and no threads should be actively waiting for this invariant).&lt;br /&gt;
The &amp;lt;code&amp;gt;--help&amp;lt;/code&amp;gt; case is unusual enough for networked applications that we don&#039;t want to design against the actual goals/principles&lt;br /&gt;
&amp;lt;ref name=&amp;quot;init-goals&amp;quot;&amp;gt;At some point, we want to get rid of the POSIX sockets and bootstrap/run all IPC over O7s, and when that is the case, the IRMd needs to be up at init.&lt;br /&gt;
That is one of the promises of the prototype: unification of all IPC and networking.&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
A workaround is loading the shared library at &#039;&#039;runtime&#039;&#039;, only when needed to start the communication.&lt;br /&gt;
This uses e.g. &amp;lt;code&amp;gt;dlopen()&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;dlclose()&amp;lt;/code&amp;gt;/... .&lt;br /&gt;
In fact, an early implementation required a call to &amp;lt;code&amp;gt;ouroboros_init()&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;ouroboros_fini()&amp;lt;/code&amp;gt;, but this is not ergonomic nor aligned with the goals&amp;lt;ref name=&amp;quot;init-goals&amp;quot; /&amp;gt;.&lt;br /&gt;
&amp;lt;ref&amp;gt;Another possibility for the O7s library is to hide this in e.g. &amp;lt;code&amp;gt;flow_alloc()&amp;lt;/code&amp;gt;, but it would be inefficient to check this each time.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Implementation_Overview&amp;diff=1472</id>
		<title>Ouroboros Implementation Overview</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Implementation_Overview&amp;diff=1472"/>
		<updated>2024-01-05T10:29:00Z</updated>

		<summary type="html">&lt;p&gt;Thijs: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{under construction}}&lt;br /&gt;
&lt;br /&gt;
The Ouroboros prototype is far from complete. In order to come to a usable [[Prototype Version History| production version]], a lot more implementation is needed. We have a [https://tree.taiga.io/project/dstaesse-ouroboros/kanban kanban board] tracking to-do items.&lt;br /&gt;
&lt;br /&gt;
This page provides an overview of the current implementation status of the O7s prototype. It follows the directory structure of the repository and for each item explains what is currently implemented, stability of the current implementation, what is planned and the direction we would like to move towards. Some big items, the most prominent one being management of namespaces (ownership and scalability of service names) have not started yet.&lt;br /&gt;
&lt;br /&gt;
Ironically, this page is currently even less complete than the prototype. Bear with me.&lt;br /&gt;
&lt;br /&gt;
= Library =&lt;br /&gt;
&lt;br /&gt;
The ouroboros library &lt;br /&gt;
&lt;br /&gt;
== Application end-to-end functions ==&lt;br /&gt;
&lt;br /&gt;
These are the functions that are typically called by an application programmer to interact with the network.&lt;br /&gt;
&lt;br /&gt;
=== Application flow allocation API ===&lt;br /&gt;
&lt;br /&gt;
==== Byte-Stream ====&lt;br /&gt;
&lt;br /&gt;
=== Application flow management API ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Synchronous IPC API ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Asynchronous IPC API ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Application end-to-end background tasks ==&lt;br /&gt;
&lt;br /&gt;
These functions are background tasks that are not directly visible to the application programmer.&lt;br /&gt;
&lt;br /&gt;
=== FRCT ===&lt;br /&gt;
&lt;br /&gt;
[[FRCT]], implements [[FRCP]]&lt;br /&gt;
&lt;br /&gt;
=== Encryption ===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Authentication ===&lt;br /&gt;
&lt;br /&gt;
Not yet implemented.&lt;br /&gt;
&lt;br /&gt;
=== Integrity ===&lt;br /&gt;
&lt;br /&gt;
CRC&lt;br /&gt;
&lt;br /&gt;
= IRMd =&lt;br /&gt;
&lt;br /&gt;
= IPCPs =&lt;br /&gt;
&lt;br /&gt;
== Common ==&lt;br /&gt;
This implements &lt;br /&gt;
&lt;br /&gt;
=== Enrollment ===&lt;br /&gt;
&lt;br /&gt;
=== Connection Manager ===&lt;br /&gt;
&lt;br /&gt;
== Unicast ==&lt;br /&gt;
&lt;br /&gt;
== Broadcast ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Directory ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Flow allocator ==&lt;br /&gt;
&lt;br /&gt;
[[Ouroboros Flow Allocation Protocol]]&lt;br /&gt;
&lt;br /&gt;
== Packet Transfer ==&lt;br /&gt;
&lt;br /&gt;
[[ODTP]]&lt;br /&gt;
&lt;br /&gt;
= Tools =&lt;br /&gt;
&lt;br /&gt;
== irm ==&lt;br /&gt;
Main page: [[Ouroboros Command Line Interface]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== oecho ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== oping ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== operf ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ocbr ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== ovpn ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Programming language support =&lt;br /&gt;
&lt;br /&gt;
The prototype itself is written in C for performance, but bindings for other languages are available or planned&lt;br /&gt;
&lt;br /&gt;
== Golang ==&lt;br /&gt;
&lt;br /&gt;
Planned&lt;br /&gt;
&lt;br /&gt;
== Python 3 ==&lt;br /&gt;
&lt;br /&gt;
[[pyOuroboros]]&lt;br /&gt;
&lt;br /&gt;
== Rust ==&lt;br /&gt;
&lt;br /&gt;
A [[OuroboRs|rust interface]] is available.&lt;br /&gt;
&lt;br /&gt;
= Other tools =&lt;br /&gt;
&lt;br /&gt;
== Rumba orchestration framework ==&lt;br /&gt;
&lt;br /&gt;
Main page: [[Rumba]]&lt;br /&gt;
&lt;br /&gt;
== Ouroboros metrics ==&lt;br /&gt;
Main page: [[Ouroboros Metrics]]&lt;br /&gt;
&lt;br /&gt;
= Ports =&lt;br /&gt;
&lt;br /&gt;
== netcat ==&lt;br /&gt;
&lt;br /&gt;
== ioq3 ==&lt;br /&gt;
&lt;br /&gt;
= Licenses =&lt;br /&gt;
&lt;br /&gt;
The Ouroboros Library is Licensed under LGPL2.1. The IRMd and IPCPs are Licensed under GPL2.1. Tools are licensed under 3-clause BSD.&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Rumba&amp;diff=1471</id>
		<title>Rumba</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Rumba&amp;diff=1471"/>
		<updated>2024-01-05T01:49:58Z</updated>

		<summary type="html">&lt;p&gt;Thijs: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Under construction}} (see https://ouroboros.rocks/docs/tools/rumba/)&lt;br /&gt;
&lt;br /&gt;
Rumba is a Python framework for setting up Ouroboros and RINA networks in a test environment that was developed during the [[History of Ouroboros#ARCFIRE | ARCFIRE]] project. Its main objectives are to configure networks and to evaluate the impact of the architecture on configuration management and devops in computer and telecommunications networks. The original Rumba project page is [https://gitlab.com/ARCFIRE/Rumba here].&lt;br /&gt;
&lt;br /&gt;
Rumba can quickly set up test networks for Ouroboros that are made up of many IPCPs and Layers. We keep a version on this site up-to-date with the Ouroboros prototype.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
* easily define network topologies&lt;br /&gt;
&lt;br /&gt;
* Support for different prototypes:&lt;br /&gt;
** Ouroboros&amp;lt;ref&amp;gt;Only Ouroboros is maintained in our git clone, it may not work anymore with rlite and IRATI.&amp;lt;/ref&amp;gt;&lt;br /&gt;
** rlite&lt;br /&gt;
** IRATI&lt;br /&gt;
&lt;br /&gt;
* create these networks using different possible environments:&lt;br /&gt;
** local PC (Ouroboros only)&lt;br /&gt;
** docker container&lt;br /&gt;
** virtual machine (qemu)&lt;br /&gt;
** [https://jfed.ilabt.imec.be/ jFed] testbeds&lt;br /&gt;
&lt;br /&gt;
* script experiments&lt;br /&gt;
&lt;br /&gt;
* rudimentary support for drawing these networks (using pydot)&lt;br /&gt;
&lt;br /&gt;
== Install Rumba ==&lt;br /&gt;
We forked Rumba with the Ouroboros website, and you should get this forked version for use with Ouroboros.&lt;br /&gt;
It should work with most python versions, but I recommend using a recent version (currently &amp;gt;= Python3.9).&lt;br /&gt;
&lt;br /&gt;
 git clone https://ouroboros.rocks/git/rumba&lt;br /&gt;
 cd rumba&lt;br /&gt;
 # Recommended: create/enter python virtual environment (e.g. the same created for [[Ouroboros Metrics|InfluxDB &amp;amp; grafana]])&lt;br /&gt;
 # If not, then it will install system-wide (use sudo in that case)&lt;br /&gt;
 ./setup.py install&lt;br /&gt;
&lt;br /&gt;
== Use Rumba ==&lt;br /&gt;
The Rumba model is heavily based on [[RINA]] terminology (since it was originally developed within a RINA research project). We will probably align the terminology in Rumba with Ouroboros in the near future. I will break down a typical Rumba experiment definition and show how to use Rumba in Python interactive mode. You can download the complete example experiment definition here. The example uses the Ouroboros prototype, and we will run the setup on the local testbed since that is available on any machine and doesn’t require additional dependencies. We use the local testbed a lot for quick development testing and debugging. I will also show the experiment definition for the virtual wall server testbed at Ghent University as an example for researchers who have access to this testbed. If you have docker or qemu installed, feel free to experiment with these at your leisure.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Recursive_InterNetwork_Architecture&amp;diff=1470</id>
		<title>Recursive InterNetwork Architecture</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Recursive_InterNetwork_Architecture&amp;diff=1470"/>
		<updated>2024-01-05T00:22:06Z</updated>

		<summary type="html">&lt;p&gt;Thijs: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Recursive InterNetwork Architecture [https://en.wikipedia.org/wiki/Recursive_InterNetwork_Architecture RINA] was proposed by [https://en.wikipedia.org/wiki/John_Day_(computer_scientist) John Day].&lt;br /&gt;
See the [[History of Ouroboros]] for more context.&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Glossary&amp;diff=1469</id>
		<title>Glossary</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Glossary&amp;diff=1469"/>
		<updated>2024-01-05T00:21:30Z</updated>

		<summary type="html">&lt;p&gt;Thijs: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Under construction}}&lt;br /&gt;
;Automated Repeat-reQuest (ARQ)&lt;br /&gt;
:Packets are identified by a sequence number and acknowledged by the receiver. Lost packets are retransmitted, usually after receiving a number of duplicate ACKs or a certain timeout.&lt;br /&gt;
&lt;br /&gt;
;Bind&lt;br /&gt;
:The action of associating a name with a program or process. A process bound to a name will respond to incoming flow allocation requests for that name in that system. If a program is bound to a name, all subsequently instantiated processes will be bound to that name.&lt;br /&gt;
&lt;br /&gt;
;Broadcast Flow&lt;br /&gt;
:A broadcast flow is the abstraction for a packet stream that is sent from a source node to a set of nodes. A Broadcast Flow is implemented by a Broadcast Layer.&lt;br /&gt;
&lt;br /&gt;
;Broadcast IPCP&lt;br /&gt;
:A type of IPCP that is used to build Broadcast Layers.&lt;br /&gt;
&lt;br /&gt;
;Broadcast Layer&lt;br /&gt;
:A Layer consisting of Broadcast IPCPs.&lt;br /&gt;
&lt;br /&gt;
;Connection&lt;br /&gt;
:Shared state between two protocol machines.&lt;br /&gt;
&lt;br /&gt;
;Connection establishment&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
;EFCP&lt;br /&gt;
:The protocol inside RINA IPCPs that is responsible for enabling IPC. It is a 2-component protocol consisting of the Data Transfer Protocol (DTP) and a Data Transfer Control protocol (DTCP) which share a state vector.&lt;br /&gt;
&lt;br /&gt;
;Enrollment&lt;br /&gt;
:The action of adding an IPCP or a set of IPCPs to a Layer as an active member.&lt;br /&gt;
&lt;br /&gt;
;Flow&lt;br /&gt;
:A [[Flow Allocation|flow]] is the abstraction for a packet stream between a number of application processes. Ouroboros makes a clear distinction between [[Glossary#Unicast Flow|Unicast flows]] and [[Glossary#Broadcast Flow|Broadcast flows]].&lt;br /&gt;
&lt;br /&gt;
;Flow Allocation&lt;br /&gt;
:The process of creating a flow between two processes.&lt;br /&gt;
&lt;br /&gt;
;Flow Allocator&lt;br /&gt;
:The component in the IPCP that is responsible for &#039;&#039;flow allocation&#039;&#039;, managing flow state and congestion avoidance. &lt;br /&gt;
&lt;br /&gt;
;Flow Descriptor&lt;br /&gt;
:A handle used by an application to manipulate and read/write from/to flows, similar to a file descriptor for files.&lt;br /&gt;
&lt;br /&gt;
;Flooding&lt;br /&gt;
:The algorithm that takes a packet on the incoming flow and then sends it out on all other (outgoing) flows. Flooding is the main algorithm implemented by the Data Transfer component of a Broadcast IPCP.&lt;br /&gt;
&lt;br /&gt;
;Forwarding&lt;br /&gt;
:Any algorithm that takes as input a destination address and gives as output a set of flows. The forwarding algorithm is the main algorithm in the Data Transfer component of the unicast IPCP.&lt;br /&gt;
&lt;br /&gt;
;IPC&lt;br /&gt;
:See Inter-Process Communication.&lt;br /&gt;
&lt;br /&gt;
;IPCP&lt;br /&gt;
:See Inter-Process Communication Process.&lt;br /&gt;
&lt;br /&gt;
;IRMd&lt;br /&gt;
:See Inter-Process Communication Resource Management Daemon.&lt;br /&gt;
&lt;br /&gt;
;Inter-Process Communication (IPC)&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
;Inter-Process Communication Process (IPCP)&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
;Inter-Process Communication Resource Management Daemon (IRMd)&lt;br /&gt;
:The IRMd is the central daemon that performs management functions for Ouroboros. It listens for management commands such as creating/destroying IPCPs, bootstrapping and enrolling IPCPs, binding programs and processes to service names and registering names with an IPCP. &lt;br /&gt;
&lt;br /&gt;
;IP fragmentation problem&lt;br /&gt;
:Retransmission logic is handled by TCP, so the loss of an single IP datagram results in the retransmission of all the fragments constituting a (potentially much larger) TCP frame, instead of just this lost datagram.&lt;br /&gt;
&lt;br /&gt;
;Layer / layer&lt;br /&gt;
:The Ouroboros model is subdivided in [[Ouroboros Functional Layering|layers]] (lowercase), with similar intent as the TCP/IP model (5 layers) or OSI (7 layers) model which it aims to improve upon.&lt;br /&gt;
:Ouroboros is [[Ouroboros Recursive Layers|multi-Layered]] (capitalized), allowing networks to overlay each other. There are 2 types of Layers: Unicast Layers and Broadcast Layers, consisting of Unicast IPCPs and Broadcast IPCPs respectively. Note that they can&#039;t be mixed (a Unicast IPCP can&#039;t enroll with a Broadcast IPCP), but it is of course possible for a program to implement both the Unicast and Broadcast IPCP functionality. The different use of &#039;&#039;layer/Layer&#039;&#039; can be initially confusing, and have considered other options such as &#039;&#039;stratum&#039;&#039;, but for the time being, we stick to Layer / layer.&lt;br /&gt;
&lt;br /&gt;
;Name&lt;br /&gt;
:&#039;&#039;also known as &#039;&#039;&#039;Service Name&#039;&#039;&#039;&lt;br /&gt;
:A non-descript string of characters in some namespace that can be bound to a program or process.&lt;br /&gt;
&lt;br /&gt;
;Process&lt;br /&gt;
:In the Ouroboros framework, the instantiation of a program. It is logically identified by a local Process Identifier (PID), which on POSIX systems maps directly to the process ID (pid).&lt;br /&gt;
&lt;br /&gt;
;Program&lt;br /&gt;
:In the Ouroboros framework, the code (for instance a compiled binary or a script) that can be executed as a Process.&lt;br /&gt;
&lt;br /&gt;
;Raw Flow&lt;br /&gt;
:A best-effort Unicast Flow between two peers without any QoS guarantees.&lt;br /&gt;
&lt;br /&gt;
;RINA&lt;br /&gt;
:[[Recursive InterNetwork Architecture]]&lt;br /&gt;
&lt;br /&gt;
;Routing&lt;br /&gt;
:Any algorithm that can construct a distance function to all other nodes in a Unicast Layer. The literature discerns at least 3 classes of [[Routing]] algorithms: geometric, link-state and distance/path-vector.&lt;br /&gt;
:The output of a routing algorithm is needed to construct a forwarding algorithm. The routing algorithm is the main algorithm in the routing component of the unicast IPCP.&lt;br /&gt;
&lt;br /&gt;
;Unenrollment&lt;br /&gt;
::The action of removing an IPCP or a set of IPCPs to a Layer.&lt;br /&gt;
&lt;br /&gt;
;Unicast Flow&lt;br /&gt;
:A unicast flow is a point-to-point packet stream between two processes. A flow is identified at each end by a &#039;&#039;flow descriptor&#039;&#039;. A unicast flow is implemented as a &#039;&#039;network flow&#039;&#039; between two &#039;&#039;unicast IPCPs&#039;&#039;. A network flow is identified by a 4-tuple &amp;lt;source address, source EID, destination address, destination EID&amp;gt;. The Endpoint Identifiers (EIDs) are agreed upon during [[Flow Allocation]]. A Unicast Flow is not implying an application protocol. &lt;br /&gt;
&lt;br /&gt;
;Unicast IPCP&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
;Unicast Layer&lt;br /&gt;
:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;Whatevercast&lt;br /&gt;
:A proposed RINA concept for the &#039;&#039;unification of unicast, anycast, multicast and broadcast&#039;&#039;. The RINA DIF will resolve the correct set of destination nodes based on the &#039;&#039;whatevercast&#039;&#039; name and a &#039;&#039;set of rules&#039;&#039; associated with it. Our attempt at implementing whatevercast led to us formulating the [[Ouroboros multicast conjecture]].&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Rumba&amp;diff=1468</id>
		<title>Rumba</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Rumba&amp;diff=1468"/>
		<updated>2024-01-05T00:14:53Z</updated>

		<summary type="html">&lt;p&gt;Thijs: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Under construction}} (see https://ouroboros.rocks/docs/tools/rumba/)&lt;br /&gt;
&lt;br /&gt;
Rumba is a Python framework for setting up Ouroboros and RINA networks in a test environment that was developed during the [[History of Ouroboros#ARCFIRE | ARCFIRE]] project. Its main objectives are to configure networks and to evaluate the impact of the architecture on configuration management and devops in computer and telecommunications networks. The original Rumba project page is [https://gitlab.com/ARCFIRE/Rumba here].&lt;br /&gt;
&lt;br /&gt;
Rumba can quickly set up test networks for Ouroboros that are made up of many IPCPs and Layers. We keep a version on this site up-to-date with the Ouroboros prototype.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
* easily define network topologies&lt;br /&gt;
&lt;br /&gt;
* Support for different prototypes:&lt;br /&gt;
** Ouroboros&amp;lt;ref&amp;gt;Only Ouroboros is maintained in our git clone, it may not work anymore with rlite and IRATI.&amp;lt;/ref&amp;gt;&lt;br /&gt;
** rlite&lt;br /&gt;
** IRATI&lt;br /&gt;
&lt;br /&gt;
* create these networks using different possible environments:&lt;br /&gt;
** local PC (Ouroboros only)&lt;br /&gt;
** docker container&lt;br /&gt;
** virtual machine (qemu)&lt;br /&gt;
** [https://jfed.ilabt.imec.be/ jFed] testbeds&lt;br /&gt;
&lt;br /&gt;
* script experiments&lt;br /&gt;
&lt;br /&gt;
* rudimentary support for drawing these networks (using pydot)&lt;br /&gt;
&lt;br /&gt;
== Install Rumba ==&lt;br /&gt;
We forked Rumba with the Ouroboros website, and you should get this forked version for use with Ouroboros.&lt;br /&gt;
It should work with most python versions, but I recommend using a recent version (currently &amp;gt;= Python3.9).&lt;br /&gt;
&lt;br /&gt;
 git clone https://ouroboros.rocks/git/rumba&lt;br /&gt;
 cd rumba&lt;br /&gt;
 # Recommended: create/enter python virtual environment (e.g. the same created for [[Ouroboros Metrics|InfluxDB &amp;amp; grafana]])&lt;br /&gt;
 # If not, then it will install system-wide (use sudo in that case)&lt;br /&gt;
 ./setup.py install&lt;br /&gt;
&lt;br /&gt;
== Use Rumba ==&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Rumba&amp;diff=1467</id>
		<title>Rumba</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Rumba&amp;diff=1467"/>
		<updated>2024-01-05T00:12:24Z</updated>

		<summary type="html">&lt;p&gt;Thijs: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Under construction}} (see https://ouroboros.rocks/docs/tools/rumba/)&lt;br /&gt;
&lt;br /&gt;
Rumba is a Python framework for setting up Ouroboros and RINA networks in a test environment that was developed during the [[History of Ouroboros#ARCFIRE | ARCFIRE]] project. Its main objectives are to configure networks and to evaluate the impact of the architecture on configuration management and devops in computer and telecommunications networks. The original Rumba project page is [https://gitlab.com/ARCFIRE/Rumba here].&lt;br /&gt;
&lt;br /&gt;
Rumba can quickly set up test networks for Ouroboros that are made up of many IPCPs and Layers. We keep a version on this site up-to-date with the Ouroboros prototype.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
* easily define network topologies&lt;br /&gt;
&lt;br /&gt;
* Support for different prototypes:&lt;br /&gt;
** Ouroboros&amp;lt;ref&amp;gt;Only Ouroboros is maintained in our git clone, it may not work anymore with rlite and IRATI.&amp;lt;/ref&amp;gt;&lt;br /&gt;
** rlite&lt;br /&gt;
** IRATI&lt;br /&gt;
&lt;br /&gt;
* create these networks using different possible environments:&lt;br /&gt;
** local PC (Ouroboros only)&lt;br /&gt;
** docker container&lt;br /&gt;
** virtual machine (qemu)&lt;br /&gt;
** [https://jfed.ilabt.imec.be/ jFed] testbeds&lt;br /&gt;
&lt;br /&gt;
* script experiments&lt;br /&gt;
&lt;br /&gt;
* rudimentary support for drawing these networks (using pydot)&lt;br /&gt;
&lt;br /&gt;
== Install Rumba ==&lt;br /&gt;
We forked Rumba with the Ouroboros website, and you should get this forked version for use with Ouroboros.&lt;br /&gt;
It should work with most python versions, but I recommend using a recent version (currently &amp;gt;= Python3.9).&lt;br /&gt;
&lt;br /&gt;
 git clone https://ouroboros.rocks/git/rumba&lt;br /&gt;
 cd rumba&lt;br /&gt;
 # Recommended: create/enter python virtual environment (e.g. the same created for [[Ouroboros Metrics|InfluxDB &amp;amp; grafana]])&lt;br /&gt;
 # If not, then it will install system-wide&lt;br /&gt;
 sudo ./setup.py install&lt;br /&gt;
&lt;br /&gt;
== Use Rumba ==&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Rumba&amp;diff=1466</id>
		<title>Rumba</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Rumba&amp;diff=1466"/>
		<updated>2024-01-04T23:59:13Z</updated>

		<summary type="html">&lt;p&gt;Thijs: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Rumba is a Python framework for setting up Ouroboros and RINA networks in a test environment that was developed during the [[History of Ouroboros#ARCFIRE | ARCFIRE]] project. Its main objectives are to configure networks and to evaluate the impact of the architecture on configuration management and devops in computer and telecommunications networks. The original Rumba project page is [https://gitlab.com/ARCFIRE/Rumba here].&lt;br /&gt;
&lt;br /&gt;
Rumba can quickly set up test networks for Ouroboros that are made up of many IPCPs and Layers. We keep a version on this site up-to-date with the Ouroboros prototype.&lt;br /&gt;
&lt;br /&gt;
== Features ==&lt;br /&gt;
&lt;br /&gt;
* easily define network topologies&lt;br /&gt;
&lt;br /&gt;
* Support for different prototypes:&lt;br /&gt;
** Ouroboros&amp;lt;ref&amp;gt;Only Ouroboros is maintained in our git clone, it may not work anymore with rlite and IRATI.&amp;lt;/ref&amp;gt;&lt;br /&gt;
** rlite&lt;br /&gt;
** IRATI&lt;br /&gt;
&lt;br /&gt;
* create these networks using different possible environments:&lt;br /&gt;
** local PC (Ouroboros only)&lt;br /&gt;
** docker container&lt;br /&gt;
** virtual machine (qemu)&lt;br /&gt;
** [https://jfed.ilabt.imec.be/ jFed] testbeds&lt;br /&gt;
&lt;br /&gt;
* script experiments&lt;br /&gt;
&lt;br /&gt;
* rudimentary support for drawing these networks (using pydot)&lt;br /&gt;
&lt;br /&gt;
{{Under construction}}, see https://ouroboros.rocks/docs/tools/rumba/&lt;br /&gt;
&lt;br /&gt;
==Notes==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=OuroboRs&amp;diff=1465</id>
		<title>OuroboRs</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=OuroboRs&amp;diff=1465"/>
		<updated>2023-12-27T12:22:52Z</updated>

		<summary type="html">&lt;p&gt;Thijs: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Under construction}}&lt;br /&gt;
&lt;br /&gt;
The rust interface is being developed/polished. You can find an initial version [https://codeberg.org/th1j5/ouroboros-rs here].&lt;br /&gt;
The unsafe FFI is already tested by a Rust implementation of the oecho client, but a safe wrapper is being worked on.&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Tech_demos&amp;diff=1464</id>
		<title>Tech demos</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Tech_demos&amp;diff=1464"/>
		<updated>2023-12-25T23:39:46Z</updated>

		<summary type="html">&lt;p&gt;Thijs: /* ioq3 */ Update external links&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= ioq3 =&lt;br /&gt;
&lt;br /&gt;
As a demo, we have added O7s support to the [https://github.com/ioquake/ioq3 ioq3] game engine. ioq3 is a fork of ID software’s [https://github.com/id-Software/Quake-III-Arena Quake III Arena GPL Source Release]. The port is available as a [https://{{SERVERNAME}}/patches/ouroboros-ioq3.patch patch]. The servers currently only work in dedicated mode (there is no way yet to start a server from the client).&lt;br /&gt;
&lt;br /&gt;
To get the demo, first get the latest ioq3 sources:&lt;br /&gt;
&lt;br /&gt;
 $ git clone https://github.com/ioquake/ioq3.git&lt;br /&gt;
 $ cd ioq3&lt;br /&gt;
&lt;br /&gt;
Copy the patch via the link above, or get it via wget:&lt;br /&gt;
&lt;br /&gt;
 $ wget https://ouroboros.rocks/patches/ouroboros-ioq3.patch&lt;br /&gt;
&lt;br /&gt;
Apply the patch to the ioq3 code:&lt;br /&gt;
&lt;br /&gt;
 $ git apply ouroboros-ioq3.patch&lt;br /&gt;
&lt;br /&gt;
With Ouroboros installed, build the ioq3 project in standalone mode:&lt;br /&gt;
&lt;br /&gt;
 $ STANDALONE=1 make&lt;br /&gt;
&lt;br /&gt;
You may need to install some dependencies like [https://wiki.libsdl.org/SDL2/Installation SDL2], see [https://ioquake3.org/help/building-ioquake3/building-ioquake3-on-linux/ the ioq3 documentation].&lt;br /&gt;
&lt;br /&gt;
The ioq3 project only supplies the game engine. To play Quake III Arena, you need the original game files and a valid key. Various open source games make use of the engine. We will detail the procedure for running OpenArena in your ioq3 build directory.&lt;br /&gt;
&lt;br /&gt;
Go to your build directory:&lt;br /&gt;
&lt;br /&gt;
 $ cd build/&amp;lt;release_dir&amp;gt;/&lt;br /&gt;
&lt;br /&gt;
To run OpenArena, you only need to the game files. First download the zip archive (openarena-0.8.8.zip) from the [http://www.openarena.ws/ OpenArena website] (or via wget) and then extract the baseoa folder:&lt;br /&gt;
&lt;br /&gt;
 $ wget http://www.openarena.ws/request.php?4 -O openarena-0.8.8.zip&lt;br /&gt;
 $ unzip -j openarena-0.8.8.zip &#039;openarena-0.8.8/baseoa/*&#039; -d ./baseoa&lt;br /&gt;
&lt;br /&gt;
Make sure you have a local Ouroboros layer running in your system (see [[Ouroboros Tutorial 01|this tutorial]]).&lt;br /&gt;
&lt;br /&gt;
To test the game, start a server (replace with the correct architecture extension for your machine, eg x86_64):&lt;br /&gt;
&lt;br /&gt;
 $ ./ioq3ded.&amp;lt;arch&amp;gt; +set com_basegame baseoa +map aggressor&lt;br /&gt;
&lt;br /&gt;
Bind the pid of the server to a name and register it in the local layer:&lt;br /&gt;
&lt;br /&gt;
 $ irm bind proc &amp;lt;pid&amp;gt; name my.ioq3.server&lt;br /&gt;
 $ irm name reg my.ioq3.server layer &amp;lt;your_local_layer&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To connect, start a client (in a different terminal):&lt;br /&gt;
&lt;br /&gt;
 $ ./ioquake3.&amp;lt;arch&amp;gt; +set com_basegame baseoa&lt;br /&gt;
&lt;br /&gt;
When the client starts, go to the console by typing ~ (tilde) and enter the following command&lt;br /&gt;
&lt;br /&gt;
 connect -O my.ioq3.server&lt;br /&gt;
&lt;br /&gt;
The client should now connect to the ioq3 dedicated server over Ouroboros. Register the name in non-local layers to connect from other machines. Happy Fragging!&lt;br /&gt;
&lt;br /&gt;
= netcat =&lt;br /&gt;
&lt;br /&gt;
Ouroboros-netcat instructions:&lt;br /&gt;
&lt;br /&gt;
Clone the repo (somewhere):&lt;br /&gt;
&lt;br /&gt;
 git clone https://github.com:dstaesse/netcat&lt;br /&gt;
 cd netcat&lt;br /&gt;
&lt;br /&gt;
To compile this Ouroboros version:&lt;br /&gt;
&lt;br /&gt;
 LIBS=-louroboros-dev ./configure&lt;br /&gt;
&lt;br /&gt;
Or, to enable debugging output (the netcat -d flag):&lt;br /&gt;
&lt;br /&gt;
 LIBS=-louroboros-dev ./configure --enable-debug=yes&lt;br /&gt;
&lt;br /&gt;
And give it a simple &amp;quot;make&amp;quot; command:&lt;br /&gt;
&lt;br /&gt;
 make&lt;br /&gt;
&lt;br /&gt;
Ouroboros support is toggled with the -O flag.&lt;br /&gt;
&lt;br /&gt;
To start netcat in Ouroboros listen mode (assuming you are in the src/ folder):&lt;br /&gt;
&lt;br /&gt;
 ./netcat -Ol&lt;br /&gt;
&lt;br /&gt;
To send some data to the netcat instance:&lt;br /&gt;
&lt;br /&gt;
 ./netcat -Oc &amp;lt;name&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Brief example over the &amp;quot;local&amp;quot; IPCP (you may need up to 3 terminal windows).&lt;br /&gt;
&lt;br /&gt;
 #start the irmd&lt;br /&gt;
 sudo irmd --stdout&lt;br /&gt;
 &lt;br /&gt;
 #create a &amp;quot;local&amp;quot; IPCP.&lt;br /&gt;
 irm ipcp bootstrap type local name local layer local&lt;br /&gt;
 &lt;br /&gt;
 # register the netcat name in the local layer&lt;br /&gt;
 irm name register nc layer local        (be branch / upcoming version 0.17)&lt;br /&gt;
 &lt;br /&gt;
 # bind the netcat program to &amp;lt;name&amp;gt;&lt;br /&gt;
 irm bind prog ./netcat&lt;br /&gt;
 &lt;br /&gt;
 # start an Ouroboros listen server (with some verbosity)&lt;br /&gt;
 ./netcat -Ovvl&lt;br /&gt;
 &lt;br /&gt;
 # and from another terminal, send it a couple of bytes:&lt;br /&gt;
 echo &amp;quot;Here&#039;s Johnny!&amp;quot; | ./netcat -Oc nc&lt;br /&gt;
 &lt;br /&gt;
 # if all went well, you should see the following output on the server side&lt;br /&gt;
 $ ./netcat -Ovvl&lt;br /&gt;
 Flow received (new fd=64)&lt;br /&gt;
 Here&#039;s Johnny!&lt;br /&gt;
 ^CExiting.&lt;br /&gt;
 Total received bytes: 15&lt;br /&gt;
 Total sent bytes: 0&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=OuroboRs&amp;diff=1462</id>
		<title>OuroboRs</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=OuroboRs&amp;diff=1462"/>
		<updated>2023-12-12T00:05:22Z</updated>

		<summary type="html">&lt;p&gt;Thijs: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Under construction}}&lt;br /&gt;
&lt;br /&gt;
The rust interface is being developed/polished. You can find an initial version [https://github.com/th1j5/ouroboros-rs here].&lt;br /&gt;
The unsafe FFI is already tested by a Rust implementation of the oecho client, but a safe wrapper is being worked on.&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Prototype&amp;diff=1461</id>
		<title>Ouroboros Prototype</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Prototype&amp;diff=1461"/>
		<updated>2023-12-11T11:28:54Z</updated>

		<summary type="html">&lt;p&gt;Thijs: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Under construction}}&lt;br /&gt;
&lt;br /&gt;
The Ouroboros prototype is a user-space decentralized packet network implementation based on an overhauled [[Ouroboros Model| networking model]]. It is being developed in C for POSIX operating systems.&lt;br /&gt;
&lt;br /&gt;
This prototype is very much a work in progress.&lt;br /&gt;
&lt;br /&gt;
On this page are instructions for installing the prototype. Once done, head to the [[Ouroboros Tutorials | tutorials]] section. The [https://ouroboros.rocks/docs old documentation website] is still available for reference, but only this wiki is maintained. &lt;br /&gt;
&lt;br /&gt;
= Install the Prototype =&lt;br /&gt;
&lt;br /&gt;
The prototype consists of the &#039;&#039;&#039;library&#039;&#039;&#039;, which provides the core Application Programming Interfaces (Unicast API and Broadcast API), the functions of the [[Ouroboros Functional Layering | application end-to-end layer]] and various functions used by the other components in the prototype; the IPC Resource Management daemon &#039;&#039;&#039;IRMd&#039;&#039;&#039;, which is the core component for administering Ouroboros; the &#039;&#039;&#039;IPCPs&#039;&#039;&#039; that actually forward packets and make up the (peer-to-peer) packet network; and a collection of &#039;&#039;&#039;tools&#039;&#039;&#039;, of which the most important is the IPC Resource Management (IRM) Command Line Interface (CLI) for management and some basic tools for demo purposes. In addition, there is an [[Rumba | orchestration framework]] for setting up experiments and an [[Ouroboros metrics | InfluxDB exporter]] for observability. The prototype is written in C, but we provide some APIs for other popular languages, currently [[pyOuroboros | Python]] and [https://github.com/chritchens/ouroboros-rs Rust].&lt;br /&gt;
&lt;br /&gt;
== Requirements ==&lt;br /&gt;
&lt;br /&gt;
Ouroboros builds on most POSIX compliant systems. Below you will find instructions for GNU/Linux, FreeBSD and OS X. On Windows 10, you can build Ouroboros using the Linux Subsystem for Windows .&lt;br /&gt;
&lt;br /&gt;
== Get Ouroboros ==&lt;br /&gt;
&lt;br /&gt;
You can clone Ouroboros using the command line from its website or, if you prefer you can clone and/or fork from our [https://github.com/dstaesse/ouroboros Github] or [https://bitbucket.org/dstaesse/ouroboros BitBucket] mirrors.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
$ git clone https://ouroboros.rocks/git/ouroboros&lt;br /&gt;
$ git clone git://ouroboros.rocks/ouroboros&lt;br /&gt;
$ git clone https://github.com/dstaesse/ouroboros&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Optional repositories are [[pyOuroboros]], a Python wrapper to write Ouroboros programs in Python, and [[Ouroboros metrics | ouroboros-metrics]] that contains an [https://influxdb.com InfluxDB] exporter.&lt;br /&gt;
&lt;br /&gt;
== Dependencies ==&lt;br /&gt;
&lt;br /&gt;
To build Ouroboros, you need cmake, google protocol buffers installed in addition to a C compiler (gcc or clang) and make.&lt;br /&gt;
&lt;br /&gt;
On GNU/Linux you will need either libgcrypt (≥ 1.7.0) or libssl if your glibc is older than version 2.25.&lt;br /&gt;
&lt;br /&gt;
On OS X, you will need homebrew. [https://developer.apple.com/library/archive/documentation/Security/Conceptual/System_Integrity_Protection_Guide/ConfiguringSystemIntegrityProtection/ConfiguringSystemIntegrityProtection.html Disable System Integrity Protection] during the installation and/or removal of Ouroboros.&lt;br /&gt;
&lt;br /&gt;
Optionally, you can also install libgcrypt, libssl (to enable encryption), fuse (to enable exporting internal metrics), and dnsutils (to enable use of a DynDNS server to be used as a naming directory for a UDP layer). Setting up a DNS server (e.g. bind) is out of scope of this installation guide.&lt;br /&gt;
&lt;br /&gt;
=== Debian/Ubuntu Linux ===&lt;br /&gt;
&lt;br /&gt;
 $ apt-get install git protobuf-c-compiler cmake&lt;br /&gt;
 $ apt-get install libgcrypt20-dev libssl-dev libfuse-dev dnsutils cmake-curses-gui&lt;br /&gt;
&lt;br /&gt;
If during the build process cmake complains that the Protobuf C compiler is required but not found, and you installed the protobuf-c-compiler package, you will also need this:&lt;br /&gt;
&lt;br /&gt;
 $ apt-get install libprotobuf-c-dev&lt;br /&gt;
&lt;br /&gt;
=== Arch Linux ===&lt;br /&gt;
&lt;br /&gt;
 $ pacman -S git protobuf-c cmake&lt;br /&gt;
 $ pacman -S libgcrypt openssl fuse dnsutils&lt;br /&gt;
&lt;br /&gt;
=== FreeBSD 11/12/13 ===&lt;br /&gt;
&lt;br /&gt;
 $ pkg install git protobuf-c cmake&lt;br /&gt;
 $ pkg install libgcrypt openssl fusefs-libs bind-tools&lt;br /&gt;
&lt;br /&gt;
=== Mac OS X 10/11/12 ===&lt;br /&gt;
&lt;br /&gt;
 $ brew install git protobuf-c cmake&lt;br /&gt;
 $ brew install libgcrypt openssl&lt;br /&gt;
&lt;br /&gt;
== Configuration file support ==&lt;br /&gt;
&lt;br /&gt;
It is highly recommended you install [https://github.com/cktan/tomlc99 libtomlc99] &#039;&#039;before&#039;&#039; building O7s to enable configuration file support.&lt;br /&gt;
&lt;br /&gt;
To install (on GNU/Linux):&lt;br /&gt;
&lt;br /&gt;
 git clone https://github.com/cktan/tomlc99&lt;br /&gt;
 cd tomlc99&lt;br /&gt;
 make &amp;amp;&amp;amp; sudo make install&lt;br /&gt;
&lt;br /&gt;
== Installation instructions ==&lt;br /&gt;
&lt;br /&gt;
When installing from source, go to the cloned git repository or extract the tarball and enter the main directory. We recommend creating a build directory inside this directory.&lt;br /&gt;
Run cmake providing the path to where you cloned the Ouroboros repository. Assuming you created the build directory inside the repository directory, the following commands build and install O7s:&lt;br /&gt;
&lt;br /&gt;
 $ cd &amp;lt;path/to/ouroboros/repo&amp;gt;&lt;br /&gt;
 $ mkdir build &amp;amp;&amp;amp; cd build&lt;br /&gt;
 $ cmake ..    # optional: configure build parameters&lt;br /&gt;
 $ make &amp;amp;&amp;amp; sudo make install&lt;br /&gt;
&lt;br /&gt;
== Build configuration parameters ==&lt;br /&gt;
&lt;br /&gt;
At compile time, there are a number of parameters that can be tweaked, for instance to enable debug logging, enable various sanitizers, to increase performance or decrease memory consumption. You can find a full list on the [[Ouroboros Build Parameters]] page.&lt;br /&gt;
&lt;br /&gt;
== Remove Ouroboros ==&lt;br /&gt;
&lt;br /&gt;
To uninstall Ouroboros, simply execute the following command from your build directory:&lt;br /&gt;
&lt;br /&gt;
 $ sudo make uninstall&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Contributions&amp;diff=1451</id>
		<title>Ouroboros Contributions</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Contributions&amp;diff=1451"/>
		<updated>2023-12-10T19:21:37Z</updated>

		<summary type="html">&lt;p&gt;Thijs: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ouroboros is far from complete. Plenty of things need to be researched and implemented. We don’t really keep a list, but this [https://tree.taiga.io/project/dstaesse-ouroboros/kanban kanban board] can give you some ideas of what is still on our mind and where you may be able to contribute.&lt;br /&gt;
Our coding guidelines can be found in the [[Source Code Guide]].&lt;br /&gt;
&lt;br /&gt;
= Contact =&lt;br /&gt;
&lt;br /&gt;
There are 2 ways that are used to communicate.&lt;br /&gt;
&lt;br /&gt;
For daily chat we use a [https://matrix.to/#/#ODecentralize:matrix.org matrix space] bridged to a [https://join.slack.com/t/odecentralize/shared_invite/enQtOTU2NjI5OTk3NDYzLTM2ZjkwZjAxMTcyZjI5N2Y1NGZlNWJjODA0MDU2Y2MzN2Q3MjA5ZTAwYjIyMDMzNGNhZTc1NWQwNWYyMjBhMWU public slack channel]. Use the tool you prefer and whatever login name you desire. Just hop on and ask away.&lt;br /&gt;
&lt;br /&gt;
The [https://www.freelists.org/list/ouroboros mailing list] is mostly used for sending software patches, but can be used to contact us about almost anything. Participation requires you to register for this list.&lt;br /&gt;
&lt;br /&gt;
= Bug reports =&lt;br /&gt;
&lt;br /&gt;
Bugs are reported through our [https://ouroboros.rocks/bugzilla/ Bugzilla issue tracker], or alternatively via [https://github.com/dstaesse/ouroboros/issues GitHub].&lt;br /&gt;
&lt;br /&gt;
When reporting bugs, check if the bug is still present in the &#039;be&#039; branch, and try to include the following:&lt;br /&gt;
&lt;br /&gt;
* Provide a description of the bug&lt;br /&gt;
* Provide system logs of the IRMd and IPCPs&lt;br /&gt;
* Provide a minimal code example to reproduce the bug&lt;br /&gt;
* Sync with the HEAD of the most stable branch where the bug is present&lt;br /&gt;
* Provide a bug fix if you can, send a patch to the mailing list&lt;br /&gt;
&lt;br /&gt;
= Feature requests =&lt;br /&gt;
&lt;br /&gt;
New features can be always be requested through the mailing list or alternatively &lt;br /&gt;
[https://github.com/dstaesse/ouroboros/issues GitHub]. They will be taken into account when a next version of the prototype is discussed.&lt;br /&gt;
&lt;br /&gt;
= Contributions =&lt;br /&gt;
&lt;br /&gt;
== Patches ==&lt;br /&gt;
&lt;br /&gt;
Git patches can be sent to the [https://www.freelists.org/list/ouroboros mailing list]. You will need to use an email address that is registered to the mailing list.&lt;br /&gt;
Sending commits by mail can be done with [https://git-scm.com/docs/git-send-email git send-email], which might need to be installed separately.&lt;br /&gt;
&lt;br /&gt;
To set this up, open your git config &lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git config --global --edit&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
and add your email settings, e.g. for a gmail account (don&#039;t forget to &#039;&#039;&#039;edit your email address&#039;&#039;&#039; in this snippet):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
[sendemail]&lt;br /&gt;
    smtpserver = smtp.googlemail.com&lt;br /&gt;
    smtpencryption = tls&lt;br /&gt;
    smtpserverport = 587&lt;br /&gt;
    smtpuser = youremail@ymail.com&lt;br /&gt;
    confirm=auto&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
For other email providers it is similar.&lt;br /&gt;
&lt;br /&gt;
When this is set up, the last commit on the current branch is sent as a patch from the command line using [https://git-scm.com/docs/git-send-email git send-email]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
git send-email -1 --to=ouroboros@freelists.org&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Commit messages ==&lt;br /&gt;
&lt;br /&gt;
A commit message should follow these 10 simple rules, based on [http://chris.beams.io/posts/git-commit/ Chris Beams]&#039; excellent guide.&lt;br /&gt;
&lt;br /&gt;
* Separate subject from body with a blank line&lt;br /&gt;
* Limit the subject line to 50 characters&lt;br /&gt;
* Capitalize the subject line&lt;br /&gt;
* Do not end the subject line with a period&lt;br /&gt;
* Use the imperative mood in the subject line&lt;br /&gt;
* Precede the subject line by indicating the component where changes were made&lt;br /&gt;
* Wrap the body at 72 characters&lt;br /&gt;
* Use the body to explain what and why vs. how&lt;br /&gt;
* If the commit addresses a bug, reference it in the body&lt;br /&gt;
* Sign off your commits using the signoff feature in git&lt;br /&gt;
&lt;br /&gt;
Here is an example of a change in the lib/ folder:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight&amp;gt;&lt;br /&gt;
lib: Add support for Linux RTT estimator&lt;br /&gt;
&lt;br /&gt;
This adds the option to use the Round-Trip-Time (RTT) estimation&lt;br /&gt;
algorithm as it is implemented in the TCP implementation in Linux. It&lt;br /&gt;
looks like it outperforms the TCP default algorithm, so I enabled this&lt;br /&gt;
one by default. Also adds the option to change the RTO timeout&lt;br /&gt;
calculation to include more (or less) than 4 times the mdev (specified&lt;br /&gt;
as a power of 2. Left the default value to 2 (so, 4 mdevs), but 3 (8&lt;br /&gt;
mdevs) gives better results in my tests.&lt;br /&gt;
&lt;br /&gt;
Signed-off-by: Dimitri Staessens &amp;lt;dimitri@ouroboros.rocks&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Versioning ==&lt;br /&gt;
&lt;br /&gt;
Git is used as a version tooling for the code. Releases are identified through a git tag by a number MAJOR.MICRO.PATCHLEVEL. &lt;br /&gt;
* Incrementing MAJOR is done to indicate a big step ahead in terms of features; it is discussed when new features are planned. &lt;br /&gt;
* Incrementing MICRO is done when APIs/ABIs are not necessarily compatible. &lt;br /&gt;
* The PATCHLEVEL is incremented when an urgent bugfix is incorporated.&lt;br /&gt;
&lt;br /&gt;
Version 1.0.0 would be the first minimum viable prototype version.&lt;br /&gt;
&lt;br /&gt;
== Repository structure==&lt;br /&gt;
&lt;br /&gt;
The main git repository can be found at: https://ouroboros.rocks/cgit/ouroboros&lt;br /&gt;
&lt;br /&gt;
It contains the following branches:&lt;br /&gt;
&lt;br /&gt;
* master: Contains the most stable versions of Ouroboros.&lt;br /&gt;
* testing: Contains tested code but may still contain bugs.&lt;br /&gt;
* be: Contains untested but compiling code.&lt;br /&gt;
&lt;br /&gt;
All new contributions are integrated into ‘be’ through patches sent to the mailing list. Once a version of ‘be’ is tested enough, it is merged into ‘testing’. When a ‘testing’ version is considered stable enough, it is merged into ‘master’. Most users should probably use master.&lt;br /&gt;
&lt;br /&gt;
New development is always done against the ‘be’ branch of the main git repository. Contributions are always made using your real name and real e-mail address.&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Source_Code_Guide&amp;diff=1450</id>
		<title>Source Code Guide</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Source_Code_Guide&amp;diff=1450"/>
		<updated>2023-12-10T16:02:15Z</updated>

		<summary type="html">&lt;p&gt;Thijs: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Under construction}}&lt;br /&gt;
&lt;br /&gt;
The [https://ouroboros.rocks/cgit/ouroboros main git repository] can be browsed online. We have mirrors on [https://github.com/dstaesse/ouroboros github] or [https://bitbucket.org/dstaesse/ouroboros bitbucket] if you prefer. &amp;lt;br/&amp;gt;&lt;br /&gt;
For bug reports, feature requests or contributions (including git guidelines), see [[Ouroboros Contributions|the contact page]].&lt;br /&gt;
&lt;br /&gt;
== Directory structure ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;cmake&#039;&#039;&#039;: This directory contains some CMake additions for building O7s.&lt;br /&gt;
* &#039;&#039;&#039;doc&#039;&#039;&#039;: This directory holds some documentation, most notably the man pages.&lt;br /&gt;
* &#039;&#039;&#039;include&#039;&#039;&#039;: Includes public O7s headers for implementing Ouroboros programs and management tools, and some internal headers that expose functions of the library needed by other O7s components.&lt;br /&gt;
* &#039;&#039;&#039;src&#039;&#039;&#039;: The main implementation, which holds&lt;br /&gt;
** &#039;&#039;&#039;ipcpd&#039;&#039;&#039;: Reference implementation of the different [[IPCP]]s.&lt;br /&gt;
*** &#039;&#039;&#039;common&#039;&#039;&#039;: Elements common to Broadcast and Unicast IPCP&lt;br /&gt;
**** &#039;&#039;&#039;connmgr&#039;&#039;&#039;: Connection manager&lt;br /&gt;
**** &#039;&#039;&#039;enroll&#039;&#039;&#039;: Enrollment&lt;br /&gt;
*** &#039;&#039;&#039;broadcast&#039;&#039;&#039;: Broadcast IPCP &lt;br /&gt;
*** &#039;&#039;&#039;unicast&#039;&#039;&#039;: The unicast IPCP implementation has the following components:&lt;br /&gt;
**** &#039;&#039;&#039;main&#039;&#039;&#039;: The main entry point into the IPCP.&lt;br /&gt;
**** &#039;&#039;&#039;addr-auth&#039;&#039;&#039;: Address authority. This component is used to assign the addresses to the IPCPs. This is an relic from the RINA implementation and will be redesigned to reflect more accurately that addresses are composed of names of forwarding elements.&lt;br /&gt;
**** &#039;&#039;&#039;ca&#039;&#039;&#039;: Congestion avoidance module allowing to select different congestion avoidance strategies. Has multiple policies.&lt;br /&gt;
**** &#039;&#039;&#039;connmgr&#039;&#039;&#039;: Connection manager, it is uses to allocate data transfer (and management) flows between IPCPS. &lt;br /&gt;
***** Data transfer flows carry &#039;&#039;N + 1&#039;&#039; traffic and some internal traffic for the directory and flow allocator. &lt;br /&gt;
***** Management flows are used for the routing component. Will be removed as management flows should be implemented by &#039;&#039;N - 1&#039;&#039; [[broadcast layer]]s. This component is shared with the broadcast IPCP.&lt;br /&gt;
**** &#039;&#039;&#039;dir&#039;&#039;&#039;: Directory module that is backed by a key-value store mapping hashed &#039;&#039;N + 1&#039;&#039; application names to &#039;&#039;N&#039;&#039; addresses. A Distributed Hash Table (dht) is the currently implemented policy.&lt;br /&gt;
**** &#039;&#039;&#039;dt&#039;&#039;&#039;: The data transfer component creates and manages the actual forwarding elements.&lt;br /&gt;
**** &#039;&#039;&#039;fa&#039;&#039;&#039;: The flow allocator, which contains the logic and state needed to create, manage and destroy &#039;&#039;N + 1&#039;&#039; flows.&lt;br /&gt;
**** &#039;&#039;&#039;pff&#039;&#039;&#039;: The packet forwarding function that selects the outgoing flow(s) on which to forward an incoming DT packet. Currently implemented policies allow for a simple, loop-free alternate or multipath capable forwarding table (PFT).&lt;br /&gt;
**** &#039;&#039;&#039;psched&#039;&#039;&#039;: The packet schedulers that schedule packets coming from &#039;&#039;N - 1&#039;&#039; or &#039;&#039;N + 1&#039;&#039; flows, prioritizing them to be handled by the data transfer component.&lt;br /&gt;
**** &#039;&#039;&#039;routing&#039;&#039;&#039;: The component that implements the mechanism to populate the PFTs. Currently holds a link-state routing policy to build an adjacency graph of the layer.&lt;br /&gt;
*** &#039;&#039;&#039;eth&#039;&#039;&#039;: Ethernet IPCs, tunneling O7s over Ethernet DIX or Ethernet 802.2 (LLC).&lt;br /&gt;
*** &#039;&#039;&#039;udp&#039;&#039;&#039;: UDP IPCP, tunneling O7s over UDP/IPv4.&lt;br /&gt;
*** &#039;&#039;&#039;local&#039;&#039;&#039;: A loopback IPCP for local IPC, used for testing.&lt;br /&gt;
** &#039;&#039;&#039;irmd&#039;&#039;&#039;: Reference implementation of a basic IRMd.&lt;br /&gt;
** &#039;&#039;&#039;lib&#039;&#039;&#039;: Implementation of various library functions.&lt;br /&gt;
** &#039;&#039;&#039;tools&#039;&#039;&#039;: Some tools, such as small test programs and the &#039;&#039;IPC Resource Management&#039;&#039; CLI for managing O7s.&lt;br /&gt;
&lt;br /&gt;
== Variables ==&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; style=&amp;quot;margin:auto&amp;quot;&lt;br /&gt;
|+ Ouroboros index of commonly used variable names&lt;br /&gt;
! type !! name !! Description&lt;br /&gt;
|-&lt;br /&gt;
| int&lt;br /&gt;
| fd&lt;br /&gt;
| flow descriptor. It&#039;s the flow analogue to a file descriptor.&lt;br /&gt;
|-&lt;br /&gt;
| struct fcrti *&lt;br /&gt;
| frcti&lt;br /&gt;
| State associated with the [[FRCT | flow and retransmission control task]], the logic that implements the [[FRCP]] protocol.&lt;br /&gt;
|-&lt;br /&gt;
| size_t&lt;br /&gt;
| idx&lt;br /&gt;
| This &#039;&#039;idx&#039;&#039; is an index in the packet buffer (rdrbuff) and used to calculate the location of the packet in reference the base pointer at which the rdrbuff is mapped into each process&#039; memory space.&lt;br /&gt;
|-&lt;br /&gt;
| struct shm_du_buff *&lt;br /&gt;
| sdb&lt;br /&gt;
| shared memory (shm) data unit (du) buffer. The ouroboros &#039;flavored&#039; [https://ftp.gnumonks.org/pub/doc/skb-doc.html skb]. An sdb is a (fixed size) buffer that contains the actual packet data and spare space for (future) packet headers (and packet tails such as CRC), in addition to some metadata for managing the buffer (head and tail offset to the start of the packet, total size of the buffer, ...). The term &#039;data unit&#039; stems from the OSI SDU (service data unit) and PDU (protocol data unit), which were adopted by RINA. &lt;br /&gt;
|-&lt;br /&gt;
| struct shm_rbuff *&lt;br /&gt;
| tx_rb, rx_rb, rb&lt;br /&gt;
| ring buffer. These (small) ring buffers are shared between 2 processes, used to efficiently move packets through the local pipeline. They pass an index that points to an &#039;&#039;sdb&#039;&#039; in the rdrbuff, and are the entry and exit structures with which the application (either a user application or an IPCP) interacts with the end-to-end [[Flow | flow]]. Writing happens to the transmit ring buffer &#039;&#039;tx_rb&#039;&#039;, reading from the receive ring buffer &#039;&#039;rx_rb&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
| struct shm_rdrbuff *&lt;br /&gt;
| rdrb&lt;br /&gt;
| random deletion ring buffer, a quick-and-dirty memory allocator. The block of memory in which Ouroboros stores actual packet data (and metadata) in a (ring buffer) of &#039;&#039;sdb&#039;&#039;s. Packets are allocated at the head of the ringbuffer and removed from the tail. Packets are marked on deletion, and deleting the tail causes a cleanup operation of all marked packets. Needs to be replaced with a more efficient memory allocator at some point.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Coding Guidelines ==&lt;br /&gt;
&lt;br /&gt;
Coding guidelines&lt;br /&gt;
&lt;br /&gt;
The coding guidelines of the main Ouroboros stack are similar as those of the Linux kernel (https://www.kernel.org/doc/html/latest/process/coding-style.html) with the following exceptions:&lt;br /&gt;
&lt;br /&gt;
* Soft tabs are to be used instead of hard tabs&lt;br /&gt;
* A space is to be inserted between a pointer and its object name upon declaration or in function signatures. Example:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
   int * a;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
instead of&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
   int *a;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Don’t explicitly cast malloc, but do&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
   ptr = malloc(sizeof(*ptr) * len);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When checking for invalid pointers use&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
   if (ptr == NULL)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
instead of&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
   if (!ptr)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When in doubt, just browse the code a bit.&lt;br /&gt;
&lt;br /&gt;
== Component lifespan ==&lt;br /&gt;
&lt;br /&gt;
All (sub)components have a similar structure to them.&lt;br /&gt;
&lt;br /&gt;
First their static objects are allocated. If the base object is allocated on the stack, the functions are called init (some internals may be allocated on the heap). If the base object is allocated on the heap (malloc) the functions are called create.&lt;br /&gt;
&lt;br /&gt;
If the object has active components (e.g. spawns internal threads), they will activate as part of a start() call. Do not start threads in an init or create call!&lt;br /&gt;
&lt;br /&gt;
At the end of the object&#039;s lifetime, first the threads are stopped (stop()) call, and the object is destroyed via a fini() call if it was living on the stack, or a destroy() call if it was allocated on the heap. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;C&amp;quot;&amp;gt;&lt;br /&gt;
   init() / create()&lt;br /&gt;
   &lt;br /&gt;
   start()&lt;br /&gt;
 &lt;br /&gt;
   stop()&lt;br /&gt;
&lt;br /&gt;
   fini() / destroy()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=MediaWiki:Sidebar&amp;diff=1449</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=MediaWiki:Sidebar&amp;diff=1449"/>
		<updated>2023-12-10T15:55:44Z</updated>

		<summary type="html">&lt;p&gt;Thijs: Reverted edits by Thijs (talk) to last revision by Dimitri&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* navigation&lt;br /&gt;
* Architecture&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** Ouroboros Prototype#Try_the_Prototype|Getting Started&lt;br /&gt;
** Ouroboros Model|Network Model&lt;br /&gt;
** Ouroboros Protocols|Core Protocols&lt;br /&gt;
** Glossary|Glossary&lt;br /&gt;
** Ouroboros Frequently Asked Questions|FAQ&lt;br /&gt;
&lt;br /&gt;
* Management &amp;amp; Operation&lt;br /&gt;
** Ouroboros Tutorials|Tutorials&lt;br /&gt;
** Ouroboros Metrics|Metrics / Observability&lt;br /&gt;
** Rumba|Orchestration&lt;br /&gt;
&lt;br /&gt;
* Application Development&lt;br /&gt;
** Ouroboros API|C&lt;br /&gt;
** PyOuroboros|Python&lt;br /&gt;
** OuroboRs|Rust&lt;br /&gt;
** GoRoboros|Golang&lt;br /&gt;
&lt;br /&gt;
* Prototype Implementation&lt;br /&gt;
** Ouroboros Implementation Overview|Overview&lt;br /&gt;
** Source Code Guide|Source Code Guide&lt;br /&gt;
** Prototype Version History|Version history&lt;br /&gt;
&lt;br /&gt;
* Community&lt;br /&gt;
** Ouroboros Contributions|Contact&lt;br /&gt;
&lt;br /&gt;
* Wiki links&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
** helppage|help-mediawiki&lt;br /&gt;
&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=MediaWiki:Sidebar&amp;diff=1448</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=MediaWiki:Sidebar&amp;diff=1448"/>
		<updated>2023-12-10T15:54:11Z</updated>

		<summary type="html">&lt;p&gt;Thijs: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* navigation&lt;br /&gt;
* Architecture&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** Ouroboros Prototype#Try_the_Prototype|Getting Started&lt;br /&gt;
** Ouroboros Model|Network Model&lt;br /&gt;
** Ouroboros Protocols|Core Protocols&lt;br /&gt;
** Glossary|Glossary&lt;br /&gt;
** Ouroboros Frequently Asked Questions|FAQ&lt;br /&gt;
&lt;br /&gt;
* Management &amp;amp; Operation&lt;br /&gt;
** Ouroboros Tutorials|Tutorials&lt;br /&gt;
** Ouroboros Metrics|Metrics / Observability&lt;br /&gt;
** Rumba|Orchestration&lt;br /&gt;
&lt;br /&gt;
* Application Development&lt;br /&gt;
** Ouroboros API|C&lt;br /&gt;
** PyOuroboros|Python&lt;br /&gt;
** OuroboRs|Rust&lt;br /&gt;
** GoRoboros|Golang&lt;br /&gt;
&lt;br /&gt;
* Prototype Implementation&lt;br /&gt;
** Ouroboros Implementation Overview|Overview&lt;br /&gt;
** Source Code Guide|Source Code Guide&lt;br /&gt;
** Prototype Version History|Version history&lt;br /&gt;
&lt;br /&gt;
* Community&lt;br /&gt;
** Ouroboros Contributions|Contact &amp;amp; contributions&lt;br /&gt;
&lt;br /&gt;
* Wiki links&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
** helppage|help-mediawiki&lt;br /&gt;
&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros:About&amp;diff=1430</id>
		<title>Ouroboros:About</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros:About&amp;diff=1430"/>
		<updated>2023-12-05T15:00:45Z</updated>

		<summary type="html">&lt;p&gt;Thijs: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Ouroboros is a work-in-progress research prototype.&lt;br /&gt;
&lt;br /&gt;
This wiki serves as documentation about the Ouroboros prototype.&lt;br /&gt;
&lt;br /&gt;
Note that this content is provided by the developers and is not independently curated nor peer-reviewed.&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=MediaWiki:Sidebar&amp;diff=1426</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=MediaWiki:Sidebar&amp;diff=1426"/>
		<updated>2023-12-04T11:43:42Z</updated>

		<summary type="html">&lt;p&gt;Thijs: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* navigation&lt;br /&gt;
* Ouroboros: The model&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** Ouroboros Prototype#Try_the_Prototype|Getting Started&lt;br /&gt;
** Ouroboros Model|Network Model&lt;br /&gt;
** Ouroboros Protocols|Core Protocols&lt;br /&gt;
** Glossary | Glossary&lt;br /&gt;
** Ouroboros Frequently Asked Questions (FAQ)|FAQ&lt;br /&gt;
&lt;br /&gt;
* Network admin perspective&lt;br /&gt;
** Ouroboros Tutorials | Tutorials&lt;br /&gt;
** Ouroboros Metrics | Metrics / Observability&lt;br /&gt;
** Rumba|Orchestration&lt;br /&gt;
&lt;br /&gt;
* Application dev perspective&lt;br /&gt;
** Ouroboros API | APIs&lt;br /&gt;
&lt;br /&gt;
* Prototype internals perspective&lt;br /&gt;
** Ouroboros Implementation Overview | Implementation Overview&lt;br /&gt;
** Source Code Guide | Source Code Guide&lt;br /&gt;
** Prototype Version History | Version history&lt;br /&gt;
&lt;br /&gt;
* Community&lt;br /&gt;
** Ouroboros Contributions | Contact&lt;br /&gt;
&lt;br /&gt;
* Wiki links&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
** helppage|help-mediawiki&lt;br /&gt;
&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros&amp;diff=1425</id>
		<title>Ouroboros</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros&amp;diff=1425"/>
		<updated>2023-12-04T11:41:09Z</updated>

		<summary type="html">&lt;p&gt;Thijs: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File: Scalingtime.png|border|right|thumb|frame|Example Multi-Layer Ouroboros network (visualized using [[Rumba]])]]&lt;br /&gt;
&lt;br /&gt;
 Rebuilding packet networks from the ground up.&lt;br /&gt;
&lt;br /&gt;
= Summary =&lt;br /&gt;
&lt;br /&gt;
Ouroboros (abbreviated as O7s) is a prototype packet-switching technology that can function as an alternative to TCP/IP. It is aimed at substantially simplifying configuration and operation of packet-switched networks. It is based on a [[Ouroboros Functional Layering|redesign of the Internet model]] – from the programming API almost to the wire. If we had to describe Ouroboros in a single sentence, it could be &#039;&#039;micro-services architecture applied to the network itself&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
From an end-user application perspective, an Ouroboros network is a black box with a simple application programming interface to request communication services. Ouroboros can provision unicast flows - (bidirectional) channels that deliver message streams or byte streams with some requested operational (QoS) parameters such as maximum delay and bandwidth, protection against packet loss and authentication of peers and encryption of in-flight data; or it can provide broadcast flows to sets of processes.&lt;br /&gt;
&lt;br /&gt;
From an administrative perspective, an Ouroboros network is a collection of daemons that can be thought of as software routers (unicast) or software hubs (broadcast) that can be connected to each other; again through a simple management API. [[Ouroboros Tutorials|The tutorials]] highlight the administrative perspective of Ouroboros.&lt;br /&gt;
&lt;br /&gt;
[[Ouroboros Prototype |The prototype]] is developed for POSIX operating systems (Linux, *BSD, OS X). It is not directly compatible with TCP/IP (it uses different protocols) nor with POSIX sockets (it has a different API), but it has interfaces and tools to run over Ethernet or UDP, or to create IP/Ethernet tunnels over Ouroboros by exposing tap or tun devices for injecting packets. Check out the [[Ouroboros Implementation Overview|implementation status]] for more information.&lt;br /&gt;
&lt;br /&gt;
= Motivation and Objectives =&lt;br /&gt;
&lt;br /&gt;
Setting up a service over TCP/IP usually involves many different technologies. By the time the service is up and running, it will likely have involved configuring (switchport-based and trunk) VLANs, enabling some Spanning Tree Protocol variant in parts of the network, setting up link aggregation between ports on stacked switches, defining IP subnetworks, configuring a DHCP server to assign addresses to the subnets, setting up gateways, DNS servers, possibly configuring OSPF, IS-IS or iBGP/eBGP, selecting TCP and UDP ports for the applications, configuring  reverse proxies, setting firewall and Network Address Translation (NAT) rules, adding some servers to a demilitarized zone, configuring a Virtual Private Network server, establishing a few SSH tunnels here and there... the list is almost endless. &lt;br /&gt;
&lt;br /&gt;
A lot of this configuration is mostly static and done manually, once the service is in place, everything needs to be painstakingly documented because the configuration can be very brittle: introducing small changes can inadvertently bring the service down, and tracking down bugs, configuration errors or faults can take hours or even days. News stories about some DNS or [https://blog.cloudflare.com/october-2021-facebook-outage/ BGP misconfiguration] taking down a global service pop up regularly in the media. &lt;br /&gt;
&lt;br /&gt;
The configuration is also spread out as IP address and port configurations need to be applied consistently between different devices (application servers, DHCP and DNS servers, NAT firewalls, application client hardware) and software packages (server software, reverse proxies, client software), whose configuration files often have different formats. Storing, maintaining and automating network and service configuration has become so elaborate and daunting that it now has its own buzzword: &#039;&#039;infrastructure as code&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
The service configuration is not very scalable or portable. The IP network topology is defined by manual subnet assignments, and IP addresses often double as server identifiers in the minds of network admins. If an IP subnet has been over- or under-dimensioned, changing it can cause the need for redesigning many parts of the network. More than often, design compromises are made leaving as much of the network as-is because changing it would take weeks and involve downtime for many critical services. Moving infrastructure within or between datacenters or reintegrating it in a different parts can cause many headaches, some can be mitigated using virtualization, but the configuration of virtual machines and containers is still much more complicated than necessary. &lt;br /&gt;
&lt;br /&gt;
Core Internet technology itself has become &#039;&#039;ossified&#039;&#039;; the core protocols haven&#039;t changed much in 30 years because making changes that are easy in theory, such as adding a new L3 protocol (IPv6) has become a decades-long slog. There are many &#039;&#039;layer violations&#039;&#039; creating unnecessary and unwanted ties between different layers in the model: L2 (Ethertype), L3 (protocol field), L4 (well-known ports) and L5 (struct sockaddr_in/_in6). A change in one of the layers permeates all the way through the network stack. To make things worse, standardization and research bodies have been established along the (blurry) demarcation lines of the 5-Layer Internet model. [https://en.wikipedia.org/wiki/Conway%27s_law Conway&#039;s Law] prevents any significant architectural or structural innovations from taking root.&lt;br /&gt;
&lt;br /&gt;
The Internet is not a friendly place. Deploying a service over the Internet is more akin to venturing out into a lawless warzone than taking a nice stroll in the friendly neighborhood park. The first thing on any dotcom entrepreneur&#039;s mind is cybersecurity (quickly followed by how much it&#039;s going to cost him or her when the inevitable security breach comes). We would argue that the reason that the Internet has become ossified is also the reason for many network-level exploits: its bloated protocols rolled out the red carpet for cybercrime, cyberterrorism and cyberwarfare. TCP/IP has enabled an Internet that is robust to physical attacks on its infrastructure but left vulnerable to cyberattacks on its services. Unless we revise its architecture and core protocols, mitigating cyberthreats will remain a perpetual arms race between service providers and malicious hackers&amp;lt;ref&amp;gt;[https://blog.cloudflare.com/the-ddos-that-knocked-spamhaus-offline-and-ho/ The DDoS That Knocked Spamhaus Offline (And How We Mitigated It)]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The Internet model is also rife with internal contradictions and inconsistencies. Examples abound of protocols that are jammed into the model without fitting - if IP is L3, how is ICMP also L3 as it runs on top of IP? Such contradictions hint at an incomplete understanding of packet networks.&lt;br /&gt;
&lt;br /&gt;
In a nutshell, our objectives are to simplify and reduce network and service configuration and prevent ossification, and to do this by cleaning up and polishing the architecture and its protocols.&lt;br /&gt;
&lt;br /&gt;
= Ouroboros characteristics =&lt;br /&gt;
&lt;br /&gt;
O7s has &#039;&#039;&#039;no well-known ports&#039;&#039;&#039;, ephemeral endpoint identifiers (EIDs) are defined at the model&#039;s [[Ouroboros Functional Layering|network end-to-end layer]] and are (randomly) assigned at runtime - the sole exception is the flow allocator at EID 0. This implies:&lt;br /&gt;
* no direct tie between the network protocols and certain application, and thus no need to &#039;standardize&#039; certain values for certain identifiers (Ethertype/protocol/port).&lt;br /&gt;
* no need to define, track and/or de-conflict port values when setting up networked applications &lt;br /&gt;
* no hacks such as port-scanning a server for (vulnerable) applications&lt;br /&gt;
&lt;br /&gt;
The flow allocator is a &#039;&#039;&#039;single point of contact&#039;&#039;&#039;:&lt;br /&gt;
* endpoint identifiers assigned when a flow is allocated&lt;br /&gt;
* sets and stores peer information (remote address and endpoint identifier) at the start of communication, so&lt;br /&gt;
** no need for source address and source endpoint in every packet&lt;br /&gt;
** even if an attacker would find a valid address/endpoint, fabricated packets sent there will not result in any knowledge gained by the attacker as return traffic is sent to the stored peer, not the attacker.&lt;br /&gt;
** no smurf/amplification attacks leveraging faked source addresses&lt;br /&gt;
* backpressure may be an option to quench DDoS attempts&lt;br /&gt;
* authentication/encryption before first application byte&lt;br /&gt;
&lt;br /&gt;
The application library and IRMd work together to create a &#039;&#039;&#039;single point of configuration&#039;&#039;&#039;:&lt;br /&gt;
* Instead of having network configuration per application, single network configuration file per system&lt;br /&gt;
* All O7s applications in the system inherit the network capabilities of the installed O7s version.&lt;br /&gt;
&lt;br /&gt;
All traffic is congestion controlled, the congestion avoidance algorithm sits in the network end-to-end layer.&lt;br /&gt;
&lt;br /&gt;
= The project =&lt;br /&gt;
&lt;br /&gt;
Ouroboros leverages about 4 decades of hindsight and 2 decades worth of research experience in [[History of Ouroboros | academic projects]] on future networks, more specifically in EU-funded (FP6, FP7 and Horizon 2020) projects on IP/WDM, Carrier Ethernet, Software Defined Networks (SDNs) and the Recursive InterNetwork Architecture (RINA). After gaining development experience on the [https://github.com/IRATI/stack IRATI] kernel RINA prototype for OS/Linux, in early 2016 the decision was made to restart from scratch and try to avoid some issues we identified with the RINA model as it stood at that time. We aimed at POSIX user-space to make the prototype more accessible as compiling a kernel or kernel modules is a steep barrier to entry. Development was done in parallel with ongoing funded research to keep things as independent as possible from outside interference, but we used Ouroboros as one of the prototypes for the development of the [[Rumba]] orchestration framework for recursive networks. After leaving university we decided to keep taking the prototype forward in our spare time. It&#039;s a lot of work, but we still have a pretty clear view of the path forward, and there&#039;s only one way to eat an elephant: one bite at a time.&lt;br /&gt;
&lt;br /&gt;
= What to expect from this right now =&lt;br /&gt;
&lt;br /&gt;
In its current state, the prototype can demonstrate the validity of many aspects of the model and the potential of a full implementation of this model. It is far from a production piece of software, but rather a proof-of-concept that you can toy around with. See our [[Ouroboros Tutorials| tutorials]] section to get an overview of what the prototype can currently do. Our [[Ouroboros Implementation Overview|implementation overview]] tries to paint a picture of the implementation status of various components and functions. We are aware that parts of the implementation are quite buggy and are working on getting this fixed.&lt;br /&gt;
&lt;br /&gt;
Initially, a lot of the information on this website may sound a bit awkward, especially if configuring VLANs, defining IP subnets and configuring BGP routers are your daily bread and butter. We are the first to admit some of [[Glossary|the terminology]] could use an overhaul. It will require a bit of effort to plow through the concepts of &#039;&#039;flow allocation&#039;&#039; and &#039;&#039;binding / registering names&#039;&#039; but once the penny drops, understanding O7s should prove rewarding.&lt;br /&gt;
&lt;br /&gt;
If you find this interesting, just ask around on our [https://matrix.to/#/#ODecentralize:matrix.org matrix channel] (or other preferred means of [[Ouroboros Contributions|contact]]).&lt;br /&gt;
&lt;br /&gt;
= References =&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros&amp;diff=1424</id>
		<title>Ouroboros</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros&amp;diff=1424"/>
		<updated>2023-12-04T11:36:51Z</updated>

		<summary type="html">&lt;p&gt;Thijs: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File: Scalingtime.png|border|right|thumb|frame|Example Multi-Layer Ouroboros network (visualized using [[Rumba]])]]&lt;br /&gt;
&lt;br /&gt;
 Rebuilding packet networks from the ground up.&lt;br /&gt;
&lt;br /&gt;
= Summary =&lt;br /&gt;
&lt;br /&gt;
Ouroboros (abbreviated as O7s) is a prototype packet-switching technology that can function as an alternative to TCP/IP. It is aimed at substantially simplifying configuration and operation of packet-switched networks. It is based on a [[Ouroboros Functional Layering|redesign of the Internet model]] – from the programming API almost to the wire. If we had to describe Ouroboros in a single sentence, it could be &#039;&#039;micro-services architecture applied to the network itself&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
From an end-user application perspective, an Ouroboros network is a black box with a simple application programming interface to request communication services. Ouroboros can provision unicast flows - (bidirectional) channels that deliver message streams or byte streams with some requested operational (QoS) parameters such as maximum delay and bandwidth, protection against packet loss and authentication of peers and encryption of in-flight data; or it can provide broadcast flows to sets of processes.&lt;br /&gt;
&lt;br /&gt;
From an administrative perspective, an Ouroboros network is a collection of daemons that can be thought of as software routers (unicast) or software hubs (broadcast) that can be connected to each other; again through a simple management API. [[Ouroboros Tutorials|The tutorials]] highlight the administrative perspective of Ouroboros.&lt;br /&gt;
&lt;br /&gt;
[[Ouroboros Prototype |The prototype]] is developed for POSIX operating systems (Linux, *BSD, OS X). It is not directly compatible with TCP/IP (it uses different protocols) nor with POSIX sockets (it has a different API), but it has interfaces and tools to run over Ethernet or UDP, or to create IP/Ethernet tunnels over Ouroboros by exposing tap or tun devices for injecting packets. Check out the [[Ouroboros Implementation Overview|implementation status]] for more information.&lt;br /&gt;
&lt;br /&gt;
= Motivation and Objectives =&lt;br /&gt;
&lt;br /&gt;
Setting up a service over TCP/IP usually involves many different technologies. By the time the service is up and running, it will likely have involved configuring (switchport-based and trunk) VLANs, enabling some Spanning Tree Protocol variant in parts of the network, setting up link aggregation between ports on stacked switches, defining IP subnetworks, configuring a DHCP server to assign addresses to the subnets, setting up gateways, DNS servers, possibly configuring OSPF, IS-IS or iBGP/eBGP, selecting TCP and UDP ports for the applications, configuring  reverse proxies, setting firewall and Network Address Translation (NAT) rules, adding some servers to a demilitarized zone, configuring a Virtual Private Network server, establishing a few SSH tunnels here and there... the list is almost endless. &lt;br /&gt;
&lt;br /&gt;
A lot of this configuration is mostly static and done manually, once the service is in place, everything needs to be painstakingly documented because the configuration can be very brittle: introducing small changes can inadvertently bring the service down, and tracking down bugs, configuration errors or faults can take hours or even days. News stories about some DNS or [https://blog.cloudflare.com/october-2021-facebook-outage/ BGP misconfiguration] taking down a global service pop up regularly in the media. &lt;br /&gt;
&lt;br /&gt;
The configuration is also spread out as IP address and port configurations need to be applied consistently between different devices (application servers, DHCP and DNS servers, NAT firewalls, application client hardware) and software packages (server software, reverse proxies, client software), whose configuration files often have different formats. Storing, maintaining and automating network and service configuration has become so elaborate and daunting that it now has its own buzzword: &#039;&#039;infrastructure as code&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
The service configuration is not very scalable or portable. The IP network topology is defined by manual subnet assignments, and IP addresses often double as server identifiers in the minds of network admins. If an IP subnet has been over- or under-dimensioned, changing it can cause the need for redesigning many parts of the network. More than often, design compromises are made leaving as much of the network as-is because changing it would take weeks and involve downtime for many critical services. Moving infrastructure within or between datacenters or reintegrating it in a different parts can cause many headaches, some can be mitigated using virtualization, but the configuration of virtual machines and containers is still much more complicated than necessary. &lt;br /&gt;
&lt;br /&gt;
Core Internet technology itself has become &#039;&#039;ossified&#039;&#039;; the core protocols haven&#039;t changed much in 30 years because making changes that are easy in theory, such as adding a new L3 protocol (IPv6) has become a decades-long slog. There are many &#039;&#039;layer violations&#039;&#039; creating unnecessary and unwanted ties between different layers in the model: L2 (Ethertype), L3 (protocol field), L4 (well-known ports) and L5 (struct sockaddr_in/_in6). A change in one of the layers permeates all the way through the network stack. To make things worse, standardization and research bodies have been established along the (blurry) demarcation lines of the 5-Layer Internet model. [https://en.wikipedia.org/wiki/Conway%27s_law Conway&#039;s Law] prevents any significant architectural or structural innovations from taking root.&lt;br /&gt;
&lt;br /&gt;
The Internet is not a friendly place. Deploying a service over the Internet is more akin to venturing out into a lawless warzone than taking a nice stroll in the friendly neighborhood park. The first thing on any dotcom entrepreneur&#039;s mind is cybersecurity (quickly followed by how much it&#039;s going to cost him or her when the inevitable security breach comes). We would argue that the reason that the Internet has become ossified is also the reason for many network-level exploits: its bloated protocols rolled out the red carpet for cybercrime, cyberterrorism and cyberwarfare. TCP/IP has enabled an Internet that is robust to physical attacks on its infrastructure but left vulnerable to cyberattacks on its services. Unless we revise its architecture and core protocols, mitigating cyberthreats will remain a perpetual arms race between service providers and malicious hackers&amp;lt;ref&amp;gt;[https://blog.cloudflare.com/the-ddos-that-knocked-spamhaus-offline-and-ho/ The DDoS That Knocked Spamhaus Offline (And How We Mitigated It)]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The Internet model is also rife with internal contradictions and inconsistencies. Examples abound of protocols that are jammed into the model without fitting - if IP is L3, how is ICMP also L3 as it runs on top of IP? Such contradictions hint at an incomplete understanding of packet networks.&lt;br /&gt;
&lt;br /&gt;
In a nutshell, our objectives are to simplify and reduce network and service configuration and prevent ossification, and to do this by cleaning up and polishing the architecture and its protocols.&lt;br /&gt;
&lt;br /&gt;
= Ouroboros characteristics =&lt;br /&gt;
&lt;br /&gt;
O7s has &#039;&#039;&#039;no well-known ports&#039;&#039;&#039;, ephemeral endpoint identifiers (EIDs) are defined at the model&#039;s [[Ouroboros Functional Layering|network end-to-end layer]] and are (randomly) assigned at runtime - the sole exception is the flow allocator at EID 0. This implies:&lt;br /&gt;
* no direct tie between the network protocols and certain application, and thus no need to &#039;standardize&#039; certain values for certain identifiers (Ethertype/protocol/port).&lt;br /&gt;
* no need to define, track and/or de-conflict port values when setting up networked applications &lt;br /&gt;
* no hacks such as port-scanning a server for (vulnerable) applications&lt;br /&gt;
&lt;br /&gt;
The flow allocator is a &#039;&#039;&#039;single point of contact&#039;&#039;&#039;:&lt;br /&gt;
* endpoint identifiers assigned when a flow is allocated&lt;br /&gt;
* sets and stores peer information (remote address and endpoint identifier) at the start of communication, so&lt;br /&gt;
** no need for source address and source endpoint in every packet&lt;br /&gt;
** even if an attacker would find a valid address/endpoint, fabricated packets sent there will not result in any knowledge gained by the attacker as return traffic is sent to the stored peer, not the attacker.&lt;br /&gt;
** no smurf/amplification attacks leveraging faked source addresses&lt;br /&gt;
* backpressure may be an option to quench DDoS attempts&lt;br /&gt;
* authentication/encryption before first application byte&lt;br /&gt;
&lt;br /&gt;
The application library and IRMd work together to create a &#039;&#039;&#039;single point of configuration&#039;&#039;&#039;:&lt;br /&gt;
* Instead of having network configuration per application, single network configuration file per system&lt;br /&gt;
* All O7s applications in the system inherit the network capabilities of the installed O7s version.&lt;br /&gt;
&lt;br /&gt;
All traffic is congestion controlled, the congestion avoidance algorithm sits in the network end-to-end layer.&lt;br /&gt;
&lt;br /&gt;
= The project =&lt;br /&gt;
&lt;br /&gt;
Ouroboros leverages about 4 decades of hindsight and 2 decades worth of research experience in [[History of Ouroboros | academic projects]] on future networks, more specifically in EU-funded (FP6, FP7 and Horizon 2020) projects on IP/WDM, Carrier Ethernet, Software Defined Networks (SDNs) and the Recursive InterNetwork Architecture (RINA). After gaining development experience on the [https://github.com/IRATI/stack IRATI] kernel RINA prototype for OS/Linux, in early 2016 the decision was made to restart from scratch and try to avoid some issues we identified with the RINA model as it stood at that time. We aimed at POSIX user-space to make the prototype more accessible as compiling a kernel or kernel modules is a steep barrier to entry. Development was done in parallel with ongoing funded research to keep things as independent as possible from outside interference, but we used Ouroboros as one of the prototypes for the development of the [[Rumba]] orchestration framework for recursive networks. After leaving university we decided to keep taking the prototype forward in our spare time. It&#039;s a lot of work, but we still have a pretty clear view of the path forward, and there&#039;s only one way to eat an elephant: one bite at a time.&lt;br /&gt;
&lt;br /&gt;
= What to expect from this right now =&lt;br /&gt;
&lt;br /&gt;
In its current state, the prototype can demonstrate the validity of many aspects of the model and the potential of a full implementation of this model. It is far from a production piece of software, but rather a proof-of-concept that you can toy around with. See our [[Ouroboros Tutorials| tutorials]] section to get an overview of what the prototype can currently do. Our [[Ouroboros Implementation Overview|implementation overview]] tries to paint a picture of the implementation status of various components and functions. We are aware that parts of the implementation are quite buggy and are working on getting this fixed.&lt;br /&gt;
&lt;br /&gt;
Initially, a lot of the information on this website may sound a bit awkward, especially if configuring VLANs, defining IP subnets and configuring BGP routers are your daily bread and butter. We are the first to admit some of the terminology could use an overhaul. It will require a bit of effort to plow through the concepts of &#039;&#039;flow allocation&#039;&#039; and &#039;&#039;binding / registering names&#039;&#039; but once the penny drops, understanding O7s should prove rewarding.&lt;br /&gt;
&lt;br /&gt;
If you find this interesting, just ask around on our [https://matrix.to/#/#ODecentralize:matrix.org matrix channel].&lt;br /&gt;
&lt;br /&gt;
= References =&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=MediaWiki:Sidebar&amp;diff=1423</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=MediaWiki:Sidebar&amp;diff=1423"/>
		<updated>2023-12-04T11:23:54Z</updated>

		<summary type="html">&lt;p&gt;Thijs: Undo revision 1422 by Thijs (talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* navigation&lt;br /&gt;
* Ouroboros: The model&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** Ouroboros Prototype#Try_the_Prototype|Getting Started&lt;br /&gt;
** Ouroboros Model|Network Model&lt;br /&gt;
** Ouroboros Protocols|Core Protocols&lt;br /&gt;
** Glossary | Glossary&lt;br /&gt;
** Ouroboros Frequently Asked Questions|Frequently Asked Questions&lt;br /&gt;
&lt;br /&gt;
* Network admin perspective&lt;br /&gt;
** Ouroboros Tutorials | Tutorials&lt;br /&gt;
** Ouroboros Metrics | Metrics / Observability&lt;br /&gt;
** Rumba|Orchestration&lt;br /&gt;
&lt;br /&gt;
* Application dev perspective&lt;br /&gt;
** Ouroboros API | APIs&lt;br /&gt;
&lt;br /&gt;
* Prototype internals perspective&lt;br /&gt;
** Ouroboros Implementation Overview | Implementation Overview&lt;br /&gt;
** Source Code Guide | Source Code Guide&lt;br /&gt;
** Prototype Version History | Version history&lt;br /&gt;
&lt;br /&gt;
* Community&lt;br /&gt;
** Ouroboros Contributions | Contact&lt;br /&gt;
&lt;br /&gt;
* Wiki links&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
** helppage|help-mediawiki&lt;br /&gt;
&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=MediaWiki:Sidebar&amp;diff=1422</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=MediaWiki:Sidebar&amp;diff=1422"/>
		<updated>2023-12-04T11:23:29Z</updated>

		<summary type="html">&lt;p&gt;Thijs: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* navigation&lt;br /&gt;
* Ouroboros: The model&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** Ouroboros Prototype#Try_the_Prototype|Getting Started&lt;br /&gt;
** Ouroboros Model|Network Model&lt;br /&gt;
** Ouroboros Protocols|Core Protocols&lt;br /&gt;
** Glossary | Glossary&lt;br /&gt;
** Ouroboros Frequently Asked Questions|Frequently Asked Questions&lt;br /&gt;
&lt;br /&gt;
* Network admin perspective&lt;br /&gt;
** Ouroboros Tutorials | Tutorials&lt;br /&gt;
** Ouroboros Metrics | Metrics / Observability&lt;br /&gt;
** Rumba|Orchestration&lt;br /&gt;
&lt;br /&gt;
* Application dev perspective&lt;br /&gt;
** Ouroboros API | APIs&lt;br /&gt;
&lt;br /&gt;
* Prototype internals perspective&lt;br /&gt;
** Ouroboros Implementation Overview | Implementation Status&lt;br /&gt;
** Source Code Guide | Source Code Guide&lt;br /&gt;
** Prototype Version History | Version history&lt;br /&gt;
&lt;br /&gt;
* Community&lt;br /&gt;
** Ouroboros Contributions | Contact&lt;br /&gt;
&lt;br /&gt;
* Wiki links&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
** helppage|help-mediawiki&lt;br /&gt;
&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=MediaWiki:Sidebar&amp;diff=1421</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=MediaWiki:Sidebar&amp;diff=1421"/>
		<updated>2023-12-04T11:20:40Z</updated>

		<summary type="html">&lt;p&gt;Thijs: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* navigation&lt;br /&gt;
* Ouroboros: The model&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** Ouroboros Prototype#Try_the_Prototype|Getting Started&lt;br /&gt;
** Ouroboros Model|Network Model&lt;br /&gt;
** Ouroboros Protocols|Core Protocols&lt;br /&gt;
** Glossary | Glossary&lt;br /&gt;
** Ouroboros Frequently Asked Questions|Frequently Asked Questions&lt;br /&gt;
&lt;br /&gt;
* Network admin perspective&lt;br /&gt;
** Ouroboros Tutorials | Tutorials&lt;br /&gt;
** Ouroboros Metrics | Metrics / Observability&lt;br /&gt;
** Rumba|Orchestration&lt;br /&gt;
&lt;br /&gt;
* Application dev perspective&lt;br /&gt;
** Ouroboros API | APIs&lt;br /&gt;
&lt;br /&gt;
* Prototype internals perspective&lt;br /&gt;
** Ouroboros Implementation Overview | Implementation Overview&lt;br /&gt;
** Source Code Guide | Source Code Guide&lt;br /&gt;
** Prototype Version History | Version history&lt;br /&gt;
&lt;br /&gt;
* Community&lt;br /&gt;
** Ouroboros Contributions | Contact&lt;br /&gt;
&lt;br /&gt;
* Wiki links&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
** helppage|help-mediawiki&lt;br /&gt;
&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=MediaWiki_talk:Sidebar&amp;diff=1420</id>
		<title>MediaWiki talk:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=MediaWiki_talk:Sidebar&amp;diff=1420"/>
		<updated>2023-12-04T11:18:16Z</updated>

		<summary type="html">&lt;p&gt;Thijs: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Things under consideration:&lt;br /&gt;
&lt;br /&gt;
* Name the first navigation block or not (&#039;Ouroboros: The model&#039;)&lt;br /&gt;
* synonym for &#039;perspective&#039; is &#039;viewpoint&#039;&lt;br /&gt;
* Should we talk about &#039;prototype&#039; directly in the sidebar heading? On the other hand, it still is a prototype -\_(¨)_/-&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=MediaWiki_talk:Sidebar&amp;diff=1419</id>
		<title>MediaWiki talk:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=MediaWiki_talk:Sidebar&amp;diff=1419"/>
		<updated>2023-12-04T11:17:23Z</updated>

		<summary type="html">&lt;p&gt;Thijs: Created page with &amp;quot;Things under consideration: - Name the first navigation block or not (&amp;#039;Ouroboros: The model&amp;#039;) - synonym for &amp;#039;perspective&amp;#039; is &amp;#039;viewpoint&amp;#039; - Should we talk about &amp;#039;prototype&amp;#039; directly in the sidebar heading? On the other hand, it still is a prototype -\_(¨)_/-&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Things under consideration:&lt;br /&gt;
- Name the first navigation block or not (&#039;Ouroboros: The model&#039;)&lt;br /&gt;
- synonym for &#039;perspective&#039; is &#039;viewpoint&#039;&lt;br /&gt;
- Should we talk about &#039;prototype&#039; directly in the sidebar heading? On the other hand, it still is a prototype -\_(¨)_/-&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=MediaWiki:Sidebar&amp;diff=1418</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=MediaWiki:Sidebar&amp;diff=1418"/>
		<updated>2023-12-04T11:14:02Z</updated>

		<summary type="html">&lt;p&gt;Thijs: Undo revision 1417 by Thijs (talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* navigation&lt;br /&gt;
* Ouroboros: The model&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** Ouroboros Prototype#Try_the_Prototype|Getting Started&lt;br /&gt;
** Ouroboros Model|Network Model&lt;br /&gt;
** Ouroboros Protocols|Core Protocols&lt;br /&gt;
** Glossary | Glossary&lt;br /&gt;
** Ouroboros Frequently Asked Questions|Frequently Asked Questions&lt;br /&gt;
&lt;br /&gt;
* Network admin perspective&lt;br /&gt;
** Ouroboros Tutorials | Tutorials&lt;br /&gt;
** Ouroboros Metrics | Metrics / Observability&lt;br /&gt;
** Rumba|Orchestration&lt;br /&gt;
&lt;br /&gt;
* Application dev perspective&lt;br /&gt;
** Ouroboros API | APIs&lt;br /&gt;
&lt;br /&gt;
* Prototype internals perspective&lt;br /&gt;
** Source Code Guide | Source Code Guide&lt;br /&gt;
** Prototype Version History | Version history&lt;br /&gt;
&lt;br /&gt;
* Community&lt;br /&gt;
** Ouroboros Contributions | Contact&lt;br /&gt;
&lt;br /&gt;
* Wiki links&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
** helppage|help-mediawiki&lt;br /&gt;
&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=MediaWiki:Sidebar&amp;diff=1417</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=MediaWiki:Sidebar&amp;diff=1417"/>
		<updated>2023-12-04T11:13:43Z</updated>

		<summary type="html">&lt;p&gt;Thijs: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* navigation&lt;br /&gt;
* Ouroboros:&amp;lt;br/&amp;gt;The model&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** Ouroboros Prototype#Try_the_Prototype|Getting Started&lt;br /&gt;
** Ouroboros Model|Network Model&lt;br /&gt;
** Ouroboros Protocols|Core Protocols&lt;br /&gt;
** Glossary | Glossary&lt;br /&gt;
** Ouroboros Frequently Asked Questions|Frequently Asked Questions&lt;br /&gt;
&lt;br /&gt;
* Network admin perspective&lt;br /&gt;
** Ouroboros Tutorials | Tutorials&lt;br /&gt;
** Ouroboros Metrics | Metrics / Observability&lt;br /&gt;
** Rumba|Orchestration&lt;br /&gt;
&lt;br /&gt;
* Application dev perspective&lt;br /&gt;
** Ouroboros API | APIs&lt;br /&gt;
&lt;br /&gt;
* Prototype internals perspective&lt;br /&gt;
** Source Code Guide | Source Code Guide&lt;br /&gt;
** Prototype Version History | Version history&lt;br /&gt;
&lt;br /&gt;
* Community&lt;br /&gt;
** Ouroboros Contributions | Contact&lt;br /&gt;
&lt;br /&gt;
* Wiki links&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
** helppage|help-mediawiki&lt;br /&gt;
&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=MediaWiki:Sidebar&amp;diff=1416</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=MediaWiki:Sidebar&amp;diff=1416"/>
		<updated>2023-12-04T11:13:08Z</updated>

		<summary type="html">&lt;p&gt;Thijs: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* navigation&lt;br /&gt;
* Ouroboros: The model&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** Ouroboros Prototype#Try_the_Prototype|Getting Started&lt;br /&gt;
** Ouroboros Model|Network Model&lt;br /&gt;
** Ouroboros Protocols|Core Protocols&lt;br /&gt;
** Glossary | Glossary&lt;br /&gt;
** Ouroboros Frequently Asked Questions|Frequently Asked Questions&lt;br /&gt;
&lt;br /&gt;
* Network admin perspective&lt;br /&gt;
** Ouroboros Tutorials | Tutorials&lt;br /&gt;
** Ouroboros Metrics | Metrics / Observability&lt;br /&gt;
** Rumba|Orchestration&lt;br /&gt;
&lt;br /&gt;
* Application dev perspective&lt;br /&gt;
** Ouroboros API | APIs&lt;br /&gt;
&lt;br /&gt;
* Prototype internals perspective&lt;br /&gt;
** Source Code Guide | Source Code Guide&lt;br /&gt;
** Prototype Version History | Version history&lt;br /&gt;
&lt;br /&gt;
* Community&lt;br /&gt;
** Ouroboros Contributions | Contact&lt;br /&gt;
&lt;br /&gt;
* Wiki links&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
** helppage|help-mediawiki&lt;br /&gt;
&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=MediaWiki:Sidebar&amp;diff=1415</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=MediaWiki:Sidebar&amp;diff=1415"/>
		<updated>2023-12-04T11:12:43Z</updated>

		<summary type="html">&lt;p&gt;Thijs: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* Ouroboros: The model&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** Ouroboros Prototype#Try_the_Prototype|Getting Started&lt;br /&gt;
** Ouroboros Model|Network Model&lt;br /&gt;
** Ouroboros Protocols|Core Protocols&lt;br /&gt;
** Glossary | Glossary&lt;br /&gt;
** Ouroboros Frequently Asked Questions|Frequently Asked Questions&lt;br /&gt;
&lt;br /&gt;
* Network admin perspective&lt;br /&gt;
** Ouroboros Tutorials | Tutorials&lt;br /&gt;
** Ouroboros Metrics | Metrics / Observability&lt;br /&gt;
** Rumba|Orchestration&lt;br /&gt;
&lt;br /&gt;
* Application dev perspective&lt;br /&gt;
** Ouroboros API | APIs&lt;br /&gt;
&lt;br /&gt;
* Prototype internals perspective&lt;br /&gt;
** Source Code Guide | Source Code Guide&lt;br /&gt;
** Prototype Version History | Version history&lt;br /&gt;
&lt;br /&gt;
* Community&lt;br /&gt;
** Ouroboros Contributions | Contact&lt;br /&gt;
&lt;br /&gt;
* Wiki links&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
** helppage|help-mediawiki&lt;br /&gt;
&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_API&amp;diff=1414</id>
		<title>Ouroboros API</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_API&amp;diff=1414"/>
		<updated>2023-12-04T11:06:10Z</updated>

		<summary type="html">&lt;p&gt;Thijs: Created page with &amp;quot;{{under construction}} Here, the [https://{{SERVERNAME}}/docs/examples/ examples] &amp;amp; [https://{{SERVERNAME}}/docs/api/ APIs] will be ported from the old website and extended. We might also link to Ouroboros Implementation Overview.&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{under construction}}&lt;br /&gt;
Here, the [https://{{SERVERNAME}}/docs/examples/ examples] &amp;amp; [https://{{SERVERNAME}}/docs/api/ APIs] will be ported from the old website and extended.&lt;br /&gt;
We might also link to [[Ouroboros Implementation Overview]].&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=MediaWiki:Sidebar&amp;diff=1413</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=MediaWiki:Sidebar&amp;diff=1413"/>
		<updated>2023-12-04T11:03:44Z</updated>

		<summary type="html">&lt;p&gt;Thijs: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* navigation&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** Ouroboros Prototype#Try_the_Prototype|Getting Started&lt;br /&gt;
** Ouroboros Model|Network Model&lt;br /&gt;
** Ouroboros Protocols|Core Protocols&lt;br /&gt;
** Glossary | Glossary&lt;br /&gt;
** Ouroboros Frequently Asked Questions|Frequently Asked Questions&lt;br /&gt;
&lt;br /&gt;
* Network admin perspective&lt;br /&gt;
** Ouroboros Tutorials | Tutorials&lt;br /&gt;
** Ouroboros Metrics | Metrics / Observability&lt;br /&gt;
** Rumba|Orchestration&lt;br /&gt;
&lt;br /&gt;
* Application dev perspective&lt;br /&gt;
** Ouroboros API | APIs&lt;br /&gt;
* Prototype contribution perspective&lt;br /&gt;
** Source Code Guide | Source Code Guide&lt;br /&gt;
** Prototype Version History | Version history&lt;br /&gt;
&lt;br /&gt;
* Community&lt;br /&gt;
** Ouroboros Contributions | Contact&lt;br /&gt;
&lt;br /&gt;
* Wiki links&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
** helppage|help-mediawiki&lt;br /&gt;
&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=MediaWiki:Sidebar&amp;diff=1412</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=MediaWiki:Sidebar&amp;diff=1412"/>
		<updated>2023-12-04T10:55:56Z</updated>

		<summary type="html">&lt;p&gt;Thijs: Restructure sidebar (WIP)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* navigation&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** Ouroboros Prototype#Try_the_Prototype|Getting Started&lt;br /&gt;
** Ouroboros Model|Network Model&lt;br /&gt;
** Ouroboros Protocols|Core Protocols&lt;br /&gt;
** Glossary | Glossary&lt;br /&gt;
** Ouroboros Frequently Asked Questions|Frequently Asked Questions&lt;br /&gt;
&lt;br /&gt;
* Network admin perspective&lt;br /&gt;
** Ouroboros Tutorials | Tutorials&lt;br /&gt;
** Ouroboros Metrics | Metrics / Observability&lt;br /&gt;
** Rumba|Orchestration&lt;br /&gt;
&lt;br /&gt;
* Application dev perspective&lt;br /&gt;
&lt;br /&gt;
* Prototype contribution perspective&lt;br /&gt;
** Source Code Guide | Source Code Guide&lt;br /&gt;
** Prototype Version History | Version history&lt;br /&gt;
&lt;br /&gt;
* Community&lt;br /&gt;
** Ouroboros Contributions | Contact&lt;br /&gt;
&lt;br /&gt;
* Wiki links&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
** helppage|help-mediawiki&lt;br /&gt;
&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=MediaWiki:Sidebar&amp;diff=1411</id>
		<title>MediaWiki:Sidebar</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=MediaWiki:Sidebar&amp;diff=1411"/>
		<updated>2023-12-02T10:15:51Z</updated>

		<summary type="html">&lt;p&gt;Thijs: Split of dynamic links specific provided by mediawiki&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
* navigation&lt;br /&gt;
** mainpage|mainpage-description&lt;br /&gt;
** Ouroboros Prototype#Try_the_Prototype|Getting Started&lt;br /&gt;
** Ouroboros Tutorials | Tutorials&lt;br /&gt;
** Ouroboros Model|Network Model&lt;br /&gt;
** Ouroboros Protocols|Core Protocols&lt;br /&gt;
** Ouroboros Metrics | Metrics / Observability&lt;br /&gt;
** Source Code Guide | Source Code Guide&lt;br /&gt;
** Ouroboros Contributions | Contact&lt;br /&gt;
** Prototype Version History | Version history&lt;br /&gt;
** Rumba|Orchestration&lt;br /&gt;
** Glossary | Glossary&lt;br /&gt;
** Ouroboros Frequently Asked Questions|Frequently Asked Questions&lt;br /&gt;
* Wiki links&lt;br /&gt;
** recentchanges-url|recentchanges&lt;br /&gt;
** randompage-url|randompage&lt;br /&gt;
** helppage|help-mediawiki&lt;br /&gt;
* SEARCH&lt;br /&gt;
* TOOLBOX&lt;br /&gt;
* LANGUAGES&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros&amp;diff=1410</id>
		<title>Ouroboros</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros&amp;diff=1410"/>
		<updated>2023-12-01T12:21:27Z</updated>

		<summary type="html">&lt;p&gt;Thijs: Small extension to link to all relevant sides of O7s, see discussion&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File: Scalingtime.png|border|right|thumb|frame|Example Multi-Layer Ouroboros network (visualized using [[Rumba]])]]&lt;br /&gt;
&lt;br /&gt;
 Rebuilding packet networks from the ground up.&lt;br /&gt;
&lt;br /&gt;
= Summary =&lt;br /&gt;
&lt;br /&gt;
Ouroboros (abbreviated as O7s) is a prototype packet-switching technology that can function as an alternative to TCP/IP. It is aimed at substantially simplifying configuration and operation of packet-switched networks. It is based on a [[Ouroboros Functional Layering|redesign of the Internet model]] – from the programming API almost to the wire. If we had to describe Ouroboros in a single sentence, it could be &#039;&#039;micro-services architecture applied to the network itself&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
From an end-user application perspective, an Ouroboros network is a black box with a simple application programming interface to request communication services. Ouroboros can provision unicast flows - (bidirectional) channels that deliver message streams or byte streams with some requested operational (QoS) parameters such as maximum delay and bandwidth, protection against packet loss and authentication of peers and encryption of in-flight data; or it can provide broadcast flows to sets of processes.&lt;br /&gt;
&lt;br /&gt;
From an administrative perspective, an Ouroboros network is a collection of daemons that can be thought of as software routers (unicast) or software hubs (broadcast) that can be connected to each other; again through a simple management API. [[Ouroboros Tutorials|The tutorials]] highlight the administrative perspective of Ouroboros.&lt;br /&gt;
&lt;br /&gt;
The prototype is developed for POSIX operating systems (Linux, *BSD, OS X). It is not directly compatible with TCP/IP (it uses different protocols) nor with POSIX sockets (it has a different API), but it has interfaces and tools to run over Ethernet or UDP, or to create IP/Ethernet tunnels over Ouroboros by exposing tap or tun devices for injecting packets.&lt;br /&gt;
&lt;br /&gt;
= Motivation and Objectives =&lt;br /&gt;
&lt;br /&gt;
Setting up a service over TCP/IP usually involves many different technologies. By the time the service is up and running, it will likely have involved configuring (switchport-based and trunk) VLANs, enabling some Spanning Tree Protocol variant in parts of the network, setting up link aggregation between ports on stacked switches, defining IP subnetworks, configuring a DHCP server to assign addresses to the subnets, setting up gateways, DNS servers, possibly configuring OSPF, IS-IS or iBGP/eBGP, selecting TCP and UDP ports for the applications, configuring  reverse proxies, setting firewall and Network Address Translation (NAT) rules, adding some servers to a demilitarized zone, configuring a Virtual Private Network server, establishing a few SSH tunnels here and there... the list is almost endless. &lt;br /&gt;
&lt;br /&gt;
A lot of this configuration is mostly static and done manually, once the service is in place, everything needs to be painstakingly documented because the configuration can be very brittle: introducing small changes can inadvertently bring the service down, and tracking down bugs, configuration errors or faults can take hours or even days. News stories about some DNS or [https://blog.cloudflare.com/october-2021-facebook-outage/ BGP misconfiguration] taking down a global service pop up regularly in the media. &lt;br /&gt;
&lt;br /&gt;
The configuration is also spread out as IP address and port configurations need to be applied consistently between different devices (application servers, DHCP and DNS servers, NAT firewalls, application client hardware) and software packages (server software, reverse proxies, client software), whose configuration files often have different formats. Storing, maintaining and automating network and service configuration has become so elaborate and daunting that it now has its own buzzword: &#039;&#039;infrastructure as code&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
The service configuration is not very scalable or portable. The IP network topology is defined by manual subnet assignments, and IP addresses often double as server identifiers in the minds of network admins. If an IP subnet has been over- or under-dimensioned, changing it can cause the need for redesigning many parts of the network. More than often, design compromises are made leaving as much of the network as-is because changing it would take weeks and involve downtime for many critical services. Moving infrastructure within or between datacenters or reintegrating it in a different parts can cause many headaches, some can be mitigated using virtualization, but the configuration of virtual machines and containers is still much more complicated than necessary. &lt;br /&gt;
&lt;br /&gt;
Core Internet technology itself has become &#039;&#039;ossified&#039;&#039;; the core protocols haven&#039;t changed much in 30 years because making changes that are easy in theory, such as adding a new L3 protocol (IPv6) has become a decades-long slog. There are many &#039;&#039;layer violations&#039;&#039; creating unnecessary and unwanted ties between different layers in the model: L2 (Ethertype), L3 (protocol field), L4 (well-known ports) and L5 (struct sockaddr_in/_in6). A change in one of the layers permeates all the way through the network stack. To make things worse, standardization and research bodies have been established along the (blurry) demarcation lines of the 5-Layer Internet model. [https://en.wikipedia.org/wiki/Conway%27s_law Conway&#039;s Law] prevents any significant architectural or structural innovations from taking root.&lt;br /&gt;
&lt;br /&gt;
The Internet is not a friendly place. Deploying a service over the Internet is more akin to venturing out into a lawless warzone than taking a nice stroll in the friendly neighborhood park. The first thing on any dotcom entrepreneur&#039;s mind is cybersecurity (quickly followed by how much it&#039;s going to cost him or her when the inevitable security breach comes). We would argue that the reason that the Internet has become ossified is also the reason for many network-level exploits: its bloated protocols rolled out the red carpet for cybercrime, cyberterrorism and cyberwarfare. TCP/IP has enabled an Internet that is robust to physical attacks on its infrastructure but left vulnerable to cyberattacks on its services. Unless we revise its architecture and core protocols, mitigating cyberthreats will remain a perpetual arms race between service providers and malicious hackers&amp;lt;ref&amp;gt;[https://blog.cloudflare.com/the-ddos-that-knocked-spamhaus-offline-and-ho/ The DDoS That Knocked Spamhaus Offline (And How We Mitigated It)]&amp;lt;/ref&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
The Internet model is also rife with internal contradictions and inconsistencies. Examples abound of protocols that are jammed into the model without fitting - if IP is L3, how is ICMP also L3 as it runs on top of IP? Such contradictions hint at an incomplete understanding of packet networks.&lt;br /&gt;
&lt;br /&gt;
In a nutshell, our objectives are to simplify and reduce network and service configuration and prevent ossification, and to do this by cleaning up and polishing the architecture and its protocols.&lt;br /&gt;
&lt;br /&gt;
= Ouroboros characteristics =&lt;br /&gt;
&lt;br /&gt;
O7s has &#039;&#039;&#039;no well-known ports&#039;&#039;&#039;, ephemeral endpoint identifiers (EIDs) are defined at the model&#039;s [[Ouroboros Functional Layering|network end-to-end layer]] and are (randomly) assigned at runtime - the sole exception is the flow allocator at EID 0. This implies:&lt;br /&gt;
* no direct tie between the network protocols and certain application, and thus no need to &#039;standardize&#039; certain values for certain identifiers (Ethertype/protocol/port).&lt;br /&gt;
* no need to define, track and/or de-conflict port values when setting up networked applications &lt;br /&gt;
* no hacks such as port-scanning a server for (vulnerable) applications&lt;br /&gt;
&lt;br /&gt;
The flow allocator is a &#039;&#039;&#039;single point of contact&#039;&#039;&#039;:&lt;br /&gt;
* endpoint identifiers assigned when a flow is allocated&lt;br /&gt;
* sets and stores peer information (remote address and endpoint identifier) at the start of communication, so&lt;br /&gt;
** no need for source address and source endpoint in every packet&lt;br /&gt;
** even if an attacker would find a valid address/endpoint, fabricated packets sent there will not result in any knowledge gained by the attacker as return traffic is sent to the stored peer, not the attacker.&lt;br /&gt;
** no smurf/amplification attacks leveraging faked source addresses&lt;br /&gt;
* backpressure may be an option to quench DDoS attempts&lt;br /&gt;
* authentication/encryption before first application byte&lt;br /&gt;
&lt;br /&gt;
The application library and IRMd work together to create a &#039;&#039;&#039;single point of configuration&#039;&#039;&#039;:&lt;br /&gt;
* Instead of having network configuration per application, single network configuration file per system&lt;br /&gt;
* All O7s applications in the system inherit the network capabilities of the installed O7s version.&lt;br /&gt;
&lt;br /&gt;
All traffic is congestion controlled, the congestion avoidance algorithm sits in the network end-to-end layer.&lt;br /&gt;
&lt;br /&gt;
= The project =&lt;br /&gt;
&lt;br /&gt;
Ouroboros leverages about 4 decades of hindsight and 2 decades worth of research experience in [[History of Ouroboros | academic projects]] on future networks, more specifically in EU-funded (FP6, FP7 and Horizon 2020) projects on IP/WDM, Carrier Ethernet, Software Defined Networks (SDNs) and the Recursive InterNetwork Architecture (RINA). After gaining development experience on the [https://github.com/IRATI/stack IRATI] kernel RINA prototype for OS/Linux, in early 2016 the decision was made to restart from scratch and try to avoid some issues we identified with the RINA model as it stood at that time. We aimed at POSIX user-space to make the prototype more accessible as compiling a kernel or kernel modules is a steep barrier to entry. Development was done in parallel with ongoing funded research to keep things as independent as possible from outside interference, but we used Ouroboros as one of the prototypes for the development of the [[Rumba]] orchestration framework for recursive networks. After leaving university we decided to keep taking the prototype forward in our spare time. It&#039;s a lot of work, but we still have a pretty clear view of the path forward, and there&#039;s only one way to eat an elephant: one bite at a time.&lt;br /&gt;
&lt;br /&gt;
= What to expect from this right now =&lt;br /&gt;
&lt;br /&gt;
In its current state, the prototype can demonstrate the validity of many aspects of the model and the potential of a full implementation of this model. It is far from a production piece of software, but rather a proof-of-concept that you can toy around with. See our [[Ouroboros Tutorials| tutorials]] section to get an overview of what the prototype can currently do. Our [[Ouroboros Implementation Overview|implementation overview]] tries to paint a picture of the implementation status of various components and functions. We are aware that parts of the implementation are quite buggy and are working on getting this fixed.&lt;br /&gt;
&lt;br /&gt;
Initially, a lot of the information on this website may sound a bit awkward, especially if configuring VLANs, defining IP subnets and configuring BGP routers are your daily bread and butter. We are the first to admit some of the terminology could use an overhaul. It will require a bit of effort to plow through the concepts of &#039;&#039;flow allocation&#039;&#039; and &#039;&#039;binding / registering names&#039;&#039; but once the penny drops, understanding O7s should prove rewarding.&lt;br /&gt;
&lt;br /&gt;
If you find this interesting, just ask around on our [https://matrix.to/#/#ODecentralize:matrix.org matrix channel].&lt;br /&gt;
&lt;br /&gt;
= References =&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Talk:Ouroboros&amp;diff=1409</id>
		<title>Talk:Ouroboros</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Talk:Ouroboros&amp;diff=1409"/>
		<updated>2023-12-01T12:16:03Z</updated>

		<summary type="html">&lt;p&gt;Thijs: Structuring the O7s wiki, proposal&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;I think it might be beneficial to clearly structure the different ways O7s can be viewed AND link directly to relevant documentation.&lt;br /&gt;
Maybe also clearly structuring the sidebar might help, because in my opinion it is a bit chaos right now.&lt;br /&gt;
I subdived this myself, I&#039;m convinced category 2,3 &amp;amp; 4 need to be clearly distinguished.&lt;br /&gt;
I &#039;&#039;think&#039;&#039; category 1 is then the overarching story, with 5 also being important to view separately.&lt;br /&gt;
Also would be beneficial to split off links like &#039;Recent changes&#039; and &#039;Random page&#039; in the sidebar.&lt;br /&gt;
&lt;br /&gt;
1. &#039;&#039;&#039;The overall architecture? Architectural documents?&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
&#039;The story&#039;, I&#039;d say.&lt;br /&gt;
Maybe also [[Ouroboros Prototype | Getting Started]] aka installation of the O7s prototype fits here? It is needed for 2,3 and 4 at least...&lt;br /&gt;
[[Ouroboros Model|Network Model]], [[Ouroboros Protocols|Core Protocols]], [[Glossary]] and [[Ouroboros Frequently Asked Questions| FAQ]] fit also in this category.&lt;br /&gt;
&lt;br /&gt;
2. &#039;&#039;&#039;Using O7 as a network admin.&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
The [[Ouroboros Tutorials|tutorials]] are focusing on this aspect, I think&lt;br /&gt;
Also [[Ouroboros Metrics|Metrics/Observability]] and [[Rumba|Orchestration]] fall under this viewpoint?!&lt;br /&gt;
&lt;br /&gt;
3. &#039;&#039;&#039;Using O7s as an end-user application.&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Here, the [https://{{SERVERNAME}}/docs/examples/ examples] &amp;amp; [https://{{SERVERNAME}}/docs/api/ APIs] need to be ported from the old website and extended.&lt;br /&gt;
&lt;br /&gt;
4. &#039;&#039;&#039;Contributing to O7s itself.&#039;&#039;&#039;&amp;lt;br/&amp;gt;&lt;br /&gt;
Maybe includes a roadmap/link to Kanban.&lt;br /&gt;
Link to [[Source Code Guide]], [[Prototype Version History]].&lt;br /&gt;
&lt;br /&gt;
5. &#039;&#039;&#039;Community&#039;&#039;&#039; :)&amp;lt;br/&amp;gt;&lt;br /&gt;
Includes [[Ouroboros Contributions|contact]] page&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Tutorial_05&amp;diff=1408</id>
		<title>Ouroboros Tutorial 05</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Tutorial_05&amp;diff=1408"/>
		<updated>2023-11-30T13:08:49Z</updated>

		<summary type="html">&lt;p&gt;Thijs: Use long form command line options in documentation &amp;amp; scripts.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File: O7s_tutorial05-01.png|border|right|thumb|frame|Ouroboros Tutorial 05]]&lt;br /&gt;
&lt;br /&gt;
In this tutorial, we show how to run oping between two machines connected to the same IPv4 network (LAN or Internet). As usual we use a debug build to show some extra log output. In addition to showing how to configure O7s over UDP/IPv4, we also show how to configure load-balancing of flow allocation requests between processes at the server side.&lt;br /&gt;
&lt;br /&gt;
This tutorial uses a desktop and a raspberry pi. To run this tutorial on a single machine, configure the UDP 0-Layer to to use the loopback adapter (set 127.0.0.1 for the SERVER IP ADDRESS).&lt;br /&gt;
&lt;br /&gt;
Configuration for the raspberry pi, which will run 2 oping server processes, which will be available under different service names: oping-server, and oping-server2. Flows to oping-server will be load-balanced in a round-robin way (alternating between the processes), flows to oping-server2 will (usually) go to the same process.&lt;br /&gt;
&lt;br /&gt;
Configuration file for the server machine. Fill out the correct IP address for the interface you want to use, without subnet (e.g. &amp;quot;192.168.0.2&amp;quot;):&lt;br /&gt;
&lt;br /&gt;
 $ cat /etc/ouroboros/tut05.conf&lt;br /&gt;
 [name.&amp;quot;oping-server&amp;quot;]&lt;br /&gt;
 prog=[&amp;quot;/usr/bin/oping&amp;quot;]&lt;br /&gt;
 args=[&amp;quot;--listen&amp;quot;]&lt;br /&gt;
 lb=&amp;quot;round-robin&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 [name.&amp;quot;oping-server2&amp;quot;]&lt;br /&gt;
 prog=[&amp;quot;/usr/bin/oping&amp;quot;]&lt;br /&gt;
 args=[&amp;quot;--listen&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
 [udp.wifi1]&lt;br /&gt;
 bootstrap=&amp;quot;wifi-network&amp;quot;&lt;br /&gt;
 ip=&amp;quot;&amp;lt;SERVER IP ADDRESS&amp;gt;&amp;quot;&lt;br /&gt;
 reg=[&amp;quot;oping-server&amp;quot;, &amp;quot;oping-server2&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
Configuration file for the machine running the clients (if a different machine):&lt;br /&gt;
&lt;br /&gt;
 $ cat /etc/ouroboros/tut05.conf&lt;br /&gt;
 [udp.wifi1]&lt;br /&gt;
 bootstrap=&amp;quot;wifi-network&amp;quot;&lt;br /&gt;
 ip=&amp;quot;&amp;lt;CLIENT IP ADDRESS&amp;gt;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Save the configurations as a file (we named it /etc/ouroboros/tut05.conf on both machines). &lt;br /&gt;
We are using UDP/IP and the ipcpd-udp will try to resolve the MD5 hash of the application name to an IP address via DNS: &#039;&#039;gethostbyname()&#039;&#039;.&lt;br /&gt;
For this tutorial we add the DNS entries to /etc/hosts (on the client machine):&lt;br /&gt;
&lt;br /&gt;
 $ cat /etc/hosts | grep oping-server&lt;br /&gt;
 &amp;lt;SERVER IP ADDRESS&amp;gt;    6ae220aa6aae06c43878513c64db34b6  #oping-server&lt;br /&gt;
 &amp;lt;SERVER IP ADDRESS&amp;gt;    f87b9400fa8f3d568b1481da7a99d122  #oping-server2&lt;br /&gt;
&lt;br /&gt;
Once this is set up, start the IRMd on your machine(s) with the configurations above. The IRMd will show some details for the ipcpd-udp:&lt;br /&gt;
&lt;br /&gt;
 ==16716== irmd/configuration(DB): Found IPCP wifi1 in configuration file.&lt;br /&gt;
 ==16716== irmd(II): Created IPCP 16728.&lt;br /&gt;
 ==16728== ipcpd/ipcp(II): Bootstrapping...&lt;br /&gt;
 ==16728== ipcpd/udp(DB): Bootstrapped IPCP over UDP with pid 16728.&lt;br /&gt;
 ==16728== ipcpd/udp(DB): Bound to IP address 192.168.0.2.&lt;br /&gt;
 ==16728== ipcpd/udp(DB): Using port 3435.&lt;br /&gt;
 ==16728== ipcpd/udp(DB): DNS server not in use.&lt;br /&gt;
 ==16728== ipcpd/ipcp(II): Finished bootstrapping:  0.&lt;br /&gt;
 ==16716== irmd(II): Bootstrapped IPCP 16728 in layer wifi-network.&lt;br /&gt;
&lt;br /&gt;
The default UDP port for O7s ipcpd-udp is 3435 (both server and client side, to simplify traversing NATs), which can be changed with the port=&amp;quot;&amp;lt;port&amp;gt;&amp;quot; option. All ipcpd-udps in a UDP Layer need to have the same UDP port set. The UDP Layer supports using a private DDNS server (such as &#039;&#039;bind&#039;&#039;), which can be specified with a dns=&amp;quot;&amp;lt;DNS IP ADDRESS&amp;gt;&amp;quot; option (see the example config file).&lt;br /&gt;
&lt;br /&gt;
With the irmds started, just spin up a few servers: open 2 terminals, and in each start an oping server with &amp;quot;oping -l&amp;quot;. You will see that they service requests for both names:&lt;br /&gt;
&lt;br /&gt;
 ==16716== irmd(DB): Process 16792 inherits name oping-server2 from program oping.&lt;br /&gt;
 ==16716== irmd(DB): Process 16792 inherits name oping-server from program oping.&lt;br /&gt;
 ==16716== irmd(DB): New instance (16792) of oping added.&lt;br /&gt;
 ==16716== irmd(DB): This process accepts flows for:&lt;br /&gt;
 ==16716== irmd(DB):         oping-server&lt;br /&gt;
 ==16716== irmd(DB):         oping-server2&lt;br /&gt;
 ==16716== irmd(DB): Process 16809 inherits name oping-server2 from program oping.&lt;br /&gt;
 ==16716== irmd(DB): Process 16809 inherits name oping-server from program oping.&lt;br /&gt;
 ==16716== irmd(DB): New instance (16809) of oping added.&lt;br /&gt;
 ==16716== irmd(DB): This process accepts flows for:&lt;br /&gt;
 ==16716== irmd(DB):         oping-server&lt;br /&gt;
 ==16716== irmd(DB):         oping-server2&lt;br /&gt;
&lt;br /&gt;
Then on the client machine, if we run the client a few times, you should see that the requests to oping-server (&#039;&#039;oping -n oping-server -c 1 -Q&#039;&#039;) get serviced by both oping servers in an alternating way. However, requests to oping-server2 (&#039;&#039;oping -n oping-server2 -c 1 -Q&#039;&#039;) all go to the same oping instance.&lt;br /&gt;
&lt;br /&gt;
Note that there is no guarantee that oping-server2 will always go to the same instance (to see that, run clients mixing the service names). To guarantee going to a specific process, bind a specific (single) process (in our example, for instance, PID 16809) to a name using the &#039;&#039;irm name bind process &amp;lt;pid&amp;gt; name &amp;lt;name&amp;gt;&#039;&#039; CLI command. Multiple UDP Layers can be configured in parallel, but then it&#039;s best to use DDNS, and a separate DDNS server for each Layer; the hosts file is valid for all ipcpd-udp processes and will potentially mess things up.&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Tutorial_04&amp;diff=1407</id>
		<title>Ouroboros Tutorial 04</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Tutorial_04&amp;diff=1407"/>
		<updated>2023-11-30T13:05:23Z</updated>

		<summary type="html">&lt;p&gt;Thijs: Use long form command line options in documentation &amp;amp; scripts.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File: O7s_tutorial04-01.png|border|right|thumb|frame|Ouroboros Tutorial 04]]&lt;br /&gt;
&lt;br /&gt;
In this tutorial, we show how to run oping between two machines connected to the same Ethernet LAN. It requires OpenSSL to be installed before building O7s to enable encrypted flows, and as usual we use a debug build to show some extra log output.&lt;br /&gt;
&lt;br /&gt;
For the second machine we use a Raspberry Pi Model 4B+ (ARM64, 32-bit Raspbian 11) connected to the same WiFi LAN as my desktop (Intel 13900KF, ArchLinux).&lt;br /&gt;
&lt;br /&gt;
We chose the Ethernet DIX option, because our LLC packets sometimes get dropped on wireless LANs (protocol ossification at work). To use the LLC Ethernet 0-Layer, all that is needed is to change eth-dix to eth-llc in (both) the configuration files in this tutorial (left to the reader).&lt;br /&gt;
&lt;br /&gt;
We run the server on the raspberry pi. The O7s config file for the Raspberry Pi connects to the &#039;&#039;wlan0&#039;&#039; device and registers the &amp;quot;oping-server&amp;quot; application with the Ethernet 0-Layer. You will have to replace wlan0 with the correct ethernet device! The name &#039;&#039;wifi1&#039;&#039; and &#039;&#039;wifi-network&#039;&#039; don&#039;t really matter, so you can change them to your liking.&lt;br /&gt;
&lt;br /&gt;
 [name.&amp;quot;oping-server&amp;quot;]&lt;br /&gt;
 prog=[&amp;quot;/usr/bin/oping&amp;quot;]&lt;br /&gt;
 args=[&amp;quot;--listen&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
 [eth-dix.wifi1]&lt;br /&gt;
 bootstrap=&amp;quot;wifi-network&amp;quot;&lt;br /&gt;
 dev=&amp;quot;&#039;&#039;wlan0&#039;&#039;&amp;quot;&lt;br /&gt;
 reg=[&amp;quot;oping-server&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
The configuration for the desktop machine (O7s client) is quite simple:&lt;br /&gt;
&lt;br /&gt;
 [eth-dix.wifi1]&lt;br /&gt;
 bootstrap=&amp;quot;wifi-network&amp;quot;&lt;br /&gt;
 dev=&amp;quot;&#039;&#039;wlan0&#039;&#039;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
If you do not have two machines, you can run this on a single machine using the loopback adapter. In that case, set the following in your configuration file:&lt;br /&gt;
&lt;br /&gt;
 [name.&amp;quot;oping-server&amp;quot;]&lt;br /&gt;
 prog=[&amp;quot;/usr/bin/oping&amp;quot;]&lt;br /&gt;
 args=[&amp;quot;--listen&amp;quot;]&lt;br /&gt;
 &lt;br /&gt;
 [eth-dix.lo]&lt;br /&gt;
 bootstrap=&amp;quot;loopback-network&amp;quot;&lt;br /&gt;
 dev=&amp;quot;lo&amp;quot;&lt;br /&gt;
 reg=[&amp;quot;oping-server&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The description assumes you are running on 2 machines, on a single machine. Save these configuration as a file on each machine - we chose to save them at /etc/ouroboros/tut04.conf - and start an IRMd on each machine with that config file.&lt;br /&gt;
The IRMd will log the use of the configuration file, on the raspberry pi it will create the service name for oping-server:&lt;br /&gt;
&lt;br /&gt;
 dstaesse@raspberrypi:~ $ sudo irmd --stdout --config /etc/ouroboros/tut04.conf&lt;br /&gt;
 ==28267== irmd(II): Ouroboros IPC Resource Manager daemon started...&lt;br /&gt;
 ==28267== irmd/configuration(II): Reading configuration from file /etc/ouroboros/tut04.conf&lt;br /&gt;
 ==28267== irmd/configuration(DB): Found service name oping-server in configuration file.&lt;br /&gt;
 ==28267== irmd(II): Created new name: oping-server.&lt;br /&gt;
 ==28267== irmd(II): Bound program /usr/bin/oping to name oping-server.&lt;br /&gt;
&lt;br /&gt;
The IRMd then bootstraps the IPCP (this happens on both machines):&lt;br /&gt;
&lt;br /&gt;
 ==28267== irmd/configuration(DB): Found IPCP wifi1 in configuration file.&lt;br /&gt;
 ==28267== irmd(II): Created IPCP 28279.&lt;br /&gt;
 ==28267== irmd/configuration(DB): No hash specified, using default.&lt;br /&gt;
 ==28279== ipcpd/ipcp(II): Bootstrapping...&lt;br /&gt;
 ==28279== ipcpd/eth-dix(DB): Device MTU is 1500.&lt;br /&gt;
 ==28279== ipcpd/eth-dix(DB): Layer MTU is 1500.&lt;br /&gt;
 ==28279== ipcpd/eth-dix(II): Using raw socket device.&lt;br /&gt;
 ==28279== ipcpd/eth-dix(DB): Bootstrapped IPCP over DIX Ethernet with pid 28279 and Ethertype 0xA000.&lt;br /&gt;
 ==28279== ipcpd/ipcp(II): Finished bootstrapping:  0.&lt;br /&gt;
 ==28267== irmd(II): Bootstrapped IPCP 28279 in layer wifi-network.&lt;br /&gt;
&lt;br /&gt;
The ipcpd-eth-* detects the device MTU (which is usually 1500 bytes, but can be lower on virtual machine guests, or higher, for instance the loopback interface). The ipcpd-eth-* Layer MTU will be set to the device MTU, or to [[Ouroboros Build Parameters|IPCP_ETH_LO_MTU]]  when using the loopback adapter. We will probably make the Layer MTU a runtime configuration parameter in the future, so it can be configured in the configuration file. The Raspberry Pi is using Linux, which defaults to a raw socket device for interfacing with Ethernet devices. Other options for interfacing with Ethernet are Berkeley Packet Filter (BPF) (for *BSD and OS X) or netmap (if installed). Our IPCP will process all packets on a specified Ethertype. The default value is 0xA000. &lt;br /&gt;
&lt;br /&gt;
The IRMd on the raspberry Pi will make the oping service available on the Ethernet 0-Layer:&lt;br /&gt;
&lt;br /&gt;
 ==28267== irmd/configuration(DB): Registering oping-server in 28279&lt;br /&gt;
 ==28267== irmd(WW): Name oping-server already exists.&lt;br /&gt;
 ==28279== ipcpd/ipcp(II): Registering f6c93ff2...&lt;br /&gt;
 ==28279== ipcpd/ipcp(II): Finished registering f6c93ff2 : 0.&lt;br /&gt;
 ==28267== irmd(II): Registered oping-server with IPCP 28279 as f6c93ff2.&lt;br /&gt;
&lt;br /&gt;
With the IRMd started on both machines, we can start the oping server. We use the --quiet (-Q) option to reduce output in the example (oping -l -Q).&lt;br /&gt;
&lt;br /&gt;
In addition to demonstrating the use of the ipcpd-eth-dix, we will also show the use of &#039;&#039;encrypted flows&#039;&#039;. To make this more visible, we dump the traffic on the Raspberry Pi&#039;s wlan0 device for ethertype 0xA000 using &#039;&#039;tcpdump&#039;&#039; (change wlan0 to the correct ethernet device).&lt;br /&gt;
 dstaesse@raspberrypi:~ $ sudo tcpdump -i wlan0 ether proto 0xa000&lt;br /&gt;
 tcpdump: verbose output suppressed, use -v[v]... for full protocol decode&lt;br /&gt;
 listening on wlan0, link-type EN10MB (Ethernet), snapshot length 262144 bytes&lt;br /&gt;
&lt;br /&gt;
Our desktop machine has MAC address c8:cb:9e:d0:04:08, the Raspberry Pi has MAC address d8:3a:dd:39:0a:b5.&lt;br /&gt;
&lt;br /&gt;
Our ipcpd-eth-dix has the following packet header, note that the dst and src hardware (MAC) addresses and the ethertype are shown on the first line of the tcpdump output. The hex output starts at &#039;&#039;eid&#039;&#039;.&lt;br /&gt;
         &lt;br /&gt;
 uint8_t  dst_hwaddr[6];&lt;br /&gt;
 uint8_t  src_hwaddr[6];&lt;br /&gt;
 uint16_t ethertype;&lt;br /&gt;
&lt;br /&gt;
 uint16_t eid;&lt;br /&gt;
 uint16_t length;&lt;br /&gt;
&lt;br /&gt;
The endpoint identifier (EID, &#039;&#039;eid&#039;&#039; field in the header above) is used for multiplexing flows, in the ipcpd-eth-* it is 16 bits wide and set to the flow descriptor used by the application (in the ipcpd-unicast the EID is 64 bits and assigned in a random way). The &#039;&#039;length&#039;&#039; field is needed to deal with Ethernet frames that would be shorter than 64 bytes, which are padded with zero bytes, and we need to know if those zeroes are padding or payload. These are known as &#039;&#039;runt&#039;&#039; frames.&lt;br /&gt;
&lt;br /&gt;
For readers also trying the ipcpd-eth-llc, the header format is a little bit different: no &#039;&#039;eid&#039;&#039; instead we use LLC SAPs as endpoint identifiers and no &#039;&#039;length&#039;&#039; (Ethernet LLC has its own length field instead of the Ethertype to deal with runt frames). The control field &#039;&#039;cf&#039;&#039; is fixed and set to [https://en.wikipedia.org/wiki/IEEE_802.2 LLC type 1] (0x03).&lt;br /&gt;
&lt;br /&gt;
When we ping (one ping only) from the desktop (&#039;&#039;oping -n oping-server -c 1&#039;&#039;), we see the traffic exchange on the wlan. Let&#039;s break it down:&lt;br /&gt;
&lt;br /&gt;
The client initiates the communications using the &#039;&#039;flow_alloc()&#039;&#039; function call. This will send a &#039;&#039;Flow Allocation Request&#039;&#039; message to the server. We have not requested anything special, so this will be a request for a vanilla best-effort &#039;&#039;raw flow&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
 09:57:08.998005 c8:cb:9e:d0:04:08 (oui Unknown) &amp;gt; d8:3a:dd:39:0a:b5 (oui Unknown), ethertype Unknown (0xa000), length 88: &lt;br /&gt;
         0x0000:  0000 &#039;&#039;&#039;0046&#039;&#039;&#039; 0040 &#039;&#039;&#039;0000&#039;&#039;&#039; 0000 0001 &#039;&#039;&#039;0000 0000&#039;&#039;&#039;  ...F.@..........&lt;br /&gt;
         0x0010:  &#039;&#039;&#039;0000 0000&#039;&#039;&#039; 0000 0001 &#039;&#039;&#039;ffff ffff&#039;&#039;&#039; ffff ffff  ................&lt;br /&gt;
         0x0020:  &#039;&#039;&#039;0001 d4c0&#039;&#039;&#039; 0000 &#039;&#039;&#039;00&#039;&#039;&#039;00 &#039;&#039;&#039;00&#039;&#039;&#039;00 &#039;&#039;&#039;f6c9 3ff2 3bd9&#039;&#039;&#039;  ............?.;.&lt;br /&gt;
         0x0030:  &#039;&#039;&#039;1094 3a77 8e7b 3faf 7bff ec03 796d b676&#039;&#039;&#039;  ..:w.{?.{...ym.v&lt;br /&gt;
         0x0040:  &#039;&#039;&#039;1bfa 5f70 758f 9ee2 e6fa&#039;&#039;&#039;                 .._pu.....&lt;br /&gt;
&lt;br /&gt;
The packet is a flow allocation message (fixed packet format for the flow allocator). The full description of what&#039;s in this packet is:&lt;br /&gt;
&lt;br /&gt;
 uint16_t eid:                      0000 =       0 (This message is for the flow allocator)&lt;br /&gt;
 uint16_t length:                   0046 =      70 (Length of the payload) &lt;br /&gt;
 &lt;br /&gt;
 uint16_t src eid:                  0040 =      64 (EID assigned to the oping client)&lt;br /&gt;
 uint16_t dst eid:                  0000 =       0 (not used in allocation request)&lt;br /&gt;
 uint32_t loss:                0000 0001 =       1 (disables ARQ)&lt;br /&gt;
 uint64_t bandwidth: 0000 0000 0000 0000 =       0 (no reservation)&lt;br /&gt;
 uint32_t ber:                 0000 0001 =       1 (disables CRC)&lt;br /&gt;
 uint32_t max_gap:             ffff ffff = MAX_INT (any inter-packet gap is fine)&lt;br /&gt;
 uint32_t delay:               ffff ffff = MAX_INT (any delay is fine)&lt;br /&gt;
 uint32_t timeout:             0001 d4c0 =  120000 (2 minutes)&lt;br /&gt;
 uint16_t cypher_s:                 0000 =       0 (no encryption)&lt;br /&gt;
 uint8_t  in_order:                   00 =       0 (no in-order delivery)&lt;br /&gt;
 uint8_t  code:                       00 =       0 (flow allocation request)&lt;br /&gt;
 uint8_t  availability:               00 =       0 (9&#039;s, any availability will do)&lt;br /&gt;
 int8_t   response                    00 =       0 (not used in flow allocation request)&lt;br /&gt;
  &lt;br /&gt;
The final 32 bytes of the message (f6c9 3f.. ..e2 e6fa) is the SHA3-256 hash of &#039;&#039;oping-server&#039;&#039;. When the flow is accepted at the server side (on the Raspberry Pi), the ipcpd-eth-dix responds with a flow allocation response.&lt;br /&gt;
&lt;br /&gt;
The format is the same as above, without the destination has, and the QoS is set to 0 (QoS negotiation is not yet implemented). &lt;br /&gt;
&lt;br /&gt;
 09:57:09.000685 d8:3a:dd:39:0a:b5 (oui Unknown) &amp;gt; c8:cb:9e:d0:04:08 (oui Unknown), ethertype Unknown (0xa000), length 56: &lt;br /&gt;
         0x0000:  0000 &#039;&#039;&#039;0026&#039;&#039;&#039; 0040 &#039;&#039;&#039;0040&#039;&#039;&#039; 0000 0000 0000 0000  ...&amp;amp;.@.@........&lt;br /&gt;
         0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
         0x0020:  0000 0000 0000 00&#039;&#039;&#039;01&#039;&#039;&#039; 00&#039;&#039;&#039;00&#039;&#039;&#039;                 ..........&lt;br /&gt;
&lt;br /&gt;
The full explanation of the response is:&lt;br /&gt;
 uint16_t eid:                      0000 =       0 (This message is for the flow allocator)&lt;br /&gt;
 uint16_t length:                   0026 =      38 (Length of the payload)&lt;br /&gt;
 &lt;br /&gt;
 uint16_t src eid:                  0040 =      64 (EID assigned to the oping server at the server IPCP)&lt;br /&gt;
 uint16_t dst eid:                  0040 =      64 (EID assigned to the oping client at the client IPCP)&lt;br /&gt;
 /* QoS &#039;&#039;all zero&#039;&#039; unused in response */&lt;br /&gt;
 uint8_t  in_order:                   00 =       0 (part of QoS, zero)&lt;br /&gt;
 uint8_t  code:                       01 =       1 (flow allocation response)&lt;br /&gt;
 uint8_t  availability:               00 =       0 (part of QoS, zero)&lt;br /&gt;
 int8_t   response                    00 =       0 (flow allocation request was successful)&lt;br /&gt;
 &lt;br /&gt;
The next message is the actual oping message. Note the first two fields are 0040, the first is the destination EID (64), the second is not the source EID, but the payload length (both are also 64).&lt;br /&gt;
&lt;br /&gt;
 09:57:10.020082 c8:cb:9e:d0:04:08 (oui Unknown) &amp;gt; d8:3a:dd:39:0a:b5 (oui Unknown), ethertype Unknown (0xa000), length 82: &lt;br /&gt;
         0x0000:  0040 &#039;&#039;&#039;0040&#039;&#039;&#039; 0000 0000 &#039;&#039;&#039;0000 0000&#039;&#039;&#039; e307 0000 .@.@............&lt;br /&gt;
         0x0010:  0000 0000&#039;&#039;&#039; aa02 f70d 0000 0000&#039;&#039;&#039; 0000 0000  ................&lt;br /&gt;
         0x0020:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
         0x0030:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
         0x0040:  0000 0000                                ....&lt;br /&gt;
&lt;br /&gt;
The format of an oping message is:&lt;br /&gt;
&lt;br /&gt;
 uint32_t type:              0000 0000 = 0 (oping request) &lt;br /&gt;
 uint32_t id:                0000 0000 = 0 (sequence number, first message)&lt;br /&gt;
 uint64_t tv_sec:  e307 0000 0000 0000 = - (monotonic clock timestamp)&lt;br /&gt;
 uint64_t tv_nsec: aa02 f70d 0000 0000 = - (monotonic clock timestamp)&lt;br /&gt;
&lt;br /&gt;
The remainder are 40 bytes worth of zeroes to get the payload length to 64 bytes (ping default). Note that the timestamp is not converted to network byte order as it is only set and read at the client to calculate the round-trip time.&lt;br /&gt;
&lt;br /&gt;
The oping response has the message type set to 0000 0001 (1 = oping response) below:&lt;br /&gt;
&lt;br /&gt;
 09:57:10.020890 d8:3a:dd:39:0a:b5 (oui Unknown) &amp;gt; c8:cb:9e:d0:04:08 (oui Unknown), ethertype Unknown (0xa000), length 82: &lt;br /&gt;
         0x0000:  0040 0040 &#039;&#039;&#039;0000 0001&#039;&#039;&#039; 0000 0000 e307 0000  .@.@............&lt;br /&gt;
         0x0010:  0000 0000 aa02 f70d 0000 0000 0000 0000  ................&lt;br /&gt;
         0x0020:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
         0x0030:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
         0x0040:  0000 0000&lt;br /&gt;
&lt;br /&gt;
Now, let&#039;s request an encrypted flow. To do that, start the oping client again, but now give it a raw_crypt option (&#039;&#039;oping -n oping-server -c 1 -q raw_crypt&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
The first message is again a flow allocation request. The formatting is the same as above, so let&#039;s highlight the differences.&lt;br /&gt;
&lt;br /&gt;
 09:57:20.057379 c8:cb:9e:d0:04:08 (oui Unknown) &amp;gt; d8:3a:dd:39:0a:b5 (oui Unknown), ethertype Unknown (0xa000), length 179: &lt;br /&gt;
         0x0000:  0000 00a1 0040 0000 0000 0001 0000 0000  .....@..........&lt;br /&gt;
         0x0010:  0000 0000 0000 0001 ffff ffff ffff ffff  ................&lt;br /&gt;
         0x0020:  0001 d4c0 &#039;&#039;&#039;0100&#039;&#039;&#039; 0000 0000 f6c9 3ff2 3bd9  ............?.;.&lt;br /&gt;
         0x0030:  1094 3a77 8e7b 3faf 7bff ec03 796d b676  ..:w.{?.{...ym.v&lt;br /&gt;
         0x0040:  1bfa 5f70 758f 9ee2 e6fa &#039;&#039;&#039;3059 3013 0607&#039;&#039;&#039;  .._pu.....0Y0...&lt;br /&gt;
         0x0050:  &#039;&#039;&#039;2a86 48ce 3d02 0106 082a 8648 ce3d 0301&#039;&#039;&#039;  *.H.=....*.H.=..&lt;br /&gt;
         0x0060:  &#039;&#039;&#039;0703 4200 0476 5de7 77ed 2802 2ad0 d02a&#039;&#039;&#039;  ..B..v].w.(.*..*&lt;br /&gt;
         0x0070:  &#039;&#039;&#039;2d63 98df 7ad2 454f dea9 043f 7a50 4a5e&#039;&#039;&#039;  -c..z.EO...?zPJ^&lt;br /&gt;
         0x0080:  &#039;&#039;&#039;1e33 1bf8 6fe9 8f06 f5b7 89b1 1b8b d1d9&#039;&#039;&#039;  .3..o...........&lt;br /&gt;
         0x0090:  &#039;&#039;&#039;0084 c0e4 df5e 5833 19ab ab0f db54 8882&#039;&#039;&#039;  .....^X3.....T..&lt;br /&gt;
         0x00a0:  &#039;&#039;&#039;1b7a 7cb8 ee&#039;&#039;&#039;                             .z|..&lt;br /&gt;
&lt;br /&gt;
The QoS now specified the cypher strength as 0100 (256). The value doesn&#039;t matter at the moment, when it&#039;s non-zero it enables encryption. We will revise this option entirely. For now, it&#039;s enough for demoing the concept of encrypted flows.&lt;br /&gt;
&lt;br /&gt;
With encryption enabled, not only the destination hash is sent, but also a source (ephemeral) public key (3059 30.. 7cb8 ee) is attached to the flow allocation request to perform a Diffie-Hellman exchange. The destination uses the source public key (and its own private key) to generate a shared secret and then hashes this secret (SHA3-256) to derive a unique 256-bit symmetric encryption key (AES-256).&lt;br /&gt;
&lt;br /&gt;
The oping server then sends the response, with its own (ephemeral) public key (3059 30.. 45e9 ad):&lt;br /&gt;
&lt;br /&gt;
 09:57:20.060233 d8:3a:dd:39:0a:b5 (oui Unknown) &amp;gt; c8:cb:9e:d0:04:08 (oui Unknown), ethertype Unknown (0xa000), length 147: &lt;br /&gt;
         0x0000:  0000 0081 0041 0040 0000 0000 0000 0000  .....A.@........&lt;br /&gt;
         0x0010:  0000 0000 0000 0000 0000 0000 0000 0000  ................&lt;br /&gt;
         0x0020:  0000 0000 0000 0001 0000 &#039;&#039;&#039;3059 3013 0607&#039;&#039;&#039;  ..........0Y0...&lt;br /&gt;
         0x0030:  &#039;&#039;&#039;2a86 48ce 3d02 0106 082a 8648 ce3d 0301&#039;&#039;&#039;  *.H.=....*.H.=..&lt;br /&gt;
         0x0040:  &#039;&#039;&#039;0703 4200 045b b39c 9f17 ce44 005a e2cb&#039;&#039;&#039;  ..B..[.....D.Z..&lt;br /&gt;
         0x0050:  &#039;&#039;&#039;d2c9 5207 8cad 2aa5 37fc 727b 71de 77e6&#039;&#039;&#039;  ..R...*.7.r{q.w.&lt;br /&gt;
         0x0060:  &#039;&#039;&#039;e0e3 2164 b619 a8a3 94c3 d6de ce4b dda8&#039;&#039;&#039;  ..!d.........K..&lt;br /&gt;
         0x0070:  &#039;&#039;&#039;d31e b218 5a59 24c9 685f 0943 55f5 128a&#039;&#039;&#039;  ....ZY$.h_.CU...&lt;br /&gt;
         0x0080:  &#039;&#039;&#039;0eba 46e9 ad&#039;&#039;&#039;                             ..F..&lt;br /&gt;
&lt;br /&gt;
The client can now use the server&#039;s public key and its own private key to derive the same shared secret.&lt;br /&gt;
&lt;br /&gt;
The source ping is then sent encrypted over the Ethernet network. The destination EID is 0041 (= 65). I was quick and the previous flow on the server had not timed out yet. It will be more common to have the same EID as before (0040, 64) if you follow this tutorial for the first time. Everything after the EID is encrypted. The packet length is now 114 bytes instead of 82 for the non-encrypted case (payload length is 0060 = 96 bytes). This is because we add a 128-bit (32 byte) random Initialization Vector (IV) to each packet to prevent the same data plaintext to always result in the same cypher text.&lt;br /&gt;
&lt;br /&gt;
 09:57:21.075534 c8:cb:9e:d0:04:08 (oui Unknown) &amp;gt; d8:3a:dd:39:0a:b5 (oui Unknown), ethertype Unknown (0xa000), length 114: &lt;br /&gt;
         0x0000:  0041 0060 c180 1f26 71d1 3911 3e7c 0d29  .A.`...&amp;amp;q.9.&amp;gt;|.)&lt;br /&gt;
         0x0010:  7287 17c8 708a cc5b bc77 9b8e af55 7594  r...p..[.w...Uu.&lt;br /&gt;
         0x0020:  5efb 00a8 aa8d 1749 440f 6c68 6d27 cd33  ^......ID.lhm&#039;.3&lt;br /&gt;
         0x0030:  630a c34b a500 ea78 7d4e 1fd2 47d1 f5ab  c..K...x}N..G...&lt;br /&gt;
         0x0040:  2e17 5dc0 581a bee8 efbf dea4 fe41 2c12  ..].X........A,.&lt;br /&gt;
         0x0050:  37f1 9704 d2da a94c 0e8a 0a00 2844 4ea2  7......L....(DN.&lt;br /&gt;
         0x0060:  b177 58b1                                .wX.&lt;br /&gt;
&lt;br /&gt;
 09:57:21.076497 d8:3a:dd:39:0a:b5 (oui Unknown) &amp;gt; c8:cb:9e:d0:04:08 (oui Unknown), ethertype Unknown (0xa000), length 114: &lt;br /&gt;
         0x0000:  0040 0060 8708 787f cf81 c7aa a006 4195  .@.`..x.......A.&lt;br /&gt;
         0x0010:  64d8 d977 24bc bc38 cb16 138f 181e 78cd  d..w$..8......x.&lt;br /&gt;
         0x0020:  3877 c8de fed1 f0a1 902f aee6 245b a291  8w......./..$[..&lt;br /&gt;
         0x0030:  5c7f 5e35 0f85 858b 0fb0 c55c 60e5 c38a  \.^5.......\`...&lt;br /&gt;
         0x0040:  06ac 2c11 e582 7de2 5371 32fc b58a 6c83  ..,...}.Sq2...l.&lt;br /&gt;
         0x0050:  129d dc90 c4c8 ab5a a3e7 efd2 e8de 6ffb  .......Z......o.&lt;br /&gt;
         0x0060:  7932 7439&lt;br /&gt;
&lt;br /&gt;
This was a brief tutorial demoing encrypted flows. The implementation is still rudimentary at this point, and support for other encryption methods (galois counter mode for reliable encrypted flows) and authenticated flows are on the roadmap.&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
	<entry>
		<id>https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Tutorial_03&amp;diff=1406</id>
		<title>Ouroboros Tutorial 03</title>
		<link rel="alternate" type="text/html" href="https://ouroboros.rocks/mediawiki/index.php?title=Ouroboros_Tutorial_03&amp;diff=1406"/>
		<updated>2023-11-30T12:59:23Z</updated>

		<summary type="html">&lt;p&gt;Thijs: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File: O7s_tutorial03-01.png|border|right|thumb|frame|Ouroboros Tutorial 03]]&lt;br /&gt;
&lt;br /&gt;
Ouroboros can be configured using a config file in TOML format (requires [https://github.com/cktan/tomlc99 libtomlc99] to be installed when building the prototype).&lt;br /&gt;
&lt;br /&gt;
Copy/paste the text below and store it as a file, we named it &#039;&#039;tut03.conf&#039;&#039; and saved it in /etc/ouroboros/, which is the default used for O7s configurations. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=toml&amp;gt;&lt;br /&gt;
###  Ouroboros configuration file Tutorial 03&lt;br /&gt;
[name.oping-server]&lt;br /&gt;
prog=[&amp;quot;/usr/bin/oping&amp;quot;]&lt;br /&gt;
args=[&amp;quot;--listen&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[local.local-ipcp]&lt;br /&gt;
bootstrap=&amp;quot;local-layer&amp;quot; &lt;br /&gt;
reg=[&amp;quot;uni-1&amp;quot;, &amp;quot;uni-2&amp;quot;, &amp;quot;unicast-layer&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[unicast.uni-1]&lt;br /&gt;
bootstrap=&amp;quot;unicast-layer&amp;quot;&lt;br /&gt;
autobind=true&lt;br /&gt;
reg=[&amp;quot;oping-server&amp;quot;]&lt;br /&gt;
&lt;br /&gt;
[unicast.uni-2]&lt;br /&gt;
enrol=&amp;quot;unicast-layer&amp;quot;&lt;br /&gt;
conn=[&amp;quot;uni-1&amp;quot;]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The configuration file is in TOML format (we may add support for other formats in the future). This demo will create a local Layer and then a 2-node unicast Layer on top, just like in [[Ouroboros Tutorial 02 | Tutorial 02]] to support the &#039;&#039;oping&#039;&#039; application.&lt;br /&gt;
&lt;br /&gt;
It has 4 stanza:&lt;br /&gt;
# &#039;&#039;name.oping-server&#039;&#039;: This creates a service name, in this case the name is &#039;&#039;oping-server&#039;&#039;. Note that if we wanted to name the service &#039;&#039;oping.server&#039;&#039; it would need quotes like this &#039;&#039;[name.&amp;quot;oping.server&amp;quot;]&#039;&#039;. That name will be served by all instances of the &#039;&#039;oping&#039;&#039; binary (located at /usr/bin/oping). We specify the &#039;&#039;args&#039;&#039; option to start oping automatically (see below).&lt;br /&gt;
# &#039;&#039;local.local-ipcp&#039;&#039;: The IRMd will start a local IPCP called &#039;&#039;local-ipcp&#039;&#039;. We also specify a bootstrap option to start a new Layer called &#039;&#039;local-layer&#039;&#039;. We will be running 2 unicast IPCPs on top, named uni-1 and uni-2. Both of these will also listen to the &#039;&#039;anycast&#039;&#039; name &#039;&#039;unicast-layer&#039;&#039;.&lt;br /&gt;
# &#039;&#039;unicast.uni-1&#039;&#039;:  The IRMd will start a unicast IPCP called &#039;&#039;uni-1&#039;&#039;. We also specify it will bootstrap a new network Layer called &#039;&#039;unicast-layer&#039;&#039;. The autobind option will bind it to both the IPCP name (&amp;quot;uni-1&amp;quot;) as the anycast layer name (&amp;quot;unicast-layer&amp;quot;). We register the oping server application on this node.&lt;br /&gt;
# &#039;&#039;unicast.uni-2&#039;&#039;:  The IRMd will start a unicast IPCP called &#039;&#039;uni-1&#039;&#039;. This IPCP will not bootstrap, but enroll in the &#039;&#039;unicast-layer&#039;&#039; and then connect (creating both management and data transfer flow) to create a forwarding adjacency with &amp;quot;uni-1&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Instead of logging to standard output, we will use the system log, which is Ouroboros&#039; default. Use your preferred way to view the system log. We use journalctl&lt;br /&gt;
&lt;br /&gt;
 $ sudo journalctl --identifier=irmd --follow            #short form: sudo journalctl -t irmd -f&lt;br /&gt;
&lt;br /&gt;
In a different window, start the irmd using the config file and without the &#039;&#039;--stdout&#039;&#039; option:&lt;br /&gt;
&lt;br /&gt;
 $ sudo irmd --config /etc/ouroboros/tut03.conf&lt;br /&gt;
&lt;br /&gt;
This will load the configuration and will set up the same network that we created in [[Ouroboros Tutorial 02 | the second tutorial]].&lt;br /&gt;
&lt;br /&gt;
Now, we will ping an oping server from the client over that unicast-layer. In the previous two tutorials, we first started the server, but O7s can start a server automatically. This is the &#039;&#039;auto&#039;&#039; feature of the &#039;&#039;irm bind program&#039;&#039; CLI tool. In the configuration file, this feature is enabled by specifying an &#039;&#039;args&#039;&#039; line for a service name. In our configuration example, we defined that the service name &#039;&#039;oping-server&#039;&#039; is bound to program &#039;&#039;/usr/bin/oping&#039;&#039; and can be automatically started if needed with the argument &#039;&#039;--listen&#039;&#039; (the short form is -l).&lt;br /&gt;
&lt;br /&gt;
Just start a client towards oping-server:&lt;br /&gt;
&lt;br /&gt;
 $ oping -n oping-server -c 10&lt;br /&gt;
 Pinging oping-server with 64 bytes of data (10 packets):&lt;br /&gt;
 &lt;br /&gt;
 64 bytes from oping-server: seq=0 time=1.223 ms&lt;br /&gt;
 64 bytes from oping-server: seq=1 time=0.885 ms&lt;br /&gt;
 64 bytes from oping-server: seq=2 time=0.988 ms&lt;br /&gt;
 &amp;lt;snip&amp;gt;&lt;br /&gt;
 64 bytes from oping-server: seq=9 time=0.819 ms&lt;br /&gt;
 &lt;br /&gt;
 --- oping-server ping statistics ---&lt;br /&gt;
 10 packets transmitted, 10 received, 0 out-of-order, 0% packet loss,  time: 10003.173 ms&lt;br /&gt;
 rtt min/avg/max/mdev = 0.705/0.877/1.223/0.144 ms&lt;br /&gt;
&lt;br /&gt;
The window where we started the IRMd will log the server output:&lt;br /&gt;
&lt;br /&gt;
 Ouroboros ping server started.&lt;br /&gt;
 New flow 64.&lt;br /&gt;
 Received 64 bytes on fd 64.&lt;br /&gt;
 Received 64 bytes on fd 64.&lt;br /&gt;
 &amp;lt;snip&amp;gt;&lt;br /&gt;
 Received 64 bytes on fd 64.&lt;br /&gt;
 Flow 64 timed out.&lt;br /&gt;
&lt;br /&gt;
When the IRMd auto-instantiates a program, it will log this event as:&lt;br /&gt;
&lt;br /&gt;
 Nov 05 17:58:38 phonetria irmd[3820]: Flow request arrived for oping-server.&lt;br /&gt;
 Nov 05 17:58:38 phonetria irmd[3820]: Instantiated /usr/bin/oping as process 3961.&lt;br /&gt;
 Nov 05 17:58:38 phonetria irmd[3820]: Process 3961 inherits name oping-server from program oping.&lt;/div&gt;</summary>
		<author><name>Thijs</name></author>
	</entry>
</feed>