def runTest(self): """ Set the first table config as "Send to Controller" and the second table as "Drop", add flow entries: First Table; Match IP Src A; send to 1 // if not match, packet_in Second Table; Match IP Src B; send to 2 // if not match, drop Then send a packet: IP B; expect packet_in """ of_ports = testutils.clear_switch(self, pa_port_map.keys(), pa_logger) # Set table config as "send to controller" and "drop" testutils.set_table_config(self, testutils.WC_ACL_TABLE, ofp.OFPTC_TABLE_MISS_CONTROLLER, True) testutils.set_table_config(self, testutils.WC_SERV_TABLE, ofp.OFPTC_TABLE_MISS_DROP, True) # Set up matches testutils.write_output(self, testutils.WC_ACL_TABLE, of_ports[0], ip_src="192.168.1.10") testutils.write_output(self, testutils.WC_SERV_TABLE, of_ports[1], of_ports[2], ip_src="192.168.1.70") # Generate a packet not matching to any flow entry in the first table testutils.reply_check_ctrl(self, ip_src='192.168.1.70', tcp_sport=1234, ing_port=of_ports[2])
def runTest(self): vlan_tags = [{'type': 0x8100, 'vid': 3, 'pcp': 1}] mpls_tags = [{'type': 0x8847, 'label': 22, 'tc': 2, 'ttl': 48}] ing_port = exact_port_map.keys()[0] egr_port = exact_port_map.keys()[1] #"clear swtich;" testutils.delete_all_flows(self.controller, self.logger) 'make packet' pkt = testutils.simple_tcp_packet(dl_src='00:01:02:03:04:05', dl_dst='00:06:07:08:09:0a', \ vlan_tags = vlan_tags, mpls_tags = mpls_tags) 'table 0 goto table3' match_ls = testutils.packet_to_exact_flow_match( pkt=pkt, table_id=testutils.EX_ACL_TABLE, ing_port=ing_port) exact_table_goto_table(self, testutils.EX_ACL_TABLE, testutils.EX_L2_TABLE, match_ls) "set table 3 not match, continue" testutils.set_table_config(self, testutils.EX_L2_TABLE, ofp.OFPTC_TABLE_MISS_DROP, True) 'table 4 output' match_ls = testutils.packet_to_exact_flow_match( pkt, None, testutils.EX_VLAN_TABLE, ing_port) exact_table_output(self, testutils.EX_VLAN_TABLE, match_ls, egr_port=egr_port) "send a packet from ing_port " self.dataplane.send(ing_port, str(pkt)) # checks no response from controller and dataplane (response, _) = self.controller.poll(ofp.OFPT_PACKET_IN, 2) # self.assertIsNone() is preferable for newer python self.assertFalse(response is not None, "PacketIn message is received") (_, rcv_pkt, _) = self.dataplane.poll(timeout=5) self.assertFalse(rcv_pkt is not None, "Packet on dataplane")
def handleFlow(self, pkttype='TCP'): of_ports = pa_port_map.keys() of_ports.sort() self.assertTrue(len(of_ports) > 1, "Not enough ports for test") if (pkttype == 'ICMP'): pkt = testutils.simple_icmp_packet() table_id = testutils.EX_ICMP_TABLE else: pkt = testutils.simple_tcp_packet() table_id = testutils.WC_ACL_TABLE for idx in range(len(of_ports)): rv = testutils.delete_all_flows(self.controller, pa_logger) self.assertEqual(rv, 0, "Failed to delete all flows") testutils.set_table_config(self, table_id, ofp.OFPTC_TABLE_MISS_CONTINUE) ingress_port = of_ports[idx] egress_port = of_ports[(idx + 1) % len(of_ports)] pa_logger.info("Ingress " + str(ingress_port) + " to egress " + str(egress_port)) #controller send flow mod to switch request = testutils.flow_msg_create(self, pkt, ing_port=ingress_port, egr_port=egress_port, table_id=table_id) testutils.flow_msg_install(self, request) #user send pkt to switch pa_logger.info("Sending packet to dp port " + str(ingress_port)) self.dataplane.send(ingress_port, str(pkt)) testutils.receive_pkt_verify(self, egress_port, pkt)
def runTest(self): vlan_tags = [{'type': 0x8100, 'vid': 3, 'pcp': 1}] mpls_tags = [{'type': 0x8847, 'label': 22, 'tc': 2, 'ttl': 48}] ing_port = exact_port_map.keys()[0] egr_port = exact_port_map.keys()[1] #"clear swtich;" testutils.delete_all_flows(self.controller, self.logger) 'make packet' pkt = testutils.simple_tcp_packet(dl_src='00:01:02:03:04:05', dl_dst='00:06:07:08:09:0a', \ vlan_tags = vlan_tags, mpls_tags = mpls_tags) 'table 0 goto table3' match_ls = testutils.packet_to_exact_flow_match( pkt=pkt, table_id=testutils.EX_ACL_TABLE, ing_port=ing_port) exact_table_goto_table(self, testutils.EX_ACL_TABLE, testutils.EX_L2_TABLE, match_ls) "set table 3 not match, continue" testutils.set_table_config(self, testutils.EX_L2_TABLE, ofp.OFPTC_TABLE_MISS_CONTINUE, True) 'table 4 output' match_ls = testutils.packet_to_exact_flow_match( pkt=pkt, table_id=testutils.EX_VLAN_TABLE, ing_port=ing_port) exact_table_output(self, testutils.EX_VLAN_TABLE, match_ls, egr_port=egr_port) "send a packet from ing_port " self.dataplane.send(ing_port, str(pkt)) 'verify the rec data' testutils.receive_pkt_verify(self, egr_port, pkt)
def runTest(self): """ Set table config as "Continue" and add flow entry: First Table; Match IP Src A; send to 1 // not match then continue Second Table; Match IP Src B; send to 2 // do execution Then send in 2 packets: IP B; expect out port 2 """ of_ports = testutils.clear_switch(self, pa_port_map.keys(), pa_logger) # Set table config as "continue" testutils.set_table_config(self, testutils.WC_ACL_TABLE, ofp.OFPTC_TABLE_MISS_CONTINUE, True) # Set up flow entries #write_output(self, testutils.EX_ACL_TABLE, of_ports[0], ip_src="192.168.1.10") testutils.write_output(self, testutils.WC_ACL_TABLE, of_ports[0], ip_src="192.168.1.10") testutils.write_output(self, testutils.WC_SERV_TABLE, of_ports[1], of_ports[2], ip_src="192.168.1.70") testutils.do_barrier(self.controller) # Generate a packet not matching in the first table, but in the second testutils.reply_check_dp(self, ip_src='192.168.1.70', tcp_sport=1234, ing_port=of_ports[2], egr_port=of_ports[1])
def runTest(self): """ Add five flow entries: First Table; Match IP Src A; send to 1 Second Table; Match IP Src B; send to 1 Third Table; Match IP Src C; send to 1 Fourth Table; Match IP Src D; send to 1 Then send in 2 packets: IP F, TCP C; expect packet_in IP G, TCP B; expect packet_in @param self object instance @param first_table first table @param second_table second table @param third_table third table @param fourth_table fourth table """ of_ports = testutils.clear_switch(self, pa_port_map.keys(), pa_logger) # Set up matches #write_output(self, testutils.EX_ACL_TABLE, 1, ip_src="192.168.1.10") #write_output(self, testutils.EX_ACL_TABLE, of_ports[0], ip_src="128.128.128.10") testutils.set_table_config(self, config = ofp.OFPTC_TABLE_MISS_CONTROLLER) testutils.write_output(self, testutils.WC_ACL_TABLE, of_ports[0], ip_src="192.168.1.10") testutils.write_output(self, testutils.WC_SERV_TABLE, of_ports[0], ing_port=of_ports[1], ip_src="192.168.1.20") testutils.write_output(self, testutils.EX_L2_TABLE, of_ports[0], ip_src="192.168.1.30") testutils.write_output(self, testutils.EX_L3_TABLE, of_ports[0], ip_src="192.168.1.40") # Generate a packet not matching to any flow, then packet_in testutils.reply_check_ctrl(self, ip_src='192.168.1.70', tcp_sport=1234, ing_port = of_ports[2])
def runTest(self): of_ports = testutils.clear_switch(self, exact_port_map.keys(), exact_logger)#zhaoxiuchu vlan_tags=[{'type': 0x8100, 'vid': 3, 'pcp': 1}] mpls_tags=[{'type': 0x8847, 'label': 22, 'tc': 2, 'ttl': 48}] ing_port = exact_port_map.keys()[0] egr_port = exact_port_map.keys()[1] #"clear swtich;" #testutils.delete_all_flows(self.controller, self.logger) 'make packet' pkt = testutils.simple_tcp_packet(dl_src='00:01:02:03:04:05', dl_dst='00:06:07:08:09:0a', \ vlan_tags = vlan_tags, mpls_tags = mpls_tags) 'table 0 goto table3' match_ls = testutils.packet_to_exact_flow_match(pkt = pkt, table_id = testutils.EX_ACL_TABLE, ing_port = ing_port) exact_table_goto_table(self, testutils.EX_ACL_TABLE, testutils.EX_L2_TABLE, match_ls) "set table 3 not match, continue" testutils.set_table_config(self, testutils.EX_L2_TABLE, ofp.OFPTC_TABLE_MISS_CONTROLLER, True) 'table 4 output' match_ls = testutils.packet_to_exact_flow_match(pkt = pkt, table_id = testutils.EX_VLAN_TABLE, ing_port = ing_port) exact_table_output(self, testutils.EX_VLAN_TABLE, match_ls, egr_port = egr_port) "send a packet from ing_port " self.dataplane.send(ing_port, str(pkt)) # checks no response from controller and dataplane (response, _) = self.controller.poll(ofp.OFPT_PACKET_IN, 2) # self.assertIsNone() is preferable for newer python self.assertTrue(response is not None, "PacketIn message is not received") (_, rcv_pkt, _) = self.dataplane.poll(timeout=5) self.assertFalse(rcv_pkt is not None, "Packet on dataplane")
def handleFlow(self, pkttype='TCP'): of_ports = pa_port_map.keys() of_ports.sort() self.assertTrue(len(of_ports) > 1, "Not enough ports for test") if (pkttype == 'ICMP'): pkt = testutils.simple_icmp_packet() table_id = testutils.EX_ICMP_TABLE else: pkt = testutils.simple_tcp_packet() table_id = testutils.WC_ACL_TABLE for idx in range(len(of_ports)): rv = testutils.delete_all_flows(self.controller, pa_logger) self.assertEqual(rv, 0, "Failed to delete all flows") testutils.set_table_config(self, table_id, ofp.OFPTC_TABLE_MISS_CONTINUE) ingress_port = of_ports[idx] egress_port = of_ports[(idx + 1) % len(of_ports)] pa_logger.info("Ingress " + str(ingress_port) + " to egress " + str(egress_port)) #controller send flow mod to switch request = testutils.flow_msg_create(self,pkt, ing_port=ingress_port, egr_port=egress_port, table_id=table_id) testutils.flow_msg_install(self, request) #user send pkt to switch pa_logger.info("Sending packet to dp port " + str(ingress_port)) self.dataplane.send(ingress_port, str(pkt)) testutils.receive_pkt_verify(self, egress_port, pkt)
def runTest(self): """ Set the first table config as "Drop" and second table as "Controller" add flow entry: First Table; Match IP Src A; send to 1 // if not match, then drop Second Table; Match IP Src B; send to 2 // if not match, controller Then send in a packet: IP B; expect drop """ of_ports = testutils.clear_switch(self, pa_port_map.keys(), pa_logger) # Set table config as "drop" and "send to controller" testutils.set_table_config(self, testutils.WC_ACL_TABLE, ofp.OFPTC_TABLE_MISS_DROP, True) testutils.set_table_config(self, testutils.WC_SERV_TABLE, ofp.OFPTC_TABLE_MISS_CONTROLLER, True) # Set up first match testutils.write_output(self, testutils.WC_ACL_TABLE, of_ports[0], ip_src="192.168.1.10") testutils.write_output(self, testutils.WC_SERV_TABLE, of_ports[1], of_ports[2], ip_src="192.168.1.70") # Generate a packet not matching to any flow, then drop pkt = testutils.simple_tcp_packet(ip_src='192.168.1.70', tcp_sport=10) self.dataplane.send(of_ports[2], str(pkt)) # checks no response from controller and dataplane (response, _) = self.controller.poll(ofp.OFPT_PACKET_IN, 2) # self.assertIsNone() is preferable for newer python self.assertFalse(response is not None, "PacketIn message is received") (_, rcv_pkt, _) = self.dataplane.poll(timeout=5) self.assertFalse(rcv_pkt is not None, "Packet on dataplane")
def runTest(self): #async_logger.info("Running Async_NoPacketIn") #verifying without set_async_request, switch will packet in #step 1-1:clear all flow entries for unmatching of_ports = testutils.clear_switch(self, async_port_map.keys(), async_logger) #step 2-1:controller sends set_async_request msg async_logger.info("Sending set_async_request") mask = 1 << ofp.OFPR_NO_MATCH request_set = create_set_async(pkt_in_mstr = mask) #print(request_set.show()) set_async_verify(self, request_set) #result 2-1: contrller sends msg successfully #no match default deal:drop; add flow entry to packet_in #step 3-1: install default mismatch flow entry ,action=packetin; testutils.set_table_config(self, config = ofp.OFPTC_TABLE_MISS_CONTROLLER) #send data to port for of_port in of_ports: async_logger.info("PKT IN test, port " + str(of_port)) pkt = testutils.simple_tcp_packet() self.dataplane.send(of_port, str(pkt)) #@todo Check for unexpected messages? testutils.packetin_verify(self, pkt) #print(response) #"verifying with set_async_request, switch will packet in" #step 1-2:clear all flow entries for unmatching rc = testutils.clear_switch(self, async_port_map.keys(), async_logger) #step 2-2:controller sends set_async_request msg async_logger.info("Sending set_async_request") mask = 0xffffffff ^ (1 << ofp.OFPR_NO_MATCH) request_set = create_set_async(pkt_in_mstr = mask) set_async_verify(self, request_set) #print("2-2 request_set"+request_set.show()) #result 2-2: contrller sends msg successfully #no match default deal:drop; add flow entry to packet_in #step 3-2: install default mismatch flow entry ,action=packetin; testutils.set_table_config(self, config = ofp.OFPTC_TABLE_MISS_CONTROLLER) #(response, _) = self.controller.poll(ofp.OFPT_PACKET_IN, 2) #send data to port for of_port in async_port_map.keys(): async_logger.info("PKT IN test, port " + str(of_port)) pkt = testutils.simple_tcp_packet() self.dataplane.send(of_port, str(pkt)) #@todo Check for unexpected messages? (response, _) = self.controller.poll(ofp.OFPT_PACKET_IN, 2) #print(response) self.assertTrue(response is None, 'Packet in message received unexpected') msg = create_set_async() set_async_verify(self, msg)
def runTest(self): """ Add five flow entries: First Table; Match IP Src A; send to 1 Second Table; Match IP Src B; send to 1 Third Table; Match IP Src C; send to 1 Fourth Table; Match IP Src D; send to 1 Then send in 2 packets: IP F, TCP C; expect packet_in IP G, TCP B; expect packet_in @param self object instance @param first_table first table @param second_table second table @param third_table third table @param fourth_table fourth table """ of_ports = testutils.clear_switch(self, pa_port_map.keys(), pa_logger) # Set up matches #write_output(self, testutils.EX_ACL_TABLE, 1, ip_src="192.168.1.10") #write_output(self, testutils.EX_ACL_TABLE, of_ports[0], ip_src="128.128.128.10") testutils.set_table_config(self, config=ofp.OFPTC_TABLE_MISS_CONTROLLER) testutils.write_output(self, testutils.WC_ACL_TABLE, of_ports[0], ip_src="192.168.1.10") testutils.write_output(self, testutils.WC_SERV_TABLE, of_ports[0], ing_port=of_ports[1], ip_src="192.168.1.20") testutils.write_output(self, testutils.EX_L2_TABLE, of_ports[0], ip_src="192.168.1.30") testutils.write_output(self, testutils.EX_L3_TABLE, of_ports[0], ip_src="192.168.1.40") # Generate a packet not matching to any flow, then packet_in testutils.reply_check_ctrl(self, ip_src='192.168.1.70', tcp_sport=1234, ing_port=of_ports[2])
def runTest(self): of_ports = ipv6_port_map.keys() of_ports.sort() ing_port = of_ports[0] egr_port = of_ports[2] table_id = testutils.WC_L3_TABLE # Remove all entries Add entry match all rc = testutils.delete_all_flows(self.controller, self.logger) self.assertEqual(rc, 0, "Failed to delete all flows") rv = testutils.set_table_config(self, table_id) self.assertEqual(rv, 0, "Failed to set table config") # Add entry match pkt = testutils.simple_ipv6_packet() request = testutils.flow_msg_create(self, pkt, ing_port = ing_port, egr_port = egr_port, table_id = table_id) testutils.flow_msg_install(self, request) #Send packet self.logger.info("Sending IPv6 packet to " + str(ing_port)) self.logger.debug("Data: " + str(pkt).encode('hex')) self.dataplane.send(ing_port, str(pkt)) #Receive packet testutils.receive_pkt_verify(self, egr_port, pkt) #Remove flows rc = testutils.delete_all_flows(self.controller, self.logger) self.assertEqual(rc, 0, "Failed to delete all flows")
def runTest(self): of_ports = ipv6_port_map.keys() of_ports.sort() ing_port = of_ports[0] egr_port = of_ports[2] table_id = testutils.WC_L3_TABLE # Remove all entries Add entry match all rc = testutils.delete_all_flows(self.controller, self.logger) self.assertEqual(rc, 0, "Failed to delete all flows") rv = testutils.set_table_config(self, table_id) self.assertEqual(rv, 0, "Failed to set table config") # Add entry match pkt = testutils.simple_ipv6_packet() request = testutils.flow_msg_create(self, pkt, ing_port=ing_port, egr_port=egr_port, table_id=table_id) testutils.flow_msg_install(self, request) #Send packet self.logger.info("Sending IPv6 packet to " + str(ing_port)) self.logger.debug("Data: " + str(pkt).encode('hex')) self.dataplane.send(ing_port, str(pkt)) #Receive packet testutils.receive_pkt_verify(self, egr_port, pkt) #Remove flows rc = testutils.delete_all_flows(self.controller, self.logger) self.assertEqual(rc, 0, "Failed to delete all flows")
def runTest(self): # Construct packet to send to dataplane # Send packet to dataplane, once to each port # Poll controller with expect message type packet in of_ports = testutils.clear_switch(self, basic_port_map.keys(), basic_logger) testutils.set_table_config(self, 0, ofp.OFPTC_TABLE_MISS_CONTROLLER, True) #_,miss_send_len = testutils.get_config_reply_verify(self) testutils.set_config_verify(self, max_len = ofp.OFPCML_NO_BUFFER) for of_port in basic_port_map.keys(): basic_logger.info("PKT IN test, port " + str(of_port)) pkt = testutils.simple_tcp_packet() self.dataplane.send(of_port, str(pkt)) #@todo Check for unexpected messages? testutils.packetin_verify(self, pkt, ofp.OFPCML_NO_BUFFER) response,_ = self.controller.poll(ofp.OFPT_PACKET_IN, 1) while response != None: response,_ = self.controller.poll(ofp.OFPT_PACKET_IN, 1) testutils.set_config_verify(self, max_len = DEFAULT_MISS_SEND_LEN)
def runTest(self): # Construct packet to send to dataplane # Send packet to dataplane, once to each port # Poll controller with expect message type packet in of_ports = testutils.clear_switch(self, basic_port_map.keys(), basic_logger) testutils.set_table_config(self, 0, ofp.OFPTC_TABLE_MISS_CONTROLLER, True) #_,miss_send_len = testutils.get_config_reply_verify(self) testutils.set_config_verify(self, max_len=ofp.OFPCML_NO_BUFFER) for of_port in basic_port_map.keys(): basic_logger.info("PKT IN test, port " + str(of_port)) pkt = testutils.simple_tcp_packet() self.dataplane.send(of_port, str(pkt)) #@todo Check for unexpected messages? testutils.packetin_verify(self, pkt, ofp.OFPCML_NO_BUFFER) response, _ = self.controller.poll(ofp.OFPT_PACKET_IN, 1) while response != None: response, _ = self.controller.poll(ofp.OFPT_PACKET_IN, 1) testutils.set_config_verify(self, max_len=DEFAULT_MISS_SEND_LEN)
def runTest(self): of_ports = pa_port_map.keys() ing_port = of_ports[1] egr_port =ofp.OFPP_CONTROLLER "clear swtich;" testutils.delete_all_flows(self.controller, self.logger) # Set table config as "continue" testutils.set_table_config(self, testutils.WC_ACL_TABLE, ofp.OFPTC_TABLE_MISS_CONTINUE, True) testutils.set_table_config(self, testutils.WC_SERV_TABLE, ofp.OFPTC_TABLE_MISS_DROP, True) testutils.set_table_config(self, testutils.EX_L2_TABLE, ofp.OFPTC_TABLE_MISS_CONTROLLER, True) #"make test packet;" pkt = testutils.simple_icmp_packet() inst_write_metadata = instruction.instruction_write_metadata(); inst_write_metadata.metadata = 0x20000000 inst_write_metadata.metadata_mask = 0xf0000000 testutils.write_goto(self, testutils.WC_SERV_TABLE, testutils.EX_L2_TABLE, ing_port, add_inst = inst_write_metadata) pkt_metadata = {'metadata_val':inst_write_metadata.metadata, 'metadata_msk':inst_write_metadata.metadata_mask} match_fields = testutils.packet_to_exact_flow_match(pkt_metadata = pkt_metadata, table_id = testutils.EX_L2_TABLE) testutils.write_output(self, testutils.EX_L2_TABLE, egr_port, match_fields=match_fields) self.dataplane.send(ing_port, str(pkt)) (response, _) = self.controller.poll(ofp.OFPT_PACKET_IN, 2) self.assertTrue(response is not None, 'Packet in message not received on port ' + str(egr_port)) if str(pkt) != response.data: pa_logger.debug("pkt len " + str(len(str(pkt))) +": " + str(pkt)) pa_logger.debug("resp len " + str(len(str(response.data))) + ": " + str(response.data))
def runTest(self): vlan_tags=[{'type': 0x8100, 'vid': 3, 'pcp': 1}] mpls_tags=[{'type': 0x8847, 'label': 22, 'tc': 2, 'ttl': 48}] ing_port = exact_port_map.keys()[0] egr_port = exact_port_map.keys()[1] #"clear swtich;" testutils.delete_all_flows(self.controller, self.logger) 'make packet' pkt = testutils.simple_tcp_packet(dl_src='00:01:02:03:04:05', dl_dst='00:06:07:08:09:0a', \ vlan_tags = vlan_tags, mpls_tags = mpls_tags) 'table 0 goto table3' match_ls = testutils.packet_to_exact_flow_match(pkt = pkt, table_id = testutils.EX_ACL_TABLE, ing_port = ing_port) exact_table_goto_table(self, testutils.EX_ACL_TABLE, testutils.EX_L2_TABLE, match_ls) "set table 3 not match, continue" testutils.set_table_config(self, testutils.EX_L2_TABLE, ofp.OFPTC_TABLE_MISS_CONTINUE, True) 'table 4 output' match_ls = testutils.packet_to_exact_flow_match(pkt = pkt, table_id = testutils.EX_VLAN_TABLE, ing_port = ing_port) exact_table_output(self, testutils.EX_VLAN_TABLE, match_ls, egr_port = egr_port) "send a packet from ing_port " self.dataplane.send(ing_port, str(pkt)) 'verify the rec data' testutils.receive_pkt_verify(self, egr_port, pkt)
def runTest(self): """ Set the first table config as "Send to Controller" and the second table as "Drop", add flow entries: First Table; Match IP Src A; send to 1 // if not match, packet_in Second Table; Match IP Src B; send to 2 // if not match, drop Then send a packet: IP B; expect packet_in """ of_ports = testutils.clear_switch(self, pa_port_map.keys(), pa_logger) # Set table config as "send to controller" and "drop" testutils.set_table_config(self, testutils.WC_ACL_TABLE, ofp.OFPTC_TABLE_MISS_CONTROLLER, True) testutils.set_table_config(self, testutils.WC_SERV_TABLE, ofp.OFPTC_TABLE_MISS_DROP, True) # Set up matches testutils.write_output(self, testutils.WC_ACL_TABLE, of_ports[0], ip_src="192.168.1.10") testutils.write_output(self, testutils.WC_SERV_TABLE, of_ports[1], of_ports[2], ip_src="192.168.1.70") # Generate a packet not matching to any flow entry in the first table testutils.reply_check_ctrl(self, ip_src='192.168.1.70', tcp_sport=1234, ing_port = of_ports[2])
def runTest(self): """ Set table config as "Continue" and add flow entry: First Table; Match IP Src A; send to 1 // not match then continue Second Table; Match IP Src B; send to 2 // do execution Then send in 2 packets: IP B; expect out port 2 """ of_ports = testutils.clear_switch(self, pa_port_map.keys(), pa_logger) # Set table config as "continue" testutils.set_table_config(self, testutils.WC_ACL_TABLE, ofp.OFPTC_TABLE_MISS_CONTINUE, True) # Set up flow entries #write_output(self, testutils.EX_ACL_TABLE, of_ports[0], ip_src="192.168.1.10") testutils.write_output(self, testutils.WC_ACL_TABLE, of_ports[0], ip_src="192.168.1.10") testutils.write_output(self, testutils.WC_SERV_TABLE, of_ports[1], of_ports[2], ip_src="192.168.1.70") testutils.do_barrier(self.controller) # Generate a packet not matching in the first table, but in the second testutils.reply_check_dp(self, ip_src='192.168.1.70', tcp_sport=1234, ing_port = of_ports[2], egr_port = of_ports[1])
def runTest(self): of_ports = pa_port_map.keys() ing_port = of_ports[1] egr_port = ofp.OFPP_CONTROLLER "clear swtich;" testutils.delete_all_flows(self.controller, self.logger) # Set table config as "continue" testutils.set_table_config(self, testutils.WC_ACL_TABLE, ofp.OFPTC_TABLE_MISS_CONTINUE, True) testutils.set_table_config(self, testutils.WC_SERV_TABLE, ofp.OFPTC_TABLE_MISS_DROP, True) testutils.set_table_config(self, testutils.EX_L2_TABLE, ofp.OFPTC_TABLE_MISS_CONTROLLER, True) #"make test packet;" pkt = testutils.simple_icmp_packet() inst_write_metadata = instruction.instruction_write_metadata() inst_write_metadata.metadata = 0x20000000 inst_write_metadata.metadata_mask = 0xf0000000 testutils.write_goto(self, testutils.WC_SERV_TABLE, testutils.EX_L2_TABLE, ing_port, add_inst=inst_write_metadata) pkt_metadata = { 'metadata_val': inst_write_metadata.metadata, 'metadata_msk': inst_write_metadata.metadata_mask } match_fields = testutils.packet_to_exact_flow_match( pkt_metadata=pkt_metadata, table_id=testutils.EX_L2_TABLE) testutils.write_output(self, testutils.EX_L2_TABLE, egr_port, match_fields=match_fields) self.dataplane.send(ing_port, str(pkt)) (response, _) = self.controller.poll(ofp.OFPT_PACKET_IN, 2) self.assertTrue( response is not None, 'Packet in message not received on port ' + str(egr_port)) if str(pkt) != response.data: pa_logger.debug("pkt len " + str(len(str(pkt))) + ": " + str(pkt)) pa_logger.debug("resp len " + str(len(str(response.data))) + ": " + str(response.data))
def runTest(self): of_ports = ipv6_port_map.keys() of_ports.sort() ing_port = of_ports[0] egr_port = of_ports[2] table_id1 = testutils.EX_L3_TABLE table_id2 = testutils.WC_ALL_TABLE # Remove all entries Add entry match all rc = testutils.delete_all_flows(self.controller, ipv6_logger) self.assertEqual(rc, 0, "Failed to delete all flows") rv = testutils.set_table_config(self, table_id=table_id1) self.assertEqual(rv, 0, "Failed to set table config") # Add entry match pkt = testutils.simple_ipv6_packet(ip_dst='fe80::1:0:1234') pkt_metadata = { 'metadata_val': 0xabcdef0123456789, 'metadata_msk': 0xffffffffffffffff } inst_ls1 = [] inst1_write = instruction.instruction_write_metadata() inst1_write.metadata = pkt_metadata['metadata_val'] inst1_write.metadata_mask = pkt_metadata['metadata_msk'] inst1_goto = instruction.instruction_goto_table() inst1_goto.table_id = table_id2 inst_ls1.append(inst1_write) inst_ls1.append(inst1_goto) request1 = testutils.flow_msg_create(self, pkt, ing_port=ing_port, instruction_list=inst_ls1, table_id=table_id1) testutils.flow_msg_install(self, request1) act_ls2 = [] act2_setfld = action.action_set_field() act2_setfld.field = match.ipv6_dst( ipaddr.IPv6Address('fe80::1:6554:3e7f:1')) act2_out = action.action_output() act2_out.port = egr_port act_ls2.append(act2_setfld) act_ls2.append(act2_out) pkt_metadata = { 'metadata_val': 0xabcdef0100000000, 'metadata_msk': 0xffffffff00000000 } request2 = testutils.flow_msg_create(self, pkt, pkt_metadata, ing_port, action_list=act_ls2, table_id=table_id2) testutils.flow_msg_install(self, request2) #Send packet ipv6_logger.info("Sending IPv6 packet to " + str(ing_port)) ipv6_logger.debug("Data: " + str(pkt).encode('hex')) self.dataplane.send(ing_port, str(pkt)) #Receive packet exp_pkt = testutils.simple_ipv6_packet(ip_dst='fe80::1:6554:3e7f:1') testutils.receive_pkt_verify(self, egr_port, exp_pkt) #See flow match response = testutils.flow_stats_get(self) ipv6_logger.debug("Response" + response.show()) #Remove flows rc = testutils.delete_all_flows(self.controller, ipv6_logger) self.assertEqual(rc, 0, "Failed to delete all flows")
def runTest(self): of_ports = ipv6_port_map.keys() of_ports.sort() ing_port = of_ports[0] egr_port = of_ports[2] table_id1 = testutils.EX_L3_TABLE table_id2 = testutils.WC_ALL_TABLE # Remove all entries Add entry match all rc = testutils.delete_all_flows(self.controller, ipv6_logger) self.assertEqual(rc, 0, "Failed to delete all flows") rv = testutils.set_table_config(self, table_id = table_id1) self.assertEqual(rv, 0, "Failed to set table config") # Add entry match pkt = testutils.simple_ipv6_packet(ip_dst='fe80::1:0:1234') pkt_metadata = {'metadata_val':0xabcdef0123456789, 'metadata_msk':0xffffffffffffffff} inst_ls1 = [] inst1_write = instruction.instruction_write_metadata() inst1_write.metadata = pkt_metadata['metadata_val'] inst1_write.metadata_mask = pkt_metadata['metadata_msk'] inst1_goto = instruction.instruction_goto_table() inst1_goto.table_id = table_id2 inst_ls1.append(inst1_write) inst_ls1.append(inst1_goto) request1 = testutils.flow_msg_create(self, pkt, ing_port = ing_port, instruction_list = inst_ls1, table_id = table_id1) testutils.flow_msg_install(self, request1) act_ls2 = [] act2_setfld = action.action_set_field() act2_setfld.field = match.ipv6_dst(ipaddr.IPv6Address('fe80::1:6554:3e7f:1')) act2_out = action.action_output() act2_out.port = egr_port act_ls2.append(act2_setfld) act_ls2.append(act2_out) pkt_metadata = {'metadata_val':0xabcdef0100000000, 'metadata_msk':0xffffffff00000000} request2 = testutils.flow_msg_create(self, pkt, pkt_metadata, ing_port, action_list = act_ls2, table_id = table_id2) testutils.flow_msg_install(self, request2) #Send packet ipv6_logger.info("Sending IPv6 packet to " + str(ing_port)) ipv6_logger.debug("Data: " + str(pkt).encode('hex')) self.dataplane.send(ing_port, str(pkt)) #Receive packet exp_pkt = testutils.simple_ipv6_packet(ip_dst='fe80::1:6554:3e7f:1') testutils.receive_pkt_verify(self, egr_port, exp_pkt) #See flow match response = testutils.flow_stats_get(self) ipv6_logger.debug("Response" + response.show()) #Remove flows rc = testutils.delete_all_flows(self.controller, ipv6_logger) self.assertEqual(rc, 0, "Failed to delete all flows")
def flow_match_test_port_pair_vlan_two_tables( parent, ing_port, egr_port, wildcards=0, dl_vlan=-1, dl_vlan_pcp=0, dl_vlan_type=ETHERTYPE_VLAN, dl_vlan_int=-1, dl_vlan_pcp_int=0, vid_match_tbl0=ofp.OFPVID_NONE, pcp_match_tbl0=0, action_list_tbl0=None, check_expire_tbl0=False, match_exp_tbl0=True, exp_msg_tbl0=ofp.OFPT_FLOW_REMOVED, exp_msg_type_tbl0=0, exp_msg_code_tbl0=0, vid_match_tbl1=ofp.OFPVID_NONE, pcp_match_tbl1=0, action_list_tbl1=None, check_expire_tbl1=False, match_exp_tbl1=True, exp_msg_tbl1=ofp.OFPT_FLOW_REMOVED, exp_msg_type_tbl1=0, exp_msg_code_tbl1=0, exp_vid=-1, exp_pcp=0, exp_vlan_type=ETHERTYPE_VLAN, add_tag_exp=False, pkt=None, exp_pkt=None): """ Flow match test for various vlan matching patterns on single TCP packet Run test with packet through switch from ing_port to egr_port See flow_match_test for parameter descriptions """ parent.logger.info("Pkt match test: " + str(ing_port) + " to " + str(egr_port)) parent.logger.debug(" WC: " + hex(wildcards) + " vlan: " + str(dl_vlan) + " expire_table0: " + str(check_expire_tbl0) + " expire_table1: " + str(check_expire_tbl1)) if pkt is None: if dl_vlan > 0: if dl_vlan_int > 0: pkt = testutils.simple_tcp_packet( vlan_tags=[{ 'type': dl_vlan_type, 'vid': dl_vlan, 'pcp': dl_vlan_pcp }, { 'type': dl_vlan_type, 'vid': dl_vlan_int, 'pcp': dl_vlan_pcp_int }]) else: pkt = testutils.simple_tcp_packet(vlan_tags=[{ 'type': dl_vlan_type, 'vid': dl_vlan, 'pcp': dl_vlan_pcp }]) else: pkt = testutils.simple_tcp_packet() if exp_pkt is None: if exp_vid > 0: if add_tag_exp: if dl_vlan > 0: if dl_vlan_int > 0: exp_pkt = testutils.simple_tcp_packet( vlan_tags=[{ 'type': dl_vlan_type, 'vid': dl_vlan, 'pcp': dl_vlan_pcp }, { 'type': dl_vlan_type, 'vid': dl_vlan_int, 'pcp': dl_vlan_pcp_int }]) else: #Push one more tag in either case exp_pkt = testutils.simple_tcp_packet( vlan_tags=[{ 'type': exp_vlan_type, 'vid': exp_vid, 'pcp': exp_pcp }, { 'type': dl_vlan_type, 'vid': dl_vlan, 'pcp': dl_vlan_pcp }]) else: exp_pkt = testutils.simple_tcp_packet( vlan_tags=[{ 'type': exp_vlan_type, 'vid': exp_vid, 'pcp': exp_pcp }]) else: if dl_vlan_int >= 0: exp_pkt = testutils.simple_tcp_packet( vlan_tags=[{ 'type': exp_vlan_type, 'vid': exp_vid, 'pcp': exp_pcp }, { 'type': dl_vlan_type, 'vid': dl_vlan_int, 'pcp': dl_vlan_pcp_int }]) else: exp_pkt = testutils.simple_tcp_packet( vlan_tags=[{ 'type': exp_vlan_type, 'vid': exp_vid, 'pcp': exp_pcp }]) else: #subtract action if dl_vlan_int > 0: exp_pkt = testutils.simple_tcp_packet( vlan_tags=[{ 'type': dl_vlan_type, 'vid': dl_vlan_int, 'pcp': dl_vlan_pcp_int }]) else: exp_pkt = testutils.simple_tcp_packet() table_id0 = testutils.EX_ACL_TABLE if dl_vlan > 0: table_id0 = testutils.EX_VLAN_TABLE testutils.delete_all_flows(parent.controller, parent.logger) if table_id0 != testutils.EX_ACL_TABLE: testutils.set_table_config(parent, table_id0) match_ls = testutils.packet_to_exact_flow_match(pkt, None, table_id0, ing_port) parent.assertTrue(match_ls is not None, "Flow match from pkt failed") #match.wildcards = wildcards # Flow Mod for Table0 inst = instruction.instruction_goto_table() if table_id0 == testutils.EX_ACL_TABLE: table_id1 = testutils.EX_VLAN_TABLE else: table_id1 = testutils.WC_ALL_TABLE inst.table_id = table_id1 inst_list = [inst] request0 = testutils.flow_msg_create( parent, pkt, ing_port=ing_port, instruction_list=inst_list, action_list=action_list_tbl0, wildcards=wildcards, egr_port=ofp.OFPP_LOCAL, match_fields=match_ls, check_expire=check_expire_tbl0, inst_app_flag=testutils.APPLY_ACTIONS_INSTRUCTION, table_id=table_id0) testutils.flow_msg_install(parent, request0) if exp_msg_tbl0 is not ofp.OFPT_ERROR: response, _ = parent.controller.poll(ofp.OFPT_ERROR, 1) if response is not None: parent.assertTrue( response is None, "Rcv: Unexpected Error Message: type " + str(response.type) + ", code " + str(response.code)) # Flow Mod for Table1 pkt1 = testutils.simple_tcp_packet(vlan_tags=[{ 'type': exp_vlan_type, 'vid': exp_vid, 'pcp': exp_pcp }]) match_ls1 = testutils.packet_to_exact_flow_match(pkt1, None, table_id1, ing_port) for i in range(len(match_ls1.items)): if match_ls1.items[i].field == ofp.OFPXMT_OFB_VLAN_VID: if vid_match_tbl1 > ofp.OFPVID_NONE: match_ls1.items[i].value = vid_match_tbl1 + ofp.OFPVID_PRESENT break else: del match_ls1.items[i] break for i in range(len(match_ls1.items)): if match_ls1.items[i].field == ofp.OFPXMT_OFB_VLAN_PCP: if vid_match_tbl1 > ofp.OFPVID_NONE: match_ls1.items[i].value = pcp_match_tbl1 break else: del match_ls1.items[i] break request1 = testutils.flow_msg_create(parent, pkt, ing_port=ing_port, action_list=action_list_tbl1, wildcards=wildcards, match_fields=match_ls1, check_expire=check_expire_tbl1, table_id=table_id1, egr_port=egr_port) testutils.flow_msg_install(parent, request1) if exp_msg_tbl1 is not ofp.OFPT_ERROR: response, _ = parent.controller.poll(ofp.OFPT_ERROR, 1) if response is not None: parent.assertTrue( response is None, "Rcv: Unexpected Error Message: type " + str(response.type) + ", code " + str(response.code)) parent.logger.debug("Send packet: " + str(ing_port) + " to " + str(egr_port)) parent.dataplane.send(ing_port, str(pkt)) if match_exp_tbl0: if check_expire_tbl0: #@todo Not all HW supports both pkt and byte counters #@todo We shouldn't expect the order of coming response.. flow_removed_verify(parent, request0, pkt_count=1, byte_count=len(exp_pkt)) else: if exp_msg_tbl0 is ofp.OFPT_FLOW_REMOVED: if check_expire_tbl0: flow_removed_verify(parent, request0, pkt_count=0, byte_count=0) elif exp_msg_tbl0 is ofp.OFPT_ERROR: error_verify(parent, exp_msg_type_tbl0, exp_msg_code_tbl0) else: parent.assertTrue(0, "Rcv: Unexpected Message: " + str(exp_msg_tbl0)) if match_exp_tbl1: if check_expire_tbl1: #@todo Not all HW supports both pkt and byte counters #@todo We shouldn't expect the order of coming response.. flow_removed_verify(parent, request1, pkt_count=1, byte_count=len(exp_pkt)) else: if exp_msg_tbl1 is ofp.OFPT_FLOW_REMOVED: if check_expire_tbl1: flow_removed_verify(parent, request1, pkt_count=0, byte_count=0) elif exp_msg_tbl1 is ofp.OFPT_ERROR: error_verify(parent, exp_msg_type_tbl1, exp_msg_code_tbl1) else: parent.assertTrue(0, "Rcv: Unexpected Message: " + str(exp_msg_tbl1)) if match_exp_tbl0 and match_exp_tbl1: testutils.receive_pkt_verify(parent, egr_port, exp_pkt) else: (_, rcv_pkt, _) = parent.dataplane.poll(timeout=1) parent.assertFalse(rcv_pkt is not None, "Packet on dataplane")
def runTest(self): #async_logger.info("Running Async_NoPacketIn") #verifying without set_async_request, switch will packet in #step 1-1:clear all flow entries for unmatching of_ports = testutils.clear_switch(self, async_port_map.keys(), async_logger) #step 2-1:controller sends set_async_request msg async_logger.info("Sending set_async_request") mask = 1 << ofp.OFPR_NO_MATCH request_set = create_set_async(pkt_in_mstr=mask) #print(request_set.show()) set_async_verify(self, request_set) #result 2-1: contrller sends msg successfully #no match default deal:drop; add flow entry to packet_in #step 3-1: install default mismatch flow entry ,action=packetin; testutils.set_table_config(self, config=ofp.OFPTC_TABLE_MISS_CONTROLLER) #send data to port for of_port in of_ports: async_logger.info("PKT IN test, port " + str(of_port)) pkt = testutils.simple_tcp_packet() self.dataplane.send(of_port, str(pkt)) #@todo Check for unexpected messages? testutils.packetin_verify(self, pkt) #print(response) #"verifying with set_async_request, switch will packet in" #step 1-2:clear all flow entries for unmatching rc = testutils.clear_switch(self, async_port_map.keys(), async_logger) #step 2-2:controller sends set_async_request msg async_logger.info("Sending set_async_request") mask = 0xffffffff ^ (1 << ofp.OFPR_NO_MATCH) request_set = create_set_async(pkt_in_mstr=mask) set_async_verify(self, request_set) #print("2-2 request_set"+request_set.show()) #result 2-2: contrller sends msg successfully #no match default deal:drop; add flow entry to packet_in #step 3-2: install default mismatch flow entry ,action=packetin; testutils.set_table_config(self, config=ofp.OFPTC_TABLE_MISS_CONTROLLER) #(response, _) = self.controller.poll(ofp.OFPT_PACKET_IN, 2) #send data to port for of_port in async_port_map.keys(): async_logger.info("PKT IN test, port " + str(of_port)) pkt = testutils.simple_tcp_packet() self.dataplane.send(of_port, str(pkt)) #@todo Check for unexpected messages? (response, _) = self.controller.poll(ofp.OFPT_PACKET_IN, 2) #print(response) self.assertTrue(response is None, 'Packet in message received unexpected') msg = create_set_async() set_async_verify(self, msg)
def flow_match_test_port_pair_vlan_two_tables(parent, ing_port, egr_port, wildcards=0, dl_vlan=-1, dl_vlan_pcp=0, dl_vlan_type=ETHERTYPE_VLAN, dl_vlan_int=-1, dl_vlan_pcp_int=0, vid_match_tbl0=ofp.OFPVID_NONE, pcp_match_tbl0=0, action_list_tbl0=None, check_expire_tbl0=False, match_exp_tbl0=True, exp_msg_tbl0=ofp.OFPT_FLOW_REMOVED, exp_msg_type_tbl0=0, exp_msg_code_tbl0=0, vid_match_tbl1=ofp.OFPVID_NONE, pcp_match_tbl1=0, action_list_tbl1=None, check_expire_tbl1=False, match_exp_tbl1=True, exp_msg_tbl1=ofp.OFPT_FLOW_REMOVED, exp_msg_type_tbl1=0, exp_msg_code_tbl1=0, exp_vid=-1, exp_pcp=0, exp_vlan_type=ETHERTYPE_VLAN, add_tag_exp=False, pkt=None, exp_pkt=None): """ Flow match test for various vlan matching patterns on single TCP packet Run test with packet through switch from ing_port to egr_port See flow_match_test for parameter descriptions """ parent.logger.info("Pkt match test: " + str(ing_port) + " to " + str(egr_port)) parent.logger.debug(" WC: " + hex(wildcards) + " vlan: " + str(dl_vlan) + " expire_table0: " + str(check_expire_tbl0) + " expire_table1: " + str(check_expire_tbl1)) if pkt is None: if dl_vlan > 0: if dl_vlan_int > 0: pkt = testutils.simple_tcp_packet( vlan_tags=[{'type': dl_vlan_type, 'vid': dl_vlan, 'pcp': dl_vlan_pcp}, {'type': dl_vlan_type, 'vid': dl_vlan_int, 'pcp': dl_vlan_pcp_int}]) else: pkt = testutils.simple_tcp_packet( vlan_tags=[{'type': dl_vlan_type, 'vid': dl_vlan, 'pcp': dl_vlan_pcp}]) else: pkt = testutils.simple_tcp_packet() if exp_pkt is None: if exp_vid > 0: if add_tag_exp: if dl_vlan > 0: if dl_vlan_int > 0: exp_pkt = testutils.simple_tcp_packet( vlan_tags=[{'type': dl_vlan_type, 'vid': dl_vlan, 'pcp': dl_vlan_pcp}, {'type': dl_vlan_type, 'vid': dl_vlan_int, 'pcp': dl_vlan_pcp_int}]) else: #Push one more tag in either case exp_pkt = testutils.simple_tcp_packet( vlan_tags=[{'type': exp_vlan_type, 'vid': exp_vid, 'pcp': exp_pcp}, {'type': dl_vlan_type, 'vid': dl_vlan, 'pcp': dl_vlan_pcp}]) else: exp_pkt = testutils.simple_tcp_packet( vlan_tags=[{'type': exp_vlan_type, 'vid': exp_vid, 'pcp': exp_pcp}]) else: if dl_vlan_int >= 0: exp_pkt = testutils.simple_tcp_packet( vlan_tags=[{'type': exp_vlan_type, 'vid': exp_vid, 'pcp': exp_pcp}, {'type': dl_vlan_type, 'vid': dl_vlan_int, 'pcp': dl_vlan_pcp_int}]) else: exp_pkt = testutils.simple_tcp_packet( vlan_tags=[{'type': exp_vlan_type, 'vid': exp_vid, 'pcp': exp_pcp}]) else: #subtract action if dl_vlan_int > 0: exp_pkt = testutils.simple_tcp_packet( vlan_tags=[{'type': dl_vlan_type, 'vid': dl_vlan_int, 'pcp': dl_vlan_pcp_int}]) else: exp_pkt = testutils.simple_tcp_packet() table_id0 = testutils.EX_ACL_TABLE if dl_vlan > 0: table_id0 = testutils.EX_VLAN_TABLE testutils.delete_all_flows(parent.controller,parent.logger) if table_id0 != testutils.EX_ACL_TABLE: testutils.set_table_config(parent,table_id0) match_ls = testutils.packet_to_exact_flow_match(pkt,None,table_id0,ing_port) parent.assertTrue(match_ls is not None, "Flow match from pkt failed") #match.wildcards = wildcards # Flow Mod for Table0 inst = instruction.instruction_goto_table() if table_id0 == testutils.EX_ACL_TABLE: table_id1 = testutils.EX_VLAN_TABLE else: table_id1 = testutils.WC_ALL_TABLE inst.table_id = table_id1 inst_list = [inst] request0 = testutils.flow_msg_create(parent, pkt, ing_port=ing_port, instruction_list=inst_list, action_list=action_list_tbl0, wildcards=wildcards, egr_port = ofp.OFPP_LOCAL, match_fields=match_ls, check_expire=check_expire_tbl0, inst_app_flag=testutils.APPLY_ACTIONS_INSTRUCTION, table_id=table_id0) testutils.flow_msg_install(parent, request0) if exp_msg_tbl0 is not ofp.OFPT_ERROR: response,_ = parent.controller.poll(ofp.OFPT_ERROR, 1) if response is not None: parent.assertTrue(response is None, "Rcv: Unexpected Error Message: type " + str(response.type) + ", code " + str(response.code)) # Flow Mod for Table1 pkt1 = testutils.simple_tcp_packet( vlan_tags=[{'type': exp_vlan_type, 'vid': exp_vid, 'pcp': exp_pcp}]) match_ls1 = testutils.packet_to_exact_flow_match(pkt1,None,table_id1,ing_port) for i in range(len(match_ls1.items)): if match_ls1.items[i].field == ofp.OFPXMT_OFB_VLAN_VID: if vid_match_tbl1 > ofp.OFPVID_NONE: match_ls1.items[i].value = vid_match_tbl1 + ofp.OFPVID_PRESENT break else: del match_ls1.items[i] break for i in range(len(match_ls1.items)): if match_ls1.items[i].field == ofp.OFPXMT_OFB_VLAN_PCP: if vid_match_tbl1 > ofp.OFPVID_NONE: match_ls1.items[i].value = pcp_match_tbl1 break else: del match_ls1.items[i] break request1 = testutils.flow_msg_create(parent, pkt, ing_port=ing_port, action_list=action_list_tbl1, wildcards=wildcards, match_fields=match_ls1, check_expire=check_expire_tbl1, table_id=table_id1, egr_port=egr_port) testutils.flow_msg_install(parent, request1) if exp_msg_tbl1 is not ofp.OFPT_ERROR: response,_ = parent.controller.poll(ofp.OFPT_ERROR, 1) if response is not None: parent.assertTrue(response is None, "Rcv: Unexpected Error Message: type " + str(response.type) + ", code " + str(response.code)) parent.logger.debug("Send packet: " + str(ing_port) + " to " + str(egr_port)) parent.dataplane.send(ing_port, str(pkt)) if match_exp_tbl0: if check_expire_tbl0: #@todo Not all HW supports both pkt and byte counters #@todo We shouldn't expect the order of coming response.. flow_removed_verify(parent, request0, pkt_count=1, byte_count=len(exp_pkt)) else: if exp_msg_tbl0 is ofp.OFPT_FLOW_REMOVED: if check_expire_tbl0: flow_removed_verify(parent, request0, pkt_count=0, byte_count=0) elif exp_msg_tbl0 is ofp.OFPT_ERROR: error_verify(parent, exp_msg_type_tbl0, exp_msg_code_tbl0) else: parent.assertTrue(0, "Rcv: Unexpected Message: " + str(exp_msg_tbl0)) if match_exp_tbl1: if check_expire_tbl1: #@todo Not all HW supports both pkt and byte counters #@todo We shouldn't expect the order of coming response.. flow_removed_verify(parent, request1, pkt_count=1, byte_count=len(exp_pkt)) else: if exp_msg_tbl1 is ofp.OFPT_FLOW_REMOVED: if check_expire_tbl1: flow_removed_verify(parent, request1, pkt_count=0, byte_count=0) elif exp_msg_tbl1 is ofp.OFPT_ERROR: error_verify(parent, exp_msg_type_tbl1, exp_msg_code_tbl1) else: parent.assertTrue(0, "Rcv: Unexpected Message: " + str(exp_msg_tbl1)) if match_exp_tbl0 and match_exp_tbl1: testutils.receive_pkt_verify(parent, egr_port, exp_pkt) else: (_, rcv_pkt, _) = parent.dataplane.poll(timeout=1) parent.assertFalse(rcv_pkt is not None, "Packet on dataplane")
def runTest(self): #async_logger.info("Running InvalidTTL_NoPacketIn") #"verifying without set_async_request, switch will packet in" #step 1-1:clear all flow entries for unmatching rc = testutils.delete_all_flows(self.controller, async_logger) self.assertEqual(rc, 0, "Failed to delete all flows") #step 2-1:controller sends set_async_request msg async_logger.info("Sending set_async_request") mask = 1 << ofp.OFPR_INVALID_TTL request_set = create_set_async(pkt_in_mstr=mask) testutils.ofmsg_send(self, request_set) #result 2-1: contrller sends msg successfully #step 3-1: install default mismatch flow entry ,action=output; testutils.set_table_config(self) pkt = testutils.simple_tcp_packet(ip_ttl=0) flow_add = testutils.flow_msg_create(self, pkt, egr_port=ofp.OFPP_CONTROLLER, table_id=testutils.WC_L3_TABLE) testutils.flow_msg_install(self, flow_add) #send data(invalid ttl) to port for of_port in async_port_map.keys(): async_logger.info("PKT IN test, port " + str(of_port)) self.dataplane.send(of_port, str(pkt)) #@todo Check for unexpected messages? (response, _) = self.controller.poll(ofp.OFPT_PACKET_IN, 2) self.assertTrue(response is not None, 'Can not receive packet in message') #dataplane receive nothing (port_rec, pkt_rec, _) = self.dataplane.poll(of_port, 1) self.assertTrue(pkt_rec is None, "dataplane not receive packet") (response, _) = self.controller.poll(ofp.OFPT_PACKET_IN, 2) (response, _) = self.controller.poll(ofp.OFPT_PACKET_IN, 2) #"verifying with set_async_request, switch will not packet in" #step 1-2:clear all flow entries for unmatching rc = testutils.delete_all_flows(self.controller, async_logger) self.assertEqual(rc, 0, "Failed to delete all flows") #step 2-2:controller sends set_async_request msg async_logger.info("Sending set_async_request") mask = 0xffffffff ^ (1 << ofp.OFPR_INVALID_TTL) request_set = create_set_async(pkt_in_mstr=mask) testutils.ofmsg_send(self, request_set) #result 2-2: contrller sends msg successfully #step 3-2: install default mismatch flow entry ,action=output; testutils.set_table_config(self) pkt = testutils.simple_tcp_packet(ip_ttl=0) flow_add = testutils.flow_msg_create(self, pkt, egr_port=ofp.OFPP_CONTROLLER, table_id=testutils.WC_L3_TABLE) testutils.flow_msg_install(self, flow_add) #(response, _) = self.controller.poll(ofp.OFPT_PACKET_IN, 2) #send data(invalid ttl) to port for of_port in async_port_map.keys(): async_logger.info("PKT IN test, port " + str(of_port)) self.dataplane.send(of_port, str(pkt)) #@todo Check for unexpected messages? (response, _) = self.controller.poll(ofp.OFPT_PACKET_IN, 2) self.assertTrue(response is None, 'Packet in message received unexpected') #dataplane receive nothing (port_rec, pkt_rec, _) = self.dataplane.poll(of_port, 1) self.assertTrue(pkt_rec is None, "dataplane rec packet") msg = create_set_async() set_async_verify(self, msg)
def runTest(self): of_ports = pa_port_map.keys() ing_port = of_ports[1] egr_port = of_ports[2] "clear swtich;" testutils.delete_all_flows(self.controller, self.logger) # Set table config as "continue" testutils.set_table_config(self, testutils.EX_ACL_TABLE, ofp.OFPTC_TABLE_MISS_CONTINUE, True) testutils.set_table_config(self, testutils.WC_ACL_TABLE, ofp.OFPTC_TABLE_MISS_CONTINUE, True) testutils.set_table_config(self, testutils.WC_SERV_TABLE, ofp.OFPTC_TABLE_MISS_CONTROLLER, True) testutils.set_table_config(self, testutils.EX_L2_TABLE, ofp.OFPTC_TABLE_MISS_CONTINUE, True) testutils.set_table_config(self, testutils.EX_VLAN_TABLE, ofp.OFPTC_TABLE_MISS_CONTINUE, True) testutils.set_table_config(self, testutils.EX_MPLS_TABLE, ofp.OFPTC_TABLE_MISS_CONTINUE, True) testutils.set_table_config(self, testutils.EX_L3_TABLE, ofp.OFPTC_TABLE_MISS_CONTROLLER, True) #"make test packet;" pkt = testutils.simple_icmp_packet() inst_write_metadata = instruction.instruction_write_metadata(); inst_write_metadata.metadata = 0x20000000 inst_write_metadata.metadata_mask = 0xf0000000 testutils.write_goto(self, testutils.WC_SERV_TABLE, testutils.EX_L2_TABLE, ing_port, add_inst = inst_write_metadata) pkt_metadata = {'metadata_val':inst_write_metadata.metadata, 'metadata_msk':inst_write_metadata.metadata_mask} match_fields = testutils.packet_to_exact_flow_match(pkt_metadata = pkt_metadata, table_id = testutils.EX_L3_TABLE) testutils.write_output(self, testutils.EX_L3_TABLE, egr_port, match_fields=match_fields) testutils.reply_check_dp(self, tcp_sport=1234, ing_port = ing_port, egr_port = egr_port) testutils.set_table_config(self, testutils.EX_L3_TABLE, ofp.OFPTC_TABLE_MISS_CONTROLLER)
def runTest(self): #async_logger.info("Running InvalidTTL_NoPacketIn") #"verifying without set_async_request, switch will packet in" #step 1-1:clear all flow entries for unmatching rc = testutils.delete_all_flows(self.controller, async_logger) self.assertEqual(rc, 0, "Failed to delete all flows") #step 2-1:controller sends set_async_request msg async_logger.info("Sending set_async_request") mask = 1 << ofp.OFPR_INVALID_TTL request_set = create_set_async(pkt_in_mstr = mask) testutils.ofmsg_send(self, request_set) #result 2-1: contrller sends msg successfully #step 3-1: install default mismatch flow entry ,action=output; testutils.set_table_config(self) pkt = testutils.simple_tcp_packet(ip_ttl=0) flow_add = testutils.flow_msg_create(self, pkt, egr_port = ofp.OFPP_CONTROLLER, table_id = testutils.WC_L3_TABLE) testutils.flow_msg_install(self, flow_add) #send data(invalid ttl) to port for of_port in async_port_map.keys(): async_logger.info("PKT IN test, port " + str(of_port)) self.dataplane.send(of_port, str(pkt)) #@todo Check for unexpected messages? (response, _) = self.controller.poll(ofp.OFPT_PACKET_IN, 2) self.assertTrue(response is not None, 'Can not receive packet in message') #dataplane receive nothing (port_rec, pkt_rec, _) = self.dataplane.poll(of_port,1) self.assertTrue(pkt_rec is None, "dataplane not receive packet") (response, _) = self.controller.poll(ofp.OFPT_PACKET_IN, 2) (response, _) = self.controller.poll(ofp.OFPT_PACKET_IN, 2) #"verifying with set_async_request, switch will not packet in" #step 1-2:clear all flow entries for unmatching rc = testutils.delete_all_flows(self.controller, async_logger) self.assertEqual(rc, 0, "Failed to delete all flows") #step 2-2:controller sends set_async_request msg async_logger.info("Sending set_async_request") mask = 0xffffffff ^ (1 << ofp.OFPR_INVALID_TTL) request_set = create_set_async(pkt_in_mstr = mask) testutils.ofmsg_send(self, request_set) #result 2-2: contrller sends msg successfully #step 3-2: install default mismatch flow entry ,action=output; testutils.set_table_config(self) pkt = testutils.simple_tcp_packet(ip_ttl=0) flow_add = testutils.flow_msg_create(self, pkt, egr_port = ofp.OFPP_CONTROLLER, table_id = testutils.WC_L3_TABLE) testutils.flow_msg_install(self, flow_add) #(response, _) = self.controller.poll(ofp.OFPT_PACKET_IN, 2) #send data(invalid ttl) to port for of_port in async_port_map.keys(): async_logger.info("PKT IN test, port " + str(of_port)) self.dataplane.send(of_port, str(pkt)) #@todo Check for unexpected messages? (response, _) = self.controller.poll(ofp.OFPT_PACKET_IN, 2) self.assertTrue(response is None, 'Packet in message received unexpected') #dataplane receive nothing (port_rec, pkt_rec, _) = self.dataplane.poll(of_port,1) self.assertTrue(pkt_rec is None, "dataplane rec packet") msg = create_set_async() set_async_verify(self, msg)
def runTest(self): of_ports = pa_port_map.keys() ing_port = of_ports[1] egr_port = of_ports[2] "clear swtich;" testutils.delete_all_flows(self.controller, self.logger) # Set table config as "continue" testutils.set_table_config(self, testutils.EX_ACL_TABLE, ofp.OFPTC_TABLE_MISS_CONTINUE, True) testutils.set_table_config(self, testutils.WC_ACL_TABLE, ofp.OFPTC_TABLE_MISS_CONTINUE, True) testutils.set_table_config(self, testutils.WC_SERV_TABLE, ofp.OFPTC_TABLE_MISS_CONTROLLER, True) testutils.set_table_config(self, testutils.EX_L2_TABLE, ofp.OFPTC_TABLE_MISS_CONTINUE, True) testutils.set_table_config(self, testutils.EX_VLAN_TABLE, ofp.OFPTC_TABLE_MISS_CONTINUE, True) testutils.set_table_config(self, testutils.EX_MPLS_TABLE, ofp.OFPTC_TABLE_MISS_CONTINUE, True) testutils.set_table_config(self, testutils.EX_L3_TABLE, ofp.OFPTC_TABLE_MISS_CONTROLLER, True) #"make test packet;" pkt = testutils.simple_icmp_packet() inst_write_metadata = instruction.instruction_write_metadata() inst_write_metadata.metadata = 0x20000000 inst_write_metadata.metadata_mask = 0xf0000000 testutils.write_goto(self, testutils.WC_SERV_TABLE, testutils.EX_L2_TABLE, ing_port, add_inst=inst_write_metadata) pkt_metadata = { 'metadata_val': inst_write_metadata.metadata, 'metadata_msk': inst_write_metadata.metadata_mask } match_fields = testutils.packet_to_exact_flow_match( pkt_metadata=pkt_metadata, table_id=testutils.EX_L3_TABLE) testutils.write_output(self, testutils.EX_L3_TABLE, egr_port, match_fields=match_fields) testutils.reply_check_dp(self, tcp_sport=1234, ing_port=ing_port, egr_port=egr_port) testutils.set_table_config(self, testutils.EX_L3_TABLE, ofp.OFPTC_TABLE_MISS_CONTROLLER)