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
示例#2
0
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
示例#3
0
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