++ doc update ++ nat64_static / P4 begin
This commit is contained in:
parent
81bf368279
commit
472a104e2b
3 changed files with 586 additions and 30 deletions
|
|
@ -46,7 +46,7 @@ class CpuHeader(Packet):
|
|||
class L2Controller(object):
|
||||
def __init__(self, sw_name):
|
||||
# Command line mapping
|
||||
self.modes = ['base', 'router']
|
||||
self.modes = ['base', 'router', "range_router" ]
|
||||
|
||||
# Reverse maps the cpu header
|
||||
self.task = dict(reversed(item) for item in cpu_fields.items())
|
||||
|
|
@ -62,6 +62,7 @@ class L2Controller(object):
|
|||
self.info['v4_mask'] = 24
|
||||
self.info['v4_base'] = ipaddress.ip_network("10.0.0.0/8")
|
||||
self.info['v4_gen'] = self.info['v4_base'].subnets(new_prefix=self.info['v4_mask'])
|
||||
self.info['v4_nat64_map'] = ipaddress.ip_network("10.1.0.0/16")
|
||||
|
||||
self.info['switch_suffix'] = 0x42
|
||||
self.info['nat64_nat_prefix'] = ipaddress.ip_network("64:ff9b::/96")
|
||||
|
|
@ -78,6 +79,7 @@ class L2Controller(object):
|
|||
)
|
||||
|
||||
self.v6_routes['router'] = self.v6_routes['base']
|
||||
self.v6_routes['range_router'] = self.v6_routes['base']
|
||||
|
||||
self.v4_routes = {}
|
||||
self.v4_routes[None] = []
|
||||
|
|
@ -89,16 +91,34 @@ class L2Controller(object):
|
|||
"port": port}
|
||||
)
|
||||
self.v4_routes['router'] = self.v4_routes['base']
|
||||
self.v4_routes['range_router'] = self.v4_routes['base']
|
||||
|
||||
self.v6_addresses = {}
|
||||
self.v6_addresses[None] = []
|
||||
self.v6_addresses['base'] = []
|
||||
self.v6_addresses['router'] = [ net['net'][self.info['switch_suffix']] for net in self.v6_routes['router'] ]
|
||||
for mode in self.modes:
|
||||
self.v6_addresses[mode] = [ net['net'][self.info['switch_suffix']] for net in self.v6_routes[mode] ]
|
||||
|
||||
self.v4_addresses = {}
|
||||
self.v4_addresses[None] = []
|
||||
self.v4_addresses['base'] = []
|
||||
self.v4_addresses['router'] = [ net['net'][self.info['switch_suffix']] for net in self.v4_routes['router'] ]
|
||||
for mode in self.modes:
|
||||
self.v4_addresses[mode] = [ net['net'][self.info['switch_suffix']] for net in self.v4_routes[mode] ]
|
||||
|
||||
self.nat64_map = {}
|
||||
# init default
|
||||
for mode in self.modes:
|
||||
self.nat64_map[mode] = []
|
||||
|
||||
# specific settings
|
||||
for mode in ["range_router"]:
|
||||
for net in self.v6_routes[mode]:
|
||||
v6_net = net
|
||||
v4_net = self.info['v6_nat64_map'].next()
|
||||
|
||||
self.nat64_map[mode].append({
|
||||
"v6_network": v6_net,
|
||||
"v4_network": v4_net,
|
||||
"v6_nat64_prefix": self.info['nat64_nat_prefix']
|
||||
})
|
||||
|
||||
self.init_boilerplate(sw_name)
|
||||
|
||||
|
|
@ -189,6 +209,22 @@ class L2Controller(object):
|
|||
self.controller.table_add("v6_addresses", "controller_reply", [str(another_addr_ns)], [str(self.task['ICMP6_NS'])])
|
||||
self.controller.table_add("v6_addresses", "icmp6_echo_reply", [str(another_addr)])
|
||||
|
||||
for nat64map in self.nat64_map[self.mode]:
|
||||
self.static_nat64_mapping(**nat64map)
|
||||
|
||||
|
||||
def static_nat64_mapping(self, v6_nat64_prefix, v6_network, v4_network):
|
||||
nat64_prefix = str(v6_nat64_prefix)
|
||||
net_ipv6 = str(v6_network)
|
||||
net_ipv4 = str(v4_network)
|
||||
|
||||
|
||||
log.info("NAT64 map: {} -> {} -> {}".format(v6_nat64_prefix, v6_network, v4_network))
|
||||
|
||||
self.controller.table_add("v6_networks", "nat64_static", nat64_prefix, [net_ipv6], [net_ipv4])
|
||||
self.controller.table_add("v4_networks", "nat46_static", [net_ipv4], [net_ipv6])
|
||||
|
||||
|
||||
def config_hosts(self):
|
||||
""" Assumptions:
|
||||
- all routes are networks (no /128 v6 or /32 v4
|
||||
|
|
@ -204,9 +240,18 @@ class L2Controller(object):
|
|||
|
||||
self.config_v6_host(host, str(net), str(ipaddr), dev, router)
|
||||
|
||||
for v4route in self.v4_routes[self.mode]:
|
||||
host = "h{}".format(v4route['port'])
|
||||
dev = "{}-eth0".format(host)
|
||||
net = v4route['net']
|
||||
ipaddr = "{}/{}".format(net[1],net.prefixlen)
|
||||
router = str(net[self.info['switch_suffix']])
|
||||
|
||||
self.config_v4_host(host, str(net), str(ipaddr), dev, router)
|
||||
|
||||
@staticmethod
|
||||
def config_v6_host(host, net, ipaddr, dev, router=None):
|
||||
log.debug("Config host: {} {}->{} on {}".format(host, net, ipaddr, dev))
|
||||
log.debug("Config v6 host: {} {}->{} on {}".format(host, net, ipaddr, dev))
|
||||
|
||||
subprocess.call(["mx", host, "ip", "addr", "flush", "dev", dev])
|
||||
for v6dev in [ "lo", "default", "all", dev ]:
|
||||
|
|
@ -216,10 +261,18 @@ class L2Controller(object):
|
|||
subprocess.call(["mx", host, "ip", "link", "set", dev, "down"])
|
||||
subprocess.call(["mx", host, "ip", "link", "set", dev, "up"])
|
||||
|
||||
# Now add global address
|
||||
subprocess.call(["mx", host, "ip", "addr", "add", ipaddr, "dev", dev])
|
||||
|
||||
# add default gw if in router mode
|
||||
if router:
|
||||
subprocess.call(["mx", host, "ip", "route", "add", "default", "via", router])
|
||||
|
||||
@staticmethod
|
||||
def config_v4_host(host, net, ipaddr, dev, router=None):
|
||||
log.debug("Config v4 host: {} {}->{} on {}".format(host, net, ipaddr, dev))
|
||||
|
||||
subprocess.call(["mx", host, "ip", "addr", "flush", "dev", dev])
|
||||
subprocess.call(["mx", host, "ip", "addr", "add", ipaddr, "dev", dev])
|
||||
|
||||
if router:
|
||||
subprocess.call(["mx", host, "ip", "route", "add", "default", "via", router])
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue