def runTest(self): logging = get_logger() logging.info("Running Grp100No160 BadActionBadArgument test") rc = delete_all_flows(self.controller) self.assertEqual(rc, 0, "Failed to delete all flows") of_ports=config["port_map"].keys() of_ports.sort() self.assertTrue(len(of_ports)>1, "not enough ports for test") # flow with modifed arguments flow_mod_msg = message.flow_mod() flow_mod_msg.match.in_port = of_ports[0] flow_mod_msg.match.wildcards = ofp.OFPFW_ALL^ofp.OFPFW_DL_SRC act = action.action_set_vlan_vid() act.type = ofp.OFPAT_SET_VLAN_VID act.len = 8 act.port = of_ports[1] act.vlan_vid = 5000 # incorrect vid act.pad = [0, 0] self.assertTrue(flow_mod_msg.actions.add(act), "Could not add action") rv = self.controller.message_send(flow_mod_msg.pack()) self.assertTrue(rv != -1, "Error installing flow mod") self.assertEqual(do_barrier(self.controller), 0, "Barrier failed") (response, raw) = self.controller.poll(ofp.OFPT_ERROR, timeout=10) self.assertTrue(response is not None,"Did not receive an error") self.assertTrue(response.type==ofp.OFPET_BAD_ACTION,"Unexpected Error type {0}. Expected OFPET_BAD_ACTION error type" .format(response.type)) self.assertTrue(response.code==ofp.OFPBAC_BAD_ARGUMENT or response.code == ofp.OFPBAC_EPERM," Unexpected error code, Expected ofp.OFPBAC_BAD_ARGUMENT or ofp.OFPBAC_EPERM error code got {0}" .format(response.code))
def runTest(self): logging.info("Running Add_vlan_tag test") of_ports = config["port_map"].keys() of_ports.sort() self.assertTrue(len(of_ports) > 1, "Not enough ports for test") #Clear switch state rv = delete_all_flows(self.controller) self.assertEqual(rv, 0, "Failed to delete all flows") logging.info("Verify if switch supports the action -- set vlan id, if not skip the test") logging.info("Insert a flow with set vid action") logging.info("Send packet matching the flow , verify recieved packet has vid set") #Verify set_vlan_id is a supported action sup_acts = sw_supported_actions(self) if not(sup_acts & 1<<ofp.OFPAT_SET_VLAN_VID): skip_message_emit(self, "Add VLAN tag test skipped") return #Create packet to be sent and an expected packet with vid set new_vid = 2 len_wo_vid = 100 len_w_vid = 104 pkt = simple_tcp_packet(pktlen=len_wo_vid) exp_pkt = simple_tcp_packet(pktlen=len_w_vid, dl_vlan_enable=True, dl_vlan=new_vid,dl_vlan_pcp=0) vid_act = action.action_set_vlan_vid() vid_act.vlan_vid = new_vid #Insert flow with action -- set vid , Send packet matching the flow, Verify recieved packet is expected packet flow_match_test(self, config["port_map"], pkt=pkt, exp_pkt=exp_pkt, action_list=[vid_act])
def runTest(self): logging = get_logger() logging.info("Running Modify_Vlan_Tag test") of_ports = config["port_map"].keys() of_ports.sort() self.assertTrue(len(of_ports) > 1, "Not enough ports for test") #Clear switch state rv = delete_all_flows(self.controller) self.assertEqual(rv, 0, "Failed to delete all flows") logging.info("Verify if switch supports the action -- modify vlan id, if not skip the test") logging.info("Insert a flow with action --set vid ") logging.info("Send tagged packet matching the flow , verify recieved packet has vid rewritten") #Verify set_vlan_id is a supported action sup_acts = sw_supported_actions(self) if not (sup_acts & 1 << ofp.OFPAT_SET_VLAN_VID): skip_message_emit(self, "Modify VLAN tag test skipped") return #Create a tagged packet with old_vid to be sent, and expected packet with new_vid old_vid = 2 new_vid = 3 pkt = simple_tcp_packet(dl_vlan_enable=True, dl_vlan=old_vid) exp_pkt = simple_tcp_packet(dl_vlan_enable=True, dl_vlan=new_vid) vid_act = action.action_set_vlan_vid() vid_act.vlan_vid = new_vid #Insert flow with action -- set vid , Send packet matching the flow.Verify recieved packet is expected packet. flow_match_test(self, config["port_map"], pkt=pkt, exp_pkt=exp_pkt, action_list=[vid_act])
def novlan_push_two_tables_tests(parent): """ @param parent Must implement controller, dataplane, assertTrue, assertEqual and logger """ wildcards = 0 vid = -1 pcp = 0 vid_int = -1 pcp_int = 0 exp_vid = random.randint(0, 4094) exp_pcp = random.randint(0, 6) # Match condition on TBL0 (match) vid_match_tbl0 = ofp.OFPVID_NONE pcp_match_tbl0 = 0 # Create action_list for TBL0 action_list_tbl0 = [] act = action.action_push_vlan() act.ethertype = ETHERTYPE_VLAN action_list_tbl0.append(act) act = action.action_set_vlan_vid() act.vlan_vid = exp_vid action_list_tbl0.append(act) act = action.action_set_vlan_pcp() act.vlan_pcp = exp_pcp action_list_tbl0.append(act) # Create action_list for TBL1 vid_match_tbl1 = exp_vid pcp_match_tbl1 = exp_pcp # Output action for table1 will be set in the framework action_list_tbl1 = None flow_match_test_vlan_two_tables(parent, pa_port_map, dl_vlan=vid, dl_vlan_pcp=pcp, dl_vlan_int=vid_int, dl_vlan_pcp_int=pcp_int, vid_match_tbl0=vid_match_tbl0, pcp_match_tbl0=pcp_match_tbl0, action_list_tbl0=action_list_tbl0, match_exp_tbl0=True, vid_match_tbl1=vid_match_tbl1, pcp_match_tbl1=pcp_match_tbl1, action_list_tbl1=action_list_tbl1, match_exp_tbl1=True, exp_vid=exp_vid, exp_pcp=exp_pcp, add_tag_exp=True, wildcards=wildcards, max_test=1)
def vlan_set_two_tables_tests(parent, test_condition=0): """ @param parent Must implement controller, dataplane, assertTrue, assertEqual and logger """ wildcards = 0 vid = random.randint(0, 4094) pcp = random.randint(0, 6) vid_int = -1 pcp_int = 0 exp_vid = vid + 1 exp_pcp = pcp + 1 # Match condition on TBL0 (match) vid_match_tbl0 = vid pcp_match_tbl0 = pcp # Expect modified pkt on TBL1 (match) if (test_condition == 0): vid_match_tbl1 = exp_vid pcp_match_tbl1 = exp_pcp match_exp_tbl1 = True # Expect the same pkt on TBL1 (Unmatch) else: #test_condition == 1 vid_match_tbl1 = vid pcp_match_tbl1 = pcp match_exp_tbl1 = False # Create action_list for TBL0 act = action.action_set_vlan_vid() act.vlan_vid = exp_vid act2 = action.action_set_vlan_pcp() act2.vlan_pcp = exp_pcp action_list_tbl0 = [act, act2] # Output action for table1 will be set in the framework action_list_tbl1 = None flow_match_test_vlan_two_tables(parent, pa_port_map, wildcards=wildcards, dl_vlan=vid, dl_vlan_pcp=pcp, dl_vlan_int=vid_int, dl_vlan_pcp_int=pcp_int, vid_match_tbl0=vid_match_tbl0, pcp_match_tbl0=pcp_match_tbl0, action_list_tbl0=action_list_tbl0, match_exp_tbl0=True, vid_match_tbl1=vid_match_tbl1, pcp_match_tbl1=pcp_match_tbl1, action_list_tbl1=action_list_tbl1, match_exp_tbl1=match_exp_tbl1, exp_vid=exp_vid, exp_pcp=exp_pcp, max_test=1)
def action_generate(parent, field_to_mod, mod_field_vals): """ Create an action to modify the field indicated in field_to_mod @param parent Must implement, assertTrue @param field_to_mod The field to modify as a string name @param mod_field_vals Hash of values to use for modified values """ act = None if field_to_mod in ['pktlen']: return None if field_to_mod == 'dl_dst': act = action.action_set_dl_dst() act.dl_addr = parse.parse_mac(mod_field_vals['dl_dst']) elif field_to_mod == 'dl_src': act = action.action_set_dl_src() act.dl_addr = parse.parse_mac(mod_field_vals['dl_src']) elif field_to_mod == 'dl_vlan_enable': if not mod_field_vals['dl_vlan_enable']: # Strip VLAN tag act = action.action_strip_vlan() # Add VLAN tag is handled by dl_vlan field # Will return None in this case elif field_to_mod == 'dl_vlan': act = action.action_set_vlan_vid() act.vlan_vid = mod_field_vals['dl_vlan'] elif field_to_mod == 'dl_vlan_pcp': act = action.action_set_vlan_pcp() act.vlan_pcp = mod_field_vals['dl_vlan_pcp'] elif field_to_mod == 'ip_src': act = action.action_set_nw_src() act.nw_addr = parse.parse_ip(mod_field_vals['ip_src']) elif field_to_mod == 'ip_dst': act = action.action_set_nw_dst() act.nw_addr = parse.parse_ip(mod_field_vals['ip_dst']) elif field_to_mod == 'ip_tos': act = action.action_set_nw_tos() act.nw_tos = mod_field_vals['ip_tos'] elif field_to_mod == 'tcp_sport': act = action.action_set_tp_src() act.tp_port = mod_field_vals['tcp_sport'] elif field_to_mod == 'tcp_dport': act = action.action_set_tp_dst() act.tp_port = mod_field_vals['tcp_dport'] elif field_to_mod == 'udp_sport': act = action.action_set_tp_src() act.tp_port = mod_field_vals['udp_sport'] elif field_to_mod == 'udp_dport': act = action.action_set_tp_dst() act.tp_port = mod_field_vals['udp_dport'] else: parent.assertTrue(0, "Unknown field to modify: " + str(field_to_mod)) return act
def vlan_set_two_tables_tests(parent, test_condition=0): """ @param parent Must implement controller, dataplane, assertTrue, assertEqual and logger """ wildcards = 0 vid = random.randint(0, 4094) pcp = random.randint(0, 6) vid_int = -1 pcp_int = 0 exp_vid = vid + 1 exp_pcp = pcp + 1 # Match condition on TBL0 (match) vid_match_tbl0 = vid pcp_match_tbl0 = pcp # Expect modified pkt on TBL1 (match) if (test_condition == 0): vid_match_tbl1 = exp_vid pcp_match_tbl1 = exp_pcp match_exp_tbl1 = True # Expect the same pkt on TBL1 (Unmatch) else: #test_condition == 1 vid_match_tbl1 = vid pcp_match_tbl1 = pcp match_exp_tbl1 = False # Create action_list for TBL0 act = action.action_set_vlan_vid() act.vlan_vid = exp_vid act2 = action.action_set_vlan_pcp() act2.vlan_pcp = exp_pcp action_list_tbl0 = [act, act2] # Output action for table1 will be set in the framework action_list_tbl1 = None flow_match_test_vlan_two_tables(parent, pa_port_map, wildcards=wildcards, dl_vlan=vid, dl_vlan_pcp=pcp, dl_vlan_int=vid_int, dl_vlan_pcp_int=pcp_int, vid_match_tbl0=vid_match_tbl0, pcp_match_tbl0=pcp_match_tbl0, action_list_tbl0 = action_list_tbl0, match_exp_tbl0=True, vid_match_tbl1=vid_match_tbl1, pcp_match_tbl1=pcp_match_tbl1, action_list_tbl1 = action_list_tbl1, match_exp_tbl1=match_exp_tbl1, exp_vid=exp_vid, exp_pcp=exp_pcp, max_test=1)
def novlan_push_two_tables_tests(parent): """ @param parent Must implement controller, dataplane, assertTrue, assertEqual and logger """ wildcards = 0 vid = -1 pcp = 0 vid_int = -1 pcp_int = 0 exp_vid = random.randint(0, 4094) exp_pcp = random.randint(0, 6) # Match condition on TBL0 (match) vid_match_tbl0 = ofp.OFPVID_NONE pcp_match_tbl0 = 0 # Create action_list for TBL0 action_list_tbl0 = [] act = action.action_push_vlan() act.ethertype = ETHERTYPE_VLAN action_list_tbl0.append(act) act = action.action_set_vlan_vid() act.vlan_vid = exp_vid action_list_tbl0.append(act) act = action.action_set_vlan_pcp() act.vlan_pcp = exp_pcp action_list_tbl0.append(act) # Create action_list for TBL1 vid_match_tbl1 = exp_vid pcp_match_tbl1 = exp_pcp # Output action for table1 will be set in the framework action_list_tbl1 = None flow_match_test_vlan_two_tables(parent, pa_port_map, dl_vlan=vid, dl_vlan_pcp=pcp, dl_vlan_int=vid_int, dl_vlan_pcp_int=pcp_int, vid_match_tbl0=vid_match_tbl0, pcp_match_tbl0=pcp_match_tbl0, action_list_tbl0 = action_list_tbl0, match_exp_tbl0 = True, vid_match_tbl1=vid_match_tbl1, pcp_match_tbl1=pcp_match_tbl1, action_list_tbl1 = action_list_tbl1, match_exp_tbl1 = True, exp_vid=exp_vid, exp_pcp=exp_pcp, add_tag_exp=True, wildcards=wildcards, max_test=1)
def runTest(self): of_ports = pa_port_map.keys() of_ports.sort() self.assertTrue(len(of_ports) > 2, "Not enough ports for test") # For making the test simpler... ing_port = of_ports[0] egr_port = of_ports[1] dl_vlan = 0xa5a # no specific meaning dl_vlan_pcp=3 pkt = testutils.simple_tcp_packet(vlan_tags=[{'vid': dl_vlan, 'pcp': dl_vlan_pcp}]) match = parse.packet_to_flow_match(pkt) wildcards = 0 new_dl_vlan = 0x18F exp_pkt = testutils.simple_tcp_packet(vlan_tags=[{'type': ETHERTYPE_VLAN, 'vid': new_dl_vlan, 'pcp': dl_vlan_pcp}, {'vid': dl_vlan, 'pcp': dl_vlan_pcp}]) # Create parameters for each table act_list = [] next_avail = [] chk_expire = [] #Table 0 act = action.action_output() act.port = egr_port act_list.append([act]) next_avail.append(True) chk_expire.append(False) #Table 1 act = action.action_set_vlan_vid() act.vlan_vid = new_dl_vlan act_list.append([act]) next_avail.append(True) chk_expire.append(False) #Table 2 act = action.action_push_vlan() act.ethertype = ETHERTYPE_VLAN act_list.append([act]) next_avail.append(False) chk_expire.append(False) write_action_test_multi_tables(self, ing_port, egr_port, match = match, wildcards = wildcards, act_list = act_list, next_avail = next_avail, chk_expire = chk_expire, pkt = pkt, exp_pkt = exp_pkt)
def runTest(self): of_ports = pa_port_map.keys() of_ports.sort() self.assertTrue(len(of_ports) > 2, "Not enough ports for test") # For making the test simpler... ing_port = of_ports[0] egr_port = of_ports[1] pktlen = 100 pkt = testutils.simple_tcp_packet(pktlen=pktlen) match = parse.packet_to_flow_match(pkt) wildcards = 0 dl_vlan = 0xa5a # no specific meaning exp_pkt = testutils.simple_tcp_packet(pktlen=pktlen+4, dl_vlan_enable=True, dl_vlan=dl_vlan) # Create parameters for each table act_list = [] next_avail = [] chk_expire = [] #Table 0 act = action.action_output() act.port = egr_port act_list.append([act]) next_avail.append(True) chk_expire.append(False) #Table 1 act = action.action_push_vlan() act.ethertype = ETHERTYPE_VLAN act_list.append([act]) next_avail.append(True) chk_expire.append(False) #Table 2 act = action.action_set_vlan_vid() act.vlan_vid = dl_vlan act_list.append([act]) next_avail.append(False) chk_expire.append(False) write_action_test_multi_tables(self, ing_port, egr_port, match = match, wildcards = wildcards, act_list = act_list, next_avail = next_avail, chk_expire = chk_expire, pkt = pkt, exp_pkt = exp_pkt)
def action_generate(parent, field_to_mod, mod_field_vals): """ Create an action to modify the field indicated in field_to_mod @param parent Must implement, assertTrue @param field_to_mod The field to modify as a string name @param mod_field_vals Hash of values to use for modified values """ act = None if field_to_mod in ['pktlen']: return None if field_to_mod == 'dl_dst': act = action.action_set_dl_dst() act.dl_addr = parse.parse_mac(mod_field_vals['dl_dst']) elif field_to_mod == 'dl_src': act = action.action_set_dl_src() act.dl_addr = parse.parse_mac(mod_field_vals['dl_src']) elif field_to_mod == 'dl_vlan_enable': if not mod_field_vals['dl_vlan_enable']: # Strip VLAN tag act = action.action_strip_vlan() # Add VLAN tag is handled by dl_vlan field # Will return None in this case elif field_to_mod == 'dl_vlan': act = action.action_set_vlan_vid() act.vlan_vid = mod_field_vals['dl_vlan'] elif field_to_mod == 'dl_vlan_pcp': act = action.action_set_vlan_pcp() act.vlan_pcp = mod_field_vals['dl_vlan_pcp'] elif field_to_mod == 'ip_src': act = action.action_set_nw_src() act.nw_addr = parse.parse_ip(mod_field_vals['ip_src']) elif field_to_mod == 'ip_dst': act = action.action_set_nw_dst() act.nw_addr = parse.parse_ip(mod_field_vals['ip_dst']) elif field_to_mod == 'ip_tos': act = action.action_set_nw_tos() act.nw_tos = mod_field_vals['ip_tos'] elif field_to_mod == 'tcp_sport': act = action.action_set_tp_src() act.tp_port = mod_field_vals['tcp_sport'] elif field_to_mod == 'tcp_dport': act = action.action_set_tp_dst() act.tp_port = mod_field_vals['tcp_dport'] else: parent.assertTrue(0, "Unknown field to modify: " + str(field_to_mod)) return act
def runTest(self): old_vid = 2 new_vid = 3 sup_acts = supported_actions_get(self) if not (sup_acts & 1 << ofp.OFPAT_SET_VLAN_VID): skip_message_emit(self, "Modify VLAN tag test") return pkt = simple_tcp_packet(dl_vlan_enable=True, dl_vlan=old_vid) exp_pkt = simple_tcp_packet(dl_vlan_enable=True, dl_vlan=new_vid) vid_act = action.action_set_vlan_vid() vid_act.vlan_vid = new_vid flow_match_test(self, pa_port_map, pkt=pkt, exp_pkt=exp_pkt, action_list=[vid_act])
def runTest(self): old_vid = 2 new_vid = 3 sup_acts = supported_actions_get(self) if not (sup_acts & 1 << ofp.OFPAT_SET_VLAN_VID): testutils.skip_message_emit(self, "Modify VLAN tag test") return pkt = testutils.simple_tcp_packet(vlan_tags=[{'vid': old_vid}]) exp_pkt = testutils.simple_tcp_packet(vlan_tags=[{'vid': new_vid}]) vid_act = action.action_set_vlan_vid() vid_act.vlan_vid = new_vid testutils.flow_match_test(self, pa_port_map, pkt=pkt, exp_pkt=exp_pkt, apply_action_list=[vid_act])
def runTest(self): logging.info("Running Grp100No170 BadActionBadArgument test") rc = delete_all_flows(self.controller) self.assertEqual(rc, 0, "Failed to delete all flows") flow_mod_msg = message.flow_mod() act = action.action_enqueue() act.type = ofp.OFPAT_ENQUEUE act.port = ofp.OFPP_ALL act.queue_id = 1 self.assertTrue(flow_mod_msg.actions.add(act), "Could not add action") rv = self.controller.message_send(flow_mod_msg) self.assertTrue(rv != -1, "Error installing flow mod") self.assertEqual(do_barrier(self.controller), 0, "Barrier failed") # flow with modifed arguments flow_mod_msg = message.flow_mod() act = action.action_set_vlan_vid() act.type = ofp.OFPAT_SET_VLAN_VID act.len = 8 act.port = ofp.OFPP_ALL act.vlan_vid = -2 # incorrect vid act.pad = [0, 0] self.assertTrue(flow_mod_msg.actions.add(act), "Could not add action") rv = self.controller.message_send(flow_mod_msg.pack()) self.assertTrue(rv != -1, "Error installing flow mod") self.assertEqual(do_barrier(self.controller), 0, "Barrier failed") count = 0 while True: (response, raw) = self.controller.poll(ofp.OFPT_ERROR) if not response: # Timeout break if not response.type == ofp.OFPET_BAD_ACTION: logging.info("Error type not as expected") break if not response.code == ofp.OFPBAC_BAD_ARGUMENT | ofp.OFPBAC_EPERM: logging.info("Error code is not as expected") break if not config["relax"]: # Only one attempt to match break count += 1 if count > 10: # Too many tries break
def runTest(self): new_vid = 2 sup_acts = supported_actions_get(self) if not(sup_acts & 1<<ofp.OFPAT_SET_VLAN_VID): skip_message_emit(self, "Add VLAN tag test") return len = 100 len_w_vid = 104 pkt = simple_tcp_packet(pktlen=len) exp_pkt = simple_tcp_packet(pktlen=len_w_vid, dl_vlan_enable=True, dl_vlan=new_vid) vid_act = action.action_set_vlan_vid() vid_act.vlan_vid = new_vid flow_match_test(self, pa_port_map, pkt=pkt, exp_pkt=exp_pkt, action_list=[vid_act])
def runTest(self): logging = get_logger() logging.info("Running Grp70No130 Add_vlan_tag test") of_ports = config["port_map"].keys() of_ports.sort() self.assertTrue(len(of_ports) > 1, "Not enough ports for test") #Clear switch state rv = delete_all_flows(self.controller) self.assertEqual(rv, 0, "Failed to delete all flows") logging.info( "Verify if switch supports the action -- set vlan id, if not skip the test" ) logging.info("Insert a flow with set vid action") logging.info( "Send packet matching the flow , verify recieved packet has vid set" ) #Verify set_vlan_id is a supported action sup_acts = sw_supported_actions(self) if not (sup_acts & 1 << ofp.OFPAT_SET_VLAN_VID): skip_message_emit(self, "Add VLAN tag test skipped") return #Create packet to be sent and an expected packet with vid set new_vid = 2 len_wo_vid = 100 len_w_vid = 104 pkt = simple_tcp_packet(pktlen=len_wo_vid) exp_pkt = simple_tcp_packet(pktlen=len_w_vid, dl_vlan_enable=True, dl_vlan=new_vid, dl_vlan_pcp=0) vid_act = action.action_set_vlan_vid() vid_act.vlan_vid = new_vid #Insert flow with action -- set vid , Send packet matching the flow, Verify recieved packet is expected packet flow_match_test(self, config["port_map"], pkt=pkt, exp_pkt=exp_pkt, action_list=[vid_act])
def runTest(self): logging = get_logger() logging.info("Running BadActionTooMany Grp100No180 test") of_ports = config["port_map"].keys() of_ports.sort() self.assertTrue(len(of_ports) > 1, "Not enough ports for test") #Clear switch state rc = delete_all_flows(self.controller) self.assertEqual(rc, 0, "Failed to delete all flows") self.assertEqual(do_barrier(self.controller), 0, "Barrier Failed") #Create flow_mod message with lot of actions flow_mod_msg = message.flow_mod() flow_mod_msg.match.in_port = of_ports[0] # add a lot of actions no = 1500 for i in range(2, no): act1 = action.action_set_vlan_vid() act1.vlan_vid = i self.assertTrue(flow_mod_msg.actions.add(act1), "Could not add action") act = action.action_output() act.port = of_ports[1] self.assertTrue(flow_mod_msg.actions.add(act), "Could not add action") logging.info("Sending flow_mod message...") rv = self.controller.message_send(flow_mod_msg) self.assertTrue(rv != -1, "Error installing flow mod") self.assertEqual(do_barrier(self.controller), 0, "Barrier failed") logging.info("Waiting for OFPT_ERROR message...") (response, pkt) = self.controller.poll(exp_msg=ofp.OFPT_ERROR, timeout=5) self.assertTrue(response is not None, 'Switch did not replay with error messge') self.assertTrue( response.type == ofp.OFPET_BAD_ACTION, 'Error type is not OFPET_BAD_ACTION got {0}'.format(response.type)) self.assertTrue(response.code == ofp.OFPBAC_TOO_MANY, 'Error code is not OFPBAC_TOO_MANY')
def runTest(self): new_vid = 4002 sup_acts = supported_actions_get(self) if not(sup_acts & 1<<ofp.OFPAT_SET_VLAN_VID): testutils.skip_message_emit(self, "Add VLAN tag test") return pkt = testutils.simple_tcp_packet() exp_pkt = testutils.simple_tcp_packet( vlan_tags=[{'vid': new_vid}]) push_act = action.action_push_vlan() push_act.ethertype = 0x8100 vid_act = action.action_set_vlan_vid() vid_act.vlan_vid = new_vid testutils.flow_match_test(self, pa_port_map, pkt=pkt, exp_pkt=exp_pkt, apply_action_list=[push_act, vid_act])
def runTest(self): logging = get_logger() logging.info("Running BadActionTooMany Grp100No180 test") of_ports = config["port_map"].keys() of_ports.sort() self.assertTrue(len(of_ports) > 1, "Not enough ports for test") #Clear switch state rc = delete_all_flows(self.controller) self.assertEqual(rc, 0, "Failed to delete all flows") self.assertEqual(do_barrier(self.controller),0, "Barrier Failed") #Create flow_mod message with lot of actions flow_mod_msg = message.flow_mod() flow_mod_msg.match.in_port=of_ports[0] # add a lot of actions no = 1500 for i in range(2, no): act1 = action.action_set_vlan_vid() act1.vlan_vid=i self.assertTrue(flow_mod_msg.actions.add(act1), "Could not add action") act = action.action_output() act.port = of_ports[1] self.assertTrue(flow_mod_msg.actions.add(act), "Could not add action") logging.info("Sending flow_mod message...") rv = self.controller.message_send(flow_mod_msg) self.assertTrue(rv != -1, "Error installing flow mod") self.assertEqual(do_barrier(self.controller), 0, "Barrier failed") logging.info("Waiting for OFPT_ERROR message...") (response, pkt) = self.controller.poll(exp_msg=ofp.OFPT_ERROR, timeout=5) self.assertTrue(response is not None, 'Switch did not replay with error messge') self.assertTrue(response.type==ofp.OFPET_BAD_ACTION, 'Error type is not OFPET_BAD_ACTION got {0}' .format(response.type)) self.assertTrue(response.code==ofp.OFPBAC_TOO_MANY, 'Error code is not OFPBAC_TOO_MANY')
def vlan_set_act_tests(parent, test_condition=0): """ Test vlan set_vid and set_pcp action for the packets with/without tags @param parent Must implement controller, dataplane, assertTrue, assertEqual and logger @param test_condition Value between 0 and 3 """ parent.assertTrue( ((parent.num_tags >= 0) and (parent.num_tags <= 2)), "Parameter num_tags not within an acceptable range" ) (sup_pop_vlan, sup_push_vlan, sup_set_vlan_vid, sup_set_vlan_pcp) = vlan_action_support_check(parent) new_vid = parent.vid + 2 new_pcp = parent.pcp + 2 if sup_set_vlan_vid == False: testutils.skip_message_emit(parent, "Vlan set action test. SET VLAN VID not supported") return if sup_set_vlan_pcp == False: testutils.skip_message_emit(parent, "Vlan set action test. SET VLAN PCP not supported") return exp_vlan_type = parent.vlan_type if test_condition == 0: act = action.action_set_vlan_vid() act.vlan_vid = new_vid if parent.num_tags == 0: match_exp = False exp_vid = -1 exp_pcp = 0 exp_msg = ofp.OFPT_ERROR exp_msg_type = ofp.OFPET_BAD_ACTION exp_msg_code = ofp.OFPBAC_MATCH_INCONSISTENT else: match_exp = True exp_vid = new_vid exp_pcp = parent.pcp exp_msg = ofp.OFPT_FLOW_REMOVED exp_msg_type = 0 # NOT_EXPECTED exp_msg_code = 0 # NOT_EXPECTED elif test_condition == 1: act = action.action_set_vlan_vid() act.vlan_vid = 4096 # OUT OF RANGE match_exp = False exp_vid = -1 exp_pcp = 0 exp_msg = ofp.OFPT_ERROR exp_msg_type = ofp.OFPET_BAD_ACTION exp_msg_code = ofp.OFPBAC_BAD_ARGUMENT elif test_condition == 2: act = action.action_set_vlan_pcp() act.vlan_pcp = new_pcp if parent.num_tags == 0: match_exp = False exp_vid = -1 exp_pcp = 0 exp_msg = ofp.OFPT_ERROR exp_msg_type = ofp.OFPET_BAD_ACTION exp_msg_code = ofp.OFPBAC_MATCH_INCONSISTENT else: match_exp = True exp_vid = parent.vid exp_pcp = new_pcp exp_msg = ofp.OFPT_FLOW_REMOVED exp_msg_type = 0 # NOT_EXPECTED exp_msg_code = 0 # NOT_EXPECTED elif test_condition == 3: act = action.action_set_vlan_pcp() act.vlan_pcp = 8 # OUT OF RANGE match_exp = False exp_vid = -1 exp_pcp = 0 exp_msg = ofp.OFPT_ERROR exp_msg_type = ofp.OFPET_BAD_ACTION exp_msg_code = ofp.OFPBAC_BAD_ARGUMENT else: return action_list = [act] testutils.flow_match_test_vlan( parent, pa_port_map, wildcards=0, dl_vlan=parent.vid, dl_vlan_pcp=parent.pcp, dl_vlan_type=parent.vlan_type, dl_vlan_int=parent.vid_2nd, dl_vlan_pcp_int=parent.pcp_2nd, vid_match=parent.vid_match, pcp_match=parent.pcp_match, exp_vid=exp_vid, exp_pcp=exp_pcp, exp_vlan_type=exp_vlan_type, match_exp=match_exp, exp_msg=exp_msg, exp_msg_type=exp_msg_type, exp_msg_code=exp_msg_code, action_list=action_list, max_test=1, )
def runTest(self): of_ports = pa_port_map.keys() of_ports.sort() self.assertTrue(len(of_ports) > 2, "Not enough ports for test") # For making the test simpler... ing_port = of_ports[0] egr_port = of_ports[1] pktlen = 104 dl_vlan = 0xa5a # no specific meaning dl_vlan_pcp=3 outer_dl_vlan = 0x18F pkt = testutils.simple_tcp_packet(pktlen=pktlen, dl_vlan_enable=True, dl_vlan=dl_vlan, dl_vlan_pcp=dl_vlan_pcp) pkt.push_vlan(ETHERTYPE_VLAN) pkt.set_vlan_vid(outer_dl_vlan) match = parse.packet_to_flow_match(pkt) wildcards = 0 new_dl_vlan = 0xfed exp_pkt = testutils.simple_tcp_packet(pktlen=pktlen, dl_vlan_enable=True, dl_vlan=new_dl_vlan, dl_vlan_pcp=dl_vlan_pcp) # Create parameters for each table act_list = [] next_avail = [] chk_expire = [] #Table 0 act = action.action_output() act.port = egr_port act_list.append([act]) next_avail.append(True) chk_expire.append(False) #Table 1 act = action.action_set_vlan_vid() act.vlan_vid = new_dl_vlan act_list.append([act]) next_avail.append(True) chk_expire.append(False) #Table 2 act = action.action_pop_vlan() act_list.append([act]) next_avail.append(False) chk_expire.append(False) write_action_test_multi_tables(self, ing_port, egr_port, match = match, wildcards = wildcards, act_list = act_list, next_avail = next_avail, chk_expire = chk_expire, pkt = pkt, exp_pkt = exp_pkt)
def vlan_push_two_tables_tests(parent, test_condition=0, match_exp=True): """ @param parent Must implement controller, dataplane, assertTrue, assertEqual and logger """ wildcards = 0 vid = random.randint(0, 4094) pcp = random.randint(0, 6) vid_int = -1 pcp_int = 0 if (test_condition == 0): exp_vid = vid exp_pcp = pcp elif (test_condition == 1): exp_vid = vid + 1 exp_pcp = pcp elif (test_condition == 2): exp_vid = vid exp_pcp = pcp + 1 else: # test_condition == 3 exp_vid = vid + 1 exp_pcp = pcp + 1 # Match condition on TBL0 (match) vid_match_tbl0 = vid pcp_match_tbl0 = pcp # Create action_list for TBL0 action_list_tbl0 = [] act = action.action_push_vlan() act.ethertype = ETHERTYPE_VLAN action_list_tbl0.append(act) if (match_exp): # PUSH-only for test0 if (test_condition == 1): act = action.action_set_vlan_vid() act.vlan_vid = exp_vid action_list_tbl0.append(act) elif (test_condition == 2): act = action.action_set_vlan_pcp() act.vlan_pcp = exp_pcp action_list_tbl0.append(act) elif (test_condition == 3): act = action.action_set_vlan_vid() act.vlan_vid = exp_vid action_list_tbl0.append(act) act = action.action_set_vlan_pcp() act.vlan_pcp = exp_pcp action_list_tbl0.append(act) else: if (test_condition == 0): act = action.action_set_vlan_vid() act.vlan_vid = vid + 1 action_list_tbl0.append(act) # Create action_list for TBL1 vid_match_tbl1 = exp_vid pcp_match_tbl1 = exp_pcp # Output action for table1 will be set in the framework action_list_tbl1 = None flow_match_test_vlan_two_tables(parent, pa_port_map, dl_vlan=vid, dl_vlan_pcp=pcp, dl_vlan_int=vid_int, dl_vlan_pcp_int=pcp_int, vid_match_tbl0=vid_match_tbl0, pcp_match_tbl0=pcp_match_tbl0, action_list_tbl0=action_list_tbl0, match_exp_tbl0=True, vid_match_tbl1=vid_match_tbl1, pcp_match_tbl1=pcp_match_tbl1, action_list_tbl1=action_list_tbl1, match_exp_tbl1=match_exp, exp_vid=exp_vid, exp_pcp=exp_pcp, add_tag_exp=True, wildcards=wildcards, max_test=1)
def vlan_push_two_tables_tests(parent, test_condition=0, match_exp = True): """ @param parent Must implement controller, dataplane, assertTrue, assertEqual and logger """ wildcards = 0 vid = random.randint(0, 4094) pcp = random.randint(0, 6) vid_int = -1 pcp_int = 0 if (test_condition == 0): exp_vid = vid exp_pcp = pcp elif (test_condition == 1): exp_vid = vid + 1 exp_pcp = pcp elif (test_condition == 2): exp_vid = vid exp_pcp = pcp + 1 else: # test_condition == 3 exp_vid = vid + 1 exp_pcp = pcp + 1 # Match condition on TBL0 (match) vid_match_tbl0 = vid pcp_match_tbl0 = pcp # Create action_list for TBL0 action_list_tbl0 = [] act = action.action_push_vlan() act.ethertype = ETHERTYPE_VLAN action_list_tbl0.append(act) if (match_exp): # PUSH-only for test0 if (test_condition == 1): act = action.action_set_vlan_vid() act.vlan_vid = exp_vid action_list_tbl0.append(act) elif (test_condition == 2): act = action.action_set_vlan_pcp() act.vlan_pcp = exp_pcp action_list_tbl0.append(act) elif (test_condition == 3): act = action.action_set_vlan_vid() act.vlan_vid = exp_vid action_list_tbl0.append(act) act = action.action_set_vlan_pcp() act.vlan_pcp = exp_pcp action_list_tbl0.append(act) else: if (test_condition == 0): act = action.action_set_vlan_vid() act.vlan_vid = vid + 1 action_list_tbl0.append(act) # Create action_list for TBL1 vid_match_tbl1 = exp_vid pcp_match_tbl1 = exp_pcp # Output action for table1 will be set in the framework action_list_tbl1 = None flow_match_test_vlan_two_tables(parent, pa_port_map, dl_vlan=vid, dl_vlan_pcp=pcp, dl_vlan_int=vid_int, dl_vlan_pcp_int=pcp_int, vid_match_tbl0=vid_match_tbl0, pcp_match_tbl0=pcp_match_tbl0, action_list_tbl0 = action_list_tbl0, match_exp_tbl0 = True, vid_match_tbl1=vid_match_tbl1, pcp_match_tbl1=pcp_match_tbl1, action_list_tbl1 = action_list_tbl1, match_exp_tbl1 = match_exp, exp_vid=exp_vid, exp_pcp=exp_pcp, add_tag_exp=True, wildcards=wildcards, max_test=1)
def vlan_singlepush_act_tests(parent, test_condition=0): """ Test vlan push action for the packets with/without tags @param parent Must implement controller, dataplane, assertTrue, assertEqual and logger @param test_condition Value between 0 and 2 """ parent.assertTrue(((parent.num_tags>=0) and (parent.num_tags<=2)), "Parameter num_tags not within an acceptable range") (sup_pop_vlan, sup_push_vlan, sup_set_vlan_vid, sup_set_vlan_pcp) = \ vlan_action_support_check(parent) if sup_push_vlan == False: testutils.skip_message_emit(parent, "Vlan single push action test. SET VLAN VID not supported") return if test_condition == 0: act = action.action_push_vlan() act.ethertype = ETHERTYPE_VLAN match_exp = True add_tag_exp = True if parent.num_tags == 0: exp_vid = 1 exp_pcp = 0 act2 = action.action_set_vlan_vid() act2.vlan_vid = 1 else: exp_vid = parent.vid exp_pcp = parent.pcp act2 = action.action_set_vlan_vid() act2.vlan_vid = parent.vid exp_msg = ofp.OFPT_FLOW_REMOVED exp_msg_type = 0 #NOT_EXPECTED exp_msg_code = 0 #NOT_EXPECTED elif test_condition == 1: act = action.action_push_vlan() act.ethertype = ETHERTYPE_VLAN_PBB match_exp = True add_tag_exp = True if parent.num_tags == 0: exp_vid = 1 exp_pcp = 0 act2 = action.action_set_vlan_vid() act2.vlan_vid = 1 else: exp_vid = parent.vid exp_pcp = parent.pcp act2 = action.action_set_vlan_vid() act2.vlan_vid = parent.vid exp_msg = ofp.OFPT_FLOW_REMOVED exp_msg_type = 0 #NOT_EXPECTED exp_msg_code = 0 #NOT_EXPECTED elif test_condition == 2: act = action.action_push_vlan() act.ethertype = 0xaaa #Other than 0x8100 and 0x88a8 match_exp = False add_tag_exp = False exp_vid = 1 exp_pcp = 0 act2 = action.action_set_vlan_vid() act2.vlan_vid = 1 exp_msg = ofp.OFPT_ERROR exp_msg_type = ofp.OFPET_BAD_ACTION exp_msg_code = ofp.OFPBAC_BAD_ARGUMENT else: return #NOTE need to set a VLAN vid value, as vid=0 is stripped by the system action_list=[act, act2] testutils.flow_match_test_vlan(parent, pa_port_map, wildcards=0, dl_vlan=parent.vid, dl_vlan_pcp=parent.pcp, dl_vlan_type=parent.vlan_type, dl_vlan_int=parent.vid_2nd, dl_vlan_pcp_int=parent.pcp_2nd, vid_match=parent.vid_match, pcp_match=parent.pcp_match, exp_vid=exp_vid, exp_pcp=exp_pcp, exp_vlan_type=act.ethertype, match_exp=match_exp, add_tag_exp=add_tag_exp, exp_msg=exp_msg, exp_msg_type=exp_msg_type, exp_msg_code=exp_msg_code, action_list=action_list, max_test=1)
def vlan_multipush_act_tests(parent, test_condition=0): """ Test vlan push action for the packets with/without tags @param parent Must implement controller, dataplane, assertTrue, assertEqual and logger @param test_condition Value between 0 and 3 """ parent.assertTrue( ((parent.num_tags >= 0) and (parent.num_tags <= 2)), "Parameter num_tags not within an acceptable range" ) (sup_pop_vlan, sup_push_vlan, sup_set_vlan_vid, sup_set_vlan_pcp) = vlan_action_support_check(parent) if sup_push_vlan == False: testutils.skip_message_emit(parent, "Vlan multiple push action test. PUSH not supported") return if sup_pop_vlan == False: testutils.skip_message_emit(parent, "Vlan multiple push action test. POP not supported") return if sup_set_vlan_vid == False: testutils.skip_message_emit(parent, "Vlan multiple push action test. SET VLAN VID not supported") return if sup_set_vlan_pcp == False: testutils.skip_message_emit(parent, "Vlan multiple push action test. SET VLAN PCP not supported") return new_vid = parent.vid + 2 new_pcp = parent.pcp + 2 act = action.action_push_vlan() act.ethertype = ETHERTYPE_VLAN act3 = None if test_condition == 0: act2 = action.action_set_vlan_vid() act2.vlan_vid = new_vid add_tag_exp = True exp_vid = new_vid exp_vlan_type = act.ethertype if parent.num_tags == 0: exp_pcp = 0 else: exp_pcp = parent.pcp elif test_condition == 1: act2 = action.action_set_vlan_pcp() act2.vlan_pcp = new_pcp add_tag_exp = True exp_pcp = new_pcp exp_vlan_type = act.ethertype if parent.num_tags == 0: exp_vid = 0 else: exp_vid = parent.vid elif test_condition == 2: act2 = action.action_set_vlan_vid() act2.vlan_vid = new_vid act3 = action.action_set_vlan_pcp() act3.vlan_pcp = new_pcp add_tag_exp = True exp_vid = new_vid exp_pcp = new_pcp exp_vlan_type = act.ethertype elif test_condition == 3: act2 = action.action_pop_vlan() add_tag_exp = False exp_vid = parent.vid exp_pcp = parent.pcp exp_vlan_type = parent.vlan_type else: return match_exp = True exp_msg = ofp.OFPT_FLOW_REMOVED exp_msg_type = 0 # NOT_EXPECTED exp_msg_code = 0 # NOT_EXPECTED action_list = [act, act2] if act3 is not None: action_list.append(act3) testutils.flow_match_test_vlan( parent, pa_port_map, wildcards=0, dl_vlan=parent.vid, dl_vlan_pcp=parent.pcp, dl_vlan_type=parent.vlan_type, dl_vlan_int=parent.vid_2nd, dl_vlan_pcp_int=parent.pcp_2nd, vid_match=parent.vid_match, pcp_match=parent.pcp_match, exp_vid=exp_vid, exp_pcp=exp_pcp, exp_vlan_type=exp_vlan_type, match_exp=match_exp, add_tag_exp=add_tag_exp, exp_msg=exp_msg, exp_msg_type=exp_msg_type, exp_msg_code=exp_msg_code, action_list=action_list, max_test=1, )
def vlan_multipush_act_tests(parent, test_condition=0): """ Test vlan push action for the packets with/without tags @param parent Must implement controller, dataplane, assertTrue, assertEqual and logger @param test_condition Value between 0 and 3 """ parent.assertTrue(((parent.num_tags >= 0) and (parent.num_tags <= 2)), "Parameter num_tags not within an acceptable range") (sup_pop_vlan, sup_push_vlan, sup_set_vlan_vid, sup_set_vlan_pcp) = \ vlan_action_support_check(parent) if sup_push_vlan == False: testutils.skip_message_emit( parent, "Vlan multiple push action test. PUSH not supported") return if sup_pop_vlan == False: testutils.skip_message_emit( parent, "Vlan multiple push action test. POP not supported") return if sup_set_vlan_vid == False: testutils.skip_message_emit( parent, "Vlan multiple push action test. SET VLAN VID not supported") return if sup_set_vlan_pcp == False: testutils.skip_message_emit( parent, "Vlan multiple push action test. SET VLAN PCP not supported") return new_vid = parent.vid + 2 new_pcp = parent.pcp + 2 act = action.action_push_vlan() act.ethertype = ETHERTYPE_VLAN act3 = None if test_condition == 0: act2 = action.action_set_vlan_vid() act2.vlan_vid = new_vid add_tag_exp = True exp_vid = new_vid exp_vlan_type = act.ethertype if parent.num_tags == 0: exp_pcp = 0 else: exp_pcp = parent.pcp elif test_condition == 1: act2 = action.action_set_vlan_pcp() act2.vlan_pcp = new_pcp add_tag_exp = True exp_pcp = new_pcp exp_vlan_type = act.ethertype if parent.num_tags == 0: exp_vid = 0 else: exp_vid = parent.vid elif test_condition == 2: act2 = action.action_set_vlan_vid() act2.vlan_vid = new_vid act3 = action.action_set_vlan_pcp() act3.vlan_pcp = new_pcp add_tag_exp = True exp_vid = new_vid exp_pcp = new_pcp exp_vlan_type = act.ethertype elif test_condition == 3: act2 = action.action_pop_vlan() add_tag_exp = False exp_vid = parent.vid exp_pcp = parent.pcp exp_vlan_type = parent.vlan_type else: return match_exp = True exp_msg = ofp.OFPT_FLOW_REMOVED exp_msg_type = 0 #NOT_EXPECTED exp_msg_code = 0 #NOT_EXPECTED action_list = [act, act2] if act3 is not None: action_list.append(act3) testutils.flow_match_test_vlan(parent, pa_port_map, wildcards=0, dl_vlan=parent.vid, dl_vlan_pcp=parent.pcp, dl_vlan_type=parent.vlan_type, dl_vlan_int=parent.vid_2nd, dl_vlan_pcp_int=parent.pcp_2nd, vid_match=parent.vid_match, pcp_match=parent.pcp_match, exp_vid=exp_vid, exp_pcp=exp_pcp, exp_vlan_type=exp_vlan_type, match_exp=match_exp, add_tag_exp=add_tag_exp, exp_msg=exp_msg, exp_msg_type=exp_msg_type, exp_msg_code=exp_msg_code, action_list=action_list, max_test=1)
def vlan_set_act_tests(parent, test_condition=0): """ Test vlan set_vid and set_pcp action for the packets with/without tags @param parent Must implement controller, dataplane, assertTrue, assertEqual and logger @param test_condition Value between 0 and 3 """ parent.assertTrue(((parent.num_tags >= 0) and (parent.num_tags <= 2)), "Parameter num_tags not within an acceptable range") (sup_pop_vlan, sup_push_vlan, sup_set_vlan_vid, sup_set_vlan_pcp) = \ vlan_action_support_check(parent) new_vid = parent.vid + 2 new_pcp = parent.pcp + 2 if sup_set_vlan_vid == False: testutils.skip_message_emit( parent, "Vlan set action test. SET VLAN VID not supported") return if sup_set_vlan_pcp == False: testutils.skip_message_emit( parent, "Vlan set action test. SET VLAN PCP not supported") return exp_vlan_type = parent.vlan_type if test_condition == 0: act = action.action_set_vlan_vid() act.vlan_vid = new_vid if parent.num_tags == 0: match_exp = False exp_vid = -1 exp_pcp = 0 exp_msg = ofp.OFPT_ERROR exp_msg_type = ofp.OFPET_BAD_ACTION exp_msg_code = ofp.OFPBAC_MATCH_INCONSISTENT else: match_exp = True exp_vid = new_vid exp_pcp = parent.pcp exp_msg = ofp.OFPT_FLOW_REMOVED exp_msg_type = 0 #NOT_EXPECTED exp_msg_code = 0 #NOT_EXPECTED elif test_condition == 1: act = action.action_set_vlan_vid() act.vlan_vid = 4096 #OUT OF RANGE match_exp = False exp_vid = -1 exp_pcp = 0 exp_msg = ofp.OFPT_ERROR exp_msg_type = ofp.OFPET_BAD_ACTION exp_msg_code = ofp.OFPBAC_BAD_ARGUMENT elif test_condition == 2: act = action.action_set_vlan_pcp() act.vlan_pcp = new_pcp if parent.num_tags == 0: match_exp = False exp_vid = -1 exp_pcp = 0 exp_msg = ofp.OFPT_ERROR exp_msg_type = ofp.OFPET_BAD_ACTION exp_msg_code = ofp.OFPBAC_MATCH_INCONSISTENT else: match_exp = True exp_vid = parent.vid exp_pcp = new_pcp exp_msg = ofp.OFPT_FLOW_REMOVED exp_msg_type = 0 #NOT_EXPECTED exp_msg_code = 0 #NOT_EXPECTED elif test_condition == 3: act = action.action_set_vlan_pcp() act.vlan_pcp = 8 #OUT OF RANGE match_exp = False exp_vid = -1 exp_pcp = 0 exp_msg = ofp.OFPT_ERROR exp_msg_type = ofp.OFPET_BAD_ACTION exp_msg_code = ofp.OFPBAC_BAD_ARGUMENT else: return action_list = [act] testutils.flow_match_test_vlan(parent, pa_port_map, wildcards=0, dl_vlan=parent.vid, dl_vlan_pcp=parent.pcp, dl_vlan_type=parent.vlan_type, dl_vlan_int=parent.vid_2nd, dl_vlan_pcp_int=parent.pcp_2nd, vid_match=parent.vid_match, pcp_match=parent.pcp_match, exp_vid=exp_vid, exp_pcp=exp_pcp, exp_vlan_type=exp_vlan_type, match_exp=match_exp, exp_msg=exp_msg, exp_msg_type=exp_msg_type, exp_msg_code=exp_msg_code, action_list=action_list, max_test=1)