import ptf from ptf.base_tests import BaseTest from ptf.testutils import * from scapy.all import * from mrzcpd import Mrzcpd from common_pkt import * import ptf.mask as mask bridge_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] ether=aa:aa:aa:aa:aa:a0 promisc=1 mtu=1500 driver=2 role=3 [device:veth1] ether=aa:aa:aa:aa:aa:a1 promisc=1 mtu=1500 driver=2 role=3 [device:veth2] ether=aa:aa:aa:aa:aa:a2 promisc=1 mtu=1500 driver=2 role=3 [device:veth3] ether=aa:aa:aa:aa:aa:a3 promisc=1 mtu=1500 driver=2 role=3 [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 # bridge [bridge:0] master_device=veth3 devices=veth0,veth1,veth2,veth3 """ dynamic_conf_base = """ [dp_trace_rule] enable=1 dp_trace_file_path=/var/run/mrzcpd/dp_trace.pcapng dp_trace_file_max_size=655360 [dp_trace_rule:0] bpf_expr=net 0.0.0.0/0 pkt_cnt_max=10240 """ """ +----------------------------------------------------------------------------------------------+ | Name | veth0 | veth1 | veth2 | veth3 (master) | +----------------------------------------------------------------------------------------------+ | Mac | aa:aa:aa:aa:aa:a0 | aa:aa:aa:aa:aa:a1 | aa:aa:aa:aa:aa:a2 | aa:aa:aa:aa:aa:a3 | +----------------------------------------------------------------------------------------------+ """ @group("bridge_test_unicast") class TestForUnicastPkt(BaseTest): def setUp(self): self.dataplane = ptf.dataplane_instance def __init__(self): BaseTest.__init__(self) def runTest(self): try: # Init & Start mrzcpd mrzcpd = Mrzcpd(bridge_conf, dynamic_conf_base) mrzcpd.start() """ +-------+ +-------+ | veth3 | ---> | veth0 | +-------+ +-------+ """ # Create packet send_pkt = simple_tcp_packet(eth_dst='aa:aa:aa:aa:aa:a0', eth_src='bb:bb:bb:bb:bb:b0') verify_pkt = simple_tcp_packet(eth_dst='aa:aa:aa:aa:aa:a0', eth_src='bb:bb:bb:bb:bb:b0') send_packet(self, 3, send_pkt) verify_packets(self, verify_pkt, [0]) """ +-------+ +-------+ | veth0 | ---> | veth1 | +-------+ +-------+ """ # Create packet send_pkt = simple_tcp_packet(eth_dst='aa:aa:aa:aa:aa:a1', eth_src='bb:bb:bb:bb:bb:b0') verify_pkt = simple_tcp_packet(eth_dst='aa:aa:aa:aa:aa:a1', eth_src='bb:bb:bb:bb:bb:b0') send_packet(self, 0, send_pkt) verify_packets(self, verify_pkt, [1]) """ +-------+ +-------+ | veth1 | ---> | veth2 | +-------+ +-------+ """ # Create packet send_pkt = simple_tcp_packet(eth_dst='aa:aa:aa:aa:aa:a2', eth_src='bb:bb:bb:bb:bb:b0') verify_pkt = simple_tcp_packet(eth_dst='aa:aa:aa:aa:aa:a2', eth_src='bb:bb:bb:bb:bb:b0') send_packet(self, 1, send_pkt) verify_packets(self, verify_pkt, [2]) """ +-------+ +-------+ | veth2 | ---> | veth3 | +-------+ +-------+ """ # Create packet send_pkt = simple_tcp_packet(eth_dst='aa:aa:aa:aa:aa:a3', eth_src='bb:bb:bb:bb:bb:b0') verify_pkt = simple_tcp_packet(eth_dst='aa:aa:aa:aa:aa:a3', eth_src='bb:bb:bb:bb:bb:b0') send_packet(self, 2, send_pkt) verify_packets(self, verify_pkt, [3]) finally: mrzcpd.stop() """ +-------+ |---> | veth0 | | +-------+ | +-------------------+ | +-------+ | veth3 (broadcast) | -----|---> | veth1 | +-------------------+ | +-------+ | | +-------+ |---> | veth2 | +-------+ """ @group("bridge_test_broadcast") class TestForBroadcastPkt(BaseTest): def setUp(self): self.dataplane = ptf.dataplane_instance def __init__(self): BaseTest.__init__(self) def runTest(self): try: # Init & Start mrzcpd mrzcpd = Mrzcpd(bridge_conf, dynamic_conf_base) mrzcpd.start() # Create packet send_pkt = simple_tcp_packet(eth_dst='ff:ff:ff:ff:ff:ff', eth_src='bb:bb:bb:bb:bb:b0') verify_pkt = simple_tcp_packet(eth_dst='ff:ff:ff:ff:ff:ff', eth_src='bb:bb:bb:bb:bb:b0') send_packet(self, 3, send_pkt) verify_packets(self, verify_pkt, [0, 1, 2]) finally: mrzcpd.stop() """ +-------+ | veth1 | +-------+ +--------------------------+ +-------+ | veth0 (unknown dst mac ) | ---| | veth2 | +--------------------------+ | +-------+ | | +----------------+ |---> | veth3 (master) | +----------------+ """ @group("bridge_test_master_device") class TestForMasterDevice(BaseTest): def setUp(self): self.dataplane = ptf.dataplane_instance def __init__(self): BaseTest.__init__(self) def runTest(self): try: # Init & Start mrzcpd mrzcpd = Mrzcpd(bridge_conf, dynamic_conf_base) mrzcpd.start() # Create packet send_pkt = simple_tcp_packet(eth_dst='11:11:11:11:11:11', eth_src='bb:bb:bb:bb:bb:b0') verify_pkt = simple_tcp_packet(eth_dst='11:11:11:11:11:11', eth_src='bb:bb:bb:bb:bb:b0') send_packet(self, 0, send_pkt) verify_packets(self, verify_pkt, [3]) finally: mrzcpd.stop()