Exemplo n.º 1
0
    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))
Exemplo n.º 2
0
    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])
Exemplo n.º 3
0
    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])
Exemplo n.º 4
0
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)
Exemplo n.º 5
0
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)
Exemplo n.º 6
0
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
Exemplo n.º 7
0
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)
Exemplo n.º 8
0
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)
Exemplo n.º 9
0
    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)
Exemplo n.º 10
0
    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)
Exemplo n.º 11
0
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
Exemplo n.º 12
0
    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])
Exemplo n.º 13
0
    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])
Exemplo n.º 14
0
    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
Exemplo n.º 15
0
    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])
Exemplo n.º 16
0
    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])
Exemplo n.º 17
0
    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')
Exemplo n.º 18
0
    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])
Exemplo n.º 19
0
    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')
Exemplo n.º 20
0
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,
    )
Exemplo n.º 21
0
    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)
Exemplo n.º 22
0
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)
Exemplo n.º 23
0
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)
Exemplo n.º 24
0
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)
Exemplo n.º 25
0
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,
    )
Exemplo n.º 26
0
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)
Exemplo n.º 27
0
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)