From e0433fc974a91a2ec7a6939325a47a74b01f450e Mon Sep 17 00:00:00 2001 From: 童宗振 Date: Wed, 17 Jan 2024 02:44:24 +0000 Subject: refactor ci --- .gitignore | 2 +- .gitlab-ci.yml | 572 ++---- CMakeLists.txt | 68 +- Testing/Temporary/CTestCostData.txt | 1 - dpdk/dpdk-17.05.2.tar.xz | Bin 9919440 -> 0 bytes dpdk/patch/dpdk-17.05-config.patch | 60 - dpdk/patch/dpdk-17.05-debug-config.patch | 66 - dpdk/patch/dpdk-17.05-pdump.patch | 125 -- fuzzing/CMakeLists.txt | 18 - fuzzing/FuzzingPktParser.cc | 44 - ...10.23.160.163_to_129.226.103.217_gtp_u_in_vxlan | Bin 168 -> 0 bytes fuzzing/seeds/10.33.60.116_to_217.76.77.34_GTP_DNS | Bin 143 -> 0 bytes .../seeds/100_95_37_122_to_149_3_200_32_gtpv1_u | Bin 1498 -> 0 bytes .../178.89.4.221_to_31.13.70.49_asym_mpls_ipv4 | Bin 82 -> 0 bytes .../seeds/178.89.4.221_to_31.13.70.49_mpls_ipv4 | Bin 214 -> 0 bytes fuzzing/seeds/178_89_4_219_to_117_122_217_89_ipv4 | Bin 66 -> 0 bytes ...178_89_4_219_to_117_122_217_89_mpls_vxlan_inner | Bin 195 -> 0 bytes .../81.211.157.203_to_10.160.72.52_mpls_ipv4_UDP | Bin 119 -> 0 bytes support/CMakeLists.txt | 12 +- test/CMakeLists.txt | 120 +- test/bfd_test.py | 205 --- test/bridge_test.py | 264 --- test/classifier_test.py | 1016 ----------- test/common_pkt.py | 100 -- test/create_veth.sh | 45 - test/endpoint_dev_test.py | 111 -- test/etherfabric_test.py | 578 ------ test/fuzzing/CMakeLists.txt | 18 + test/fuzzing/FuzzingPktParser.cc | 44 + ...10.23.160.163_to_129.226.103.217_gtp_u_in_vxlan | Bin 0 -> 168 bytes .../seeds/10.33.60.116_to_217.76.77.34_GTP_DNS | Bin 0 -> 143 bytes .../seeds/100_95_37_122_to_149_3_200_32_gtpv1_u | Bin 0 -> 1498 bytes .../178.89.4.221_to_31.13.70.49_asym_mpls_ipv4 | Bin 0 -> 82 bytes .../seeds/178.89.4.221_to_31.13.70.49_mpls_ipv4 | Bin 0 -> 214 bytes .../seeds/178_89_4_219_to_117_122_217_89_ipv4 | Bin 0 -> 66 bytes ...178_89_4_219_to_117_122_217_89_mpls_vxlan_inner | Bin 0 -> 195 bytes .../81.211.157.203_to_10.160.72.52_mpls_ipv4_UDP | Bin 0 -> 119 bytes test/health_check_test.py | 119 -- test/load_balance_test.py | 271 --- test/mrzcpd.py | 53 - test/msgpack_test.py | 448 ----- test/post_install_test/package_content_test.py | 168 ++ test/ptf_test/CMakeLists.txt | 119 ++ test/ptf_test/bfd_test.py | 205 +++ test/ptf_test/bridge_test.py | 264 +++ test/ptf_test/classifier_test.py | 1016 +++++++++++ test/ptf_test/common_pkt.py | 100 ++ test/ptf_test/create_veth.sh | 45 + test/ptf_test/endpoint_dev_test.py | 111 ++ test/ptf_test/etherfabric_test.py | 578 ++++++ test/ptf_test/health_check_test.py | 119 ++ test/ptf_test/load_balance_test.py | 271 +++ test/ptf_test/mrzcpd.py | 53 + test/ptf_test/msgpack_test.py | 448 +++++ test/ptf_test/tera_test.py | 1898 ++++++++++++++++++++ test/ptf_test/vwire_test.py | 556 ++++++ test/tera_test.py | 1898 -------------------- test/vwire_test.py | 556 ------ 58 files changed, 6206 insertions(+), 6559 deletions(-) delete mode 100644 Testing/Temporary/CTestCostData.txt delete mode 100644 dpdk/dpdk-17.05.2.tar.xz delete mode 100644 dpdk/patch/dpdk-17.05-config.patch delete mode 100644 dpdk/patch/dpdk-17.05-debug-config.patch delete mode 100644 dpdk/patch/dpdk-17.05-pdump.patch delete mode 100644 fuzzing/CMakeLists.txt delete mode 100644 fuzzing/FuzzingPktParser.cc delete mode 100644 fuzzing/seeds/10.23.160.163_to_129.226.103.217_gtp_u_in_vxlan delete mode 100644 fuzzing/seeds/10.33.60.116_to_217.76.77.34_GTP_DNS delete mode 100644 fuzzing/seeds/100_95_37_122_to_149_3_200_32_gtpv1_u delete mode 100644 fuzzing/seeds/178.89.4.221_to_31.13.70.49_asym_mpls_ipv4 delete mode 100644 fuzzing/seeds/178.89.4.221_to_31.13.70.49_mpls_ipv4 delete mode 100644 fuzzing/seeds/178_89_4_219_to_117_122_217_89_ipv4 delete mode 100644 fuzzing/seeds/178_89_4_219_to_117_122_217_89_mpls_vxlan_inner delete mode 100644 fuzzing/seeds/81.211.157.203_to_10.160.72.52_mpls_ipv4_UDP delete mode 100644 test/bfd_test.py delete mode 100644 test/bridge_test.py delete mode 100644 test/classifier_test.py delete mode 100644 test/common_pkt.py delete mode 100644 test/create_veth.sh delete mode 100644 test/endpoint_dev_test.py delete mode 100644 test/etherfabric_test.py create mode 100644 test/fuzzing/CMakeLists.txt create mode 100644 test/fuzzing/FuzzingPktParser.cc create mode 100644 test/fuzzing/seeds/10.23.160.163_to_129.226.103.217_gtp_u_in_vxlan create mode 100644 test/fuzzing/seeds/10.33.60.116_to_217.76.77.34_GTP_DNS create mode 100644 test/fuzzing/seeds/100_95_37_122_to_149_3_200_32_gtpv1_u create mode 100644 test/fuzzing/seeds/178.89.4.221_to_31.13.70.49_asym_mpls_ipv4 create mode 100644 test/fuzzing/seeds/178.89.4.221_to_31.13.70.49_mpls_ipv4 create mode 100644 test/fuzzing/seeds/178_89_4_219_to_117_122_217_89_ipv4 create mode 100644 test/fuzzing/seeds/178_89_4_219_to_117_122_217_89_mpls_vxlan_inner create mode 100644 test/fuzzing/seeds/81.211.157.203_to_10.160.72.52_mpls_ipv4_UDP delete mode 100644 test/health_check_test.py delete mode 100644 test/load_balance_test.py delete mode 100644 test/mrzcpd.py delete mode 100644 test/msgpack_test.py create mode 100644 test/post_install_test/package_content_test.py create mode 100644 test/ptf_test/CMakeLists.txt create mode 100644 test/ptf_test/bfd_test.py create mode 100644 test/ptf_test/bridge_test.py create mode 100644 test/ptf_test/classifier_test.py create mode 100644 test/ptf_test/common_pkt.py create mode 100644 test/ptf_test/create_veth.sh create mode 100644 test/ptf_test/endpoint_dev_test.py create mode 100644 test/ptf_test/etherfabric_test.py create mode 100644 test/ptf_test/health_check_test.py create mode 100644 test/ptf_test/load_balance_test.py create mode 100644 test/ptf_test/mrzcpd.py create mode 100644 test/ptf_test/msgpack_test.py create mode 100644 test/ptf_test/tera_test.py create mode 100644 test/ptf_test/vwire_test.py delete mode 100644 test/tera_test.py delete mode 100644 test/vwire_test.py diff --git a/.gitignore b/.gitignore index 396968f..f13b3bd 100644 --- a/.gitignore +++ b/.gitignore @@ -18,7 +18,7 @@ __pycache__ mpack*/ mrglobal*.conf build*/ -test/test +test/ptf_test/ptf_test /*.opendb /.vs/marsio1/v14/.suo /x64/Debug/marsio1.tlog diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index f72ae77..51eb02d 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -2,439 +2,167 @@ variables: GIT_STRATEGY: "clone" BUILD_IMAGE_CENTOS8: "git.mesalab.cn:7443/mesa_platform/marsio-build-env:dpdk-21-11-mlx5-el8" BUILD_IMAGE_CENTOS7: "git.mesalab.cn:7443/mesa_platform/marsio-build-env:dpdk-21-11-mlx5-el7" + BUILD_ROOT_DIR: /tmp/padding_for_CPACK_RPM_BUILD_SOURCE_DIRS_PREFIX/$CI_PROJECT_PATH/build stages: -- build -- package -- deploy + - build + - package .build_before_script: before_script: - - mkdir -p /tmp/padding_for_CPACK_RPM_BUILD_SOURCE_DIRS_PREFIX/$CI_PROJECT_NAMESPACE/ - - ln -s $CI_PROJECT_DIR /tmp/padding_for_CPACK_RPM_BUILD_SOURCE_DIRS_PREFIX/$CI_PROJECT_PATH - - cd /tmp/padding_for_CPACK_RPM_BUILD_SOURCE_DIRS_PREFIX/$CI_PROJECT_PATH + - pip3 install msgpack + - mkdir -p /tmp/padding_for_CPACK_RPM_BUILD_SOURCE_DIRS_PREFIX/$CI_PROJECT_NAMESPACE/ + - ln -s $CI_PROJECT_DIR /tmp/padding_for_CPACK_RPM_BUILD_SOURCE_DIRS_PREFIX/$CI_PROJECT_PATH + - cd /tmp/padding_for_CPACK_RPM_BUILD_SOURCE_DIRS_PREFIX/$CI_PROJECT_PATH -.build_mrzcpd_for_centos8: - image: $BUILD_IMAGE_CENTOS8 - extends: .build_before_script - script: - - mkdir -p build - - cd build - - cmake3 .. -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DMACHINE=$MACHINE - - make VERBOSE=1 - -.package_mrzcpd_for_centos8: - image: $BUILD_IMAGE_CENTOS8 - extends: .build_before_script - script: - - yum install -y rpm-build - - mkdir -p build - - cd build - - cmake3 .. -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DMACHINE=$MACHINE - - make package VERBOSE=1 - - cp ~/rpm_upload_tools.py ./ - - python3 rpm_upload_tools.py ${PULP3_REPO_NAME} ${PULP3_DIST_NAME} *.rpm - -.fuzzing_mrzcpd_for_centos8: - image: $BUILD_IMAGE_CENTOS8 - extends: .build_before_script - script: - - mkdir -p build - - cd build - - cmake3 .. -DENABLE_FUZZING_TEST=ON -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DMACHINE=$MACHINE - - make VERBOSE=1 - - cd fuzzing - - ./FuzzingPktParser -max_total_time=5 seeds/ - -build-debug-for-centos8-icelake-server: - stage: build - extends: .build_mrzcpd_for_centos8 - tags: - - share - variables: - BUILD_TYPE: "Debug" - MACHINE: "icelake-server" - except: - - tags - -build-release-for-centos8-icelake-server: - stage: build - extends: .build_mrzcpd_for_centos8 - tags: - - share - variables: - BUILD_TYPE: "RelWithDebInfo" - MACHINE: "icelake-server" - except: - - tags - -build-debug-for-centos8-znver1: - stage: build - extends: .build_mrzcpd_for_centos8 - tags: - - share - variables: - BUILD_TYPE: "Debug" - MACHINE: "znver1" - except: - - tags - -build-release-for-centos8-znver1: - stage: build - extends: .build_mrzcpd_for_centos8 - tags: - - share - variables: - BUILD_TYPE: "RelWithDebInfo" - MACHINE: "znver1" - except: - - tags - -build-debug-for-centos8-generic: +.build_test_and_deploy: stage: build - extends: .build_mrzcpd_for_centos8 - tags: - - share - variables: - BUILD_TYPE: "Debug" - MACHINE: "corei7" - except: - - tags - -build-release-for-centos8-generic: - stage: build - extends: .build_mrzcpd_for_centos8 - tags: - - share - variables: - BUILD_TYPE: "RelWithDebInfo" - MACHINE: "corei7" - except: - - tags - -stable-package-debug-for-centos8-icelake-server: - stage: package - extends: .package_mrzcpd_for_centos8 - tags: - - share - variables: - BUILD_TYPE: "Debug" - PULP3_REPO_NAME: platform-stable-x86_64.el8 - PULP3_DIST_NAME: platform-stable-x86_64.el8 - MACHINE: "icelake-server" - artifacts: - name: "mrzcpd-debug-$CI_COMMIT_REF_NAME-binary" - paths: - - build/*.rpm - only: - - tags - -stable-package-release-for-centos8-icelake-server: - stage: package - extends: .package_mrzcpd_for_centos8 - tags: - - share - variables: - BUILD_TYPE: "RelWithDebInfo" - PULP3_REPO_NAME: platform-stable-x86_64.el8 - PULP3_DIST_NAME: platform-stable-x86_64.el8 - MACHINE: "icelake-server" - artifacts: - name: "mrzcpd-$CI_COMMIT_REF_NAME-binary" - paths: - - build/*.rpm - only: - - tags - -stable-package-debug-for-centos8-znver1: - stage: package - extends: .package_mrzcpd_for_centos8 - tags: - - share - variables: - BUILD_TYPE: "Debug" - PULP3_REPO_NAME: platform-stable-x86_64.el8 - PULP3_DIST_NAME: platform-stable-x86_64.el8 - MACHINE: "znver1" - artifacts: - name: "mrzcpd-debug-$CI_COMMIT_REF_NAME-binary" - paths: - - build/*.rpm - only: - - tags - -stable-package-release-for-centos8-znver1: - stage: package - extends: .package_mrzcpd_for_centos8 - tags: - - share - variables: - BUILD_TYPE: "RelWithDebInfo" - PULP3_REPO_NAME: platform-stable-x86_64.el8 - PULP3_DIST_NAME: platform-stable-x86_64.el8 - MACHINE: "znver1" - artifacts: - name: "mrzcpd-$CI_COMMIT_REF_NAME-binary" - paths: - - build/*.rpm - only: - - tags - -stable-package-debug-for-centos8-generic: - stage: package - extends: .package_mrzcpd_for_centos8 - tags: - - share - variables: - BUILD_TYPE: "Debug" - PULP3_REPO_NAME: platform-stable-x86_64.el8 - PULP3_DIST_NAME: platform-stable-x86_64.el8 - MACHINE: "corei7" - artifacts: - name: "mrzcpd-debug-$CI_COMMIT_REF_NAME-binary" - paths: - - build/*.rpm - only: - - tags - -stable-package-release-for-centos8-generic: - stage: package - extends: .package_mrzcpd_for_centos8 - tags: - - share - variables: - BUILD_TYPE: "RelWithDebInfo" - PULP3_REPO_NAME: platform-stable-x86_64.el8 - PULP3_DIST_NAME: platform-stable-x86_64.el8 - MACHINE: "corei7" - artifacts: - name: "mrzcpd-$CI_COMMIT_REF_NAME-binary" - paths: - - build/*.rpm - only: - - tags - -testing-package-debug-for-centos8-icelake-server: - stage: package - extends: .package_mrzcpd_for_centos8 - tags: - - share - variables: - BUILD_TYPE: "Debug" - PULP3_REPO_NAME: platform-testing-x86_64.el8 - PULP3_DIST_NAME: platform-testing-x86_64.el8 - MACHINE: "icelake-server" - artifacts: - name: "mrzcpd-debug-$CI_COMMIT_REF_NAME-binary" - paths: - - build/*.rpm - only: - - /^dev.*$/i - -testing-package-release-for-centos8-icelake-server: - stage: package - extends: .package_mrzcpd_for_centos8 - tags: - - share - variables: - BUILD_TYPE: "RelWithDebInfo" - PULP3_REPO_NAME: platform-testing-x86_64.el8 - PULP3_DIST_NAME: platform-testing-x86_64.el8 - MACHINE: "icelake-server" - artifacts: - name: "mrzcpd-$CI_COMMIT_REF_NAME-binary" - paths: - - build/*.rpm - only: - - /^dev.*$/i - - -testing-package-debug-for-centos8-znver1: - stage: package - extends: .package_mrzcpd_for_centos8 - tags: - - share - variables: - BUILD_TYPE: "Debug" - PULP3_REPO_NAME: platform-testing-x86_64.el8 - PULP3_DIST_NAME: platform-testing-x86_64.el8 - MACHINE: "znver1" - artifacts: - name: "mrzcpd-debug-$CI_COMMIT_REF_NAME-binary" - paths: - - build/*.rpm - only: - - /^dev.*$/i - -testing-package-release-for-centos8-znver1: - stage: package - extends: .package_mrzcpd_for_centos8 - tags: - - share - variables: - BUILD_TYPE: "RelWithDebInfo" - PULP3_REPO_NAME: platform-testing-x86_64.el8 - PULP3_DIST_NAME: platform-testing-x86_64.el8 - MACHINE: "znver1" - artifacts: - name: "mrzcpd-$CI_COMMIT_REF_NAME-binary" - paths: - - build/*.rpm - only: - - /^dev.*$/i - -testing-package-debug-for-centos8-generic: - stage: package - extends: .package_mrzcpd_for_centos8 - tags: - - share - variables: - BUILD_TYPE: "Debug" - PULP3_REPO_NAME: platform-testing-x86_64.el8 - PULP3_DIST_NAME: platform-testing-x86_64.el8 - MACHINE: "corei7" - artifacts: - name: "mrzcpd-debug-$CI_COMMIT_REF_NAME-binary" - paths: - - build/*.rpm - only: - - /^dev.*$/i - -testing-package-release-for-centos8-generic: - stage: package - extends: .package_mrzcpd_for_centos8 - tags: - - share - variables: - BUILD_TYPE: "RelWithDebInfo" - PULP3_REPO_NAME: platform-testing-x86_64.el8 - PULP3_DIST_NAME: platform-testing-x86_64.el8 - MACHINE: "corei7" - artifacts: - name: "mrzcpd-$CI_COMMIT_REF_NAME-binary" - paths: - - build/*.rpm - only: - - /^dev.*$/i - -fuzzing-debug-for-centos8-generic: - stage: package - extends: .fuzzing_mrzcpd_for_centos8 - tags: - - share - variables: - BUILD_TYPE: "Debug" - MACHINE: "corei7" - only: - - /^feature.*$/i - -.build_mrzcpd_for_centos7: - image: $BUILD_IMAGE_CENTOS7 - extends: .build_before_script - script: - - mkdir -p build - - cd build - - cmake .. -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DMACHINE=$MACHINE -DENABLE_WARNING_AS_ERROR=FALSE - - make VERBOSE=1 - -.package_mrzcpd_for_centos7: - image: $BUILD_IMAGE_CENTOS7 extends: .build_before_script - script: - - yum install -y rpm-build - - mkdir -p build - - cd build - - cmake .. -DCMAKE_BUILD_TYPE=$BUILD_TYPE -DMACHINE=$MACHINE -DENABLE_WARNING_AS_ERROR=FALSE - - make package VERBOSE=1 - - cp ~/rpm_upload_tools.py ./ - - python3 rpm_upload_tools.py ${PULP3_REPO_NAME} ${PULP3_DIST_NAME} *.rpm - -build-debug-for-centos7-generic: - stage: build - extends: .build_mrzcpd_for_centos7 + image: ${BUILD_IMAGE_CENTOS8} tags: - - share - variables: - BUILD_TYPE: "Debug" - MACHINE: "corei7" - except: - - tags - -build-release-for-centos7-generic: + - share + script: + - set -e + - mkdir -p build + - cd build + - cmake3 .. -DCMAKE_BUILD_TYPE=${BUILD_TYPE} ${OTHER_CMAKE_OPTION} + - make VERBOSE=1 + - if [[ "${TEST_OPTIONS}" == *"ENABLE_CTEST"* ]]; then + cd ${BUILD_ROOT_DIR}; + ctest --output-on-failure; + fi + - if [[ "${TEST_OPTIONS}" == *"ENABLE_PACKAGE_TEST"* ]]; then + cd ${BUILD_ROOT_DIR}; + make package VERBOSE=1; + rpm -i mrzcpd*.rpm; + cd ../test/post_install_test; + python3 package_content_test.py; + fi + - if [[ "${TEST_OPTIONS}" == *"ENABLE_FUZZING"* ]]; then + cd ${BUILD_ROOT_DIR}/test/fuzzing; + ./FuzzingPktParser -max_total_time=5 seeds/; + fi + - if [[ "${ENABLE_PACKAGE}" == "True" ]]; then + cd ${BUILD_ROOT_DIR}; + make package VERBOSE=1; + cp ~/rpm_upload_tools.py ./; + python3 rpm_upload_tools.py ${PULP3_REPO_NAME} ${PULP3_DIST_NAME} *.rpm; + else + echo "no need to execute the deploy script"; + fi + +.build_and_test: stage: build - extends: .build_mrzcpd_for_centos7 - tags: - - share - variables: - BUILD_TYPE: "RelWithDebInfo" - MACHINE: "corei7" - except: - - tags - -stable-package-debug-for-centos7-generic: - stage: package - extends: .package_mrzcpd_for_centos7 - tags: - - share - variables: - BUILD_TYPE: "Debug" - PULP3_REPO_NAME: platform-stable-x86_64.el7 - PULP3_DIST_NAME: platform-stable-x86_64.el7 - MACHINE: "corei7" - artifacts: - name: "mrzcpd-debug-$CI_COMMIT_REF_NAME-binary" - paths: - - build/*.rpm - only: - - tags - -stable-package-release-for-centos7-generic: - stage: package - extends: .package_mrzcpd_for_centos7 - tags: - - share + extends: .build_test_and_deploy + rules: + - if: $CI_COMMIT_BRANCH =~ /^dev.*$/ + when: never + - if: $CI_COMMIT_TAG + when: never + - if: $CI_COMMIT_BRANCH + +.package_and_deploy: + stage: package + extends: .build_test_and_deploy + variables: + ENABLE_PACKAGE: "True" + artifacts: + name: "mrzcpd-$BUILD_TYPE-$CI_COMMIT_REF_NAME-binary" + paths: + - build/*.rpm + +build_for_centos8: + extends: .build_and_test + parallel: + matrix: + - BUILD_TYPE: ["RelWithDebInfo","Debug"] + OTHER_CMAKE_OPTION: + - "-DMACHINE=icelake-server" + - "-DMACHINE=znver1" + +build_for_centos8_and_enable_ctest: + tags: + - tsg-os-builder-el8 + extends: .build_and_test + variables: + TEST_OPTIONS: "ENABLE_CTEST" + parallel: + matrix: + - BUILD_TYPE: ["RelWithDebInfo","Debug"] + OTHER_CMAKE_OPTION: "-DMACHINE=corei7 -DENABLE_PTF_TEST=TRUE" + +build_for_centos7: + image: ${BUILD_IMAGE_CENTOS7} + extends: .build_and_test + parallel: + matrix: + - BUILD_TYPE: ["RelWithDebInfo","Debug"] + OTHER_CMAKE_OPTION: "-DMACHINE=corei7 -DENABLE_WARNING_AS_ERROR=FALSE" + +stable-package-for-centos8: + extends: .package_and_deploy + variables: + TEST_OPTIONS: "ENABLE_PACKAGE_TEST" + PULP3_REPO_NAME: "platform-stable-x86_64.el8" + PULP3_DIST_NAME: "platform-stable-x86_64.el8" + parallel: + matrix: + - BUILD_TYPE: ["RelWithDebInfo","Debug"] + OTHER_CMAKE_OPTION: + - "-DMACHINE=icelake-server" + - "-DMACHINE=znver1" + - "-DMACHINE=corei7" + rules: + - if: $CI_COMMIT_TAG + +stable-package-for-centos7: + image: ${BUILD_IMAGE_CENTOS7} + extends: .package_and_deploy + variables: + PULP3_REPO_NAME: "platform-stable-x86_64.el7" + PULP3_DIST_NAME: "platform-stable-x86_64.el7" + parallel: + matrix: + - BUILD_TYPE: ["RelWithDebInfo","Debug"] + OTHER_CMAKE_OPTION: "-DMACHINE=corei7 -DENABLE_WARNING_AS_ERROR=FALSE" + rules: + - if: $CI_COMMIT_TAG + +testing-package-for-centos8: + extends: .package_and_deploy + variables: + TEST_OPTIONS: "ENABLE_PACKAGE_TEST" + PULP3_REPO_NAME: "platform-testing-x86_64.el8" + PULP3_DIST_NAME: "platform-testing-x86_64.el8" + parallel: + matrix: + - BUILD_TYPE: ["RelWithDebInfo","Debug"] + OTHER_CMAKE_OPTION: + - "-DMACHINE=icelake-server" + - "-DMACHINE=znver1" + - "-DMACHINE=corei7" + rules: + - if: $CI_COMMIT_BRANCH =~ /^dev.*$/ + +testing-package-for-centos7: + image: ${BUILD_IMAGE_CENTOS7} + extends: .package_and_deploy + variables: + PULP3_REPO_NAME: "platform-testing-x86_64.el7" + PULP3_DIST_NAME: "platform-testing-x86_64.el7" + parallel: + matrix: + - BUILD_TYPE: ["RelWithDebInfo","Debug"] + OTHER_CMAKE_OPTION: "-DMACHINE=corei7 -DENABLE_WARNING_AS_ERROR=FALSE" + rules: + - if: $CI_COMMIT_BRANCH =~ /^dev.*$/ + +fuzzing_mrzcpd_for_centos8: + extends: .build_and_test variables: BUILD_TYPE: "RelWithDebInfo" - PULP3_REPO_NAME: platform-stable-x86_64.el7 - PULP3_DIST_NAME: platform-stable-x86_64.el7 - MACHINE: "corei7" - artifacts: - name: "mrzcpd-$CI_COMMIT_REF_NAME-binary" - paths: - - build/*.rpm - only: - - tags + OTHER_CMAKE_OPTION: "-DMACHINE=corei7 -DENABLE_FUZZING_TEST=ON" + rules: + - if: $CI_COMMIT_BRANCH =~ /^fuzzing/ -testing-package-debug-for-centos7-generic: - stage: package - extends: .package_mrzcpd_for_centos7 - tags: - - share - variables: - BUILD_TYPE: "Debug" - PULP3_REPO_NAME: platform-testing-x86_64.el7 - PULP3_DIST_NAME: platform-testing-x86_64.el7 - MACHINE: "corei7" - artifacts: - name: "mrzcpd-debug-$CI_COMMIT_REF_NAME-binary" - paths: - - build/*.rpm - only: - - /^dev.*$/i -testing-package-release-for-centos7-generic: - stage: package - extends: .package_mrzcpd_for_centos7 - tags: - - share - variables: - BUILD_TYPE: "RelWithDebInfo" - PULP3_REPO_NAME: platform-testing-x86_64.el7 - PULP3_DIST_NAME: platform-testing-x86_64.el7 - MACHINE: "corei7" - artifacts: - name: "mrzcpd-$CI_COMMIT_REF_NAME-binary" - paths: - - build/*.rpm - only: - - /^dev.*$/i diff --git a/CMakeLists.txt b/CMakeLists.txt index 9897e77..712890f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,22 +9,28 @@ endif() project(marsio) +# option +option(ENABLE_WARNING_AS_ERROR "Enable all optional warnings which are desirable for normal code" TRUE) +option(ENABLE_SANITIZE_ADDRESS "Enable AddressSanitizer" FALSE) +option(ENABLE_SANITIZE_THREAD "Enable ThreadSanitizer" FALSE) +option(ENABLE_VNODE_CHECK_THREAD_SAFE "Enable concurrent write thread-safe check for VNODE." FALSE) +option(ENABLE_PTF_TEST "Enable ptf test." FALSE) + +# envirment message("CMake version: ${CMAKE_VERSION}") message(STATUS "C Compiler Version: ${CMAKE_C_COMPILER_VERSION}") message(STATUS "CXX Compiler Version: ${CMAKE_CXX_COMPILER_VERSION}") message(STATUS "C Standard: ${CMAKE_C_STANDARD}") message(STATUS "C++ Standard: ${CMAKE_CXX_STANDARD}") - +# machine set(COREI7 "corei7") set(ICELAKE_SERVER "icelake-server") set(ZNVER1 "znver1") set(SUPPORTED_MACHINES ${COREI7} ${ICELAKE_SERVER} ${ZNVER1}) - if(NOT MACHINE) set(MACHINE "corei7") endif() - list(FIND SUPPORTED_MACHINES ${MACHINE} INDEX) if(${INDEX} GREATER -1) message(STATUS "current MACHINE is ${MACHINE}.") @@ -32,23 +38,7 @@ else() message(FATAL_ERROR "${MACHINE} is not in the support machines list.") endif() -# Include Modules -set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) - -find_package(PCAP REQUIRED) -link_directories(${PCAP_LIBRARY_DIR}) -include_directories(${PCAP_INCLUDE_DIR}) - -# version -include(Version) - -# EXTRA Flags -# GNU99 and C++11 Support -option(ENABLE_WARNING_AS_ERROR "Enable all optional warnings which are desirable for normal code" TRUE) -option(ENABLE_SANITIZE_ADDRESS "Enable AddressSanitizer" FALSE) -option(ENABLE_SANITIZE_THREAD "Enable ThreadSanitizer" FALSE) -option(ENABLE_VNODE_CHECK_THREAD_SAFE "Enable concurrent write thread-safe check for VNODE." FALSE) - +# FLAGS and define set(CMAKE_C_FLAGS "-std=gnu99 -m64 -march=${MACHINE} -fPIC -Wall -Wno-format-truncation") set(CMAKE_CXX_FLAGS "-std=gnu++11 -m64 -march=${MACHINE} -fPIC -Wall -Wno-format-truncation") @@ -82,22 +72,21 @@ if(ENABLE_FUZZING_TEST) set(OTHER_FLAGS "-fPIC -m64 -march=${MACHINE}") set(CMAKE_C_FLAGS "${FSANITIZE_FUZZER_FLAGS} ${COVERAGE_FLAGS} ${OTHER_FLAGS}") set(CMAKE_CXX_FLAGS "${FSANITIZE_FUZZER_FLAGS} ${COVERAGE_FLAGS} ${OTHER_FLAGS}") - add_subdirectory(fuzzing) +endif() + +if(ENABLE_PTF_TEST OR ENABLE_FUZZING_TEST) + enable_testing() endif() if(ENABLE_VNODE_CHECK_THREAD_SAFE) add_definitions(-DVNODE_CHECK_THREAD_SAFE) endif() -# Default Install Destination Directory -set(CMAKE_INSTALL_PREFIX /opt/tsg/mrzcpd) add_definitions(-D_GNU_SOURCE -D__STDC_LIMIT_MACROS) add_definitions(-DALLOW_EXPERIMENTAL_API=1) -include_directories(include/external) -include_directories(include/internal) - # Install Dirs +set(CMAKE_INSTALL_PREFIX /opt/tsg/mrzcpd) set(MR_INSTALL_PREFIX ${CMAKE_INSTALL_PREFIX}) set(MR_INSTALL_LIBDIR ${MACHINE}/lib) set(MR_INSTALL_BINDIR ${MACHINE}/bin) @@ -125,6 +114,17 @@ endif() exec_program(pkg-config ARGS systemd --variable=systemdsystemunitdir OUTPUT_VARIABLE MR_INSTALL_SYSUNITDIR) +# compile +set(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake) +include(Version) + +include_directories(include/external) +include_directories(include/internal) + +find_package(PCAP REQUIRED) +link_directories(${PCAP_LIBRARY_DIR}) +include_directories(${PCAP_INCLUDE_DIR}) + add_subdirectory(${CMAKE_SOURCE_DIR}/support) add_subdirectory(${CMAKE_SOURCE_DIR}/include) add_subdirectory(${CMAKE_SOURCE_DIR}/infra) @@ -135,18 +135,14 @@ add_subdirectory(${CMAKE_SOURCE_DIR}/pag) add_subdirectory(${CMAKE_SOURCE_DIR}/examples) add_subdirectory(${CMAKE_SOURCE_DIR}/tools) add_subdirectory(${CMAKE_SOURCE_DIR}/conf) -#add_subdirectory(${CMAKE_SOURCE_DIR}/test) +add_subdirectory(${CMAKE_SOURCE_DIR}/test) -if(BUILD_TESTS) - enable_testing() - add_subdirectory(test) -endif() - -add_custom_target("install-program" COMMAND ${CMAKE_COMMAND} ARGS -DCOMPONENT=Program -P cmake_install.cmake) -add_custom_target("install-profile" COMMAND ${CMAKE_COMMAND} ARGS -DCOMPONENT=Profile -P cmake_install.cmake) +# add_custom_target("install-program" COMMAND ${CMAKE_COMMAND} ARGS -DCOMPONENT=Program -P cmake_install.cmake) +# add_custom_target("install-profile" COMMAND ${CMAKE_COMMAND} ARGS -DCOMPONENT=Profile -P cmake_install.cmake) message(STATUS "Packet I/O Middleware based on DPDK(Marsio), Version: ${MARSIO_VERSION}") -# packed -include(Package) +# package include(InstallDPDK) +include(Package) + diff --git a/Testing/Temporary/CTestCostData.txt b/Testing/Temporary/CTestCostData.txt deleted file mode 100644 index ed97d53..0000000 --- a/Testing/Temporary/CTestCostData.txt +++ /dev/null @@ -1 +0,0 @@ ---- diff --git a/dpdk/dpdk-17.05.2.tar.xz b/dpdk/dpdk-17.05.2.tar.xz deleted file mode 100644 index a983125..0000000 Binary files a/dpdk/dpdk-17.05.2.tar.xz and /dev/null differ diff --git a/dpdk/patch/dpdk-17.05-config.patch b/dpdk/patch/dpdk-17.05-config.patch deleted file mode 100644 index beecd10..0000000 --- a/dpdk/patch/dpdk-17.05-config.patch +++ /dev/null @@ -1,60 +0,0 @@ -diff -ru dpdk-17.05/config/common_base dpdk-17.05.mr4/config/common_base ---- dpdk-17.05/config/common_base 2017-05-11 09:11:34.000000000 +0800 -+++ dpdk-17.05.mr4/config/common_base 2017-06-29 11:26:11.054905786 +0800 -@@ -90,7 +90,7 @@ - CONFIG_RTE_LIBRTE_EAL=y - CONFIG_RTE_MAX_LCORE=128 - CONFIG_RTE_MAX_NUMA_NODES=8 --CONFIG_RTE_MAX_MEMSEG=256 -+CONFIG_RTE_MAX_MEMSEG=512 - CONFIG_RTE_MAX_MEMZONE=2560 - CONFIG_RTE_MAX_TAILQ=32 - CONFIG_RTE_LOG_LEVEL=RTE_LOG_INFO -@@ -181,7 +181,7 @@ - CONFIG_RTE_LIBRTE_IXGBE_DEBUG_TX_FREE=n - CONFIG_RTE_LIBRTE_IXGBE_DEBUG_DRIVER=n - CONFIG_RTE_LIBRTE_IXGBE_PF_DISABLE_STRIP_CRC=n --CONFIG_RTE_IXGBE_INC_VECTOR=y -+CONFIG_RTE_IXGBE_INC_VECTOR=n - - # - # Compile burst-oriented I40E PMD driver -@@ -191,7 +191,7 @@ - CONFIG_RTE_LIBRTE_I40E_DEBUG_TX=n - CONFIG_RTE_LIBRTE_I40E_DEBUG_TX_FREE=n - CONFIG_RTE_LIBRTE_I40E_RX_ALLOW_BULK_ALLOC=y --CONFIG_RTE_LIBRTE_I40E_INC_VECTOR=y -+CONFIG_RTE_LIBRTE_I40E_INC_VECTOR=n - CONFIG_RTE_LIBRTE_I40E_16BYTE_RX_DESC=n - CONFIG_RTE_LIBRTE_I40E_QUEUE_NUM_PER_PF=64 - CONFIG_RTE_LIBRTE_I40E_QUEUE_NUM_PER_VF=4 -@@ -363,7 +363,7 @@ - # - # Compile software PMD backed by PCAP files - # --CONFIG_RTE_LIBRTE_PMD_PCAP=n -+CONFIG_RTE_LIBRTE_PMD_PCAP=y - - # - # Compile link bonding PMD library -@@ -387,7 +387,7 @@ - # - # Compile software PMD backed by AF_PACKET sockets (Linux only) - # --CONFIG_RTE_LIBRTE_PMD_AF_PACKET=n -+CONFIG_RTE_LIBRTE_PMD_AF_PACKET=y - - # - # Compile ARK PMD -diff -ru dpdk-17.05/lib/librte_eal/common/include/rte_memzone.h dpdk-17.05.mr4/lib/librte_eal/common/include/rte_memzone.h ---- dpdk-17.05/lib/librte_eal/common/include/rte_memzone.h 2017-05-11 09:11:34.000000000 +0800 -+++ dpdk-17.05.mr4/lib/librte_eal/common/include/rte_memzone.h 2017-06-29 11:27:25.990907337 +0800 -@@ -75,7 +75,7 @@ - */ - struct rte_memzone { - --#define RTE_MEMZONE_NAMESIZE 32 /**< Maximum length of memory zone name.*/ -+#define RTE_MEMZONE_NAMESIZE 64 /**< Maximum length of memory zone name.*/ - char name[RTE_MEMZONE_NAMESIZE]; /**< Name of the memory zone. */ - - phys_addr_t phys_addr; /**< Start physical address. */ diff --git a/dpdk/patch/dpdk-17.05-debug-config.patch b/dpdk/patch/dpdk-17.05-debug-config.patch deleted file mode 100644 index 2a20c3b..0000000 --- a/dpdk/patch/dpdk-17.05-debug-config.patch +++ /dev/null @@ -1,66 +0,0 @@ -diff -ru dpdk-17.05/config/common_base dpdk-17.05.mr4.debug/config/common_base ---- dpdk-17.05/config/common_base 2017-05-11 09:11:34.000000000 +0800 -+++ dpdk-17.05.mr4.debug/config/common_base 2017-10-12 21:09:24.334524378 +0800 -@@ -90,11 +90,11 @@ - CONFIG_RTE_LIBRTE_EAL=y - CONFIG_RTE_MAX_LCORE=128 - CONFIG_RTE_MAX_NUMA_NODES=8 --CONFIG_RTE_MAX_MEMSEG=256 -+CONFIG_RTE_MAX_MEMSEG=512 - CONFIG_RTE_MAX_MEMZONE=2560 - CONFIG_RTE_MAX_TAILQ=32 --CONFIG_RTE_LOG_LEVEL=RTE_LOG_INFO --CONFIG_RTE_LOG_DP_LEVEL=RTE_LOG_INFO -+CONFIG_RTE_LOG_LEVEL=RTE_LOG_DEBUG -+CONFIG_RTE_LOG_DP_LEVEL=RTE_LOG_DEBUG - CONFIG_RTE_LOG_HISTORY=256 - CONFIG_RTE_BACKTRACE=y - CONFIG_RTE_LIBEAL_USE_HPET=n -@@ -181,7 +181,7 @@ - CONFIG_RTE_LIBRTE_IXGBE_DEBUG_TX_FREE=n - CONFIG_RTE_LIBRTE_IXGBE_DEBUG_DRIVER=n - CONFIG_RTE_LIBRTE_IXGBE_PF_DISABLE_STRIP_CRC=n --CONFIG_RTE_IXGBE_INC_VECTOR=y -+CONFIG_RTE_IXGBE_INC_VECTOR=n - - # - # Compile burst-oriented I40E PMD driver -@@ -191,7 +191,7 @@ - CONFIG_RTE_LIBRTE_I40E_DEBUG_TX=n - CONFIG_RTE_LIBRTE_I40E_DEBUG_TX_FREE=n - CONFIG_RTE_LIBRTE_I40E_RX_ALLOW_BULK_ALLOC=y --CONFIG_RTE_LIBRTE_I40E_INC_VECTOR=y -+CONFIG_RTE_LIBRTE_I40E_INC_VECTOR=n - CONFIG_RTE_LIBRTE_I40E_16BYTE_RX_DESC=n - CONFIG_RTE_LIBRTE_I40E_QUEUE_NUM_PER_PF=64 - CONFIG_RTE_LIBRTE_I40E_QUEUE_NUM_PER_VF=4 -@@ -363,7 +363,7 @@ - # - # Compile software PMD backed by PCAP files - # --CONFIG_RTE_LIBRTE_PMD_PCAP=n -+CONFIG_RTE_LIBRTE_PMD_PCAP=y - - # - # Compile link bonding PMD library -@@ -387,7 +387,7 @@ - # - # Compile software PMD backed by AF_PACKET sockets (Linux only) - # --CONFIG_RTE_LIBRTE_PMD_AF_PACKET=n -+CONFIG_RTE_LIBRTE_PMD_AF_PACKET=y - - # - # Compile ARK PMD -diff -ru dpdk-17.05/lib/librte_eal/common/include/rte_memzone.h dpdk-17.05.mr4.debug/lib/librte_eal/common/include/rte_memzone.h ---- dpdk-17.05/lib/librte_eal/common/include/rte_memzone.h 2017-05-11 09:11:34.000000000 +0800 -+++ dpdk-17.05.mr4.debug/lib/librte_eal/common/include/rte_memzone.h 2017-10-12 21:09:02.561523927 +0800 -@@ -75,7 +75,7 @@ - */ - struct rte_memzone { - --#define RTE_MEMZONE_NAMESIZE 32 /**< Maximum length of memory zone name.*/ -+#define RTE_MEMZONE_NAMESIZE 64 /**< Maximum length of memory zone name.*/ - char name[RTE_MEMZONE_NAMESIZE]; /**< Name of the memory zone. */ - - phys_addr_t phys_addr; /**< Start physical address. */ diff --git a/dpdk/patch/dpdk-17.05-pdump.patch b/dpdk/patch/dpdk-17.05-pdump.patch deleted file mode 100644 index 4c871cc..0000000 --- a/dpdk/patch/dpdk-17.05-pdump.patch +++ /dev/null @@ -1,125 +0,0 @@ ---- dpdk-17.05/app/pdump/main.c 2017-05-11 09:11:34.000000000 +0800 -+++ dpdk-17.05.mr4/app/pdump/main.c 2017-10-20 14:00:10.274132214 +0800 -@@ -654,26 +654,35 @@ - /* if captured packets has to send to the same vdev */ - /* create rx_ring */ - snprintf(ring_name, SIZE, RX_RING, i); -- pt->rx_ring = rte_ring_create(ring_name, pt->ring_size, -- rte_socket_id(), 0); -- if (pt->rx_ring == NULL) { -- cleanup_rings(); -- rte_exit(EXIT_FAILURE, "%s:%s:%d\n", -- rte_strerror(rte_errno), -- __func__, __LINE__); -+ pt->rx_ring = rte_ring_lookup(ring_name); -+ if(pt->rx_ring == NULL) -+ { -+ pt->rx_ring = rte_ring_create(ring_name, pt->ring_size, -+ rte_socket_id(), 0); -+ -+ if (pt->rx_ring == NULL) { -+ cleanup_rings(); -+ rte_exit(EXIT_FAILURE, "%s:%s:%d\n", -+ rte_strerror(rte_errno), -+ __func__, __LINE__); -+ } - } - - /* create tx_ring */ - snprintf(ring_name, SIZE, TX_RING, i); -- pt->tx_ring = rte_ring_create(ring_name, pt->ring_size, -- rte_socket_id(), 0); -- if (pt->tx_ring == NULL) { -- cleanup_rings(); -- rte_exit(EXIT_FAILURE, "%s:%s:%d\n", -- rte_strerror(rte_errno), -- __func__, __LINE__); -- } -+ pt->tx_ring = rte_ring_lookup(ring_name); -+ if(pt->tx_ring == NULL) -+ { -+ pt->tx_ring = rte_ring_create(ring_name, pt->ring_size, -+ rte_socket_id(), 0); - -+ if (pt->tx_ring == NULL) { -+ cleanup_rings(); -+ rte_exit(EXIT_FAILURE, "%s:%s:%d\n", -+ rte_strerror(rte_errno), -+ __func__, __LINE__); -+ } -+ } - /* create vdevs */ - (pt->rx_vdev_stream_type == IFACE) ? - snprintf(vdev_args, SIZE, VDEV_IFACE, RX_STR, i, -@@ -703,8 +712,8 @@ - &portid) < 0) { - cleanup_rings(); - rte_exit(EXIT_FAILURE, -- "vdev creation failed:" -- "%s:%d\n", __func__, __LINE__); -+ "vdev creation failed:" -+ "%s:%d\n", __func__, __LINE__); - } - pt->tx_vdev_id = portid; - -@@ -715,12 +724,17 @@ - - /* create rx_ring */ - snprintf(ring_name, SIZE, RX_RING, i); -- pt->rx_ring = rte_ring_create(ring_name, pt->ring_size, -- rte_socket_id(), 0); -- if (pt->rx_ring == NULL) { -- cleanup_rings(); -- rte_exit(EXIT_FAILURE, "%s\n", -- rte_strerror(rte_errno)); -+ pt->rx_ring = rte_ring_lookup(ring_name); -+ if(pt->rx_ring == NULL) -+ { -+ pt->rx_ring = rte_ring_create(ring_name, pt->ring_size, -+ rte_socket_id(), 0); -+ -+ if (pt->rx_ring == NULL) { -+ cleanup_rings(); -+ rte_exit(EXIT_FAILURE, "%s\n", -+ rte_strerror(rte_errno)); -+ } - } - - (pt->rx_vdev_stream_type == IFACE) ? -@@ -741,12 +755,17 @@ - - /* create tx_ring */ - snprintf(ring_name, SIZE, TX_RING, i); -- pt->tx_ring = rte_ring_create(ring_name, pt->ring_size, -- rte_socket_id(), 0); -- if (pt->tx_ring == NULL) { -- cleanup_rings(); -- rte_exit(EXIT_FAILURE, "%s\n", -- rte_strerror(rte_errno)); -+ pt->tx_ring = rte_ring_lookup(ring_name); -+ if(pt->tx_ring == NULL) -+ { -+ pt->tx_ring = rte_ring_create(ring_name, pt->ring_size, -+ rte_socket_id(), 0); -+ -+ if (pt->tx_ring == NULL) { -+ cleanup_rings(); -+ rte_exit(EXIT_FAILURE, "%s\n", -+ rte_strerror(rte_errno)); -+ } - } - - (pt->tx_vdev_stream_type == IFACE) ? -@@ -902,6 +921,12 @@ - rte_exit(EXIT_FAILURE, "Invalid argument\n"); - } - -+ for(i = 0; i < num_tuples; i++) -+ { -+ struct pdump_tuples * pt = &pdump_t[i]; -+ disable_pdump(pt); -+ } -+ - /* create mempool, ring and vdevs info */ - create_mp_ring_vdev(); - enable_pdump(); diff --git a/fuzzing/CMakeLists.txt b/fuzzing/CMakeLists.txt deleted file mode 100644 index 3f1b8c6..0000000 --- a/fuzzing/CMakeLists.txt +++ /dev/null @@ -1,18 +0,0 @@ -# Override top-level settings -set(CMAKE_CXX_FLAGS "-fsanitize=address,fuzzer ${COVERAGE_FLAGS}") -set(CMAKE_C_FLAGS "-fsanitize=address,fuzzer ${COVERAGE_FLAGS}") - -add_executable(FuzzingPktParser FuzzingPktParser.cc) - -# If you do not use CMAKE_CXX_FLAGS but use target_compile_options, it will result in the inability to link to clang's asan library. -# target_compile_options(FuzzingPktParser PRIVATE -fsanitize=address,fuzzer) - -target_link_libraries(FuzzingPktParser PRIVATE infra z elf ibverbs mlx5 ${SYSTEMD_LIBRARIES} ${PCAP_LIBRARY} ${DPDK_LIBRARY}) - -add_custom_command( - TARGET FuzzingPktParser - POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/seeds ${CMAKE_CURRENT_BINARY_DIR}/seeds - COMMENT "Copying seeds to ${CMAKE_CURRENT_BINARY_DIR}" -) - diff --git a/fuzzing/FuzzingPktParser.cc b/fuzzing/FuzzingPktParser.cc deleted file mode 100644 index 5ed1074..0000000 --- a/fuzzing/FuzzingPktParser.cc +++ /dev/null @@ -1,44 +0,0 @@ -extern "C" -{ -#include -#include -#include -#include -#include -#include -} - -#include -#include -#include - -std::unique_ptr mock_rte_mbuf_create(const char * pkt, unsigned int pktlen) -{ - auto mock_mbuf = std::unique_ptr(new struct rte_mbuf); - mock_mbuf->buf_addr = (void *)pkt; - mock_mbuf->buf_len = pktlen; - mock_mbuf->data_off = 0; - mock_mbuf->data_len = pktlen; - mock_mbuf->pkt_len = pktlen; - mock_mbuf->nb_segs = 1; - mock_mbuf->next = nullptr; - - return mock_mbuf; -} - -void pkt_parser_test(const uint8_t * data, size_t size, enum complex_layer_type_mask expect_layer_type, - unsigned int nr_expect_results) -{ - struct pkt_parser _pk_handler; - struct pkt_parser_result _pkt_result; - - auto mock_mbuf_ptr = mock_rte_mbuf_create((const char *)data, size); - pkt_parser_init(&_pk_handler, &_pkt_result, expect_layer_type, nr_expect_results); - pkt_parser_exec(&_pk_handler, mock_mbuf_ptr.get()); -} - -extern "C" int LLVMFuzzerTestOneInput(const uint8_t * data, size_t size) -{ - pkt_parser_test(data, size, LAYER_TYPE_ALL, 8); - return 0; -} \ No newline at end of file diff --git a/fuzzing/seeds/10.23.160.163_to_129.226.103.217_gtp_u_in_vxlan b/fuzzing/seeds/10.23.160.163_to_129.226.103.217_gtp_u_in_vxlan deleted file mode 100644 index 54b6081..0000000 Binary files a/fuzzing/seeds/10.23.160.163_to_129.226.103.217_gtp_u_in_vxlan and /dev/null differ diff --git a/fuzzing/seeds/10.33.60.116_to_217.76.77.34_GTP_DNS b/fuzzing/seeds/10.33.60.116_to_217.76.77.34_GTP_DNS deleted file mode 100644 index 9fa74ff..0000000 Binary files a/fuzzing/seeds/10.33.60.116_to_217.76.77.34_GTP_DNS and /dev/null differ diff --git a/fuzzing/seeds/100_95_37_122_to_149_3_200_32_gtpv1_u b/fuzzing/seeds/100_95_37_122_to_149_3_200_32_gtpv1_u deleted file mode 100644 index 47448dd..0000000 Binary files a/fuzzing/seeds/100_95_37_122_to_149_3_200_32_gtpv1_u and /dev/null differ diff --git a/fuzzing/seeds/178.89.4.221_to_31.13.70.49_asym_mpls_ipv4 b/fuzzing/seeds/178.89.4.221_to_31.13.70.49_asym_mpls_ipv4 deleted file mode 100644 index a57e978..0000000 Binary files a/fuzzing/seeds/178.89.4.221_to_31.13.70.49_asym_mpls_ipv4 and /dev/null differ diff --git a/fuzzing/seeds/178.89.4.221_to_31.13.70.49_mpls_ipv4 b/fuzzing/seeds/178.89.4.221_to_31.13.70.49_mpls_ipv4 deleted file mode 100644 index 4f8d2d6..0000000 Binary files a/fuzzing/seeds/178.89.4.221_to_31.13.70.49_mpls_ipv4 and /dev/null differ diff --git a/fuzzing/seeds/178_89_4_219_to_117_122_217_89_ipv4 b/fuzzing/seeds/178_89_4_219_to_117_122_217_89_ipv4 deleted file mode 100644 index 1e6e60a..0000000 Binary files a/fuzzing/seeds/178_89_4_219_to_117_122_217_89_ipv4 and /dev/null differ diff --git a/fuzzing/seeds/178_89_4_219_to_117_122_217_89_mpls_vxlan_inner b/fuzzing/seeds/178_89_4_219_to_117_122_217_89_mpls_vxlan_inner deleted file mode 100644 index fb32228..0000000 Binary files a/fuzzing/seeds/178_89_4_219_to_117_122_217_89_mpls_vxlan_inner and /dev/null differ diff --git a/fuzzing/seeds/81.211.157.203_to_10.160.72.52_mpls_ipv4_UDP b/fuzzing/seeds/81.211.157.203_to_10.160.72.52_mpls_ipv4_UDP deleted file mode 100644 index c57c758..0000000 Binary files a/fuzzing/seeds/81.211.157.203_to_10.160.72.52_mpls_ipv4_UDP and /dev/null differ diff --git a/support/CMakeLists.txt b/support/CMakeLists.txt index 7d30e3a..d06256a 100644 --- a/support/CMakeLists.txt +++ b/support/CMakeLists.txt @@ -114,12 +114,12 @@ else() endif() set(DPDK_MESON_DISABLED_DRIVERS "common/cpt,common/dpaax,common/octeontx,common/octeontx2,common/sfc_efx,\ - common/qat,bus/dpaa,bus/fslmc,bus/ifpga,bus/vmbus,mempool/bucket,mempool/dpaa,\ - mempool/dpaa2,mempool/octeontx,mempool/octeontx2,mempool/stack,raw/ifpga,raw/ioat,\ - raw/ntb,raw/octeontx2_dma,raw/octeontx2_ep,raw/skeleton,compress/zlib,regex/octeontx2,\ - vdpa/ifc,event/skeleton,event/dlb,event/dlb2,event/opdl,sevent/keleton,event/sw,event/dsw,\ - baseband/null,baseband/turbo_sw,baseband/fpga_lte_fec,baseband/fpga_5gnr_fec,baseband/acc100,\ - crypto/bcmfs,crypto/ccp,crypto/nitrox,crypto/null,crypto/openssl,crypto/scheduler,crypto/virtio") +common/qat,bus/dpaa,bus/fslmc,bus/ifpga,bus/vmbus,mempool/bucket,mempool/dpaa,\ +mempool/dpaa2,mempool/octeontx,mempool/octeontx2,mempool/stack,raw/ifpga,raw/ioat,\ +raw/ntb,raw/octeontx2_dma,raw/octeontx2_ep,raw/skeleton,compress/zlib,regex/octeontx2,\ +vdpa/ifc,event/skeleton,event/dlb,event/dlb2,event/opdl,sevent/keleton,event/sw,event/dsw,\ +baseband/null,baseband/turbo_sw,baseband/fpga_lte_fec,baseband/fpga_5gnr_fec,baseband/acc100,\ +crypto/bcmfs,crypto/ccp,crypto/nitrox,crypto/null,crypto/openssl,crypto/scheduler,crypto/virtio") # Although default_library=static has been set, both dynamic and static libraries are compiled. a little strange ExternalProject_Add(dpdk PREFIX dpdk diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 58ec534..f048460 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,119 +1,7 @@ -include_directories(${CMAKE_SOURCE_DIR}/include) -include_directories(${CMAKE_SOURCE_DIR}/include/extern) -include_directories(${CMAKE_SOURCE_DIR}/include/internal) -include_directories(${CMAKE_SOURCE_DIR}) - -# Create veth -execute_process( - COMMAND /bin/bash ${CMAKE_SOURCE_DIR}/test/create_veth.sh create 24 - RESULT_VARIABLE VETH_RESULT - OUTPUT_VARIABLE VETH_OUTPUT - ERROR_VARIABLE VETH_ERROR - OUTPUT_STRIP_TRAILING_WHITESPACE -) - -# Check veth create -if(VETH_RESULT) -message(FATAL_ERROR "${CMAKE_SOURCE_DIR}/test/create_veth.sh create 24") - message(FATAL_ERROR "Failed to create veth: ${VETH_ERROR}") +if(ENABLE_PTF_TEST) + add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/ptf_test) endif() -# Create veth for msgpack -execute_process( - COMMAND /bin/bash ${CMAKE_SOURCE_DIR}/test/create_veth.sh create msgpack - RESULT_VARIABLE VETH_RESULT - OUTPUT_VARIABLE VETH_OUTPUT - ERROR_VARIABLE VETH_ERROR - OUTPUT_STRIP_TRAILING_WHITESPACE -) - -# Check veth create for msgpack -if(VETH_RESULT) -message(FATAL_ERROR "${CMAKE_SOURCE_DIR}/test/create_veth.sh create msgpack") - message(FATAL_ERROR "Failed to create veth: ${VETH_ERROR}") +if(ENABLE_FUZZING_TEST) + add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/fuzzing) endif() - -# Script for generating "--interface" -# for i in range(0, 24): -# print(f"--interface {i}@veth{i}-ptf{i}", end=" ") - -# Add vwire test -add_test( - NAME vwire_test - COMMAND /usr/local/bin/ptf --test-dir ${CMAKE_SOURCE_DIR}/test - --interface 0@veth0-ptf0 --interface 1@veth1-ptf1 --interface 2@veth2-ptf2 --interface 3@veth3-ptf3 --interface 4@veth4-ptf4 --interface 5@veth5-ptf5 --interface 6@veth6-ptf6 --interface 7@veth7-ptf7 --interface 8@veth8-ptf8 --interface 9@veth9-ptf9 --interface 10@veth10-ptf10 --interface 11@veth11-ptf11 --interface 12@veth12-ptf12 --interface 13@veth13-ptf13 --interface 14@veth14-ptf14 --interface 15@veth15-ptf15 --interface 16@veth16-ptf16 --interface 17@veth17-ptf17 --interface 18@veth18-ptf18 --interface 19@veth19-ptf19 --interface 20@veth20-ptf20 --interface 21@veth21-ptf21 --interface 22@veth22-ptf22 --interface 23@veth23-ptf23 - vwire_test id_non_contiguous_test --test-params "source_dir='${CMAKE_SOURCE_DIR}'" -) - -# Add bfd test -add_test( - NAME bfd_test - COMMAND /usr/local/bin/ptf --test-dir ${CMAKE_SOURCE_DIR}/test - --interface 0@veth0-ptf0 - bfd_test_for_etherfabric bfd_test_for_bfdd --test-params "source_dir='${CMAKE_SOURCE_DIR}'" -) - -# Add bridge test -add_test( - NAME bridge_test - COMMAND /usr/local/bin/ptf --test-dir ${CMAKE_SOURCE_DIR}/test - --interface 0@veth0-ptf0 --interface 1@veth1-ptf1 --interface 2@veth2-ptf2 --interface 3@veth3-ptf3 - bridge_test_unicast bridge_test_broadcast bridge_test_master_device --test-params "source_dir='${CMAKE_SOURCE_DIR}'" -) - - -# Add classifier test -add_test( - NAME classifier_test - COMMAND /usr/local/bin/ptf --test-dir ${CMAKE_SOURCE_DIR}/test - --interface 0@veth0-ptf0 --interface 1@veth1-ptf1 --interface 2@veth2-ptf2 --interface 3@veth3-ptf3 --interface 4@veth4-ptf4 --interface 5@veth5-ptf5 - classifier_test_base full_field_match_test --test-params "source_dir='${CMAKE_SOURCE_DIR}'" -) - -# Add etherfabric test -add_test( - NAME etherfabric_test - COMMAND /usr/local/bin/ptf --test-dir ${CMAKE_SOURCE_DIR}/test - --interface 0@veth0-ptf0 - virtual_wire_mode tap_mode ef_route_ctx_test ef_adapter_id_non_contiguous_test --test-params "source_dir='${CMAKE_SOURCE_DIR}'" -) - -# Add health_check test -add_test( - NAME health_check - COMMAND /usr/local/bin/ptf --test-dir ${CMAKE_SOURCE_DIR}/test - --interface 0@veth0-ptf0 - health_check_base_test --test-params "source_dir='${CMAKE_SOURCE_DIR}'" -) - -# Add load_balance test -add_test( - NAME load_balance - COMMAND /usr/local/bin/ptf --test-dir ${CMAKE_SOURCE_DIR}/test - --interface 0@veth0-ptf0 --interface 1@veth1-ptf1 --interface 2@veth2-ptf2 --interface 3@veth3-ptf3 --interface 4@veth4-ptf4 - lb_base_test --test-params "source_dir='${CMAKE_SOURCE_DIR}'" -) - -# Add msgpack test -add_test( - NAME msgpack_test - COMMAND /usr/local/bin/ptf --test-dir ${CMAKE_SOURCE_DIR}/test - --interface 0@veth0-ptf0 --interface 1@veth1-ptf1 --interface 2@veth2-ptf2 - msgpack_serialize_test msgpack_deserialize_test msgpack_serialize_and_deserialize_test --test-params "source_dir='${CMAKE_SOURCE_DIR}'" -) - -# Add endpoint dev test -add_test( - NAME endpoint_dev_test - COMMAND /usr/local/bin/ptf --test-dir ${CMAKE_SOURCE_DIR}/test - --interface 0@veth0-ptf0 - icmp_reply_test --test-params "source_dir='${CMAKE_SOURCE_DIR}'" -) - -# Add tera test -add_test( - NAME tera_test - COMMAND /usr/local/bin/ptf --test-dir ${CMAKE_SOURCE_DIR}/test - --interface 0@veth0-ptf0 --interface 1@veth1-ptf1 - tera_base_test tera_mpack_test tera_nf_test tera_route_ctx_test tera_adapter_id_non_contiguous_test --test-params "source_dir='${CMAKE_SOURCE_DIR}'" -) diff --git a/test/bfd_test.py b/test/bfd_test.py deleted file mode 100644 index 06ec56f..0000000 --- a/test/bfd_test.py +++ /dev/null @@ -1,205 +0,0 @@ -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 - -bfd_conf = """ -[device] -device = veth0 -sz_tunnel = 8192 -sz_buffer = 0 - -[device:veth0] -in_addr=10.254.60.1 -in_mask=255.255.255.0 -gateway=10.10.1.40 -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 - -[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 - -""" - - -@group("bfd_test_for_etherfabric") -class TestForEtherfabric(BaseTest): - def setUp(self): - self.dataplane = ptf.dataplane_instance - - def __init__(self): - BaseTest.__init__(self) - - def runTest(self): - try: - # Init & Start mrzcpd - mrzcpd = Mrzcpd(bfd_conf,"") - mrzcpd.start() - - # Create packet - send_bfd_pkt = simple_bfd_packet(eth_dst="10:70:fd:03:c0:bd", eth_src="0a:0a:0a:0a:01:28", - ip_src="10.10.1.40", ip_dst="10.254.60.1", - sta=0, my_discriminator=1111, your_discriminator=0) - - verify_bfd_pkt = mask.Mask( - simple_bfd_packet(eth_dst="0a:0a:0a:0a:01:28", eth_src="10:70:fd:03:c0:bd", - ip_src="10.254.60.1", ip_dst="10.10.1.40", sta=3, your_discriminator=1111)) - - verify_bfd_pkt.set_do_not_care_scapy(UDP, "chksum") - verify_bfd_pkt.set_do_not_care_scapy(BFD, "flags") - verify_bfd_pkt.set_do_not_care_scapy(BFD, "my_discriminator") - - send_packet(self, 0, send_bfd_pkt) - verify_packets(self, verify_bfd_pkt, [0]) - finally: - mrzcpd.stop() - - -""" - +--------------------------+ - | PTF | - +------+------------+------+ - | Send | | Recv | - +------+ +------+ - | Down | <--> | Init | - +------+ +------+ - | Init | <--> | Up | - +------+ +------+ - | Up | <--> | Up | - +------+ +------+ -""" - - -@group("bfd_test_for_bfdd") -class TestForBfdd(BaseTest): - def setUp(self): - self.dataplane = ptf.dataplane_instance - - def __init__(self): - BaseTest.__init__(self) - - def runTest(self): - try: - # Init & Start mrzcpd - mrzcpd = Mrzcpd(bfd_conf,"") - mrzcpd.start() - - """ - +------+ +------+ - | Down | <--> | Init | - +------+ +------+ - """ - # Create bfd down packet - bfd_pkt_down = simple_bfd_packet(eth_dst="10:70:fd:03:c0:bd", eth_src="0a:0a:0a:0a:01:28", - ip_src="10.10.1.40", ip_dst="10.254.60.1", - sta=1, my_discriminator=1111, your_discriminator=0) - - verify_bfd_pkt_init = mask.Mask( - simple_bfd_packet(eth_dst="0a:0a:0a:0a:01:28", eth_src="10:70:fd:03:c0:bd", - ip_src="10.254.60.1", ip_dst="10.10.1.40", sta=2, your_discriminator=1111)) - - verify_bfd_pkt_init.set_do_not_care_scapy(UDP, "chksum") - verify_bfd_pkt_init.set_do_not_care_scapy(BFD, "flags") - verify_bfd_pkt_init.set_do_not_care_scapy(BFD, "my_discriminator") - - send_packet(self, 0, bfd_pkt_down) - verify_packets(self, verify_bfd_pkt_init, [0]) - - """ - +------+ +------+ - | Init | <--> | Up | - +------+ +------+ - """ - # Create bfd up packet - bfd_pkt_init = simple_bfd_packet(eth_dst="10:70:fd:03:c0:bd", eth_src="0a:0a:0a:0a:01:28", - ip_src="10.10.1.40", ip_dst="10.254.60.1", - sta=2, my_discriminator=1111, your_discriminator=0) - - verify_bfd_pkt_up = mask.Mask( - simple_bfd_packet(eth_dst="0a:0a:0a:0a:01:28", eth_src="10:70:fd:03:c0:bd", - ip_src="10.254.60.1", ip_dst="10.10.1.40", sta=3, your_discriminator=1111)) - - verify_bfd_pkt_up.set_do_not_care_scapy(UDP, "chksum") - verify_bfd_pkt_up.set_do_not_care_scapy(BFD, "flags") - verify_bfd_pkt_up.set_do_not_care_scapy(BFD, "my_discriminator") - - send_packet(self, 0, bfd_pkt_init) - verify_packets(self, verify_bfd_pkt_up, [0]) - - """ - +------+ +------+ - | Up | <--> | Up | - +------+ +------+ - """ - # Create bfd up packet - bfd_pkt_up = simple_bfd_packet(eth_dst="10:70:fd:03:c0:bd", eth_src="0a:0a:0a:0a:01:28", - ip_src="10.10.1.40", ip_dst="10.254.60.1", - sta=3, my_discriminator=1111, your_discriminator=0) - verify_bfd_pkt_up = mask.Mask( - simple_bfd_packet(eth_dst="0a:0a:0a:0a:01:28", eth_src="10:70:fd:03:c0:bd", - ip_src="10.254.60.1", ip_dst="10.10.1.40", sta=3, your_discriminator=1111)) - - verify_bfd_pkt_up.set_do_not_care_scapy(UDP, "chksum") - verify_bfd_pkt_up.set_do_not_care_scapy(BFD, "flags") - verify_bfd_pkt_up.set_do_not_care_scapy(BFD, "my_discriminator") - - send_packet(self, 0, bfd_pkt_up) - verify_packets(self, verify_bfd_pkt_up, [0]) - finally: - mrzcpd.stop() diff --git a/test/bridge_test.py b/test/bridge_test.py deleted file mode 100644 index bf1dfff..0000000 --- a/test/bridge_test.py +++ /dev/null @@ -1,264 +0,0 @@ -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 - -[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 - -""" - -""" - +----------------------------------------------------------------------------------------------+ - | 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, "") - 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, "") - 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, "") - 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() diff --git a/test/classifier_test.py b/test/classifier_test.py deleted file mode 100644 index 82e525c..0000000 --- a/test/classifier_test.py +++ /dev/null @@ -1,1016 +0,0 @@ -import ptf -from ptf.base_tests import BaseTest -from ptf.testutils import * -from scapy.all import * -from mrzcpd import Mrzcpd -from common_pkt import * - -start_conf_base = """ -[device] -device=veth0,veth1,veth2,veth3,veth4,veth5 -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 - -[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 - -[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 - -# vwire -[vwire:0] -vwire_id=0 -interface_int=veth4 -interface_ext=veth5 - -[service_lb] -sid_start=1000 -sid_end=2000 - -# load balance -[load_balance:0] -mode=balance -devices=veth0,normal - -[load_balance:1] -mode=balance -devices=veth1,normal - -[load_balance:2] -mode=balance -devices=veth2,normal - -[load_balance:3] -mode=balance -devices=veth3,normal - -""" - -dynamic_conf_base = """ - -[classifier_rule:0] -rule_id=1 -ruleset_type=classifier -dst_ip_addr_v4=172.17.2.100 -dst_ip_mask_v4=32 -action=nf_steering -priority=1 -category=0 -sid=1000 -vwire_id=0 - -[classifier_rule:1] -rule_id=2 -ruleset_type=classifier -dst_ip_addr_v4=172.17.2.101 -dst_ip_mask_v4=32 -action=nf_steering -priority=1 -category=0 -sid=1001 -vwire_id=0 - -[classifier_rule:2] -rule_id=3 -ruleset_type=classifier -src_ip_addr_v4=172.17.2.102 -src_ip_mask_v4=32 -action=nf_steering -priority=1 -category=0 -sid=1002 -vwire_id=0 - -[classifier_rule:3] -rule_id=4 -ruleset_type=classifier -src_ip_addr_v4=172.17.2.103 -src_ip_mask_v4=32 -action=nf_steering -priority=1 -category=0 -sid=1003 -vwire_id=0 - -[classifier_rule:4] -rule_id=5 -ruleset_type=classifier -dst_ip_addr_v6=2222::4 -dst_ip_mask_v6=128 -action=nf_steering -priority=1 -category=0 -sid=1000 -vwire_id=0 - -[classifier_rule:5] -rule_id=6 -ruleset_type=classifier -dst_ip_addr_v6=2222::5 -dst_ip_mask_v6=128 -action=nf_steering -priority=1 -category=0 -sid=1001 -vwire_id=0 - -[classifier_rule:6] -rule_id=7 -ruleset_type=classifier -src_ip_addr_v6=2222::6 -src_ip_mask_v6=128 -action=nf_steering -priority=1 -category=0 -sid=1002 -vwire_id=0 - -[classifier_rule:7] -rule_id=8 -ruleset_type=classifier -src_ip_addr_v6=2222::7 -src_ip_mask_v6=128 -action=nf_steering -priority=1 -category=0 -sid=1003 -vwire_id=0 -""" -""" - +----------------------+ +----------------------+ - | DstIP=172.17.2.100 | | DstIP=172.17.2.101 | - +----------------------+ +----------------------+ - | | - V V - +-------------------------------------------------+ - | Classifier Table | - +-------------------------------------------------+ - | | - V V - +---------------------+ +---------------------+ - | ClassifierRuleID1 | | ClassifierRuleID2 | - +---------------------+ +---------------------+ - | | - V V - +------------------------------------------------+ - | Forwarding | - +------------------------------------------------+ - | | - V V - +-------------------+ +-------------------+ - | veth0 port | | veth1 port | - +-------------------+ +-------------------+ -""" - - -@group("classifier_test_base") -class BaseForLinearSearch(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_base,dynamic_conf_base) - mrzcpd.start() - - """ - +---------------------------+ +--------------------------------+ +--------------+ - | PTF | | MRZCPD | | PTF | - +---------------------------+ +--------------------------------+ +--------------+ - | Ipv4 DstIP=172.17.2.100 | ---> | RuleID=1, DstIP=172.17.2.100 | ---> | veth0-ptf0 | - +---------------------------+ +--------------------------------+ +--------------+ - | Ipv4 DstIP=172.17.2.101 | ---> | RuleID=2, DstIP=172.17.2.101 | ---> | veth1-ptf0 | - +---------------------------+ +--------------------------------+ +--------------+ - """ - - # Check classifier rule id 1 - 2, check ipv4 dst ip rule. - for i in range(0, 2): - # Create packet for classifier rule - verify_pkt = send_pkt = simple_tcp_packet( - ip_src="172.17.1.100", ip_dst="172.17.2." + str(100 + i)) - send_packet(self, 5, send_pkt) - verify_packets(self, verify_pkt, [i]) - - """ - +---------------------------+ +--------------------------------+ +--------------+ - | PTF | | MRZCPD | | PTF | - +---------------------------+ +--------------------------------+ +--------------+ - | Ipv4 SrcIP=172.17.2.102 | ---> | RuleID=3, SrcIP=172.17.2.102 | ---> | veth2-ptf2 | - +---------------------------+ +--------------------------------+ +--------------+ - | Ipv4 SrcIP=172.17.2.103 | ---> | RuleID=4, SrcIP=172.17.2.103 | ---> | veth3-ptf3 | - +---------------------------+ +--------------------------------+ +--------------+ - """ - - # Check classifier rule id 3 - 4, check ipv4 src ip rule. - for i in range(2, 4): - # Create packet for classifier rule - verify_pkt = send_pkt = simple_tcp_packet( - ip_src="172.17.2." + str(100 + i), ip_dst="172.17.1.100") - - send_packet(self, 5, send_pkt) - verify_packets(self, verify_pkt, [i]) - - """ - +---------------------------+ +--------------------------------+ +--------------+ - | PTF | | MRZCPD | | PTF | - +---------------------------+ +--------------------------------+ +--------------+ - | Ipv6 DstIP= 2222::4 | ---> | RuleID=5, DstIP= 2222::4 | ---> | veth0-ptf0 | - +---------------------------+ +--------------------------------+ +--------------+ - | Ipv6 DstIP= 2222::5 | ---> | RuleID=6, DstIP= 2222::5 | ---> | veth1-ptf1 | - +---------------------------+ +--------------------------------+ +--------------+ - """ - - # Check classifier rule id 5 - 6, check ipv6 dst ip rule. - for i in range(4, 6): - # Create packet for classifier rule - verify_pkt = send_pkt = simple_tcpv6_packet( - ipv6_src="1111::8888", ipv6_dst="2222::" + str(i)) - - send_packet(self, 5, send_pkt) - verify_packets(self, verify_pkt, [i % 4]) - - """ - +---------------------------+ +--------------------------------+ +--------------+ - | PTF | | MRZCPD | | PTF | - +---------------------------+ +--------------------------------+ +--------------+ - | Ipv6 SrcIP= 2222::6 | ---> | RuleID=7, SrcIP= 2222::6 | ---> | veth2-ptf2 | - +---------------------------+ +--------------------------------+ +--------------+ - | Ipv6 SrcIP= 2222::7 | ---> | RuleID=8, SrcIP= 2222::7 | ---> | veth3-ptf3 | - +---------------------------+ +--------------------------------+ +--------------+ - """ - # Check classifier rule id 7 - 8, check ipv6 src ip rule. - for i in range(6, 8): - # Create packet for classifier rule - verify_pkt = send_pkt = simple_tcpv6_packet( - ipv6_src="2222::" + str(i), ipv6_dst="1111::8888") - - send_packet(self, 5, send_pkt) - verify_packets(self, verify_pkt, [i % 4]) - - """ - +---------------------------+ +---------+-----------------+---------+ +--------------+ - | PTF | | Vwire | Classifier | Vwire | | PTF | - +---------------------------+ +---------+-----------------+---------+ +--------------+ - | SrcIP=172.17.3.100 | | veth5 | No Match Rule | veth5 | ---> | veth5-ptf5 | - | DstIP=172.17.1.100 | ---> | veth4 | To Vwire | veth4 | | | - +---------------------------+ +---------+-----------------+---------+ +--------------+ - - """ - - # Check miss packet - verify_pkt = send_pkt = simple_tcp_packet( - ip_src="172.17.3.100", ip_dst="172.17.1.100") - - send_packet(self, 4, send_pkt) - verify_packets(self, verify_pkt, [5]) - - finally: - mrzcpd.stop() - - -@group("classifier_test_base") -class TestForTreeSearch(BaseTest): - def setUp(self): - self.dataplane = ptf.dataplane_instance - - def __init__(self): - BaseTest.__init__(self) - - def runTest(self): - try: - # Init & Start mrzcpd - global dynamic_conf_base - for i in range(8,128): - dynamic_conf_base += "[classifier_rule:" + str(i) + "]\n" - dynamic_conf_base += "ruleset_type=classifier\n" - dynamic_conf_base += "rule_id=" + str(i+1) + "\n" - dynamic_conf_base += "dst_ip_addr_v4=172.19.2." + str(i) + "\n" - dynamic_conf_base += "dst_ip_mask_v4=32\n" - dynamic_conf_base += "action=nf_steering\n" - dynamic_conf_base += "priority=1\n" - dynamic_conf_base += "category=0\n" - dynamic_conf_base += "sid=1000\n" - dynamic_conf_base += "vwire_id=0\n\n" - - #print(base_conf) - mrzcpd = Mrzcpd(start_conf_base,dynamic_conf_base) - mrzcpd.start() - - """ - +---------------------------+ +--------------------------------+ +--------------+ - | PTF | | MRZCPD | | PTF | - +---------------------------+ +--------------------------------+ +--------------+ - | Ipv4 DstIP=172.17.2.100 | ---> | RuleID=1, DstIP=172.17.2.100 | ---> | veth0-ptf0 | - +---------------------------+ +--------------------------------+ +--------------+ - | Ipv4 DstIP=172.17.2.101 | ---> | RuleID=2, DstIP=172.17.2.101 | ---> | veth1-ptf0 | - +---------------------------+ +--------------------------------+ +--------------+ - """ - - # Check classifier rule id 1 - 2, check ipv4 dst ip rule. - for i in range(0, 2): - # Create packet for classifier rule - verify_pkt = send_pkt = simple_tcp_packet( - ip_src="172.17.1.100", ip_dst="172.17.2." + str(100 + i)) - send_packet(self, 5, send_pkt) - verify_packets(self, verify_pkt, [i]) - - """ - +---------------------------+ +--------------------------------+ +--------------+ - | PTF | | MRZCPD | | PTF | - +---------------------------+ +--------------------------------+ +--------------+ - | Ipv4 SrcIP=172.17.2.102 | ---> | RuleID=3, SrcIP=172.17.2.102 | ---> | veth2-ptf2 | - +---------------------------+ +--------------------------------+ +--------------+ - | Ipv4 SrcIP=172.17.2.103 | ---> | RuleID=4, SrcIP=172.17.2.103 | ---> | veth3-ptf3 | - +---------------------------+ +--------------------------------+ +--------------+ - """ - - # Check classifier rule id 3 - 4, check ipv4 src ip rule. - for i in range(2, 4): - # Create packet for classifier rule - verify_pkt = send_pkt = simple_tcp_packet( - ip_src="172.17.2." + str(100 + i), ip_dst="172.17.1.100") - - send_packet(self, 5, send_pkt) - verify_packets(self, verify_pkt, [i]) - - """ - +---------------------------+ +--------------------------------+ +--------------+ - | PTF | | MRZCPD | | PTF | - +---------------------------+ +--------------------------------+ +--------------+ - | Ipv6 DstIP= 2222::4 | ---> | RuleID=5, DstIP= 2222::4 | ---> | veth0-ptf0 | - +---------------------------+ +--------------------------------+ +--------------+ - | Ipv6 DstIP= 2222::5 | ---> | RuleID=6, DstIP= 2222::5 | ---> | veth1-ptf1 | - +---------------------------+ +--------------------------------+ +--------------+ - """ - - # Check classifier rule id 5 - 6, check ipv6 dst ip rule. - for i in range(4, 6): - # Create packet for classifier rule - verify_pkt = send_pkt = simple_tcpv6_packet( - ipv6_src="1111::8888", ipv6_dst="2222::" + str(i)) - - send_packet(self, 5, send_pkt) - verify_packets(self, verify_pkt, [i % 4]) - - """ - +---------------------------+ +--------------------------------+ +--------------+ - | PTF | | MRZCPD | | PTF | - +---------------------------+ +--------------------------------+ +--------------+ - | Ipv6 SrcIP= 2222::6 | ---> | RuleID=7, SrcIP= 2222::6 | ---> | veth2-ptf2 | - +---------------------------+ +--------------------------------+ +--------------+ - | Ipv6 SrcIP= 2222::7 | ---> | RuleID=8, SrcIP= 2222::7 | ---> | veth3-ptf3 | - +---------------------------+ +--------------------------------+ +--------------+ - """ - # Check classifier rule id 7 - 8, check ipv6 src ip rule. - for i in range(6, 8): - # Create packet for classifier rule - verify_pkt = send_pkt = simple_tcpv6_packet( - ipv6_src="2222::" + str(i), ipv6_dst="1111::8888") - - send_packet(self, 5, send_pkt) - verify_packets(self, verify_pkt, [i % 4]) - - """ - +---------------------------+ +---------+-----------------+---------+ +--------------+ - | PTF | | Vwire | Classifier | Vwire | | PTF | - +---------------------------+ +---------+-----------------+---------+ +--------------+ - | SrcIP=172.17.3.100 | | veth5 | No Match Rule | veth5 | ---> | veth5-ptf5 | - | DstIP=172.17.1.100 | ---> | veth4 | To Vwire | veth4 | | | - +---------------------------+ +---------+-----------------+---------+ +--------------+ - - """ - - # Check miss packet - verify_pkt = send_pkt = simple_tcp_packet( - ip_src="172.17.3.100", ip_dst="172.17.1.100") - - send_packet(self, 4, send_pkt) - verify_packets(self, verify_pkt, [5]) - - finally: - mrzcpd.stop() - -category_conf = """Current not support priority""" - -start_conf_vwire = """ -[device] -device=veth0,veth1,veth2,veth3 -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 - -[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 - -[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 - -# vwire -[vwire:0] -vwire_id=0 -interface_int=veth2 -interface_ext=veth3 - -[service_lb] -sid_start=1000 -sid_end=2000 - -# load balance -[load_balance:0] -mode=balance -devices=veth0,normal - -[load_balance:1] -mode=balance -devices=veth1,normal - -""" - -dynamic_conf_full_field_match_for_vwire = """ - -[classifier_rule:0] -rule_id=1 -ruleset_type=classifier -src_ip_addr_v4=172.17.1.100 -src_ip_mask_v4=32 -dst_ip_addr_v4=172.17.2.100 -dst_ip_mask_v4=32 -src_port_range_start=1000 -src_port_range_end=1000 -dst_port_range_start=80 -dst_port_range_end=80 -proto=tcp -priority=1 -sid=1000 -category=0 -vwire_id=0 -action=nf_steering - -[classifier_rule:1] -rule_id=2 -ruleset_type=classifier -src_ip_addr_v6=1111::8888 -src_ip_mask_v6=128 -dst_ip_addr_v6=2222::9999 -dst_ip_mask_v6=128 -src_port_range_start=1000 -src_port_range_end=1000 -dst_port_range_start=80 -dst_port_range_end=80 -proto=udp -priority=1 -sid=1001 -category=0 -vwire_id=0 -action=nf_steering - -""" -""" - +----------------------+ +----------------------+ - | IPv4=172.17.2.100 | | IPv6=2222::9999 | - +----------------------+ +----------------------+ - | | - V V - +-------------------------------------------------+ - | Classifier Table | - +-------------------------------------------------+ - | | - V V - +---------------------+ +---------------------+ - | ClassifierRuleID1 | | ClassifierRuleID2 | - +---------------------+ +---------------------+ - | | - V V - +------------------------------------------------+ - | Forwarding | - +------------------------------------------------+ - | | - V V - +-------------------+ +-------------------+ - | veth0 port | | veth1 port | - +-------------------+ +-------------------+ -""" - - -@ group("full_field_match_test") -class FullFieldLinearMatchForVwireTest(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_vwire,dynamic_conf_full_field_match_for_vwire) - mrzcpd.start() - - # Check IPv4 for miss - send_pkt = simple_tcp_packet( - ip_src="172.17.1.100", ip_dst="172.17.2.100", tcp_sport=1000, tcp_dport=1000) - verify_pkt = simple_tcp_packet( - ip_src="172.17.1.100", ip_dst="172.17.2.100", tcp_sport=1000, tcp_dport=1000) - send_packet(self, 3, send_pkt) - verify_packets(self, verify_pkt, [2]) - - # Check IPv4 for match - send_pkt = simple_tcp_packet( - ip_src="172.17.1.100", ip_dst="172.17.2.100", tcp_sport=1000, tcp_dport=80) - verify_pkt = simple_tcp_packet( - ip_src="172.17.1.100", ip_dst="172.17.2.100", tcp_sport=1000, tcp_dport=80) - send_packet(self, 3, send_pkt) - verify_packets(self, verify_pkt, [0]) - - # Check IPv6 for miss - send_pkt = simple_udpv6_packet( - ipv6_src="1111::8888", ipv6_dst="2222::9999", udp_sport=1000, udp_dport=1000) - verify_pkt = simple_udpv6_packet( - ipv6_src="1111::8888", ipv6_dst="2222::9999", udp_sport=1000, udp_dport=1000) - send_packet(self, 2, send_pkt) - verify_packets(self, verify_pkt, [3]) - - # Check IPv6 for match - send_pkt = simple_udpv6_packet( - ipv6_src="1111::8888", ipv6_dst="2222::9999", udp_sport=1000, udp_dport=80) - verify_pkt = simple_udpv6_packet( - ipv6_src="1111::8888", ipv6_dst="2222::9999", udp_sport=1000, udp_dport=80) - send_packet(self, 2, send_pkt) - verify_packets(self, verify_pkt, [1]) - - finally: - mrzcpd.stop() - -@ group("full_field_match_test") -class FullFieldTreeMatchForVwireTest(BaseTest): - def setUp(self): - self.dataplane = ptf.dataplane_instance - - def __init__(self): - BaseTest.__init__(self) - - def runTest(self): - try: - # Init & Start mrzcpd - global dynamic_conf_full_field_match_for_vwire - dynamic_conf = dynamic_conf_full_field_match_for_vwire - for i in range(8,128): - dynamic_conf += "[classifier_rule:" + str(i) + "]\n" - dynamic_conf += "ruleset_type=classifier\n" - dynamic_conf += "rule_id=" + str(i+1) + "\n" - dynamic_conf += "dst_ip_addr_v4=172.19.2." + str(i) + "\n" - dynamic_conf += "dst_ip_mask_v4=32\n" - dynamic_conf += "action=nf_steering\n" - dynamic_conf += "priority=1\n" - dynamic_conf += "category=0\n" - dynamic_conf += "sid=1000\n" - dynamic_conf += "vwire_id=0\n\n" - mrzcpd = Mrzcpd(start_conf_vwire,dynamic_conf) - mrzcpd.start() - - # Check IPv4 for miss - send_pkt = simple_tcp_packet( - ip_src="172.17.1.100", ip_dst="172.17.2.100", tcp_sport=1000, tcp_dport=1000) - verify_pkt = simple_tcp_packet( - ip_src="172.17.1.100", ip_dst="172.17.2.100", tcp_sport=1000, tcp_dport=1000) - send_packet(self, 3, send_pkt) - verify_packets(self, verify_pkt, [2]) - - # Check IPv4 for match - send_pkt = simple_tcp_packet( - ip_src="172.17.1.100", ip_dst="172.17.2.100", tcp_sport=1000, tcp_dport=80) - verify_pkt = simple_tcp_packet( - ip_src="172.17.1.100", ip_dst="172.17.2.100", tcp_sport=1000, tcp_dport=80) - send_packet(self, 3, send_pkt) - verify_packets(self, verify_pkt, [0]) - - # Check IPv6 for miss - send_pkt = simple_udpv6_packet( - ipv6_src="1111::8888", ipv6_dst="2222::9999", udp_sport=1000, udp_dport=1000) - verify_pkt = simple_udpv6_packet( - ipv6_src="1111::8888", ipv6_dst="2222::9999", udp_sport=1000, udp_dport=1000) - send_packet(self, 2, send_pkt) - verify_packets(self, verify_pkt, [3]) - - # Check IPv6 for match - send_pkt = simple_udpv6_packet( - ipv6_src="1111::8888", ipv6_dst="2222::9999", udp_sport=1000, udp_dport=80) - verify_pkt = simple_udpv6_packet( - ipv6_src="1111::8888", ipv6_dst="2222::9999", udp_sport=1000, udp_dport=80) - send_packet(self, 2, send_pkt) - verify_packets(self, verify_pkt, [1]) - - finally: - mrzcpd.stop() - - -start_conf_tera = """ -[device] -device=veth0,veth1,veth2 -sz_tunnel=8192 -sz_buffer=0 - -[device:veth0] -promisc=0 -mtu=1500 -driver=2 -role=3 - -[device:veth1] -promisc=1 -mtu=1500 -driver=2 -role=3 - -[device:veth2] -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 - -[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=32 - -[vwires] -sid_start=300 -sid_end=400 -max_rules=32 - -[tera_adapters] -sid_start=500 -sid_end=600 -max_rules=64 - -[tera_adapter:0] -tera_adapter_id=0 -listen_device=veth0 -vlan_int=110 -vlan_ext=111 -mac_flipping=0 - -[service_lb] -sid_start=1000 -sid_end=2000 - -# load balance -[load_balance:0] -mode=balance -devices=veth1,normal - -[load_balance:1] -mode=balance -devices=veth2,normal - -""" - -dynamic_conf_full_field_match_for_tera = """ -[classifier_rule:0] -rule_id=1 -ruleset_type=classifier -src_ip_addr_v4=172.17.1.100 -src_ip_mask_v4=32 -dst_ip_addr_v4=172.17.2.100 -dst_ip_mask_v4=32 -src_port_range_start=1000 -src_port_range_end=1000 -dst_port_range_start=80 -dst_port_range_end=80 -proto=tcp -priority=1 -sid=1000 -category=0 -tera_adapter_id=0 -action=nf_steering - -[classifier_rule:1] -rule_id=2 -ruleset_type=classifier -src_ip_addr_v6=1111::8888 -src_ip_mask_v6=128 -dst_ip_addr_v6=2222::9999 -dst_ip_mask_v6=128 -src_port_range_start=1000 -src_port_range_end=1000 -dst_port_range_start=80 -dst_port_range_end=80 -proto=udp -priority=1 -sid=1001 -category=0 -tera_adapter_id=0 -action=nf_steering - -""" - -""" - +----------------------+ +----------------------+ - | IPv4=172.17.2.100 | | IPv6=2222::9999 | - +----------------------+ +----------------------+ - | | - V V - +-------------------------------------------------+ - | Classifier Table | - +-------------------------------------------------+ - | | - V V - +---------------------+ +---------------------+ - | ClassifierRuleID1 | | ClassifierRuleID2 | - +---------------------+ +---------------------+ - | | - V V - +------------------------------------------------+ - | Forwarding | - +------------------------------------------------+ - | | - V V - +-------------------+ +-------------------+ - | veth1 port | | veth2 port | - +-------------------+ +-------------------+ -""" -@ group("full_field_match_test") -class FullFieldLinearMatchForTeraTest(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_tera,dynamic_conf_full_field_match_for_tera) - mrzcpd.start() - - # Check IPv4 for miss - send_pkt = simple_tcp_packet(vlan_vid=110, dl_vlan_enable=True,ip_src="172.17.1.100", ip_dst="172.17.2.100", tcp_sport=1000, tcp_dport=1000) - verify_pkt = simple_tcp_packet(vlan_vid=111, dl_vlan_enable=True,ip_src="172.17.1.100", ip_dst="172.17.2.100", tcp_sport=1000, tcp_dport=1000) - send_packet(self, 0, send_pkt) - verify_packets(self, verify_pkt, [0]) - - # Check IPv4 for match - send_pkt = simple_tcp_packet(vlan_vid=110, dl_vlan_enable=True,ip_src="172.17.1.100", ip_dst="172.17.2.100", tcp_sport=1000, tcp_dport=80) - verify_pkt = simple_tcp_packet(vlan_vid=111, dl_vlan_enable=True,ip_src="172.17.1.100", ip_dst="172.17.2.100", tcp_sport=1000, tcp_dport=80) - send_packet(self, 0, send_pkt) - verify_packets(self, verify_pkt, [1]) - - # Check IPv6 for miss - send_pkt = simple_udpv6_packet(vlan_vid=110, dl_vlan_enable=True,ipv6_src="1111::8888", ipv6_dst="2222::9999", udp_sport=1000, udp_dport=1000) - verify_pkt = simple_udpv6_packet(vlan_vid=111, dl_vlan_enable=True,ipv6_src="1111::8888", ipv6_dst="2222::9999", udp_sport=1000, udp_dport=1000) - send_packet(self, 0, send_pkt) - verify_packets(self, verify_pkt, [0]) - - # Check IPv6 for match - send_pkt = simple_udpv6_packet(vlan_vid=110, dl_vlan_enable=True,ipv6_src="1111::8888", ipv6_dst="2222::9999", udp_sport=1000, udp_dport=80) - verify_pkt = simple_udpv6_packet(vlan_vid=111, dl_vlan_enable=True,ipv6_src="1111::8888", ipv6_dst="2222::9999", udp_sport=1000, udp_dport=80) - send_packet(self, 0, send_pkt) - verify_packets(self, verify_pkt, [2]) - - finally: - mrzcpd.stop() - -@ group("full_field_match_test") -class FullFieldTreeMatchForTeraTest(BaseTest): - def setUp(self): - self.dataplane = ptf.dataplane_instance - - def __init__(self): - BaseTest.__init__(self) - - def runTest(self): - try: - # Init & Start mrzcpd - global dynamic_conf_full_field_match_for_tera - dynamic_conf = dynamic_conf_full_field_match_for_tera - for i in range(8,128): - dynamic_conf += "[classifier_rule:" + str(i) + "]\n" - dynamic_conf += "ruleset_type=classifier\n" - dynamic_conf += "rule_id=" + str(i+1) + "\n" - dynamic_conf += "dst_ip_addr_v4=172.19.2." + str(i) + "\n" - dynamic_conf += "dst_ip_mask_v4=32\n" - dynamic_conf += "action=nf_steering\n" - dynamic_conf += "priority=1\n" - dynamic_conf += "category=0\n" - dynamic_conf += "sid=1000\n" - dynamic_conf += "tera_adapter_id=0\n\n" - mrzcpd = Mrzcpd(start_conf_tera,dynamic_conf) - mrzcpd.start() - - # Check IPv4 for miss - send_pkt = simple_tcp_packet(vlan_vid=110, dl_vlan_enable=True,ip_src="172.17.1.100", ip_dst="172.17.2.100", tcp_sport=1000, tcp_dport=1000) - verify_pkt = simple_tcp_packet(vlan_vid=111, dl_vlan_enable=True,ip_src="172.17.1.100", ip_dst="172.17.2.100", tcp_sport=1000, tcp_dport=1000) - send_packet(self, 0, send_pkt) - verify_packets(self, verify_pkt, [0]) - - # Check IPv4 for match - send_pkt = simple_tcp_packet(vlan_vid=110, dl_vlan_enable=True,ip_src="172.17.1.100", ip_dst="172.17.2.100", tcp_sport=1000, tcp_dport=80) - verify_pkt = simple_tcp_packet(vlan_vid=111, dl_vlan_enable=True,ip_src="172.17.1.100", ip_dst="172.17.2.100", tcp_sport=1000, tcp_dport=80) - send_packet(self, 0, send_pkt) - verify_packets(self, verify_pkt, [1]) - - # Check IPv6 for miss - send_pkt = simple_udpv6_packet(vlan_vid=110, dl_vlan_enable=True,ipv6_src="1111::8888", ipv6_dst="2222::9999", udp_sport=1000, udp_dport=1000) - verify_pkt = simple_udpv6_packet(vlan_vid=111, dl_vlan_enable=True,ipv6_src="1111::8888", ipv6_dst="2222::9999", udp_sport=1000, udp_dport=1000) - send_packet(self, 0, send_pkt) - verify_packets(self, verify_pkt, [0]) - - # Check IPv6 for match - send_pkt = simple_udpv6_packet(vlan_vid=110, dl_vlan_enable=True,ipv6_src="1111::8888", ipv6_dst="2222::9999", udp_sport=1000, udp_dport=80) - verify_pkt = simple_udpv6_packet(vlan_vid=111, dl_vlan_enable=True,ipv6_src="1111::8888", ipv6_dst="2222::9999", udp_sport=1000, udp_dport=80) - send_packet(self, 0, send_pkt) - verify_packets(self, verify_pkt, [2]) - - finally: - mrzcpd.stop() diff --git a/test/common_pkt.py b/test/common_pkt.py deleted file mode 100644 index a21758f..0000000 --- a/test/common_pkt.py +++ /dev/null @@ -1,100 +0,0 @@ -import ptf -import random -import ipaddress -from ptf.testutils import * -from ptf.thriftutils import * -from scapy.all import * -from scapy.contrib.bfd import BFD - - -def simple_bfd_packet( - eth_dst="10:70:fd:03:c0:bd", - eth_src="0a:0a:0a:0a:01:28", - ip_src="10.10.1.40", - ip_dst="10.254.60.1", - udp_sport=3784, - udp_dport=3784, - sta=0, - my_discriminator=1, - your_discriminator=2, -): - """ - Return a simple BFD packet - """ - bfd = BFD(sta=sta, my_discriminator=my_discriminator, - your_discriminator=your_discriminator) - - pkt = simple_udp_packet( - eth_dst=eth_dst, - eth_src=eth_src, - ip_src=ip_src, - ip_dst=ip_dst, - udp_sport=udp_sport, - udp_dport=udp_dport, - udp_payload=bfd - ) - return pkt - -def simple_vlan_udp_packet(eth_dst, eth_src, vlan_vid, ip_src="192.168.0.1", ip_dst="192.168.0.2", udp_sport=1234, udp_dport=80, udp_payload = ""): - # 构建Ethernet帧 - ether_frame = Ether(src=eth_src, dst=eth_dst) - - # 添加VLAN标签 - vlan_frame = ether_frame / Dot1Q(vlan=vlan_vid) - - # 添加IP头 - ip_packet = IP(src=ip_src, dst=ip_dst) - - # 添加UDP头 - udp_packet = UDP(sport=udp_sport, dport=udp_dport) - - # 添加有效负载 - udp_payload_packet = udp_packet / udp_payload - - # 构建最终的数据包 - final_packet = vlan_frame / ip_packet / udp_payload_packet - - return final_packet - -def simple_qinq_udp_packet(eth_src, eth_dst, outer_vlan_id, inner_vlan_id, ip_src="192.168.0.1", ip_dst="192.168.0.2", udp_sport=1234,udp_dport=80, udp_payload = ""): - # 构建Ethernet帧 - ether_frame = Ether(src=eth_src, dst=eth_dst) - - # 添加QinQ标签 - qinq_frame = ether_frame / Dot1Q(vlan=outer_vlan_id) / Dot1Q(vlan=inner_vlan_id) - - # 添加IP头 - ip_packet = IP(src=ip_src, dst=ip_dst) - - # 添加UDP头 - udp_packet = UDP(sport=udp_sport, dport=udp_dport) - - # 添加有效负载 - udp_payload_packet = udp_packet / udp_payload - - # 构建最终的数据包 - final_packet = qinq_frame / ip_packet / udp_payload_packet - - return final_packet - -def generate_random_tcp_port(): - """ - 生成随机的 TCP 端口号 - """ - return random.randint(1024, 65535) - - -def generate_random_ipv4(): - """ - 生成随机的 IPv4 地址 - """ - # 随机生成四个 0-255 之间的数字 - octets = [str(random.randint(0, 255)) for _ in range(4)] - # 将四个数字组合成一个 IPv4 地址 - ip_addr = ".".join(octets) - # 将字符串类型的 IP 地址转换为 IPv4Address 对象 - return ipaddress.IPv4Address(ip_addr) - - -def get_port_packet_count(self, port): - return self.dataplane.rx_counters[port] diff --git a/test/create_veth.sh b/test/create_veth.sh deleted file mode 100644 index ed00dd6..0000000 --- a/test/create_veth.sh +++ /dev/null @@ -1,45 +0,0 @@ -#!/bin/bash - -function create_veth() { - ip link add veth$1 type veth peer name veth$1-ptf$1 - ip link set veth$1 up - ip link set veth$1-ptf$1 up -} - -function delete_veth() { - for i in $(seq 0 $(( $1 - 1 ))) - do - ip link delete veth$i - echo "Deleted veth interface: veth$i" - done -} - -if [[ "$1" == "create" ]]; then - if [ "$2" == "msgpack" ]; then - ip link add veth-msgpack-tx type veth peer name veth-msgpack-rx - ip link set veth-msgpack-rx up - ip link set veth-msgpack-tx up - elif [ -z "$2" ]; then - echo "Usage: $0 create " - exit 1 - fi - - for i in $(seq 0 $(( $2 - 1 ))) - do - create_veth "$i" - echo "Created veth interface: veth$i" - done - -elif [[ "$1" == "delete" ]]; then - if [ "$2" == "msgpack" ]; then - ip link delete veth-msgpack-tx - echo "Deleted veth interface: veth-msgpack-tx" - elif [ -z "$2" ]; then - echo "Usage: $0 delete " - exit 1 - fi - delete_veth "$2" -else - echo "Usage: $0 " - exit 1 -fi diff --git a/test/endpoint_dev_test.py b/test/endpoint_dev_test.py deleted file mode 100644 index fa46b44..0000000 --- a/test/endpoint_dev_test.py +++ /dev/null @@ -1,111 +0,0 @@ -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 - -icmp_conf = """ -[device] -device=veth0 -sz_tunnel=8192 -sz_buffer=0 - -[device:veth0] -in_addr=172.17.16.1 -in_mask=255.255.255.0 -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 - -[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] -interface_int=veth0 - -[service_lb] -sid_start=1000 -sid_end=2000 - -""" - -""" - +------------+ +-------------------------+ - | PTF | | MRZCPD | - +------------+ icmp +-------------------------+ - | veth0-ptf0 | <---> | veth0 (172.17.16.1) | - +------------+ +-------------------------+ -""" - -@group("icmp_reply_test") -class IcmpReplyTest(BaseTest): - def setUp(self): - self.dataplane = ptf.dataplane_instance - - def __init__(self): - BaseTest.__init__(self) - - def runTest(self): - try: - # Init & Start mrzcpd - mrzcpd = Mrzcpd(icmp_conf,"") - mrzcpd.start() - send_pkt = simple_icmp_packet(eth_dst='00:01:02:03:04:05',eth_src='00:06:07:08:09:0a',ip_src='172.17.16.2', ip_dst='172.17.16.1', icmp_type=8, icmp_code=0,icmp_data='icmp test\n') - send_packet(self, 0,send_pkt) - - # Verify - exp_pkt = simple_icmp_packet(eth_dst='00:06:07:08:09:0a',eth_src='00:01:02:03:04:05',ip_src='172.17.16.1', ip_dst='172.17.16.2', icmp_type=0, icmp_code=0,icmp_data='icmp test\n') - verify_packet(self, exp_pkt, 0) - - finally: - mrzcpd.stop() diff --git a/test/etherfabric_test.py b/test/etherfabric_test.py deleted file mode 100644 index 61f2e17..0000000 --- a/test/etherfabric_test.py +++ /dev/null @@ -1,578 +0,0 @@ -import ptf -from ptf.base_tests import BaseTest -from ptf.testutils import * -from scapy.all import * -from mrzcpd import Mrzcpd -from common_pkt import * - -conf_for_virtual_wire_mode = """ -[device] -device=veth0 -sz_tunnel=8192 -sz_buffer=0 - -[device:veth0] -in_addr=10.254.60.1 -in_mask=255.255.255.0 -gateway=10.10.1.40 -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 - -[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 - -[ef_adapters] -sid_start=100 -sid_end=200 -max_rules=256 - -[ef_adapter:0] -ef_adapter_id=0 -mode=virtual-wire -listen_device=veth0 -""" - -@group("virtual_wire_mode") -class TestForVirtualWireMode(BaseTest): - def setUp(self): - self.dataplane = ptf.dataplane_instance - - def __init__(self): - BaseTest.__init__(self) - - def runTest(self): - try: - # Init & Start mrzcpd - mrzcpd = Mrzcpd(conf_for_virtual_wire_mode, "") - mrzcpd.start() - - send_pkt = simple_vxlan_packet( - eth_src='0a:0a:0a:0a:01:28', eth_dst='10:70:fd:03:c0:bd', - ip_src='10.254.50.1', ip_dst='10.254.60.1', vxlan_vni=32) - verify_pkt = simple_vxlan_packet( - eth_src='10:70:fd:03:c0:bd', eth_dst='0a:0a:0a:0a:01:28', - ip_src='10.254.60.1', ip_dst='10.254.50.1', vxlan_vni=32) - send_packet(self, 0, send_pkt) - verify_packets(self, verify_pkt, [0]) - finally: - mrzcpd.stop() - -conf_for_tap_mode = """ -[device] -device=veth0 -sz_tunnel=8192 -sz_buffer=0 - -[device:veth0] -in_addr=10.254.60.1 -in_mask=255.255.255.0 -gateway=10.10.1.40 -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 - -[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 - -[ef_adapters] -sid_start=100 -sid_end=200 -max_rules=256 - -[ef_adapter:0] -ef_adapter_id=0 -mode=tap -listen_device=veth0 -""" -@group("tap_mode") -class TestForTapMode(BaseTest): - def setUp(self): - self.dataplane = ptf.dataplane_instance - - def __init__(self): - BaseTest.__init__(self) - - def runTest(self): - try: - # Init & Start mrzcpd - mrzcpd = Mrzcpd(conf_for_tap_mode, "") - mrzcpd.start() - - send_pkt = simple_vxlan_packet( - eth_src='0a:0a:0a:0a:01:28', eth_dst='10:70:fd:03:c0:bd', - ip_src='10.254.50.1', ip_dst='10.254.60.1', vxlan_vni=32) - verify_pkt = simple_vxlan_packet( - eth_src='10:70:fd:03:c0:bd', eth_dst='0a:0a:0a:0a:01:28', - ip_src='10.254.60.1', ip_dst='10.254.50.1', vxlan_vni=32) - - for i in range(0, 100): - send_packet(self, 0, send_pkt) - verify_no_packet(self, verify_pkt, 0) - - finally: - mrzcpd.stop() - -start_conf_with_route_ctx = """ -[device] -device=veth0,veth-msgpack-tx,veth-msgpack-rx -sz_tunnel=8192 -sz_buffer=0 - -[device:veth0] -in_addr=10.254.60.1 -in_mask=255.255.255.0 -gateway=10.10.1.40 -promisc=1 -mtu=1500 -driver=2 -role=3 -ether=10:70:fd:03:c0:bd - -[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=0 -route_ctx_enable=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 - -[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=32 - -[vwires] -sid_start=300 -sid_end=400 -max_rules=32 - -[tera_adapters] -sid_start=500 -sid_end=600 -max_rules=64 - -[service_lb] -sid_start=1000 -sid_end=2000 - -[ef_adapter:0] -ef_adapter_id=0 -mode=virtual-wire -listen_device=veth0 - -# load balance -[load_balance:0] -mode=balance -devices=veth-msgpack-tx,normal -""" - -dynamic_conf_with_route_ctx = """ -[classifier_rule:0] -rule_id=1 -ruleset_type=classifier -action=nf_steering -priority=1 -category=0 -sid=1000 -""" -""" - +------------+ +-----------------------------------------+ - | PTF | | MRZCPD | - +------------+ +------------+--------+-------------------+ - | | ---> | | ---> | veth-msgpack-tx | --------+ - + veth0-ptf0 + + veth0 + +-------------------+ | - | | <--- | | <--- | veth-msgpack-rx | <-------+ - +------------+ +------------+ +-------------------+ -""" -@group("ef_route_ctx_test") -class IPv4TestForRouteCtx(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_with_route_ctx, dynamic_conf_with_route_ctx) - mrzcpd.start() - - send_pkt = simple_vxlan_packet( - eth_src='0a:0a:0a:0a:01:28', eth_dst='10:70:fd:03:c0:bd', - ip_src='10.254.50.1', ip_dst='10.254.60.1',udp_sport=4789,udp_dport=4789, vxlan_vni=32) - verify_pkt = simple_vxlan_packet( - eth_src='10:70:fd:03:c0:bd', eth_dst='0a:0a:0a:0a:01:28', - ip_src='10.254.60.1', ip_dst='10.254.50.1',udp_sport=4789,udp_dport=4789,with_udp_chksum=False,vxlan_flags=0,vxlan_vni=32) - send_packet(self, 0, send_pkt) - verify_packets(self, verify_pkt, [0]) - finally: - mrzcpd.stop() - -start_conf_with_non_contiguous_test = """ -[device] -device = veth0,veth1,veth2,veth3,veth4,veth5 -sz_tunnel = 8192 -sz_buffer = 0 - -[device:veth0] -in_addr=10.254.60.100 -in_mask=255.255.255.0 -promisc = 1 -mtu = 1500 -driver = 2 -role = 3 - -[device:veth1] -promisc = 1 -mtu = 1500 -driver=2 -role=4 - -[device:veth2] -in_addr=10.254.60.101 -in_mask=255.255.255.0 -promisc = 1 -mtu = 1500 -driver = 2 -role = 3 - -[device:veth3] -promisc = 1 -mtu = 1500 -driver=2 -role=4 - -[device:veth4] -in_addr=10.254.60.102 -in_mask=255.255.255.0 -promisc = 1 -mtu = 1500 -driver = 2 -role = 3 - -[device:veth5] -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 - -[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 - -# load balance -[load_balance:0] -mode=balance -devices=veth1,normal - -[load_balance:1] -mode=balance -devices=veth3,normal - -[load_balance:2] -mode=balance -devices=veth5,normal - -# adapter -[ef_adapter:0] -ef_adapter_id=0 -mode=virtual-wire -listen_device=veth0 - -[ef_adapter:1] -ef_adapter_id=2 -mode=virtual-wire -listen_device=veth2 - -[ef_adapter:2] -ef_adapter_id=4 -mode=virtual-wire -listen_device=veth4 -""" - -dynamic_conf_with_non_contiguous_test = """ -[classifier_rule:0] -rule_id=1 -ruleset_type=classifier -action=nf_steering -priority=1 -category=0 -sid=1000 -ef_adapter_id=0 - -[classifier_rule:1] -rule_id=2 -ruleset_type=classifier -action=nf_steering -priority=1 -category=0 -sid=1001 -ef_adapter_id=2 - -[classifier_rule:2] -rule_id=2 -ruleset_type=classifier -action=nf_steering -priority=1 -category=0 -sid=1002 -ef_adapter_id=4 -""" - -""" - +--------------+ +----------++-----------+----------+ - | PTF | | Mrzcpd | - +--------------+ +----------++-----------+----------+ +------------+ - | veth0-ptf0 | ---> | veth0 | | veth1 | ---> | veth1-ptf1 | - +--------------+ +----------+ +----------+ +------------+ - | veth2-ptf2 | ---> | veth2 | | veth3 | ---> | veth3-ptf3 | - +--------------+ +----------+ +----------+ +------------+ - | veth4-ptf4 | ---> | veth4 | | veth5 | ---> | veth5-ptf5 | - +--------------+ +----------+ +----------+ +------------+ -""" -@group("ef_adapter_id_non_contiguous_test") -class EfAdapterIdNonContiguousTest(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() - - send_pkts = [] - verify_pkts = [] - - # Create packets - for i in range(0,3): - tcp_pkt = simple_tcp_packet() - verify_pkts.append(tcp_pkt) - - send_pkts.append(simple_vxlan_packet(eth_src='0a:0a:0a:0a:01:28', - eth_dst='10:70:fd:03:c0:bd', - ip_src='10.254.50.' + str(100 + i), ip_dst='10.254.60.' + str(100 + i), - vxlan_vni=32,inner_frame=tcp_pkt)) - - - # Traverse all ports - for i in range(0, 3): - # Send pkt for the port - send_packet(self, i * 2 , send_pkts[i]) - # Verify pkt for specified port - verify_packets(self, verify_pkts[i], [1 + i*2]) - - finally: - mrzcpd.stop() diff --git a/test/fuzzing/CMakeLists.txt b/test/fuzzing/CMakeLists.txt new file mode 100644 index 0000000..3f1b8c6 --- /dev/null +++ b/test/fuzzing/CMakeLists.txt @@ -0,0 +1,18 @@ +# Override top-level settings +set(CMAKE_CXX_FLAGS "-fsanitize=address,fuzzer ${COVERAGE_FLAGS}") +set(CMAKE_C_FLAGS "-fsanitize=address,fuzzer ${COVERAGE_FLAGS}") + +add_executable(FuzzingPktParser FuzzingPktParser.cc) + +# If you do not use CMAKE_CXX_FLAGS but use target_compile_options, it will result in the inability to link to clang's asan library. +# target_compile_options(FuzzingPktParser PRIVATE -fsanitize=address,fuzzer) + +target_link_libraries(FuzzingPktParser PRIVATE infra z elf ibverbs mlx5 ${SYSTEMD_LIBRARIES} ${PCAP_LIBRARY} ${DPDK_LIBRARY}) + +add_custom_command( + TARGET FuzzingPktParser + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_CURRENT_SOURCE_DIR}/seeds ${CMAKE_CURRENT_BINARY_DIR}/seeds + COMMENT "Copying seeds to ${CMAKE_CURRENT_BINARY_DIR}" +) + diff --git a/test/fuzzing/FuzzingPktParser.cc b/test/fuzzing/FuzzingPktParser.cc new file mode 100644 index 0000000..5ed1074 --- /dev/null +++ b/test/fuzzing/FuzzingPktParser.cc @@ -0,0 +1,44 @@ +extern "C" +{ +#include +#include +#include +#include +#include +#include +} + +#include +#include +#include + +std::unique_ptr mock_rte_mbuf_create(const char * pkt, unsigned int pktlen) +{ + auto mock_mbuf = std::unique_ptr(new struct rte_mbuf); + mock_mbuf->buf_addr = (void *)pkt; + mock_mbuf->buf_len = pktlen; + mock_mbuf->data_off = 0; + mock_mbuf->data_len = pktlen; + mock_mbuf->pkt_len = pktlen; + mock_mbuf->nb_segs = 1; + mock_mbuf->next = nullptr; + + return mock_mbuf; +} + +void pkt_parser_test(const uint8_t * data, size_t size, enum complex_layer_type_mask expect_layer_type, + unsigned int nr_expect_results) +{ + struct pkt_parser _pk_handler; + struct pkt_parser_result _pkt_result; + + auto mock_mbuf_ptr = mock_rte_mbuf_create((const char *)data, size); + pkt_parser_init(&_pk_handler, &_pkt_result, expect_layer_type, nr_expect_results); + pkt_parser_exec(&_pk_handler, mock_mbuf_ptr.get()); +} + +extern "C" int LLVMFuzzerTestOneInput(const uint8_t * data, size_t size) +{ + pkt_parser_test(data, size, LAYER_TYPE_ALL, 8); + return 0; +} \ No newline at end of file diff --git a/test/fuzzing/seeds/10.23.160.163_to_129.226.103.217_gtp_u_in_vxlan b/test/fuzzing/seeds/10.23.160.163_to_129.226.103.217_gtp_u_in_vxlan new file mode 100644 index 0000000..54b6081 Binary files /dev/null and b/test/fuzzing/seeds/10.23.160.163_to_129.226.103.217_gtp_u_in_vxlan differ diff --git a/test/fuzzing/seeds/10.33.60.116_to_217.76.77.34_GTP_DNS b/test/fuzzing/seeds/10.33.60.116_to_217.76.77.34_GTP_DNS new file mode 100644 index 0000000..9fa74ff Binary files /dev/null and b/test/fuzzing/seeds/10.33.60.116_to_217.76.77.34_GTP_DNS differ diff --git a/test/fuzzing/seeds/100_95_37_122_to_149_3_200_32_gtpv1_u b/test/fuzzing/seeds/100_95_37_122_to_149_3_200_32_gtpv1_u new file mode 100644 index 0000000..47448dd Binary files /dev/null and b/test/fuzzing/seeds/100_95_37_122_to_149_3_200_32_gtpv1_u differ diff --git a/test/fuzzing/seeds/178.89.4.221_to_31.13.70.49_asym_mpls_ipv4 b/test/fuzzing/seeds/178.89.4.221_to_31.13.70.49_asym_mpls_ipv4 new file mode 100644 index 0000000..a57e978 Binary files /dev/null and b/test/fuzzing/seeds/178.89.4.221_to_31.13.70.49_asym_mpls_ipv4 differ diff --git a/test/fuzzing/seeds/178.89.4.221_to_31.13.70.49_mpls_ipv4 b/test/fuzzing/seeds/178.89.4.221_to_31.13.70.49_mpls_ipv4 new file mode 100644 index 0000000..4f8d2d6 Binary files /dev/null and b/test/fuzzing/seeds/178.89.4.221_to_31.13.70.49_mpls_ipv4 differ diff --git a/test/fuzzing/seeds/178_89_4_219_to_117_122_217_89_ipv4 b/test/fuzzing/seeds/178_89_4_219_to_117_122_217_89_ipv4 new file mode 100644 index 0000000..1e6e60a Binary files /dev/null and b/test/fuzzing/seeds/178_89_4_219_to_117_122_217_89_ipv4 differ diff --git a/test/fuzzing/seeds/178_89_4_219_to_117_122_217_89_mpls_vxlan_inner b/test/fuzzing/seeds/178_89_4_219_to_117_122_217_89_mpls_vxlan_inner new file mode 100644 index 0000000..fb32228 Binary files /dev/null and b/test/fuzzing/seeds/178_89_4_219_to_117_122_217_89_mpls_vxlan_inner differ diff --git a/test/fuzzing/seeds/81.211.157.203_to_10.160.72.52_mpls_ipv4_UDP b/test/fuzzing/seeds/81.211.157.203_to_10.160.72.52_mpls_ipv4_UDP new file mode 100644 index 0000000..c57c758 Binary files /dev/null and b/test/fuzzing/seeds/81.211.157.203_to_10.160.72.52_mpls_ipv4_UDP differ diff --git a/test/health_check_test.py b/test/health_check_test.py deleted file mode 100644 index 71a48d9..0000000 --- a/test/health_check_test.py +++ /dev/null @@ -1,119 +0,0 @@ -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 - -base_conf = """ -[device] -device=veth0 -sz_tunnel=8192 -sz_buffer=0 - -[device:veth0] -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 - -[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 - -# health check -[health_check:0] -name=veth0_health_check -device=veth0 -method=private -multiplier=20 -interval=10 - -[service_lb] -sid_start=1000 -sid_end=2000 - -# load balance -[load_balance:0] -mode=balance -devices=veth0,normal -health_check_sessions=veth0_health_check - -""" - - -@group("health_check_base_test") -class HealthCheckBaseTest(BaseTest): - def setUp(self): - self.dataplane = ptf.dataplane_instance - - def __init__(self): - BaseTest.__init__(self) - - def runTest(self): - try: - # Init & Start mrzcpd - mrzcpd = Mrzcpd(base_conf, "") - mrzcpd.start() - - (_, _, rcv_pkt, _) = dp_poll( - self, device_number=0, port_number=0, timeout=20 - ) - - verify_health_check_pkt = mask.Mask( - simple_eth_packet(eth_type=0xaaaa, pktlen=22)) - verify_health_check_pkt.set_do_not_care(0, 12*8) - verify_health_check_pkt.set_do_not_care(14*8, 8*8) - - send_packet(self, 0, rcv_pkt) - verify_packet(self, verify_health_check_pkt, 0) - - finally: - mrzcpd.stop() diff --git a/test/load_balance_test.py b/test/load_balance_test.py deleted file mode 100644 index f762214..0000000 --- a/test/load_balance_test.py +++ /dev/null @@ -1,271 +0,0 @@ -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 - -start_conf = """ -[device] -device=veth0,veth1,veth2,veth3,veth4 -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 - -[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 - -[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 - -# vwire -[vwire:0] -interface_int=veth3 -interface_ext=veth4 - -[service_lb] -sid_start=1000 -sid_end=2000 - -# load balance -[load_balance:0] -mode=balance -devices=veth0,normal,veth1,normal,veth2,normal - -""" - -dynamic_conf = """ -[classifier_rule:0] -rule_id=1 -ruleset_type=classifier -action=nf_steering -priority=1 -category=0 -sid=1000 -vwire_id=0 - -""" -""" - +-------+ +-------+ +------------+ - | Vwire | | LB | | PTF | - +-------+ +-------+ 100 +------------+ - | veth3 | | veth0 | ----> | veth0-ptf0 | - +-------+ 300 +-------+ 100 +------------+ - | veth4 | ----> | veth1 | ----> | veth1-ptf1 | - +-------+ +-------+ 100 +------------+ - | veth2 | ----> | veth2-ptf2 | - +-------+ +------------+ -""" - - -@group("lb_base_test") -class TestForBase(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,dynamic_conf) - mrzcpd.start() - - # Create packet list - send_pkt_list = PacketList() - - # Create send packet - for port in range(0, 300): - pkt = simple_tcp_packet(ip_src=generate_random_ipv4(), ip_dst=generate_random_ipv4( - ), tcp_sport=generate_random_tcp_port(), tcp_dport=generate_random_tcp_port()) - send_pkt_list.append(pkt) - - # Send packet - for pkt in send_pkt_list: - send_packet(self, 4, pkt) - - # Create verify packet - tcp_pkt = simple_tcp_packet() - verify_pkt = mask.Mask(tcp_pkt) - verify_pkt.set_do_not_care(0, len(tcp_pkt) * 8) - - # Wait for a while to ensure enough packets arrive - time.sleep(3) - - # Get packet count for each port - packet_counts = [] - for port in range(0, 3): - packet_count = get_port_packet_count(self, (0, port)) - print("port {} packet count: {}".format(port, packet_count)) - packet_counts.append(packet_count) - - # Calculate average packet count - average_packet_count = sum(packet_counts) / len(packet_counts) - - # Set tolerance - tolerance = 0.15 * average_packet_count - - # Check if packet count is abnormal - for port in range(0, 3): - if abs(packet_counts[port] - average_packet_count) > tolerance: - self.fail("Port %d has an abnormal packet count: %d (average is %d)" % ( - port, packet_counts[port], average_packet_count)) - - finally: - mrzcpd.stop() - - -""" - +-------+ +--------------+ +------------+ - | Vwire | | LB | | PTF | - +-------+ +--------------+ 150 +------------+ - | veth3 | | veth0 | ----> | veth0-ptf0 | - +-------+ 300 +--------------+ 150 +------------+ - | veth4 | ----> | veth1 | ----> | veth1-ptf1 | - +-------+ +--------------+ 0 +------------+ - | veth2 (down) | ----> | veth2-ptf2 | - +--------------+ +------------+ -""" - - -# The test current is invalid,because 'ifconfig veth2 down' can't affect the mrzcpd link status. -@group("lb_one_dev_down_test") -class TestForOneDevDown(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,dynamic_conf) - mrzcpd.start() - - # Set veth2 down - os.system("ifconfig veth2 down") - - # Create packet list - send_pkt_list = PacketList() - - # Create send packet - for port in range(0, 300): - pkt = simple_tcp_packet(ip_src=generate_random_ipv4(), ip_dst=generate_random_ipv4( - ), tcp_sport=generate_random_tcp_port(), tcp_dport=generate_random_tcp_port()) - send_pkt_list.append(pkt) - - # Send packet - for pkt in send_pkt_list: - send_packet(self, 4, pkt) - - # Create verify packet - tcp_pkt = simple_tcp_packet() - verify_pkt = mask.Mask(tcp_pkt) - verify_pkt.set_do_not_care(0, len(tcp_pkt) * 8) - - # Wait for a while to ensure enough packets arrive - time.sleep(3) - - # Get packet count for each port - packet_counts = [] - for port in range(0, 2): - packet_count = get_port_packet_count(self, (0, port)) - print("port {} packet count: {}".format(port, packet_count)) - packet_counts.append(packet_count) - - # Calculate average packet count - average_packet_count = sum(packet_counts) / len(packet_counts) - - # Set tolerance - tolerance = 0.15 * average_packet_count - - # Check veth2 rx packet count - if get_port_packet_count(self, (0, 2)) != 0: - self.fail("veth2 is down, but rx packet count is not 0") - - # Check if packet count is abnormal - for port in range(0, 2): - if abs(packet_counts[port] - average_packet_count) > tolerance: - self.fail("Port %d has an abnormal packet count: %d (average is %d)" % ( - port, packet_counts[port], average_packet_count)) - - finally: - # Set veth2 up - os.system("ifconfig veth2 up") - mrzcpd.stop() diff --git a/test/mrzcpd.py b/test/mrzcpd.py deleted file mode 100644 index 90c216e..0000000 --- a/test/mrzcpd.py +++ /dev/null @@ -1,53 +0,0 @@ -import ptf -import time -import os -import signal -import subprocess -import shutil - -mrzcpd_run_dir = "/var/run/mrzcpd" - - -class Mrzcpd: - def __init__(self, conf_start,conf_dynamic): - self.mrzcpd_path = ptf.testutils.test_param_get( - "source_dir") + "/build/service/mrzcpd" - - self.conf_start = str(conf_start) - self.conf_path_start = ptf.testutils.test_param_get( - "source_dir") + "/test/mrglobal.conf" - - self.conf_dynamic = str(conf_dynamic) - self.conf_path_dynamic = ptf.testutils.test_param_get( - "source_dir") + "/test/mrglobal.dynamic.conf" - - self.file_start = open(self.conf_path_start, 'w') - self.file_start.write(self.conf_start) - self.file_start.close() - - self.file_dynamic = open(self.conf_path_dynamic, 'w') - self.file_dynamic.write(self.conf_dynamic) - self.file_dynamic.close() - - def start(self): - # Create run dir - if os.path.exists(mrzcpd_run_dir): - shutil.rmtree(mrzcpd_run_dir) - os.makedirs(mrzcpd_run_dir) - - # Start mrzcpd - self.mrzcpd_process = subprocess.Popen( - [self.mrzcpd_path, "-c", self.conf_path_start, "-s", self.conf_path_dynamic], stdout=subprocess.PIPE) - - # Check mrzcpd status - start_timeout = 10 - while start_timeout > 0: - if os.path.exists(mrzcpd_run_dir + "/mrmonit.daemon"): - break - else: - time.sleep(1) - start_timeout = start_timeout - 1 - - def stop(self): - self.mrzcpd_process.terminate() - self.mrzcpd_process.wait() diff --git a/test/msgpack_test.py b/test/msgpack_test.py deleted file mode 100644 index a92b6ff..0000000 --- a/test/msgpack_test.py +++ /dev/null @@ -1,448 +0,0 @@ -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 - -[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] -mode=balance -devices=veth2,normal -""" - -dynamic_conf_serialize = """ - -[classifier_rule:0] -rule_id=1 -ruleset_type=classifier -action=nf_steering -priority=1 -category=0 -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 - -[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] -mode=balance -devices=veth2,normal - -""" - -dynamic_conf_deserialize = """ -[classifier_rule:0] -rule_id=1 -ruleset_type=classifier -action=nf_steering -priority=1 -category=0 -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 - -[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] -mode=balance -devices=veth-msgpack-tx,normal - -""" -dynamic_conf_serialize_and_deserialize = """ -[classifier_rule:0] -rule_id=1 -ruleset_type=classifier -action=nf_steering -priority=1 -category=0 -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() - diff --git a/test/post_install_test/package_content_test.py b/test/post_install_test/package_content_test.py new file mode 100644 index 0000000..3e0623e --- /dev/null +++ b/test/post_install_test/package_content_test.py @@ -0,0 +1,168 @@ +import os +import subprocess +import sys +# import magic + +class tools: + def __init__(self): + pass + + def is_package_installed(self, package_name): + query_package_cmd = "rpm -qa | grep " + package_name + # capture_output requires Python version 3.7 or higher + # result = subprocess.run(query_package_cmd, shell=True, capture_output=True, text=True) + result = subprocess.run(query_package_cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + if result.returncode != 0: + print(f"query {package_name} fail. error: {result.stderr.decode('utf-8')}") + return False + print(result.stdout.decode('utf-8')) + return package_name in result.stdout.decode('utf-8') + + def check_path_exists(self, path): + # Existing path returns True. + # Returns False for broken symbolic links. + if os.path.exists(path): + if os.path.islink(path): + real_path = os.path.realpath(path) + if os.path.exists(real_path): + print(f"The final path for {path} is {real_path}") + else: + print(f"{real_path} not exists") + return False + else: + print(f"{path} exists") + return True + else: + print(f"{path} not exists") + return False + + # def is_elf_file(self, file_path): + # mime = magic.Magic() + # file_type = mime.from_file(file_path) + # print(f"{file_path} file type: {file_type}") + # return "ELF" in file_type + + def check_symbol_exists(self, binary_name): + check_symbol_cmd = "eu-unstrip -n -e " + binary_name + result = subprocess.run(check_symbol_cmd, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + if result.returncode != 0: + print(f"error: {result.stderr.decode('utf-8')}") + return False + symbol_info = result.stdout.decode('utf-8').split() + if len(symbol_info) < 4: + return False + print(f"{binary_name} symbol path is: {symbol_info[3]}") + return self.check_path_exists(symbol_info[3]) + +class package_content_test: + def __init__(self): + self.install_path = "/opt/tsg/mrzcpd" + + self.package_conf_files = [ + "/etc/ld.so.conf.d/mrzcpd.conf", + "/etc/profile.d/mrzcpd.sh", + "/etc/sysconfig/mrzcpd" + ] + + self.package_etc_files = [ + self.install_path + "/etc", + self.install_path + "/etc/mrapm.conf", + self.install_path + "/etc/mrglobal.conf", + self.install_path + "/etc/mrtunnat.conf" + ] + + self.package_bin_files = [ + self.install_path + "/bin", + self.install_path + "/bin/devbind.py", + self.install_path + "/bin/dpdk-devbind.py", + self.install_path + "/bin/dpdk-hugepages.py", + self.install_path + "/bin/monit_device", + self.install_path + "/bin/monit_obp", + self.install_path + "/bin/monit_stream", + self.install_path + "/bin/mrmarch", + self.install_path + "/bin/mrpdump", + self.install_path + "/bin/mrtools-pinfo", + self.install_path + "/bin/mrzcpd" + ] + + self.package_include_files = [ + self.install_path + "/include", + self.install_path + "/include/libpag.h", + self.install_path + "/include/marsio.h", + self.install_path + "/include/mrtunnat.h", + ] + + self.package_lib_files = [ + self.install_path + "/lib", + self.install_path + "/lib/libmarsio.so", + self.install_path + "/lib/libpag.so", + self.install_path + "/lib/librte_common_mlx5_glue.so", + # self.install_path + "/lib/librte_net_mlx4_glue.so", + self.install_path + "/lib/pkgconfig/mrzcpd.pc", + ] + + self.package_altdir_files = [ + self.install_path + "/altdir/devbind.py", + self.install_path + "/altdir/dpdk-devbind.py", + self.install_path + "/altdir/dpdk-hugepages.py", + self.install_path + "/altdir/include", + self.install_path + "/altdir/lib", + self.install_path + "/altdir/monit_device", + self.install_path + "/altdir/monit_obp", + self.install_path + "/altdir/monit_stream", + self.install_path + "/altdir/mrapm_device.service", + self.install_path + "/altdir/mrapm_obp.service", + self.install_path + "/altdir/mrapm_stream.service", + self.install_path + "/altdir/mrmarch", + self.install_path + "/altdir/mrpdump", + self.install_path + "/altdir/mrtools-pinfo", + self.install_path + "/altdir/mrtunnat.service", + self.install_path + "/altdir/mrzcpd", + self.install_path + "/altdir/mrzcpd.service", + self.install_path + "/altdir/mrzcpd_hugepages_setup.service", + self.install_path + "/altdir/mrzcpd_hwdb_setup.service" + ] + + self.system_service_files = [ + "/usr/lib/systemd/system/mrapm_device.service", + "/usr/lib/systemd/system/mrapm_stream.service", + "/usr/lib/systemd/system/mrapm_obp.service", + "/usr/lib/systemd/system/mrtunnat.service", + "/usr/lib/systemd/system/mrzcpd_hugepages_setup.service", + "/usr/lib/systemd/system/mrzcpd_hwdb_setup.service", + "/usr/lib/systemd/system/mrzcpd.service" + ] + + self.package_files = (self.package_conf_files + self.package_etc_files + self.package_bin_files + + self.package_include_files + self.package_lib_files + self.package_altdir_files + + self.system_service_files) + + # monit_device no symbol + # self.binary_files = self.package_bin_files + self.package_lib_files + + self.symbol_check_files = [ + self.install_path + "/bin/mrzcpd", + self.install_path + "/lib/libmarsio.so", + ] + + self.tools = tools() + + def start(self): + if self.tools.is_package_installed("mrzcpd") == False: + return False + for file in self.package_files: + if self.tools.check_path_exists(file) == False: + return False + for file in self.symbol_check_files: + real_path = os.path.realpath(file) + # if self.tools.is_elf_file(real_path) == False: + # continue + if self.tools.check_symbol_exists(real_path) == False: + return False + return True + +if __name__ == "__main__": + test = package_content_test() + if test.start() == False: + sys.exit(1) + diff --git a/test/ptf_test/CMakeLists.txt b/test/ptf_test/CMakeLists.txt new file mode 100644 index 0000000..3a1890e --- /dev/null +++ b/test/ptf_test/CMakeLists.txt @@ -0,0 +1,119 @@ +include_directories(${CMAKE_SOURCE_DIR}/include) +include_directories(${CMAKE_SOURCE_DIR}/include/extern) +include_directories(${CMAKE_SOURCE_DIR}/include/internal) +include_directories(${CMAKE_SOURCE_DIR}) + +# Create veth +execute_process( + COMMAND /bin/bash ${CMAKE_CURRENT_SOURCE_DIR}/create_veth.sh create 24 + RESULT_VARIABLE VETH_RESULT + OUTPUT_VARIABLE VETH_OUTPUT + ERROR_VARIABLE VETH_ERROR + OUTPUT_STRIP_TRAILING_WHITESPACE +) + +# Check veth create +if(VETH_RESULT) +message(FATAL_ERROR "${CMAKE_CURRENT_SOURCE_DIR}/create_veth.sh create 24") + message(FATAL_ERROR "Failed to create veth: ${VETH_ERROR}") +endif() + +# Create veth for msgpack +execute_process( + COMMAND /bin/bash ${CMAKE_CURRENT_SOURCE_DIR}/create_veth.sh create msgpack + RESULT_VARIABLE VETH_RESULT + OUTPUT_VARIABLE VETH_OUTPUT + ERROR_VARIABLE VETH_ERROR + OUTPUT_STRIP_TRAILING_WHITESPACE +) + +# Check veth create for msgpack +if(VETH_RESULT) +message(FATAL_ERROR "${CMAKE_CURRENT_SOURCE_DIR}/create_veth.sh create msgpack") + message(FATAL_ERROR "Failed to create veth: ${VETH_ERROR}") +endif() + +# Script for generating "--interface" +# for i in range(0, 24): +# print(f"--interface {i}@veth{i}-ptf{i}", end=" ") + +# Add vwire test +add_test( + NAME vwire_test + COMMAND /usr/local/bin/ptf --test-dir ${CMAKE_CURRENT_SOURCE_DIR} + --interface 0@veth0-ptf0 --interface 1@veth1-ptf1 --interface 2@veth2-ptf2 --interface 3@veth3-ptf3 --interface 4@veth4-ptf4 --interface 5@veth5-ptf5 --interface 6@veth6-ptf6 --interface 7@veth7-ptf7 --interface 8@veth8-ptf8 --interface 9@veth9-ptf9 --interface 10@veth10-ptf10 --interface 11@veth11-ptf11 --interface 12@veth12-ptf12 --interface 13@veth13-ptf13 --interface 14@veth14-ptf14 --interface 15@veth15-ptf15 --interface 16@veth16-ptf16 --interface 17@veth17-ptf17 --interface 18@veth18-ptf18 --interface 19@veth19-ptf19 --interface 20@veth20-ptf20 --interface 21@veth21-ptf21 --interface 22@veth22-ptf22 --interface 23@veth23-ptf23 + vwire_test id_non_contiguous_test --test-params "source_dir='${CMAKE_BINARY_DIR}'" +) + +# Add bfd test +add_test( + NAME bfd_test + COMMAND /usr/local/bin/ptf --test-dir ${CMAKE_CURRENT_SOURCE_DIR} + --interface 0@veth0-ptf0 + bfd_test_for_etherfabric bfd_test_for_bfdd --test-params "source_dir='${CMAKE_BINARY_DIR}'" +) + +# Add bridge test +add_test( + NAME bridge_test + COMMAND /usr/local/bin/ptf --test-dir ${CMAKE_CURRENT_SOURCE_DIR} + --interface 0@veth0-ptf0 --interface 1@veth1-ptf1 --interface 2@veth2-ptf2 --interface 3@veth3-ptf3 + bridge_test_unicast bridge_test_broadcast bridge_test_master_device --test-params "source_dir='${CMAKE_BINARY_DIR}'" +) + + +# Add classifier test +add_test( + NAME classifier_test + COMMAND /usr/local/bin/ptf --test-dir ${CMAKE_CURRENT_SOURCE_DIR} + --interface 0@veth0-ptf0 --interface 1@veth1-ptf1 --interface 2@veth2-ptf2 --interface 3@veth3-ptf3 --interface 4@veth4-ptf4 --interface 5@veth5-ptf5 + classifier_test_base full_field_match_test --test-params "source_dir='${CMAKE_BINARY_DIR}'" +) + +# Add etherfabric test +add_test( + NAME etherfabric_test + COMMAND /usr/local/bin/ptf --test-dir ${CMAKE_CURRENT_SOURCE_DIR} + --interface 0@veth0-ptf0 + virtual_wire_mode tap_mode ef_route_ctx_test ef_adapter_id_non_contiguous_test --test-params "source_dir='${CMAKE_BINARY_DIR}'" +) + +# Add health_check test +add_test( + NAME health_check + COMMAND /usr/local/bin/ptf --test-dir ${CMAKE_CURRENT_SOURCE_DIR} + --interface 0@veth0-ptf0 + health_check_base_test --test-params "source_dir='${CMAKE_BINARY_DIR}'" +) + +# Add load_balance test +add_test( + NAME load_balance + COMMAND /usr/local/bin/ptf --test-dir ${CMAKE_CURRENT_SOURCE_DIR} + --interface 0@veth0-ptf0 --interface 1@veth1-ptf1 --interface 2@veth2-ptf2 --interface 3@veth3-ptf3 --interface 4@veth4-ptf4 + lb_base_test --test-params "source_dir='${CMAKE_BINARY_DIR}'" +) + +# Add msgpack test +add_test( + NAME msgpack_test + COMMAND /usr/local/bin/ptf --test-dir ${CMAKE_CURRENT_SOURCE_DIR} + --interface 0@veth0-ptf0 --interface 1@veth1-ptf1 --interface 2@veth2-ptf2 + msgpack_serialize_test msgpack_deserialize_test msgpack_serialize_and_deserialize_test --test-params "source_dir='${CMAKE_BINARY_DIR}'" +) + +# Add endpoint dev test +add_test( + NAME endpoint_dev_test + COMMAND /usr/local/bin/ptf --test-dir ${CMAKE_CURRENT_SOURCE_DIR} + --interface 0@veth0-ptf0 + icmp_reply_test --test-params "source_dir='${CMAKE_BINARY_DIR}'" +) + +# Add tera test +add_test( + NAME tera_test + COMMAND /usr/local/bin/ptf --test-dir ${CMAKE_CURRENT_SOURCE_DIR} + --interface 0@veth0-ptf0 --interface 1@veth1-ptf1 + tera_base_test tera_mpack_test tera_nf_test tera_route_ctx_test tera_adapter_id_non_contiguous_test --test-params "source_dir='${CMAKE_BINARY_DIR}'" +) diff --git a/test/ptf_test/bfd_test.py b/test/ptf_test/bfd_test.py new file mode 100644 index 0000000..06ec56f --- /dev/null +++ b/test/ptf_test/bfd_test.py @@ -0,0 +1,205 @@ +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 + +bfd_conf = """ +[device] +device = veth0 +sz_tunnel = 8192 +sz_buffer = 0 + +[device:veth0] +in_addr=10.254.60.1 +in_mask=255.255.255.0 +gateway=10.10.1.40 +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 + +[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 + +""" + + +@group("bfd_test_for_etherfabric") +class TestForEtherfabric(BaseTest): + def setUp(self): + self.dataplane = ptf.dataplane_instance + + def __init__(self): + BaseTest.__init__(self) + + def runTest(self): + try: + # Init & Start mrzcpd + mrzcpd = Mrzcpd(bfd_conf,"") + mrzcpd.start() + + # Create packet + send_bfd_pkt = simple_bfd_packet(eth_dst="10:70:fd:03:c0:bd", eth_src="0a:0a:0a:0a:01:28", + ip_src="10.10.1.40", ip_dst="10.254.60.1", + sta=0, my_discriminator=1111, your_discriminator=0) + + verify_bfd_pkt = mask.Mask( + simple_bfd_packet(eth_dst="0a:0a:0a:0a:01:28", eth_src="10:70:fd:03:c0:bd", + ip_src="10.254.60.1", ip_dst="10.10.1.40", sta=3, your_discriminator=1111)) + + verify_bfd_pkt.set_do_not_care_scapy(UDP, "chksum") + verify_bfd_pkt.set_do_not_care_scapy(BFD, "flags") + verify_bfd_pkt.set_do_not_care_scapy(BFD, "my_discriminator") + + send_packet(self, 0, send_bfd_pkt) + verify_packets(self, verify_bfd_pkt, [0]) + finally: + mrzcpd.stop() + + +""" + +--------------------------+ + | PTF | + +------+------------+------+ + | Send | | Recv | + +------+ +------+ + | Down | <--> | Init | + +------+ +------+ + | Init | <--> | Up | + +------+ +------+ + | Up | <--> | Up | + +------+ +------+ +""" + + +@group("bfd_test_for_bfdd") +class TestForBfdd(BaseTest): + def setUp(self): + self.dataplane = ptf.dataplane_instance + + def __init__(self): + BaseTest.__init__(self) + + def runTest(self): + try: + # Init & Start mrzcpd + mrzcpd = Mrzcpd(bfd_conf,"") + mrzcpd.start() + + """ + +------+ +------+ + | Down | <--> | Init | + +------+ +------+ + """ + # Create bfd down packet + bfd_pkt_down = simple_bfd_packet(eth_dst="10:70:fd:03:c0:bd", eth_src="0a:0a:0a:0a:01:28", + ip_src="10.10.1.40", ip_dst="10.254.60.1", + sta=1, my_discriminator=1111, your_discriminator=0) + + verify_bfd_pkt_init = mask.Mask( + simple_bfd_packet(eth_dst="0a:0a:0a:0a:01:28", eth_src="10:70:fd:03:c0:bd", + ip_src="10.254.60.1", ip_dst="10.10.1.40", sta=2, your_discriminator=1111)) + + verify_bfd_pkt_init.set_do_not_care_scapy(UDP, "chksum") + verify_bfd_pkt_init.set_do_not_care_scapy(BFD, "flags") + verify_bfd_pkt_init.set_do_not_care_scapy(BFD, "my_discriminator") + + send_packet(self, 0, bfd_pkt_down) + verify_packets(self, verify_bfd_pkt_init, [0]) + + """ + +------+ +------+ + | Init | <--> | Up | + +------+ +------+ + """ + # Create bfd up packet + bfd_pkt_init = simple_bfd_packet(eth_dst="10:70:fd:03:c0:bd", eth_src="0a:0a:0a:0a:01:28", + ip_src="10.10.1.40", ip_dst="10.254.60.1", + sta=2, my_discriminator=1111, your_discriminator=0) + + verify_bfd_pkt_up = mask.Mask( + simple_bfd_packet(eth_dst="0a:0a:0a:0a:01:28", eth_src="10:70:fd:03:c0:bd", + ip_src="10.254.60.1", ip_dst="10.10.1.40", sta=3, your_discriminator=1111)) + + verify_bfd_pkt_up.set_do_not_care_scapy(UDP, "chksum") + verify_bfd_pkt_up.set_do_not_care_scapy(BFD, "flags") + verify_bfd_pkt_up.set_do_not_care_scapy(BFD, "my_discriminator") + + send_packet(self, 0, bfd_pkt_init) + verify_packets(self, verify_bfd_pkt_up, [0]) + + """ + +------+ +------+ + | Up | <--> | Up | + +------+ +------+ + """ + # Create bfd up packet + bfd_pkt_up = simple_bfd_packet(eth_dst="10:70:fd:03:c0:bd", eth_src="0a:0a:0a:0a:01:28", + ip_src="10.10.1.40", ip_dst="10.254.60.1", + sta=3, my_discriminator=1111, your_discriminator=0) + verify_bfd_pkt_up = mask.Mask( + simple_bfd_packet(eth_dst="0a:0a:0a:0a:01:28", eth_src="10:70:fd:03:c0:bd", + ip_src="10.254.60.1", ip_dst="10.10.1.40", sta=3, your_discriminator=1111)) + + verify_bfd_pkt_up.set_do_not_care_scapy(UDP, "chksum") + verify_bfd_pkt_up.set_do_not_care_scapy(BFD, "flags") + verify_bfd_pkt_up.set_do_not_care_scapy(BFD, "my_discriminator") + + send_packet(self, 0, bfd_pkt_up) + verify_packets(self, verify_bfd_pkt_up, [0]) + finally: + mrzcpd.stop() diff --git a/test/ptf_test/bridge_test.py b/test/ptf_test/bridge_test.py new file mode 100644 index 0000000..bf1dfff --- /dev/null +++ b/test/ptf_test/bridge_test.py @@ -0,0 +1,264 @@ +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 + +[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 + +""" + +""" + +----------------------------------------------------------------------------------------------+ + | 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, "") + 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, "") + 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, "") + 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() diff --git a/test/ptf_test/classifier_test.py b/test/ptf_test/classifier_test.py new file mode 100644 index 0000000..82e525c --- /dev/null +++ b/test/ptf_test/classifier_test.py @@ -0,0 +1,1016 @@ +import ptf +from ptf.base_tests import BaseTest +from ptf.testutils import * +from scapy.all import * +from mrzcpd import Mrzcpd +from common_pkt import * + +start_conf_base = """ +[device] +device=veth0,veth1,veth2,veth3,veth4,veth5 +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 + +[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 + +[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 + +# vwire +[vwire:0] +vwire_id=0 +interface_int=veth4 +interface_ext=veth5 + +[service_lb] +sid_start=1000 +sid_end=2000 + +# load balance +[load_balance:0] +mode=balance +devices=veth0,normal + +[load_balance:1] +mode=balance +devices=veth1,normal + +[load_balance:2] +mode=balance +devices=veth2,normal + +[load_balance:3] +mode=balance +devices=veth3,normal + +""" + +dynamic_conf_base = """ + +[classifier_rule:0] +rule_id=1 +ruleset_type=classifier +dst_ip_addr_v4=172.17.2.100 +dst_ip_mask_v4=32 +action=nf_steering +priority=1 +category=0 +sid=1000 +vwire_id=0 + +[classifier_rule:1] +rule_id=2 +ruleset_type=classifier +dst_ip_addr_v4=172.17.2.101 +dst_ip_mask_v4=32 +action=nf_steering +priority=1 +category=0 +sid=1001 +vwire_id=0 + +[classifier_rule:2] +rule_id=3 +ruleset_type=classifier +src_ip_addr_v4=172.17.2.102 +src_ip_mask_v4=32 +action=nf_steering +priority=1 +category=0 +sid=1002 +vwire_id=0 + +[classifier_rule:3] +rule_id=4 +ruleset_type=classifier +src_ip_addr_v4=172.17.2.103 +src_ip_mask_v4=32 +action=nf_steering +priority=1 +category=0 +sid=1003 +vwire_id=0 + +[classifier_rule:4] +rule_id=5 +ruleset_type=classifier +dst_ip_addr_v6=2222::4 +dst_ip_mask_v6=128 +action=nf_steering +priority=1 +category=0 +sid=1000 +vwire_id=0 + +[classifier_rule:5] +rule_id=6 +ruleset_type=classifier +dst_ip_addr_v6=2222::5 +dst_ip_mask_v6=128 +action=nf_steering +priority=1 +category=0 +sid=1001 +vwire_id=0 + +[classifier_rule:6] +rule_id=7 +ruleset_type=classifier +src_ip_addr_v6=2222::6 +src_ip_mask_v6=128 +action=nf_steering +priority=1 +category=0 +sid=1002 +vwire_id=0 + +[classifier_rule:7] +rule_id=8 +ruleset_type=classifier +src_ip_addr_v6=2222::7 +src_ip_mask_v6=128 +action=nf_steering +priority=1 +category=0 +sid=1003 +vwire_id=0 +""" +""" + +----------------------+ +----------------------+ + | DstIP=172.17.2.100 | | DstIP=172.17.2.101 | + +----------------------+ +----------------------+ + | | + V V + +-------------------------------------------------+ + | Classifier Table | + +-------------------------------------------------+ + | | + V V + +---------------------+ +---------------------+ + | ClassifierRuleID1 | | ClassifierRuleID2 | + +---------------------+ +---------------------+ + | | + V V + +------------------------------------------------+ + | Forwarding | + +------------------------------------------------+ + | | + V V + +-------------------+ +-------------------+ + | veth0 port | | veth1 port | + +-------------------+ +-------------------+ +""" + + +@group("classifier_test_base") +class BaseForLinearSearch(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_base,dynamic_conf_base) + mrzcpd.start() + + """ + +---------------------------+ +--------------------------------+ +--------------+ + | PTF | | MRZCPD | | PTF | + +---------------------------+ +--------------------------------+ +--------------+ + | Ipv4 DstIP=172.17.2.100 | ---> | RuleID=1, DstIP=172.17.2.100 | ---> | veth0-ptf0 | + +---------------------------+ +--------------------------------+ +--------------+ + | Ipv4 DstIP=172.17.2.101 | ---> | RuleID=2, DstIP=172.17.2.101 | ---> | veth1-ptf0 | + +---------------------------+ +--------------------------------+ +--------------+ + """ + + # Check classifier rule id 1 - 2, check ipv4 dst ip rule. + for i in range(0, 2): + # Create packet for classifier rule + verify_pkt = send_pkt = simple_tcp_packet( + ip_src="172.17.1.100", ip_dst="172.17.2." + str(100 + i)) + send_packet(self, 5, send_pkt) + verify_packets(self, verify_pkt, [i]) + + """ + +---------------------------+ +--------------------------------+ +--------------+ + | PTF | | MRZCPD | | PTF | + +---------------------------+ +--------------------------------+ +--------------+ + | Ipv4 SrcIP=172.17.2.102 | ---> | RuleID=3, SrcIP=172.17.2.102 | ---> | veth2-ptf2 | + +---------------------------+ +--------------------------------+ +--------------+ + | Ipv4 SrcIP=172.17.2.103 | ---> | RuleID=4, SrcIP=172.17.2.103 | ---> | veth3-ptf3 | + +---------------------------+ +--------------------------------+ +--------------+ + """ + + # Check classifier rule id 3 - 4, check ipv4 src ip rule. + for i in range(2, 4): + # Create packet for classifier rule + verify_pkt = send_pkt = simple_tcp_packet( + ip_src="172.17.2." + str(100 + i), ip_dst="172.17.1.100") + + send_packet(self, 5, send_pkt) + verify_packets(self, verify_pkt, [i]) + + """ + +---------------------------+ +--------------------------------+ +--------------+ + | PTF | | MRZCPD | | PTF | + +---------------------------+ +--------------------------------+ +--------------+ + | Ipv6 DstIP= 2222::4 | ---> | RuleID=5, DstIP= 2222::4 | ---> | veth0-ptf0 | + +---------------------------+ +--------------------------------+ +--------------+ + | Ipv6 DstIP= 2222::5 | ---> | RuleID=6, DstIP= 2222::5 | ---> | veth1-ptf1 | + +---------------------------+ +--------------------------------+ +--------------+ + """ + + # Check classifier rule id 5 - 6, check ipv6 dst ip rule. + for i in range(4, 6): + # Create packet for classifier rule + verify_pkt = send_pkt = simple_tcpv6_packet( + ipv6_src="1111::8888", ipv6_dst="2222::" + str(i)) + + send_packet(self, 5, send_pkt) + verify_packets(self, verify_pkt, [i % 4]) + + """ + +---------------------------+ +--------------------------------+ +--------------+ + | PTF | | MRZCPD | | PTF | + +---------------------------+ +--------------------------------+ +--------------+ + | Ipv6 SrcIP= 2222::6 | ---> | RuleID=7, SrcIP= 2222::6 | ---> | veth2-ptf2 | + +---------------------------+ +--------------------------------+ +--------------+ + | Ipv6 SrcIP= 2222::7 | ---> | RuleID=8, SrcIP= 2222::7 | ---> | veth3-ptf3 | + +---------------------------+ +--------------------------------+ +--------------+ + """ + # Check classifier rule id 7 - 8, check ipv6 src ip rule. + for i in range(6, 8): + # Create packet for classifier rule + verify_pkt = send_pkt = simple_tcpv6_packet( + ipv6_src="2222::" + str(i), ipv6_dst="1111::8888") + + send_packet(self, 5, send_pkt) + verify_packets(self, verify_pkt, [i % 4]) + + """ + +---------------------------+ +---------+-----------------+---------+ +--------------+ + | PTF | | Vwire | Classifier | Vwire | | PTF | + +---------------------------+ +---------+-----------------+---------+ +--------------+ + | SrcIP=172.17.3.100 | | veth5 | No Match Rule | veth5 | ---> | veth5-ptf5 | + | DstIP=172.17.1.100 | ---> | veth4 | To Vwire | veth4 | | | + +---------------------------+ +---------+-----------------+---------+ +--------------+ + + """ + + # Check miss packet + verify_pkt = send_pkt = simple_tcp_packet( + ip_src="172.17.3.100", ip_dst="172.17.1.100") + + send_packet(self, 4, send_pkt) + verify_packets(self, verify_pkt, [5]) + + finally: + mrzcpd.stop() + + +@group("classifier_test_base") +class TestForTreeSearch(BaseTest): + def setUp(self): + self.dataplane = ptf.dataplane_instance + + def __init__(self): + BaseTest.__init__(self) + + def runTest(self): + try: + # Init & Start mrzcpd + global dynamic_conf_base + for i in range(8,128): + dynamic_conf_base += "[classifier_rule:" + str(i) + "]\n" + dynamic_conf_base += "ruleset_type=classifier\n" + dynamic_conf_base += "rule_id=" + str(i+1) + "\n" + dynamic_conf_base += "dst_ip_addr_v4=172.19.2." + str(i) + "\n" + dynamic_conf_base += "dst_ip_mask_v4=32\n" + dynamic_conf_base += "action=nf_steering\n" + dynamic_conf_base += "priority=1\n" + dynamic_conf_base += "category=0\n" + dynamic_conf_base += "sid=1000\n" + dynamic_conf_base += "vwire_id=0\n\n" + + #print(base_conf) + mrzcpd = Mrzcpd(start_conf_base,dynamic_conf_base) + mrzcpd.start() + + """ + +---------------------------+ +--------------------------------+ +--------------+ + | PTF | | MRZCPD | | PTF | + +---------------------------+ +--------------------------------+ +--------------+ + | Ipv4 DstIP=172.17.2.100 | ---> | RuleID=1, DstIP=172.17.2.100 | ---> | veth0-ptf0 | + +---------------------------+ +--------------------------------+ +--------------+ + | Ipv4 DstIP=172.17.2.101 | ---> | RuleID=2, DstIP=172.17.2.101 | ---> | veth1-ptf0 | + +---------------------------+ +--------------------------------+ +--------------+ + """ + + # Check classifier rule id 1 - 2, check ipv4 dst ip rule. + for i in range(0, 2): + # Create packet for classifier rule + verify_pkt = send_pkt = simple_tcp_packet( + ip_src="172.17.1.100", ip_dst="172.17.2." + str(100 + i)) + send_packet(self, 5, send_pkt) + verify_packets(self, verify_pkt, [i]) + + """ + +---------------------------+ +--------------------------------+ +--------------+ + | PTF | | MRZCPD | | PTF | + +---------------------------+ +--------------------------------+ +--------------+ + | Ipv4 SrcIP=172.17.2.102 | ---> | RuleID=3, SrcIP=172.17.2.102 | ---> | veth2-ptf2 | + +---------------------------+ +--------------------------------+ +--------------+ + | Ipv4 SrcIP=172.17.2.103 | ---> | RuleID=4, SrcIP=172.17.2.103 | ---> | veth3-ptf3 | + +---------------------------+ +--------------------------------+ +--------------+ + """ + + # Check classifier rule id 3 - 4, check ipv4 src ip rule. + for i in range(2, 4): + # Create packet for classifier rule + verify_pkt = send_pkt = simple_tcp_packet( + ip_src="172.17.2." + str(100 + i), ip_dst="172.17.1.100") + + send_packet(self, 5, send_pkt) + verify_packets(self, verify_pkt, [i]) + + """ + +---------------------------+ +--------------------------------+ +--------------+ + | PTF | | MRZCPD | | PTF | + +---------------------------+ +--------------------------------+ +--------------+ + | Ipv6 DstIP= 2222::4 | ---> | RuleID=5, DstIP= 2222::4 | ---> | veth0-ptf0 | + +---------------------------+ +--------------------------------+ +--------------+ + | Ipv6 DstIP= 2222::5 | ---> | RuleID=6, DstIP= 2222::5 | ---> | veth1-ptf1 | + +---------------------------+ +--------------------------------+ +--------------+ + """ + + # Check classifier rule id 5 - 6, check ipv6 dst ip rule. + for i in range(4, 6): + # Create packet for classifier rule + verify_pkt = send_pkt = simple_tcpv6_packet( + ipv6_src="1111::8888", ipv6_dst="2222::" + str(i)) + + send_packet(self, 5, send_pkt) + verify_packets(self, verify_pkt, [i % 4]) + + """ + +---------------------------+ +--------------------------------+ +--------------+ + | PTF | | MRZCPD | | PTF | + +---------------------------+ +--------------------------------+ +--------------+ + | Ipv6 SrcIP= 2222::6 | ---> | RuleID=7, SrcIP= 2222::6 | ---> | veth2-ptf2 | + +---------------------------+ +--------------------------------+ +--------------+ + | Ipv6 SrcIP= 2222::7 | ---> | RuleID=8, SrcIP= 2222::7 | ---> | veth3-ptf3 | + +---------------------------+ +--------------------------------+ +--------------+ + """ + # Check classifier rule id 7 - 8, check ipv6 src ip rule. + for i in range(6, 8): + # Create packet for classifier rule + verify_pkt = send_pkt = simple_tcpv6_packet( + ipv6_src="2222::" + str(i), ipv6_dst="1111::8888") + + send_packet(self, 5, send_pkt) + verify_packets(self, verify_pkt, [i % 4]) + + """ + +---------------------------+ +---------+-----------------+---------+ +--------------+ + | PTF | | Vwire | Classifier | Vwire | | PTF | + +---------------------------+ +---------+-----------------+---------+ +--------------+ + | SrcIP=172.17.3.100 | | veth5 | No Match Rule | veth5 | ---> | veth5-ptf5 | + | DstIP=172.17.1.100 | ---> | veth4 | To Vwire | veth4 | | | + +---------------------------+ +---------+-----------------+---------+ +--------------+ + + """ + + # Check miss packet + verify_pkt = send_pkt = simple_tcp_packet( + ip_src="172.17.3.100", ip_dst="172.17.1.100") + + send_packet(self, 4, send_pkt) + verify_packets(self, verify_pkt, [5]) + + finally: + mrzcpd.stop() + +category_conf = """Current not support priority""" + +start_conf_vwire = """ +[device] +device=veth0,veth1,veth2,veth3 +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 + +[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 + +[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 + +# vwire +[vwire:0] +vwire_id=0 +interface_int=veth2 +interface_ext=veth3 + +[service_lb] +sid_start=1000 +sid_end=2000 + +# load balance +[load_balance:0] +mode=balance +devices=veth0,normal + +[load_balance:1] +mode=balance +devices=veth1,normal + +""" + +dynamic_conf_full_field_match_for_vwire = """ + +[classifier_rule:0] +rule_id=1 +ruleset_type=classifier +src_ip_addr_v4=172.17.1.100 +src_ip_mask_v4=32 +dst_ip_addr_v4=172.17.2.100 +dst_ip_mask_v4=32 +src_port_range_start=1000 +src_port_range_end=1000 +dst_port_range_start=80 +dst_port_range_end=80 +proto=tcp +priority=1 +sid=1000 +category=0 +vwire_id=0 +action=nf_steering + +[classifier_rule:1] +rule_id=2 +ruleset_type=classifier +src_ip_addr_v6=1111::8888 +src_ip_mask_v6=128 +dst_ip_addr_v6=2222::9999 +dst_ip_mask_v6=128 +src_port_range_start=1000 +src_port_range_end=1000 +dst_port_range_start=80 +dst_port_range_end=80 +proto=udp +priority=1 +sid=1001 +category=0 +vwire_id=0 +action=nf_steering + +""" +""" + +----------------------+ +----------------------+ + | IPv4=172.17.2.100 | | IPv6=2222::9999 | + +----------------------+ +----------------------+ + | | + V V + +-------------------------------------------------+ + | Classifier Table | + +-------------------------------------------------+ + | | + V V + +---------------------+ +---------------------+ + | ClassifierRuleID1 | | ClassifierRuleID2 | + +---------------------+ +---------------------+ + | | + V V + +------------------------------------------------+ + | Forwarding | + +------------------------------------------------+ + | | + V V + +-------------------+ +-------------------+ + | veth0 port | | veth1 port | + +-------------------+ +-------------------+ +""" + + +@ group("full_field_match_test") +class FullFieldLinearMatchForVwireTest(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_vwire,dynamic_conf_full_field_match_for_vwire) + mrzcpd.start() + + # Check IPv4 for miss + send_pkt = simple_tcp_packet( + ip_src="172.17.1.100", ip_dst="172.17.2.100", tcp_sport=1000, tcp_dport=1000) + verify_pkt = simple_tcp_packet( + ip_src="172.17.1.100", ip_dst="172.17.2.100", tcp_sport=1000, tcp_dport=1000) + send_packet(self, 3, send_pkt) + verify_packets(self, verify_pkt, [2]) + + # Check IPv4 for match + send_pkt = simple_tcp_packet( + ip_src="172.17.1.100", ip_dst="172.17.2.100", tcp_sport=1000, tcp_dport=80) + verify_pkt = simple_tcp_packet( + ip_src="172.17.1.100", ip_dst="172.17.2.100", tcp_sport=1000, tcp_dport=80) + send_packet(self, 3, send_pkt) + verify_packets(self, verify_pkt, [0]) + + # Check IPv6 for miss + send_pkt = simple_udpv6_packet( + ipv6_src="1111::8888", ipv6_dst="2222::9999", udp_sport=1000, udp_dport=1000) + verify_pkt = simple_udpv6_packet( + ipv6_src="1111::8888", ipv6_dst="2222::9999", udp_sport=1000, udp_dport=1000) + send_packet(self, 2, send_pkt) + verify_packets(self, verify_pkt, [3]) + + # Check IPv6 for match + send_pkt = simple_udpv6_packet( + ipv6_src="1111::8888", ipv6_dst="2222::9999", udp_sport=1000, udp_dport=80) + verify_pkt = simple_udpv6_packet( + ipv6_src="1111::8888", ipv6_dst="2222::9999", udp_sport=1000, udp_dport=80) + send_packet(self, 2, send_pkt) + verify_packets(self, verify_pkt, [1]) + + finally: + mrzcpd.stop() + +@ group("full_field_match_test") +class FullFieldTreeMatchForVwireTest(BaseTest): + def setUp(self): + self.dataplane = ptf.dataplane_instance + + def __init__(self): + BaseTest.__init__(self) + + def runTest(self): + try: + # Init & Start mrzcpd + global dynamic_conf_full_field_match_for_vwire + dynamic_conf = dynamic_conf_full_field_match_for_vwire + for i in range(8,128): + dynamic_conf += "[classifier_rule:" + str(i) + "]\n" + dynamic_conf += "ruleset_type=classifier\n" + dynamic_conf += "rule_id=" + str(i+1) + "\n" + dynamic_conf += "dst_ip_addr_v4=172.19.2." + str(i) + "\n" + dynamic_conf += "dst_ip_mask_v4=32\n" + dynamic_conf += "action=nf_steering\n" + dynamic_conf += "priority=1\n" + dynamic_conf += "category=0\n" + dynamic_conf += "sid=1000\n" + dynamic_conf += "vwire_id=0\n\n" + mrzcpd = Mrzcpd(start_conf_vwire,dynamic_conf) + mrzcpd.start() + + # Check IPv4 for miss + send_pkt = simple_tcp_packet( + ip_src="172.17.1.100", ip_dst="172.17.2.100", tcp_sport=1000, tcp_dport=1000) + verify_pkt = simple_tcp_packet( + ip_src="172.17.1.100", ip_dst="172.17.2.100", tcp_sport=1000, tcp_dport=1000) + send_packet(self, 3, send_pkt) + verify_packets(self, verify_pkt, [2]) + + # Check IPv4 for match + send_pkt = simple_tcp_packet( + ip_src="172.17.1.100", ip_dst="172.17.2.100", tcp_sport=1000, tcp_dport=80) + verify_pkt = simple_tcp_packet( + ip_src="172.17.1.100", ip_dst="172.17.2.100", tcp_sport=1000, tcp_dport=80) + send_packet(self, 3, send_pkt) + verify_packets(self, verify_pkt, [0]) + + # Check IPv6 for miss + send_pkt = simple_udpv6_packet( + ipv6_src="1111::8888", ipv6_dst="2222::9999", udp_sport=1000, udp_dport=1000) + verify_pkt = simple_udpv6_packet( + ipv6_src="1111::8888", ipv6_dst="2222::9999", udp_sport=1000, udp_dport=1000) + send_packet(self, 2, send_pkt) + verify_packets(self, verify_pkt, [3]) + + # Check IPv6 for match + send_pkt = simple_udpv6_packet( + ipv6_src="1111::8888", ipv6_dst="2222::9999", udp_sport=1000, udp_dport=80) + verify_pkt = simple_udpv6_packet( + ipv6_src="1111::8888", ipv6_dst="2222::9999", udp_sport=1000, udp_dport=80) + send_packet(self, 2, send_pkt) + verify_packets(self, verify_pkt, [1]) + + finally: + mrzcpd.stop() + + +start_conf_tera = """ +[device] +device=veth0,veth1,veth2 +sz_tunnel=8192 +sz_buffer=0 + +[device:veth0] +promisc=0 +mtu=1500 +driver=2 +role=3 + +[device:veth1] +promisc=1 +mtu=1500 +driver=2 +role=3 + +[device:veth2] +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 + +[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=32 + +[vwires] +sid_start=300 +sid_end=400 +max_rules=32 + +[tera_adapters] +sid_start=500 +sid_end=600 +max_rules=64 + +[tera_adapter:0] +tera_adapter_id=0 +listen_device=veth0 +vlan_int=110 +vlan_ext=111 +mac_flipping=0 + +[service_lb] +sid_start=1000 +sid_end=2000 + +# load balance +[load_balance:0] +mode=balance +devices=veth1,normal + +[load_balance:1] +mode=balance +devices=veth2,normal + +""" + +dynamic_conf_full_field_match_for_tera = """ +[classifier_rule:0] +rule_id=1 +ruleset_type=classifier +src_ip_addr_v4=172.17.1.100 +src_ip_mask_v4=32 +dst_ip_addr_v4=172.17.2.100 +dst_ip_mask_v4=32 +src_port_range_start=1000 +src_port_range_end=1000 +dst_port_range_start=80 +dst_port_range_end=80 +proto=tcp +priority=1 +sid=1000 +category=0 +tera_adapter_id=0 +action=nf_steering + +[classifier_rule:1] +rule_id=2 +ruleset_type=classifier +src_ip_addr_v6=1111::8888 +src_ip_mask_v6=128 +dst_ip_addr_v6=2222::9999 +dst_ip_mask_v6=128 +src_port_range_start=1000 +src_port_range_end=1000 +dst_port_range_start=80 +dst_port_range_end=80 +proto=udp +priority=1 +sid=1001 +category=0 +tera_adapter_id=0 +action=nf_steering + +""" + +""" + +----------------------+ +----------------------+ + | IPv4=172.17.2.100 | | IPv6=2222::9999 | + +----------------------+ +----------------------+ + | | + V V + +-------------------------------------------------+ + | Classifier Table | + +-------------------------------------------------+ + | | + V V + +---------------------+ +---------------------+ + | ClassifierRuleID1 | | ClassifierRuleID2 | + +---------------------+ +---------------------+ + | | + V V + +------------------------------------------------+ + | Forwarding | + +------------------------------------------------+ + | | + V V + +-------------------+ +-------------------+ + | veth1 port | | veth2 port | + +-------------------+ +-------------------+ +""" +@ group("full_field_match_test") +class FullFieldLinearMatchForTeraTest(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_tera,dynamic_conf_full_field_match_for_tera) + mrzcpd.start() + + # Check IPv4 for miss + send_pkt = simple_tcp_packet(vlan_vid=110, dl_vlan_enable=True,ip_src="172.17.1.100", ip_dst="172.17.2.100", tcp_sport=1000, tcp_dport=1000) + verify_pkt = simple_tcp_packet(vlan_vid=111, dl_vlan_enable=True,ip_src="172.17.1.100", ip_dst="172.17.2.100", tcp_sport=1000, tcp_dport=1000) + send_packet(self, 0, send_pkt) + verify_packets(self, verify_pkt, [0]) + + # Check IPv4 for match + send_pkt = simple_tcp_packet(vlan_vid=110, dl_vlan_enable=True,ip_src="172.17.1.100", ip_dst="172.17.2.100", tcp_sport=1000, tcp_dport=80) + verify_pkt = simple_tcp_packet(vlan_vid=111, dl_vlan_enable=True,ip_src="172.17.1.100", ip_dst="172.17.2.100", tcp_sport=1000, tcp_dport=80) + send_packet(self, 0, send_pkt) + verify_packets(self, verify_pkt, [1]) + + # Check IPv6 for miss + send_pkt = simple_udpv6_packet(vlan_vid=110, dl_vlan_enable=True,ipv6_src="1111::8888", ipv6_dst="2222::9999", udp_sport=1000, udp_dport=1000) + verify_pkt = simple_udpv6_packet(vlan_vid=111, dl_vlan_enable=True,ipv6_src="1111::8888", ipv6_dst="2222::9999", udp_sport=1000, udp_dport=1000) + send_packet(self, 0, send_pkt) + verify_packets(self, verify_pkt, [0]) + + # Check IPv6 for match + send_pkt = simple_udpv6_packet(vlan_vid=110, dl_vlan_enable=True,ipv6_src="1111::8888", ipv6_dst="2222::9999", udp_sport=1000, udp_dport=80) + verify_pkt = simple_udpv6_packet(vlan_vid=111, dl_vlan_enable=True,ipv6_src="1111::8888", ipv6_dst="2222::9999", udp_sport=1000, udp_dport=80) + send_packet(self, 0, send_pkt) + verify_packets(self, verify_pkt, [2]) + + finally: + mrzcpd.stop() + +@ group("full_field_match_test") +class FullFieldTreeMatchForTeraTest(BaseTest): + def setUp(self): + self.dataplane = ptf.dataplane_instance + + def __init__(self): + BaseTest.__init__(self) + + def runTest(self): + try: + # Init & Start mrzcpd + global dynamic_conf_full_field_match_for_tera + dynamic_conf = dynamic_conf_full_field_match_for_tera + for i in range(8,128): + dynamic_conf += "[classifier_rule:" + str(i) + "]\n" + dynamic_conf += "ruleset_type=classifier\n" + dynamic_conf += "rule_id=" + str(i+1) + "\n" + dynamic_conf += "dst_ip_addr_v4=172.19.2." + str(i) + "\n" + dynamic_conf += "dst_ip_mask_v4=32\n" + dynamic_conf += "action=nf_steering\n" + dynamic_conf += "priority=1\n" + dynamic_conf += "category=0\n" + dynamic_conf += "sid=1000\n" + dynamic_conf += "tera_adapter_id=0\n\n" + mrzcpd = Mrzcpd(start_conf_tera,dynamic_conf) + mrzcpd.start() + + # Check IPv4 for miss + send_pkt = simple_tcp_packet(vlan_vid=110, dl_vlan_enable=True,ip_src="172.17.1.100", ip_dst="172.17.2.100", tcp_sport=1000, tcp_dport=1000) + verify_pkt = simple_tcp_packet(vlan_vid=111, dl_vlan_enable=True,ip_src="172.17.1.100", ip_dst="172.17.2.100", tcp_sport=1000, tcp_dport=1000) + send_packet(self, 0, send_pkt) + verify_packets(self, verify_pkt, [0]) + + # Check IPv4 for match + send_pkt = simple_tcp_packet(vlan_vid=110, dl_vlan_enable=True,ip_src="172.17.1.100", ip_dst="172.17.2.100", tcp_sport=1000, tcp_dport=80) + verify_pkt = simple_tcp_packet(vlan_vid=111, dl_vlan_enable=True,ip_src="172.17.1.100", ip_dst="172.17.2.100", tcp_sport=1000, tcp_dport=80) + send_packet(self, 0, send_pkt) + verify_packets(self, verify_pkt, [1]) + + # Check IPv6 for miss + send_pkt = simple_udpv6_packet(vlan_vid=110, dl_vlan_enable=True,ipv6_src="1111::8888", ipv6_dst="2222::9999", udp_sport=1000, udp_dport=1000) + verify_pkt = simple_udpv6_packet(vlan_vid=111, dl_vlan_enable=True,ipv6_src="1111::8888", ipv6_dst="2222::9999", udp_sport=1000, udp_dport=1000) + send_packet(self, 0, send_pkt) + verify_packets(self, verify_pkt, [0]) + + # Check IPv6 for match + send_pkt = simple_udpv6_packet(vlan_vid=110, dl_vlan_enable=True,ipv6_src="1111::8888", ipv6_dst="2222::9999", udp_sport=1000, udp_dport=80) + verify_pkt = simple_udpv6_packet(vlan_vid=111, dl_vlan_enable=True,ipv6_src="1111::8888", ipv6_dst="2222::9999", udp_sport=1000, udp_dport=80) + send_packet(self, 0, send_pkt) + verify_packets(self, verify_pkt, [2]) + + finally: + mrzcpd.stop() diff --git a/test/ptf_test/common_pkt.py b/test/ptf_test/common_pkt.py new file mode 100644 index 0000000..a21758f --- /dev/null +++ b/test/ptf_test/common_pkt.py @@ -0,0 +1,100 @@ +import ptf +import random +import ipaddress +from ptf.testutils import * +from ptf.thriftutils import * +from scapy.all import * +from scapy.contrib.bfd import BFD + + +def simple_bfd_packet( + eth_dst="10:70:fd:03:c0:bd", + eth_src="0a:0a:0a:0a:01:28", + ip_src="10.10.1.40", + ip_dst="10.254.60.1", + udp_sport=3784, + udp_dport=3784, + sta=0, + my_discriminator=1, + your_discriminator=2, +): + """ + Return a simple BFD packet + """ + bfd = BFD(sta=sta, my_discriminator=my_discriminator, + your_discriminator=your_discriminator) + + pkt = simple_udp_packet( + eth_dst=eth_dst, + eth_src=eth_src, + ip_src=ip_src, + ip_dst=ip_dst, + udp_sport=udp_sport, + udp_dport=udp_dport, + udp_payload=bfd + ) + return pkt + +def simple_vlan_udp_packet(eth_dst, eth_src, vlan_vid, ip_src="192.168.0.1", ip_dst="192.168.0.2", udp_sport=1234, udp_dport=80, udp_payload = ""): + # 构建Ethernet帧 + ether_frame = Ether(src=eth_src, dst=eth_dst) + + # 添加VLAN标签 + vlan_frame = ether_frame / Dot1Q(vlan=vlan_vid) + + # 添加IP头 + ip_packet = IP(src=ip_src, dst=ip_dst) + + # 添加UDP头 + udp_packet = UDP(sport=udp_sport, dport=udp_dport) + + # 添加有效负载 + udp_payload_packet = udp_packet / udp_payload + + # 构建最终的数据包 + final_packet = vlan_frame / ip_packet / udp_payload_packet + + return final_packet + +def simple_qinq_udp_packet(eth_src, eth_dst, outer_vlan_id, inner_vlan_id, ip_src="192.168.0.1", ip_dst="192.168.0.2", udp_sport=1234,udp_dport=80, udp_payload = ""): + # 构建Ethernet帧 + ether_frame = Ether(src=eth_src, dst=eth_dst) + + # 添加QinQ标签 + qinq_frame = ether_frame / Dot1Q(vlan=outer_vlan_id) / Dot1Q(vlan=inner_vlan_id) + + # 添加IP头 + ip_packet = IP(src=ip_src, dst=ip_dst) + + # 添加UDP头 + udp_packet = UDP(sport=udp_sport, dport=udp_dport) + + # 添加有效负载 + udp_payload_packet = udp_packet / udp_payload + + # 构建最终的数据包 + final_packet = qinq_frame / ip_packet / udp_payload_packet + + return final_packet + +def generate_random_tcp_port(): + """ + 生成随机的 TCP 端口号 + """ + return random.randint(1024, 65535) + + +def generate_random_ipv4(): + """ + 生成随机的 IPv4 地址 + """ + # 随机生成四个 0-255 之间的数字 + octets = [str(random.randint(0, 255)) for _ in range(4)] + # 将四个数字组合成一个 IPv4 地址 + ip_addr = ".".join(octets) + # 将字符串类型的 IP 地址转换为 IPv4Address 对象 + return ipaddress.IPv4Address(ip_addr) + + +def get_port_packet_count(self, port): + return self.dataplane.rx_counters[port] diff --git a/test/ptf_test/create_veth.sh b/test/ptf_test/create_veth.sh new file mode 100644 index 0000000..ed00dd6 --- /dev/null +++ b/test/ptf_test/create_veth.sh @@ -0,0 +1,45 @@ +#!/bin/bash + +function create_veth() { + ip link add veth$1 type veth peer name veth$1-ptf$1 + ip link set veth$1 up + ip link set veth$1-ptf$1 up +} + +function delete_veth() { + for i in $(seq 0 $(( $1 - 1 ))) + do + ip link delete veth$i + echo "Deleted veth interface: veth$i" + done +} + +if [[ "$1" == "create" ]]; then + if [ "$2" == "msgpack" ]; then + ip link add veth-msgpack-tx type veth peer name veth-msgpack-rx + ip link set veth-msgpack-rx up + ip link set veth-msgpack-tx up + elif [ -z "$2" ]; then + echo "Usage: $0 create " + exit 1 + fi + + for i in $(seq 0 $(( $2 - 1 ))) + do + create_veth "$i" + echo "Created veth interface: veth$i" + done + +elif [[ "$1" == "delete" ]]; then + if [ "$2" == "msgpack" ]; then + ip link delete veth-msgpack-tx + echo "Deleted veth interface: veth-msgpack-tx" + elif [ -z "$2" ]; then + echo "Usage: $0 delete " + exit 1 + fi + delete_veth "$2" +else + echo "Usage: $0 " + exit 1 +fi diff --git a/test/ptf_test/endpoint_dev_test.py b/test/ptf_test/endpoint_dev_test.py new file mode 100644 index 0000000..fa46b44 --- /dev/null +++ b/test/ptf_test/endpoint_dev_test.py @@ -0,0 +1,111 @@ +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 + +icmp_conf = """ +[device] +device=veth0 +sz_tunnel=8192 +sz_buffer=0 + +[device:veth0] +in_addr=172.17.16.1 +in_mask=255.255.255.0 +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 + +[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] +interface_int=veth0 + +[service_lb] +sid_start=1000 +sid_end=2000 + +""" + +""" + +------------+ +-------------------------+ + | PTF | | MRZCPD | + +------------+ icmp +-------------------------+ + | veth0-ptf0 | <---> | veth0 (172.17.16.1) | + +------------+ +-------------------------+ +""" + +@group("icmp_reply_test") +class IcmpReplyTest(BaseTest): + def setUp(self): + self.dataplane = ptf.dataplane_instance + + def __init__(self): + BaseTest.__init__(self) + + def runTest(self): + try: + # Init & Start mrzcpd + mrzcpd = Mrzcpd(icmp_conf,"") + mrzcpd.start() + send_pkt = simple_icmp_packet(eth_dst='00:01:02:03:04:05',eth_src='00:06:07:08:09:0a',ip_src='172.17.16.2', ip_dst='172.17.16.1', icmp_type=8, icmp_code=0,icmp_data='icmp test\n') + send_packet(self, 0,send_pkt) + + # Verify + exp_pkt = simple_icmp_packet(eth_dst='00:06:07:08:09:0a',eth_src='00:01:02:03:04:05',ip_src='172.17.16.1', ip_dst='172.17.16.2', icmp_type=0, icmp_code=0,icmp_data='icmp test\n') + verify_packet(self, exp_pkt, 0) + + finally: + mrzcpd.stop() diff --git a/test/ptf_test/etherfabric_test.py b/test/ptf_test/etherfabric_test.py new file mode 100644 index 0000000..61f2e17 --- /dev/null +++ b/test/ptf_test/etherfabric_test.py @@ -0,0 +1,578 @@ +import ptf +from ptf.base_tests import BaseTest +from ptf.testutils import * +from scapy.all import * +from mrzcpd import Mrzcpd +from common_pkt import * + +conf_for_virtual_wire_mode = """ +[device] +device=veth0 +sz_tunnel=8192 +sz_buffer=0 + +[device:veth0] +in_addr=10.254.60.1 +in_mask=255.255.255.0 +gateway=10.10.1.40 +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 + +[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 + +[ef_adapters] +sid_start=100 +sid_end=200 +max_rules=256 + +[ef_adapter:0] +ef_adapter_id=0 +mode=virtual-wire +listen_device=veth0 +""" + +@group("virtual_wire_mode") +class TestForVirtualWireMode(BaseTest): + def setUp(self): + self.dataplane = ptf.dataplane_instance + + def __init__(self): + BaseTest.__init__(self) + + def runTest(self): + try: + # Init & Start mrzcpd + mrzcpd = Mrzcpd(conf_for_virtual_wire_mode, "") + mrzcpd.start() + + send_pkt = simple_vxlan_packet( + eth_src='0a:0a:0a:0a:01:28', eth_dst='10:70:fd:03:c0:bd', + ip_src='10.254.50.1', ip_dst='10.254.60.1', vxlan_vni=32) + verify_pkt = simple_vxlan_packet( + eth_src='10:70:fd:03:c0:bd', eth_dst='0a:0a:0a:0a:01:28', + ip_src='10.254.60.1', ip_dst='10.254.50.1', vxlan_vni=32) + send_packet(self, 0, send_pkt) + verify_packets(self, verify_pkt, [0]) + finally: + mrzcpd.stop() + +conf_for_tap_mode = """ +[device] +device=veth0 +sz_tunnel=8192 +sz_buffer=0 + +[device:veth0] +in_addr=10.254.60.1 +in_mask=255.255.255.0 +gateway=10.10.1.40 +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 + +[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 + +[ef_adapters] +sid_start=100 +sid_end=200 +max_rules=256 + +[ef_adapter:0] +ef_adapter_id=0 +mode=tap +listen_device=veth0 +""" +@group("tap_mode") +class TestForTapMode(BaseTest): + def setUp(self): + self.dataplane = ptf.dataplane_instance + + def __init__(self): + BaseTest.__init__(self) + + def runTest(self): + try: + # Init & Start mrzcpd + mrzcpd = Mrzcpd(conf_for_tap_mode, "") + mrzcpd.start() + + send_pkt = simple_vxlan_packet( + eth_src='0a:0a:0a:0a:01:28', eth_dst='10:70:fd:03:c0:bd', + ip_src='10.254.50.1', ip_dst='10.254.60.1', vxlan_vni=32) + verify_pkt = simple_vxlan_packet( + eth_src='10:70:fd:03:c0:bd', eth_dst='0a:0a:0a:0a:01:28', + ip_src='10.254.60.1', ip_dst='10.254.50.1', vxlan_vni=32) + + for i in range(0, 100): + send_packet(self, 0, send_pkt) + verify_no_packet(self, verify_pkt, 0) + + finally: + mrzcpd.stop() + +start_conf_with_route_ctx = """ +[device] +device=veth0,veth-msgpack-tx,veth-msgpack-rx +sz_tunnel=8192 +sz_buffer=0 + +[device:veth0] +in_addr=10.254.60.1 +in_mask=255.255.255.0 +gateway=10.10.1.40 +promisc=1 +mtu=1500 +driver=2 +role=3 +ether=10:70:fd:03:c0:bd + +[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=0 +route_ctx_enable=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 + +[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=32 + +[vwires] +sid_start=300 +sid_end=400 +max_rules=32 + +[tera_adapters] +sid_start=500 +sid_end=600 +max_rules=64 + +[service_lb] +sid_start=1000 +sid_end=2000 + +[ef_adapter:0] +ef_adapter_id=0 +mode=virtual-wire +listen_device=veth0 + +# load balance +[load_balance:0] +mode=balance +devices=veth-msgpack-tx,normal +""" + +dynamic_conf_with_route_ctx = """ +[classifier_rule:0] +rule_id=1 +ruleset_type=classifier +action=nf_steering +priority=1 +category=0 +sid=1000 +""" +""" + +------------+ +-----------------------------------------+ + | PTF | | MRZCPD | + +------------+ +------------+--------+-------------------+ + | | ---> | | ---> | veth-msgpack-tx | --------+ + + veth0-ptf0 + + veth0 + +-------------------+ | + | | <--- | | <--- | veth-msgpack-rx | <-------+ + +------------+ +------------+ +-------------------+ +""" +@group("ef_route_ctx_test") +class IPv4TestForRouteCtx(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_with_route_ctx, dynamic_conf_with_route_ctx) + mrzcpd.start() + + send_pkt = simple_vxlan_packet( + eth_src='0a:0a:0a:0a:01:28', eth_dst='10:70:fd:03:c0:bd', + ip_src='10.254.50.1', ip_dst='10.254.60.1',udp_sport=4789,udp_dport=4789, vxlan_vni=32) + verify_pkt = simple_vxlan_packet( + eth_src='10:70:fd:03:c0:bd', eth_dst='0a:0a:0a:0a:01:28', + ip_src='10.254.60.1', ip_dst='10.254.50.1',udp_sport=4789,udp_dport=4789,with_udp_chksum=False,vxlan_flags=0,vxlan_vni=32) + send_packet(self, 0, send_pkt) + verify_packets(self, verify_pkt, [0]) + finally: + mrzcpd.stop() + +start_conf_with_non_contiguous_test = """ +[device] +device = veth0,veth1,veth2,veth3,veth4,veth5 +sz_tunnel = 8192 +sz_buffer = 0 + +[device:veth0] +in_addr=10.254.60.100 +in_mask=255.255.255.0 +promisc = 1 +mtu = 1500 +driver = 2 +role = 3 + +[device:veth1] +promisc = 1 +mtu = 1500 +driver=2 +role=4 + +[device:veth2] +in_addr=10.254.60.101 +in_mask=255.255.255.0 +promisc = 1 +mtu = 1500 +driver = 2 +role = 3 + +[device:veth3] +promisc = 1 +mtu = 1500 +driver=2 +role=4 + +[device:veth4] +in_addr=10.254.60.102 +in_mask=255.255.255.0 +promisc = 1 +mtu = 1500 +driver = 2 +role = 3 + +[device:veth5] +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 + +[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 + +# load balance +[load_balance:0] +mode=balance +devices=veth1,normal + +[load_balance:1] +mode=balance +devices=veth3,normal + +[load_balance:2] +mode=balance +devices=veth5,normal + +# adapter +[ef_adapter:0] +ef_adapter_id=0 +mode=virtual-wire +listen_device=veth0 + +[ef_adapter:1] +ef_adapter_id=2 +mode=virtual-wire +listen_device=veth2 + +[ef_adapter:2] +ef_adapter_id=4 +mode=virtual-wire +listen_device=veth4 +""" + +dynamic_conf_with_non_contiguous_test = """ +[classifier_rule:0] +rule_id=1 +ruleset_type=classifier +action=nf_steering +priority=1 +category=0 +sid=1000 +ef_adapter_id=0 + +[classifier_rule:1] +rule_id=2 +ruleset_type=classifier +action=nf_steering +priority=1 +category=0 +sid=1001 +ef_adapter_id=2 + +[classifier_rule:2] +rule_id=2 +ruleset_type=classifier +action=nf_steering +priority=1 +category=0 +sid=1002 +ef_adapter_id=4 +""" + +""" + +--------------+ +----------++-----------+----------+ + | PTF | | Mrzcpd | + +--------------+ +----------++-----------+----------+ +------------+ + | veth0-ptf0 | ---> | veth0 | | veth1 | ---> | veth1-ptf1 | + +--------------+ +----------+ +----------+ +------------+ + | veth2-ptf2 | ---> | veth2 | | veth3 | ---> | veth3-ptf3 | + +--------------+ +----------+ +----------+ +------------+ + | veth4-ptf4 | ---> | veth4 | | veth5 | ---> | veth5-ptf5 | + +--------------+ +----------+ +----------+ +------------+ +""" +@group("ef_adapter_id_non_contiguous_test") +class EfAdapterIdNonContiguousTest(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() + + send_pkts = [] + verify_pkts = [] + + # Create packets + for i in range(0,3): + tcp_pkt = simple_tcp_packet() + verify_pkts.append(tcp_pkt) + + send_pkts.append(simple_vxlan_packet(eth_src='0a:0a:0a:0a:01:28', + eth_dst='10:70:fd:03:c0:bd', + ip_src='10.254.50.' + str(100 + i), ip_dst='10.254.60.' + str(100 + i), + vxlan_vni=32,inner_frame=tcp_pkt)) + + + # Traverse all ports + for i in range(0, 3): + # Send pkt for the port + send_packet(self, i * 2 , send_pkts[i]) + # Verify pkt for specified port + verify_packets(self, verify_pkts[i], [1 + i*2]) + + finally: + mrzcpd.stop() diff --git a/test/ptf_test/health_check_test.py b/test/ptf_test/health_check_test.py new file mode 100644 index 0000000..71a48d9 --- /dev/null +++ b/test/ptf_test/health_check_test.py @@ -0,0 +1,119 @@ +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 + +base_conf = """ +[device] +device=veth0 +sz_tunnel=8192 +sz_buffer=0 + +[device:veth0] +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 + +[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 + +# health check +[health_check:0] +name=veth0_health_check +device=veth0 +method=private +multiplier=20 +interval=10 + +[service_lb] +sid_start=1000 +sid_end=2000 + +# load balance +[load_balance:0] +mode=balance +devices=veth0,normal +health_check_sessions=veth0_health_check + +""" + + +@group("health_check_base_test") +class HealthCheckBaseTest(BaseTest): + def setUp(self): + self.dataplane = ptf.dataplane_instance + + def __init__(self): + BaseTest.__init__(self) + + def runTest(self): + try: + # Init & Start mrzcpd + mrzcpd = Mrzcpd(base_conf, "") + mrzcpd.start() + + (_, _, rcv_pkt, _) = dp_poll( + self, device_number=0, port_number=0, timeout=20 + ) + + verify_health_check_pkt = mask.Mask( + simple_eth_packet(eth_type=0xaaaa, pktlen=22)) + verify_health_check_pkt.set_do_not_care(0, 12*8) + verify_health_check_pkt.set_do_not_care(14*8, 8*8) + + send_packet(self, 0, rcv_pkt) + verify_packet(self, verify_health_check_pkt, 0) + + finally: + mrzcpd.stop() diff --git a/test/ptf_test/load_balance_test.py b/test/ptf_test/load_balance_test.py new file mode 100644 index 0000000..f762214 --- /dev/null +++ b/test/ptf_test/load_balance_test.py @@ -0,0 +1,271 @@ +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 + +start_conf = """ +[device] +device=veth0,veth1,veth2,veth3,veth4 +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 + +[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 + +[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 + +# vwire +[vwire:0] +interface_int=veth3 +interface_ext=veth4 + +[service_lb] +sid_start=1000 +sid_end=2000 + +# load balance +[load_balance:0] +mode=balance +devices=veth0,normal,veth1,normal,veth2,normal + +""" + +dynamic_conf = """ +[classifier_rule:0] +rule_id=1 +ruleset_type=classifier +action=nf_steering +priority=1 +category=0 +sid=1000 +vwire_id=0 + +""" +""" + +-------+ +-------+ +------------+ + | Vwire | | LB | | PTF | + +-------+ +-------+ 100 +------------+ + | veth3 | | veth0 | ----> | veth0-ptf0 | + +-------+ 300 +-------+ 100 +------------+ + | veth4 | ----> | veth1 | ----> | veth1-ptf1 | + +-------+ +-------+ 100 +------------+ + | veth2 | ----> | veth2-ptf2 | + +-------+ +------------+ +""" + + +@group("lb_base_test") +class TestForBase(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,dynamic_conf) + mrzcpd.start() + + # Create packet list + send_pkt_list = PacketList() + + # Create send packet + for port in range(0, 300): + pkt = simple_tcp_packet(ip_src=generate_random_ipv4(), ip_dst=generate_random_ipv4( + ), tcp_sport=generate_random_tcp_port(), tcp_dport=generate_random_tcp_port()) + send_pkt_list.append(pkt) + + # Send packet + for pkt in send_pkt_list: + send_packet(self, 4, pkt) + + # Create verify packet + tcp_pkt = simple_tcp_packet() + verify_pkt = mask.Mask(tcp_pkt) + verify_pkt.set_do_not_care(0, len(tcp_pkt) * 8) + + # Wait for a while to ensure enough packets arrive + time.sleep(3) + + # Get packet count for each port + packet_counts = [] + for port in range(0, 3): + packet_count = get_port_packet_count(self, (0, port)) + print("port {} packet count: {}".format(port, packet_count)) + packet_counts.append(packet_count) + + # Calculate average packet count + average_packet_count = sum(packet_counts) / len(packet_counts) + + # Set tolerance + tolerance = 0.15 * average_packet_count + + # Check if packet count is abnormal + for port in range(0, 3): + if abs(packet_counts[port] - average_packet_count) > tolerance: + self.fail("Port %d has an abnormal packet count: %d (average is %d)" % ( + port, packet_counts[port], average_packet_count)) + + finally: + mrzcpd.stop() + + +""" + +-------+ +--------------+ +------------+ + | Vwire | | LB | | PTF | + +-------+ +--------------+ 150 +------------+ + | veth3 | | veth0 | ----> | veth0-ptf0 | + +-------+ 300 +--------------+ 150 +------------+ + | veth4 | ----> | veth1 | ----> | veth1-ptf1 | + +-------+ +--------------+ 0 +------------+ + | veth2 (down) | ----> | veth2-ptf2 | + +--------------+ +------------+ +""" + + +# The test current is invalid,because 'ifconfig veth2 down' can't affect the mrzcpd link status. +@group("lb_one_dev_down_test") +class TestForOneDevDown(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,dynamic_conf) + mrzcpd.start() + + # Set veth2 down + os.system("ifconfig veth2 down") + + # Create packet list + send_pkt_list = PacketList() + + # Create send packet + for port in range(0, 300): + pkt = simple_tcp_packet(ip_src=generate_random_ipv4(), ip_dst=generate_random_ipv4( + ), tcp_sport=generate_random_tcp_port(), tcp_dport=generate_random_tcp_port()) + send_pkt_list.append(pkt) + + # Send packet + for pkt in send_pkt_list: + send_packet(self, 4, pkt) + + # Create verify packet + tcp_pkt = simple_tcp_packet() + verify_pkt = mask.Mask(tcp_pkt) + verify_pkt.set_do_not_care(0, len(tcp_pkt) * 8) + + # Wait for a while to ensure enough packets arrive + time.sleep(3) + + # Get packet count for each port + packet_counts = [] + for port in range(0, 2): + packet_count = get_port_packet_count(self, (0, port)) + print("port {} packet count: {}".format(port, packet_count)) + packet_counts.append(packet_count) + + # Calculate average packet count + average_packet_count = sum(packet_counts) / len(packet_counts) + + # Set tolerance + tolerance = 0.15 * average_packet_count + + # Check veth2 rx packet count + if get_port_packet_count(self, (0, 2)) != 0: + self.fail("veth2 is down, but rx packet count is not 0") + + # Check if packet count is abnormal + for port in range(0, 2): + if abs(packet_counts[port] - average_packet_count) > tolerance: + self.fail("Port %d has an abnormal packet count: %d (average is %d)" % ( + port, packet_counts[port], average_packet_count)) + + finally: + # Set veth2 up + os.system("ifconfig veth2 up") + mrzcpd.stop() diff --git a/test/ptf_test/mrzcpd.py b/test/ptf_test/mrzcpd.py new file mode 100644 index 0000000..b0fd8fa --- /dev/null +++ b/test/ptf_test/mrzcpd.py @@ -0,0 +1,53 @@ +import ptf +import time +import os +import signal +import subprocess +import shutil + +mrzcpd_run_dir = "/var/run/mrzcpd" + + +class Mrzcpd: + def __init__(self, conf_start, conf_dynamic): + self.mrzcpd_path = ptf.testutils.test_param_get( + "source_dir") + "/service/mrzcpd" + + self.conf_start = str(conf_start) + self.conf_path_start = ptf.testutils.test_param_get( + "source_dir") + "/test/ptf_test/mrglobal.conf" + + self.conf_dynamic = str(conf_dynamic) + self.conf_path_dynamic = ptf.testutils.test_param_get( + "source_dir") + "/test/ptf_test/mrglobal.dynamic.conf" + + self.file_start = open(self.conf_path_start, 'w') + self.file_start.write(self.conf_start) + self.file_start.close() + + self.file_dynamic = open(self.conf_path_dynamic, 'w') + self.file_dynamic.write(self.conf_dynamic) + self.file_dynamic.close() + + def start(self): + # Create run dir + if os.path.exists(mrzcpd_run_dir): + shutil.rmtree(mrzcpd_run_dir) + os.makedirs(mrzcpd_run_dir) + + # Start mrzcpd + self.mrzcpd_process = subprocess.Popen( + [self.mrzcpd_path, "-c", self.conf_path_start, "-s", self.conf_path_dynamic], stdout=subprocess.PIPE) + + # Check mrzcpd status + start_timeout = 10 + while start_timeout > 0: + if os.path.exists(mrzcpd_run_dir + "/mrmonit.daemon"): + break + else: + time.sleep(1) + start_timeout = start_timeout - 1 + + def stop(self): + self.mrzcpd_process.terminate() + self.mrzcpd_process.wait() diff --git a/test/ptf_test/msgpack_test.py b/test/ptf_test/msgpack_test.py new file mode 100644 index 0000000..a92b6ff --- /dev/null +++ b/test/ptf_test/msgpack_test.py @@ -0,0 +1,448 @@ +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 + +[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] +mode=balance +devices=veth2,normal +""" + +dynamic_conf_serialize = """ + +[classifier_rule:0] +rule_id=1 +ruleset_type=classifier +action=nf_steering +priority=1 +category=0 +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 + +[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] +mode=balance +devices=veth2,normal + +""" + +dynamic_conf_deserialize = """ +[classifier_rule:0] +rule_id=1 +ruleset_type=classifier +action=nf_steering +priority=1 +category=0 +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 + +[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] +mode=balance +devices=veth-msgpack-tx,normal + +""" +dynamic_conf_serialize_and_deserialize = """ +[classifier_rule:0] +rule_id=1 +ruleset_type=classifier +action=nf_steering +priority=1 +category=0 +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() + diff --git a/test/ptf_test/tera_test.py b/test/ptf_test/tera_test.py new file mode 100644 index 0000000..56b58f3 --- /dev/null +++ b/test/ptf_test/tera_test.py @@ -0,0 +1,1898 @@ +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 msgpack + +start_conf_disable_mac_flapping = """ +[device] +device=veth0 +sz_tunnel=8192 +sz_buffer=0 + +[device:veth0] +in_addr=10.254.60.1 +in_mask=255.255.255.0 +gateway=10.10.1.40 +promisc=0 +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 + +[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=32 + +[vwires] +sid_start=300 +sid_end=400 +max_rules=32 + +[tera_adapters] +sid_start=500 +sid_end=600 +max_rules=64 + +[service_lb] +sid_start=1000 +sid_end=2000 + +[tera_adapter:0] +tera_adapter_id=0 +listen_device=veth0 +vlan_int=110 +vlan_ext=111 +mac_flipping=0 + +""" +""" + +------------+ +-----------------------------------+ + | PTF | | MRZCPD | + +------------+ +------------+----------------------+ + | | | | Classifier miss | + | veth0-ptf0 | ------> | veth0 | -----------------+ | + | | <------ | | <----------------+ | + +------------+ +------------+----------------------+ +""" + +@group("tera_base_test") +class TestForDisableMacFlapping(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_disable_mac_flapping, "") + mrzcpd.start() + + send_pkt = simple_tcp_packet(eth_dst="02:5A:B0:BE:49:51",eth_src="02:5A:B0:BE:49:52",vlan_vid=110, dl_vlan_enable=True) + exp_pkt = simple_tcp_packet(eth_dst="02:5A:B0:BE:49:51",eth_src="02:5A:B0:BE:49:52",vlan_vid=111, dl_vlan_enable=True) + send_packet(self, 0, send_pkt) + verify_packets(self, exp_pkt, [0]) + finally: + mrzcpd.stop() + +start_conf_enable_mac_flapping = """ +[device] +device=veth1 +sz_tunnel=8192 +sz_buffer=0 + +[device:veth1] +in_addr=10.254.60.1 +in_mask=255.255.255.0 +gateway=10.10.1.40 +promisc=0 +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 + +[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=32 + +[vwires] +sid_start=300 +sid_end=400 +max_rules=32 + +[tera_adapters] +sid_start=500 +sid_end=600 +max_rules=64 + +[service_lb] +sid_start=1000 +sid_end=2000 + +[tera_adapter:0] +tera_adapter_id=0 +listen_device=veth1 +vlan_int=110 +vlan_ext=111 +mac_flipping=1 + +""" +""" + +------------+ +-----------------------------------+ + | PTF | | MRZCPD | + +------------+ +------------+----------------------+ + | | | | Classifier miss | + | veth0-ptf0 | ------> | veth0 | -----------------+ | + | | <------ | | <----------------+ | + +------------+ +------------+----------------------+ +""" +@group("tera_base_test") +class TestForEnableMacFlapping(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_enable_mac_flapping,"") + mrzcpd.start() + + send_pkt = simple_tcp_packet(eth_dst="02:5A:B0:BE:49:51",eth_src="02:5A:B0:BE:49:52",vlan_vid=110, dl_vlan_enable=True) + exp_pkt = simple_tcp_packet(eth_dst="02:5A:B0:BE:49:52",eth_src="02:5A:B0:BE:49:51",vlan_vid=111, dl_vlan_enable=True) + send_packet(self, 1, send_pkt) + verify_packets(self, exp_pkt, [1]) + finally: + mrzcpd.stop() + +start_conf_multi_entry = """ +[device] +device=veth0,veth1 +sz_tunnel=8192 +sz_buffer=0 + +[device:veth0] +in_addr=10.254.60.1 +in_mask=255.255.255.0 +gateway=10.10.1.40 +promisc=0 +mtu=1500 +driver=2 +role=3 + +[device:veth1] +promisc=0 +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 + +[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=32 + +[vwires] +sid_start=300 +sid_end=400 +max_rules=32 + +[tera_adapters] +sid_start=500 +sid_end=600 +max_rules=64 + +[service_lb] +sid_start=1000 +sid_end=2000 + +[tera_adapter:0] +tera_adapter_id=0 +listen_device=veth0 +vlan_int=110 +vlan_ext=111 +mac_flipping=1 + +[tera_adapter:1] +tera_adapter_id=1 +listen_device=veth0 +vlan_int=112 +vlan_ext=113 +mac_flipping=1 + +[tera_adapter:2] +tera_adapter_id=2 +listen_device=veth0 +vlan_int=114 +vlan_ext=115 +mac_flipping=1 + +[tera_adapter:3] +tera_adapter_id=3 +listen_device=veth0 +vlan_int=116 +vlan_ext=117 +mac_flipping=1 + +[tera_adapter:4] +tera_adapter_id=4 +listen_device=veth0 +vlan_int=118 +vlan_ext=119 +mac_flipping=1 + +[tera_adapter:5] +tera_adapter_id=5 +listen_device=veth0 +vlan_int=120 +vlan_ext=121 +mac_flipping=1 + +[tera_adapter:6] +tera_adapter_id=6 +listen_device=veth0 +vlan_int=122 +vlan_ext=123 +mac_flipping=1 + +[tera_adapter:7] +tera_adapter_id=7 +listen_device=veth0 +vlan_int=124 +vlan_ext=125 +mac_flipping=1 + +[tera_adapter:8] +tera_adapter_id=8 +listen_device=veth0 +vlan_int=126 +vlan_ext=127 +mac_flipping=1 + +[tera_adapter:9] +tera_adapter_id=9 +listen_device=veth0 +vlan_int=128 +vlan_ext=129 +mac_flipping=1 + +[tera_adapter:10] +tera_adapter_id=10 +listen_device=veth0 +vlan_int=130 +vlan_ext=131 +mac_flipping=1 + +[tera_adapter:11] +tera_adapter_id=11 +listen_device=veth0 +vlan_int=132 +vlan_ext=133 +mac_flipping=1 + +[tera_adapter:12] +tera_adapter_id=12 +listen_device=veth0 +vlan_int=134 +vlan_ext=135 +mac_flipping=1 + +[tera_adapter:13] +tera_adapter_id=13 +listen_device=veth0 +vlan_int=136 +vlan_ext=137 +mac_flipping=1 + +[tera_adapter:14] +tera_adapter_id=14 +listen_device=veth0 +vlan_int=138 +vlan_ext=139 +mac_flipping=1 + +[tera_adapter:15] +tera_adapter_id=15 +listen_device=veth0 +vlan_int=140 +vlan_ext=141 +mac_flipping=1 +""" +""" + +------------+ +-----------------------------------+ + | PTF | | MRZCPD | + +------------+ +------------+----------------------+ + | | | | Classifier miss | + | veth0-ptf0 | ------> | veth0 | -----------------+ | + | | <------ | | <----------------+ | + +------------+ +------------+----------------------+ +""" +@group("tera_base_test") +class IPv4TestForMultiEntry(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_multi_entry,"") + mrzcpd.start() + + send_packets=[] + for i in range(0,16): + send_packets.append(simple_tcp_packet(eth_dst="02:5A:B0:BE:49:51",eth_src="02:5A:B0:BE:49:52",vlan_vid=110+i*2, dl_vlan_enable=True)) + + exp_packets=[] + for i in range(0,16): + exp_packets.append(simple_tcp_packet(eth_dst="02:5A:B0:BE:49:52",eth_src="02:5A:B0:BE:49:51",vlan_vid=111+i*2, dl_vlan_enable=True)) + + for i in range(0,16): + send_packet(self, 0, send_packets[i]) + verify_packets(self, exp_packets[i], [0]) + finally: + mrzcpd.stop() + +""" + +------------+ +-----------------------------------+ + | PTF | | MRZCPD | + +------------+ +------------+----------------------+ + | | | | Classifier miss | + | veth0-ptf0 | ------> | veth0 | -----------------+ | + | | <------ | | <----------------+ | + +------------+ +------------+----------------------+ +""" +@group("tera_base_test") +class IPv4TestForUnmatchedRules(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_multi_entry,"") + mrzcpd.start() + + send_packets=[] + for i in range(0,16): + send_packets.append(simple_tcp_packet(eth_dst="02:5A:B0:BE:49:51",eth_src="02:5A:B0:BE:49:52",vlan_vid=210+i*2, dl_vlan_enable=True)) + + exp_packets=[] + for i in range(0,16): + exp_packets.append(simple_tcp_packet(eth_dst="02:5A:B0:BE:49:52",eth_src="02:5A:B0:BE:49:51",vlan_vid=211+i*2, dl_vlan_enable=True)) + + for i in range(0,16): + send_packet(self, 0, send_packets[i]) + #verify_no_packet(self, exp_packets[i], 1, timeout=1) + verify_no_other_packets(self, timeout=1) + + finally: + mrzcpd.stop() + +""" + +------------+ +-----------------------------------+ + | PTF | | MRZCPD | + +------------+ +------------+----------------------+ + | | | | Classifier miss | + | veth0-ptf0 | ------> | veth0 | -----------------+ | + | | <------ | | <----------------+ | + +------------+ +------------+----------------------+ +""" +@group("tera_base_test") +class IPv6TestForMultiEntry(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_multi_entry,"") + mrzcpd.start() + + send_packets=[] + for i in range(0,16): + send_packets.append(simple_tcpv6_packet(eth_dst="02:5A:B0:BE:49:51",eth_src="02:5A:B0:BE:49:52",vlan_vid=110+i*2, dl_vlan_enable=True)) + + exp_packets=[] + for i in range(0,16): + exp_packets.append(simple_tcpv6_packet(eth_dst="02:5A:B0:BE:49:52",eth_src="02:5A:B0:BE:49:51",vlan_vid=111+i*2, dl_vlan_enable=True)) + + for i in range(0,16): + send_packet(self, 0, send_packets[i]) + verify_packets(self, exp_packets[i], [0]) + finally: + mrzcpd.stop() + +""" + +------------+ +-----------------------+ + | PTF | | MRZCPD | + +------------+ +------------+----------+ + | | | | Drop | + | veth0-ptf0 | ------> | veth0 | | + +------------+ +------------+----------+ +""" +@group("tera_base_test") +class IPv6TestForUnmatchedRules(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_multi_entry,"") + mrzcpd.start() + + send_packets=[] + for i in range(0,16): + send_packets.append(simple_tcpv6_packet(eth_dst="02:5A:B0:BE:49:51",eth_src="02:5A:B0:BE:49:52",vlan_vid=210+i*2, dl_vlan_enable=True)) + + exp_packets=[] + for i in range(0,16): + exp_packets.append(simple_tcpv6_packet(eth_dst="02:5A:B0:BE:49:52",eth_src="02:5A:B0:BE:49:51",vlan_vid=211+i*2, dl_vlan_enable=True)) + + for i in range(0,16): + send_packet(self, 0, send_packets[i]) + #verify_no_packet(self, exp_packets[i], 1, timeout=1) + verify_no_other_packets(self, timeout=1) + + finally: + mrzcpd.stop() + + +start_conf_with_msgpack = """ +[device] +device=veth0,veth1 +sz_tunnel=8192 +sz_buffer=0 + +[device:veth0] +in_addr=10.254.60.1 +in_mask=255.255.255.0 +gateway=10.10.1.40 +promisc=0 +mtu=1500 +driver=2 +role=3 + +[device:veth1] +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 + +[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=32 + +[vwires] +sid_start=300 +sid_end=400 +max_rules=32 + +[tera_adapters] +sid_start=500 +sid_end=600 +max_rules=64 + +[service_lb] +sid_start=1000 +sid_end=2000 + +[tera_adapter:0] +tera_adapter_id=0 +listen_device=veth0 +vlan_int=110 +vlan_ext=111 +mac_flipping=1 + +[tera_adapter:1] +tera_adapter_id=1 +listen_device=veth0 +vlan_int=112 +vlan_ext=113 +mac_flipping=1 + +[tera_adapter:2] +tera_adapter_id=2 +listen_device=veth0 +vlan_int=114 +vlan_ext=115 +mac_flipping=1 + +[tera_adapter:3] +tera_adapter_id=3 +listen_device=veth0 +vlan_int=116 +vlan_ext=117 +mac_flipping=1 + +[tera_adapter:4] +tera_adapter_id=4 +listen_device=veth0 +vlan_int=118 +vlan_ext=119 +mac_flipping=1 + +[tera_adapter:5] +tera_adapter_id=5 +listen_device=veth0 +vlan_int=120 +vlan_ext=121 +mac_flipping=1 + +[tera_adapter:6] +tera_adapter_id=6 +listen_device=veth0 +vlan_int=122 +vlan_ext=123 +mac_flipping=1 + +[tera_adapter:7] +tera_adapter_id=7 +listen_device=veth0 +vlan_int=124 +vlan_ext=125 +mac_flipping=1 + +[tera_adapter:8] +tera_adapter_id=8 +listen_device=veth0 +vlan_int=126 +vlan_ext=127 +mac_flipping=1 + +[tera_adapter:9] +tera_adapter_id=9 +listen_device=veth0 +vlan_int=128 +vlan_ext=129 +mac_flipping=1 + +[tera_adapter:10] +tera_adapter_id=10 +listen_device=veth0 +vlan_int=130 +vlan_ext=131 +mac_flipping=1 + +[tera_adapter:11] +tera_adapter_id=11 +listen_device=veth0 +vlan_int=132 +vlan_ext=133 +mac_flipping=1 + +[tera_adapter:12] +tera_adapter_id=12 +listen_device=veth0 +vlan_int=134 +vlan_ext=135 +mac_flipping=1 + +[tera_adapter:13] +tera_adapter_id=13 +listen_device=veth0 +vlan_int=136 +vlan_ext=137 +mac_flipping=1 + +[tera_adapter:14] +tera_adapter_id=14 +listen_device=veth0 +vlan_int=138 +vlan_ext=139 +mac_flipping=1 + +[tera_adapter:15] +tera_adapter_id=15 +listen_device=veth0 +vlan_int=140 +vlan_ext=141 +mac_flipping=1 + +# load balance +[load_balance:0] +mode=balance +devices=veth1,normal + +[link_db:0] +type=2 +traffic_link_id=1000 +tera_adapter_id=0 + +[link_db:1] +type=2 +traffic_link_id=1001 +tera_adapter_id=1 + +[link_db:2] +type=2 +traffic_link_id=1002 +tera_adapter_id=2 + +[link_db:3] +type=2 +traffic_link_id=1003 +tera_adapter_id=3 + +[link_db:4] +type=2 +traffic_link_id=1004 +tera_adapter_id=4 + +[link_db:5] +type=2 +traffic_link_id=1005 +tera_adapter_id=5 + +[link_db:6] +type=2 +traffic_link_id=1006 +tera_adapter_id=6 + +[link_db:7] +type=2 +traffic_link_id=1007 +tera_adapter_id=7 + +[link_db:8] +type=2 +traffic_link_id=1008 +tera_adapter_id=8 + +[link_db:9] +type=2 +traffic_link_id=1009 +tera_adapter_id=9 + +[link_db:10] +type=2 +traffic_link_id=1010 +tera_adapter_id=10 + +[link_db:11] +type=2 +traffic_link_id=1011 +tera_adapter_id=11 + +[link_db:12] +type=2 +traffic_link_id=1012 +tera_adapter_id=12 + +[link_db:13] +type=2 +traffic_link_id=1013 +tera_adapter_id=13 + +[link_db:14] +type=2 +traffic_link_id=1014 +tera_adapter_id=14 + +[link_db:15] +type=2 +traffic_link_id=1015 +tera_adapter_id=15 +""" + +dynamic_conf_with_msgpack = """ +[classifier_rule:0] +rule_id=1 +ruleset_type=classifier +action=nf_steering +priority=1 +category=0 +sid=1000 +""" + +""" + +------------+ +------------------------------------------+ +------------+ + | PTF | | MRZCPD | | PTF | + +------------+ +------------+--------+--------------------+ +------------+ + | veth0-ptf0 | ---> | veth0 | ---> | veth1 (serialize) | ---> | veth1-ptf1 | + +------------+ +------------+ +--------------------+ +------------+ +""" +@group("tera_mpack_test") +class IPv4MpackTestForIToE(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_with_msgpack,dynamic_conf_with_msgpack) + mrzcpd.start() + + send_packets=[] + for i in range(0,16): + send_packets.append(simple_udp_packet(eth_dst="02:5A:B0:BE:49:51",eth_src="02:5A:B0:BE:49:52",vlan_vid=110+i*2, dl_vlan_enable=True,udp_payload="tera test")) + + exp_packets=[] + for i in range(0,16): + mac_flapping_pkt = simple_udp_packet(eth_dst="02:5A:B0:BE:49:52",eth_src="02:5A:B0:BE:49:51",vlan_vid=111+i*2, dl_vlan_enable=True,udp_payload="tera test") + msgpack_data = {'port': 0, 'packet_type': 0, 'ol_flags': 1, 'data_len': 100, 'pkt_len': 100, 'dir': 0, 'packet_create_from_nf': 0, + 'is_ctrlbuf': 0, 'adapter_type': 2, 'adapter_id': i, 'payload_offset': 0, 'user_0': 0, 'ef_link_id': 0, + 'traffic_link_id': 1000 + i, 'ef_peer_index': 0, 'port_ingress': 0, 'port_egress': 1, 'session_id': 0, 'cur_sid': 1000, + 'sids': [0, 0, 0, 0, 0, 1000, 500+i, 0], 'head': 7, 'tail': 6, 'capacity': 7, + 'packet': mac_flapping_pkt.__bytes__()} + binary_data = msgpack.dumps(msgpack_data) + exp_packets.append(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)) + + for i in range(0,16): + #print ("send packet %d" % i) + send_packet(self, 0, send_packets[i]) + verify_packets(self, exp_packets[i], [1]) + + finally: + mrzcpd.stop() + +@group("tera_mpack_test") +class IPv4MpackTestForEToI(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_with_msgpack,dynamic_conf_with_msgpack) + mrzcpd.start() + + send_packets=[] + for i in range(0,16): + send_packets.append(simple_udp_packet(eth_dst="02:5A:B0:BE:49:51",eth_src="02:5A:B0:BE:49:52",vlan_vid=111+i*2, dl_vlan_enable=True,udp_payload="tera test")) + + exp_packets=[] + for i in range(0,16): + mac_flapping_pkt = simple_udp_packet(eth_dst="02:5A:B0:BE:49:52",eth_src="02:5A:B0:BE:49:51",vlan_vid=110+i*2, dl_vlan_enable=True,udp_payload="tera test") + msgpack_data = {'port': 0, 'packet_type': 0, 'ol_flags': 1, 'data_len': 100, 'pkt_len': 100, 'dir': 1, 'packet_create_from_nf': 0, + 'is_ctrlbuf': 0, 'adapter_type': 2, 'adapter_id': i, 'payload_offset': 0, 'user_0': 0, 'ef_link_id': 0, + 'traffic_link_id': 1000 + i, 'ef_peer_index': 0, 'port_ingress': 0, 'port_egress': 1, 'session_id': 0, 'cur_sid': 1000, + 'sids': [0, 0, 0, 0, 0, 1000, 500+i, 0], 'head': 7, 'tail': 6, 'capacity': 7, + 'packet': mac_flapping_pkt.__bytes__()} + binary_data = msgpack.dumps(msgpack_data) + exp_packets.append(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)) + + for i in range(0,16): + #print ("send packet %d" % i) + send_packet(self, 0, send_packets[i]) + verify_packets(self, exp_packets[i], [1]) + + finally: + mrzcpd.stop() + +@group("tera_mpack_test") +class IPv6MpackTestForIToE(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_with_msgpack,dynamic_conf_with_msgpack) + mrzcpd.start() + + send_packets=[] + for i in range(0,16): + send_packets.append(simple_udpv6_packet(eth_dst="02:5A:B0:BE:49:51",eth_src="02:5A:B0:BE:49:52",vlan_vid=110+i*2, dl_vlan_enable=True,udp_payload="tera test")) + + exp_packets=[] + for i in range(0,16): + mac_flapping_pkt = simple_udpv6_packet(eth_dst="02:5A:B0:BE:49:52",eth_src="02:5A:B0:BE:49:51",vlan_vid=111+i*2, dl_vlan_enable=True,udp_payload="tera test") + msgpack_data = {'port': 0, 'packet_type': 0, 'ol_flags': 1, 'data_len': 100, 'pkt_len': 100, 'dir': 0, 'packet_create_from_nf': 0, + 'is_ctrlbuf': 0, 'adapter_type': 2, 'adapter_id': i, 'payload_offset': 0, 'user_0': 0, 'ef_link_id': 0, + 'traffic_link_id': 1000 + i, 'ef_peer_index': 0, 'port_ingress': 0, 'port_egress': 1, 'session_id': 0, 'cur_sid': 1000, + 'sids': [0, 0, 0, 0, 0, 1000, 500+i, 0], 'head': 7, 'tail': 6, 'capacity': 7, + 'packet': mac_flapping_pkt.__bytes__()} + binary_data = msgpack.dumps(msgpack_data) + exp_packets.append(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)) + + for i in range(0,16): + #print ("send packet %d" % i) + send_packet(self, 0, send_packets[i]) + verify_packets(self, exp_packets[i], [1]) + + finally: + mrzcpd.stop() + +@group("tera_mpack_test") +class IPv6MpackTestForEToI(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_with_msgpack,dynamic_conf_with_msgpack) + mrzcpd.start() + + send_packets=[] + for i in range(0,16): + send_packets.append(simple_udpv6_packet(eth_dst="02:5A:B0:BE:49:51",eth_src="02:5A:B0:BE:49:52",vlan_vid=111+i*2, dl_vlan_enable=True,udp_payload="tera test")) + + exp_packets=[] + for i in range(0,16): + mac_flapping_pkt = simple_udpv6_packet(eth_dst="02:5A:B0:BE:49:52",eth_src="02:5A:B0:BE:49:51",vlan_vid=110+i*2, dl_vlan_enable=True,udp_payload="tera test") + msgpack_data = {'port': 0, 'packet_type': 0, 'ol_flags': 1, 'data_len': 100, 'pkt_len': 100, 'dir': 1, 'packet_create_from_nf': 0, + 'is_ctrlbuf': 0, 'adapter_type': 2, 'adapter_id': i, 'payload_offset': 0, 'user_0': 0, 'ef_link_id': 0, + 'traffic_link_id': 1000 + i, 'ef_peer_index': 0, 'port_ingress': 0, 'port_egress': 1, 'session_id': 0, 'cur_sid': 1000, + 'sids': [0, 0, 0, 0, 0, 1000, 500+i, 0], 'head': 7, 'tail': 6, 'capacity': 7, + 'packet': mac_flapping_pkt.__bytes__()} + binary_data = msgpack.dumps(msgpack_data) + exp_packets.append(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)) + + for i in range(0,16): + #print ("send packet %d" % i) + send_packet(self, 0, send_packets[i]) + verify_packets(self, exp_packets[i], [1]) + + finally: + mrzcpd.stop() + + +start_conf_with_nf = """ +[device] +device=veth0,veth-msgpack-tx,veth-msgpack-rx +sz_tunnel=8192 +sz_buffer=0 + +[device:veth0] +in_addr=10.254.60.1 +in_mask=255.255.255.0 +gateway=10.10.1.40 +promisc=0 +mtu=1500 +driver=2 +role=3 + +[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 + +[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=32 + +[vwires] +sid_start=300 +sid_end=400 +max_rules=32 + +[tera_adapters] +sid_start=500 +sid_end=600 +max_rules=64 + +[service_lb] +sid_start=1000 +sid_end=2000 + +[tera_adapter:0] +tera_adapter_id=0 +listen_device=veth0 +vlan_int=110 +vlan_ext=111 +mac_flipping=1 + +[tera_adapter:1] +tera_adapter_id=1 +listen_device=veth0 +vlan_int=112 +vlan_ext=113 +mac_flipping=1 + +[tera_adapter:2] +tera_adapter_id=2 +listen_device=veth0 +vlan_int=114 +vlan_ext=115 +mac_flipping=1 + +[tera_adapter:3] +tera_adapter_id=3 +listen_device=veth0 +vlan_int=116 +vlan_ext=117 +mac_flipping=1 + +[tera_adapter:4] +tera_adapter_id=4 +listen_device=veth0 +vlan_int=118 +vlan_ext=119 +mac_flipping=1 + +[tera_adapter:5] +tera_adapter_id=5 +listen_device=veth0 +vlan_int=120 +vlan_ext=121 +mac_flipping=1 + +[tera_adapter:6] +tera_adapter_id=6 +listen_device=veth0 +vlan_int=122 +vlan_ext=123 +mac_flipping=1 + +[tera_adapter:7] +tera_adapter_id=7 +listen_device=veth0 +vlan_int=124 +vlan_ext=125 +mac_flipping=1 + +[tera_adapter:8] +tera_adapter_id=8 +listen_device=veth0 +vlan_int=126 +vlan_ext=127 +mac_flipping=1 + +[tera_adapter:9] +tera_adapter_id=9 +listen_device=veth0 +vlan_int=128 +vlan_ext=129 +mac_flipping=1 + +[tera_adapter:10] +tera_adapter_id=10 +listen_device=veth0 +vlan_int=130 +vlan_ext=131 +mac_flipping=1 + +[tera_adapter:11] +tera_adapter_id=11 +listen_device=veth0 +vlan_int=132 +vlan_ext=133 +mac_flipping=1 + +[tera_adapter:12] +tera_adapter_id=12 +listen_device=veth0 +vlan_int=134 +vlan_ext=135 +mac_flipping=1 + +[tera_adapter:13] +tera_adapter_id=13 +listen_device=veth0 +vlan_int=136 +vlan_ext=137 +mac_flipping=1 + +[tera_adapter:14] +tera_adapter_id=14 +listen_device=veth0 +vlan_int=138 +vlan_ext=139 +mac_flipping=1 + +[tera_adapter:15] +tera_adapter_id=15 +listen_device=veth0 +vlan_int=140 +vlan_ext=141 +mac_flipping=1 + +# load balance +[load_balance:0] +mode=balance +devices=veth-msgpack-tx,normal +""" + +dynamic_conf_with_nf = """ +[classifier_rule:0] +rule_id=1 +ruleset_type=classifier +action=nf_steering +priority=1 +category=0 +sid=1000 +""" +""" + +------------+ +-----------------------------------------+ + | PTF | | MRZCPD | + +------------+ +------------+--------+-------------------+ + | | ---> | | ---> | veth-msgpack-tx | --------+ + + veth0-ptf0 + + veth0 + +-------------------+ | + | | <--- | | <--- | veth-msgpack-rx | <-------+ + +------------+ +------------+ +-------------------+ +""" +@group("tera_nf_test") +class IPv4TestForIToE(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_with_nf,dynamic_conf_with_nf) + mrzcpd.start() + + send_packets=[] + for i in range(0,16): + send_packets.append(simple_udp_packet(eth_dst="02:5A:B0:BE:49:51",eth_src="02:5A:B0:BE:49:52",vlan_vid=110+i*2, dl_vlan_enable=True,udp_payload="tera test")) + + exp_packets=[] + for i in range(0,16): + exp_packets.append(simple_udp_packet(eth_dst="02:5A:B0:BE:49:52",eth_src="02:5A:B0:BE:49:51",vlan_vid=111+i*2, dl_vlan_enable=True,udp_payload="tera test")) + + for i in range(0,16): + #print ("send packet %d" % i) + send_packet(self, 0, send_packets[i]) + verify_packets(self, exp_packets[i], [0]) + + finally: + mrzcpd.stop() + +@group("tera_nf_test") +class IPv4TestForEToI(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_with_nf,dynamic_conf_with_nf) + mrzcpd.start() + + send_packets=[] + for i in range(0,16): + send_packets.append(simple_udp_packet(eth_dst="02:5A:B0:BE:49:51",eth_src="02:5A:B0:BE:49:52",vlan_vid=111+i*2, dl_vlan_enable=True,udp_payload="tera test")) + + exp_packets=[] + for i in range(0,16): + exp_packets.append(simple_udp_packet(eth_dst="02:5A:B0:BE:49:52",eth_src="02:5A:B0:BE:49:51",vlan_vid=110+i*2, dl_vlan_enable=True,udp_payload="tera test")) + + for i in range(0,16): + #print ("send packet %d" % i) + send_packet(self, 0, send_packets[i]) + verify_packets(self, exp_packets[i], [0]) + + finally: + mrzcpd.stop() + +@group("tera_nf_test") +class IPv6TestForIToE(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_with_nf,dynamic_conf_with_nf) + mrzcpd.start() + + send_packets=[] + for i in range(0,16): + send_packets.append(simple_udpv6_packet(eth_dst="02:5A:B0:BE:49:51",eth_src="02:5A:B0:BE:49:52",vlan_vid=110+i*2, dl_vlan_enable=True,udp_payload="tera test")) + + exp_packets=[] + for i in range(0,16): + exp_packets.append(simple_udpv6_packet(eth_dst="02:5A:B0:BE:49:52",eth_src="02:5A:B0:BE:49:51",vlan_vid=111+i*2, dl_vlan_enable=True,udp_payload="tera test")) + + for i in range(0,16): + #print ("send packet %d" % i) + send_packet(self, 0, send_packets[i]) + verify_packets(self, exp_packets[i], [0]) + + finally: + mrzcpd.stop() + +@group("tera_nf_test") +class IPv6TestForEToI(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_with_nf,dynamic_conf_with_nf) + mrzcpd.start() + + send_packets=[] + for i in range(0,16): + send_packets.append(simple_udpv6_packet(eth_dst="02:5A:B0:BE:49:51",eth_src="02:5A:B0:BE:49:52",vlan_vid=111+i*2, dl_vlan_enable=True,udp_payload="tera test")) + + exp_packets=[] + for i in range(0,16): + exp_packets.append(simple_udpv6_packet(eth_dst="02:5A:B0:BE:49:52",eth_src="02:5A:B0:BE:49:51",vlan_vid=110+i*2, dl_vlan_enable=True,udp_payload="tera test")) + + for i in range(0,16): + #print ("send packet %d" % i) + send_packet(self, 0, send_packets[i]) + verify_packets(self, exp_packets[i], [0]) + + finally: + mrzcpd.stop() + + +start_conf_with_route_ctx = """ +[device] +device=veth0,veth-msgpack-tx,veth-msgpack-rx +sz_tunnel=8192 +sz_buffer=0 + +[device:veth0] +in_addr=10.254.60.1 +in_mask=255.255.255.0 +gateway=10.10.1.40 +promisc=0 +mtu=1500 +driver=2 +role=3 + +[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=0 +route_ctx_enable=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 + +[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=32 + +[vwires] +sid_start=300 +sid_end=400 +max_rules=32 + +[tera_adapters] +sid_start=500 +sid_end=600 +max_rules=64 + +[service_lb] +sid_start=1000 +sid_end=2000 + +[tera_adapter:0] +tera_adapter_id=0 +listen_device=veth0 +vlan_int=110 +vlan_ext=111 +mac_flipping=1 + +[tera_adapter:1] +tera_adapter_id=1 +listen_device=veth0 +vlan_int=112 +vlan_ext=113 +mac_flipping=1 + +[tera_adapter:2] +tera_adapter_id=2 +listen_device=veth0 +vlan_int=114 +vlan_ext=115 +mac_flipping=1 + +[tera_adapter:3] +tera_adapter_id=3 +listen_device=veth0 +vlan_int=116 +vlan_ext=117 +mac_flipping=1 + +[tera_adapter:4] +tera_adapter_id=4 +listen_device=veth0 +vlan_int=118 +vlan_ext=119 +mac_flipping=1 + +[tera_adapter:5] +tera_adapter_id=5 +listen_device=veth0 +vlan_int=120 +vlan_ext=121 +mac_flipping=1 + +[tera_adapter:6] +tera_adapter_id=6 +listen_device=veth0 +vlan_int=122 +vlan_ext=123 +mac_flipping=1 + +[tera_adapter:7] +tera_adapter_id=7 +listen_device=veth0 +vlan_int=124 +vlan_ext=125 +mac_flipping=1 + +[tera_adapter:8] +tera_adapter_id=8 +listen_device=veth0 +vlan_int=126 +vlan_ext=127 +mac_flipping=1 + +[tera_adapter:9] +tera_adapter_id=9 +listen_device=veth0 +vlan_int=128 +vlan_ext=129 +mac_flipping=1 + +[tera_adapter:10] +tera_adapter_id=10 +listen_device=veth0 +vlan_int=130 +vlan_ext=131 +mac_flipping=1 + +[tera_adapter:11] +tera_adapter_id=11 +listen_device=veth0 +vlan_int=132 +vlan_ext=133 +mac_flipping=1 + +[tera_adapter:12] +tera_adapter_id=12 +listen_device=veth0 +vlan_int=134 +vlan_ext=135 +mac_flipping=1 + +[tera_adapter:13] +tera_adapter_id=13 +listen_device=veth0 +vlan_int=136 +vlan_ext=137 +mac_flipping=1 + +[tera_adapter:14] +tera_adapter_id=14 +listen_device=veth0 +vlan_int=138 +vlan_ext=139 +mac_flipping=1 + +[tera_adapter:15] +tera_adapter_id=15 +listen_device=veth0 +vlan_int=140 +vlan_ext=141 +mac_flipping=1 + +# load balance +[load_balance:0] +mode=balance +devices=veth-msgpack-tx,normal +""" + +dynamic_conf_with_route_ctx = """ +[classifier_rule:0] +rule_id=1 +ruleset_type=classifier +action=nf_steering +priority=1 +category=0 +sid=1000 +""" +""" + +------------+ +-----------------------------------------+ + | PTF | | MRZCPD | + +------------+ +------------+--------+-------------------+ + | | ---> | | ---> | veth-msgpack-tx | --------+ + + veth0-ptf0 + + veth0 + +-------------------+ | + | | <--- | | <--- | veth-msgpack-rx | <-------+ + +------------+ +------------+ +-------------------+ +""" +@group("tera_route_ctx_test") +class IPv4TestForRouteCtxIToE(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_with_route_ctx,dynamic_conf_with_route_ctx) + mrzcpd.start() + + send_packets=[] + for i in range(0,16): + send_packets.append(simple_vlan_udp_packet(eth_dst="02:5A:B0:BE:49:51",eth_src="02:5A:B0:BE:49:52",vlan_vid=110+i*2,udp_payload="tera test")) + + exp_packets=[] + for i in range(0,16): + exp_packets.append(simple_vlan_udp_packet(eth_dst="02:5A:B0:BE:49:52",eth_src="02:5A:B0:BE:49:51",vlan_vid=111+i*2,udp_payload="tera test")) + + for i in range(0,16): + print ("send packet %d" % i) + send_packet(self, 0, send_packets[i]) + verify_packets(self, exp_packets[i], [0]) + + finally: + mrzcpd.stop() + +@group("tera_route_ctx_test") +class IPv4TestForRouteCtxEtoI(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_with_route_ctx,dynamic_conf_with_route_ctx) + mrzcpd.start() + + send_packets=[] + for i in range(0,16): + send_packets.append(simple_vlan_udp_packet(eth_dst="02:5A:B0:BE:49:51",eth_src="02:5A:B0:BE:49:52",vlan_vid=111+i*2,udp_payload="tera test")) + + exp_packets=[] + for i in range(0,16): + exp_packets.append(simple_vlan_udp_packet(eth_dst="02:5A:B0:BE:49:52",eth_src="02:5A:B0:BE:49:51",vlan_vid=110+i*2,udp_payload="tera test")) + + for i in range(0,16): + print ("send packet %d" % i) + send_packet(self, 0, send_packets[i]) + verify_packets(self, exp_packets[i], [0]) + + finally: + mrzcpd.stop() + + +@group("tera_route_ctx_test") +class IPv6TestForRouteCtxIToE(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_with_route_ctx,dynamic_conf_with_route_ctx) + mrzcpd.start() + + send_packets=[] + for i in range(0,16): + send_packets.append(simple_udpv6_packet(eth_dst="02:5A:B0:BE:49:51",eth_src="02:5A:B0:BE:49:52",vlan_vid=110+i*2, dl_vlan_enable=True,udp_payload="tera test")) + + exp_packets=[] + for i in range(0,16): + exp_packets.append(simple_udpv6_packet(eth_dst="02:5A:B0:BE:49:52",eth_src="02:5A:B0:BE:49:51",vlan_vid=111+i*2, dl_vlan_enable=True,udp_payload="tera test")) + + for i in range(0,16): + #print ("send packet %d" % i) + send_packet(self, 0, send_packets[i]) + verify_packets(self, exp_packets[i], [0]) + + finally: + mrzcpd.stop() + +@group("tera_route_ctx_test") +class IPv6TestForRouteCtxEtoI(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_with_route_ctx,dynamic_conf_with_route_ctx) + mrzcpd.start() + + send_packets=[] + for i in range(0,16): + send_packets.append(simple_udpv6_packet(eth_dst="02:5A:B0:BE:49:51",eth_src="02:5A:B0:BE:49:52",vlan_vid=111+i*2, dl_vlan_enable=True,udp_payload="tera test")) + + exp_packets=[] + for i in range(0,16): + exp_packets.append(simple_udpv6_packet(eth_dst="02:5A:B0:BE:49:52",eth_src="02:5A:B0:BE:49:51",vlan_vid=110+i*2, dl_vlan_enable=True,udp_payload="tera test")) + + for i in range(0,16): + #print ("send packet %d" % i) + send_packet(self, 0, send_packets[i]) + verify_packets(self, exp_packets[i], [0]) + + finally: + mrzcpd.stop() + + +start_conf_with_non_contiguous_test = """ +[device] +device = veth0,veth1,veth2,veth3 +sz_tunnel = 8192 +sz_buffer = 0 + +[device:veth0] +promisc = 0 +mtu = 1500 +driver = 2 +role = 3 + +[device:veth1] +promisc = 1 +mtu = 1500 +driver=2 +role=4 + +[device:veth2] +in_addr=10.254.60.101 +in_mask=255.255.255.0 +promisc = 1 +mtu = 1500 +driver=2 +role=4 + +[device:veth3] +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 + +[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 + +# load balance +[load_balance:0] +mode=balance +devices=veth1,normal + +[load_balance:1] +mode=balance +devices=veth2,normal + +[load_balance:2] +mode=balance +devices=veth3,normal + +# adapter +[tera_adapter:0] +tera_adapter_id=0 +listen_device=veth0 +vlan_int=110 +vlan_ext=111 +mac_flipping=1 + +[tera_adapter:1] +tera_adapter_id=2 +listen_device=veth0 +vlan_int=112 +vlan_ext=113 +mac_flipping=1 + +[tera_adapter:2] +tera_adapter_id=4 +listen_device=veth0 +vlan_int=114 +vlan_ext=115 +mac_flipping=1 +""" + +dynamic_conf_with_non_contiguous_test = """ +[classifier_rule:0] +rule_id=1 +ruleset_type=classifier +action=nf_steering +priority=1 +category=0 +sid=1000 +tera_adapter_id=0 + +[classifier_rule:1] +rule_id=2 +ruleset_type=classifier +action=nf_steering +priority=1 +category=0 +sid=1001 +tera_adapter_id=2 + +[classifier_rule:2] +rule_id=2 +ruleset_type=classifier +action=nf_steering +priority=1 +category=0 +sid=1002 +tera_adapter_id=4 +""" + +""" + +--------------+ +----------++-----------+----------+ + | PTF | | Mrzcpd | + +--------------+ +----------++-----------+----------+ +------------+ + | | | | | veth1 | ---> | veth1-ptf1 | + | | | | +----------+ +------------+ + | veth0-ptf0 | ---> | veth0 | | veth2 | ---> | veth2-ptf2 | + | | | | +----------+ +------------+ + | | ---> | | | veth3 | ---> | veth3-ptf3 | + +--------------+ +----------+ +----------+ +------------+ +""" + +@group("tera_adapter_id_non_contiguous_test") +class TeraAdapterIdNonContiguousTest(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_with_non_contiguous_test,dynamic_conf_with_non_contiguous_test) + mrzcpd.start() + + send_packets=[] + for i in range(0,3): + send_packets.append(simple_vlan_udp_packet(eth_dst="02:5A:B0:BE:49:51",eth_src="02:5A:B0:BE:49:52",vlan_vid=110+i*2,udp_payload="tera test")) + + exp_packets=[] + for i in range(0,3): + exp_packets.append(simple_vlan_udp_packet(eth_dst="02:5A:B0:BE:49:52",eth_src="02:5A:B0:BE:49:51",vlan_vid=111+i*2,udp_payload="tera test")) + + for i in range(0,3): + print ("send packet %d" % i) + send_packet(self, 0, send_packets[i]) + verify_packets(self, exp_packets[i], [1+i]) + + finally: + mrzcpd.stop() diff --git a/test/ptf_test/vwire_test.py b/test/ptf_test/vwire_test.py new file mode 100644 index 0000000..3d8e7b8 --- /dev/null +++ b/test/ptf_test/vwire_test.py @@ -0,0 +1,556 @@ +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 + +[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 + +[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] +mode=balance +devices=veth2,normal + +[load_balance:1] +mode=balance +devices=veth5,normal + +[load_balance:2] +mode=balance +devices=veth8,normal + +""" + +dynamic_conf_with_non_contiguous_test = """ +[classifier_rule:0] +rule_id=1 +ruleset_type=classifier +action=nf_steering +priority=1 +category=0 +sid=1000 +vwire_id=0 + +[classifier_rule:1] +rule_id=2 +ruleset_type=classifier +action=nf_steering +priority=1 +category=0 +sid=1001 +vwire_id=2 + +[classifier_rule:2] +rule_id=2 +ruleset_type=classifier +action=nf_steering +priority=1 +category=0 +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() diff --git a/test/tera_test.py b/test/tera_test.py deleted file mode 100644 index 56b58f3..0000000 --- a/test/tera_test.py +++ /dev/null @@ -1,1898 +0,0 @@ -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 msgpack - -start_conf_disable_mac_flapping = """ -[device] -device=veth0 -sz_tunnel=8192 -sz_buffer=0 - -[device:veth0] -in_addr=10.254.60.1 -in_mask=255.255.255.0 -gateway=10.10.1.40 -promisc=0 -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 - -[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=32 - -[vwires] -sid_start=300 -sid_end=400 -max_rules=32 - -[tera_adapters] -sid_start=500 -sid_end=600 -max_rules=64 - -[service_lb] -sid_start=1000 -sid_end=2000 - -[tera_adapter:0] -tera_adapter_id=0 -listen_device=veth0 -vlan_int=110 -vlan_ext=111 -mac_flipping=0 - -""" -""" - +------------+ +-----------------------------------+ - | PTF | | MRZCPD | - +------------+ +------------+----------------------+ - | | | | Classifier miss | - | veth0-ptf0 | ------> | veth0 | -----------------+ | - | | <------ | | <----------------+ | - +------------+ +------------+----------------------+ -""" - -@group("tera_base_test") -class TestForDisableMacFlapping(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_disable_mac_flapping, "") - mrzcpd.start() - - send_pkt = simple_tcp_packet(eth_dst="02:5A:B0:BE:49:51",eth_src="02:5A:B0:BE:49:52",vlan_vid=110, dl_vlan_enable=True) - exp_pkt = simple_tcp_packet(eth_dst="02:5A:B0:BE:49:51",eth_src="02:5A:B0:BE:49:52",vlan_vid=111, dl_vlan_enable=True) - send_packet(self, 0, send_pkt) - verify_packets(self, exp_pkt, [0]) - finally: - mrzcpd.stop() - -start_conf_enable_mac_flapping = """ -[device] -device=veth1 -sz_tunnel=8192 -sz_buffer=0 - -[device:veth1] -in_addr=10.254.60.1 -in_mask=255.255.255.0 -gateway=10.10.1.40 -promisc=0 -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 - -[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=32 - -[vwires] -sid_start=300 -sid_end=400 -max_rules=32 - -[tera_adapters] -sid_start=500 -sid_end=600 -max_rules=64 - -[service_lb] -sid_start=1000 -sid_end=2000 - -[tera_adapter:0] -tera_adapter_id=0 -listen_device=veth1 -vlan_int=110 -vlan_ext=111 -mac_flipping=1 - -""" -""" - +------------+ +-----------------------------------+ - | PTF | | MRZCPD | - +------------+ +------------+----------------------+ - | | | | Classifier miss | - | veth0-ptf0 | ------> | veth0 | -----------------+ | - | | <------ | | <----------------+ | - +------------+ +------------+----------------------+ -""" -@group("tera_base_test") -class TestForEnableMacFlapping(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_enable_mac_flapping,"") - mrzcpd.start() - - send_pkt = simple_tcp_packet(eth_dst="02:5A:B0:BE:49:51",eth_src="02:5A:B0:BE:49:52",vlan_vid=110, dl_vlan_enable=True) - exp_pkt = simple_tcp_packet(eth_dst="02:5A:B0:BE:49:52",eth_src="02:5A:B0:BE:49:51",vlan_vid=111, dl_vlan_enable=True) - send_packet(self, 1, send_pkt) - verify_packets(self, exp_pkt, [1]) - finally: - mrzcpd.stop() - -start_conf_multi_entry = """ -[device] -device=veth0,veth1 -sz_tunnel=8192 -sz_buffer=0 - -[device:veth0] -in_addr=10.254.60.1 -in_mask=255.255.255.0 -gateway=10.10.1.40 -promisc=0 -mtu=1500 -driver=2 -role=3 - -[device:veth1] -promisc=0 -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 - -[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=32 - -[vwires] -sid_start=300 -sid_end=400 -max_rules=32 - -[tera_adapters] -sid_start=500 -sid_end=600 -max_rules=64 - -[service_lb] -sid_start=1000 -sid_end=2000 - -[tera_adapter:0] -tera_adapter_id=0 -listen_device=veth0 -vlan_int=110 -vlan_ext=111 -mac_flipping=1 - -[tera_adapter:1] -tera_adapter_id=1 -listen_device=veth0 -vlan_int=112 -vlan_ext=113 -mac_flipping=1 - -[tera_adapter:2] -tera_adapter_id=2 -listen_device=veth0 -vlan_int=114 -vlan_ext=115 -mac_flipping=1 - -[tera_adapter:3] -tera_adapter_id=3 -listen_device=veth0 -vlan_int=116 -vlan_ext=117 -mac_flipping=1 - -[tera_adapter:4] -tera_adapter_id=4 -listen_device=veth0 -vlan_int=118 -vlan_ext=119 -mac_flipping=1 - -[tera_adapter:5] -tera_adapter_id=5 -listen_device=veth0 -vlan_int=120 -vlan_ext=121 -mac_flipping=1 - -[tera_adapter:6] -tera_adapter_id=6 -listen_device=veth0 -vlan_int=122 -vlan_ext=123 -mac_flipping=1 - -[tera_adapter:7] -tera_adapter_id=7 -listen_device=veth0 -vlan_int=124 -vlan_ext=125 -mac_flipping=1 - -[tera_adapter:8] -tera_adapter_id=8 -listen_device=veth0 -vlan_int=126 -vlan_ext=127 -mac_flipping=1 - -[tera_adapter:9] -tera_adapter_id=9 -listen_device=veth0 -vlan_int=128 -vlan_ext=129 -mac_flipping=1 - -[tera_adapter:10] -tera_adapter_id=10 -listen_device=veth0 -vlan_int=130 -vlan_ext=131 -mac_flipping=1 - -[tera_adapter:11] -tera_adapter_id=11 -listen_device=veth0 -vlan_int=132 -vlan_ext=133 -mac_flipping=1 - -[tera_adapter:12] -tera_adapter_id=12 -listen_device=veth0 -vlan_int=134 -vlan_ext=135 -mac_flipping=1 - -[tera_adapter:13] -tera_adapter_id=13 -listen_device=veth0 -vlan_int=136 -vlan_ext=137 -mac_flipping=1 - -[tera_adapter:14] -tera_adapter_id=14 -listen_device=veth0 -vlan_int=138 -vlan_ext=139 -mac_flipping=1 - -[tera_adapter:15] -tera_adapter_id=15 -listen_device=veth0 -vlan_int=140 -vlan_ext=141 -mac_flipping=1 -""" -""" - +------------+ +-----------------------------------+ - | PTF | | MRZCPD | - +------------+ +------------+----------------------+ - | | | | Classifier miss | - | veth0-ptf0 | ------> | veth0 | -----------------+ | - | | <------ | | <----------------+ | - +------------+ +------------+----------------------+ -""" -@group("tera_base_test") -class IPv4TestForMultiEntry(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_multi_entry,"") - mrzcpd.start() - - send_packets=[] - for i in range(0,16): - send_packets.append(simple_tcp_packet(eth_dst="02:5A:B0:BE:49:51",eth_src="02:5A:B0:BE:49:52",vlan_vid=110+i*2, dl_vlan_enable=True)) - - exp_packets=[] - for i in range(0,16): - exp_packets.append(simple_tcp_packet(eth_dst="02:5A:B0:BE:49:52",eth_src="02:5A:B0:BE:49:51",vlan_vid=111+i*2, dl_vlan_enable=True)) - - for i in range(0,16): - send_packet(self, 0, send_packets[i]) - verify_packets(self, exp_packets[i], [0]) - finally: - mrzcpd.stop() - -""" - +------------+ +-----------------------------------+ - | PTF | | MRZCPD | - +------------+ +------------+----------------------+ - | | | | Classifier miss | - | veth0-ptf0 | ------> | veth0 | -----------------+ | - | | <------ | | <----------------+ | - +------------+ +------------+----------------------+ -""" -@group("tera_base_test") -class IPv4TestForUnmatchedRules(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_multi_entry,"") - mrzcpd.start() - - send_packets=[] - for i in range(0,16): - send_packets.append(simple_tcp_packet(eth_dst="02:5A:B0:BE:49:51",eth_src="02:5A:B0:BE:49:52",vlan_vid=210+i*2, dl_vlan_enable=True)) - - exp_packets=[] - for i in range(0,16): - exp_packets.append(simple_tcp_packet(eth_dst="02:5A:B0:BE:49:52",eth_src="02:5A:B0:BE:49:51",vlan_vid=211+i*2, dl_vlan_enable=True)) - - for i in range(0,16): - send_packet(self, 0, send_packets[i]) - #verify_no_packet(self, exp_packets[i], 1, timeout=1) - verify_no_other_packets(self, timeout=1) - - finally: - mrzcpd.stop() - -""" - +------------+ +-----------------------------------+ - | PTF | | MRZCPD | - +------------+ +------------+----------------------+ - | | | | Classifier miss | - | veth0-ptf0 | ------> | veth0 | -----------------+ | - | | <------ | | <----------------+ | - +------------+ +------------+----------------------+ -""" -@group("tera_base_test") -class IPv6TestForMultiEntry(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_multi_entry,"") - mrzcpd.start() - - send_packets=[] - for i in range(0,16): - send_packets.append(simple_tcpv6_packet(eth_dst="02:5A:B0:BE:49:51",eth_src="02:5A:B0:BE:49:52",vlan_vid=110+i*2, dl_vlan_enable=True)) - - exp_packets=[] - for i in range(0,16): - exp_packets.append(simple_tcpv6_packet(eth_dst="02:5A:B0:BE:49:52",eth_src="02:5A:B0:BE:49:51",vlan_vid=111+i*2, dl_vlan_enable=True)) - - for i in range(0,16): - send_packet(self, 0, send_packets[i]) - verify_packets(self, exp_packets[i], [0]) - finally: - mrzcpd.stop() - -""" - +------------+ +-----------------------+ - | PTF | | MRZCPD | - +------------+ +------------+----------+ - | | | | Drop | - | veth0-ptf0 | ------> | veth0 | | - +------------+ +------------+----------+ -""" -@group("tera_base_test") -class IPv6TestForUnmatchedRules(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_multi_entry,"") - mrzcpd.start() - - send_packets=[] - for i in range(0,16): - send_packets.append(simple_tcpv6_packet(eth_dst="02:5A:B0:BE:49:51",eth_src="02:5A:B0:BE:49:52",vlan_vid=210+i*2, dl_vlan_enable=True)) - - exp_packets=[] - for i in range(0,16): - exp_packets.append(simple_tcpv6_packet(eth_dst="02:5A:B0:BE:49:52",eth_src="02:5A:B0:BE:49:51",vlan_vid=211+i*2, dl_vlan_enable=True)) - - for i in range(0,16): - send_packet(self, 0, send_packets[i]) - #verify_no_packet(self, exp_packets[i], 1, timeout=1) - verify_no_other_packets(self, timeout=1) - - finally: - mrzcpd.stop() - - -start_conf_with_msgpack = """ -[device] -device=veth0,veth1 -sz_tunnel=8192 -sz_buffer=0 - -[device:veth0] -in_addr=10.254.60.1 -in_mask=255.255.255.0 -gateway=10.10.1.40 -promisc=0 -mtu=1500 -driver=2 -role=3 - -[device:veth1] -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 - -[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=32 - -[vwires] -sid_start=300 -sid_end=400 -max_rules=32 - -[tera_adapters] -sid_start=500 -sid_end=600 -max_rules=64 - -[service_lb] -sid_start=1000 -sid_end=2000 - -[tera_adapter:0] -tera_adapter_id=0 -listen_device=veth0 -vlan_int=110 -vlan_ext=111 -mac_flipping=1 - -[tera_adapter:1] -tera_adapter_id=1 -listen_device=veth0 -vlan_int=112 -vlan_ext=113 -mac_flipping=1 - -[tera_adapter:2] -tera_adapter_id=2 -listen_device=veth0 -vlan_int=114 -vlan_ext=115 -mac_flipping=1 - -[tera_adapter:3] -tera_adapter_id=3 -listen_device=veth0 -vlan_int=116 -vlan_ext=117 -mac_flipping=1 - -[tera_adapter:4] -tera_adapter_id=4 -listen_device=veth0 -vlan_int=118 -vlan_ext=119 -mac_flipping=1 - -[tera_adapter:5] -tera_adapter_id=5 -listen_device=veth0 -vlan_int=120 -vlan_ext=121 -mac_flipping=1 - -[tera_adapter:6] -tera_adapter_id=6 -listen_device=veth0 -vlan_int=122 -vlan_ext=123 -mac_flipping=1 - -[tera_adapter:7] -tera_adapter_id=7 -listen_device=veth0 -vlan_int=124 -vlan_ext=125 -mac_flipping=1 - -[tera_adapter:8] -tera_adapter_id=8 -listen_device=veth0 -vlan_int=126 -vlan_ext=127 -mac_flipping=1 - -[tera_adapter:9] -tera_adapter_id=9 -listen_device=veth0 -vlan_int=128 -vlan_ext=129 -mac_flipping=1 - -[tera_adapter:10] -tera_adapter_id=10 -listen_device=veth0 -vlan_int=130 -vlan_ext=131 -mac_flipping=1 - -[tera_adapter:11] -tera_adapter_id=11 -listen_device=veth0 -vlan_int=132 -vlan_ext=133 -mac_flipping=1 - -[tera_adapter:12] -tera_adapter_id=12 -listen_device=veth0 -vlan_int=134 -vlan_ext=135 -mac_flipping=1 - -[tera_adapter:13] -tera_adapter_id=13 -listen_device=veth0 -vlan_int=136 -vlan_ext=137 -mac_flipping=1 - -[tera_adapter:14] -tera_adapter_id=14 -listen_device=veth0 -vlan_int=138 -vlan_ext=139 -mac_flipping=1 - -[tera_adapter:15] -tera_adapter_id=15 -listen_device=veth0 -vlan_int=140 -vlan_ext=141 -mac_flipping=1 - -# load balance -[load_balance:0] -mode=balance -devices=veth1,normal - -[link_db:0] -type=2 -traffic_link_id=1000 -tera_adapter_id=0 - -[link_db:1] -type=2 -traffic_link_id=1001 -tera_adapter_id=1 - -[link_db:2] -type=2 -traffic_link_id=1002 -tera_adapter_id=2 - -[link_db:3] -type=2 -traffic_link_id=1003 -tera_adapter_id=3 - -[link_db:4] -type=2 -traffic_link_id=1004 -tera_adapter_id=4 - -[link_db:5] -type=2 -traffic_link_id=1005 -tera_adapter_id=5 - -[link_db:6] -type=2 -traffic_link_id=1006 -tera_adapter_id=6 - -[link_db:7] -type=2 -traffic_link_id=1007 -tera_adapter_id=7 - -[link_db:8] -type=2 -traffic_link_id=1008 -tera_adapter_id=8 - -[link_db:9] -type=2 -traffic_link_id=1009 -tera_adapter_id=9 - -[link_db:10] -type=2 -traffic_link_id=1010 -tera_adapter_id=10 - -[link_db:11] -type=2 -traffic_link_id=1011 -tera_adapter_id=11 - -[link_db:12] -type=2 -traffic_link_id=1012 -tera_adapter_id=12 - -[link_db:13] -type=2 -traffic_link_id=1013 -tera_adapter_id=13 - -[link_db:14] -type=2 -traffic_link_id=1014 -tera_adapter_id=14 - -[link_db:15] -type=2 -traffic_link_id=1015 -tera_adapter_id=15 -""" - -dynamic_conf_with_msgpack = """ -[classifier_rule:0] -rule_id=1 -ruleset_type=classifier -action=nf_steering -priority=1 -category=0 -sid=1000 -""" - -""" - +------------+ +------------------------------------------+ +------------+ - | PTF | | MRZCPD | | PTF | - +------------+ +------------+--------+--------------------+ +------------+ - | veth0-ptf0 | ---> | veth0 | ---> | veth1 (serialize) | ---> | veth1-ptf1 | - +------------+ +------------+ +--------------------+ +------------+ -""" -@group("tera_mpack_test") -class IPv4MpackTestForIToE(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_with_msgpack,dynamic_conf_with_msgpack) - mrzcpd.start() - - send_packets=[] - for i in range(0,16): - send_packets.append(simple_udp_packet(eth_dst="02:5A:B0:BE:49:51",eth_src="02:5A:B0:BE:49:52",vlan_vid=110+i*2, dl_vlan_enable=True,udp_payload="tera test")) - - exp_packets=[] - for i in range(0,16): - mac_flapping_pkt = simple_udp_packet(eth_dst="02:5A:B0:BE:49:52",eth_src="02:5A:B0:BE:49:51",vlan_vid=111+i*2, dl_vlan_enable=True,udp_payload="tera test") - msgpack_data = {'port': 0, 'packet_type': 0, 'ol_flags': 1, 'data_len': 100, 'pkt_len': 100, 'dir': 0, 'packet_create_from_nf': 0, - 'is_ctrlbuf': 0, 'adapter_type': 2, 'adapter_id': i, 'payload_offset': 0, 'user_0': 0, 'ef_link_id': 0, - 'traffic_link_id': 1000 + i, 'ef_peer_index': 0, 'port_ingress': 0, 'port_egress': 1, 'session_id': 0, 'cur_sid': 1000, - 'sids': [0, 0, 0, 0, 0, 1000, 500+i, 0], 'head': 7, 'tail': 6, 'capacity': 7, - 'packet': mac_flapping_pkt.__bytes__()} - binary_data = msgpack.dumps(msgpack_data) - exp_packets.append(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)) - - for i in range(0,16): - #print ("send packet %d" % i) - send_packet(self, 0, send_packets[i]) - verify_packets(self, exp_packets[i], [1]) - - finally: - mrzcpd.stop() - -@group("tera_mpack_test") -class IPv4MpackTestForEToI(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_with_msgpack,dynamic_conf_with_msgpack) - mrzcpd.start() - - send_packets=[] - for i in range(0,16): - send_packets.append(simple_udp_packet(eth_dst="02:5A:B0:BE:49:51",eth_src="02:5A:B0:BE:49:52",vlan_vid=111+i*2, dl_vlan_enable=True,udp_payload="tera test")) - - exp_packets=[] - for i in range(0,16): - mac_flapping_pkt = simple_udp_packet(eth_dst="02:5A:B0:BE:49:52",eth_src="02:5A:B0:BE:49:51",vlan_vid=110+i*2, dl_vlan_enable=True,udp_payload="tera test") - msgpack_data = {'port': 0, 'packet_type': 0, 'ol_flags': 1, 'data_len': 100, 'pkt_len': 100, 'dir': 1, 'packet_create_from_nf': 0, - 'is_ctrlbuf': 0, 'adapter_type': 2, 'adapter_id': i, 'payload_offset': 0, 'user_0': 0, 'ef_link_id': 0, - 'traffic_link_id': 1000 + i, 'ef_peer_index': 0, 'port_ingress': 0, 'port_egress': 1, 'session_id': 0, 'cur_sid': 1000, - 'sids': [0, 0, 0, 0, 0, 1000, 500+i, 0], 'head': 7, 'tail': 6, 'capacity': 7, - 'packet': mac_flapping_pkt.__bytes__()} - binary_data = msgpack.dumps(msgpack_data) - exp_packets.append(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)) - - for i in range(0,16): - #print ("send packet %d" % i) - send_packet(self, 0, send_packets[i]) - verify_packets(self, exp_packets[i], [1]) - - finally: - mrzcpd.stop() - -@group("tera_mpack_test") -class IPv6MpackTestForIToE(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_with_msgpack,dynamic_conf_with_msgpack) - mrzcpd.start() - - send_packets=[] - for i in range(0,16): - send_packets.append(simple_udpv6_packet(eth_dst="02:5A:B0:BE:49:51",eth_src="02:5A:B0:BE:49:52",vlan_vid=110+i*2, dl_vlan_enable=True,udp_payload="tera test")) - - exp_packets=[] - for i in range(0,16): - mac_flapping_pkt = simple_udpv6_packet(eth_dst="02:5A:B0:BE:49:52",eth_src="02:5A:B0:BE:49:51",vlan_vid=111+i*2, dl_vlan_enable=True,udp_payload="tera test") - msgpack_data = {'port': 0, 'packet_type': 0, 'ol_flags': 1, 'data_len': 100, 'pkt_len': 100, 'dir': 0, 'packet_create_from_nf': 0, - 'is_ctrlbuf': 0, 'adapter_type': 2, 'adapter_id': i, 'payload_offset': 0, 'user_0': 0, 'ef_link_id': 0, - 'traffic_link_id': 1000 + i, 'ef_peer_index': 0, 'port_ingress': 0, 'port_egress': 1, 'session_id': 0, 'cur_sid': 1000, - 'sids': [0, 0, 0, 0, 0, 1000, 500+i, 0], 'head': 7, 'tail': 6, 'capacity': 7, - 'packet': mac_flapping_pkt.__bytes__()} - binary_data = msgpack.dumps(msgpack_data) - exp_packets.append(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)) - - for i in range(0,16): - #print ("send packet %d" % i) - send_packet(self, 0, send_packets[i]) - verify_packets(self, exp_packets[i], [1]) - - finally: - mrzcpd.stop() - -@group("tera_mpack_test") -class IPv6MpackTestForEToI(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_with_msgpack,dynamic_conf_with_msgpack) - mrzcpd.start() - - send_packets=[] - for i in range(0,16): - send_packets.append(simple_udpv6_packet(eth_dst="02:5A:B0:BE:49:51",eth_src="02:5A:B0:BE:49:52",vlan_vid=111+i*2, dl_vlan_enable=True,udp_payload="tera test")) - - exp_packets=[] - for i in range(0,16): - mac_flapping_pkt = simple_udpv6_packet(eth_dst="02:5A:B0:BE:49:52",eth_src="02:5A:B0:BE:49:51",vlan_vid=110+i*2, dl_vlan_enable=True,udp_payload="tera test") - msgpack_data = {'port': 0, 'packet_type': 0, 'ol_flags': 1, 'data_len': 100, 'pkt_len': 100, 'dir': 1, 'packet_create_from_nf': 0, - 'is_ctrlbuf': 0, 'adapter_type': 2, 'adapter_id': i, 'payload_offset': 0, 'user_0': 0, 'ef_link_id': 0, - 'traffic_link_id': 1000 + i, 'ef_peer_index': 0, 'port_ingress': 0, 'port_egress': 1, 'session_id': 0, 'cur_sid': 1000, - 'sids': [0, 0, 0, 0, 0, 1000, 500+i, 0], 'head': 7, 'tail': 6, 'capacity': 7, - 'packet': mac_flapping_pkt.__bytes__()} - binary_data = msgpack.dumps(msgpack_data) - exp_packets.append(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)) - - for i in range(0,16): - #print ("send packet %d" % i) - send_packet(self, 0, send_packets[i]) - verify_packets(self, exp_packets[i], [1]) - - finally: - mrzcpd.stop() - - -start_conf_with_nf = """ -[device] -device=veth0,veth-msgpack-tx,veth-msgpack-rx -sz_tunnel=8192 -sz_buffer=0 - -[device:veth0] -in_addr=10.254.60.1 -in_mask=255.255.255.0 -gateway=10.10.1.40 -promisc=0 -mtu=1500 -driver=2 -role=3 - -[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 - -[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=32 - -[vwires] -sid_start=300 -sid_end=400 -max_rules=32 - -[tera_adapters] -sid_start=500 -sid_end=600 -max_rules=64 - -[service_lb] -sid_start=1000 -sid_end=2000 - -[tera_adapter:0] -tera_adapter_id=0 -listen_device=veth0 -vlan_int=110 -vlan_ext=111 -mac_flipping=1 - -[tera_adapter:1] -tera_adapter_id=1 -listen_device=veth0 -vlan_int=112 -vlan_ext=113 -mac_flipping=1 - -[tera_adapter:2] -tera_adapter_id=2 -listen_device=veth0 -vlan_int=114 -vlan_ext=115 -mac_flipping=1 - -[tera_adapter:3] -tera_adapter_id=3 -listen_device=veth0 -vlan_int=116 -vlan_ext=117 -mac_flipping=1 - -[tera_adapter:4] -tera_adapter_id=4 -listen_device=veth0 -vlan_int=118 -vlan_ext=119 -mac_flipping=1 - -[tera_adapter:5] -tera_adapter_id=5 -listen_device=veth0 -vlan_int=120 -vlan_ext=121 -mac_flipping=1 - -[tera_adapter:6] -tera_adapter_id=6 -listen_device=veth0 -vlan_int=122 -vlan_ext=123 -mac_flipping=1 - -[tera_adapter:7] -tera_adapter_id=7 -listen_device=veth0 -vlan_int=124 -vlan_ext=125 -mac_flipping=1 - -[tera_adapter:8] -tera_adapter_id=8 -listen_device=veth0 -vlan_int=126 -vlan_ext=127 -mac_flipping=1 - -[tera_adapter:9] -tera_adapter_id=9 -listen_device=veth0 -vlan_int=128 -vlan_ext=129 -mac_flipping=1 - -[tera_adapter:10] -tera_adapter_id=10 -listen_device=veth0 -vlan_int=130 -vlan_ext=131 -mac_flipping=1 - -[tera_adapter:11] -tera_adapter_id=11 -listen_device=veth0 -vlan_int=132 -vlan_ext=133 -mac_flipping=1 - -[tera_adapter:12] -tera_adapter_id=12 -listen_device=veth0 -vlan_int=134 -vlan_ext=135 -mac_flipping=1 - -[tera_adapter:13] -tera_adapter_id=13 -listen_device=veth0 -vlan_int=136 -vlan_ext=137 -mac_flipping=1 - -[tera_adapter:14] -tera_adapter_id=14 -listen_device=veth0 -vlan_int=138 -vlan_ext=139 -mac_flipping=1 - -[tera_adapter:15] -tera_adapter_id=15 -listen_device=veth0 -vlan_int=140 -vlan_ext=141 -mac_flipping=1 - -# load balance -[load_balance:0] -mode=balance -devices=veth-msgpack-tx,normal -""" - -dynamic_conf_with_nf = """ -[classifier_rule:0] -rule_id=1 -ruleset_type=classifier -action=nf_steering -priority=1 -category=0 -sid=1000 -""" -""" - +------------+ +-----------------------------------------+ - | PTF | | MRZCPD | - +------------+ +------------+--------+-------------------+ - | | ---> | | ---> | veth-msgpack-tx | --------+ - + veth0-ptf0 + + veth0 + +-------------------+ | - | | <--- | | <--- | veth-msgpack-rx | <-------+ - +------------+ +------------+ +-------------------+ -""" -@group("tera_nf_test") -class IPv4TestForIToE(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_with_nf,dynamic_conf_with_nf) - mrzcpd.start() - - send_packets=[] - for i in range(0,16): - send_packets.append(simple_udp_packet(eth_dst="02:5A:B0:BE:49:51",eth_src="02:5A:B0:BE:49:52",vlan_vid=110+i*2, dl_vlan_enable=True,udp_payload="tera test")) - - exp_packets=[] - for i in range(0,16): - exp_packets.append(simple_udp_packet(eth_dst="02:5A:B0:BE:49:52",eth_src="02:5A:B0:BE:49:51",vlan_vid=111+i*2, dl_vlan_enable=True,udp_payload="tera test")) - - for i in range(0,16): - #print ("send packet %d" % i) - send_packet(self, 0, send_packets[i]) - verify_packets(self, exp_packets[i], [0]) - - finally: - mrzcpd.stop() - -@group("tera_nf_test") -class IPv4TestForEToI(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_with_nf,dynamic_conf_with_nf) - mrzcpd.start() - - send_packets=[] - for i in range(0,16): - send_packets.append(simple_udp_packet(eth_dst="02:5A:B0:BE:49:51",eth_src="02:5A:B0:BE:49:52",vlan_vid=111+i*2, dl_vlan_enable=True,udp_payload="tera test")) - - exp_packets=[] - for i in range(0,16): - exp_packets.append(simple_udp_packet(eth_dst="02:5A:B0:BE:49:52",eth_src="02:5A:B0:BE:49:51",vlan_vid=110+i*2, dl_vlan_enable=True,udp_payload="tera test")) - - for i in range(0,16): - #print ("send packet %d" % i) - send_packet(self, 0, send_packets[i]) - verify_packets(self, exp_packets[i], [0]) - - finally: - mrzcpd.stop() - -@group("tera_nf_test") -class IPv6TestForIToE(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_with_nf,dynamic_conf_with_nf) - mrzcpd.start() - - send_packets=[] - for i in range(0,16): - send_packets.append(simple_udpv6_packet(eth_dst="02:5A:B0:BE:49:51",eth_src="02:5A:B0:BE:49:52",vlan_vid=110+i*2, dl_vlan_enable=True,udp_payload="tera test")) - - exp_packets=[] - for i in range(0,16): - exp_packets.append(simple_udpv6_packet(eth_dst="02:5A:B0:BE:49:52",eth_src="02:5A:B0:BE:49:51",vlan_vid=111+i*2, dl_vlan_enable=True,udp_payload="tera test")) - - for i in range(0,16): - #print ("send packet %d" % i) - send_packet(self, 0, send_packets[i]) - verify_packets(self, exp_packets[i], [0]) - - finally: - mrzcpd.stop() - -@group("tera_nf_test") -class IPv6TestForEToI(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_with_nf,dynamic_conf_with_nf) - mrzcpd.start() - - send_packets=[] - for i in range(0,16): - send_packets.append(simple_udpv6_packet(eth_dst="02:5A:B0:BE:49:51",eth_src="02:5A:B0:BE:49:52",vlan_vid=111+i*2, dl_vlan_enable=True,udp_payload="tera test")) - - exp_packets=[] - for i in range(0,16): - exp_packets.append(simple_udpv6_packet(eth_dst="02:5A:B0:BE:49:52",eth_src="02:5A:B0:BE:49:51",vlan_vid=110+i*2, dl_vlan_enable=True,udp_payload="tera test")) - - for i in range(0,16): - #print ("send packet %d" % i) - send_packet(self, 0, send_packets[i]) - verify_packets(self, exp_packets[i], [0]) - - finally: - mrzcpd.stop() - - -start_conf_with_route_ctx = """ -[device] -device=veth0,veth-msgpack-tx,veth-msgpack-rx -sz_tunnel=8192 -sz_buffer=0 - -[device:veth0] -in_addr=10.254.60.1 -in_mask=255.255.255.0 -gateway=10.10.1.40 -promisc=0 -mtu=1500 -driver=2 -role=3 - -[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=0 -route_ctx_enable=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 - -[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=32 - -[vwires] -sid_start=300 -sid_end=400 -max_rules=32 - -[tera_adapters] -sid_start=500 -sid_end=600 -max_rules=64 - -[service_lb] -sid_start=1000 -sid_end=2000 - -[tera_adapter:0] -tera_adapter_id=0 -listen_device=veth0 -vlan_int=110 -vlan_ext=111 -mac_flipping=1 - -[tera_adapter:1] -tera_adapter_id=1 -listen_device=veth0 -vlan_int=112 -vlan_ext=113 -mac_flipping=1 - -[tera_adapter:2] -tera_adapter_id=2 -listen_device=veth0 -vlan_int=114 -vlan_ext=115 -mac_flipping=1 - -[tera_adapter:3] -tera_adapter_id=3 -listen_device=veth0 -vlan_int=116 -vlan_ext=117 -mac_flipping=1 - -[tera_adapter:4] -tera_adapter_id=4 -listen_device=veth0 -vlan_int=118 -vlan_ext=119 -mac_flipping=1 - -[tera_adapter:5] -tera_adapter_id=5 -listen_device=veth0 -vlan_int=120 -vlan_ext=121 -mac_flipping=1 - -[tera_adapter:6] -tera_adapter_id=6 -listen_device=veth0 -vlan_int=122 -vlan_ext=123 -mac_flipping=1 - -[tera_adapter:7] -tera_adapter_id=7 -listen_device=veth0 -vlan_int=124 -vlan_ext=125 -mac_flipping=1 - -[tera_adapter:8] -tera_adapter_id=8 -listen_device=veth0 -vlan_int=126 -vlan_ext=127 -mac_flipping=1 - -[tera_adapter:9] -tera_adapter_id=9 -listen_device=veth0 -vlan_int=128 -vlan_ext=129 -mac_flipping=1 - -[tera_adapter:10] -tera_adapter_id=10 -listen_device=veth0 -vlan_int=130 -vlan_ext=131 -mac_flipping=1 - -[tera_adapter:11] -tera_adapter_id=11 -listen_device=veth0 -vlan_int=132 -vlan_ext=133 -mac_flipping=1 - -[tera_adapter:12] -tera_adapter_id=12 -listen_device=veth0 -vlan_int=134 -vlan_ext=135 -mac_flipping=1 - -[tera_adapter:13] -tera_adapter_id=13 -listen_device=veth0 -vlan_int=136 -vlan_ext=137 -mac_flipping=1 - -[tera_adapter:14] -tera_adapter_id=14 -listen_device=veth0 -vlan_int=138 -vlan_ext=139 -mac_flipping=1 - -[tera_adapter:15] -tera_adapter_id=15 -listen_device=veth0 -vlan_int=140 -vlan_ext=141 -mac_flipping=1 - -# load balance -[load_balance:0] -mode=balance -devices=veth-msgpack-tx,normal -""" - -dynamic_conf_with_route_ctx = """ -[classifier_rule:0] -rule_id=1 -ruleset_type=classifier -action=nf_steering -priority=1 -category=0 -sid=1000 -""" -""" - +------------+ +-----------------------------------------+ - | PTF | | MRZCPD | - +------------+ +------------+--------+-------------------+ - | | ---> | | ---> | veth-msgpack-tx | --------+ - + veth0-ptf0 + + veth0 + +-------------------+ | - | | <--- | | <--- | veth-msgpack-rx | <-------+ - +------------+ +------------+ +-------------------+ -""" -@group("tera_route_ctx_test") -class IPv4TestForRouteCtxIToE(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_with_route_ctx,dynamic_conf_with_route_ctx) - mrzcpd.start() - - send_packets=[] - for i in range(0,16): - send_packets.append(simple_vlan_udp_packet(eth_dst="02:5A:B0:BE:49:51",eth_src="02:5A:B0:BE:49:52",vlan_vid=110+i*2,udp_payload="tera test")) - - exp_packets=[] - for i in range(0,16): - exp_packets.append(simple_vlan_udp_packet(eth_dst="02:5A:B0:BE:49:52",eth_src="02:5A:B0:BE:49:51",vlan_vid=111+i*2,udp_payload="tera test")) - - for i in range(0,16): - print ("send packet %d" % i) - send_packet(self, 0, send_packets[i]) - verify_packets(self, exp_packets[i], [0]) - - finally: - mrzcpd.stop() - -@group("tera_route_ctx_test") -class IPv4TestForRouteCtxEtoI(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_with_route_ctx,dynamic_conf_with_route_ctx) - mrzcpd.start() - - send_packets=[] - for i in range(0,16): - send_packets.append(simple_vlan_udp_packet(eth_dst="02:5A:B0:BE:49:51",eth_src="02:5A:B0:BE:49:52",vlan_vid=111+i*2,udp_payload="tera test")) - - exp_packets=[] - for i in range(0,16): - exp_packets.append(simple_vlan_udp_packet(eth_dst="02:5A:B0:BE:49:52",eth_src="02:5A:B0:BE:49:51",vlan_vid=110+i*2,udp_payload="tera test")) - - for i in range(0,16): - print ("send packet %d" % i) - send_packet(self, 0, send_packets[i]) - verify_packets(self, exp_packets[i], [0]) - - finally: - mrzcpd.stop() - - -@group("tera_route_ctx_test") -class IPv6TestForRouteCtxIToE(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_with_route_ctx,dynamic_conf_with_route_ctx) - mrzcpd.start() - - send_packets=[] - for i in range(0,16): - send_packets.append(simple_udpv6_packet(eth_dst="02:5A:B0:BE:49:51",eth_src="02:5A:B0:BE:49:52",vlan_vid=110+i*2, dl_vlan_enable=True,udp_payload="tera test")) - - exp_packets=[] - for i in range(0,16): - exp_packets.append(simple_udpv6_packet(eth_dst="02:5A:B0:BE:49:52",eth_src="02:5A:B0:BE:49:51",vlan_vid=111+i*2, dl_vlan_enable=True,udp_payload="tera test")) - - for i in range(0,16): - #print ("send packet %d" % i) - send_packet(self, 0, send_packets[i]) - verify_packets(self, exp_packets[i], [0]) - - finally: - mrzcpd.stop() - -@group("tera_route_ctx_test") -class IPv6TestForRouteCtxEtoI(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_with_route_ctx,dynamic_conf_with_route_ctx) - mrzcpd.start() - - send_packets=[] - for i in range(0,16): - send_packets.append(simple_udpv6_packet(eth_dst="02:5A:B0:BE:49:51",eth_src="02:5A:B0:BE:49:52",vlan_vid=111+i*2, dl_vlan_enable=True,udp_payload="tera test")) - - exp_packets=[] - for i in range(0,16): - exp_packets.append(simple_udpv6_packet(eth_dst="02:5A:B0:BE:49:52",eth_src="02:5A:B0:BE:49:51",vlan_vid=110+i*2, dl_vlan_enable=True,udp_payload="tera test")) - - for i in range(0,16): - #print ("send packet %d" % i) - send_packet(self, 0, send_packets[i]) - verify_packets(self, exp_packets[i], [0]) - - finally: - mrzcpd.stop() - - -start_conf_with_non_contiguous_test = """ -[device] -device = veth0,veth1,veth2,veth3 -sz_tunnel = 8192 -sz_buffer = 0 - -[device:veth0] -promisc = 0 -mtu = 1500 -driver = 2 -role = 3 - -[device:veth1] -promisc = 1 -mtu = 1500 -driver=2 -role=4 - -[device:veth2] -in_addr=10.254.60.101 -in_mask=255.255.255.0 -promisc = 1 -mtu = 1500 -driver=2 -role=4 - -[device:veth3] -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 - -[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 - -# load balance -[load_balance:0] -mode=balance -devices=veth1,normal - -[load_balance:1] -mode=balance -devices=veth2,normal - -[load_balance:2] -mode=balance -devices=veth3,normal - -# adapter -[tera_adapter:0] -tera_adapter_id=0 -listen_device=veth0 -vlan_int=110 -vlan_ext=111 -mac_flipping=1 - -[tera_adapter:1] -tera_adapter_id=2 -listen_device=veth0 -vlan_int=112 -vlan_ext=113 -mac_flipping=1 - -[tera_adapter:2] -tera_adapter_id=4 -listen_device=veth0 -vlan_int=114 -vlan_ext=115 -mac_flipping=1 -""" - -dynamic_conf_with_non_contiguous_test = """ -[classifier_rule:0] -rule_id=1 -ruleset_type=classifier -action=nf_steering -priority=1 -category=0 -sid=1000 -tera_adapter_id=0 - -[classifier_rule:1] -rule_id=2 -ruleset_type=classifier -action=nf_steering -priority=1 -category=0 -sid=1001 -tera_adapter_id=2 - -[classifier_rule:2] -rule_id=2 -ruleset_type=classifier -action=nf_steering -priority=1 -category=0 -sid=1002 -tera_adapter_id=4 -""" - -""" - +--------------+ +----------++-----------+----------+ - | PTF | | Mrzcpd | - +--------------+ +----------++-----------+----------+ +------------+ - | | | | | veth1 | ---> | veth1-ptf1 | - | | | | +----------+ +------------+ - | veth0-ptf0 | ---> | veth0 | | veth2 | ---> | veth2-ptf2 | - | | | | +----------+ +------------+ - | | ---> | | | veth3 | ---> | veth3-ptf3 | - +--------------+ +----------+ +----------+ +------------+ -""" - -@group("tera_adapter_id_non_contiguous_test") -class TeraAdapterIdNonContiguousTest(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_with_non_contiguous_test,dynamic_conf_with_non_contiguous_test) - mrzcpd.start() - - send_packets=[] - for i in range(0,3): - send_packets.append(simple_vlan_udp_packet(eth_dst="02:5A:B0:BE:49:51",eth_src="02:5A:B0:BE:49:52",vlan_vid=110+i*2,udp_payload="tera test")) - - exp_packets=[] - for i in range(0,3): - exp_packets.append(simple_vlan_udp_packet(eth_dst="02:5A:B0:BE:49:52",eth_src="02:5A:B0:BE:49:51",vlan_vid=111+i*2,udp_payload="tera test")) - - for i in range(0,3): - print ("send packet %d" % i) - send_packet(self, 0, send_packets[i]) - verify_packets(self, exp_packets[i], [1+i]) - - finally: - mrzcpd.stop() diff --git a/test/vwire_test.py b/test/vwire_test.py deleted file mode 100644 index 3d8e7b8..0000000 --- a/test/vwire_test.py +++ /dev/null @@ -1,556 +0,0 @@ -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 - -[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 - -[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] -mode=balance -devices=veth2,normal - -[load_balance:1] -mode=balance -devices=veth5,normal - -[load_balance:2] -mode=balance -devices=veth8,normal - -""" - -dynamic_conf_with_non_contiguous_test = """ -[classifier_rule:0] -rule_id=1 -ruleset_type=classifier -action=nf_steering -priority=1 -category=0 -sid=1000 -vwire_id=0 - -[classifier_rule:1] -rule_id=2 -ruleset_type=classifier -action=nf_steering -priority=1 -category=0 -sid=1001 -vwire_id=2 - -[classifier_rule:2] -rule_id=2 -ruleset_type=classifier -action=nf_steering -priority=1 -category=0 -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() -- cgit v1.2.3