import ptf from ptf.base_tests import BaseTest from ptf import config from ptf.testutils import * from scapy.all import * from mrzcpd import Mrzcpd start_conf = """ [device] device = veth0,veth1,veth2,veth3,veth4,veth5,veth6,veth7,veth8,veth9,veth10,veth11,veth12,veth13,veth14,veth15,veth16,veth17,veth18,veth19,veth20,veth21,veth22,veth23 sz_tunnel = 8192 sz_buffer = 0 [device:veth0] promisc = 1 mtu = 1500 driver = 2 role = 1 [device:veth1] promisc = 1 mtu = 1500 driver = 2 role = 1 [device:veth2] promisc = 1 mtu = 1500 driver = 2 role = 1 [device:veth3] promisc = 1 mtu = 1500 driver = 2 role = 1 [device:veth4] promisc = 1 mtu = 1500 driver = 2 role = 1 [device:veth5] promisc = 1 mtu = 1500 driver = 2 role = 1 [device:veth6] promisc = 1 mtu = 1500 driver = 2 role = 1 [device:veth7] promisc = 1 mtu = 1500 driver = 2 role = 1 [device:veth8] promisc = 1 mtu = 1500 driver = 2 role = 1 [device:veth9] promisc = 1 mtu = 1500 driver = 2 role = 1 [device:veth10] promisc = 1 mtu = 1500 driver = 2 role = 1 [device:veth11] promisc = 1 mtu = 1500 driver = 2 role = 1 [device:veth12] promisc = 1 mtu = 1500 driver = 2 role = 1 [device:veth13] promisc = 1 mtu = 1500 driver = 2 role = 1 [device:veth14] promisc = 1 mtu = 1500 driver = 2 role = 1 [device:veth15] promisc = 1 mtu = 1500 driver = 2 role = 1 [device:veth16] promisc = 1 mtu = 1500 driver = 2 role = 1 [device:veth17] promisc = 1 mtu = 1500 driver = 2 role = 1 [device:veth18] promisc = 1 mtu = 1500 driver = 2 role = 1 [device:veth19] promisc = 1 mtu = 1500 driver = 2 role = 1 [device:veth20] promisc = 1 mtu = 1500 driver = 2 role = 1 [device:veth21] promisc = 1 mtu = 1500 driver = 2 role = 1 [device:veth22] promisc = 1 mtu = 1500 driver = 2 role = 1 [device:veth23] promisc = 1 mtu = 1500 driver = 2 role = 1 [service] iocore = 1 distmode = 2 hashmode = 0 [limits] nr_max_ef_adapters=32 nr_max_vwires=32 nr_max_tera_adapters=32 nr_max_link_dbs=32 [eal] virtaddr = 0x600000000000 loglevel = 7 nohuge = 1 mem = 65535 [keepalive] check_spinlock=1 [http_server] listen_addr=127.0.0.1 [ctrlzone] ctrlzone0 = tunnat, 64 ctrlzone1 = vsys, 64 [pool] create_mode = 3 sz_direct_pktmbuf = 4096 sz_indirect_pktmbuf = 4096 sz_cache = 256 sz_data = 3000 [ctrlmsg] listen_addr = 0.0.0.0 listen_port = 46789 [rpc] addr = 127.0.0.1 port = 56789 # sid [ef_adapters] sid_start=100 sid_end=200 max_rules=256 [vwires] sid_start=300 sid_end=400 max_rules=256 [service_lb] sid_start=1000 sid_end=2000 # vwire [vwire:0] vwire_id = 0 interface_int = veth0 interface_ext = veth1 [vwire:1] vwire_id = 1 interface_int = veth2 interface_ext = veth3 [vwire:2] vwire_id = 2 interface_int = veth4 interface_ext = veth5 [vwire:3] vwire_id = 3 interface_int = veth6 interface_ext = veth7 [vwire:4] vwire_id = 4 interface_int = veth8 interface_ext = veth9 [vwire:5] vwire_id = 5 interface_int = veth10 interface_ext = veth11 [vwire:6] vwire_id = 6 interface_int = veth12 interface_ext = veth13 [vwire:7] vwire_id = 7 interface_int = veth14 interface_ext = veth15 [vwire:8] vwire_id = 8 interface_int = veth16 interface_ext = veth17 [vwire:9] vwire_id = 9 interface_int = veth18 interface_ext = veth19 [vwire:10] vwire_id = 10 interface_int = veth20 interface_ext = veth21 [vwire:11] vwire_id = 11 interface_int = veth22 interface_ext = veth23 """ """ +--------------+ +----------+ | PTF | | Mrzcpd | +--------------+ +----------+ | veth0-ptf0 | ---> | veth0 | +--------------+ +----------+ | veth1-ptf1 | <--- | veth1 | +--------------+ +----------+ | veth2-ptf2 | ---> | veth2 | +--------------+ +----------+ | veth3-ptf3 | <--- | veth3 | +--------------+ +----------+ | ... ... | ... | ... | +--------------+ +----------+ | veth22-ptf22 | ---> | veth22 | +--------------+ +----------+ | veth23-ptf23 | <--- | veth23 | +--------------+ +----------+ """ @group("vwire_test") class TestSendAndReceive(BaseTest): # Base test init def __init__(self): BaseTest.__init__(self) # Dataplane set up def setUp(self): self.dataplane = ptf.dataplane_instance # Run test def runTest(self): try: # Init & Start mrzcpd mrzcpd = Mrzcpd(start_conf,"") mrzcpd.start() # Create packet pkt = simple_tcp_packet(eth_dst='00:11:11:11:11:11', eth_src='00:22:22:22:22:22', ip_dst='10.0.0.1', ip_id=101, ip_ttl=64) # Traverse all ports for i in range(0, 24, 2): # Send pkt for the port send_packet(self, i, pkt) # Verify pkt for specified port verify_packets(self, pkt, [i+1]) finally: mrzcpd.stop() start_conf_with_non_contiguous_test = """ [device] device = veth0,veth1,veth2,veth3,veth4,veth5,veth6,veth7,veth8 sz_tunnel = 8192 sz_buffer = 0 [device:veth0] promisc = 1 mtu = 1500 driver = 2 role = 1 [device:veth1] promisc = 1 mtu = 1500 driver = 2 role = 1 [device:veth2] promisc = 1 mtu = 1500 driver=2 role=4 [device:veth3] promisc = 1 mtu = 1500 driver = 2 role = 1 [device:veth4] promisc = 1 mtu = 1500 driver = 2 role = 1 [device:veth5] promisc = 1 mtu = 1500 driver=2 role=4 [device:veth6] promisc = 1 mtu = 1500 driver = 2 role = 1 [device:veth7] promisc = 1 mtu = 1500 driver = 2 role = 1 [device:veth8] promisc = 1 mtu = 1500 driver=2 role=4 [service] iocore = 1 distmode = 2 hashmode = 0 [limits] nr_max_ef_adapters=32 nr_max_vwires=32 nr_max_tera_adapters=32 nr_max_link_dbs=32 [eal] virtaddr = 0x600000000000 loglevel = 7 nohuge = 1 mem = 65535 [keepalive] check_spinlock=1 [http_server] listen_addr=127.0.0.1 [ctrlzone] ctrlzone0 = tunnat, 64 ctrlzone1 = vsys, 64 [pool] create_mode = 3 sz_direct_pktmbuf = 4096 sz_indirect_pktmbuf = 4096 sz_cache = 256 sz_data = 3000 [ctrlmsg] listen_addr = 0.0.0.0 listen_port = 46789 [rpc] addr = 127.0.0.1 port = 56789 # sid [ef_adapters] sid_start=100 sid_end=200 max_rules=256 [vwires] sid_start=300 sid_end=400 max_rules=256 [service_lb] sid_start=1000 sid_end=2000 # vwire [vwire:0] vwire_id = 0 interface_int = veth0 interface_ext = veth1 [vwire:1] vwire_id = 2 interface_int = veth3 interface_ext = veth4 [vwire:2] vwire_id = 4 interface_int = veth6 interface_ext = veth7 # load balance [load_balance:0] sid=1000 mode=0 devices=veth2,0 [load_balance:1] sid=1001 mode=0 devices=veth5,0 [load_balance:2] sid=1002 mode=0 devices=veth8,0 """ dynamic_conf_with_non_contiguous_test = """ [classifier_rule:0] rule_id=1 ruleset_type=0 action=2 priority=1 sid=1000 vwire_id=0 [classifier_rule:1] rule_id=2 ruleset_type=0 action=2 priority=1 sid=1001 vwire_id=2 [classifier_rule:2] rule_id=2 ruleset_type=0 action=2 priority=1 sid=1002 vwire_id=4 """ """ +--------------+ +----------++-----------+----------+ | PTF | | Mrzcpd | +--------------+ +----------++-----------+----------+ | veth0-ptf0 | ---> | veth0 | | | +------------+ +--------------+ +----------+ | veth2 | ---> | veth2-ptf2 | | veth1-ptf1 | <-\- | veth1 | | | +------------+ +--------------+ +----------+ +----------+ | veth3-ptf3 | ---> | veth3 | | | +------------+ +--------------+ +----------+ | veth5 | ---> | veth5-ptf5 | | veth4-ptf4 | <-\- | veth4 | | | +------------+ +--------------+ +----------+ +----------+ | veth6-ptf6 | ---> | veth6 | | | +------------+ +--------------+ +----------+ | veth8 | ---> | veth8-ptf8 | | veth7-ptf7 | <-\- | veth7 | | | +------------+ +--------------+ +----------++----------++----------+ """ @group("id_non_contiguous_test") class IdNonContiguousTest(BaseTest): # Base test init def __init__(self): BaseTest.__init__(self) # Dataplane set up def setUp(self): self.dataplane = ptf.dataplane_instance # Run test def runTest(self): try: # Init & Start mrzcpd mrzcpd = Mrzcpd(start_conf_with_non_contiguous_test,dynamic_conf_with_non_contiguous_test) mrzcpd.start() packets=[] # Create packets for i in range(0,3): packets.append(simple_tcp_packet(eth_dst='00:11:11:11:11:11', eth_src='00:22:22:22:22:22', ip_dst='10.0.0.' + str(i), ip_id=101, ip_ttl=64)) # Traverse all ports for i in range(0, 3): # Send pkt for the port send_packet(self, i * 3 , packets[i]) # Verify pkt for specified port verify_packets(self, packets[i], [2 + i*3]) finally: mrzcpd.stop()