Rumba
A Python framework enabling large scale
experimentation with the Recursive InterNetwork
Architecture (RINA)
X Y
C2 C1
A1 A2 B1 B2
E1 E2
X Y
C2 C1
A1 A2 B1 B2
E1 E2
Normal IPC Process
(IPCP)
D1
X Y
C2 C1
A1 A2 B1 B2
E1 E2
Provides IPC to higher layers (DIFs/DAFs)
Uses IPC from lower layers (DIFs)
Normal IPC Process
(IPCP)
D1
X Y
A1 A2 B1 B2
C2 C1 E1 E2D1
IPCP D1 registers in 2 DIFs (A, B)
D1/A2 D1/B1
X Y
A1 A2 B1 B2
C2 C1 E1 E2D1D2
D1/A2
D2/A1
D1/B1
Create IPCP D2, can register in DIF A (optional)
X Y
A1 A2 B1 B2
C2 C1 E1 E2D1D2
IPCP D2 allocates a flow with D1
D2 can now send messages to D1
D1/A2
D2/A1
D1/B1
X Y
A1 A2 B1 B2
C2 C1 E1 E2D1D2
A new operation: enrollment: “joining a DIF”
authentication
exchanging some basic information
configuration parameters
addresses
current equivalent: joining a wifi network
D1D2
D1/A2
D2/A1
D1/B1
X Y
A1 A2 B1 B2
C2 C1 E1 E2
D3 performs the same procedures. DIF “D” now has 3 members
D1 D3D2
D1/A2
D2/A1
D1/B1
X Y
A1 A2 B1 B2
C2 C1 E1 E2
F1 F2F3 F4
D1 D3D2
Rumba core
jFed plugin
Emulab plugin
QEMU VMs
plugin
IRATI plugin
rlite plugin
Ouroboros
plugin
User program
Node A Node B
DIF e1
DIF n1
rinaperf
client
rinaperf
server
#!/usr/bin/env python
# An example script using the rumba package
from rumba.model import *
# import testbed plugins
import rumba.testbeds.emulab as emulab
import rumba.testbeds.jfed as jfed
import rumba.testbeds.qemu as qemu
# import prototype plugins
import rumba.prototypes.ouroboros as our
import rumba.prototypes.rlite as rl
import rumba.prototypes.irati as irati
import rumba.log as log
log.set_logging_level('DEBUG')
n1 = NormalDIF("n1")
n1.add_policy("rmt.pff", "lfa")
n1.add_policy("security-manager", "passwd")
e1 = ShimEthDIF("e1")
a = Node("A",
difs = [n1, e1],
dif_registrations = {n1 : [e1]})
b = Node("B",
difs = [e1, n1],
dif_registrations = {n1 : [e1]},
client = True)
tb = jfed.Testbed(exp_name = "example1",
username = "user1",
cert_file = "/home/user1/cert.pem")
exp = rl.Experiment(tb, nodes = [a, b])
print(exp)
try:
exp.swap_in()
exp.bootstrap_prototype()
c1 = Client("rinaperf",
options ="-t perf -s 1000 -c 10000")
s1 = Server("rinaperf", arrival_rate=2,
mean_duration=5,
options = "-l",
nodes = [a],
clients = [c1])
sb = StoryBoard(exp, 3600, servers = [s1])
sb.start()
finally:
exp.swap_out()
C2 C1 E1 E2
F1 F2F3 F4
D1 D3D2
A1 A2 B1 B2
IPCPs for node a: [{IPCP=c2,DIF=c,N-1-DIFs=(),bootstrapper}, {IPCP=f3,DIF=f,N-1-DIFs=(c),bootstrapper}]
IPCPs for node b: [{IPCP=c1,DIF=c,N-1-DIFs=(),bootstrapper}, {IPCP=a1,DIF=a,N-1-DIFs=(),bootstrapper},
{IPCP=d2,DIF=d,N-1-DIFs=(a),bootstrapper}, {IPCP=f1,DIF=f,N-1-DIFs=(c d)}]
IPCPs for node c: [{IPCP=b1,DIF=b,N-1-DIFs=(),bootstrapper}, {IPCP=a2,DIF=a,N-1-DIFs=(),bootstrapper}, {IPCP=d1,DIF=d,N-1-DIFs=(a b)}]
IPCPs for node d: [{IPCP=b2,DIF=b,N-1-DIFs=(),bootstrapper}, {IPCP=e1,DIF=e,N-1-DIFs=(),bootstrapper}, {IPCP=d3,DIF=d,N-1-DIFs=(b)},
{IPCP=f2,DIF=f,N-1-DIFs=(e d)}]
IPCPs for node e: [{IPCP=e2,DIF=e,N-1-DIFs=(),bootstrapper}, {IPCP=f4,DIF=f,N-1-DIFs=(e),bootstrapper}]
Node a Node b Node c Node d Node e
Client Server
Client
Client
Client
Server
Server
Server
Node DNode A Node B
DIF e1
Node C
DIF e2
DIF n1
DIF e3
DIF n2
Sander Vrijders (sander.vrijders@ugent.be)
Vincenzo Maffione (v.maffione@nextworks.it)
Marco Capitani (m.capitani@nextworks.it)
Dimitri Staessens (dimitri.staessens@ugent.be)

5. Rumba presentation

  • 1.
    Rumba A Python frameworkenabling large scale experimentation with the Recursive InterNetwork Architecture (RINA)
  • 2.
    X Y C2 C1 A1A2 B1 B2 E1 E2
  • 3.
    X Y C2 C1 A1A2 B1 B2 E1 E2 Normal IPC Process (IPCP) D1
  • 4.
    X Y C2 C1 A1A2 B1 B2 E1 E2 Provides IPC to higher layers (DIFs/DAFs) Uses IPC from lower layers (DIFs) Normal IPC Process (IPCP) D1
  • 5.
    X Y A1 A2B1 B2 C2 C1 E1 E2D1 IPCP D1 registers in 2 DIFs (A, B) D1/A2 D1/B1
  • 6.
    X Y A1 A2B1 B2 C2 C1 E1 E2D1D2 D1/A2 D2/A1 D1/B1 Create IPCP D2, can register in DIF A (optional)
  • 7.
    X Y A1 A2B1 B2 C2 C1 E1 E2D1D2 IPCP D2 allocates a flow with D1 D2 can now send messages to D1 D1/A2 D2/A1 D1/B1
  • 8.
    X Y A1 A2B1 B2 C2 C1 E1 E2D1D2 A new operation: enrollment: “joining a DIF” authentication exchanging some basic information configuration parameters addresses current equivalent: joining a wifi network D1D2 D1/A2 D2/A1 D1/B1
  • 9.
    X Y A1 A2B1 B2 C2 C1 E1 E2 D3 performs the same procedures. DIF “D” now has 3 members D1 D3D2 D1/A2 D2/A1 D1/B1
  • 10.
    X Y A1 A2B1 B2 C2 C1 E1 E2 F1 F2F3 F4 D1 D3D2
  • 12.
    Rumba core jFed plugin Emulabplugin QEMU VMs plugin IRATI plugin rlite plugin Ouroboros plugin User program
  • 14.
    Node A NodeB DIF e1 DIF n1 rinaperf client rinaperf server
  • 15.
    #!/usr/bin/env python # Anexample script using the rumba package from rumba.model import * # import testbed plugins import rumba.testbeds.emulab as emulab import rumba.testbeds.jfed as jfed import rumba.testbeds.qemu as qemu # import prototype plugins import rumba.prototypes.ouroboros as our import rumba.prototypes.rlite as rl import rumba.prototypes.irati as irati import rumba.log as log log.set_logging_level('DEBUG') n1 = NormalDIF("n1") n1.add_policy("rmt.pff", "lfa") n1.add_policy("security-manager", "passwd") e1 = ShimEthDIF("e1") a = Node("A", difs = [n1, e1], dif_registrations = {n1 : [e1]}) b = Node("B", difs = [e1, n1], dif_registrations = {n1 : [e1]}, client = True) tb = jfed.Testbed(exp_name = "example1", username = "user1", cert_file = "/home/user1/cert.pem") exp = rl.Experiment(tb, nodes = [a, b]) print(exp) try: exp.swap_in() exp.bootstrap_prototype() c1 = Client("rinaperf", options ="-t perf -s 1000 -c 10000") s1 = Server("rinaperf", arrival_rate=2, mean_duration=5, options = "-l", nodes = [a], clients = [c1]) sb = StoryBoard(exp, 3600, servers = [s1]) sb.start() finally: exp.swap_out()
  • 16.
    C2 C1 E1E2 F1 F2F3 F4 D1 D3D2 A1 A2 B1 B2 IPCPs for node a: [{IPCP=c2,DIF=c,N-1-DIFs=(),bootstrapper}, {IPCP=f3,DIF=f,N-1-DIFs=(c),bootstrapper}] IPCPs for node b: [{IPCP=c1,DIF=c,N-1-DIFs=(),bootstrapper}, {IPCP=a1,DIF=a,N-1-DIFs=(),bootstrapper}, {IPCP=d2,DIF=d,N-1-DIFs=(a),bootstrapper}, {IPCP=f1,DIF=f,N-1-DIFs=(c d)}] IPCPs for node c: [{IPCP=b1,DIF=b,N-1-DIFs=(),bootstrapper}, {IPCP=a2,DIF=a,N-1-DIFs=(),bootstrapper}, {IPCP=d1,DIF=d,N-1-DIFs=(a b)}] IPCPs for node d: [{IPCP=b2,DIF=b,N-1-DIFs=(),bootstrapper}, {IPCP=e1,DIF=e,N-1-DIFs=(),bootstrapper}, {IPCP=d3,DIF=d,N-1-DIFs=(b)}, {IPCP=f2,DIF=f,N-1-DIFs=(e d)}] IPCPs for node e: [{IPCP=e2,DIF=e,N-1-DIFs=(),bootstrapper}, {IPCP=f4,DIF=f,N-1-DIFs=(e),bootstrapper}] Node a Node b Node c Node d Node e
  • 17.
  • 20.
    Node DNode ANode B DIF e1 Node C DIF e2 DIF n1 DIF e3 DIF n2
  • 21.
    Sander Vrijders (sander.vrijders@ugent.be) VincenzoMaffione (v.maffione@nextworks.it) Marco Capitani (m.capitani@nextworks.it) Dimitri Staessens (dimitri.staessens@ugent.be)