def mpls_multipush3_act_tests(parent, test_condition=0): """ Test mpls push and set with out-of-range value actions for the packets with/without tags @param parent Must implement controller, dataplane, assertTrue, assertEqual and logger """ parent.assertTrue(((parent.num_tags >= 0) and (parent.num_tags <= 2)), "Parameter num_tags not within an acceptable range") sup_mpls_act = mpls_action_support_check(parent) if sup_mpls_act.has_key('sup_push_mpls') == False: testutils.skip_message_emit( parent, "MPLS multipush action test. PUSH not supported") return if sup_mpls_act.has_key('sup_set_mpls_label') == False: testutils.skip_message_emit( parent, "MPLS multipush action test. SET_LABEL not supported") return if sup_mpls_act.has_key('sup_set_mpls_tc') == False: testutils.skip_message_emit( parent, "MPLS multipush action test. SET_TC not supported") return act = action.action_push_mpls() act.ethertype = 0x8847 if test_condition == 0: #act2 = action.action_set_mpls_label() #act2.mpls_label = 1048576 #exp_label = act2.mpls_label act2 = action.action_set_field() act2.field = match.mpls_label(1048576) exp_label = 1048576 exp_tc = 0 exp_ttl = 0 # Not expected elif test_condition == 1: #act2 = action.action_set_mpls_tc() #act2.mpls_tc = 8 #exp_tc = act2.mpls_tc act2 = action.action_set_field() act2.field = match.mpls_tc(8) exp_tc = 8 exp_label = 0 exp_ttl = 0 # Not expected else: return match_exp = False exp_msg = ofp.OFPT_ERROR exp_msg_type = ofp.OFPET_BAD_ACTION exp_msg_code = ofp.OFPBAC_BAD_SET_ARGUMENT action_list = [act, act2] testutils.flow_match_test_mpls(parent, pa_port_map, wildcards=0, mpls_label=parent.label, mpls_tc=parent.tc, mpls_label_int=parent.label_int, mpls_tc_int=parent.tc_int, label_match=parent.label_match, tc_match=parent.tc_match, dl_type_match=parent.dl_type_match, exp_mpls_label=exp_label, exp_mpls_tc=exp_tc, exp_mpls_ttl=exp_ttl, 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 mpls_set_label_act_tests(parent, test_condition=0): """ Test mpls set_label action for the packets with/without tags @param parent Must implement controller, dataplane, assertTrue, assertEqual and logger """ parent.assertTrue(((parent.num_tags >= 0) and (parent.num_tags <= 2)), "Parameter num_tags not within an acceptable range") sup_mpls_act = mpls_action_support_check(parent) if sup_mpls_act.has_key('sup_set_mpls_label') == False: testutils.skip_message_emit( parent, "MPLS set_label action test. SET_LABEL not supported") return #act = action.action_set_mpls_label() act = action.action_set_field() exp_tc = parent.tc exp_ttl = parent.ttl if test_condition == 0: #act.mpls_label = parent.label + 2 act.field = match.mpls_label(parent.label + 2) if parent.num_tags == 0: match_exp = False exp_msg = ofp.OFPT_ERROR exp_msg_type = ofp.OFPET_BAD_ACTION exp_msg_code = ofp.OFPBAC_MATCH_INCONSISTENT exp_label = parent.label else: match_exp = True exp_msg = ofp.OFPT_FLOW_REMOVED exp_msg_type = 0 #NOT_EXPECTED exp_msg_code = 0 #NOT_EXPECTED exp_label = parent.label + 2 action_list = [act] elif test_condition == 1: #act.mpls_label = 1048576 act.field = match.mpls_label(1048576) if parent.num_tags == 0: match_exp = False exp_msg = ofp.OFPT_ERROR exp_msg_type = ofp.OFPET_BAD_ACTION exp_msg_code = ofp.OFPBAC_MATCH_INCONSISTENT exp_label = parent.label else: match_exp = False exp_msg = ofp.OFPT_ERROR exp_msg_type = ofp.OFPET_BAD_ACTION exp_msg_code = ofp.OFPBAC_BAD_SET_ARGUMENT exp_label = 1048576 action_list = [act] else: return testutils.flow_match_test_mpls(parent, pa_port_map, wildcards=0, mpls_label=parent.label, mpls_tc=parent.tc, mpls_ttl=parent.ttl, mpls_label_int=parent.label_int, mpls_tc_int=parent.tc_int, mpls_ttl_int=parent.ttl_int, ip_ttl=parent.ip_ttl, label_match=parent.label_match, tc_match=parent.tc_match, dl_type_match=parent.dl_type_match, exp_mpls_label=exp_label, exp_mpls_tc=exp_tc, exp_mpls_ttl=exp_ttl, 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 packet_to_flow_match(packet): """ Create a flow match that matches packet with the given wildcards @param packet The packet to use as a flow template @param pkt_format Currently only L2 is supported. Will indicate the overall packet type for parsing @return An ofp_match object if successful. None if format is not recognized. The wildcards of the match will be cleared for the values extracted from the packet. @todo check min length of packet @todo Check if packet is other than L2 format @todo implement other fields covered by OpenFlow 1.2 """ match_ls = match_list() if Ether in packet: ether = packet[Ether] eth_type = match.eth_type(ether.type) eth_dst = match.eth_dst(parse_mac(ether.dst)) eth_src = match.eth_src(parse_mac(ether.src)) match_ls.add(eth_type) match_ls.add(eth_dst) match_ls.add(eth_src) else: return match_ls if Dot1Q in packet: #TODO: nicer way to get last vlan tag? vlan = packet[Dot1Q:0] vlan_vid = match.vlan_vid(vlan.vlan) vlan_pcp = match.vlan_pcp(vlan.prio) match_ls.add(vlan_vid) match_ls.add(vlan_pcp) vlan_pl = vlan.payload while vlan_pl is not None and vlan_pl.name == Dot1Q.name: vlan = vlan_pl vlan_pl = vlan.payload #We need to overwrite the already # inserted eth_type eth_index = match.tlvs.index() eth_type = match.eth_type(vlan.type) match_ls.tlvs.insert(vlan.type, eth_index) #TODO ARP if MPLS in packet: mpls = packet[MPLS:0] mpls_label = match.mpls_label(mpls.label) mpls_tc = match.mpls_tc(mpls.cos) match_ls.add(mpls_label) match_ls.add(mpls_tc) return match_ls if IP in packet: ip = packet[IP] ipv4_src = match.ipv4_src(parse_ip(ip.src)) ipv4_dst = match.ipv4_dst(parse_ip(ip.dst)) ip_dscp = match.ip_dscp(ip.tos >> 2) ip_ecn = match.ip_ecn(ip.tos & 0x03) match_ls.add(ipv4_src) match_ls.add(ipv4_dst) match_ls.add(ip_dscp) match_ls.add(ip_ecn) else: return match_ls if TCP in packet: tcp = packet[TCP] ip_proto = match.ip_proto(6) tcp_src = match.tcp_src(tcp.sport) tcp_dst = match.tcp_dst(tcp.dport) match_ls.add(ip_proto) match_ls.add(tcp_src) match_ls.add(tcp_dst) return match_ls if UDP in packet: udp = packet[UDP] ip_proto = match.ip_proto(17) udp_src = match.tcp_src(udp.sport) udp_dst = match.tcp_dst(udp.dport) match_ls.add(ip_proto) match_ls.add(udp_src) match_ls.add(udp_dst) returnmatch_ls if ICMP in packet: icmp = packet[ICMP] ip_proto = match.ip_proto(1) icmp_type = match.icmp_type(icmp.type) icmp_code = match.icmp_code(icmp.code) match_ls.add(icmp_type) match_ls.add(icmp_code) return match_ls return match_ls
def mpls_multipush2_act_tests(parent, test_condition=0): """ Test mpls push and set actions for the packets with/without tags @param parent Must implement controller, dataplane, assertTrue, assertEqual and logger """ parent.assertTrue(((parent.num_tags >= 0) and (parent.num_tags <= 2)), "Parameter num_tags not within an acceptable range") sup_mpls_act = mpls_action_support_check(parent) if sup_mpls_act.has_key('sup_push_mpls') == False: testutils.skip_message_emit( parent, "MPLS multipush action test. PUSH not supported") return if sup_mpls_act.has_key('sup_set_mpls_label') == False: testutils.skip_message_emit( parent, "MPLS multipush action test. SET_LABEL not supported") return if sup_mpls_act.has_key('sup_set_mpls_tc') == False: testutils.skip_message_emit( parent, "MPLS multipush action test. SET_TC not supported") return if sup_mpls_act.has_key('sup_set_mpls_ttl') == False: testutils.skip_message_emit( parent, "MPLS multipush action test. SET_TTL not supported") return if sup_mpls_act.has_key('sup_dec_mpls_ttl') == False: testutils.skip_message_emit( parent, "MPLS multipush action test. DEC_TTL not supported") return act = action.action_push_mpls() act.ethertype = 0x8847 if test_condition == 0: #act2 = action.action_set_mpls_label() #act2.mpls_label = parent.label + 2 act2 = action.action_set_field() act2.field = match.mpls_label(parent.label + 2) exp_label = parent.label + 2 if parent.num_tags == 0: exp_tc = 0 exp_ttl = parent.ip_ttl else: exp_tc = parent.tc exp_ttl = parent.ttl elif test_condition == 1: #act2 = action.action_set_mpls_tc() #act2.mpls_tc = parent.tc + 2 #exp_tc = act2.mpls_tc act2 = action.action_set_field() act2.field = match.mpls_tc(parent.tc + 2) exp_tc = parent.tc + 2 if parent.num_tags == 0: exp_label = 0 exp_ttl = parent.ip_ttl else: exp_label = parent.label exp_ttl = parent.ttl elif test_condition == 2: act2 = action.action_set_mpls_ttl() act2.mpls_ttl = parent.ttl + 2 exp_ttl = act2.mpls_ttl if parent.num_tags == 0: exp_label = 0 exp_tc = 0 else: exp_label = parent.label exp_tc = parent.tc elif test_condition == 3: act2 = action.action_dec_mpls_ttl() if parent.num_tags == 0: exp_ttl = parent.ip_ttl - 1 exp_label = 0 exp_tc = 0 else: exp_ttl = parent.ttl - 1 exp_label = parent.label exp_tc = parent.tc else: return match_exp = True add_tag_exp = parent.num_tags > 0 exp_msg = ofp.OFPT_FLOW_REMOVED exp_msg_type = 0 #NOT_EXPECTED exp_msg_code = 0 #NOT_EXPECTED action_list = [act, act2] testutils.flow_match_test_mpls(parent, pa_port_map, wildcards=0, mpls_label=parent.label, mpls_tc=parent.tc, mpls_label_int=parent.label_int, mpls_tc_int=parent.tc_int, label_match=parent.label_match, tc_match=parent.tc_match, dl_type_match=parent.dl_type_match, exp_mpls_label=exp_label, exp_mpls_tc=exp_tc, exp_mpls_ttl=exp_ttl, 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 packet_to_flow_match(packet): """ Create a flow match that matches packet with the given wildcards @param packet The packet to use as a flow template @param pkt_format Currently only L2 is supported. Will indicate the overall packet type for parsing @return An ofp_match object if successful. None if format is not recognized. The wildcards of the match will be cleared for the values extracted from the packet. @todo check min length of packet @todo Check if packet is other than L2 format @todo implement other fields covered by OpenFlow 1.2 """ match_ls = match_list() if Ether in packet: ether = packet[Ether] eth_type = match.eth_type(ether.type) eth_dst = match.eth_dst(parse_mac(ether.dst)) eth_src = match.eth_src(parse_mac(ether.src)) match_ls.add(eth_type) match_ls.add(eth_dst) match_ls.add(eth_src) else: return match_ls if Dot1Q in packet: #TODO: nicer way to get last vlan tag? vlan = packet[Dot1Q:0] vlan_vid = match.vlan_vid(vlan.vlan) vlan_pcp = match.vlan_pcp(vlan.prio) match_ls.add(vlan_vid) match_ls.add(vlan_pcp) vlan_pl = vlan.payload while vlan_pl is not None and vlan_pl.name == Dot1Q.name: vlan = vlan_pl vlan_pl = vlan.payload #We need to overwrite the already # inserted eth_type eth_index = match.tlvs.index() eth_type = match.eth_type(vlan.type) match_ls.tlvs.insert(vlan.type,eth_index) #TODO ARP if MPLS in packet: mpls = packet[MPLS:0] mpls_label = match.mpls_label(mpls.label) mpls_tc = match.mpls_tc(mpls.cos) match_ls.add(mpls_label) match_ls.add(mpls_tc) return match_ls if IP in packet: ip = packet[IP] ipv4_src = match.ipv4_src(parse_ip(ip.src)) ipv4_dst = match.ipv4_dst(parse_ip(ip.dst)) ip_dscp = match.ip_dscp(ip.tos >> 2) ip_ecn = match.ip_ecn(ip.tos & 0x03) match_ls.add(ipv4_src) match_ls.add(ipv4_dst) match_ls.add(ip_dscp) match_ls.add(ip_ecn) else: return match_ls if TCP in packet: tcp = packet[TCP] ip_proto = match.ip_proto(6) tcp_src = match.tcp_src(tcp.sport) tcp_dst = match.tcp_dst(tcp.dport) match_ls.add(ip_proto) match_ls.add(tcp_src) match_ls.add(tcp_dst) return match_ls if UDP in packet: udp = packet[UDP] ip_proto = match.ip_proto(17) udp_src = match.tcp_src(udp.sport) udp_dst = match.tcp_dst(udp.dport) match_ls.add(ip_proto) match_ls.add(udp_src) match_ls.add(udp_dst) returnmatch_ls if ICMP in packet: icmp = packet[ICMP] ip_proto = match.ip_proto(1) icmp_type = match.icmp_type(icmp.type) icmp_code = match.icmp_code(icmp.code) match_ls.add(icmp_type) match_ls.add(icmp_code) return match_ls return match_ls
def mpls_set_label_act_tests(parent, test_condition=0): """ Test mpls set_label action for the packets with/without tags @param parent Must implement controller, dataplane, assertTrue, assertEqual and logger """ parent.assertTrue(((parent.num_tags>=0) and (parent.num_tags<=2)), "Parameter num_tags not within an acceptable range") sup_mpls_act = mpls_action_support_check(parent) if sup_mpls_act.has_key('sup_set_mpls_label') == False: testutils.skip_message_emit(parent, "MPLS set_label action test. SET_LABEL not supported") return #act = action.action_set_mpls_label() act = action.action_set_field() exp_tc = parent.tc exp_ttl = parent.ttl if test_condition == 0: #act.mpls_label = parent.label + 2 act.field = match.mpls_label(parent.label + 2) if parent.num_tags == 0: match_exp = False exp_msg = ofp.OFPT_ERROR exp_msg_type = ofp.OFPET_BAD_ACTION exp_msg_code = ofp.OFPBAC_MATCH_INCONSISTENT exp_label = parent.label else: match_exp = True exp_msg = ofp.OFPT_FLOW_REMOVED exp_msg_type = 0 #NOT_EXPECTED exp_msg_code = 0 #NOT_EXPECTED exp_label = parent.label + 2 action_list=[act] elif test_condition == 1: #act.mpls_label = 1048576 act.field = match.mpls_label(1048576) if parent.num_tags == 0: match_exp = False exp_msg = ofp.OFPT_ERROR exp_msg_type = ofp.OFPET_BAD_ACTION exp_msg_code = ofp.OFPBAC_MATCH_INCONSISTENT exp_label = parent.label else: match_exp = False exp_msg = ofp.OFPT_ERROR exp_msg_type = ofp.OFPET_BAD_ACTION exp_msg_code = ofp.OFPBAC_BAD_SET_ARGUMENT exp_label = 1048576 action_list=[act] else: return testutils.flow_match_test_mpls(parent, pa_port_map, wildcards=0, mpls_label=parent.label, mpls_tc=parent.tc, mpls_ttl=parent.ttl, mpls_label_int=parent.label_int, mpls_tc_int=parent.tc_int, mpls_ttl_int=parent.ttl_int, ip_ttl=parent.ip_ttl, label_match=parent.label_match, tc_match=parent.tc_match, dl_type_match=parent.dl_type_match, exp_mpls_label=exp_label, exp_mpls_tc=exp_tc, exp_mpls_ttl=exp_ttl, 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 mpls_multipush3_act_tests(parent, test_condition=0): """ Test mpls push and set with out-of-range value actions for the packets with/without tags @param parent Must implement controller, dataplane, assertTrue, assertEqual and logger """ parent.assertTrue(((parent.num_tags>=0) and (parent.num_tags<=2)), "Parameter num_tags not within an acceptable range") sup_mpls_act = mpls_action_support_check(parent) if sup_mpls_act.has_key('sup_push_mpls') == False: testutils.skip_message_emit(parent, "MPLS multipush action test. PUSH not supported") return if sup_mpls_act.has_key('sup_set_mpls_label') == False: testutils.skip_message_emit(parent, "MPLS multipush action test. SET_LABEL not supported") return if sup_mpls_act.has_key('sup_set_mpls_tc') == False: testutils.skip_message_emit(parent, "MPLS multipush action test. SET_TC not supported") return act = action.action_push_mpls() act.ethertype = 0x8847 if test_condition == 0: #act2 = action.action_set_mpls_label() #act2.mpls_label = 1048576 #exp_label = act2.mpls_label act2 = action.action_set_field() act2.field = match.mpls_label(1048576) exp_label = 1048576 exp_tc = 0 exp_ttl = 0 # Not expected elif test_condition == 1: #act2 = action.action_set_mpls_tc() #act2.mpls_tc = 8 #exp_tc = act2.mpls_tc act2 = action.action_set_field() act2.field = match.mpls_tc(8) exp_tc = 8 exp_label = 0 exp_ttl = 0 # Not expected else: return match_exp = False exp_msg = ofp.OFPT_ERROR exp_msg_type = ofp.OFPET_BAD_ACTION exp_msg_code = ofp.OFPBAC_BAD_SET_ARGUMENT action_list=[act, act2] testutils.flow_match_test_mpls(parent, pa_port_map, wildcards=0, mpls_label=parent.label, mpls_tc=parent.tc, mpls_label_int=parent.label_int, mpls_tc_int=parent.tc_int, label_match=parent.label_match, tc_match=parent.tc_match, dl_type_match=parent.dl_type_match, exp_mpls_label=exp_label, exp_mpls_tc=exp_tc, exp_mpls_ttl=exp_ttl, 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 mpls_multipush2_act_tests(parent, test_condition=0): """ Test mpls push and set actions for the packets with/without tags @param parent Must implement controller, dataplane, assertTrue, assertEqual and logger """ parent.assertTrue(((parent.num_tags>=0) and (parent.num_tags<=2)), "Parameter num_tags not within an acceptable range") sup_mpls_act = mpls_action_support_check(parent) if sup_mpls_act.has_key('sup_push_mpls') == False: testutils.skip_message_emit(parent, "MPLS multipush action test. PUSH not supported") return if sup_mpls_act.has_key('sup_set_mpls_label') == False: testutils.skip_message_emit(parent, "MPLS multipush action test. SET_LABEL not supported") return if sup_mpls_act.has_key('sup_set_mpls_tc') == False: testutils.skip_message_emit(parent, "MPLS multipush action test. SET_TC not supported") return if sup_mpls_act.has_key('sup_set_mpls_ttl') == False: testutils.skip_message_emit(parent, "MPLS multipush action test. SET_TTL not supported") return if sup_mpls_act.has_key('sup_dec_mpls_ttl') == False: testutils.skip_message_emit(parent, "MPLS multipush action test. DEC_TTL not supported") return act = action.action_push_mpls() act.ethertype = 0x8847 if test_condition == 0: #act2 = action.action_set_mpls_label() #act2.mpls_label = parent.label + 2 act2 = action.action_set_field() act2.field = match.mpls_label(parent.label + 2) exp_label = parent.label + 2 if parent.num_tags == 0: exp_tc = 0 exp_ttl = parent.ip_ttl else: exp_tc = parent.tc exp_ttl = parent.ttl elif test_condition == 1: #act2 = action.action_set_mpls_tc() #act2.mpls_tc = parent.tc + 2 #exp_tc = act2.mpls_tc act2 = action.action_set_field() act2.field = match.mpls_tc(parent.tc + 2) exp_tc = parent.tc + 2 if parent.num_tags == 0: exp_label = 0 exp_ttl = parent.ip_ttl else: exp_label = parent.label exp_ttl = parent.ttl elif test_condition == 2: act2 = action.action_set_mpls_ttl() act2.mpls_ttl = parent.ttl + 2 exp_ttl = act2.mpls_ttl if parent.num_tags == 0: exp_label = 0 exp_tc = 0 else: exp_label = parent.label exp_tc = parent.tc elif test_condition == 3: act2 = action.action_dec_mpls_ttl() if parent.num_tags == 0: exp_ttl = parent.ip_ttl - 1 exp_label = 0 exp_tc = 0 else: exp_ttl = parent.ttl - 1 exp_label = parent.label exp_tc = parent.tc else: return match_exp = True add_tag_exp = parent.num_tags > 0 exp_msg = ofp.OFPT_FLOW_REMOVED exp_msg_type = 0 #NOT_EXPECTED exp_msg_code = 0 #NOT_EXPECTED action_list=[act, act2] testutils.flow_match_test_mpls(parent, pa_port_map, wildcards=0, mpls_label=parent.label, mpls_tc=parent.tc, mpls_label_int=parent.label_int, mpls_tc_int=parent.tc_int, label_match=parent.label_match, tc_match=parent.tc_match, dl_type_match=parent.dl_type_match, exp_mpls_label=exp_label, exp_mpls_tc=exp_tc, exp_mpls_ttl=exp_ttl, 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 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] mpls_label = 0xa5f05 # no specific meaning mpls_tc = 5 mpls_ttl = 129 pkt = testutils.simple_tcp_packet_w_mpls(mpls_label=mpls_label, mpls_tc=mpls_tc, mpls_ttl=mpls_ttl) match_ls = parse.packet_to_flow_match(pkt) wildcards = 0 new_mpls_label = 0x5a0fa exp_pkt = testutils.simple_tcp_packet_w_mpls( mpls_label_ext=new_mpls_label, mpls_tc_ext=mpls_tc, mpls_ttl_ext=mpls_ttl, mpls_label=mpls_label, mpls_tc=mpls_tc, mpls_ttl=mpls_ttl) # 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_mpls_label() #act.mpls_label = new_mpls_label act = action.action_set_field() act.field = match.mpls_label(new_mpls_label) act_list.append([act]) next_avail.append(True) chk_expire.append(False) #Table 2 act = action.action_push_mpls() act.ethertype = ETHERTYPE_MPLS act_list.append([act]) next_avail.append(False) chk_expire.append(False) write_action_test_multi_tables(self, ing_port, egr_port, match_fields = match_ls, wildcards = wildcards, act_list = act_list, next_avail = next_avail, chk_expire = chk_expire, pkt = pkt, exp_pkt = exp_pkt)