예제 #1
0
 def _get_communicated_pairs(simulation):
     ''' Return pairs that have recently communicated; also remove outdated entries '''
     from config_parser.openflow_parser import get_uniq_port_id
     interface_pair_map = InvariantChecker.interface_pair_map
     pair_timeout = InvariantChecker.pair_timeout
     communicated_pairs = set()
     for (src_addr, dst_addr), timestamp in interface_pair_map.items():
         if (time.time() - timestamp < pair_timeout):
             interface2access_links = simulation.topology.link_tracker.interface2access_link
             src_interface, dst_interface = None, None
             for interface in interface2access_links.keys():
                 if interface.hw_addr == src_addr:
                     src_interface = interface
                 if interface.hw_addr == dst_addr:
                     dst_interface = interface
             if src_interface is not None and dst_interface is not None:
                 l1 = interface2access_links[src_interface]
                 l2 = interface2access_links[dst_interface]
                 communicated_pair = (get_uniq_port_id(
                     l1.switch, l1.switch_port),
                                      get_uniq_port_id(
                                          l2.switch, l2.switch_port))
                 communicated_pairs.add(communicated_pair)
         else:
             del interface_pair_map[(src_addr, dst_addr)]
     return communicated_pairs
예제 #2
0
 def _get_all_pairs(simulation):
   # TODO(cs): translate HSA port numbers to ofp_phy_ports in the
   # headerspace/ module instead of computing uniq_port_id here
   from config_parser.openflow_parser import get_uniq_port_id
   access_links = simulation.topology.access_links
   all_pairs = [ (get_uniq_port_id(l1.switch, l1.switch_port), get_uniq_port_id(l2.switch, l2.switch_port))
                 for l1 in access_links
                 for l2 in access_links if l1 != l2 ]
   all_pairs = set(all_pairs)
   return all_pairs
예제 #3
0
 def _get_all_pairs(simulation):
     # TODO(cs): translate HSA port numbers to ofp_phy_ports in the
     # headerspace/ module instead of computing uniq_port_id here
     from config_parser.openflow_parser import get_uniq_port_id
     access_links = simulation.topology.access_links
     all_pairs = [(get_uniq_port_id(l1.switch, l1.switch_port),
                   get_uniq_port_id(l2.switch, l2.switch_port))
                  for l1 in access_links for l2 in access_links if l1 != l2]
     all_pairs = set(all_pairs)
     return all_pairs
예제 #4
0
 def _get_communicated_pairs(simulation):
   ''' Return pairs that have recently communicated; also remove outdated entries '''
   from config_parser.openflow_parser import get_uniq_port_id
   interface_pair_map = InvariantChecker.interface_pair_map
   pair_timeout = InvariantChecker.pair_timeout
   communicated_pairs = set()
   for (src_addr, dst_addr), timestamp in interface_pair_map.items():
     if (time.time() - timestamp < pair_timeout):
       interface2access_links = simulation.topology.link_tracker.interface2access_link
       src_interface, dst_interface = None, None
       for interface in interface2access_links.keys():
         if interface.hw_addr == src_addr:
           src_interface = interface
         if interface.hw_addr == dst_addr:
           dst_interface = interface
       if src_interface is not None and dst_interface is not None:
         l1 = interface2access_links[src_interface]
         l2 = interface2access_links[dst_interface]
         communicated_pair = (get_uniq_port_id(l1.switch, l1.switch_port),
                              get_uniq_port_id(l2.switch, l2.switch_port))
         communicated_pairs.add(communicated_pair)
     else:
       del interface_pair_map[(src_addr, dst_addr)]
   return communicated_pairs
예제 #5
0
def check_partitions(switches, live_links, access_links):
  # TODO(cs): lifted directly from pox.forwarding.l2_multi. Highly
  # redundant!
  from config_parser.openflow_parser import get_uniq_port_id

  # Adjacency map.  [sw1][sw2] -> port from sw1 to sw2
  adjacency = defaultdict(lambda:defaultdict(lambda:None))

  for link in live_links:
    # Make sure to disregard links that are adjacent to down switches
    # (technically those links are still `live', but it's easier to treat it
    #  this way)
    if not (link.start_software_switch.failed or
            link.end_software_switch.failed):
      adjacency[link.start_software_switch][link.end_software_switch] = link

  # Switches we know of.  [dpid] -> Switch
  switches = { sw.dpid : sw for sw in switches }

  # [sw1][sw2] -> (distance, intermediate)
  path_map = defaultdict(lambda:defaultdict(lambda:(None,None)))

  def _calc_paths ():
    """
    Essentially Floyd-Warshall algorithm
    """
    sws = switches.values()
    path_map.clear()
    for k in sws:
      for j,port in adjacency[k].iteritems():
        if port is None: continue
        path_map[k][j] = (1,None)
      path_map[k][k] = (0,None) # distance, intermediate

    """
    for i in sws:
      for j in sws:
        a = path_map[i][j][0]
        #a = adjacency[i][j]
        if a is None: a = "*"
        print a,
      print
    """

    for k in sws:
      for i in sws:
        for j in sws:
          if path_map[i][k][0] is not None:
            if path_map[k][j][0] is not None:
              # i -> k -> j exists
              ikj_dist = path_map[i][k][0]+path_map[k][j][0]
              if path_map[i][j][0] is None or ikj_dist < path_map[i][j][0]:
                # i -> k -> j is better than existing
                path_map[i][j] = (ikj_dist, k)

    """
    print "--------------------"
    for i in sws:
      for j in sws:
        print path_map[i][j][0],
      print
    """

  all_link_pairs = [ (l1,l2) for l1 in access_links
                                for l2 in access_links if l1 != l2 ]

  _calc_paths()
  partioned_pairs = set()
  for link_pair in all_link_pairs:
    if path_map[link_pair[0].switch][link_pair[1].switch] == (None,None):
      id1 = get_uniq_port_id(link_pair[0].switch, link_pair[0].switch_port)
      id2 = get_uniq_port_id(link_pair[1].switch, link_pair[1].switch_port)
      partioned_pairs.add((id1,id2))
  return partioned_pairs
예제 #6
0
def check_partitions(switches, live_links, access_links):
    # TODO(cs): lifted directly from pox.forwarding.l2_multi. Highly
    # redundant!
    from config_parser.openflow_parser import get_uniq_port_id

    # Adjacency map.  [sw1][sw2] -> port from sw1 to sw2
    adjacency = defaultdict(lambda: defaultdict(lambda: None))

    for link in live_links:
        # Make sure to disregard links that are adjacent to down switches
        # (technically those links are still `live', but it's easier to treat it
        #  this way)
        if not (link.start_software_switch.failed
                or link.end_software_switch.failed):
            adjacency[link.start_software_switch][
                link.end_software_switch] = link

    # Switches we know of.  [dpid] -> Switch
    switches = {sw.dpid: sw for sw in switches}

    # [sw1][sw2] -> (distance, intermediate)
    path_map = defaultdict(lambda: defaultdict(lambda: (None, None)))

    def _calc_paths():
        """
    Essentially Floyd-Warshall algorithm
    """
        sws = switches.values()
        path_map.clear()
        for k in sws:
            for j, port in adjacency[k].iteritems():
                if port is None: continue
                path_map[k][j] = (1, None)
            path_map[k][k] = (0, None)  # distance, intermediate
        """
    for i in sws:
      for j in sws:
        a = path_map[i][j][0]
        #a = adjacency[i][j]
        if a is None: a = "*"
        print a,
      print
    """

        for k in sws:
            for i in sws:
                for j in sws:
                    if path_map[i][k][0] is not None:
                        if path_map[k][j][0] is not None:
                            # i -> k -> j exists
                            ikj_dist = path_map[i][k][0] + path_map[k][j][0]
                            if path_map[i][j][
                                    0] is None or ikj_dist < path_map[i][j][0]:
                                # i -> k -> j is better than existing
                                path_map[i][j] = (ikj_dist, k)
        """
    print "--------------------"
    for i in sws:
      for j in sws:
        print path_map[i][j][0],
      print
    """

    all_link_pairs = [(l1, l2) for l1 in access_links for l2 in access_links
                      if l1 != l2]

    _calc_paths()
    partioned_pairs = set()
    for link_pair in all_link_pairs:
        if path_map[link_pair[0].switch][link_pair[1].switch] == (None, None):
            id1 = get_uniq_port_id(link_pair[0].switch,
                                   link_pair[0].switch_port)
            id2 = get_uniq_port_id(link_pair[1].switch,
                                   link_pair[1].switch_port)
            partioned_pairs.add((id1, id2))
    return partioned_pairs