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 import msgpack start_conf_serialize = """ [device] device=veth0,veth1,veth2 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 encode=1 [mpack] metadata_enable=1 route_ctx_enable=0 [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,128 [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 # vwire [vwire:0] vwire_id=0 interface_int=veth0 interface_ext=veth1 [service_lb] sid_start=1000 sid_end=2000 # load balance [load_balance:0] sid=1000 mode=0 devices=veth2,0 """ dynamic_conf_serialize = """ [classifier_rule:0] rule_id=1 ruleset_type=0 action=2 priority=1 sid=1000 vwire_id=0 """ """ +------------+ +------------------------------------------+ +------------+ | PTF | | MRZCPD | | PTF | +------------+ +------------+--------+--------------------+ +------------+ | veth0-ptf0 | ---> | veth0 | ---> | veth2 (serialize) | ---> | veth2-ptf2 | +------------+ +------------+ +--------------------+ +------------+ | veth1-ptf1 | <--- | veth1 | <--- | - | +------------+ +------------+ +--------------------+ """ @group("msgpack_serialize_test") class MpackSerializeTest(BaseTest): def setUp(self): self.dataplane = ptf.dataplane_instance def __init__(self): BaseTest.__init__(self) def runTest(self): try: # Init & Start mrzcpd mrzcpd = Mrzcpd(start_conf_serialize,dynamic_conf_serialize) mrzcpd.start() send_pkt = simple_udp_packet(ip_src="172.17.1.100", ip_dst="172.17.2.200",udp_payload="hello world") send_packet(self, 0,send_pkt) # Verify verify_data = {'port': 0, 'packet_type': 0, 'ol_flags': 0, 'data_len': 100, 'pkt_len': 100, 'dir': 0, 'packet_create_from_nf': 0, 'is_ctrlbuf': 0, 'adapter_type': 1, 'adapter_id': 0, 'payload_offset': 0, 'user_0': 0, 'ef_link_id': 0, 'traffic_link_id': 65535, 'ef_peer_index': 0, 'port_ingress': 0, 'port_egress': 2, 'session_id': 0, 'cur_sid': 1000, 'sids': [0, 0, 0, 0, 0, 1000, 300, 0], 'head': 7, 'tail': 6, 'capacity': 7, 'packet':send_pkt.__bytes__()} binary_data = msgpack.dumps(verify_data) verify_pkt = simple_eth_packet(pktlen=14,eth_src="aa:bb:cc:dd:ee:ff",eth_dst="ff:ee:dd:cc:bb:aa",eth_type=0x4d5a) / Raw(load=binary_data) verify_packets(self, verify_pkt, [2]) finally: mrzcpd.stop() start_conf_deserialize = """ [device] device=veth0,veth1,veth2 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 encode=1 [mpack] metadata_enable=1 route_ctx_enable=0 [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,128 [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 # vwire [vwire:0] vwire_id=0 interface_int=veth0 interface_ext=veth1 [service_lb] sid_start=1000 sid_end=2000 # load balance [load_balance:0] sid=1000 mode=0 devices=veth2,0 """ dynamic_conf_deserialize = """ [classifier_rule:0] rule_id=1 ruleset_type=0 action=2 priority=1 sid=1000 vwire_id=0 """ """ +------------+ +------------------------------------------+ +------------+ | PTF | | MRZCPD | | PTF | +------------+ +----------------------+--------+----------+ +------------+ | veth2-ptf2 | ---> | veth2(deserialize) | ---> | veth0 | ---> | veth0-ptf0 | +------------+ +----------------------+ +----------+ +------------+ | veth1 | | veth1-ptf1 | +----------+ +------------+ """ @group("msgpack_deserialize_test") class MpackDeserializeTest(BaseTest): def setUp(self): self.dataplane = ptf.dataplane_instance def __init__(self): BaseTest.__init__(self) def runTest(self): try: # Init & Start mrzcpd mrzcpd = Mrzcpd(start_conf_deserialize,dynamic_conf_deserialize) mrzcpd.start() verify_pkt = simple_udp_packet(ip_src="172.17.1.100", ip_dst="172.17.2.200",udp_payload="hello world") send_data = {'port': 0, 'packet_type': 0, 'ol_flags': 0, 'data_len': 100, 'pkt_len': 100, 'dir': 0, 'packet_create_from_nf': 0, 'is_ctrlbuf': 0, 'adapter_type': 1, 'adapter_id': 0, 'payload_offset': 0, 'user_0': 0, 'ef_link_id': 0, 'traffic_link_id': 65535, 'ef_peer_index': 0, 'port_ingress': 0, 'port_egress': 2, 'session_id': 0, 'cur_sid': 1000, 'sids': [0, 0, 0, 0, 0, 1000, 300, 0], 'head': 7, 'tail': 6, 'capacity': 7, 'packet':verify_pkt.__bytes__()} binary_data = msgpack.dumps(send_data) send_pkt = simple_eth_packet(pktlen=14,eth_src="aa:bb:cc:dd:ee:ff",eth_dst="ff:ee:dd:cc:bb:aa",eth_type=0x4d5a) / Raw(load=binary_data) send_packet(self, 2,send_pkt) # Verify verify_packets(self, verify_pkt, [1]) finally: mrzcpd.stop() start_conf_serialize_and_deserialize = """ [device] device=veth0,veth1,veth-msgpack-tx,veth-msgpack-rx 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:veth-msgpack-tx] promisc=1 mtu=1500 driver=2 role=4 encode=1 [device:veth-msgpack-rx] promisc=1 mtu=1500 driver=2 role=4 encode=1 [mpack] metadata_enable=1 route_ctx_enable=0 [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,128 [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 # vwire [vwire:0] vwire_id=0 interface_int=veth0 interface_ext=veth1 [service_lb] sid_start=1000 sid_end=2000 # load balance [load_balance:0] sid=1000 mode=0 devices=veth-msgpack-tx,0 """ dynamic_conf_serialize_and_deserialize = """ [classifier_rule:0] rule_id=1 ruleset_type=0 action=2 priority=1 sid=1000 vwire_id=0 """ """ +------------+ +-----------------------------------------+ | PTF | | MRZCPD | +------------+ +------------+--------+-------------------+ | veth0-ptf0 | ---> | veth0 | ---> | veth-msgpack-tx | --------+ +------------+ +------------+ +-------------------+ | | veth1-ptf1 | <--- | veth1 | <--- | veth-msgpack-rx | <-------+ +------------+ +------------+ +-------------------+ """ @group("msgpack_serialize_and_deserialize_test") class MpackSerializeAndDeserializeTest(BaseTest): def setUp(self): self.dataplane = ptf.dataplane_instance def __init__(self): BaseTest.__init__(self) def runTest(self): try: # Init & Start mrzcpd mrzcpd = Mrzcpd(start_conf_serialize_and_deserialize,dynamic_conf_serialize_and_deserialize) mrzcpd.start() send_pkt = simple_tcp_packet( ip_src="172.17.1.100", ip_dst="172.17.2.200") send_packet(self, 0,send_pkt) verify_packets(self, send_pkt, [1]) finally: mrzcpd.stop()