Begin to implement egress handling, make controller usable, update notes

This commit is contained in:
Nico Schottelius 2019-02-23 14:22:46 +01:00
commit bec7dc548e
5 changed files with 81 additions and 7 deletions

View file

@ -12,6 +12,9 @@ import sys
import re
import logging
import argparse
import ipaddress
logging.basicConfig()
log = logging.getLogger("main")
@ -20,6 +23,18 @@ class L2Controller(object):
self.init_boilerplate(sw_name)
self.init()
self.modes = ['base']
# Network / egress
self.v6_routes = {}
self.v6_routes['base'] = []
self.v6_routes['base'].append({ "net": "2001:db8:61::/64", "port": "1"})
self.v6_routes['base'].append({ "net": "2001:db8:62::/64", "port": "2"})
self.v4_routes = {}
self.v4_routes['base'] = []
self.v4_routes['base'].append({ "net": "10.0.41.0/24", "port": "3"})
self.v4_routes['base'].append({ "net": "10.0.42.0/24", "port": "4"})
def init_boilerplate(self, sw_name):
self.topo = Topology(db="topology.db")
self.sw_name = sw_name
@ -31,6 +46,7 @@ class L2Controller(object):
def init(self):
self.controller.reset_state()
self.fill_tables()
self.config_hosts()
self.add_mirror()
def add_mirror(self):
@ -38,6 +54,17 @@ class L2Controller(object):
self.controller.mirroring_add(100, self.cpu_port)
def fill_tables(self):
for v6route in self.v6_routes[self.mode]:
self.controller.table_add("v6_routing", "set_egress_port", [v6route['net']], [v6route['port']])
for v4route in self.v4_routes[self.mode]:
self.controller.table_add("v4_routing", "set_egress_port", [v4route['net']], [v4route['port']])
def config_hosts(self):
""" Assumptions:
- all routes are networks (no /128 v6 or /32 v4
- hosts get the first ip address in the network
"""
pass
def debug_print_pkg(self, pkg, msg="INCOMING"):
@ -78,6 +105,13 @@ class L2Controller(object):
def run_cpu_port_loop(self):
sniff(iface=self.intf, prn=self.recv_msg_cpu)
def commandline(self):
parser = argparse.ArgumentParser(description='controller++')
parser.add_argument('--mode', help='Select mode / settings to use', choices=self.modes)
args = parser.parse_args()
self.mode = args.mode
if __name__ == "__main__":
import sys
import os
@ -91,4 +125,7 @@ if __name__ == "__main__":
log.debug("Debug enabled.")
sw_name = "s1"
controller = L2Controller(sw_name).run_cpu_port_loop()
controller = L2Controller(sw_name)
controller.commandline()
controller.run_cpu_port_loop()