|
|
|
@ -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() |
|
|
|
|