def generate_transfer_functions(settings): st = time() if ("replace_vlans" in settings.keys()): has_replaced_vlan = True else: has_replaced_vlan = False if "arp_table_file_sfx" in settings.keys(): arp_sfx = settings["arp_table_file_sfx"] else: arp_sfx = "_arp_table.txt" if "mac_table_file_sfx" in settings.keys(): mac_sfx = settings["mac_table_file_sfx"] else: mac_sfx = "_mac_table.txt" if "config_file_sfx" in settings.keys(): config_sfx = settings["config_file_sfx"] else: config_sfx = "_config.txt" if "spanning_tree_file_sfx" in settings.keys(): span_sfx = settings["spanning_tree_file_sfx"] else: span_sfx = "_spanning_tree.txt" if "route_table_file_sfx" in settings.keys(): route_sfx = settings["route_table_file_sfx"] else: route_sfx = "_route.txt" # generate transfer functions L = 0 id = 1 cs_list = {} for i in range(len(settings["rtr_names"])): rtr_name = settings["rtr_names"][i] cs = cisco_router(id) if has_replaced_vlan: cs.set_replaced_vlan(settings["replace_vlans"][i]) if "hs_format" in settings.keys(): cs.set_hs_format(settings["hs_format"]) L = cs.hs_format["length"] tf = TF(L) tf.set_prefix_id(rtr_name) cs.read_arp_table_file("%s/%s%s" % (settings["input_path"], rtr_name, arp_sfx)) cs.read_mac_table_file("%s/%s%s" % (settings["input_path"], rtr_name, mac_sfx)) cs.read_spanning_tree_file("%s/%s%s"%\ (settings["input_path"],rtr_name,span_sfx)) cs.read_config_file("%s/%s%s" % (settings["input_path"], rtr_name, config_sfx)) cs.read_route_file("%s/%s%s" % (settings["input_path"], rtr_name, route_sfx)) if ("optimize_fwd_table" not in settings.keys() or \ settings["optimize_fwd_table"]): cs.optimize_forwarding_table() if ("fwd_table_only" in settings.keys() and settings["fwd_table_only"]): cs.generate_port_ids_only_for_output_ports() cs.generate_fwd_table_tf(tf) else: cs.generate_port_ids([]) cs.generate_transfer_function(tf) if (not os.path.isdir(settings["output_path"])): os.makedirs(settings["output_path"]) tf.save_as_json("%s/%s.tf.json" % (settings["output_path"], rtr_name)) tf.save_object_to_file("%s/%s.tf" % (settings["output_path"], rtr_name)) id += 1 cs_list[rtr_name] = cs #generate port maps f = open("%s/port_map.json" % settings["output_path"], 'w') port_map = {} for rtr in cs_list.keys(): cs = cs_list[rtr] port_map[rtr] = cs.port_to_id f.write(json.dumps(port_map)) f.close() #write topology: if "topology" in settings.keys(): print "===Generating Topology===" out_port_addition = cisco_router.PORT_TYPE_MULTIPLIER * \ cisco_router.OUTPUT_PORT_TYPE_CONST topology = settings["topology"] tf = TF(L) for (from_router, from_port, to_router, to_port) in topology: from_cs = cs_list[from_router] to_cs = cs_list[to_router] rule = TF.create_standard_rule(\ [from_cs.get_port_id(from_port) + out_port_addition],\ None,[to_cs.get_port_id(to_port)],\ None, None, "", []) tf.add_link_rule(rule) rule = TF.create_standard_rule(\ [to_cs.get_port_id(to_port) + out_port_addition], \ None,[from_cs.get_port_id(from_port)], \ None, None, "", []) tf.add_link_rule(rule) tf.save_as_json("%s/topology.tf.json" % settings["output_path"]) tf.save_object_to_file("%s/topology.tf" % settings["output_path"]) en = time() print "completed in ", en - st, "seconds"
path = sys.argv[1] out_path = sys.argv[2] #path = "i2_tfs" #out_path = "i2_json" table_id = 0 topo = TF(1) topo.load_object_from_file("%s/%s.tf" % (path, "backbone_topology")) topology = {"topology": []} for rule in topo.rules: in_ports = rule["in_ports"] out_ports = rule["out_ports"] for in_port in in_ports: for out_port in out_ports: topology["topology"].append({"src": in_port, "dst": out_port}) topo.save_as_json("%s/%s.json" % (path, "topology")) for rtr in rtr_names: tf = TF(1) tf.load_object_from_file("%s/%s.tf" % (path, rtr)) #tf.save_as_json("%s/%s.tf.json"%(path,rtr)) table_id += 1 tf_in = {"rules": [], "ports": [], "id": table_id * 10} tf_out = {"rules": [], "ports": [], "id": table_id * 10 + 1} in_table_out_port = table_id * SWITCH_ID_MULTIPLIER out_table_in_port = table_id * SWITCH_ID_MULTIPLIER + PORT_TYPE_MULTIPLIER topology["topology"].append({ "src": in_table_out_port, "dst": out_table_in_port }) rtr_ports = set()
PORT_TYPE_MULTIPLIER = 10000 SWITCH_ID_MULTIPLIER = 100000 path = "i2_tfs" out_path = "i2_json_rules" table_id = 0 topo = TF(1) topo.load_object_from_file("%s/%s.tf"%(path,"topology")) topology = {"topology":[]} for rule in topo.rules: in_ports = rule["in_ports"] out_ports = rule["out_ports"] for in_port in in_ports: for out_port in out_ports: topology["topology"].append({"src":in_port,"dst":out_port}) topo.save_as_json("%s/%s.json"%(path,"topology")) for rtr in rtr_names: tf = TF(1) tf.load_object_from_file("%s/%s.tf"%(path,rtr)) tf.save_as_json("%s/%s.tf.json"%(path,rtr)) table_id += 1 tf_in = {"rules":[], "ports":[], "id":table_id*10} tf_out = {"rules":[], "ports":[], "id":table_id*10+1} topology["topology"].append({"src":table_id * SWITCH_ID_MULTIPLIER, "dst":table_id * SWITCH_ID_MULTIPLIER + PORT_TYPE_MULTIPLIER}) rtr_ports = set() for rule in tf.rules: rule.pop("line") rule.pop("file") rule.pop("influence_on") rule.pop("affected_by")
if args.view: stage = args.view[0] i = 1 for rule in f.rules: if stage == get_stage(rule): print i,":",get_openflow_rule(rule,inv_mapf) i = i + 1; if args.rm: indices = args.rm[0].split(",") indices = [int(i) for i in indices] indices.sort(reverse=True) for index in indices: f.remove_rule(index-1) if args.add: positions = (args.add[0]).split(",") rules = (args.add[1]).split(":") if len(rules) != len(positions): sys.stderr.write("Number of positions and number of rules should be the same") for i in range(len(positions)): position = int(positions[i])-1 tokens = rules[i].split(";") rule = parse_new_rule_tokens(tokens,mapf_extended,args.rtr_name) if rule["mask"] == None: f.add_fwd_rule(rule,position) elif rule["mask"] != None: f.add_rewrite_rule(rule,position) f.save_object_to_file("%s/%s.tf"%(args.data_path,args.rtr_name)) f.save_as_json("%s/%s.tf.json"%(args.data_path,args.rtr_name))
def generate_transfer_functions(settings): st = time() if ("replace_vlans" in settings.keys()): has_replaced_vlan = True else: has_replaced_vlan = False if "arp_table_file_sfx" in settings.keys(): arp_sfx = settings["arp_table_file_sfx"] else: arp_sfx = "_arp_table.txt" if "mac_table_file_sfx" in settings.keys(): mac_sfx = settings["mac_table_file_sfx"] else: mac_sfx = "_mac_table.txt" if "config_file_sfx" in settings.keys(): config_sfx = settings["config_file_sfx"] else: config_sfx = "_config.txt" if "spanning_tree_file_sfx" in settings.keys(): span_sfx = settings["spanning_tree_file_sfx"] else: span_sfx = "_spanning_tree.txt" if "route_table_file_sfx" in settings.keys(): route_sfx = settings["route_table_file_sfx"] else: route_sfx = "_route.txt" # generate transfer functions L = 0 id = 1 cs_list = {} for i in range(len(settings["rtr_names"])): rtr_name = settings["rtr_names"][i] cs = cisco_router(id) if has_replaced_vlan: cs.set_replaced_vlan(settings["replace_vlans"][i]) if "hs_format" in settings.keys(): cs.set_hs_format(settings["hs_format"]) L = cs.hs_format["length"] tf = TF(L) tf.set_prefix_id(rtr_name) cs.read_arp_table_file("%s/%s%s"%(settings["input_path"],rtr_name,arp_sfx)) cs.read_mac_table_file("%s/%s%s"%(settings["input_path"],rtr_name,mac_sfx)) cs.read_spanning_tree_file("%s/%s%s"%\ (settings["input_path"],rtr_name,span_sfx)) cs.read_config_file("%s/%s%s"%(settings["input_path"],rtr_name,config_sfx)) cs.read_route_file("%s/%s%s"%(settings["input_path"],rtr_name,route_sfx)) if ("optimize_fwd_table" not in settings.keys() or \ settings["optimize_fwd_table"]): cs.optimize_forwarding_table() if ("fwd_table_only" in settings.keys() and settings["fwd_table_only"]): cs.generate_port_ids_only_for_output_ports() cs.generate_fwd_table_tf(tf) else: cs.generate_port_ids([]) cs.generate_transfer_function(tf) tf.save_as_json("%s/%s.tf.json"%(settings["output_path"],rtr_name)) tf.save_object_to_file("%s/%s.tf"%(settings["output_path"],rtr_name)) id += 1 cs_list[rtr_name] = cs #generate port maps f = open("%s/port_map.json"%settings["output_path"],'w') port_map = {} for rtr in cs_list.keys(): cs = cs_list[rtr] port_map[rtr] = cs.port_to_id f.write(json.dumps(port_map)) f.close() #write topology: if "topology" in settings.keys(): print "===Generating Topology===" out_port_addition = cisco_router.PORT_TYPE_MULTIPLIER * \ cisco_router.OUTPUT_PORT_TYPE_CONST topology = settings["topology"] tf = TF(L) for (from_router,from_port,to_router,to_port) in topology: from_cs = cs_list[from_router] to_cs = cs_list[to_router] rule = TF.create_standard_rule(\ [from_cs.get_port_id(from_port) + out_port_addition],\ None,[to_cs.get_port_id(to_port)],\ None, None, "", []) tf.add_link_rule(rule) rule = TF.create_standard_rule(\ [to_cs.get_port_id(to_port) + out_port_addition], \ None,[from_cs.get_port_id(from_port)], \ None, None, "", []) tf.add_link_rule(rule) tf.save_as_json("%s/topology.tf.json"%settings["output_path"]) tf.save_object_to_file("%s/topology.tf"%settings["output_path"]) en = time() print "completed in ",en - st, "seconds"
stage = args.view[0] i = 1 for rule in f.rules: if stage == get_stage(rule): print i, ":", get_openflow_rule(rule, inv_mapf) i = i + 1 if args.rm: indices = args.rm[0].split(",") indices = [int(i) for i in indices] indices.sort(reverse=True) for index in indices: f.remove_rule(index - 1) if args.add: positions = (args.add[0]).split(",") rules = (args.add[1]).split(":") if len(rules) != len(positions): sys.stderr.write( "Number of positions and number of rules should be the same") for i in range(len(positions)): position = int(positions[i]) - 1 tokens = rules[i].split(";") rule = parse_new_rule_tokens(tokens, mapf_extended, args.rtr_name) if rule["mask"] == None: f.add_fwd_rule(rule, position) elif rule["mask"] != None: f.add_rewrite_rule(rule, position) f.save_object_to_file("%s/%s.tf" % (args.data_path, args.rtr_name)) f.save_as_json("%s/%s.tf.json" % (args.data_path, args.rtr_name))