++todos; begin router mode

This commit is contained in:
Nico Schottelius 2019-02-23 18:58:04 +01:00
commit c4a4e370f0
4 changed files with 52 additions and 7 deletions

View file

@ -18,14 +18,16 @@ import subprocess
# Broken in python2
#import ipaddress
logging.basicConfig()
log = logging.getLogger("main")
class L2Controller(object):
def __init__(self, sw_name):
# Command line mapping
self.modes = ['base']
self.modes = ['base', 'router']
self.address_suffix = 42
# Network / egress
self.v6_mask = "64"
@ -35,6 +37,7 @@ class L2Controller(object):
self.v6_routes['base'] = []
self.v6_routes['base'].append({ "net": "2001:db8:61::", "port": "1"})
self.v6_routes['base'].append({ "net": "2001:db8:62::", "port": "2"})
self.v6_routes['router'] = self.v6_routes['base']
self.v4_mask = "24"
self.v4_routes = {}
@ -42,6 +45,17 @@ class L2Controller(object):
self.v4_routes['base'] = []
self.v4_routes['base'].append({ "net": "10.0.41.", "port": "3"})
self.v4_routes['base'].append({ "net": "10.0.42.", "port": "4"})
self.v4_routes['router'] = self.v4_routes['base']
self.v6_addresses = {}
self.v6_addresses[None] = []
self.v6_addresses['base'] = []
self.v6_addresses['router'] = [ { "addr": "{}{}".format(n['net'], self.address_suffix), "port": n['port'] } for n in self.v6_routes['router'] ]
self.v4_addresses = {}
self.v4_addresses[None] = []
self.v4_addresses['base'] = []
self.v4_addresses['router'] = [ { "addr": "{}{}".format(n['net'], self.address_suffix), "port": n['port'] } for n in self.v4_routes['router'] ]
self.init_boilerplate(sw_name)
@ -82,6 +96,7 @@ class L2Controller(object):
self.fill_tables()
self.config_hosts()
def fill_tables(self):
self.controller.table_clear("v6_routing")
for v6route in self.v6_routes[self.mode]:
@ -93,6 +108,12 @@ class L2Controller(object):
net = self.prefix_to_net(v4route['net'], self.v4_mask)
self.controller.table_add("v4_routing", "set_egress_port", [net], [v4route['port']])
self.controller.table_clear("v6_addresses")
for v6addr in self.v6_addresses[self.mode]:
self.controller.table_add("v6_address", "icmp6_answer", [v6addr['addr']], [v4addr['port']])
def config_hosts(self):
""" Assumptions:
- all routes are networks (no /128 v6 or /32 v4