def pass_assign_mac_addresses(self): """ DFS through the topology to assign mac addresses """ self.passes_used.append("pass_assign_mac_addresses") nodes_dfs_order = self.firesimtopol.get_dfs_order() MacAddress.reset_allocator() for node in nodes_dfs_order: if isinstance(node, FireSimServerNode): node.assign_mac_address(MacAddress())
def pass_compute_switching_tables(self): """ This creates the MAC addr -> port lists for switch nodes. a) First, a pass that computes "downlinkmacs" for each node, which represents all of the MAC addresses that are reachable on the downlinks of this switch, to advertise to uplinks. b) Next, a pass that actually constructs the MAC addr -> port lists for switch nodes. It is assumed that downlinks take ports [0, num downlinks) and uplinks take ports [num downlinks, num downlinks + num uplinks) This will currently just assume that there is one uplink, since the switch models do not handle load balancing across multiple paths. """ # this pass requires mac addresses to already be assigned assert "pass_assign_mac_addresses" in self.passes_used self.passes_used.append("pass_compute_switching_tables") nodes_dfs_order = self.firesimtopol.get_dfs_order() for node in nodes_dfs_order: if isinstance(node, FireSimServerNode): node.downlinkmacs = [node.get_mac_address()] else: childdownlinkmacs = [ x.get_downlink_side().downlinkmacs for x in node.downlinks ] node.downlinkmacs = reduce(lambda x, y: x + y, childdownlinkmacs) switches_dfs_order = self.firesimtopol.get_dfs_order_switches() for switch in switches_dfs_order: uplinkportno = len(switch.downlinks) # prepopulate the table with the last port, which will be switchtab = [ uplinkportno for x in range(MacAddress.next_mac_to_allocate()) ] for port_no in range(len(switch.downlinks)): portmacs = switch.downlinks[port_no].get_downlink_side( ).downlinkmacs for mac in portmacs: switchtab[mac.as_int_no_prefix()] = port_no switch.switch_table = switchtab