aboutsummaryrefslogtreecommitdiffstats
path: root/recipes-kernel/cryptodev/sdk_patches/0088-merge-sync-and-async-benchmarks-into-a-single-progra.patch
diff options
context:
space:
mode:
Diffstat (limited to 'recipes-kernel/cryptodev/sdk_patches/0088-merge-sync-and-async-benchmarks-into-a-single-progra.patch')
-rw-r--r--recipes-kernel/cryptodev/sdk_patches/0088-merge-sync-and-async-benchmarks-into-a-single-progra.patch1858
1 files changed, 1858 insertions, 0 deletions
diff --git a/recipes-kernel/cryptodev/sdk_patches/0088-merge-sync-and-async-benchmarks-into-a-single-progra.patch b/recipes-kernel/cryptodev/sdk_patches/0088-merge-sync-and-async-benchmarks-into-a-single-progra.patch
new file mode 100644
index 00000000..9f7709bb
--- /dev/null
+++ b/recipes-kernel/cryptodev/sdk_patches/0088-merge-sync-and-async-benchmarks-into-a-single-progra.patch
@@ -0,0 +1,1858 @@
+From a7e42a9c9a2cd4b4ffd369ae57dfbd207536766a Mon Sep 17 00:00:00 2001
+From: Cristian Stoica <cristian.stoica@nxp.com>
+Date: Tue, 1 Nov 2016 12:01:33 +0200
+Subject: [PATCH 088/104] merge sync and async benchmarks into a single program
+
+Signed-off-by: Cristian Stoica <cristian.stoica@nxp.com>
+---
+ tests/Makefile | 9 +-
+ tests/async_speed.c | 463 --------------------------------------
+ tests/async_speed_multi.sh | 172 --------------
+ tests/run_crypto_tests.sh | 2 +-
+ tests/speed.c | 546 +++++++++++++++++++++++++++++++++++++++++++++
+ tests/speed_multi.sh | 174 +++++++++++++++
+ tests/sync_speed.c | 400 ---------------------------------
+ 7 files changed, 725 insertions(+), 1041 deletions(-)
+ delete mode 100644 tests/async_speed.c
+ delete mode 100755 tests/async_speed_multi.sh
+ create mode 100644 tests/speed.c
+ create mode 100755 tests/speed_multi.sh
+ delete mode 100644 tests/sync_speed.c
+
+diff --git a/tests/Makefile b/tests/Makefile
+index 51469e8..88f5040 100644
+--- a/tests/Makefile
++++ b/tests/Makefile
+@@ -3,19 +3,18 @@ CFLAGS += -I.. $(CRYPTODEV_CFLAGS)
+
+ comp_progs := cipher_comp hash_comp hmac_comp
+
+-hostprogs := cipher cipher-aead hmac sync_speed async_cipher async_hmac \
+- async_speed sha_speed hashcrypt_speed fullspeed cipher-gcm \
++hostprogs := cipher cipher-aead hmac async_cipher async_hmac \
++ speed sha_speed hashcrypt_speed fullspeed cipher-gcm \
+ cipher-aead-srtp $(comp_progs)
+
+ example-cipher-objs := cipher.o
+ example-cipher-aead-objs := cipher-aead.o
+ example-hmac-objs := hmac.o
+-example-speed-objs := sync_speed.o
+ example-fullspeed-objs := fullspeed.c
+ example-sha-speed-objs := sha_speed.c
+ example-async-cipher-objs := async_cipher.o
+ example-async-hmac-objs := async_hmac.o
+-example-async-speed-objs := async_speed.o
++example-async-speed-objs := speed.o
+ example-hashcrypt-speed-objs := hashcrypt_speed.c
+
+ prefix ?= /usr/local
+@@ -38,7 +37,7 @@ install:
+ for prog in $(hostprogs); do \
+ install -m 755 $$prog $(DESTDIR)/$(bindir)/tests_cryptodev/; \
+ done
+- install -m 755 async_speed_multi.sh $(DESTDIR)/$(bindir)
++ install -m 755 speed_multi.sh $(DESTDIR)/$(bindir)
+ install -m 755 run_crypto_tests.sh $(DESTDIR)/$(bindir)
+
+ clean:
+diff --git a/tests/async_speed.c b/tests/async_speed.c
+deleted file mode 100644
+index d16d17e..0000000
+--- a/tests/async_speed.c
++++ /dev/null
+@@ -1,463 +0,0 @@
+-/* cryptodev_test - simple benchmark tool for cryptodev
+- *
+- * Copyright (C) 2010 by Phil Sutter <phil.sutter@viprinet.com>
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License as published by
+- * the Free Software Foundation; either version 2 of the License, or
+- * (at your option) any later version.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+- */
+-#include <errno.h>
+-#include <fcntl.h>
+-#include <poll.h>
+-#include <stdio.h>
+-#include <stdlib.h>
+-#include <string.h>
+-#include <sys/ioctl.h>
+-#include <sys/time.h>
+-#include <sys/types.h>
+-#include <signal.h>
+-#include <crypto/cryptodev.h>
+-#include <stdbool.h>
+-#include <unistd.h>
+-#include <stdint.h>
+-#include <inttypes.h>
+-
+-#ifdef ENABLE_ASYNC
+-
+-struct test_params {
+- bool tflag;
+- bool nflag;
+- bool mflag;
+- int tvalue;
+- int nvalue;
+-};
+-
+-const char usage_str[] = "Usage: %s [OPTION]... <cipher>|<hash>\n"
+- "Run benchmark test for cipher or hash\n\n"
+- " -t <secs>\t" "time to run each test (default 10 secs)\n"
+- " -n <bytes>\t" "size of the test buffer\n"
+- " -m\t\t" "output in a machine readable format\n"
+- " -h\t\t" "show this help\n\n"
+- "Note: SEC driver is configured to support buffers smaller than 512K\n"
+-;
+-
+-int run_null(int fdc, struct test_params tp);
+-int run_aes_128_cbc(int fdc, struct test_params tp);
+-int run_aes_256_xts(int fdc, struct test_params tp);
+-int run_crc32c(int fdc, struct test_params tp);
+-int run_sha1(int fdc, struct test_params tp);
+-int run_sha256(int fdc, struct test_params tp);
+-
+-#define ALG_COUNT 6
+-struct {
+- char *name;
+- int (*func)(int, struct test_params);
+-} ciphers[ALG_COUNT] = {
+- {"null", run_null},
+- {"aes-128-cbc", run_aes_128_cbc},
+- {"aes-256-xts", run_aes_256_xts},
+- {"crc32c", run_crc32c},
+- {"sha1", run_sha1},
+- {"sha256", run_sha256},
+-};
+-
+-static double udifftimeval(struct timeval start, struct timeval end)
+-{
+- return (double)(end.tv_usec - start.tv_usec) +
+- (double)(end.tv_sec - start.tv_sec) * 1000 * 1000;
+-}
+-
+-static volatile int must_finish;
+-static volatile int must_exit;
+-static struct pollfd pfd;
+-
+-static void alarm_handler(int signo)
+-{
+- must_finish = 1;
+- pfd.events = POLLIN;
+-}
+-
+-static void exit_handler(int signo)
+-{
+- must_exit = 1;
+- printf("\nexit requested by user through ctrl+c \n");
+-}
+-
+-static char *units[] = { "", "Ki", "Mi", "Gi", "Ti", 0};
+-
+-static void value2human(uint64_t bytes, double time, double* data, double* speed,char* metric)
+-{
+- int unit = 0;
+-
+- *data = bytes;
+- while (*data > 1024 && units[unit + 1]) {
+- *data /= 1024;
+- unit++;
+- }
+- *speed = *data / time;
+- sprintf(metric, "%sB", units[unit]);
+-}
+-
+-static void value2machine(uint64_t bytes, double time, double* speed)
+-{
+- *speed = bytes / time;
+-}
+-
+-int get_alignmask(int fdc, struct session_op *sess)
+-{
+- int alignmask;
+- int min_alignmask = sizeof(void*) - 1;
+-
+-#ifdef CIOCGSESSINFO
+- struct session_info_op siop;
+-
+- siop.ses = sess->ses;
+- if (ioctl(fdc, CIOCGSESSINFO, &siop)) {
+- perror("ioctl(CIOCGSESSINFO)");
+- return -EINVAL;
+- }
+- alignmask = siop.alignmask;
+- if (alignmask < min_alignmask) {
+- alignmask = min_alignmask;
+- }
+-#else
+- alignmask = 0;
+-#endif
+-
+- return alignmask;
+-}
+-
+-int encrypt_data(int fdc, struct test_params tp, struct session_op *sess)
+-{
+- struct crypt_op cop;
+- char *buffer[64], iv[32];
+- uint8_t mac[64][HASH_MAX_LEN];
+- static int val = 23;
+- struct timeval start, end;
+- uint64_t total = 0;
+- double secs, ddata, dspeed;
+- char metric[16];
+- int rc, wqueue = 0, bufidx = 0;
+- int alignmask;
+-
+- memset(iv, 0x23, 32);
+-
+- if (!tp.mflag) {
+- printf("\tBuffer size %d bytes: ", tp.nvalue);
+- fflush(stdout);
+- }
+-
+- alignmask = get_alignmask(fdc, sess);
+- for (rc = 0; rc < 64; rc++) {
+- if (alignmask) {
+- if (posix_memalign((void **)(buffer + rc), alignmask + 1, tp.nvalue)) {
+- printf("posix_memalign() failed!\n");
+- return 1;
+- }
+- } else {
+- if (!(buffer[rc] = malloc(tp.nvalue))) {
+- perror("malloc()");
+- return 1;
+- }
+- }
+- memset(buffer[rc], val++, tp.nvalue);
+- }
+- pfd.fd = fdc;
+- pfd.events = POLLOUT | POLLIN;
+-
+- must_finish = 0;
+- alarm(tp.tvalue);
+-
+- gettimeofday(&start, NULL);
+- do {
+- if ((rc = poll(&pfd, 1, 100)) < 0) {
+- if (errno & (ERESTART | EINTR))
+- continue;
+- fprintf(stderr, "errno = %d ", errno);
+- perror("poll()");
+- return 1;
+- }
+-
+- if (pfd.revents & POLLOUT) {
+- memset(&cop, 0, sizeof(cop));
+- cop.ses = sess->ses;
+- cop.len = tp.nvalue;
+- cop.iv = (unsigned char *)iv;
+- cop.op = COP_ENCRYPT;
+- cop.src = cop.dst = (unsigned char *)buffer[bufidx];
+- cop.mac = mac[bufidx];
+- bufidx = (bufidx + 1) % 64;
+-
+- if (ioctl(fdc, CIOCASYNCCRYPT, &cop)) {
+- perror("ioctl(CIOCASYNCCRYPT)");
+- return 1;
+- }
+- wqueue++;
+- }
+- if (pfd.revents & POLLIN) {
+- if (ioctl(fdc, CIOCASYNCFETCH, &cop)) {
+- perror("ioctl(CIOCASYNCFETCH)");
+- return 1;
+- }
+- wqueue--;
+- total += cop.len;
+- }
+- } while(!must_finish || wqueue);
+- gettimeofday(&end, NULL);
+-
+- secs = udifftimeval(start, end)/ 1000000.0;
+-
+- if (tp.mflag) {
+- value2machine(total, secs, &dspeed);
+- printf("%" PRIu64 "\t%.2f\t%.2f\n", total, secs, dspeed);
+- } else {
+- value2human(total, secs, &ddata, &dspeed, metric);
+- printf ("done. %.2f %s in %.2f secs: ", ddata, metric, secs);
+- printf ("%.2f %s/sec\n", dspeed, metric);
+- }
+-
+- for (rc = 0; rc < 64; rc++)
+- free(buffer[rc]);
+- return 0;
+-}
+-
+-void usage(char *cmd_name)
+-{
+- printf(usage_str, cmd_name);
+-}
+-
+-int run_test(int id, struct test_params tp)
+-{
+- int fd;
+- int fdc;
+- int err;
+-
+- fd = open("/dev/crypto", O_RDWR, 0);
+- if (fd < 0) {
+- perror("open()");
+- return fd;
+- }
+- if (ioctl(fd, CRIOGET, &fdc)) {
+- perror("ioctl(CRIOGET)");
+- return -EINVAL;
+- }
+-
+- if (!tp.mflag) {
+- fprintf(stderr, "Testing %s:\n", ciphers[id].name);
+- }
+- err = ciphers[id].func(fdc, tp);
+-
+- close(fdc);
+- close(fd);
+-
+- return err;
+-}
+-
+-void do_test_vectors(int fdc, struct test_params tp, struct session_op *sess)
+-{
+- int i;
+-
+- if (tp.nflag) {
+- encrypt_data(fdc, tp, sess);
+- } else {
+- for (i = 256; i <= (64 * 1024); i *= 2) {
+- if (must_exit) {
+- break;
+- }
+-
+- tp.nvalue = i;
+- if (encrypt_data(fdc, tp, sess)) {
+- break;
+- }
+- }
+- }
+-}
+-
+-
+-int run_null(int fdc, struct test_params tp)
+-{
+- struct session_op sess;
+- char keybuf[32];
+-
+- fprintf(stderr, "Testing NULL cipher: \n");
+- memset(&sess, 0, sizeof(sess));
+- sess.cipher = CRYPTO_NULL;
+- sess.keylen = 0;
+- sess.key = (unsigned char *)keybuf;
+- if (ioctl(fdc, CIOCGSESSION, &sess)) {
+- perror("ioctl(CIOCGSESSION)");
+- return -EINVAL;
+- }
+-
+- do_test_vectors(fdc, tp, &sess);
+- return 0;
+-}
+-
+-int run_aes_128_cbc(int fdc, struct test_params tp)
+-{
+- struct session_op sess;
+- char keybuf[32];
+-
+- memset(&sess, 0, sizeof(sess));
+- sess.cipher = CRYPTO_AES_CBC;
+- sess.keylen = 16;
+- memset(keybuf, 0x42, 16);
+- sess.key = (unsigned char *)keybuf;
+- if (ioctl(fdc, CIOCGSESSION, &sess)) {
+- perror("ioctl(CIOCGSESSION)");
+- return -EINVAL;
+- }
+-
+- do_test_vectors(fdc, tp, &sess);
+- return 0;
+-}
+-
+-int run_aes_256_xts(int fdc, struct test_params tp)
+-{
+- struct session_op sess;
+- char keybuf[32];
+-
+- memset(&sess, 0, sizeof(sess));
+- sess.cipher = CRYPTO_AES_XTS;
+- sess.keylen = 32;
+- memset(keybuf, 0x42, sess.keylen);
+- sess.key = (unsigned char *)keybuf;
+- if (ioctl(fdc, CIOCGSESSION, &sess)) {
+- perror("ioctl(CIOCGSESSION)");
+- return -EINVAL;
+- }
+-
+- do_test_vectors(fdc, tp, &sess);
+- return 0;
+-}
+-
+-int run_crc32c(int fdc, struct test_params tp)
+-{
+- struct session_op sess;
+-
+- memset(&sess, 0, sizeof(sess));
+- sess.mac = CRYPTO_CRC32C;
+- if (ioctl(fdc, CIOCGSESSION, &sess)) {
+- perror("ioctl(CIOCGSESSION)");
+- return 1;
+- }
+-
+- do_test_vectors(fdc, tp, &sess);
+- return 0;
+-}
+-
+-int run_sha1(int fdc, struct test_params tp)
+-{
+- struct session_op sess;
+-
+- memset(&sess, 0, sizeof(sess));
+- sess.mac = CRYPTO_SHA1;
+- if (ioctl(fdc, CIOCGSESSION, &sess)) {
+- perror("ioctl(CIOCGSESSION)");
+- return 1;
+- }
+-
+- do_test_vectors(fdc, tp, &sess);
+- return 0;
+-}
+-
+-int run_sha256(int fdc, struct test_params tp)
+-{
+- struct session_op sess;
+-
+- memset(&sess, 0, sizeof(sess));
+- sess.mac = CRYPTO_SHA2_256;
+- if (ioctl(fdc, CIOCGSESSION, &sess)) {
+- perror("ioctl(CIOCGSESSION)");
+- return 1;
+- }
+-
+- do_test_vectors(fdc, tp, &sess);
+- return 0;
+-}
+-
+-int main(int argc, char **argv)
+-{
+- int err = 0;
+- int i;
+- int c;
+- bool alg_flag;
+- char *alg_name;
+- struct test_params tp;
+-
+- tp.tflag = false;
+- tp.nflag = false;
+- tp.mflag = false;
+- alg_flag = false;
+- opterr = 0;
+- while ((c = getopt(argc, argv, "hn:t:m")) != -1) {
+- switch (c) {
+- case 'n':
+- tp.nvalue = atoi(optarg);
+- tp.nflag = true;
+- break;
+- case 't':
+- tp.tvalue = atoi(optarg);
+- tp.tflag = true;
+- break;
+- case 'm':
+- tp.mflag = true;
+- break;
+- case 'h': /* no break */
+- default:
+- usage(argv[0]);
+- exit(1);
+- }
+- }
+-
+- /* the name of a specific test asked on the command line */
+- if (optind < argc) {
+- alg_name = argv[optind];
+- alg_flag = true;
+- }
+-
+- /* default test time */
+- if (!tp.tflag) {
+- tp.tvalue = 5;
+- }
+-
+- signal(SIGALRM, alarm_handler);
+- signal(SIGINT, exit_handler);
+-
+- for (i = 0; i < ALG_COUNT; i++) {
+- if (must_exit) {
+- break;
+- }
+-
+- if (alg_flag) {
+- if (strcmp(alg_name, ciphers[i].name) == 0) {
+- err = run_test(i, tp);
+- }
+- } else {
+- err = run_test(i, tp);
+- if (err != 0) {
+- break;
+- }
+- }
+- }
+-
+- return err;
+-}
+-
+-#else
+-int
+-main(int argc, char** argv)
+-{
+- return (0);
+-}
+-#endif
+diff --git a/tests/async_speed_multi.sh b/tests/async_speed_multi.sh
+deleted file mode 100755
+index 90f9b72..0000000
+--- a/tests/async_speed_multi.sh
++++ /dev/null
+@@ -1,172 +0,0 @@
+-#!/bin/bash
+-#
+-# Copyright 2016 NXP Semiconductors
+-#
+-# This program is free software: you can redistribute it and/or modify
+-# it under the terms of the GNU General Public License as published by
+-# the Free Software Foundation, either version 2 of the License, or
+-# (at your option) any later version.
+-#
+-# This program is distributed in the hope that it will be useful,
+-# but WITHOUT ANY WARRANTY; without even the implied warranty of
+-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+-# GNU General Public License for more details.
+-#
+-# You should have received a copy of the GNU General Public License
+-# along with this program. If not, see <http://www.gnu.org/licenses/>.
+-
+-
+-
+-# no user-configurable options below this line
+-
+-NUM_CORES=$(nproc)
+-CMD_BIN="async_speed"
+-OUT_BASENAME="async_speed"
+-MPSTAT_OUT="mpstat_out"
+-
+-# A bigger hammer for mpstat to use ISO8601 time format (fixed in 11.2.2)
+-export LC_TIME=en_GB.UTF-8 &> /dev/null
+-
+-
+-function usage
+-{
+-cat << EOF
+-Usage: `basename $0` [OPTIONS] <alg_name>
+-
+- -m <threads> number of threads to run with (defaults to number of cores)
+- -t <secs> time to run each test (default 10 secs)
+- -n <bytes> size of the test buffer (default 256 bytes)
+- -v make output more verbose (default tabular)
+- -h show this help
+-
+-alg_name: null, aes-128-cbc, aes-256-xts, sha1, sha256, crc32c
+-
+-Note: SEC driver is configured to support buffers smaller than 512K
+-EOF
+-}
+-
+-function SUM {
+- paste -sd+ - | bc -l
+-}
+-
+-function get_cpu_idle
+-{
+- header_line=$(grep %idle ${MPSTAT_OUT} | head -n 1 | sed 's/\s\+/ /g')
+- idle_column=$(echo $header_line | wc -w)
+- average_idle=$(grep Average ${MPSTAT_OUT} | sed 's/\s\+/ /g' | cut -d' ' -f ${idle_column} | tail -n 1)
+-
+- echo $average_idle
+-}
+-
+-function run_parallel
+-{
+- trap control_c SIGINT
+-
+- OPTIONS="-t $tvalue -n $nvalue -m"
+- CMD="$CMD_BIN $OPTIONS $alg_name"
+-
+- (sleep 1; S_TIME_FORMAT=ISO mpstat 1 $(($tvalue-2))) &> $MPSTAT_OUT &
+- MPSTAT_PID=$!
+-
+- PIDS=""
+- start=$(date +%s.%N)
+-
+- for i in $(seq 0 $(($mvalue-1)))
+- do
+- CMD_OUT="${OUT_BASENAME}_${i}"
+-
+- $CMD &> $CMD_OUT &
+- PID=$!
+- AFFINITY=$(($i % $NUM_CORES))
+- taskset -pc $AFFINITY $PID > /dev/null
+-
+- PIDS="$PID $PIDS"
+- done
+-
+- wait $PIDS
+- end=$(date +%s.%N)
+-
+- wait $MPSTAT_PID
+-
+- grep "ioctl" ${OUT_BASENAME}_* &> /dev/null
+- if (($? == 0))
+- then
+- echo "cryptodev is not built with -DENABLE_ASYNC flag"
+- exit 1
+- fi
+-
+- runtime=$(echo "scale=2; ($end - $start) / 1" | bc -l )
+- total_data=$(cat ${OUT_BASENAME}_* | cut -f 1 | SUM)
+- avg_speed=$(echo "scale=2; $total_data / $runtime / 1000000000" | bc -l)
+- cpu_idle=$(get_cpu_idle)
+-
+- if [ ! -z "$vvalue" ]
+- then
+- echo
+- echo "buffer size : $nvalue"
+- echo "running time : $runtime"
+- echo "avg_speed : $avg_speed GB/s"
+- echo "all_cpu idle : $cpu_idle %"
+- echo
+- else
+- echo -e "algorithm\t""threads\t""run time\t"\
+- "buffer size\t""GB/s\t""%cpu idle"
+- echo -e "${alg_name}\t${mvalue}\t${runtime}\t"\
+- "${nvalue}\t${avg_speed}\t${cpu_idle}%"
+- fi
+-}
+-
+-function control_c
+-{
+- killall async_speed > /dev/null
+- killall mpstat > /dev/null
+-}
+-
+-function main
+-{
+- [ ! -e "/dev/crypto" ] &&
+- (sudo modprobe cryptodev || modprobe cryptodev || exit 1)
+-
+- $(which ${CMD_BIN} &> /dev/null)
+- if (($? != 0))
+- then
+- echo "${CMD_BIN} test is not installed"
+- exit 1
+- fi
+-
+- rm -f ${OUT_BASENAME}_*
+- rm -f ${MPSTAT_OUT}
+-
+- while getopts vhm:t:n: option
+- do
+- case "$option" in
+- m) mvalue="$OPTARG";;
+- t) tvalue="$OPTARG";;
+- n) nvalue="$OPTARG";;
+- v) vvalue="verbose";;
+- *) usage $0; exit 1;;
+- esac
+- done
+-
+- shift $((OPTIND-1))
+- alg_name=$1
+-
+- [ -z "$tvalue" ] && tvalue=10 # 10 seconds per test by default
+- [ -z "$mvalue" ] && mvalue=$NUM_CORES # thread count defaults to nproc
+- [ -z "$nvalue" ] && nvalue=256 # 256 bytes default buffer size
+-
+- [ "$tvalue" -lt 5 ] && tvalue=5
+-
+- case "$alg_name" in
+- "null" |\
+- "aes-128-cbc" |\
+- "aes-256-xts" |\
+- "sha1" |\
+- "sha256" |\
+- "crc32c" ) run_parallel;;
+- * ) usage && exit 1;;
+- esac
+-}
+-
+-main "$@"
+-
+diff --git a/tests/run_crypto_tests.sh b/tests/run_crypto_tests.sh
+index 32ab8e2..e128637 100644
+--- a/tests/run_crypto_tests.sh
++++ b/tests/run_crypto_tests.sh
+@@ -16,7 +16,7 @@ do
+ do
+ for bsize in ${BUF_SIZE}
+ do
+- async_speed_multi.sh -t 10 -n $bsize -m ${multi} ${alg_name} |
++ speed_multi.sh -t 10 -n $bsize -m ${multi} ${alg_name} |
+ tail -n 1
+ done
+ done
+diff --git a/tests/speed.c b/tests/speed.c
+new file mode 100644
+index 0000000..3b36db1
+--- /dev/null
++++ b/tests/speed.c
+@@ -0,0 +1,546 @@
++/* cryptodev_test - simple benchmark tool for cryptodev
++ *
++ * Copyright (C) 2010 by Phil Sutter <phil.sutter@viprinet.com>
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
++ */
++#include <errno.h>
++#include <fcntl.h>
++#include <poll.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++#include <sys/ioctl.h>
++#include <sys/time.h>
++#include <sys/types.h>
++#include <signal.h>
++#include <crypto/cryptodev.h>
++#include <stdbool.h>
++#include <unistd.h>
++#include <stdint.h>
++#include <inttypes.h>
++
++
++struct test_params {
++ bool tflag;
++ bool nflag;
++ bool mflag;
++ bool aflag;
++ int tvalue;
++ int nvalue;
++};
++
++const char usage_str[] = "Usage: %s [OPTION]... <cipher>|<hash>\n"
++ "Run benchmark test for cipher or hash\n\n"
++ " -t <secs>\t" "time to run each test (default 10 secs)\n"
++ " -n <bytes>\t" "size of the test buffer\n"
++ " -m\t\t" "output in a machine readable format\n"
++ " -a\t\t" "run the async tests (default sync)\n"
++ " -h\t\t" "show this help\n\n"
++ "Note: SEC driver is configured to support buffers smaller than 512K\n"
++;
++
++int run_null(int fdc, struct test_params tp);
++int run_aes_128_cbc(int fdc, struct test_params tp);
++int run_aes_256_xts(int fdc, struct test_params tp);
++int run_crc32c(int fdc, struct test_params tp);
++int run_sha1(int fdc, struct test_params tp);
++int run_sha256(int fdc, struct test_params tp);
++
++#define ALG_COUNT 6
++struct {
++ char *name;
++ int (*func)(int, struct test_params);
++} ciphers[ALG_COUNT] = {
++ {"null", run_null},
++ {"aes-128-cbc", run_aes_128_cbc},
++ {"aes-256-xts", run_aes_256_xts},
++ {"crc32c", run_crc32c},
++ {"sha1", run_sha1},
++ {"sha256", run_sha256},
++};
++
++static double udifftimeval(struct timeval start, struct timeval end)
++{
++ return (double)(end.tv_usec - start.tv_usec) +
++ (double)(end.tv_sec - start.tv_sec) * 1000 * 1000;
++}
++
++static volatile int must_finish;
++static volatile int must_exit;
++static struct pollfd pfd;
++
++static void alarm_handler(int signo)
++{
++ must_finish = 1;
++ pfd.events = POLLIN;
++}
++
++static void exit_handler(int signo)
++{
++ must_exit = 1;
++ printf("\nexit requested by user through ctrl+c \n");
++}
++
++static char *units[] = { "", "Ki", "Mi", "Gi", "Ti", 0};
++
++static void value2human(uint64_t bytes, double time, double* data, double* speed,char* metric)
++{
++ int unit = 0;
++
++ *data = bytes;
++ while (*data > 1024 && units[unit + 1]) {
++ *data /= 1024;
++ unit++;
++ }
++ *speed = *data / time;
++ sprintf(metric, "%sB", units[unit]);
++}
++
++static void value2machine(uint64_t bytes, double time, double* speed)
++{
++ *speed = bytes / time;
++}
++
++int get_alignmask(int fdc, struct session_op *sess)
++{
++ int alignmask;
++ int min_alignmask = sizeof(void*) - 1;
++
++#ifdef CIOCGSESSINFO
++ struct session_info_op siop;
++
++ siop.ses = sess->ses;
++ if (ioctl(fdc, CIOCGSESSINFO, &siop)) {
++ perror("ioctl(CIOCGSESSINFO)");
++ return -EINVAL;
++ }
++ alignmask = siop.alignmask;
++ if (alignmask < min_alignmask) {
++ alignmask = min_alignmask;
++ }
++#else
++ alignmask = 0;
++#endif
++
++ return alignmask;
++}
++
++int encrypt_async(int fdc, struct test_params tp, struct session_op *sess)
++{
++ struct crypt_op cop;
++ char *buffer[64], iv[32];
++ uint8_t mac[64][HASH_MAX_LEN];
++ static int val = 23;
++ struct timeval start, end;
++ uint64_t total = 0;
++ double secs, ddata, dspeed;
++ char metric[16];
++ int rc, wqueue = 0, bufidx = 0;
++ int alignmask;
++
++ memset(iv, 0x23, 32);
++
++ if (!tp.mflag) {
++ printf("\tBuffer size %d bytes: ", tp.nvalue);
++ fflush(stdout);
++ }
++
++ alignmask = get_alignmask(fdc, sess);
++ for (rc = 0; rc < 64; rc++) {
++ if (alignmask) {
++ if (posix_memalign((void **)(buffer + rc), alignmask + 1, tp.nvalue)) {
++ printf("posix_memalign() failed!\n");
++ return 1;
++ }
++ } else {
++ if (!(buffer[rc] = malloc(tp.nvalue))) {
++ perror("malloc()");
++ return 1;
++ }
++ }
++ memset(buffer[rc], val++, tp.nvalue);
++ }
++ pfd.fd = fdc;
++ pfd.events = POLLOUT | POLLIN;
++
++ must_finish = 0;
++ alarm(tp.tvalue);
++
++ gettimeofday(&start, NULL);
++ do {
++ if ((rc = poll(&pfd, 1, 100)) < 0) {
++ if (errno & (ERESTART | EINTR))
++ continue;
++ fprintf(stderr, "errno = %d ", errno);
++ perror("poll()");
++ return 1;
++ }
++
++ if (pfd.revents & POLLOUT) {
++ memset(&cop, 0, sizeof(cop));
++ cop.ses = sess->ses;
++ cop.len = tp.nvalue;
++ cop.iv = (unsigned char *)iv;
++ cop.op = COP_ENCRYPT;
++ cop.src = cop.dst = (unsigned char *)buffer[bufidx];
++ cop.mac = mac[bufidx];
++ bufidx = (bufidx + 1) % 64;
++
++ if (ioctl(fdc, CIOCASYNCCRYPT, &cop)) {
++ perror("ioctl(CIOCASYNCCRYPT)");
++ return 1;
++ }
++ wqueue++;
++ }
++ if (pfd.revents & POLLIN) {
++ if (ioctl(fdc, CIOCASYNCFETCH, &cop)) {
++ perror("ioctl(CIOCASYNCFETCH)");
++ return 1;
++ }
++ wqueue--;
++ total += cop.len;
++ }
++ } while(!must_finish || wqueue);
++ gettimeofday(&end, NULL);
++
++ secs = udifftimeval(start, end)/ 1000000.0;
++
++ if (tp.mflag) {
++ value2machine(total, secs, &dspeed);
++ printf("%" PRIu64 "\t%.2f\t%.2f\n", total, secs, dspeed);
++ } else {
++ value2human(total, secs, &ddata, &dspeed, metric);
++ printf ("done. %.2f %s in %.2f secs: ", ddata, metric, secs);
++ printf ("%.2f %s/sec\n", dspeed, metric);
++ }
++
++ for (rc = 0; rc < 64; rc++)
++ free(buffer[rc]);
++ return 0;
++}
++
++
++static int encrypt_sync(int fdc, struct test_params tp, struct session_op *sess)
++{
++ struct crypt_op cop;
++ char *buffer, iv[32];
++ char mac[HASH_MAX_LEN];
++ static int val = 23;
++ struct timeval start, end;
++ uint64_t total = 0;
++ double secs, ddata, dspeed;
++ char metric[16];
++ int alignmask;
++ int min_alignmask = sizeof(void*) - 1;
++
++ memset(iv, 0x23, 32);
++
++ if (!tp.mflag) {
++ printf("\tBuffer size %d bytes: ", tp.nvalue);
++ fflush(stdout);
++ }
++
++ alignmask = get_alignmask(fdc, sess);
++ if (alignmask) {
++ alignmask = ((alignmask < min_alignmask) ? min_alignmask : alignmask);
++ if (posix_memalign((void **)(&buffer), alignmask + 1, tp.nvalue)) {
++ printf("posix_memalign() failed!\n");
++ return 1;
++ }
++ } else {
++ if (!(buffer = malloc(tp.nvalue))) {
++ perror("malloc()");
++ return 1;
++ }
++ }
++ memset(buffer, val++, tp.nvalue);
++
++ must_finish = 0;
++ alarm(tp.tvalue);
++
++ gettimeofday(&start, NULL);
++ do {
++ memset(&cop, 0, sizeof(cop));
++ cop.ses = sess->ses;
++ cop.len = tp.nvalue;
++ cop.iv = (unsigned char *)iv;
++ cop.op = COP_ENCRYPT;
++ cop.src = cop.dst = (unsigned char *)buffer;
++ cop.mac = (unsigned char *)mac;
++
++ if (ioctl(fdc, CIOCCRYPT, &cop)) {
++ perror("ioctl(CIOCCRYPT)");
++ return 1;
++ }
++ total += cop.len;
++ } while(!must_finish);
++ gettimeofday(&end, NULL);
++
++ secs = udifftimeval(start, end)/ 1000000.0;
++
++ if (tp.mflag) {
++ value2machine(total, secs, &dspeed);
++ printf("%" PRIu64 "\t%.2f\t%.2f\n", total, secs, dspeed);
++ } else {
++ value2human(total, secs, &ddata, &dspeed, metric);
++ printf ("done. %.2f %s in %.2f secs: ", ddata, metric, secs);
++ printf ("%.2f %s/sec\n", dspeed, metric);
++ }
++
++ free(buffer);
++ return 0;
++}
++
++void usage(char *cmd_name)
++{
++ printf(usage_str, cmd_name);
++}
++
++int run_test(int id, struct test_params tp)
++{
++ int fd;
++ int fdc;
++ int err;
++
++ fd = open("/dev/crypto", O_RDWR, 0);
++ if (fd < 0) {
++ perror("open()");
++ return fd;
++ }
++ if (ioctl(fd, CRIOGET, &fdc)) {
++ perror("ioctl(CRIOGET)");
++ return -EINVAL;
++ }
++
++ if (!tp.mflag) {
++ char *type;
++ type = tp.aflag ? "async" : "sync";
++
++ fprintf(stderr, "Testing %s %s:\n", type, ciphers[id].name);
++ }
++ err = ciphers[id].func(fdc, tp);
++
++ close(fdc);
++ close(fd);
++
++ return err;
++}
++
++void do_test_vectors(int fdc, struct test_params tp, struct session_op *sess)
++{
++ int i;
++ int err;
++
++ if (tp.nflag) {
++ if (tp.aflag) {
++ encrypt_async(fdc, tp, sess);
++ } else {
++ encrypt_sync(fdc, tp, sess);
++ }
++ } else {
++ for (i = 256; i <= (64 * 1024); i *= 2) {
++ if (must_exit) {
++ break;
++ }
++
++ tp.nvalue = i;
++ if (tp.aflag) {
++ err = encrypt_async(fdc, tp, sess);
++ } else {
++ err = encrypt_sync(fdc, tp, sess);
++ }
++
++ if (err != 0) {
++ break;
++ }
++ }
++ }
++}
++
++
++int run_null(int fdc, struct test_params tp)
++{
++ struct session_op sess;
++ char keybuf[32];
++
++ fprintf(stderr, "Testing NULL cipher: \n");
++ memset(&sess, 0, sizeof(sess));
++ sess.cipher = CRYPTO_NULL;
++ sess.keylen = 0;
++ sess.key = (unsigned char *)keybuf;
++ if (ioctl(fdc, CIOCGSESSION, &sess)) {
++ perror("ioctl(CIOCGSESSION)");
++ return -EINVAL;
++ }
++
++ do_test_vectors(fdc, tp, &sess);
++ return 0;
++}
++
++int run_aes_128_cbc(int fdc, struct test_params tp)
++{
++ struct session_op sess;
++ char keybuf[32];
++
++ memset(&sess, 0, sizeof(sess));
++ sess.cipher = CRYPTO_AES_CBC;
++ sess.keylen = 16;
++ memset(keybuf, 0x42, 16);
++ sess.key = (unsigned char *)keybuf;
++ if (ioctl(fdc, CIOCGSESSION, &sess)) {
++ perror("ioctl(CIOCGSESSION)");
++ return -EINVAL;
++ }
++
++ do_test_vectors(fdc, tp, &sess);
++ return 0;
++}
++
++int run_aes_256_xts(int fdc, struct test_params tp)
++{
++ struct session_op sess;
++ char keybuf[32];
++
++ memset(&sess, 0, sizeof(sess));
++ sess.cipher = CRYPTO_AES_XTS;
++ sess.keylen = 32;
++ memset(keybuf, 0x42, sess.keylen);
++ sess.key = (unsigned char *)keybuf;
++ if (ioctl(fdc, CIOCGSESSION, &sess)) {
++ perror("ioctl(CIOCGSESSION)");
++ return -EINVAL;
++ }
++
++ do_test_vectors(fdc, tp, &sess);
++ return 0;
++}
++
++int run_crc32c(int fdc, struct test_params tp)
++{
++ struct session_op sess;
++
++ memset(&sess, 0, sizeof(sess));
++ sess.mac = CRYPTO_CRC32C;
++ if (ioctl(fdc, CIOCGSESSION, &sess)) {
++ perror("ioctl(CIOCGSESSION)");
++ return 1;
++ }
++
++ do_test_vectors(fdc, tp, &sess);
++ return 0;
++}
++
++int run_sha1(int fdc, struct test_params tp)
++{
++ struct session_op sess;
++
++ memset(&sess, 0, sizeof(sess));
++ sess.mac = CRYPTO_SHA1;
++ if (ioctl(fdc, CIOCGSESSION, &sess)) {
++ perror("ioctl(CIOCGSESSION)");
++ return 1;
++ }
++
++ do_test_vectors(fdc, tp, &sess);
++ return 0;
++}
++
++int run_sha256(int fdc, struct test_params tp)
++{
++ struct session_op sess;
++
++ memset(&sess, 0, sizeof(sess));
++ sess.mac = CRYPTO_SHA2_256;
++ if (ioctl(fdc, CIOCGSESSION, &sess)) {
++ perror("ioctl(CIOCGSESSION)");
++ return 1;
++ }
++
++ do_test_vectors(fdc, tp, &sess);
++ return 0;
++}
++
++int main(int argc, char **argv)
++{
++ int err = 0;
++ int i;
++ int c;
++ bool alg_flag;
++ char *alg_name;
++ struct test_params tp;
++
++ tp.tflag = false;
++ tp.nflag = false;
++ tp.mflag = false;
++ tp.aflag = false;
++ alg_flag = false;
++ opterr = 0;
++ while ((c = getopt(argc, argv, "ahn:t:m")) != -1) {
++ switch (c) {
++ case 'n':
++ tp.nvalue = atoi(optarg);
++ tp.nflag = true;
++ break;
++ case 't':
++ tp.tvalue = atoi(optarg);
++ tp.tflag = true;
++ break;
++ case 'm':
++ tp.mflag = true;
++ break;
++ case 'a':
++ tp.aflag = true;
++ break;
++ case 'h': /* no break */
++ default:
++ usage(argv[0]);
++ exit(1);
++ }
++ }
++
++ /* the name of a specific test asked on the command line */
++ if (optind < argc) {
++ alg_name = argv[optind];
++ alg_flag = true;
++ }
++
++ /* default test time */
++ if (!tp.tflag) {
++ tp.tvalue = 5;
++ }
++
++ signal(SIGALRM, alarm_handler);
++ signal(SIGINT, exit_handler);
++
++ for (i = 0; i < ALG_COUNT; i++) {
++ if (must_exit) {
++ break;
++ }
++
++ if (alg_flag) {
++ if (strcmp(alg_name, ciphers[i].name) == 0) {
++ err = run_test(i, tp);
++ }
++ } else {
++ err = run_test(i, tp);
++ if (err != 0) {
++ break;
++ }
++ }
++ }
++
++ return err;
++}
+diff --git a/tests/speed_multi.sh b/tests/speed_multi.sh
+new file mode 100755
+index 0000000..b116483
+--- /dev/null
++++ b/tests/speed_multi.sh
+@@ -0,0 +1,174 @@
++#!/bin/bash
++#
++# Copyright 2016 NXP Semiconductors
++#
++# This program is free software: you can redistribute it and/or modify
++# it under the terms of the GNU General Public License as published by
++# the Free Software Foundation, either version 2 of the License, or
++# (at your option) any later version.
++#
++# This program is distributed in the hope that it will be useful,
++# but WITHOUT ANY WARRANTY; without even the implied warranty of
++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++# GNU General Public License for more details.
++#
++# You should have received a copy of the GNU General Public License
++# along with this program. If not, see <http://www.gnu.org/licenses/>.
++
++
++
++# no user-configurable options below this line
++
++NUM_CORES=$(nproc)
++CMD_BIN="speed"
++OUT_BASENAME="speed"
++MPSTAT_OUT="mpstat_out"
++
++# A bigger hammer for mpstat to use ISO8601 time format (fixed in 11.2.2)
++export LC_TIME=en_GB.UTF-8 &> /dev/null
++
++
++function usage
++{
++cat << EOF
++Usage: `basename $0` [OPTIONS] <alg_name>
++
++ -m <threads> number of threads to run with (defaults to number of cores)
++ -t <secs> time to run each test (default 10 secs)
++ -n <bytes> size of the test buffer (default 256 bytes)
++ -v make output more verbose (default tabular)
++ -a run async version of the benchmark (default sync)
++ -h show this help
++
++alg_name: null, aes-128-cbc, aes-256-xts, sha1, sha256, crc32c
++
++Note: SEC driver is configured to support buffers smaller than 512K
++EOF
++}
++
++function SUM {
++ paste -sd+ - | bc -l
++}
++
++function get_cpu_idle
++{
++ header_line=$(grep %idle ${MPSTAT_OUT} | head -n 1 | sed 's/\s\+/ /g')
++ idle_column=$(echo $header_line | wc -w)
++ average_idle=$(grep Average ${MPSTAT_OUT} | sed 's/\s\+/ /g' | cut -d' ' -f ${idle_column} | tail -n 1)
++
++ echo $average_idle
++}
++
++function run_parallel
++{
++ trap control_c SIGINT
++
++ OPTIONS="-t $tvalue -n $nvalue -m $aflag"
++ CMD="$CMD_BIN $OPTIONS $alg_name"
++
++ (sleep 1; S_TIME_FORMAT=ISO mpstat 1 $(($tvalue-2))) &> $MPSTAT_OUT &
++ MPSTAT_PID=$!
++
++ PIDS=""
++ start=$(date +%s.%N)
++
++ for i in $(seq 0 $(($mvalue-1)))
++ do
++ CMD_OUT="${OUT_BASENAME}_${i}"
++
++ $CMD &> $CMD_OUT &
++ PID=$!
++ AFFINITY=$(($i % $NUM_CORES))
++ taskset -pc $AFFINITY $PID > /dev/null
++
++ PIDS="$PID $PIDS"
++ done
++
++ wait $PIDS
++ end=$(date +%s.%N)
++
++ wait $MPSTAT_PID
++
++ grep "ioctl" ${OUT_BASENAME}_* &> /dev/null
++ if (($? == 0))
++ then
++ echo "cryptodev is not built with -DENABLE_ASYNC flag"
++ exit 1
++ fi
++
++ runtime=$(echo "scale=2; ($end - $start) / 1" | bc -l )
++ total_data=$(cat ${OUT_BASENAME}_* | cut -f 1 | SUM)
++ avg_speed=$(echo "scale=2; $total_data / $runtime / 1000000000" | bc -l)
++ cpu_idle=$(get_cpu_idle)
++
++ if [ ! -z "$vflag" ]
++ then
++ echo
++ echo "buffer size : $nvalue"
++ echo "running time : $runtime"
++ echo "avg_speed : $avg_speed GB/s"
++ echo "all_cpu idle : $cpu_idle %"
++ echo
++ else
++ echo -e "algorithm\t""threads\t""run time\t"\
++ "buffer size\t""GB/s\t""%cpu idle"
++ echo -e "${alg_name}\t${mvalue}\t${runtime}\t"\
++ "${nvalue}\t${avg_speed}\t${cpu_idle}%"
++ fi
++}
++
++function control_c
++{
++ killall $CMD_BIN > /dev/null
++ killall mpstat > /dev/null
++}
++
++function main
++{
++ [ ! -e "/dev/crypto" ] &&
++ (sudo modprobe cryptodev || modprobe cryptodev || exit 1)
++
++ $(which ${CMD_BIN} &> /dev/null)
++ if (($? != 0))
++ then
++ echo "${CMD_BIN} test is not installed"
++ exit 1
++ fi
++
++ rm -f ${OUT_BASENAME}_*
++ rm -f ${MPSTAT_OUT}
++
++ while getopts avhm:t:n: option
++ do
++ case "$option" in
++ m) mvalue="$OPTARG";;
++ t) tvalue="$OPTARG";;
++ n) nvalue="$OPTARG";;
++ v) vflag="verbose";;
++ a) aflag="-a";;
++ *) usage $0; exit 1;;
++ esac
++ done
++
++ shift $((OPTIND-1))
++ alg_name=$1
++
++ [ -z "$tvalue" ] && tvalue=10 # 10 seconds per test by default
++ [ -z "$mvalue" ] && mvalue=$NUM_CORES # thread count defaults to nproc
++ [ -z "$nvalue" ] && nvalue=256 # 256 bytes default buffer size
++
++ [ "$tvalue" -lt 5 ] && tvalue=5
++
++ case "$alg_name" in
++ "null" |\
++ "aes-128-cbc" |\
++ "aes-256-xts" |\
++ "sha1" |\
++ "sha256" |\
++ "crc32c" ) run_parallel;;
++ * ) usage && exit 1;;
++ esac
++}
++
++main "$@"
++
+diff --git a/tests/sync_speed.c b/tests/sync_speed.c
+deleted file mode 100644
+index ceae645..0000000
+--- a/tests/sync_speed.c
++++ /dev/null
+@@ -1,400 +0,0 @@
+-/* cryptodev_test - simple benchmark tool for cryptodev
+- *
+- * Copyright (C) 2010 by Phil Sutter <phil.sutter@viprinet.com>
+- *
+- * This program is free software; you can redistribute it and/or modify
+- * it under the terms of the GNU General Public License as published by
+- * the Free Software Foundation; either version 2 of the License, or
+- * (at your option) any later version.
+- *
+- * This program is distributed in the hope that it will be useful,
+- * but WITHOUT ANY WARRANTY; without even the implied warranty of
+- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+- * GNU General Public License for more details.
+- *
+- * You should have received a copy of the GNU General Public License
+- * along with this program; if not, write to the Free Software
+- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+- */
+-#include <errno.h>
+-#include <fcntl.h>
+-#include <poll.h>
+-#include <stdio.h>
+-#include <stdlib.h>
+-#include <string.h>
+-#include <sys/ioctl.h>
+-#include <sys/time.h>
+-#include <sys/types.h>
+-#include <signal.h>
+-#include <crypto/cryptodev.h>
+-#include <stdbool.h>
+-#include <unistd.h>
+-
+-struct test_params {
+- bool tflag;
+- bool nflag;
+- int tvalue;
+- int nvalue;
+-};
+-
+-const char usage_str[] = "Usage: %s [OPTION]... <cipher>|<hash>\n"
+- "Run benchmark test for cipher or hash\n\n"
+- " -t <secs>\t" "time to run each test (default 10 secs)\n"
+- " -n <bytes>\t" "size of the test buffer\n"
+- " -h\t\t" "show this help\n\n"
+- "Note: SEC driver is configured to support buffers smaller than 512K\n"
+-;
+-
+-int run_null(int fdc, struct test_params tp);
+-int run_aes_128_cbc(int fdc, struct test_params tp);
+-int run_aes_256_xts(int fdc, struct test_params tp);
+-int run_crc32c(int fdc, struct test_params tp);
+-int run_sha1(int fdc, struct test_params tp);
+-int run_sha256(int fdc, struct test_params tp);
+-int get_alignmask(int fdc, struct session_op *sess);
+-
+-#define ALG_COUNT 6
+-struct {
+- char *name;
+- int (*func)(int, struct test_params);
+-} ciphers[ALG_COUNT] = {
+- {"null", run_null},
+- {"aes-128-cbc", run_aes_128_cbc},
+- {"aes-256-xts", run_aes_256_xts},
+- {"crc32c", run_crc32c},
+- {"sha1", run_sha1},
+- {"sha256", run_sha256},
+-};
+-
+-static double udifftimeval(struct timeval start, struct timeval end)
+-{
+- return (double)(end.tv_usec - start.tv_usec) +
+- (double)(end.tv_sec - start.tv_sec) * 1000 * 1000;
+-}
+-
+-static volatile int must_finish;
+-static volatile int must_exit;
+-
+-static void alarm_handler(int signo)
+-{
+- must_finish = 1;
+-}
+-
+-static void exit_handler(int signo)
+-{
+- must_exit = 1;
+- printf("\nexit requested by user through ctrl+c \n");
+-}
+-
+-static char *units[] = { "", "Ki", "Mi", "Gi", "Ti", 0};
+-
+-static void value2human(double bytes, double time, double* data, double* speed,char* metric)
+-{
+- int unit = 0;
+-
+- *data = bytes;
+- while (*data > 1024 && units[unit + 1]) {
+- *data /= 1024;
+- unit++;
+- }
+- *speed = *data / time;
+- sprintf(metric, "%sB", units[unit]);
+-}
+-
+-static int encrypt_data(int fdc, struct test_params tp, struct session_op *sess)
+-{
+- struct crypt_op cop;
+- char *buffer, iv[32];
+- char mac[HASH_MAX_LEN];
+- static int val = 23;
+- struct timeval start, end;
+- double total = 0;
+- double secs, ddata, dspeed;
+- char metric[16];
+- int alignmask;
+- int min_alignmask = sizeof(void*) - 1;
+-
+- memset(iv, 0x23, 32);
+-
+- printf("\tEncrypting in chunks of %d bytes: ", tp.nvalue);
+- fflush(stdout);
+-
+- alignmask = get_alignmask(fdc, sess);
+- if (alignmask) {
+- alignmask = ((alignmask < min_alignmask) ? min_alignmask : alignmask);
+- if (posix_memalign((void **)(&buffer), alignmask + 1, tp.nvalue)) {
+- printf("posix_memalign() failed!\n");
+- return 1;
+- }
+- } else {
+- if (!(buffer = malloc(tp.nvalue))) {
+- perror("malloc()");
+- return 1;
+- }
+- }
+- memset(buffer, val++, tp.nvalue);
+-
+- must_finish = 0;
+- alarm(tp.tvalue);
+-
+- gettimeofday(&start, NULL);
+- do {
+- memset(&cop, 0, sizeof(cop));
+- cop.ses = sess->ses;
+- cop.len = tp.nvalue;
+- cop.iv = (unsigned char *)iv;
+- cop.op = COP_ENCRYPT;
+- cop.src = cop.dst = (unsigned char *)buffer;
+- cop.mac = (unsigned char *)mac;
+-
+- if (ioctl(fdc, CIOCCRYPT, &cop)) {
+- perror("ioctl(CIOCCRYPT)");
+- return 1;
+- }
+- total += cop.len;
+- } while(!must_finish);
+- gettimeofday(&end, NULL);
+-
+- secs = udifftimeval(start, end)/ 1000000.0;
+-
+- value2human(total, secs, &ddata, &dspeed, metric);
+- printf ("done. %.2f %s in %.2f secs: ", ddata, metric, secs);
+- printf ("%.2f %s/sec\n", dspeed, metric);
+-
+- free(buffer);
+- return 0;
+-}
+-
+-void usage(char *cmd_name)
+-{
+- printf(usage_str, cmd_name);
+-}
+-
+-int run_test(int id, struct test_params tp)
+-{
+- int fd;
+- int fdc;
+-
+- fd = open("/dev/crypto", O_RDWR, 0);
+- if (fd < 0) {
+- perror("open()");
+- return fd;
+- }
+- if (ioctl(fd, CRIOGET, &fdc)) {
+- perror("ioctl(CRIOGET)");
+- return -EINVAL;
+- }
+-
+- ciphers[id].func(fdc, tp);
+-
+- close(fdc);
+- close(fd);
+-
+- return 0;
+-}
+-
+-int get_alignmask(int fdc, struct session_op *sess)
+-{
+- int alignmask;
+-
+-#ifdef CIOCGSESSINFO
+- struct session_info_op siop;
+-
+- siop.ses = sess->ses;
+- if (ioctl(fdc, CIOCGSESSINFO, &siop)) {
+- perror("ioctl(CIOCGSESSINFO)");
+- return -EINVAL;
+- }
+- alignmask = siop.alignmask;
+-#else
+- alignmask = 0;
+-#endif
+-
+- return alignmask;
+-}
+-
+-void do_test_vectors(int fdc, struct test_params tp, struct session_op *sess)
+-{
+- int i;
+-
+- if (tp.nflag) {
+- encrypt_data(fdc, tp, sess);
+- } else {
+- for (i = 256; i <= (64 * 1024); i *= 2) {
+- if (must_exit)
+- break;
+-
+- tp.nvalue = i;
+- if (encrypt_data(fdc, tp, sess)) {
+- break;
+- }
+- }
+- }
+-}
+-
+-
+-int run_null(int fdc, struct test_params tp)
+-{
+- struct session_op sess;
+- char keybuf[32];
+-
+- fprintf(stderr, "Testing NULL cipher: \n");
+- memset(&sess, 0, sizeof(sess));
+- sess.cipher = CRYPTO_NULL;
+- sess.keylen = 0;
+- sess.key = (unsigned char *)keybuf;
+- if (ioctl(fdc, CIOCGSESSION, &sess)) {
+- perror("ioctl(CIOCGSESSION)");
+- return -EINVAL;
+- }
+-
+- do_test_vectors(fdc, tp, &sess);
+- return 0;
+-}
+-
+-int run_aes_128_cbc(int fdc, struct test_params tp)
+-{
+- struct session_op sess;
+- char keybuf[32];
+-
+- fprintf(stderr, "\nTesting AES-128-CBC cipher: \n");
+- memset(&sess, 0, sizeof(sess));
+- sess.cipher = CRYPTO_AES_CBC;
+- sess.keylen = 16;
+- memset(keybuf, 0x42, 16);
+- sess.key = (unsigned char *)keybuf;
+- if (ioctl(fdc, CIOCGSESSION, &sess)) {
+- perror("ioctl(CIOCGSESSION)");
+- return -EINVAL;
+- }
+-
+- do_test_vectors(fdc, tp, &sess);
+- return 0;
+-}
+-
+-int run_aes_256_xts(int fdc, struct test_params tp)
+-{
+- struct session_op sess;
+- char keybuf[32];
+-
+- fprintf(stderr, "\nTesting AES-256-XTS cipher: \n");
+- memset(&sess, 0, sizeof(sess));
+- sess.cipher = CRYPTO_AES_XTS;
+- sess.keylen = 32;
+- memset(keybuf, 0x42, sess.keylen);
+- sess.key = (unsigned char *)keybuf;
+- if (ioctl(fdc, CIOCGSESSION, &sess)) {
+- perror("ioctl(CIOCGSESSION)");
+- return -EINVAL;
+- }
+-
+- do_test_vectors(fdc, tp, &sess);
+- return 0;
+-}
+-
+-int run_crc32c(int fdc, struct test_params tp)
+-{
+- struct session_op sess;
+-
+- fprintf(stderr, "\nTesting CRC32C hash: \n");
+- memset(&sess, 0, sizeof(sess));
+- sess.mac = CRYPTO_CRC32C;
+- if (ioctl(fdc, CIOCGSESSION, &sess)) {
+- perror("ioctl(CIOCGSESSION)");
+- return 1;
+- }
+-
+- do_test_vectors(fdc, tp, &sess);
+- return 0;
+-}
+-
+-int run_sha1(int fdc, struct test_params tp)
+-{
+- struct session_op sess;
+-
+- fprintf(stderr, "\nTesting SHA-1 hash: \n");
+- memset(&sess, 0, sizeof(sess));
+- sess.mac = CRYPTO_SHA1;
+- if (ioctl(fdc, CIOCGSESSION, &sess)) {
+- perror("ioctl(CIOCGSESSION)");
+- return 1;
+- }
+-
+- do_test_vectors(fdc, tp, &sess);
+- return 0;
+-}
+-
+-int run_sha256(int fdc, struct test_params tp)
+-{
+- struct session_op sess;
+-
+- fprintf(stderr, "\nTesting SHA2-256 hash: \n");
+- memset(&sess, 0, sizeof(sess));
+- sess.mac = CRYPTO_SHA2_256;
+- if (ioctl(fdc, CIOCGSESSION, &sess)) {
+- perror("ioctl(CIOCGSESSION)");
+- return 1;
+- }
+-
+- do_test_vectors(fdc, tp, &sess);
+- return 0;
+-}
+-
+-int main(int argc, char **argv)
+-{
+- int i;
+- int c;
+- bool alg_flag;
+- char *alg_name;
+- struct test_params tp;
+-
+- tp.tflag = false;
+- tp.nflag = false;
+- alg_flag = false;
+- opterr = 0;
+- while ((c = getopt(argc, argv, "hn:t:")) != -1) {
+- switch (c) {
+- case 'n':
+- tp.nvalue = atoi(optarg);
+- tp.nflag = true;
+- break;
+- case 't':
+- tp.tvalue = atoi(optarg);
+- tp.tflag = true;
+- break;
+- case 'h': /* no break */
+- default:
+- usage(argv[0]);
+- exit(1);
+- }
+- }
+-
+- /* the name of a specific test asked on the command line */
+- if (optind < argc) {
+- alg_name = argv[optind];
+- alg_flag = true;
+- }
+-
+- /* default test time */
+- if (!tp.tflag) {
+- tp.tvalue = 5;
+- }
+-
+- signal(SIGALRM, alarm_handler);
+- signal(SIGINT, exit_handler);
+-
+- for (i = 0; i < ALG_COUNT; i++) {
+- if (must_exit)
+- break;
+-
+- if (alg_flag) {
+- if (strcmp(alg_name, ciphers[i].name) == 0) {
+- run_test(i, tp);
+- }
+- } else {
+- run_test(i, tp);
+- }
+- }
+-
+- return 0;
+-}
+--
+2.10.2
+