---
date: 2020-02-16
title: "Equal-Cost Multipath (ECMP) routing"
linkTitle: "Equal-Cost multipath (ECMP) example"
description: "A very quick example of ECMP"
author: Dimitri Staessens
---

As promised, I added equal cost multipath routing to the Ouroboros
unicast IPCP. I will add some more explanations later when it's fully
tested and merge into the master branch, but you can already try it.
You will need to pull the _be_ branch. You will also need to have
_fuse_ installed to monitor the flows from _/tmp/ouroboros/_. The
following script will bootstrap a 4-node unicast network on your
machine that routes using ECMP:

```bash
#!/bin/bash

# create a local IPCP. This emulates the "Internet"
irm i b t local n local l local

#create the first unicast IPCP with ecmp
irm i b t unicast n uni.a l net routing ecmp

#bind the unicast IPCP to the names net and uni.a
irm b i uni.a n net
irm b i uni.a n uni.a

#register these 2 names in the local IPCP
irm n r net l local
irm n r uni.a l local

#create 3 more unicast IPCPs, and enroll them with the first
irm i e t unicast n uni.b l net
irm b i uni.b n net
irm b i uni.b n uni.b
irm n r uni.b l local

irm i e t unicast n uni.c l net
irm b i uni.c n net
irm b i uni.c n uni.c
irm n r uni.c l local

irm i e t unicast n uni.d l net
irm b i uni.d n net
irm b i uni.d n uni.d
irm n r uni.d l local

#connect uni.b to uni.a this creates a DT flow and a mgmt flow
irm i conn name uni.b dst uni.a

#now do the same for the others, creating a square
irm i conn name uni.c dst uni.b
irm i conn name uni.d dst uni.c
irm i conn name uni.d dst uni.a

#register the oping application at 4 different locations
#this allows us to check the multipath implementation
irm n r oping.a i uni.a
irm n r oping.b i uni.b
irm n r oping.c i uni.c
irm n r oping.d i uni.d

#bind oping program to oping names
irm b prog oping n oping.a
irm b prog oping n oping.b
irm b prog oping n oping.c
irm b prog oping n oping.d

#good to go!
```

In order to test the setup, start an irmd (preferably in a terminal so
you can see what's going on). In another terminal, run the above
script and then start an oping server:

```bash
$ ./ecmpscript
$ oping -l
Ouroboros ping server started.
```

This single server program will accept all flows for oping from any of
the unicast IPCPs. Ouroboros _multi-homing_ in action.

Open another terminal, and type the following command:

```bash
$ watch -n 1 'grep "sent (packets)" /tmp/ouroboros/uni.a/dt.*/6* | sed -n -e 1p -e 7p'
```

This will show you the packet statistics from the 2 data transfer
flows from the first IPCP (uni.a).

On my machine it looks like this:

```
Every 1,0s: grep "sent (packets)" /tmp/ouroboros/uni.a/dt.*/6* | sed -n -e 1p -e 7p

/tmp/ouroboros/uni.a/dt.1896199821/65: sent (packets):                            10
/tmp/ouroboros/uni.a/dt.1896199821/67: sent (packets):                             6
```

Now, from yet another terminal, run connect an oping client to oping.c
(the client should attach to the first IPCP, so oping.c should be the
one with 2 equal cost paths) and watch both counters increase:

```bash
oping -n oping.c -i 100ms
```

When you do this to the other destinations (oping.b and oping.d) you
should see only one of the flow counters increasing.

Hope you enjoyed this little demo!

Dimitri
