From 92be0df475f3165ef0d82da35250c77a223f2954 Mon Sep 17 00:00:00 2001 From: Ole Troan Date: Tue, 5 Jan 2016 20:05:52 +0100 Subject: [PATCH] Clean up script to generate LW46 bindings / MAP-E rules. Change-Id: I3a3949e728f4e4875efddd4f02a55746c998a5ed Signed-off-by: Ole Troan --- vnet/vnet/map/examples/gen-rules.py | 217 ++++++------------------ vnet/vnet/map/examples/map-test.py | 214 ----------------------- vnet/vnet/map/examples/mapalgs.py | 327 ------------------------------------ vnet/vnet/map/examples/mt-test.py | 80 --------- 4 files changed, 53 insertions(+), 785 deletions(-) delete mode 100755 vnet/vnet/map/examples/map-test.py delete mode 100644 vnet/vnet/map/examples/mapalgs.py delete mode 100644 vnet/vnet/map/examples/mt-test.py diff --git a/vnet/vnet/map/examples/gen-rules.py b/vnet/vnet/map/examples/gen-rules.py index d6746f79af4..ba6dde09aa8 100755 --- a/vnet/vnet/map/examples/gen-rules.py +++ b/vnet/vnet/map/examples/gen-rules.py @@ -1,4 +1,4 @@ -#!/usr/bin/env python3.4 +#!/usr/bin/env python3 # Copyright (c) 2015 Cisco and/or its affiliates. # Licensed under the Apache License, Version 2.0 (the "License"); @@ -20,194 +20,83 @@ import sys # map add domain ip4-pfx ip6-pfx ::/0 ip6-src ea-bits-len 0 psid-offset 6 psid-len 6 # map add rule index <0> psid ip6-dst +def_ip4_pfx = '192.0.2.0/24' +def_ip6_pfx = '2001:db8::/32' +def_ip6_src = '2001:db8::1' +def_psid_offset = 6 +def_psid_len = 6 +def_ea_bits_len = 14 + + parser = argparse.ArgumentParser(description='MAP VPP configuration generator') parser.add_argument('-t', action="store", dest="mapmode") +parser.add_argument('--ip4-prefix', action="store", dest="ip4_pfx", default=def_ip4_pfx) +parser.add_argument('--ip6-prefix', action="store", dest="ip6_pfx", default=def_ip6_pfx) +parser.add_argument('--ip6-src', action="store", dest="ip6_src", default=def_ip6_src) +parser.add_argument('--psid-len', action="store", dest="psid_len", default=def_psid_len) +parser.add_argument('--psid-offset', action="store", dest="psid_offset", default=def_psid_offset) +parser.add_argument('--ea-bits-len', action="store", dest="ea_bits_len", default=def_ea_bits_len) args = parser.parse_args() -# -# 1:1 Shared IPv4 address, shared BR, Terastream -# -def terastream(): - ip4_pfx = ipaddress.ip_network('20.0.0.0/22') - ip6_dst = ipaddress.ip_network('bbbb::/32') - psid_len = 6 - ip6_src = ipaddress.ip_address('cccc:bbbb::') - for i in range(ip4_pfx.num_addresses): - if not i % 64: - ip6_src = ip6_src + 1 - print("map add domain ip4-pfx " + str(ip4_pfx[i]) + "/32 ip6-pfx ::/0 ip6-src " + str(ip6_src) + - " ea-bits-len 0 psid-offset 0 psid-len", psid_len) - for psid in range(0x1 << psid_len): - print("map add rule index", i, "psid", psid, "ip6-dst", ip6_dst[(i * (0x1<'); - count = 1024; for i in range(ip4_pfx.num_addresses): - if not i % 64: + print("map add domain ip4-pfx " + str(ip4_pfx[i]) + "/32 ip6-pfx " + str(ip6_dst[i]) + "/128 ip6-src", + ip6_src, "ea-bits-len 0 psid-offset 0 psid-len 0") + if ip6_src_ecmp and not i % mod: ip6_src = ip6_src + 1 - if count == 0: - break; - count = count - 1; - print('') - print(' '+ str(i)+ '') - print(' '+ str(ip4_pfx[i])+ '/32') - print(' ::/0') - print(' 0') - print(' 0') - print(' '+ str(psid_len) + '') - for psid in range(0x1 << psid_len): - print(' ') - print(' ', psid, '') - print(' '+ str(ip6_dst[(i * (0x1<') - print(' ') - print('') - print('') - print('') - -# -# 1:1 Shared IPv4 address, shared BR -# -def shared11br(): - ip4_pfx = ipaddress.ip_network('20.0.0.0/16') - ip6_dst = ipaddress.ip_network('bbbb::/32') - psid_len = 6 - for i in range(ip4_pfx.num_addresses): - print("map add domain ip4-pfx " + str(ip4_pfx[i]) + "/32 ip6-pfx ::/0 ip6-shared-src cccc:bbbb::1", - "ea-bits-len 0 psid-offset 6 psid-len", psid_len) - for psid in range(0x1 << psid_len): - print("map add rule index", i, "psid", psid, "ip6-dst", ip6_dst[(i * (0x1< 16): - print("EA length of {} is too large".format( - ealen, - ) - ) - print("EA should not exceed {} for rule IPv4 prefix {}".format( - maskbits + 16, - self.rulev4, - ) - ) - sys.exit(1) - ratio = 2**self.psidbits - return ratio - - def gen_psid(self,portnum): - if ( portnum < self.start_port() ): - print("port value is less than allowed by PSID Offset") - sys.exit(1) - psid = (portnum & ((2**self.psidbits - 1) << self.portbits)) - psid = psid >> self.portbits - return psid - - def port_ranges(self): - return 2**self.psidoffset - 1 - - def start_port(self): - if self.psidoffset == 0: return 0 - return 2**(16 - self.psidoffset) - - def port_list(self,psid): - startrange = psid * (2**self.portbits) + self.start_port() - increment = (2**self.psidbits) * (2**self.portbits) - portlist = [ ] - for port in range(startrange,startrange + 2**self.portbits): - if port >= 65536: continue - portlist.append(port) - for x in range(1,self.port_ranges()): - startrange += increment - for port in range(startrange,startrange + 2**self.portbits): - portlist.append(port) - return portlist - - def ipv4_index(self,ipv4addr): - if ip_address(ipv4addr) in ip_network(self.rulev4): - x = ip_address(ipv4addr) - y = ip_network(self.rulev4,strict=False).network_address - self.ipv4addr = x - return ( int(x) - int(y) ) - else: - print("Error: IPv4 address {} not in Rule IPv4 subnet {}".format( - ipv4add, - ip_network(self.rulev4,strict=False).network_address)) - sys.exit(1) - - def _calc_ipv6bit_pos(self): - addroffset = 128 - (self.rulev6mask + ( self.ealen - self.psidbits)) - psidshift = 128 - ( self.rulev6mask + self.ealen ) - return [addroffset,psidshift] - - def _append_map_eabits(self,ipv4index,addroffset,psidshift,psid): - rulev6base = IPv6Network(self.rulev6,strict=False).network_address - map_prefix = int(rulev6base) | ( ipv4index << addroffset ) - map_fullprefix = map_prefix | ( psid << psidshift) - return map_fullprefix - - - def get_mapce_addr(self,ipv4addr,psid): - ipv4index = self.ipv4_index(ipv4addr) - (addroffset,psidshift) = self._calc_ipv6bit_pos() - map_fullprefix = self._append_map_eabits(ipv4index, - addroffset, - psidshift, - psid) - mapv4iid = map_fullprefix | ( int(self.ipv4addr) << 16 ) - map_full_address = mapv4iid | psid - mapce_address = "{}".format(IPv6Address(map_full_address)) - return mapce_address - - def get_mapce_prefix(self,ipv4addr,psid): - ipv4index = self.ipv4_index(ipv4addr) - (addroffset,psidshift) = self._calc_ipv6bit_pos() - map_fullprefix = self._append_map_eabits(ipv4index, - addroffset, - psidshift, - psid) - mapce_prefix = "{}/{}".format( - IPv6Address(map_fullprefix), - self.rulev6mask + self.ealen - ) - return mapce_prefix - - def get_map_ipv4(self,mapce_address): - ipv4 = (int(IPv6Address(mapce_address)) & ( 0xffffffff << 16 )) >> 16 - return ip_address(ipv4) - - - -class DmrCalc(object): - - def __init__(self,dmr): - - # Validate and set BMR and BMR derived values - self.dmrprefix = self._check_dmr_prefix(dmr) - - def embed_6052addr(self,ipv4addr): - - try: - ipv4addrint = int(ip_address(ipv4addr)) - except ValueError: - print("Invalid IPv4 address {}".format(ipv4addr)) - sys.exit(1) - - if ( self.dmrprefix.prefixlen == 64 ): - ipv6int = ipv4addrint << 24 - ipv6int += int(self.dmrprefix.network_address) - return IPv6Address(ipv6int) - - if ( self.dmrprefix.prefixlen == 96 ): - ipv6int = ipv4addrint - ipv6int += int(self.dmrprefix.network_address) - return IPv6Address(ipv6int) - - def _check_dmr_prefix(self,dmrprefix): - try: - self.dmrmask = IPv6Network( - dmrprefix, - strict=False - ).prefixlen - except ValueError: - print("Invalid IPv6 prefix {}".format(prefix)) - sys.exit(1) - - if self.dmrmask not in (32,40,48,56,64,96): - print("Invalid prefix mask /{}".format(self.dmrmask)) - sys.exit(1) - - return IPv6Network(dmrprefix) - -if __name__ == "__main__": - m = DmrCalc('fd80::/48') - print(m.dmrprefix) diff --git a/vnet/vnet/map/examples/mt-test.py b/vnet/vnet/map/examples/mt-test.py deleted file mode 100644 index 62d269c7a13..00000000000 --- a/vnet/vnet/map/examples/mt-test.py +++ /dev/null @@ -1,80 +0,0 @@ -#!/usr/bin/env python - -# Copyright (c) 2009-2014 Cisco and/or its affiliates. -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at: -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import threading -import time -from scapy.all import * -from Queue import * - -iface = 'veth1' - -class SnifferThread(threading.Thread) : - def __init__(self,q,iface,flt,timeout) : - threading.Thread.__init__(self) - self.q = q - self.iface = iface - self.timeout = timeout - self.flt = flt - print("Sniffers reporting for service on ",self.iface) - - def run(self) : - conf.iface=self.iface - conf.iface6=self.iface - - r = sniff(filter=self.flt,iface=self.iface,timeout=self.timeout,prn=lambda x: x.summary()) - self.q.put(r) - - - -# New "SR" function -# Fire off thread with filter and expected answer packet(s). -# Fire off sniffer thread, main thread sends packet -# Returns true if found - -def sr2(answer, *args, **kwargs): - q = Queue() - print("Creating SnifferThreadWorkerThread") - flt='ip proto 41' - iface='veth1' - sniffer = SnifferThread(q,iface,flt,1) - sniffer.setDaemon(True) - sniffer.start() - - print "Sending packet:" - send(*args, **kwargs) - sniffer.join() - ps = q.get() - -# ps.summary() - print "Number of packets sniffed:", len(ps) - - for p in ps: - ip = p.getlayer(1) - print "Comparing", ip.summary(), "and", answer.summary() - if ip == answer: - print "We have a match!!" - return True - return False - -aip6 = IPv6(dst='2002:0a0a:0a0a::12')/ICMPv6EchoRequest() -answer= IP(src="10.0.0.100",dst="10.10.10.10",ttl=63)/aip6 -packet = IPv6(dst='2002:0a0a:0a0a::12')/ICMPv6EchoRequest() - -# From IPv6 -sr2(answer, packet,iface='veth1') - -#From IPv4 -packet = IP(src='10.10.10.10',dst='10.0.0.100')/IPv6(src='2002:0a0a:0a0a::12',dst='1::2')/ICMPv6EchoRequest() -sr2(answer, packet,iface='veth1') -- 2.16.6