def init_switch_admitted_traffic(self): print "Computing Transfer Function for switch:", self.sw.node_id # Inject wildcard traffic at each ingress port of the switch's non-host ports for port in self.sw.non_host_port_iter(): egress_node = self.get_egress_node(self.sw.node_id, port.port_number) dst_traffic_at_succ = Traffic(init_wildcard=True) end_to_end_modified_edges = [] self.propagate_admitted_traffic(egress_node, dst_traffic_at_succ, None, egress_node, end_to_end_modified_edges) # Inject wildcard traffic at each ingress port of the switch for port in self.sw.host_port_iter(): egress_node = self.get_egress_node(self.sw.node_id, port.port_number) dst_traffic_at_succ = Traffic(init_wildcard=True) dst_traffic_at_succ.set_field( "ethernet_destination", int(port.attached_host.mac_addr.replace(":", ""), 16)) end_to_end_modified_edges = [] self.propagate_admitted_traffic(egress_node, dst_traffic_at_succ, None, egress_node, end_to_end_modified_edges)
def init_network_admitted_traffic_for_sw(self, sw): for non_host_port in sw.non_host_port_iter(): # Accumulate traffic that is admitted for each host admitted_host_traffic = Traffic() for host_port in sw.host_port_iter(): at = sw.port_graph.get_admitted_traffic( non_host_port.switch_port_graph_ingress_node, host_port.switch_port_graph_egress_node) admitted_host_traffic.union(at) end_to_end_modified_edges = [] self.propagate_admitted_traffic( non_host_port.network_port_graph_ingress_node, admitted_host_traffic, None, non_host_port.network_port_graph_ingress_node, end_to_end_modified_edges) admitted_host_traffic.set_field("in_port", int(non_host_port.port_number))
class Port(object): def __init__(self, sw, port_raw): self.sw = sw self.port_id = None self.curr_speed = None self.max_speed = None self.mac_address = None self.port_number = None self.state = None self.attached_host = None if self.sw.network_graph.controller == "ryu": self.parse_ryu_port_json(port_raw) elif self.sw.network_graph.controller == "onos": self.parse_onos_port_json(port_raw) elif self.sw.network_graph.controller == "grpc": self.parse_grpc_port(port_raw) else: raise NotImplemented def init_port_graph_state(self): # Need port_number parsed in before this is called self.switch_port_graph_ingress_node = PortGraphNode(self.sw, PortGraph.get_ingress_node_id(self.sw.node_id, self.port_number), "ingress") self.switch_port_graph_egress_node = PortGraphNode(self.sw, PortGraph.get_egress_node_id(self.sw.node_id, self.port_number), "egress") self.network_port_graph_ingress_node = PortGraphNode(self.sw, PortGraph.get_ingress_node_id(self.sw.node_id, self.port_number), "ingress") self.network_port_graph_egress_node = PortGraphNode(self.sw, PortGraph.get_egress_node_id(self.sw.node_id, self.port_number), "egress") self.switch_port_graph_ingress_node.parent_obj = self self.switch_port_graph_egress_node.parent_obj = self self.network_port_graph_ingress_node.parent_obj = self self.network_port_graph_egress_node.parent_obj = self self.ingress_node_traffic = Traffic(init_wildcard=True) self.ingress_node_traffic.set_field("in_port", int(self.port_number)) def parse_odl_port_json(self, port_raw): self.port_id = str(self.sw.node_id) + ":" + str(port_raw["flow-node-inventory:port-number"]) self.port_number = port_raw["flow-node-inventory:port-number"] self.mac_address = port_raw["flow-node-inventory:hardware-address"] self.curr_speed = int(port_raw["flow-node-inventory:current-speed"]) self.max_speed = int(port_raw["flow-node-inventory:maximum-speed"]) if port_raw["flow-node-inventory:state"]["link-down"]: self.state = "down" else: self.state = "up" def parse_onos_port_json(self, port_raw): self.port_number = int(port_raw["port"]) self.port_id = str(self.sw.node_id) + ":" + str(self.port_number) self.mac_address = None self.state = "up" def parse_ryu_port_json(self, port_raw): self.port_id = str(self.sw.node_id) + ":" + str(port_raw["port_no"]) self.port_number = port_raw["port_no"] self.mac_address = port_raw["hw_addr"] if "curr_speed" in port_raw: self.curr_speed = int(port_raw["curr_speed"]) if "max_speed" in port_raw: self.max_speed = int(port_raw["max_speed"]) self.state = "up" def parse_grpc_port(self, port_raw): self.port_id = str(self.sw.node_id) + ":" + str(port_raw.port_num) self.port_number = port_raw.port_num self.mac_address = port_raw.port_num self.state = "up" def __str__(self): return str(self.port_id) def __repr__(self): return str(self.port_id)