def add_internet(ntf,ttf,port_map,cs,campus_ip_list): ''' Campus IP list is a list of (ip address,subnet mask) for each IP subnet on campus ''' s = TF(cs.HS_FORMAT()["length"]*2) s.set_prefix_id("internet") for entry in campus_ip_list: match = byte_array_get_all_x(cs.HS_FORMAT()["length"]*2) cs.set_field(match,'ip_dst',dotted_ip_to_int(entry[0]),32-entry[1]) rule = TF.create_standard_rule([0], match, [0], None, None, "", []) s.add_fwd_rule(rule) ntf.append_tf(s) bbra_internet_port1 = port_map["bbra_rtr"]["te1/1"] bbra_internet_port2 = port_map["bbra_rtr"]["te7/4"] bbrb_internet_port1 = port_map["bbrb_rtr"]["te1/4"] bbrb_internet_port2 = port_map["bbrb_rtr"]["te7/3"] rule = TF.create_standard_rule([bbra_internet_port1], None,[0], None, None, "", []) ttf.add_link_rule(rule) rule = TF.create_standard_rule([bbra_internet_port2], None,[0], None, None, "", []) ttf.add_link_rule(rule) rule = TF.create_standard_rule([bbrb_internet_port1], None,[0], None, None, "", []) ttf.add_link_rule(rule) rule = TF.create_standard_rule([bbrb_internet_port2], None,[0], None, None, "", []) ttf.add_link_rule(rule) rule = TF.create_standard_rule([0], None,[bbra_internet_port1], None, None, "", []) ttf.add_link_rule(rule) rule = TF.create_standard_rule([0], None,[bbra_internet_port2], None, None, "", []) ttf.add_link_rule(rule) rule = TF.create_standard_rule([0], None,[bbrb_internet_port1], None, None, "", []) ttf.add_link_rule(rule) rule = TF.create_standard_rule([0], None,[bbrb_internet_port2], None, None, "", []) ttf.add_link_rule(rule)
def __add_action_to_rule(self, action, rule, rtr): #print "Action:", action, " Rule: ",rule mask = wildcard_create_bit_repeat(self.format["length"], 2) rewrite = wildcard_create_bit_repeat(self.format["length"], 1) out_ports = [] rw = False push = False pop = False for operation in action.keys(): if operation == "set_nw_src" or operation == "set_nw_dst": rw = True set_header_field(self.format, mask, operation[4:], 0, 0) set_header_field(self.format, rewrite, operation[4:], dotted_ip_to_int(action[operation]), 0) elif operation == "set_dl_src" or operation == "set_dl_dst": rw = True set_header_field(self.format, mask, operation[4:], 0, 0) set_header_field(self.format, rewrite, operation[4:], mac_to_int(action[operation]), 0) elif operation == "output": ''' if action[operation] in self.port_members: out_ports = self.__encode_port_list(self.port_members[action[operation]],rtr) else: ''' if action[operation].startswith("mport"): out_ports = self.__expand_mport(rtr, action[operation]) else: out_ports = [action[operation]] out_ports = self.__compress_port_list(out_ports) out_ports = self.__encode_port_list(out_ports, rtr) elif operation == "push_ip": push = True rule["encap_pos"] = self.format["nw_src_pos"] rule["encap_len"] = 8 elif operation == "pop_ip": pop = True rule["decap_pos"] = self.format["nw_src_pos"] rule["decap_len"] = 8 rule["out_ports"] = out_ports if push: rule["action"] = "encap" rule["mask"] = mask rule["rewrite"] = rewrite elif pop: rule["action"] = "decap" rule["mask"] = None rule["rewrite"] = None elif rw: rule["action"] = "rw" rule["mask"] = mask rule["rewrite"] = rewrite else: rule["action"] = "fwd" rule["mask"] = None rule["rewrite"] = None
def __add_action_to_rule(self,action,rule,rtr): #print "Action:", action, " Rule: ",rule mask = wildcard_create_bit_repeat(self.format["length"],2) rewrite = wildcard_create_bit_repeat(self.format["length"],1) out_ports = [] rw = False push = False pop = False for operation in action.keys(): if operation == "set_nw_src" or operation == "set_nw_dst": rw = True set_header_field(self.format, mask, operation[4:], 0, 0) set_header_field(self.format, rewrite, operation[4:], dotted_ip_to_int(action[operation]), 0) elif operation == "set_dl_src" or operation == "set_dl_dst": rw = True set_header_field(self.format, mask, operation[4:], 0, 0) set_header_field(self.format, rewrite, operation[4:], mac_to_int(action[operation]), 0) elif operation == "output": ''' if action[operation] in self.port_members: out_ports = self.__encode_port_list(self.port_members[action[operation]],rtr) else: ''' if action[operation].startswith("mport"): out_ports = self.__expand_mport(rtr, action[operation]) else: out_ports = [action[operation]] out_ports = self.__compress_port_list(out_ports) out_ports = self.__encode_port_list(out_ports, rtr) elif operation == "push_ip": push = True rule["encap_pos"] = self.format["nw_src_pos"] rule["encap_len"] = 8 elif operation == "pop_ip": pop = True rule["decap_pos"] = self.format["nw_src_pos"] rule["decap_len"] = 8 rule["out_ports"] = out_ports if push: rule["action"] = "encap" rule["mask"] = mask rule["rewrite"] = rewrite elif pop: rule["action"] = "decap" rule["mask"] = None rule["rewrite"] = None elif rw: rule["action"] = "rw" rule["mask"] = mask rule["rewrite"] = rewrite else: rule["action"] = "fwd" rule["mask"] = None rule["rewrite"] = None
def add_internet(ntf, ttf, port_map, cs, campus_ip_list): ''' Campus IP list is a list of (ip address,subnet mask) for each IP subnet on campus ''' s = TF(cs.HS_FORMAT()["length"] * 2) s.set_prefix_id("internet") for entry in campus_ip_list: match = byte_array_get_all_x(cs.HS_FORMAT()["length"] * 2) cs.set_field(match, 'ip_dst', dotted_ip_to_int(entry[0]), 32 - entry[1]) rule = TF.create_standard_rule([0], match, [0], None, None, "", []) s.add_fwd_rule(rule) ntf.append_tf(s) bbra_internet_port1 = port_map["bbra_rtr"]["te1/1"] bbra_internet_port2 = port_map["bbra_rtr"]["te7/4"] bbrb_internet_port1 = port_map["bbrb_rtr"]["te1/4"] bbrb_internet_port2 = port_map["bbrb_rtr"]["te7/3"] rule = TF.create_standard_rule([bbra_internet_port1], None, [0], None, None, "", []) ttf.add_link_rule(rule) rule = TF.create_standard_rule([bbra_internet_port2], None, [0], None, None, "", []) ttf.add_link_rule(rule) rule = TF.create_standard_rule([bbrb_internet_port1], None, [0], None, None, "", []) ttf.add_link_rule(rule) rule = TF.create_standard_rule([bbrb_internet_port2], None, [0], None, None, "", []) ttf.add_link_rule(rule) rule = TF.create_standard_rule([0], None, [bbra_internet_port1], None, None, "", []) ttf.add_link_rule(rule) rule = TF.create_standard_rule([0], None, [bbra_internet_port2], None, None, "", []) ttf.add_link_rule(rule) rule = TF.create_standard_rule([0], None, [bbrb_internet_port1], None, None, "", []) ttf.add_link_rule(rule) rule = TF.create_standard_rule([0], None, [bbrb_internet_port2], None, None, "", []) ttf.add_link_rule(rule)