From 385a03bd6e95483b1a8142b1d6f417eb4878239f Mon Sep 17 00:00:00 2001
From: Mike Marsh <mmarsh@cs.umd.edu>
Date: Sat, 10 Feb 2018 15:15:21 -0500
Subject: [PATCH] we have a star network!

This seemed to require less futzing than it did previously...
---
 start_testbed.py | 30 ++++++++++++++++++++----------
 stop_testbed.py  |  2 ++
 2 files changed, 22 insertions(+), 10 deletions(-)

diff --git a/start_testbed.py b/start_testbed.py
index f865374..7da3086 100755
--- a/start_testbed.py
+++ b/start_testbed.py
@@ -23,6 +23,7 @@ base_addr = reduce(
     lambda a,b : a*256+b,
     [ int(q) for q in ntwk['subnet_addr'].split('.') ]
    )
+subnet = ntwk['subnet_addr']+'/'+str(ntwk['subnet_len'])
 
 nodelist = list()
 
@@ -33,6 +34,14 @@ def make_ip(i):
     masks = [ 24, 16, 8, 0 ]
     return '.'.join([ str((addr>>mask)&0xFF) for mask in masks ])
     
+def make_route(f,net,fdev):
+    subprocess.call([
+        'sudo', 'ip', 'netns', 'exec', f['name'],
+        'ip', 'route', 'add', net,
+        'dev', fdev, 'proto', 'static', 'scope', 'global',
+        'src', f['addr']
+       ])
+
 def connect_nodes(node1, node2):
     ctr1 = nodelist[node1]
     ctr2 = nodelist[node2]
@@ -73,13 +82,7 @@ def connect_nodes(node1, node2):
 
     # Set initial routes.
     def route_from_to(f,t,fdev):
-        # $ctx ip route add $net dev $dev proto static scope global src $addr
-        subprocess.call([
-            'sudo', 'ip', 'netns', 'exec', f['name'],
-            'ip', 'route', 'add', t['addr']+'/32',
-            'dev', fdev, 'proto', 'static', 'scope', 'global',
-            'src', f['addr']
-           ])
+        make_route(f,t['addr']+'/32',fdev)
     route_from_to(ctr1,ctr2,dev_1)
     route_from_to(ctr2,ctr1,dev_2)
 
@@ -92,7 +95,12 @@ def make_mesh():
         for n2 in range(n1+1,num_nodes) ]
 
 def make_star():
-    pass
+    global nodelist
+    def get_dev(i):
+        return 'bac0_{i}_0'.format(i=i)
+    num_nodes = len(nodelist)
+    [ connect_nodes(0,n) for n in range(1,num_nodes) ]
+    [ make_route(n,subnet,get_dev(n)) for n in range(1,num_nodes) ]
 
 def start_node(base_name,i):
     global nodelist
@@ -137,6 +145,8 @@ def start_node(base_name,i):
 for n in range(ntwk['num_nodes']):
     start_node(ntwk['name'],n)
 
-# XXX - need to check if we're a star or mesh network, and call the appropriate function
-make_mesh()
+if ntwk['topology'] == 'mesh':
+    make_mesh()
+else:
+    make_star()
 
diff --git a/stop_testbed.py b/stop_testbed.py
index 2d3556d..a9fc2ac 100755
--- a/stop_testbed.py
+++ b/stop_testbed.py
@@ -26,6 +26,8 @@ def stop_node(name,i):
     retval = subprocess.call(command)
     command = ['docker', 'rm', ctr_name ]
     retval = subprocess.call(command)
+    command = ['sudo', 'rm', '/var/run/netns/'+ctr_name]
+    retval = subprocess.call(command)
 
 for i in range(ntwk['num_nodes']):
     stop_node(ntwk['name'],i)
-- 
GitLab