def generate_TTF(all_links): ''' Takes a list of sts.debugger_entities.Link objects (directed) ''' ttf = tf.TF(of.HS_FORMAT()) for link in all_links: uniq_from_port = of.get_uniq_port_id(link.start_switch_impl, link.start_port) uniq_to_port = of.get_uniq_port_id(link.end_switch_impl, link.end_port) rule = tf.TF.create_standard_rule([uniq_from_port], None,[uniq_to_port], None, None) ttf.add_link_rule(rule) print "TTF: %s" % str(ttf) return ttf
def compute_omega(NTF, TTF, edge_links, reverse_map={}, test_packet=None): omega = {} # TODO: need to model host end of link, or does switch end suffice? edge_ports = map(lambda access_link: get_uniq_port_id(access_link.switch, access_link.switch_port), edge_links) print "edge_ports: %s" % ports_to_hex(edge_ports) for start_port in edge_ports: port_omega = compute_single_omega(NTF, TTF, start_port, edge_ports, reverse_map, test_packet) omega = dict(omega.items() + port_omega.items()) return omega
def compute_single_omega(NTF, TTF, start_port, edge_ports, reverse_map={}, test_packet=None): if type(start_port) != int: start_port = get_uniq_port_id(start_port.switch, start_port.switch_port) if type(edge_ports) != list: edge_ports = list(edge_ports) if type(edge_ports[0]) != int: edge_ports = map(lambda access_link: get_uniq_port_id(access_link.switch, access_link.switch_port), edge_ports) print "port %s is being checked" % hex(start_port) propagation = [] port_omega = {} # put all-x test packet in propagation graph test_pkt = test_packet if test_pkt == None: test_pkt = get_all_x(NTF) p_node = {} p_node["hdr"] = test_pkt p_node["port"] = start_port p_node["visits"] = [] p_node["hs_history"] = [] propagation.append(p_node) while len(propagation) > 0: # get the next node in propagation graph and apply it to NTF and TTF print " -- Propagation has length: %d --" % len(propagation) tmp_propag = [] for p_node in propagation: print "Checking port: %s hdr: %s" % (port_to_hex(p_node["port"]), str(p_node["hdr"])) # hp is "header port" next_hps = NTF.T(p_node["hdr"],p_node["port"]) for (next_h,next_ps) in next_hps: for next_p in next_ps: sys.stdout.write(" next_hp: %s -> %s" % (port_to_hex(next_p),str(next_h))) # Note: right now, we encode packet drops as a lack of a leave in the propogation graph # TODO: not in (not edge ports) would work better if next_p in edge_ports: # We've reached our final destination! # ASSUMPTION: no edge port will send it back out into the network... # use the inverse T trick to get original headerspace which led us here original_headers = find_loop_original_header(NTF,TTF,p_node) for original_header in original_headers: key = (original_header, start_port) if not key in port_omega: # TODO: python default value for hash? port_omega[key] = [] port_omega[key].append((next_h, next_p)) linked = TTF.T(next_h,next_p) if not linked: sys.stdout.write("\n") for (linked_h,linked_ports) in linked: for linked_p in linked_ports: print " -> %s" % (port_to_hex(linked_p)) new_p_node = {} new_p_node["hdr"] = linked_h new_p_node["port"] = linked_p new_p_node["visits"] = list(p_node["visits"]) new_p_node["visits"].append(p_node["port"]) new_p_node["hs_history"] = list(p_node["hs_history"]) new_p_node["hs_history"].append(p_node["hdr"]) if linked_p in new_p_node["visits"]: print "WARNING: detected a loop - branch aborted: \nHeaderSpace: %s\n Visited Ports: %s\nLast Port %s "%(\ new_p_node["hdr"],ports_to_hex(new_p_node["visits"]),hex(new_p_node["port"])) return port_omega else: tmp_propag.append(new_p_node) propagation = tmp_propag return port_omega