On Fri, Feb 13, 2026 at 2:36 PM Andrew Bailey <[email protected]> wrote:
>
> Add cryptodev performance test suite. This test covers throughput
> performance metrics of supplied crypto devices using the
> dpdk-test-crypto-perf application. The results of this application will
> be compared against user supplied performance metrics and fail if signs
> of regression are apparent.
>
> Signed-off-by: Andrew Bailey <[email protected]>
> ---
> .../tests.TestSuite_cryptodev_throughput.rst | 8 +
> dts/configurations/tests_config.example.yaml | 8 +
> dts/tests/TestSuite_cryptodev_throughput.py | 690 ++++++++++++++++++
> 3 files changed, 706 insertions(+)
> create mode 100644 doc/api/dts/tests.TestSuite_cryptodev_throughput.rst
> create mode 100644 dts/tests/TestSuite_cryptodev_throughput.py
>
> diff --git a/doc/api/dts/tests.TestSuite_cryptodev_throughput.rst
> b/doc/api/dts/tests.TestSuite_cryptodev_throughput.rst
> new file mode 100644
> index 0000000000..5df5e7547e
> --- /dev/null
> +++ b/doc/api/dts/tests.TestSuite_cryptodev_throughput.rst
> @@ -0,0 +1,8 @@
> +.. SPDX-License-Identifier: BSD-3-Clause
> +
> +cryptodev_throughput Test Suite
> +===============================
> +
> +.. automodule:: tests.TestSuite_cryptodev_throughput
> + :members:
> + :show-inheritance:
> diff --git a/dts/configurations/tests_config.example.yaml
> b/dts/configurations/tests_config.example.yaml
> index 64fa630aa0..c9beff9c99 100644
> --- a/dts/configurations/tests_config.example.yaml
> +++ b/dts/configurations/tests_config.example.yaml
> @@ -15,3 +15,11 @@ hello_world:
> # num_descriptors: 1024
> # expected_mpps: 1.0
> # delta_tolerance: 0.05
> +# cryptodev_throughput:
> +# delta_tolerance: 0.05
> +# throughput_test_parameters:
> +# snow3g_uea2_snow3g_uia2: # Add the name of the test suite you would
> like to run
> +# - buff_size: 64
> +# gbps: 2.0 # Set gigabits per second according to your devices
> throughput for this given buffer size
> +# - buff_size: 512
> +# gbps: 20.0
> \ No newline at end of file
> diff --git a/dts/tests/TestSuite_cryptodev_throughput.py
> b/dts/tests/TestSuite_cryptodev_throughput.py
> new file mode 100644
> index 0000000000..871e47ae63
> --- /dev/null
> +++ b/dts/tests/TestSuite_cryptodev_throughput.py
> @@ -0,0 +1,690 @@
> +# SPDX-License-Identifier: BSD-3-Clause
> +# Copyright(c) 2025 University of New Hampshire
> +
> +"""DPDK cryptodev performance test suite.
> +
> +The main goal of this testsuite is to utilize the dpdk-test-cryptodev
> application to gather
> +performance metrics for various cryptographic operations supported by DPDK
> cryptodev-pmd.
> +It will then compare the results against predefined baseline given in the
> test_config file to
> +ensure performance standards are met.
> +"""
> +
> +from api.capabilities import (
> + LinkTopology,
> + requires_link_topology,
> +)
> +from api.cryptodev import Cryptodev
> +from api.cryptodev.config import (
> + AeadAlgName,
> + AuthenticationAlgorithm,
> + AuthenticationOpMode,
> + CipherAlgorithm,
> + DeviceType,
> + EncryptDecryptSwitch,
> + ListWrapper,
> + OperationType,
> + TestType,
> + get_device_from_str,
> +)
> +from api.cryptodev.types import (
> + CryptodevResults,
> +)
> +from api.test import verify
> +from framework.context import get_ctx
> +from framework.exception import SkippedTestException
> +from framework.test_suite import BaseConfig, TestSuite, func_test
> +from framework.testbed_model.virtual_device import VirtualDevice
> +
> +config_list: list[dict[str, int | float | str]] = [
> + {"buff_size": 64, "gbps": 1.00},
> + {"buff_size": 512, "gbps": 1.00},
> + {"buff_size": 2048, "gbps": 1.00},
> +]
> +
> +
> +class Config(BaseConfig):
> + """Performance test metrics.
> +
> + Attributes:
> + delta_tolerance: The allowed tolerance below a given baseline.
> + throughput_test_parameters: The test parameters to use in the test
> suite.
> + """
> +
> + delta_tolerance: float = 0.05
> +
> + throughput_test_parameters: dict[str, list[dict[str, int | float |
> str]]] = {
> + "aes_cbc": config_list,
> + "aes_cbc_sha1": config_list,
> + "aes_cbc_sha2": config_list,
> + "aes_cbc_sha2_digest_16": config_list,
> + "aead_aes_gcm": config_list,
> + "aes_docsisbpi": config_list,
> + "sha1_hmac": config_list,
> + "snow3g_uea2_snow3g_uia2": config_list,
> + "zuc_eea3_zuc_eia3": config_list,
> + "kasumi_f8_kasumi_f9": config_list,
> + "open_ssl_vdev": config_list,
> + "aesni_mb_vdev": config_list,
> + "aesni_gcm_vdev": config_list,
> + "kasumi_vdev": config_list,
> + "zuc_vdev": config_list,
> + "snow3g_vdev": config_list,
> + }
> +
> +
> +@requires_link_topology(LinkTopology.NO_LINK)
> +class TestCryptodevThroughput(TestSuite):
> + """DPDK Crypto Device Testing Suite."""
> +
> + config: Config
> +
> + def set_up_suite(self) -> None:
> + """Set up the test suite."""
> + self.throughput_test_parameters: dict[str, list[dict[str, int |
> float | str]]] = (
> + self.config.throughput_test_parameters
> + )
> + self.delta_tolerance: float = self.config.delta_tolerance
> + device: DeviceType | None =
> get_device_from_str(str(get_ctx().sut_node.crypto_driver))
> + self.driver: DeviceType = device if device else DeviceType.crypto_qat
Why the "else DeviceType.crypto_qat"? Shouldn't the device type be a
required field from the config if we are running a crypto test?
> + self.buffer_sizes = {}
> +
> + for k, v in self.throughput_test_parameters.items():
> + self.buffer_sizes[k] = ListWrapper([int(run["buff_size"]) for
> run in v])
> +
> + def _print_stats(self, test_vals: list[dict[str, int | float | str]]) ->
> None:
> + element_len = len("Delta Tolerance")
> + border_len = (element_len + 1) * (len(test_vals[0]))
> +
> + print(f"{'Throughput Results'.center(border_len)}\n{'=' *
> border_len}")
> + for k, v in test_vals[0].items():
> + print(f"|{k.title():<{element_len}}", end="")
> + print(f"|\n{'='*border_len}")
> +
> + for test_val in test_vals:
> + for k, v in test_val.items():
> + print(f"|{v:<{element_len}}", end="")
> + print(f"|\n{'='*border_len}")
> +
> + def _verify_throughput(
> + self,
> + results: list[CryptodevResults],
> + key: str,
> + ) -> list[dict[str, int | float | str]]:
> + result_list: list[dict[str, int | float | str]] = []
> +
> + for result in results:
> + result_dict = {}
> + parameters: dict[str, int | float | str] = list(
> + filter(
> + lambda x: x["buff_size"] == result.buffer_size,
> + self.throughput_test_parameters[key],
> + )
> + )[0]
> + test_result = True
> + for arg, target_val in parameters.items():
Can you just you a typical "for k, v in parameters.items()"? the name
target_val doesn't really represent both values and it's just
confusing to read in my opinion.
> + match arg:
> + case "buff_size":
> + result_dict["Buffer Size"] = target_val
> + continue
> + case "gbps":
> + # result did not meet the given gbps parameter,
> check if within delta.
> + if target_val > getattr(result, "gbps"):
> + delta = round((1 - (getattr(result, "gbps") /
> target_val)), 5)
> + if delta > self.delta_tolerance:
> + test_result = False
> + else:
> + delta = round((1 - target_val / getattr(result,
> arg)), 5)
Don't calculate delta once (and in two different ways for that
matter). Start by calculating the delta, and set it to a variable.
Then, you can have your followup business logic do the necessary steps
based on what the delta is. But the first step is to calculate the
delta one time and set it so it can be read for the subsequent steps.
> + result_dict["gbps delta"] = delta
> + result_dict["delta tolerance"] = self.delta_tolerance
> + result_dict["gbps"] = getattr(result, "gbps")
> + result_dict["gbps target"] = target_val
> + result_dict["passed"] = "PASS" if test_result else "FAIL"
> + result_list.append(result_dict)
> + return result_list
Overall I think the structure of the logic in this method is a little
confusing but I think it will be okay if you make the change
recommended in my above comment.
> +
> + @func_test
> + def aes_cbc(self) -> None:
> + """aes_cbc test.
> +
> + Steps:
> + * Create a cryptodev instance with provided driver and buffer
> sizes.
> + Verify:
> + * The resulting gbps is greater than
> expected_gbps*(1-delta_tolerance).
> +
> + Raises:
> + SkippedTestException: When configuration is not provided.
> + """
> + if "aes_cbc" not in self.throughput_test_parameters:
> + raise SkippedTestException("test not configured")
> + app = Cryptodev(
> + ptest=TestType.throughput,
> + devtype=self.driver,
> + optype=OperationType.cipher_only,
> + cipher_algo=CipherAlgorithm.aes_cbc,
> + cipher_op=EncryptDecryptSwitch.encrypt,
> + cipher_key_sz=16,
> + cipher_iv_sz=16,
> + total_ops=10_000_000,
> + buffer_sz=self.buffer_sizes["aes_cbc"],
> + )
> + results = self._verify_throughput(app.run_app(), "aes_cbc")
> + self._print_stats(results)
> + for result in results:
> + verify(result["passed"] == "PASS", "gbps fell below delta
> tolerance")
> +
> + def aes_cbc_sha1(self) -> None:
> + """aes_cbc_sha1 test.
> +
> + Steps:
> + * Create a cryptodev instance with provided driver and buffer
> sizes.
> + Verify:
> + * The resulting gbps is greater than
> expected_gbps*(1-delta_tolerance).
> +
> + Raises:
> + SkippedTestException: When configuration is not provided.
> + """
> + if "aes_cbc_sha1" not in self.throughput_test_parameters:
> + raise SkippedTestException("test not configured")
> + app = Cryptodev(
> + ptest=TestType.throughput,
> + devtype=self.driver,
> + optype=OperationType.cipher_then_auth,
> + cipher_algo=CipherAlgorithm.aes_cbc,
> + cipher_op=EncryptDecryptSwitch.encrypt,
> + cipher_key_sz=16,
> + cipher_iv_sz=16,
> + auth_algo=AuthenticationAlgorithm.sha1_hmac,
> + auth_op=AuthenticationOpMode.generate,
> + auth_key_sz=64,
> + auth_iv_sz=20,
> + digest_sz=12,
> + total_ops=10_000_000,
> + buffer_sz=self.buffer_sizes["aes_cbc_sha1"],
> + )
> + results = self._verify_throughput(app.run_app(), "aes_cbc_sha1")
> + self._print_stats(results)
> + for result in results:
> + verify(result["passed"] == "PASS", "gbps fell below delta
> tolerance")
> +
> + def aes_cbc_sha2(self) -> None:
> + """aes_cbc_sha2 test.
> +
> + Steps:
> + * Create a cryptodev instance with provided driver and buffer
> sizes.
> + Verify:
> + * The resulting gbps is greater than
> expected_gbps*(1-delta_tolerance).
> +
> + Raises:
> + SkippedTestException: When configuration is not provided.
> + """
> + if "aes_cbc_sha2" not in self.throughput_test_parameters:
> + raise SkippedTestException("test not configured")
> + app = Cryptodev(
> + ptest=TestType.throughput,
> + devtype=self.driver,
> + optype=OperationType.cipher_then_auth,
> + cipher_algo=CipherAlgorithm.aes_cbc,
> + cipher_op=EncryptDecryptSwitch.encrypt,
> + cipher_key_sz=16,
> + cipher_iv_sz=16,
> + auth_algo=AuthenticationAlgorithm.sha2_256_hmac,
> + auth_op=AuthenticationOpMode.generate,
> + auth_key_sz=64,
> + digest_sz=32,
> + total_ops=10_000_000,
> + buffer_sz=self.buffer_sizes["aes_cbc_sha2"],
> + )
> + results = self._verify_throughput(app.run_app(), "aes_cbc_sha2")
> + self._print_stats(results)
> + for result in results:
> + verify(result["passed"] == "PASS", "gbps fell below delta
> tolerance")
> +
> + @func_test
> + def aes_cbc_sha2_digest_16(self) -> None:
> + """aes_cbc_sha2_digest_16 test.
> +
> + Steps:
> + * Create a cryptodev instance with provided driver and buffer
> sizes.
> + Verify:
> + * The resulting gbps is greater than
> expected_gbps*(1-delta_tolerance).
> +
> + Raises:
> + SkippedTestException: When configuration is not provided.
> + """
> + if "aes_cbc_sha2_digest_16" not in self.throughput_test_parameters:
> + raise SkippedTestException("test not configured")
> + app = Cryptodev(
> + ptest=TestType.throughput,
> + devtype=self.driver,
> + optype=OperationType.cipher_then_auth,
> + cipher_algo=CipherAlgorithm.aes_cbc,
> + cipher_op=EncryptDecryptSwitch.encrypt,
> + cipher_key_sz=16,
> + cipher_iv_sz=16,
> + auth_algo=AuthenticationAlgorithm.sha2_256_hmac,
> + auth_op=AuthenticationOpMode.generate,
> + auth_key_sz=64,
> + digest_sz=16,
> + total_ops=10_000_000,
> + buffer_sz=self.buffer_sizes["aes_cbc_sha2_digest_16"],
> + )
> + results = self._verify_throughput(app.run_app(),
> "aes_cbc_sha2_digest_16")
> + self._print_stats(results)
> + for result in results:
> + verify(result["passed"] == "PASS", "gbps fell below delta
> tolerance")
> +
> + @func_test
> + def aead_aes_gcm(self) -> None:
> + """aead_aes_gcm test.
> +
> + Steps:
> + * Create a cryptodev instance with provided driver and buffer
> sizes.
> + Verify:
> + * The resulting gbps is greater than
> expected_gbps*(1-delta_tolerance).
> +
> + Raises:
> + SkippedTestException: When configuration is not provided.
> + """
> + if "aead_aes_gcm" not in self.throughput_test_parameters:
> + raise SkippedTestException("test not configured")
> + app = Cryptodev(
> + ptest=TestType.throughput,
> + devtype=self.driver,
> + optype=OperationType.aead,
> + aead_algo=AeadAlgName.aes_gcm,
> + aead_op=EncryptDecryptSwitch.encrypt,
> + aead_key_sz=16,
> + aead_iv_sz=12,
> + aead_aad_sz=16,
> + digest_sz=16,
> + total_ops=10_000_000,
> + buffer_sz=self.buffer_sizes["aead_aes_gcm"],
> + )
> + results = self._verify_throughput(app.run_app(), "aead_aes_gcm")
> + self._print_stats(results)
> + for result in results:
> + verify(result["passed"] == "PASS", "gbps fell below delta
> tolerance")
> +
> + @func_test
> + def aes_docsisbpi(self) -> None:
> + """aes_docsiscpi test.
docsisbpi
> +
> + Steps:
> + * Create a cryptodev instance with provided driver and buffer
> sizes.
> + Verify:
> + * The resulting gbps is greater than
> expected_gbps*(1-delta_tolerance).
> +
> + Raises:
> + SkippedTestException: When configuration is not provided.
> + """
> + if "aes_docsisbpi" not in self.throughput_test_parameters:
> + raise SkippedTestException("test not configured")
> + app = Cryptodev(
> + ptest=TestType.throughput,
> + devtype=self.driver,
> + optype=OperationType.cipher_only,
> + cipher_algo=CipherAlgorithm.aes_docsisbpi,
> + cipher_op=EncryptDecryptSwitch.encrypt,
> + cipher_key_sz=32,
> + cipher_iv_sz=16,
> + total_ops=10_000_000,
> + buffer_sz=self.buffer_sizes["aes_docsisbpi"],
> + )
> + results = self._verify_throughput(app.run_app(), "aes_docsisbpi")
> + self._print_stats(results)
> + for result in results:
> + verify(result["passed"] == "PASS", "gbps fell below delta
> tolerance")
> +
> + @crypto_test
> + def sha1_hmac(self) -> None:
> + """sha1_hmac test.
> +
> + Steps:
> + * Create a cryptodev instance with provided driver and buffer
> sizes.
> + Verify:
> + * The resulting gbps is greater than
> expected_gbps*(1-delta_tolerance).
> +
> + Raises:
> + SkippedTestException: When configuration is not provided.
> + """
> + if "sha1_hmac" not in self.throughput_test_parameters:
> + raise SkippedTestException("test not configured")
> + app = Cryptodev(
> + ptest=TestType.throughput,
> + devtype=self.driver,
> + optype=OperationType.auth_only,
> + auth_algo=AuthenticationAlgorithm.sha1_hmac,
> + auth_op=AuthenticationOpMode.generate,
> + auth_key_sz=64,
> + auth_iv_sz=16,
> + digest_sz=12,
> + total_ops=10_000_000,
> + buffer_sz=self.buffer_sizes["sha1_hmac"],
> + )
> + results = self._verify_throughput(app.run_app(), "sha1_hmac")
> + self._print_stats(results)
> + for result in results:
> + verify(result["passed"] == "PASS", "gbps fell below delta
> tolerance")
> +
> + @func_test
> + def snow3g_uea2_snow3g_uia2(self) -> None:
> + """snow3g_uea2_snow3g_uia2 test.
> +
> + Steps:
> + * Create a cryptodev instance with provided driver and buffer
> sizes.
> + Verify:
> + * The resulting gbps is greater than
> expected_gbps*(1-delta_tolerance).
> +
> + Raises:
> + SkippedTestException: When configuration is not provided.
> + """
> + if "snow3g_uea2_snow3g_uia2" not in self.throughput_test_parameters:
> + raise SkippedTestException("test not configured")
> + app = Cryptodev(
> + ptest=TestType.throughput,
> + devtype=self.driver,
> + optype=OperationType.cipher_then_auth,
> + cipher_algo=CipherAlgorithm.snow3g_uea2,
> + cipher_op=EncryptDecryptSwitch.encrypt,
> + cipher_key_sz=16,
> + cipher_iv_sz=16,
> + auth_algo=AuthenticationAlgorithm.snow3g_uia2,
> + auth_op=AuthenticationOpMode.generate,
> + auth_key_sz=16,
> + auth_iv_sz=16,
> + digest_sz=4,
> + total_ops=10_000_000,
> + buffer_sz=self.buffer_sizes["snow3g_uea2_snow3g_uia2"],
> + )
> + results = self._verify_throughput(app.run_app(),
> "snow3g_uea2_snow3g_uia2")
> + self._print_stats(results)
> + for result in results:
> + verify(result["passed"] == "PASS", "gbps fell below delta
> tolerance")
> +
> + @func_test
> + def zuc_eea3_zuc_eia3(self) -> None:
> + """zuc_eea3_zuc_eia3 test.
> +
> + Steps:
> + * Create a cryptodev instance with provided driver and buffer
> sizes.
> + Verify:
> + * The resulting gbps is greater than
> expected_gbps*(1-delta_tolerance).
> +
> + Raises:
> + SkippedTestException: When configuration is not provided.
> + """
> + if "zuc_eea3_zuc_eia3" not in self.throughput_test_parameters:
> + raise SkippedTestException("test not configured")
> + app = Cryptodev(
> + ptest=TestType.throughput,
> + devtype=self.driver,
> + optype=OperationType.cipher_then_auth,
> + cipher_algo=CipherAlgorithm.zuc_eea3,
> + cipher_op=EncryptDecryptSwitch.encrypt,
> + cipher_key_sz=16,
> + cipher_iv_sz=16,
> + auth_algo=AuthenticationAlgorithm.zuc_eia3,
> + auth_op=AuthenticationOpMode.generate,
> + auth_key_sz=16,
> + auth_iv_sz=16,
> + digest_sz=4,
> + total_ops=10_000_000,
> + buffer_sz=self.buffer_sizes["zuc_eea3_zuc_eia3"],
> + )
> + results = self._verify_throughput(app.run_app(), "zuc_eea3_zuc_eia3")
> + self._print_stats(results)
> + for result in results:
> + verify(result["passed"] == "PASS", "gbps fell below delta
> tolerance")
> +
> + @func_test
> + def kasumi_f8_kasumi_f9(self) -> None:
> + """kasumi_f8 kasumi_f9 test.
> +
> + Steps:
> + * Create a cryptodev instance with provided driver and buffer
> sizes.
> + Verify:
> + * The resulting gbps is greater than
> expected_gbps*(1-delta_tolerance).
> +
> + Raises:
> + SkippedTestException: When configuration is not provided.
> + """
> + if "kasumi_f8_kasumi_f9" not in self.throughput_test_parameters:
> + raise SkippedTestException("test not configured")
> + app = Cryptodev(
> + ptest=TestType.throughput,
> + devtype=self.driver,
> + optype=OperationType.cipher_then_auth,
> + cipher_algo=CipherAlgorithm.kasumi_f8,
> + cipher_op=EncryptDecryptSwitch.encrypt,
> + cipher_key_sz=16,
> + cipher_iv_sz=8,
> + auth_algo=AuthenticationAlgorithm.kasumi_f9,
> + auth_op=AuthenticationOpMode.generate,
> + auth_key_sz=16,
> + digest_sz=4,
> + burst_sz=32,
> + total_ops=10_000_000,
> + buffer_sz=self.buffer_sizes["kasumi_f8_kasumi_f9"],
> + )
> + results = self._verify_throughput(app.run_app(),
> "kasumi_f8_kasumi_f9")
> + self._print_stats(results)
> + for result in results:
> + verify(result["passed"] == "PASS", "gbps fell below delta
> tolerance")
> +
> + # BEGIN VDEV TESTS
> +
> +
> + def aesni_mb_vdev(self) -> None:
> + """aesni_mb virtual device test.
> +
> + Steps:
> + * Create a cryptodev instance with crypto_aesni_mb and supplied
> buffer sizes.
> + Verify:
> + * The resulting gbps is greater than
> expected_gbps*(1-delta_tolerance).
> +
> + Raises:
> + SkippedTestException: When configuration is not provided.
> + """
> + if "aesni_mb_vdev" not in self.throughput_test_parameters:
> + raise SkippedTestException("test not configured")
> + app = Cryptodev(
> + ptest=TestType.throughput,
> + vdevs=[VirtualDevice("crypto_aesni_mb0")],
> + devtype=DeviceType.crypto_aesni_mb,
> + optype=OperationType.cipher_then_auth,
> + cipher_algo=CipherAlgorithm.aes_cbc,
> + cipher_op=EncryptDecryptSwitch.encrypt,
> + cipher_key_sz=32,
> + cipher_iv_sz=16,
> + auth_algo=AuthenticationAlgorithm.sha1_hmac,
> + auth_op=AuthenticationOpMode.generate,
> + auth_key_sz=16,
> + auth_iv_sz=16,
> + digest_sz=4,
> + burst_sz=32,
> + total_ops=10_000_000,
> + buffer_sz=self.buffer_sizes["aesni_mb_vdev"],
> + )
> + results = self._verify_throughput(app.run_app(), "aesni_mb_vdev")
> + self._print_stats(results)
> + for result in results:
> + verify(result["passed"] == "PASS", "gbps fell below delta
> tolerance")
> +
> + @func_test
> + def aesni_gcm_vdev(self):
> + """aesni_gcm virtual device test.
> +
> + Steps:
> + * Create a cryptodev instance with crypto_aesni_gcm and supplied
> buffer sizes.
> + Verify:
> + * The resulting gbps is greater than
> expected_gbps*(1-delta_tolerance).
> +
> + Raises:
> + SkippedTestException: When configuration is not provided.
> + """
> + if "aesni_gcm_vdev" not in self.throughput_test_parameters:
> + raise SkippedTestException("test not configured")
> + app = Cryptodev(
> + ptest=TestType.throughput,
> + vdevs=[VirtualDevice("crypto_aesni_gcm0")],
> + devtype=DeviceType.crypto_aesni_gcm,
> + optype=OperationType.aead,
> + aead_algo=AeadAlgName.aes_gcm,
> + aead_op=EncryptDecryptSwitch.encrypt,
> + aead_key_sz=16,
> + aead_iv_sz=12,
> + aead_aad_sz=16,
> + digest_sz=16,
> + total_ops=10_000_000,
> + buffer_sz=self.buffer_sizes["aesni_gcm_vdev"],
> + )
> + results = self._verify_throughput(app.run_app(), "aesni_gcm_vdev")
> + self._print_stats(results)
> + for result in results:
> + verify(result["passed"] == "PASS", "gbps fell below delta
> tolerance")
> +
> + @func_test
> + def kasumi_vdev(self) -> None:
> + """Kasmumi virtual device test.
> +
> + Steps:
> + * Create a cryptodev instance with crypto_kasumi and supplied
> buffer sizes.
> + Verify:
> + * The resulting gbps is greater than
> expected_gbps*(1-delta_tolerance).
> +
> + Raises:
> + SkippedTestException: When configuration is not provided.
> + """
> + if "kasumi_vdev" not in self.throughput_test_parameters:
> + raise SkippedTestException("test not configured")
> + app = Cryptodev(
> + vdevs=[VirtualDevice("crypto_kasumi0")],
> + ptest=TestType.throughput,
> + devtype=DeviceType.crypto_qat,
Should this be crypto_kasumi?
> + optype=OperationType.cipher_then_auth,
> + cipher_algo=CipherAlgorithm.kasumi_f8,
> + cipher_op=EncryptDecryptSwitch.encrypt,
> + cipher_key_sz=16,
> + cipher_iv_sz=8,
> + auth_algo=AuthenticationAlgorithm.kasumi_f9,
> + auth_op=AuthenticationOpMode.generate,
> + auth_key_sz=16,
> + digest_sz=4,
> + burst_sz=32,
> + total_ops=10_000_000,
> + buffer_sz=self.buffer_sizes["kasumi_vdev"],
> + )
> + results = self._verify_throughput(app.run_app(), "kasumi_vdev")
> + self._print_stats(results)
> + for result in results:
> + verify(result["passed"] == "PASS", "gbps fell below delta
> tolerance")
> +
> + @func_test
> + def snow3g_vdev(self) -> None:
> + """snow3g virtual device test.
> +
> + Steps:
> + * Create a cryptodev instance with crypto_snow3g and supplied
> buffer sizes.
> + Verify:
> + * The resulting gbps is greater than
> expected_gbps*(1-delta_tolerance).
> +
> + Raises:
> + SkippedTestException: When configuration is not provided.
> + """
> + if "snow3g_vdev" not in self.throughput_test_parameters:
> + raise SkippedTestException("test not configured")
> + app = Cryptodev(
> + ptest=TestType.throughput,
> + vdevs=[VirtualDevice("crypto_snow3g0")],
> + devtype=DeviceType.crypto_snow3g,
> + optype=OperationType.cipher_then_auth,
> + cipher_algo=CipherAlgorithm.snow3g_uea2,
> + cipher_op=EncryptDecryptSwitch.encrypt,
> + cipher_key_sz=16,
> + cipher_iv_sz=16,
> + auth_algo=AuthenticationAlgorithm.snow3g_uia2,
> + auth_op=AuthenticationOpMode.generate,
> + auth_key_sz=16,
> + auth_iv_sz=16,
> + digest_sz=4,
> + burst_sz=32,
> + total_ops=10_000_000,
> + buffer_sz=self.buffer_sizes["snow3g_vdev"],
> + )
> + results = self._verify_throughput(app.run_app(), "snow3g_vdev")
> + self._print_stats(results)
> + for result in results:
> + verify(result["passed"] == "PASS", "gpbs fell below delta
> tolerance")
gpbs -> gbps
Also switch to Gbps instead of gbps throughout the suite for error
strings and docstrings (code is okay to be lowercase).
> +
> + @func_test
> + def zuc_vdev(self) -> None:
> + """Zuc virtual device test.
> +
> + Steps:
> + * Create a cryptodev instance with crypto_zuc and supplied
> buffer sizes.
> + Verify:
> + * The resulting gbps is greater than
> expected_gbps*(1-delta_tolerance).
> +
> + Raises:
> + SkippedTestException: When configuration is not provided.
> + """
> + if "zuc_vdev" not in self.throughput_test_parameters:
> + raise SkippedTestException("test not configured")
> + app = Cryptodev(
> + ptest=TestType.throughput,
> + vdevs=[VirtualDevice("crypto_zuc0")],
> + devtype=DeviceType.crypto_zuc,
> + optype=OperationType.cipher_then_auth,
> + cipher_algo=CipherAlgorithm.zuc_eea3,
> + cipher_op=EncryptDecryptSwitch.encrypt,
> + cipher_key_sz=16,
> + cipher_iv_sz=16,
> + auth_algo=AuthenticationAlgorithm.zuc_eia3,
> + auth_op=AuthenticationOpMode.generate,
> + auth_key_sz=16,
> + auth_iv_sz=16,
> + digest_sz=4,
> + burst_sz=32,
> + total_ops=10_000_000,
Maybe set 10_000_00 to a variable which can be referenced in each testsuite?
> + buffer_sz=self.buffer_sizes["zuc_vdev"],
> + )
> + results = self._verify_throughput(app.run_app(), "zuc_vdev")
> + self._print_stats(results)
> + for result in results:
> + verify(result["passed"] == "PASS", "gpbs fell below delta
> tolerance")
Gbps
> +
> + @func_test
> + def open_ssl_vdev(self) -> None:
> + """open_ssl virtual device test.
> +
> + Steps:
> + * Create a cryptodev instance with provided driver and buffer
> sizes.
> + Verify:
> + * The resulting gbps is greater than
> expected_gbps*(1-delta_tolerance).
> +
> + Raises:
> + SkippedTestException: When configuration is not provided.
> + """
> + if "open_ssl_vdev" not in self.throughput_test_parameters:
> + raise SkippedTestException("test not configured")
> + app = Cryptodev(
> + ptest=TestType.throughput,
> + vdevs=[VirtualDevice("crypto_openssl0")],
> + devtype=DeviceType.crypto_openssl,
> + optype=OperationType.aead,
> + aead_algo=AeadAlgName.aes_gcm,
> + aead_op=EncryptDecryptSwitch.encrypt,
> + aead_key_sz=16,
> + aead_iv_sz=16,
> + aead_aad_sz=16,
> + digest_sz=16,
> + total_ops=100_000,
I'm guessing there is a reason but why fewer ops for this test? Just curious.
> + buffer_sz=self.buffer_sizes["open_ssl_vdev"],
> + )
> + results = self._verify_throughput(app.run_app(), "open_ssl_vdev")
> + self._print_stats(results)
> + for result in results:
> + verify(
> + result["passed"] == "PASS",
> + "gbps fell below delta tolerance",
> + )
> --
> 2.50.1
>
I noticed that for the VF creation, the crypto interface is being read
3x. Are there 1-2 additional checks happening, or are we just hitting
these code paths multiple times for good reason? Maybe not, I'm just
checking if there are any inadvertent calls. I guess this is a matter
for the 2/5 patch though:
2026/02/26 04:44:46 - test_run_setup - dts.SUT 1 - INFO - Sending:
'sudo -- sh -c 'cat /sys/bus/pci/devices/0000\:76\:00.0/sriov_numvfs''
2026/02/26 04:44:46 - test_run_setup - dts.SUT 1 - INFO - Sending:
'sudo -- sh -c 'cat /sys/bus/pci/devices/0000\:76\:00.0/sriov_numvfs''
2026/02/26 04:44:47 - test_run_setup - dts.SUT 1 - INFO - Sending:
'sudo -- sh -c 'cat /sys/bus/pci/devices/0000\:76\:00.0/sriov_numvfs''
Reviewed-by: Patrick Robb <[email protected]>