aboutsummaryrefslogtreecommitdiff
path: root/test/common_plat
diff options
context:
space:
mode:
Diffstat (limited to 'test/common_plat')
-rw-r--r--test/common_plat/miscellaneous/odp_api_from_cpp.cpp3
-rw-r--r--test/common_plat/performance/Makefile.am2
-rw-r--r--test/common_plat/performance/odp_bench_packet.c86
-rw-r--r--test/common_plat/performance/odp_crypto.c62
-rw-r--r--test/common_plat/performance/odp_l2fwd.c155
-rwxr-xr-xtest/common_plat/performance/odp_l2fwd_run.sh3
-rw-r--r--test/common_plat/performance/odp_pktio_ordered.c5
-rwxr-xr-xtest/common_plat/performance/odp_pktio_ordered_run.sh36
-rw-r--r--test/common_plat/performance/odp_sched_latency.c77
-rw-r--r--test/common_plat/performance/odp_scheduling.c12
-rw-r--r--test/common_plat/validation/api/classification/odp_classification_common.c4
-rw-r--r--test/common_plat/validation/api/crypto/crypto.h12
-rw-r--r--test/common_plat/validation/api/crypto/odp_crypto_test_inp.c599
-rw-r--r--test/common_plat/validation/api/crypto/test_vectors.h183
-rw-r--r--test/common_plat/validation/api/crypto/test_vectors_len.h18
-rw-r--r--test/common_plat/validation/api/lock/lock.c21
-rw-r--r--test/common_plat/validation/api/pktio/Makefile.am4
-rw-r--r--test/common_plat/validation/api/pktio/parser.c545
-rw-r--r--test/common_plat/validation/api/pktio/parser.h180
-rw-r--r--test/common_plat/validation/api/pktio/pktio.c18
-rw-r--r--test/common_plat/validation/api/pktio/pktio.h3
-rw-r--r--test/common_plat/validation/api/queue/queue.c49
-rw-r--r--test/common_plat/validation/api/scheduler/scheduler.c20
-rw-r--r--test/common_plat/validation/api/system/system.c8
-rw-r--r--test/common_plat/validation/api/system/system.h1
-rw-r--r--test/common_plat/validation/api/time/Makefile.am10
-rw-r--r--test/common_plat/validation/api/time/time.c77
-rwxr-xr-xtest/common_plat/validation/api/time/time.sh42
-rw-r--r--test/common_plat/validation/api/time/time_main.c2
-rw-r--r--test/common_plat/validation/api/time/time_test.h (renamed from test/common_plat/validation/api/time/time.h)2
-rw-r--r--test/common_plat/validation/api/traffic_mngr/Makefile.am12
-rwxr-xr-xtest/common_plat/validation/api/traffic_mngr/traffic_mngr.sh41
32 files changed, 2019 insertions, 273 deletions
diff --git a/test/common_plat/miscellaneous/odp_api_from_cpp.cpp b/test/common_plat/miscellaneous/odp_api_from_cpp.cpp
index 2b3078642..4578ae4be 100644
--- a/test/common_plat/miscellaneous/odp_api_from_cpp.cpp
+++ b/test/common_plat/miscellaneous/odp_api_from_cpp.cpp
@@ -1,10 +1,9 @@
#include <cstdio>
#include <odp_api.h>
-#include <odp/helper/threads.h>
+#include <odp/helper/odph_api.h>
int main(int argc ODP_UNUSED, const char *argv[] ODP_UNUSED)
{
-
printf("\tODP API version: %s\n", odp_version_api_str());
printf("\tODP implementation version: %s\n", odp_version_impl_str());
diff --git a/test/common_plat/performance/Makefile.am b/test/common_plat/performance/Makefile.am
index 9111c0c2d..3299f03f8 100644
--- a/test/common_plat/performance/Makefile.am
+++ b/test/common_plat/performance/Makefile.am
@@ -51,3 +51,5 @@ dist_odp_scheduling_SOURCES = odp_scheduling.c
dist_odp_pktio_perf_SOURCES = odp_pktio_perf.c
EXTRA_DIST = $(TESTSCRIPTS)
+
+dist_check_SCRIPTS = udp64.pcap
diff --git a/test/common_plat/performance/odp_bench_packet.c b/test/common_plat/performance/odp_bench_packet.c
index 8a1333276..c4cd6139b 100644
--- a/test/common_plat/performance/odp_bench_packet.c
+++ b/test/common_plat/performance/odp_bench_packet.c
@@ -338,6 +338,21 @@ static void alloc_concat_packets(void)
TEST_REPEAT_COUNT);
}
+static void alloc_ref_packets(void)
+{
+ int i;
+ odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
+ odp_packet_t *ref_tbl = gbl_args->pkt2_tbl;
+
+ allocate_test_packets(gbl_args->pkt.len, pkt_tbl, TEST_REPEAT_COUNT);
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++) {
+ ref_tbl[i] = odp_packet_ref(pkt_tbl[i], TEST_MIN_PKT_SIZE / 2);
+ if (ref_tbl[i] == ODP_PACKET_INVALID)
+ LOG_ABORT("Allocating packet reference failed\n");
+ }
+}
+
static void alloc_packets_twice(void)
{
allocate_test_packets(gbl_args->pkt.len, gbl_args->pkt_tbl,
@@ -1212,6 +1227,67 @@ static int bench_packet_ts_set(void)
return i;
}
+static int bench_packet_ref_static(void)
+{
+ int i;
+ odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
+ odp_packet_t *ref_tbl = gbl_args->pkt2_tbl;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ ref_tbl[i] = odp_packet_ref_static(pkt_tbl[i]);
+
+ return i;
+}
+
+static int bench_packet_ref(void)
+{
+ int i;
+ uint32_t offset = TEST_MIN_PKT_SIZE / 2;
+ odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
+ odp_packet_t *ref_tbl = gbl_args->pkt2_tbl;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ ref_tbl[i] = odp_packet_ref(pkt_tbl[i], offset);
+
+ return i;
+}
+
+static int bench_packet_ref_pkt(void)
+{
+ int i;
+ uint32_t offset = TEST_MIN_PKT_SIZE / 2;
+ odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
+ odp_packet_t *hdr_tbl = gbl_args->pkt2_tbl;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ hdr_tbl[i] = odp_packet_ref_pkt(pkt_tbl[i], offset, hdr_tbl[i]);
+
+ return i;
+}
+
+static int bench_packet_unshared_len(void)
+{
+ int i;
+ uint32_t ret = 0;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ ret += odp_packet_unshared_len(gbl_args->pkt_tbl[i]);
+
+ return ret;
+}
+
+static int bench_packet_has_ref(void)
+{
+ int i;
+ uint32_t ret = 0;
+ odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
+
+ for (i = 0; i < TEST_REPEAT_COUNT; i++)
+ ret += odp_packet_has_ref(pkt_tbl[i]);
+
+ return i;
+}
+
/**
* Prinf usage information
*/
@@ -1445,6 +1521,16 @@ bench_info_t test_suite[] = {
BENCH_INFO(bench_packet_ts, create_packets, free_packets, NULL),
BENCH_INFO(bench_packet_ts_set, create_packets, free_packets,
NULL),
+ BENCH_INFO(bench_packet_ref_static, create_packets,
+ free_packets_twice, NULL),
+ BENCH_INFO(bench_packet_ref, create_packets,
+ free_packets_twice, NULL),
+ BENCH_INFO(bench_packet_ref_pkt, alloc_packets_twice,
+ free_packets_twice, NULL),
+ BENCH_INFO(bench_packet_unshared_len, alloc_ref_packets,
+ free_packets_twice, NULL),
+ BENCH_INFO(bench_packet_has_ref, alloc_ref_packets,
+ free_packets_twice, NULL),
};
/**
diff --git a/test/common_plat/performance/odp_crypto.c b/test/common_plat/performance/odp_crypto.c
index 954bdb794..c3dd6d38f 100644
--- a/test/common_plat/performance/odp_crypto.c
+++ b/test/common_plat/performance/odp_crypto.c
@@ -50,7 +50,6 @@ static uint8_t test_key24[24] = { 0x01, 0x02, 0x03, 0x04, 0x05,
typedef struct {
const char *name; /**< Algorithm name */
odp_crypto_session_param_t session; /**< Prefilled crypto session params */
- unsigned int hash_adjust; /**< Size of hash */
} crypto_alg_config_t;
/**
@@ -205,25 +204,25 @@ static crypto_alg_config_t algs_config[] = {
.data = test_iv,
.length = 8,
},
- .auth_alg = ODP_AUTH_ALG_MD5_96,
+ .auth_alg = ODP_AUTH_ALG_MD5_HMAC,
.auth_key = {
.data = test_key16,
.length = sizeof(test_key16)
- }
+ },
+ .auth_digest_len = 12,
},
- .hash_adjust = 12
},
{
.name = "null-hmac-md5-96",
.session = {
.cipher_alg = ODP_CIPHER_ALG_NULL,
- .auth_alg = ODP_AUTH_ALG_MD5_96,
+ .auth_alg = ODP_AUTH_ALG_MD5_HMAC,
.auth_key = {
.data = test_key16,
.length = sizeof(test_key16)
- }
+ },
+ .auth_digest_len = 12,
},
- .hash_adjust = 12
},
};
@@ -578,7 +577,7 @@ run_measure_one(crypto_args_t *cargs,
mem = odp_packet_data(params.out_pkt);
print_mem("Immediately encrypted packet", mem,
payload_length +
- config->hash_adjust);
+ config->session.auth_digest_len);
}
if (!cargs->in_place) {
if (cargs->reuse_packet) {
@@ -611,7 +610,8 @@ run_measure_one(crypto_args_t *cargs,
print_mem("Receieved encrypted packet",
mem,
payload_length +
- config->hash_adjust);
+ config->
+ session.auth_digest_len);
}
if (cargs->reuse_packet) {
params.pkt = out_pkt;
@@ -665,34 +665,32 @@ run_measure_one_config(crypto_args_t *cargs,
int rc = 0;
if (create_session_from_config(&session, config, cargs))
- rc = -1;
-
- if (!rc) {
- if (cargs->payload_length) {
- rc = run_measure_one(cargs, config, &session,
- cargs->payload_length, &result);
- if (!rc) {
- print_result_header();
- print_result(cargs, cargs->payload_length,
- config, &result);
- }
- } else {
- unsigned i;
+ return -1;
+ if (cargs->payload_length) {
+ rc = run_measure_one(cargs, config, &session,
+ cargs->payload_length, &result);
+ if (!rc) {
print_result_header();
- for (i = 0; i < num_payloads; i++) {
- rc = run_measure_one(cargs, config, &session,
- payloads[i], &result);
- if (rc)
- break;
- print_result(cargs, payloads[i],
- config, &result);
- }
+ print_result(cargs, cargs->payload_length,
+ config, &result);
+ }
+ } else {
+ unsigned i;
+
+ print_result_header();
+ for (i = 0; i < num_payloads; i++) {
+ rc = run_measure_one(cargs, config, &session,
+ payloads[i], &result);
+ if (rc)
+ break;
+ print_result(cargs, payloads[i],
+ config, &result);
}
}
- if (session != ODP_CRYPTO_SESSION_INVALID)
- odp_crypto_session_destroy(session);
+ odp_crypto_session_destroy(session);
+
return rc;
}
diff --git a/test/common_plat/performance/odp_l2fwd.c b/test/common_plat/performance/odp_l2fwd.c
index 8f5c5e152..78b3633bd 100644
--- a/test/common_plat/performance/odp_l2fwd.c
+++ b/test/common_plat/performance/odp_l2fwd.c
@@ -104,6 +104,7 @@ typedef struct {
int src_change; /**< Change source eth addresses */
int error_check; /**< Check packet errors */
int sched_mode; /**< Scheduler mode */
+ int num_groups; /**< Number of scheduling groups */
} appl_args_t;
static int exit_threads; /**< Break workers loop if set to 1 */
@@ -130,6 +131,7 @@ typedef union {
typedef struct thread_args_t {
int thr_idx;
int num_pktio;
+ int num_groups;
struct {
odp_pktin_queue_t pktin;
@@ -142,7 +144,12 @@ typedef struct thread_args_t {
int tx_queue_idx;
} pktio[MAX_PKTIOS];
- stats_t *stats; /**< Pointer to per thread stats */
+ /* Groups to join */
+ odp_schedule_group_t group[MAX_PKTIOS];
+
+ /* Pointer to per thread stats */
+ stats_t *stats;
+
} thread_args_t;
/**
@@ -297,6 +304,22 @@ static int run_worker_sched_mode(void *arg)
thr = odp_thread_id();
+ if (gbl_args->appl.num_groups) {
+ odp_thrmask_t mask;
+
+ odp_thrmask_zero(&mask);
+ odp_thrmask_set(&mask, thr);
+
+ /* Join non-default groups */
+ for (i = 0; i < thr_args->num_groups; i++) {
+ if (odp_schedule_group_join(thr_args->group[i],
+ &mask)) {
+ LOG_ERR("Join failed\n");
+ return -1;
+ }
+ }
+ }
+
num_pktio = thr_args->num_pktio;
if (num_pktio > MAX_PKTIOS) {
@@ -590,12 +613,13 @@ static int run_worker_direct_mode(void *arg)
* @retval -1 on failure
*/
static int create_pktio(const char *dev, int idx, int num_rx, int num_tx,
- odp_pool_t pool)
+ odp_pool_t pool, odp_schedule_group_t group)
{
odp_pktio_t pktio;
odp_pktio_param_t pktio_param;
odp_schedule_sync_t sync_mode;
odp_pktio_capability_t capa;
+ odp_pktio_config_t config;
odp_pktin_queue_param_t pktin_param;
odp_pktout_queue_param_t pktout_param;
odp_pktio_op_mode_t mode_rx;
@@ -632,6 +656,12 @@ static int create_pktio(const char *dev, int idx, int num_rx, int num_tx,
return -1;
}
+ odp_pktio_config_init(&config);
+ config.parser.layer = gbl_args->appl.error_check ?
+ ODP_PKTIO_PARSER_LAYER_ALL :
+ ODP_PKTIO_PARSER_LAYER_NONE;
+ odp_pktio_config(pktio, &config);
+
odp_pktin_queue_param_init(&pktin_param);
odp_pktout_queue_param_init(&pktout_param);
@@ -650,7 +680,7 @@ static int create_pktio(const char *dev, int idx, int num_rx, int num_tx,
pktin_param.queue_param.sched.prio = ODP_SCHED_PRIO_DEFAULT;
pktin_param.queue_param.sched.sync = sync_mode;
- pktin_param.queue_param.sched.group = ODP_SCHED_GROUP_ALL;
+ pktin_param.queue_param.sched.group = group;
}
if (num_rx > (int)capa.max_input_queues) {
@@ -1016,39 +1046,46 @@ static void usage(char *progname)
printf("\n"
"OpenDataPlane L2 forwarding application.\n"
"\n"
- "Usage: %s OPTIONS\n"
+ "Usage: %s [options]\n"
+ "\n"
" E.g. %s -i eth0,eth1,eth2,eth3 -m 0 -t 1\n"
- " In the above example,\n"
- " eth0 will send pkts to eth1 and vice versa\n"
- " eth2 will send pkts to eth3 and vice versa\n"
+ " In the above example,\n"
+ " eth0 will send pkts to eth1 and vice versa\n"
+ " eth2 will send pkts to eth3 and vice versa\n"
"\n"
"Mandatory OPTIONS:\n"
- " -i, --interface Eth interfaces (comma-separated, no spaces)\n"
- " Interface count min 1, max %i\n"
+ " -i, --interface <name> Eth interfaces (comma-separated, no spaces)\n"
+ " Interface count min 1, max %i\n"
"\n"
"Optional OPTIONS:\n"
- " -m, --mode Packet input mode\n"
- " 0: Direct mode: PKTIN_MODE_DIRECT (default)\n"
- " 1: Scheduler mode with parallel queues: PKTIN_MODE_SCHED + SCHED_SYNC_PARALLEL\n"
- " 2: Scheduler mode with atomic queues: PKTIN_MODE_SCHED + SCHED_SYNC_ATOMIC\n"
- " 3: Scheduler mode with ordered queues: PKTIN_MODE_SCHED + SCHED_SYNC_ORDERED\n"
- " 4: Plain queue mode: ODP_PKTIN_MODE_QUEUE\n"
- " -o, --out_mode Packet output mode\n"
- " 0: Direct mode: PKTOUT_MODE_DIRECT (default)\n"
- " 1: Queue mode: PKTOUT_MODE_QUEUE\n"
- " -c, --count <number> CPU count.\n"
- " -t, --time <number> Time in seconds to run.\n"
- " -a, --accuracy <number> Time in seconds get print statistics\n"
+ " -m, --mode <arg> Packet input mode\n"
+ " 0: Direct mode: PKTIN_MODE_DIRECT (default)\n"
+ " 1: Scheduler mode with parallel queues:\n"
+ " PKTIN_MODE_SCHED + SCHED_SYNC_PARALLEL\n"
+ " 2: Scheduler mode with atomic queues:\n"
+ " PKTIN_MODE_SCHED + SCHED_SYNC_ATOMIC\n"
+ " 3: Scheduler mode with ordered queues:\n"
+ " PKTIN_MODE_SCHED + SCHED_SYNC_ORDERED\n"
+ " 4: Plain queue mode: PKTIN_MODE_QUEUE\n"
+ " -o, --out_mode <arg> Packet output mode\n"
+ " 0: Direct mode: PKTOUT_MODE_DIRECT (default)\n"
+ " 1: Queue mode: PKTOUT_MODE_QUEUE\n"
+ " -c, --count <num> CPU count.\n"
+ " -t, --time <sec> Time in seconds to run.\n"
+ " -a, --accuracy <sec> Time in seconds get print statistics\n"
" (default is 1 second).\n"
- " -d, --dst_change 0: Don't change packets' dst eth addresses\n"
- " 1: Change packets' dst eth addresses (default)\n"
- " -s, --src_change 0: Don't change packets' src eth addresses\n"
- " 1: Change packets' src eth addresses (default)\n"
- " -r, --dst_addr Destination addresses (comma-separated, no spaces)\n"
- " Requires also the -d flag to be set\n"
- " -e, --error_check 0: Don't check packet errors (default)\n"
- " 1: Check packet errors\n"
- " -h, --help Display help and exit.\n\n"
+ " -d, --dst_change <arg> 0: Don't change packets' dst eth addresses\n"
+ " 1: Change packets' dst eth addresses (default)\n"
+ " -s, --src_change <arg> 0: Don't change packets' src eth addresses\n"
+ " 1: Change packets' src eth addresses (default)\n"
+ " -r, --dst_addr <addr> Destination addresses (comma-separated, no spaces)\n"
+ " Requires also the -d flag to be set\n"
+ " -e, --error_check <arg> 0: Don't check packet errors (default)\n"
+ " 1: Check packet errors\n"
+ " -g, --groups <num> Number of groups to use: 0 ... num\n"
+ " 0: SCHED_GROUP_ALL (default)\n"
+ " num: must not exceed number of interfaces or workers\n"
+ " -h, --help Display help and exit.\n\n"
"\n", NO_PATH(progname), NO_PATH(progname), MAX_PKTIOS
);
}
@@ -1079,11 +1116,12 @@ static void parse_args(int argc, char *argv[], appl_args_t *appl_args)
{"dst_change", required_argument, NULL, 'd'},
{"src_change", required_argument, NULL, 's'},
{"error_check", required_argument, NULL, 'e'},
+ {"groups", required_argument, NULL, 'g'},
{"help", no_argument, NULL, 'h'},
{NULL, 0, NULL, 0}
};
- static const char *shortopts = "+c:+t:+a:i:m:o:r:d:s:e:h";
+ static const char *shortopts = "+c:+t:+a:i:m:o:r:d:s:e:g:h";
/* let helper collect its own arguments (e.g. --odph_proc) */
odph_parse_options(argc, argv, shortopts, longopts);
@@ -1092,6 +1130,7 @@ static void parse_args(int argc, char *argv[], appl_args_t *appl_args)
appl_args->accuracy = 1; /* get and print pps stats second */
appl_args->dst_change = 1; /* change eth dst address by default */
appl_args->src_change = 1; /* change eth src address by default */
+ appl_args->num_groups = 0; /* use default group */
appl_args->error_check = 0; /* don't check packet errors by default */
opterr = 0; /* do not issue errors on helper options */
@@ -1217,6 +1256,9 @@ static void parse_args(int argc, char *argv[], appl_args_t *appl_args)
case 'e':
appl_args->error_check = atoi(optarg);
break;
+ case 'g':
+ appl_args->num_groups = atoi(optarg);
+ break;
case 'h':
usage(argv[0]);
exit(EXIT_SUCCESS);
@@ -1305,6 +1347,24 @@ static void gbl_args_init(args_t *args)
}
}
+static void create_groups(int num, odp_schedule_group_t *group)
+{
+ int i;
+ odp_thrmask_t zero;
+
+ odp_thrmask_zero(&zero);
+
+ /* Create groups */
+ for (i = 0; i < num; i++) {
+ group[i] = odp_schedule_group_create(NULL, &zero);
+
+ if (group[i] == ODP_SCHED_GROUP_INVALID) {
+ LOG_ERR("Group create failed\n");
+ exit(EXIT_FAILURE);
+ }
+ }
+}
+
/**
* ODP L2 forwarding main function
*/
@@ -1325,6 +1385,8 @@ int main(int argc, char *argv[])
int if_count;
int (*thr_run_func)(void *);
odp_instance_t instance;
+ int num_groups;
+ odp_schedule_group_t group[MAX_PKTIOS];
/* Init ODP before calling anything else */
if (odp_init_global(&instance, NULL, NULL)) {
@@ -1374,10 +1436,23 @@ int main(int argc, char *argv[])
if_count = gbl_args->appl.if_count;
+ num_groups = gbl_args->appl.num_groups;
+
printf("num worker threads: %i\n", num_workers);
printf("first CPU: %i\n", odp_cpumask_first(&cpumask));
printf("cpu mask: %s\n", cpumaskstr);
+ if (num_groups)
+ printf("num groups: %i\n", num_groups);
+
+ printf("\n");
+
+ if (num_groups > if_count || num_groups > num_workers) {
+ LOG_ERR("Too many groups. Number of groups may not exceed "
+ "number of interfaces or workers.\n");
+ exit(EXIT_FAILURE);
+ }
+
/* Create packet pool */
odp_pool_param_init(&params);
params.pkt.seg_len = SHM_PKT_POOL_BUF_SIZE;
@@ -1399,9 +1474,18 @@ int main(int argc, char *argv[])
bind_workers();
+ /* Default */
+ if (num_groups == 0) {
+ group[0] = ODP_SCHED_GROUP_ALL;
+ num_groups = 1;
+ } else {
+ create_groups(num_groups, group);
+ }
+
for (i = 0; i < if_count; ++i) {
const char *dev = gbl_args->appl.if_names[i];
int num_rx, num_tx;
+ odp_schedule_group_t grp;
/* A queue per worker in scheduled mode */
num_rx = num_workers;
@@ -1413,7 +1497,10 @@ int main(int argc, char *argv[])
num_tx = gbl_args->pktios[i].num_tx_thr;
}
- if (create_pktio(dev, i, num_rx, num_tx, pool))
+ /* Round robin pktios to groups */
+ grp = group[i % num_groups];
+
+ if (create_pktio(dev, i, num_rx, num_tx, pool, grp))
exit(EXIT_FAILURE);
/* Save interface ethernet address */
@@ -1473,6 +1560,10 @@ int main(int argc, char *argv[])
thr_params.thr_type = ODP_THREAD_WORKER;
thr_params.instance = instance;
+ /* Round robin threads to groups */
+ gbl_args->thread[i].num_groups = 1;
+ gbl_args->thread[i].group[0] = group[i % num_groups];
+
gbl_args->thread[i].stats = &stats[i];
odp_cpumask_zero(&thd_mask);
diff --git a/test/common_plat/performance/odp_l2fwd_run.sh b/test/common_plat/performance/odp_l2fwd_run.sh
index dd42ede97..6871e4b07 100755
--- a/test/common_plat/performance/odp_l2fwd_run.sh
+++ b/test/common_plat/performance/odp_l2fwd_run.sh
@@ -96,6 +96,9 @@ run_l2fwd()
ret=1
elif [ $ret -eq 0 ]; then
PASS_PPS=5000
+ if [ "${TEST}" = "coverage" ]; then
+ PASS_PPS=10
+ fi
MAX_PPS=$(awk '/TEST RESULT/ {print $3}' $LOG)
if [ "$MAX_PPS" -lt "$PASS_PPS" ]; then
echo "FAIL: pps below threshold $MAX_PPS < $PASS_PPS"
diff --git a/test/common_plat/performance/odp_pktio_ordered.c b/test/common_plat/performance/odp_pktio_ordered.c
index bff4586e5..4bb0bef93 100644
--- a/test/common_plat/performance/odp_pktio_ordered.c
+++ b/test/common_plat/performance/odp_pktio_ordered.c
@@ -586,6 +586,7 @@ static int create_pktio(const char *dev, int idx, int num_rx, int num_tx,
odp_pktio_t pktio;
odp_pktio_param_t pktio_param;
odp_pktio_capability_t capa;
+ odp_pktio_config_t config;
odp_pktin_queue_param_t pktin_param;
odp_pktout_queue_param_t pktout_param;
odp_pktio_op_mode_t mode_rx;
@@ -611,6 +612,10 @@ static int create_pktio(const char *dev, int idx, int num_rx, int num_tx,
return -1;
}
+ odp_pktio_config_init(&config);
+ config.parser.layer = ODP_PKTIO_PARSER_LAYER_L2;
+ odp_pktio_config(pktio, &config);
+
odp_pktin_queue_param_init(&pktin_param);
odp_pktout_queue_param_init(&pktout_param);
diff --git a/test/common_plat/performance/odp_pktio_ordered_run.sh b/test/common_plat/performance/odp_pktio_ordered_run.sh
index d91211c0c..d6c2be526 100755
--- a/test/common_plat/performance/odp_pktio_ordered_run.sh
+++ b/test/common_plat/performance/odp_pktio_ordered_run.sh
@@ -5,14 +5,21 @@
#
# SPDX-License-Identifier: BSD-3-Clause
#
+TEST_SRC_DIR=$(dirname $0)
+TEST_DIR="${TEST_DIR:-$(dirname $0)}"
DURATION=5
LOG=odp_pktio_ordered.log
LOOPS=100000000
PASS_PPS=5000
-PCAP_IN=`find . ${TEST_DIR} $(dirname $0) -name udp64.pcap -print -quit`
+PCAP_IN=`find . ${TEST_SRC_DIR} $(dirname $0) -name udp64.pcap -print -quit`
PCAP_OUT=/dev/null
+if [ ! -f ${PCAP_IN} ]; then
+ echo "FAIL: no udp64.pcap"
+ exit 1
+fi
+
# This just turns off output buffering so that you still get periodic
# output while piping to tee, as long as stdbuf is available.
if [ "$(which stdbuf)" != "" ]; then
@@ -21,20 +28,29 @@ else
STDBUF=
fi
-$STDBUF ./odp_pktio_ordered${EXEEXT} -i pcap:in=${PCAP_IN}:loops=$LOOPS,\
-pcap:out=${PCAP_OUT} -t $DURATION | tee $LOG
+$STDBUF ${TEST_DIR}/odp_pktio_ordered${EXEEXT} \
+ -i pcap:in=${PCAP_IN}:loops=$LOOPS,pcap:out=${PCAP_OUT} \
+ -t $DURATION | tee $LOG
-ret=$?
+ret=${PIPESTATUS[0]}
+
+if [ $ret -ne 0 ]; then
+ echo "FAIL: no odp_pktio_ordered${EXEEXT}"
+ rm -f $LOG
+ exit $ret
+fi
if [ ! -f $LOG ]; then
echo "FAIL: $LOG not found"
ret=1
-elif [ $ret -eq 0 ]; then
- MAX_PPS=$(awk '/TEST RESULT/ {print $3}' $LOG)
- if [ "$MAX_PPS" -lt "$PASS_PPS" ]; then
- echo "FAIL: pps below threshold $MAX_PPS < $PASS_PPS"
- ret=1
- fi
+ exit $ret
+fi
+
+MAX_PPS=$(awk '/TEST RESULT/ {print $3}' $LOG)
+echo "MAX_PPS=$MAX_PPS"
+if [ $MAX_PPS -lt $PASS_PPS ]; then
+ echo "FAIL: pps below threshold $MAX_PPS < $PASS_PPS"
+ ret=1
fi
rm -f $LOG
diff --git a/test/common_plat/performance/odp_sched_latency.c b/test/common_plat/performance/odp_sched_latency.c
index 2b28cd7bc..026f2f6c7 100644
--- a/test/common_plat/performance/odp_sched_latency.c
+++ b/test/common_plat/performance/odp_sched_latency.c
@@ -57,9 +57,10 @@ ODP_STATIC_ASSERT(LO_PRIO_QUEUES <= MAX_QUEUES, "Too many LO priority queues");
/** Test event types */
typedef enum {
- WARM_UP, /**< Warm up event */
- TRAFFIC, /**< Event used only as traffic load */
- SAMPLE /**< Event used to measure latency */
+ WARM_UP, /**< Warm up event */
+ COOL_DOWN,/**< Last event on queue */
+ TRAFFIC, /**< Event used only as traffic load */
+ SAMPLE /**< Event used to measure latency */
} event_type_t;
/** Test event */
@@ -112,20 +113,52 @@ typedef struct {
/**
* Clear all scheduled queues.
*
- * Retry to be sure that all buffers have been scheduled.
+ * Use special cool_down event to guarantee that queue is drained.
*/
-static void clear_sched_queues(void)
+static void clear_sched_queues(test_globals_t *globals)
{
odp_event_t ev;
+ odp_buffer_t buf;
+ test_event_t *event;
+ int i, j;
+ odp_queue_t fromq;
- while (1) {
- ev = odp_schedule(NULL, ODP_SCHED_NO_WAIT);
+ /* Allocate the cool_down event. */
+ buf = odp_buffer_alloc(globals->pool);
+ if (buf == ODP_BUFFER_INVALID)
+ LOG_ABORT("Buffer alloc failed.\n");
- if (ev == ODP_EVENT_INVALID)
- break;
+ event = odp_buffer_addr(buf);
+ event->type = COOL_DOWN;
+ ev = odp_buffer_to_event(buf);
- odp_event_free(ev);
+ for (i = 0; i < NUM_PRIOS; i++) {
+ for (j = 0; j < globals->args.prio[i].queues; j++) {
+ /* Enqueue cool_down event on each queue. */
+ if (odp_queue_enq(globals->queue[i][j], ev))
+ LOG_ABORT("Queue enqueue failed.\n");
+
+ /* Invoke scheduler until cool_down event has been
+ * received. */
+ while (1) {
+ ev = odp_schedule(NULL, ODP_SCHED_WAIT);
+ buf = odp_buffer_from_event(ev);
+ event = odp_buffer_addr(buf);
+ if (event->type == COOL_DOWN)
+ break;
+ odp_event_free(ev);
+ }
+ }
}
+
+ /* Free the cool_down event. */
+ odp_event_free(ev);
+
+ /* Call odp_schedule() to trigger a release of any scheduler context. */
+ ev = odp_schedule(&fromq, ODP_SCHED_NO_WAIT);
+ if (ev != ODP_EVENT_INVALID)
+ LOG_ABORT("Queue %" PRIu64 " not empty.\n",
+ odp_queue_to_u64(fromq));
}
/**
@@ -394,10 +427,10 @@ static int test_schedule(int thr, test_globals_t *globals)
odp_barrier_wait(&globals->barrier);
- clear_sched_queues();
-
- if (thr == MAIN_THREAD)
+ if (thr == MAIN_THREAD) {
+ clear_sched_queues(globals);
print_results(globals);
+ }
return 0;
}
@@ -634,16 +667,7 @@ int main(int argc, char *argv[])
return -1;
}
- printf("\n");
- printf("ODP system info\n");
- printf("---------------\n");
- printf("ODP API version: %s\n", odp_version_api_str());
- printf("ODP impl name: %s\n", odp_version_impl_name());
- printf("ODP impl details: %s\n", odp_version_impl_str());
- printf("CPU model: %s\n", odp_cpu_model_str());
- printf("CPU freq (hz): %" PRIu64 "\n", odp_cpu_hz_max());
- printf("Cache line size: %i\n", odp_sys_cache_line_size());
- printf("Max CPU count: %i\n", odp_cpu_count());
+ odp_sys_info_print();
/* Get default worker cpumask */
if (args.cpu_count)
@@ -654,9 +678,10 @@ int main(int argc, char *argv[])
(void)odp_cpumask_to_str(&cpumask, cpumaskstr, sizeof(cpumaskstr));
- printf("Worker threads: %i\n", num_workers);
- printf("First CPU: %i\n", odp_cpumask_first(&cpumask));
- printf("CPU mask: %s\n\n", cpumaskstr);
+ printf("CPU mask info:\n");
+ printf(" Worker threads: %i\n", num_workers);
+ printf(" First CPU: %i\n", odp_cpumask_first(&cpumask));
+ printf(" CPU mask: %s\n", cpumaskstr);
thread_tbl = calloc(sizeof(odph_odpthread_t), num_workers);
if (!thread_tbl) {
diff --git a/test/common_plat/performance/odp_scheduling.c b/test/common_plat/performance/odp_scheduling.c
index c74a07133..38e76257b 100644
--- a/test/common_plat/performance/odp_scheduling.c
+++ b/test/common_plat/performance/odp_scheduling.c
@@ -273,7 +273,7 @@ static int test_plain_queue(int thr, test_globals_t *globals)
test_message_t *t_msg;
odp_queue_t queue;
uint64_t c1, c2, cycles;
- int i;
+ int i, j;
/* Alloc test message */
buf = odp_buffer_alloc(globals->pool);
@@ -307,7 +307,15 @@ static int test_plain_queue(int thr, test_globals_t *globals)
return -1;
}
- ev = odp_queue_deq(queue);
+ /* When enqueue and dequeue are decoupled (e.g. not using a
+ * common lock), an enqueued event may not be immediately
+ * visible to dequeue. So we just try again for a while. */
+ for (j = 0; j < 100; j++) {
+ ev = odp_queue_deq(queue);
+ if (ev != ODP_EVENT_INVALID)
+ break;
+ odp_cpu_pause();
+ }
buf = odp_buffer_from_event(ev);
diff --git a/test/common_plat/validation/api/classification/odp_classification_common.c b/test/common_plat/validation/api/classification/odp_classification_common.c
index 3b379c14c..eca30b87f 100644
--- a/test/common_plat/validation/api/classification/odp_classification_common.c
+++ b/test/common_plat/validation/api/classification/odp_classification_common.c
@@ -278,14 +278,14 @@ odp_packet_t create_packet(cls_packet_info_t pkt_info)
ethhdr = (odph_ethhdr_t *)odp_packet_l2_ptr(pkt, NULL);
memcpy(ethhdr->src.addr, &src_mac, ODPH_ETHADDR_LEN);
memcpy(ethhdr->dst.addr, &dst_mac_be, ODPH_ETHADDR_LEN);
- vlan_type = (odp_u16be_t *)&ethhdr->type;
+ vlan_type = (odp_u16be_t *)(void *)&ethhdr->type;
vlan_hdr = (odph_vlanhdr_t *)(ethhdr + 1);
if (pkt_info.vlan_qinq) {
odp_packet_has_vlan_qinq_set(pkt, 1);
*vlan_type = odp_cpu_to_be_16(ODPH_ETHTYPE_VLAN_OUTER);
vlan_hdr->tci = odp_cpu_to_be_16(0);
- vlan_type = (uint16_t *)&vlan_hdr->type;
+ vlan_type = (uint16_t *)(void *)&vlan_hdr->type;
vlan_hdr++;
}
if (pkt_info.vlan) {
diff --git a/test/common_plat/validation/api/crypto/crypto.h b/test/common_plat/validation/api/crypto/crypto.h
index 9b909aa04..dd15b448f 100644
--- a/test/common_plat/validation/api/crypto/crypto.h
+++ b/test/common_plat/validation/api/crypto/crypto.h
@@ -10,6 +10,8 @@
#include "odp_cunit_common.h"
/* test functions: */
+void crypto_test_enc_alg_null(void);
+void crypto_test_dec_alg_null(void);
void crypto_test_enc_alg_3des_cbc(void);
void crypto_test_enc_alg_3des_cbc_ovr_iv(void);
void crypto_test_dec_alg_3des_cbc(void);
@@ -22,8 +24,14 @@ void crypto_test_enc_alg_aes128_gcm(void);
void crypto_test_enc_alg_aes128_gcm_ovr_iv(void);
void crypto_test_dec_alg_aes128_gcm(void);
void crypto_test_dec_alg_aes128_gcm_ovr_iv(void);
-void crypto_test_alg_hmac_md5(void);
-void crypto_test_alg_hmac_sha256(void);
+void crypto_test_gen_alg_hmac_md5(void);
+void crypto_test_check_alg_hmac_md5(void);
+void crypto_test_gen_alg_hmac_sha1(void);
+void crypto_test_check_alg_hmac_sha1(void);
+void crypto_test_gen_alg_hmac_sha256(void);
+void crypto_test_check_alg_hmac_sha256(void);
+void crypto_test_gen_alg_hmac_sha512(void);
+void crypto_test_check_alg_hmac_sha512(void);
/* test arrays: */
extern odp_testinfo_t crypto_suite[];
diff --git a/test/common_plat/validation/api/crypto/odp_crypto_test_inp.c b/test/common_plat/validation/api/crypto/odp_crypto_test_inp.c
index 43ddb2ffd..ae600e230 100644
--- a/test/common_plat/validation/api/crypto/odp_crypto_test_inp.c
+++ b/test/common_plat/validation/api/crypto/odp_crypto_test_inp.c
@@ -28,8 +28,12 @@ static const char *auth_alg_name(odp_auth_alg_t auth)
return "ODP_AUTH_ALG_NULL";
case ODP_AUTH_ALG_MD5_HMAC:
return "ODP_AUTH_ALG_MD5_HMAC";
+ case ODP_AUTH_ALG_SHA1_HMAC:
+ return "ODP_AUTH_ALG_SHA1_HMAC";
case ODP_AUTH_ALG_SHA256_HMAC:
return "ODP_AUTH_ALG_SHA256_HMAC";
+ case ODP_AUTH_ALG_SHA512_HMAC:
+ return "ODP_AUTH_ALG_SHA512_HMAC";
case ODP_AUTH_ALG_AES_GCM:
return "ODP_AUTH_ALG_AES_GCM";
default:
@@ -65,14 +69,17 @@ static const char *cipher_alg_name(odp_cipher_alg_t cipher)
* buffer can be used.
* */
static void alg_test(odp_crypto_op_t op,
+ odp_bool_t should_fail,
odp_cipher_alg_t cipher_alg,
odp_crypto_iv_t ses_iv,
uint8_t *op_iv_ptr,
odp_crypto_key_t cipher_key,
odp_auth_alg_t auth_alg,
odp_crypto_key_t auth_key,
- odp_crypto_data_range_t *cipher_range,
- odp_crypto_data_range_t *auth_range,
+ odp_packet_data_range_t *cipher_range,
+ odp_packet_data_range_t *auth_range,
+ uint8_t *aad,
+ uint32_t aad_len,
const uint8_t *plaintext,
unsigned int plaintext_len,
const uint8_t *ciphertext,
@@ -128,9 +135,15 @@ static void alg_test(odp_crypto_op_t op,
if (auth_alg == ODP_AUTH_ALG_NULL &&
!(capa.auths.bit.null))
rc = -1;
+ if (auth_alg == ODP_AUTH_ALG_SHA1_HMAC &&
+ !(capa.auths.bit.sha1_hmac))
+ rc = -1;
if (auth_alg == ODP_AUTH_ALG_SHA256_HMAC &&
!(capa.auths.bit.sha256_hmac))
rc = -1;
+ if (auth_alg == ODP_AUTH_ALG_SHA512_HMAC &&
+ !(capa.auths.bit.sha512_hmac))
+ rc = -1;
CU_ASSERT(!rc);
CU_ASSERT((~capa.auths.all_bits & capa.hw_auths.all_bits) == 0);
@@ -138,13 +151,8 @@ static void alg_test(odp_crypto_op_t op,
num = odp_crypto_cipher_capability(cipher_alg, cipher_capa,
MAX_ALG_CAPA);
- if (cipher_alg != ODP_CIPHER_ALG_NULL) {
- CU_ASSERT(num > 0);
- found = 0;
- } else {
- CU_ASSERT(num == 0);
- found = 1;
- }
+ CU_ASSERT(num > 0);
+ found = 0;
CU_ASSERT(num <= MAX_ALG_CAPA);
@@ -164,13 +172,8 @@ static void alg_test(odp_crypto_op_t op,
num = odp_crypto_auth_capability(auth_alg, auth_capa, MAX_ALG_CAPA);
- if (auth_alg != ODP_AUTH_ALG_NULL) {
- CU_ASSERT(num > 0);
- found = 0;
- } else {
- CU_ASSERT(num == 0);
- found = 1;
- }
+ CU_ASSERT(num > 0);
+ found = 0;
CU_ASSERT(num <= MAX_ALG_CAPA);
@@ -200,6 +203,7 @@ static void alg_test(odp_crypto_op_t op,
ses_params.cipher_key = cipher_key;
ses_params.iv = ses_iv;
ses_params.auth_key = auth_key;
+ ses_params.auth_digest_len = digest_len;
rc = odp_crypto_session_create(&ses_params, &session, &status);
CU_ASSERT_FATAL(!rc);
@@ -238,7 +242,14 @@ static void alg_test(odp_crypto_op_t op,
if (op_iv_ptr)
op_params.override_iv_ptr = op_iv_ptr;
+ op_params.aad.ptr = aad;
+ op_params.aad.length = aad_len;
+
op_params.hash_result_offset = plaintext_len;
+ if (0 != digest_len) {
+ memcpy(data_addr + op_params.hash_result_offset,
+ digest, digest_len);
+ }
rc = odp_crypto_operation(&op_params, &posted, &result);
if (rc < 0) {
@@ -259,8 +270,15 @@ static void alg_test(odp_crypto_op_t op,
odp_crypto_compl_free(compl_event);
}
- CU_ASSERT(result.ok);
CU_ASSERT(result.pkt == pkt);
+ CU_ASSERT(result.ctx == (void *)0xdeadbeef);
+
+ if (should_fail) {
+ CU_ASSERT(!result.ok);
+ goto cleanup;
+ }
+
+ CU_ASSERT(result.ok);
if (cipher_alg != ODP_CIPHER_ALG_NULL)
CU_ASSERT(!memcmp(data_addr, ciphertext, ciphertext_len));
@@ -268,8 +286,6 @@ static void alg_test(odp_crypto_op_t op,
if (op == ODP_CRYPTO_OP_ENCODE && auth_alg != ODP_AUTH_ALG_NULL)
CU_ASSERT(!memcmp(data_addr + op_params.hash_result_offset,
digest, digest_len));
-
- CU_ASSERT(result.ctx == (void *)0xdeadbeef);
cleanup:
rc = odp_crypto_session_destroy(session);
CU_ASSERT(!rc);
@@ -330,10 +346,18 @@ static int check_alg_support(odp_cipher_alg_t cipher, odp_auth_alg_t auth)
if (!capability.auths.bit.md5_hmac)
return ODP_TEST_INACTIVE;
break;
+ case ODP_AUTH_ALG_SHA1_HMAC:
+ if (!capability.auths.bit.sha1_hmac)
+ return ODP_TEST_INACTIVE;
+ break;
case ODP_AUTH_ALG_SHA256_HMAC:
if (!capability.auths.bit.sha256_hmac)
return ODP_TEST_INACTIVE;
break;
+ case ODP_AUTH_ALG_SHA512_HMAC:
+ if (!capability.auths.bit.sha512_hmac)
+ return ODP_TEST_INACTIVE;
+ break;
case ODP_AUTH_ALG_AES_GCM:
if (!capability.auths.bit.aes_gcm)
return ODP_TEST_INACTIVE;
@@ -416,6 +440,73 @@ static int check_auth_options(odp_auth_alg_t auth, uint32_t key_len,
return 1;
}
+static int check_alg_null(void)
+{
+ return check_alg_support(ODP_CIPHER_ALG_NULL, ODP_AUTH_ALG_NULL);
+}
+
+void crypto_test_enc_alg_null(void)
+{
+ odp_crypto_key_t cipher_key = { .data = NULL, .length = 0 },
+ auth_key = { .data = NULL, .length = 0 };
+ odp_crypto_iv_t iv = { .data = NULL, .length = 0};
+ unsigned int test_vec_num = (sizeof(null_reference_length) /
+ sizeof(null_reference_length[0]));
+ unsigned int i;
+
+ for (i = 0; i < test_vec_num; i++) {
+ if (!check_cipher_options(ODP_CIPHER_ALG_NULL,
+ cipher_key.length, iv.length))
+ continue;
+
+ alg_test(ODP_CRYPTO_OP_ENCODE,
+ 0,
+ ODP_CIPHER_ALG_NULL,
+ iv,
+ NULL,
+ cipher_key,
+ ODP_AUTH_ALG_NULL,
+ auth_key,
+ NULL, NULL,
+ NULL, 0,
+ null_reference_plaintext[i],
+ null_reference_length[i],
+ null_reference_plaintext[i],
+ null_reference_length[i], NULL, 0);
+ }
+}
+
+void crypto_test_dec_alg_null(void)
+{
+ odp_crypto_key_t cipher_key = { .data = NULL, .length = 0 },
+ auth_key = { .data = NULL, .length = 0 };
+ odp_crypto_iv_t iv = { .data = NULL, .length = 0 };
+ unsigned int test_vec_num = (sizeof(null_reference_length) /
+ sizeof(null_reference_length[0]));
+ unsigned int i;
+
+ for (i = 0; i < test_vec_num; i++) {
+ if (!check_cipher_options(ODP_CIPHER_ALG_NULL,
+ cipher_key.length, iv.length))
+ continue;
+
+ alg_test(ODP_CRYPTO_OP_DECODE,
+ 0,
+ ODP_CIPHER_ALG_NULL,
+ iv,
+ NULL,
+ cipher_key,
+ ODP_AUTH_ALG_NULL,
+ auth_key,
+ NULL, NULL,
+ NULL, 0,
+ null_reference_plaintext[i],
+ null_reference_length[i],
+ null_reference_plaintext[i],
+ null_reference_length[i], NULL, 0);
+ }
+}
+
static int check_alg_3des_cbc(void)
{
return check_alg_support(ODP_CIPHER_ALG_3DES_CBC, ODP_AUTH_ALG_NULL);
@@ -445,6 +536,7 @@ void crypto_test_enc_alg_3des_cbc(void)
continue;
alg_test(ODP_CRYPTO_OP_ENCODE,
+ 0,
ODP_CIPHER_ALG_3DES_CBC,
iv,
NULL,
@@ -452,6 +544,7 @@ void crypto_test_enc_alg_3des_cbc(void)
ODP_AUTH_ALG_NULL,
auth_key,
NULL, NULL,
+ NULL, 0,
tdes_cbc_reference_plaintext[i],
tdes_cbc_reference_length[i],
tdes_cbc_reference_ciphertext[i],
@@ -480,6 +573,7 @@ void crypto_test_enc_alg_3des_cbc_ovr_iv(void)
continue;
alg_test(ODP_CRYPTO_OP_ENCODE,
+ 0,
ODP_CIPHER_ALG_3DES_CBC,
iv,
tdes_cbc_reference_iv[i],
@@ -487,6 +581,7 @@ void crypto_test_enc_alg_3des_cbc_ovr_iv(void)
ODP_AUTH_ALG_NULL,
auth_key,
NULL, NULL,
+ NULL, 0,
tdes_cbc_reference_plaintext[i],
tdes_cbc_reference_length[i],
tdes_cbc_reference_ciphertext[i],
@@ -519,6 +614,7 @@ void crypto_test_dec_alg_3des_cbc(void)
continue;
alg_test(ODP_CRYPTO_OP_DECODE,
+ 0,
ODP_CIPHER_ALG_3DES_CBC,
iv,
NULL,
@@ -526,6 +622,7 @@ void crypto_test_dec_alg_3des_cbc(void)
ODP_AUTH_ALG_NULL,
auth_key,
NULL, NULL,
+ NULL, 0,
tdes_cbc_reference_ciphertext[i],
tdes_cbc_reference_length[i],
tdes_cbc_reference_plaintext[i],
@@ -556,6 +653,7 @@ void crypto_test_dec_alg_3des_cbc_ovr_iv(void)
continue;
alg_test(ODP_CRYPTO_OP_DECODE,
+ 0,
ODP_CIPHER_ALG_3DES_CBC,
iv,
tdes_cbc_reference_iv[i],
@@ -563,6 +661,7 @@ void crypto_test_dec_alg_3des_cbc_ovr_iv(void)
ODP_AUTH_ALG_NULL,
auth_key,
NULL, NULL,
+ NULL, 0,
tdes_cbc_reference_ciphertext[i],
tdes_cbc_reference_length[i],
tdes_cbc_reference_plaintext[i],
@@ -598,10 +697,12 @@ void crypto_test_enc_alg_aes128_gcm(void)
cipher_key.length, iv.length))
continue;
if (!check_auth_options(ODP_AUTH_ALG_AES_GCM,
- auth_key.length, AES128_GCM_CHECK_LEN))
+ auth_key.length,
+ aes128_gcm_reference_tag_length[i]))
continue;
alg_test(ODP_CRYPTO_OP_ENCODE,
+ 0,
ODP_CIPHER_ALG_AES_GCM,
iv,
NULL,
@@ -609,14 +710,16 @@ void crypto_test_enc_alg_aes128_gcm(void)
ODP_AUTH_ALG_AES_GCM,
auth_key,
&aes128_gcm_cipher_range[i],
- &aes128_gcm_auth_range[i],
+ &aes128_gcm_cipher_range[i],
+ aes128_gcm_reference_aad[i],
+ aes128_gcm_reference_aad_length[i],
aes128_gcm_reference_plaintext[i],
aes128_gcm_reference_length[i],
aes128_gcm_reference_ciphertext[i],
aes128_gcm_reference_length[i],
aes128_gcm_reference_ciphertext[i] +
aes128_gcm_reference_length[i],
- AES128_GCM_CHECK_LEN);
+ aes128_gcm_reference_tag_length[i]);
}
}
@@ -641,10 +744,12 @@ void crypto_test_enc_alg_aes128_gcm_ovr_iv(void)
cipher_key.length, iv.length))
continue;
if (!check_auth_options(ODP_AUTH_ALG_AES_GCM,
- auth_key.length, AES128_GCM_CHECK_LEN))
+ auth_key.length,
+ aes128_gcm_reference_tag_length[i]))
continue;
alg_test(ODP_CRYPTO_OP_ENCODE,
+ 0,
ODP_CIPHER_ALG_AES_GCM,
iv,
aes128_gcm_reference_iv[i],
@@ -652,14 +757,16 @@ void crypto_test_enc_alg_aes128_gcm_ovr_iv(void)
ODP_AUTH_ALG_AES_GCM,
auth_key,
&aes128_gcm_cipher_range[i],
- &aes128_gcm_auth_range[i],
+ &aes128_gcm_cipher_range[i],
+ aes128_gcm_reference_aad[i],
+ aes128_gcm_reference_aad_length[i],
aes128_gcm_reference_plaintext[i],
aes128_gcm_reference_length[i],
aes128_gcm_reference_ciphertext[i],
aes128_gcm_reference_length[i],
aes128_gcm_reference_ciphertext[i] +
aes128_gcm_reference_length[i],
- AES128_GCM_CHECK_LEN);
+ aes128_gcm_reference_tag_length[i]);
}
}
@@ -673,10 +780,13 @@ void crypto_test_dec_alg_aes128_gcm(void)
odp_crypto_key_t cipher_key = { .data = NULL, .length = 0 },
auth_key = { .data = NULL, .length = 0 };
odp_crypto_iv_t iv = { .data = NULL, .length = AES128_GCM_IV_LEN };
+ uint8_t wrong_digest[AES128_GCM_DIGEST_LEN];
unsigned int test_vec_num = (sizeof(aes128_gcm_reference_length) /
sizeof(aes128_gcm_reference_length[0]));
unsigned int i;
+ memset(wrong_digest, 0xa5, sizeof(wrong_digest));
+
for (i = 0; i < test_vec_num; i++) {
cipher_key.data = aes128_gcm_reference_key[i];
cipher_key.length = sizeof(aes128_gcm_reference_key[i]);
@@ -687,10 +797,12 @@ void crypto_test_dec_alg_aes128_gcm(void)
cipher_key.length, iv.length))
continue;
if (!check_auth_options(ODP_AUTH_ALG_AES_GCM,
- auth_key.length, AES128_GCM_CHECK_LEN))
+ auth_key.length,
+ aes128_gcm_reference_tag_length[i]))
continue;
alg_test(ODP_CRYPTO_OP_DECODE,
+ 0,
ODP_CIPHER_ALG_AES_GCM,
iv,
NULL,
@@ -698,14 +810,35 @@ void crypto_test_dec_alg_aes128_gcm(void)
ODP_AUTH_ALG_AES_GCM,
auth_key,
&aes128_gcm_cipher_range[i],
- &aes128_gcm_auth_range[i],
+ &aes128_gcm_cipher_range[i],
+ aes128_gcm_reference_aad[i],
+ aes128_gcm_reference_aad_length[i],
aes128_gcm_reference_ciphertext[i],
- aes128_gcm_reference_length[i] + AES128_GCM_CHECK_LEN,
+ aes128_gcm_reference_length[i],
aes128_gcm_reference_plaintext[i],
aes128_gcm_reference_length[i],
aes128_gcm_reference_ciphertext[i] +
aes128_gcm_reference_length[i],
- AES128_GCM_CHECK_LEN);
+ aes128_gcm_reference_tag_length[i]);
+
+ alg_test(ODP_CRYPTO_OP_DECODE,
+ 1,
+ ODP_CIPHER_ALG_AES_GCM,
+ iv,
+ NULL,
+ cipher_key,
+ ODP_AUTH_ALG_AES_GCM,
+ auth_key,
+ &aes128_gcm_cipher_range[i],
+ &aes128_gcm_cipher_range[i],
+ aes128_gcm_reference_aad[i],
+ aes128_gcm_reference_aad_length[i],
+ aes128_gcm_reference_ciphertext[i],
+ aes128_gcm_reference_length[i],
+ aes128_gcm_reference_plaintext[i],
+ aes128_gcm_reference_length[i],
+ wrong_digest,
+ aes128_gcm_reference_tag_length[i]);
}
}
@@ -719,10 +852,13 @@ void crypto_test_dec_alg_aes128_gcm_ovr_iv(void)
odp_crypto_key_t cipher_key = { .data = NULL, .length = 0 },
auth_key = { .data = NULL, .length = 0 };
odp_crypto_iv_t iv = { .data = NULL, .length = AES128_GCM_IV_LEN };
+ uint8_t wrong_digest[AES128_GCM_DIGEST_LEN];
unsigned int test_vec_num = (sizeof(aes128_gcm_reference_length) /
sizeof(aes128_gcm_reference_length[0]));
unsigned int i;
+ memset(wrong_digest, 0xa5, sizeof(wrong_digest));
+
for (i = 0; i < test_vec_num; i++) {
cipher_key.data = aes128_gcm_reference_key[i];
cipher_key.length = sizeof(aes128_gcm_reference_key[i]);
@@ -731,10 +867,12 @@ void crypto_test_dec_alg_aes128_gcm_ovr_iv(void)
cipher_key.length, iv.length))
continue;
if (!check_auth_options(ODP_AUTH_ALG_AES_GCM,
- auth_key.length, AES128_GCM_CHECK_LEN))
+ auth_key.length,
+ aes128_gcm_reference_tag_length[i]))
continue;
alg_test(ODP_CRYPTO_OP_DECODE,
+ 0,
ODP_CIPHER_ALG_AES_GCM,
iv,
aes128_gcm_reference_iv[i],
@@ -742,14 +880,35 @@ void crypto_test_dec_alg_aes128_gcm_ovr_iv(void)
ODP_AUTH_ALG_AES_GCM,
auth_key,
&aes128_gcm_cipher_range[i],
- &aes128_gcm_auth_range[i],
+ &aes128_gcm_cipher_range[i],
+ aes128_gcm_reference_aad[i],
+ aes128_gcm_reference_aad_length[i],
aes128_gcm_reference_ciphertext[i],
- aes128_gcm_reference_length[i] + AES128_GCM_CHECK_LEN,
+ aes128_gcm_reference_length[i],
aes128_gcm_reference_plaintext[i],
aes128_gcm_reference_length[i],
aes128_gcm_reference_ciphertext[i] +
aes128_gcm_reference_length[i],
- AES128_GCM_CHECK_LEN);
+ aes128_gcm_reference_tag_length[i]);
+
+ alg_test(ODP_CRYPTO_OP_DECODE,
+ 1,
+ ODP_CIPHER_ALG_AES_GCM,
+ iv,
+ aes128_gcm_reference_iv[i],
+ cipher_key,
+ ODP_AUTH_ALG_AES_GCM,
+ auth_key,
+ &aes128_gcm_cipher_range[i],
+ &aes128_gcm_cipher_range[i],
+ aes128_gcm_reference_aad[i],
+ aes128_gcm_reference_aad_length[i],
+ aes128_gcm_reference_ciphertext[i],
+ aes128_gcm_reference_length[i],
+ aes128_gcm_reference_plaintext[i],
+ aes128_gcm_reference_length[i],
+ wrong_digest,
+ aes128_gcm_reference_tag_length[i]);
}
}
@@ -782,6 +941,7 @@ void crypto_test_enc_alg_aes128_cbc(void)
continue;
alg_test(ODP_CRYPTO_OP_ENCODE,
+ 0,
ODP_CIPHER_ALG_AES_CBC,
iv,
NULL,
@@ -789,6 +949,7 @@ void crypto_test_enc_alg_aes128_cbc(void)
ODP_AUTH_ALG_NULL,
auth_key,
NULL, NULL,
+ NULL, 0,
aes128_cbc_reference_plaintext[i],
aes128_cbc_reference_length[i],
aes128_cbc_reference_ciphertext[i],
@@ -817,6 +978,7 @@ void crypto_test_enc_alg_aes128_cbc_ovr_iv(void)
continue;
alg_test(ODP_CRYPTO_OP_ENCODE,
+ 0,
ODP_CIPHER_ALG_AES_CBC,
iv,
aes128_cbc_reference_iv[i],
@@ -824,6 +986,7 @@ void crypto_test_enc_alg_aes128_cbc_ovr_iv(void)
ODP_AUTH_ALG_NULL,
auth_key,
NULL, NULL,
+ NULL, 0,
aes128_cbc_reference_plaintext[i],
aes128_cbc_reference_length[i],
aes128_cbc_reference_ciphertext[i],
@@ -856,6 +1019,7 @@ void crypto_test_dec_alg_aes128_cbc(void)
continue;
alg_test(ODP_CRYPTO_OP_DECODE,
+ 0,
ODP_CIPHER_ALG_AES_CBC,
iv,
NULL,
@@ -863,6 +1027,7 @@ void crypto_test_dec_alg_aes128_cbc(void)
ODP_AUTH_ALG_NULL,
auth_key,
NULL, NULL,
+ NULL, 0,
aes128_cbc_reference_ciphertext[i],
aes128_cbc_reference_length[i],
aes128_cbc_reference_plaintext[i],
@@ -893,6 +1058,7 @@ void crypto_test_dec_alg_aes128_cbc_ovr_iv(void)
continue;
alg_test(ODP_CRYPTO_OP_DECODE,
+ 0,
ODP_CIPHER_ALG_AES_CBC,
iv,
aes128_cbc_reference_iv[i],
@@ -900,6 +1066,7 @@ void crypto_test_dec_alg_aes128_cbc_ovr_iv(void)
ODP_AUTH_ALG_NULL,
auth_key,
NULL, NULL,
+ NULL, 0,
aes128_cbc_reference_ciphertext[i],
aes128_cbc_reference_length[i],
aes128_cbc_reference_plaintext[i],
@@ -919,7 +1086,7 @@ static int check_alg_hmac_md5(void)
* In addition the test verifies if the implementation can use the
* packet buffer as completion event buffer.
* */
-void crypto_test_alg_hmac_md5(void)
+void crypto_test_gen_alg_hmac_md5(void)
{
odp_crypto_key_t cipher_key = { .data = NULL, .length = 0 },
auth_key = { .data = NULL, .length = 0 };
@@ -934,10 +1101,50 @@ void crypto_test_alg_hmac_md5(void)
auth_key.length = sizeof(hmac_md5_reference_key[i]);
if (!check_auth_options(ODP_AUTH_ALG_MD5_HMAC, auth_key.length,
- HMAC_MD5_96_CHECK_LEN))
+ hmac_md5_reference_digest_length[i]))
continue;
alg_test(ODP_CRYPTO_OP_ENCODE,
+ 0,
+ ODP_CIPHER_ALG_NULL,
+ iv,
+ iv.data,
+ cipher_key,
+ ODP_AUTH_ALG_MD5_HMAC,
+ auth_key,
+ NULL, NULL,
+ NULL, 0,
+ hmac_md5_reference_plaintext[i],
+ hmac_md5_reference_length[i],
+ NULL, 0,
+ hmac_md5_reference_digest[i],
+ hmac_md5_reference_digest_length[i]);
+ }
+}
+
+void crypto_test_check_alg_hmac_md5(void)
+{
+ odp_crypto_key_t cipher_key = { .data = NULL, .length = 0 },
+ auth_key = { .data = NULL, .length = 0 };
+ odp_crypto_iv_t iv = { .data = NULL, .length = 0 };
+ uint8_t wrong_digest[HMAC_MD5_DIGEST_LEN];
+
+ unsigned int test_vec_num = (sizeof(hmac_md5_reference_length) /
+ sizeof(hmac_md5_reference_length[0]));
+ unsigned int i;
+
+ memset(wrong_digest, 0xa5, sizeof(wrong_digest));
+
+ for (i = 0; i < test_vec_num; i++) {
+ auth_key.data = hmac_md5_reference_key[i];
+ auth_key.length = sizeof(hmac_md5_reference_key[i]);
+
+ if (!check_auth_options(ODP_AUTH_ALG_MD5_HMAC, auth_key.length,
+ hmac_md5_reference_digest_length[i]))
+ continue;
+
+ alg_test(ODP_CRYPTO_OP_DECODE,
+ 0,
ODP_CIPHER_ALG_NULL,
iv,
iv.data,
@@ -945,11 +1152,135 @@ void crypto_test_alg_hmac_md5(void)
ODP_AUTH_ALG_MD5_HMAC,
auth_key,
NULL, NULL,
+ NULL, 0,
hmac_md5_reference_plaintext[i],
hmac_md5_reference_length[i],
NULL, 0,
hmac_md5_reference_digest[i],
- HMAC_MD5_96_CHECK_LEN);
+ hmac_md5_reference_digest_length[i]);
+
+ alg_test(ODP_CRYPTO_OP_DECODE,
+ 1,
+ ODP_CIPHER_ALG_NULL,
+ iv,
+ iv.data,
+ cipher_key,
+ ODP_AUTH_ALG_MD5_HMAC,
+ auth_key,
+ NULL, NULL,
+ NULL, 0,
+ hmac_md5_reference_plaintext[i],
+ hmac_md5_reference_length[i],
+ NULL, 0,
+ wrong_digest,
+ hmac_md5_reference_digest_length[i]);
+ }
+}
+
+static int check_alg_hmac_sha1(void)
+{
+ return check_alg_support(ODP_CIPHER_ALG_NULL, ODP_AUTH_ALG_SHA1_HMAC);
+}
+
+/* This test verifies the correctness of HMAC_SHA1 digest operation.
+ * The output check length is truncated to 12 bytes (96 bits) as
+ * returned by the crypto operation API call.
+ * Note that hash digest is a one-way operation.
+ * In addition the test verifies if the implementation can use the
+ * packet buffer as completion event buffer.
+ * */
+void crypto_test_gen_alg_hmac_sha1(void)
+{
+ odp_crypto_key_t cipher_key = { .data = NULL, .length = 0 },
+ auth_key = { .data = NULL, .length = 0 };
+ odp_crypto_iv_t iv = { .data = NULL, .length = 0 };
+
+ unsigned int test_vec_num = (sizeof(hmac_sha1_reference_length) /
+ sizeof(hmac_sha1_reference_length[0]));
+
+ unsigned int i;
+
+ for (i = 0; i < test_vec_num; i++) {
+ auth_key.data = hmac_sha1_reference_key[i];
+ auth_key.length = sizeof(hmac_sha1_reference_key[i]);
+
+ if (!check_auth_options(ODP_AUTH_ALG_SHA1_HMAC,
+ auth_key.length,
+ HMAC_SHA1_96_CHECK_LEN))
+ continue;
+
+ alg_test(ODP_CRYPTO_OP_ENCODE,
+ 0,
+ ODP_CIPHER_ALG_NULL,
+ iv,
+ iv.data,
+ cipher_key,
+ ODP_AUTH_ALG_SHA1_HMAC,
+ auth_key,
+ NULL, NULL,
+ NULL, 0,
+ hmac_sha1_reference_plaintext[i],
+ hmac_sha1_reference_length[i],
+ NULL, 0,
+ hmac_sha1_reference_digest[i],
+ HMAC_SHA1_96_CHECK_LEN);
+ }
+}
+
+void crypto_test_check_alg_hmac_sha1(void)
+{
+ odp_crypto_key_t cipher_key = { .data = NULL, .length = 0 },
+ auth_key = { .data = NULL, .length = 0 };
+ odp_crypto_iv_t iv = { .data = NULL, .length = 0 };
+ uint8_t wrong_digest[HMAC_SHA1_DIGEST_LEN];
+
+ unsigned int test_vec_num = (sizeof(hmac_sha1_reference_length) /
+ sizeof(hmac_sha1_reference_length[0]));
+
+ unsigned int i;
+
+ memset(wrong_digest, 0xa5, sizeof(wrong_digest));
+
+ for (i = 0; i < test_vec_num; i++) {
+ auth_key.data = hmac_sha1_reference_key[i];
+ auth_key.length = sizeof(hmac_sha1_reference_key[i]);
+
+ if (!check_auth_options(ODP_AUTH_ALG_SHA1_HMAC,
+ auth_key.length,
+ HMAC_SHA1_96_CHECK_LEN))
+ continue;
+
+ alg_test(ODP_CRYPTO_OP_DECODE,
+ 0,
+ ODP_CIPHER_ALG_NULL,
+ iv,
+ iv.data,
+ cipher_key,
+ ODP_AUTH_ALG_SHA1_HMAC,
+ auth_key,
+ NULL, NULL,
+ NULL, 0,
+ hmac_sha1_reference_plaintext[i],
+ hmac_sha1_reference_length[i],
+ NULL, 0,
+ hmac_sha1_reference_digest[i],
+ HMAC_SHA1_96_CHECK_LEN);
+
+ alg_test(ODP_CRYPTO_OP_DECODE,
+ 1,
+ ODP_CIPHER_ALG_NULL,
+ iv,
+ iv.data,
+ cipher_key,
+ ODP_AUTH_ALG_SHA1_HMAC,
+ auth_key,
+ NULL, NULL,
+ NULL, 0,
+ hmac_sha1_reference_plaintext[i],
+ hmac_sha1_reference_length[i],
+ NULL, 0,
+ wrong_digest,
+ HMAC_SHA1_96_CHECK_LEN);
}
}
@@ -958,14 +1289,14 @@ static int check_alg_hmac_sha256(void)
return check_alg_support(ODP_CIPHER_ALG_NULL, ODP_AUTH_ALG_SHA256_HMAC);
}
-/* This test verifies the correctness of HMAC_MD5 digest operation.
- * The output check length is truncated to 12 bytes (96 bits) as
+/* This test verifies the correctness of HMAC_SHA256 digest operation.
+ * The output check length is truncated to 16 bytes (128 bits) as
* returned by the crypto operation API call.
* Note that hash digest is a one-way operation.
* In addition the test verifies if the implementation can use the
* packet buffer as completion event buffer.
* */
-void crypto_test_alg_hmac_sha256(void)
+void crypto_test_gen_alg_hmac_sha256(void)
{
odp_crypto_key_t cipher_key = { .data = NULL, .length = 0 },
auth_key = { .data = NULL, .length = 0 };
@@ -982,10 +1313,11 @@ void crypto_test_alg_hmac_sha256(void)
if (!check_auth_options(ODP_AUTH_ALG_SHA256_HMAC,
auth_key.length,
- HMAC_SHA256_128_CHECK_LEN))
+ hmac_sha256_reference_digest_length[i]))
continue;
alg_test(ODP_CRYPTO_OP_ENCODE,
+ 0,
ODP_CIPHER_ALG_NULL,
iv,
iv.data,
@@ -993,11 +1325,176 @@ void crypto_test_alg_hmac_sha256(void)
ODP_AUTH_ALG_SHA256_HMAC,
auth_key,
NULL, NULL,
+ NULL, 0,
hmac_sha256_reference_plaintext[i],
hmac_sha256_reference_length[i],
NULL, 0,
hmac_sha256_reference_digest[i],
- HMAC_SHA256_128_CHECK_LEN);
+ hmac_sha256_reference_digest_length[i]);
+ }
+}
+
+void crypto_test_check_alg_hmac_sha256(void)
+{
+ odp_crypto_key_t cipher_key = { .data = NULL, .length = 0 },
+ auth_key = { .data = NULL, .length = 0 };
+ odp_crypto_iv_t iv = { .data = NULL, .length = 0 };
+ uint8_t wrong_digest[HMAC_SHA256_DIGEST_LEN];
+
+ unsigned int test_vec_num = (sizeof(hmac_sha256_reference_length) /
+ sizeof(hmac_sha256_reference_length[0]));
+
+ unsigned int i;
+
+ memset(wrong_digest, 0xa5, sizeof(wrong_digest));
+
+ for (i = 0; i < test_vec_num; i++) {
+ auth_key.data = hmac_sha256_reference_key[i];
+ auth_key.length = sizeof(hmac_sha256_reference_key[i]);
+
+ if (!check_auth_options(ODP_AUTH_ALG_SHA256_HMAC,
+ auth_key.length,
+ hmac_sha256_reference_digest_length[i]))
+ continue;
+
+ alg_test(ODP_CRYPTO_OP_DECODE,
+ 0,
+ ODP_CIPHER_ALG_NULL,
+ iv,
+ iv.data,
+ cipher_key,
+ ODP_AUTH_ALG_SHA256_HMAC,
+ auth_key,
+ NULL, NULL,
+ NULL, 0,
+ hmac_sha256_reference_plaintext[i],
+ hmac_sha256_reference_length[i],
+ NULL, 0,
+ hmac_sha256_reference_digest[i],
+ hmac_sha256_reference_digest_length[i]);
+
+ alg_test(ODP_CRYPTO_OP_DECODE,
+ 1,
+ ODP_CIPHER_ALG_NULL,
+ iv,
+ iv.data,
+ cipher_key,
+ ODP_AUTH_ALG_SHA256_HMAC,
+ auth_key,
+ NULL, NULL,
+ NULL, 0,
+ hmac_sha256_reference_plaintext[i],
+ hmac_sha256_reference_length[i],
+ NULL, 0,
+ wrong_digest,
+ hmac_sha256_reference_digest_length[i]);
+ }
+}
+
+static int check_alg_hmac_sha512(void)
+{
+ return check_alg_support(ODP_CIPHER_ALG_NULL, ODP_AUTH_ALG_SHA512_HMAC);
+}
+
+/* This test verifies the correctness of HMAC_SHA512 digest operation.
+ * The output check length is truncated to 32 bytes (256 bits) as
+ * returned by the crypto operation API call.
+ * Note that hash digest is a one-way operation.
+ * In addition the test verifies if the implementation can use the
+ * packet buffer as completion event buffer.
+ * */
+void crypto_test_gen_alg_hmac_sha512(void)
+{
+ odp_crypto_key_t cipher_key = { .data = NULL, .length = 0 },
+ auth_key = { .data = NULL, .length = 0 };
+ odp_crypto_iv_t iv = { .data = NULL, .length = 0 };
+
+ unsigned int test_vec_num = (sizeof(hmac_sha512_reference_length) /
+ sizeof(hmac_sha512_reference_length[0]));
+
+ unsigned int i;
+
+ for (i = 0; i < test_vec_num; i++) {
+ auth_key.data = hmac_sha512_reference_key[i];
+ auth_key.length = sizeof(hmac_sha512_reference_key[i]);
+
+ if (!check_auth_options(ODP_AUTH_ALG_SHA512_HMAC,
+ auth_key.length,
+ HMAC_SHA512_256_CHECK_LEN))
+ continue;
+
+ alg_test(ODP_CRYPTO_OP_ENCODE,
+ 0,
+ ODP_CIPHER_ALG_NULL,
+ iv,
+ iv.data,
+ cipher_key,
+ ODP_AUTH_ALG_SHA512_HMAC,
+ auth_key,
+ NULL, NULL,
+ NULL, 0,
+ hmac_sha512_reference_plaintext[i],
+ hmac_sha512_reference_length[i],
+ NULL, 0,
+ hmac_sha512_reference_digest[i],
+ HMAC_SHA512_256_CHECK_LEN);
+ }
+}
+
+void crypto_test_check_alg_hmac_sha512(void)
+{
+ odp_crypto_key_t cipher_key = { .data = NULL, .length = 0 },
+ auth_key = { .data = NULL, .length = 0 };
+ odp_crypto_iv_t iv = { .data = NULL, .length = 0 };
+ uint8_t wrong_digest[HMAC_SHA512_DIGEST_LEN];
+
+ unsigned int test_vec_num = (sizeof(hmac_sha512_reference_length) /
+ sizeof(hmac_sha512_reference_length[0]));
+
+ unsigned int i;
+
+ memset(wrong_digest, 0xa5, sizeof(wrong_digest));
+
+ for (i = 0; i < test_vec_num; i++) {
+ auth_key.data = hmac_sha512_reference_key[i];
+ auth_key.length = sizeof(hmac_sha512_reference_key[i]);
+
+ if (!check_auth_options(ODP_AUTH_ALG_SHA512_HMAC,
+ auth_key.length,
+ HMAC_SHA512_256_CHECK_LEN))
+ continue;
+
+ alg_test(ODP_CRYPTO_OP_DECODE,
+ 0,
+ ODP_CIPHER_ALG_NULL,
+ iv,
+ iv.data,
+ cipher_key,
+ ODP_AUTH_ALG_SHA512_HMAC,
+ auth_key,
+ NULL, NULL,
+ NULL, 0,
+ hmac_sha512_reference_plaintext[i],
+ hmac_sha512_reference_length[i],
+ NULL, 0,
+ hmac_sha512_reference_digest[i],
+ HMAC_SHA512_256_CHECK_LEN);
+
+ alg_test(ODP_CRYPTO_OP_DECODE,
+ 1,
+ ODP_CIPHER_ALG_NULL,
+ iv,
+ iv.data,
+ cipher_key,
+ ODP_AUTH_ALG_SHA512_HMAC,
+ auth_key,
+ NULL, NULL,
+ NULL, 0,
+ hmac_sha512_reference_plaintext[i],
+ hmac_sha512_reference_length[i],
+ NULL, 0,
+ wrong_digest,
+ HMAC_SHA512_256_CHECK_LEN);
}
}
@@ -1026,6 +1523,10 @@ int crypto_suite_async_init(void)
}
odp_testinfo_t crypto_suite[] = {
+ ODP_TEST_INFO_CONDITIONAL(crypto_test_enc_alg_null,
+ check_alg_null),
+ ODP_TEST_INFO_CONDITIONAL(crypto_test_dec_alg_null,
+ check_alg_null),
ODP_TEST_INFO_CONDITIONAL(crypto_test_enc_alg_3des_cbc,
check_alg_3des_cbc),
ODP_TEST_INFO_CONDITIONAL(crypto_test_dec_alg_3des_cbc,
@@ -1050,10 +1551,22 @@ odp_testinfo_t crypto_suite[] = {
check_alg_aes_gcm),
ODP_TEST_INFO_CONDITIONAL(crypto_test_dec_alg_aes128_gcm_ovr_iv,
check_alg_aes_gcm),
- ODP_TEST_INFO_CONDITIONAL(crypto_test_alg_hmac_md5,
+ ODP_TEST_INFO_CONDITIONAL(crypto_test_gen_alg_hmac_md5,
check_alg_hmac_md5),
- ODP_TEST_INFO_CONDITIONAL(crypto_test_alg_hmac_sha256,
+ ODP_TEST_INFO_CONDITIONAL(crypto_test_check_alg_hmac_md5,
+ check_alg_hmac_md5),
+ ODP_TEST_INFO_CONDITIONAL(crypto_test_gen_alg_hmac_sha1,
+ check_alg_hmac_sha1),
+ ODP_TEST_INFO_CONDITIONAL(crypto_test_check_alg_hmac_sha1,
+ check_alg_hmac_sha1),
+ ODP_TEST_INFO_CONDITIONAL(crypto_test_gen_alg_hmac_sha256,
+ check_alg_hmac_sha256),
+ ODP_TEST_INFO_CONDITIONAL(crypto_test_check_alg_hmac_sha256,
check_alg_hmac_sha256),
+ ODP_TEST_INFO_CONDITIONAL(crypto_test_gen_alg_hmac_sha512,
+ check_alg_hmac_sha512),
+ ODP_TEST_INFO_CONDITIONAL(crypto_test_check_alg_hmac_sha512,
+ check_alg_hmac_sha512),
ODP_TEST_INFO_NULL,
};
diff --git a/test/common_plat/validation/api/crypto/test_vectors.h b/test/common_plat/validation/api/crypto/test_vectors.h
index da4610f33..bd8bf347d 100644
--- a/test/common_plat/validation/api/crypto/test_vectors.h
+++ b/test/common_plat/validation/api/crypto/test_vectors.h
@@ -8,6 +8,18 @@
#define _ODP_TEST_CRYPTO_VECTORS_H_
#include "test_vectors_len.h"
+
+/** length in bytes */
+static uint32_t null_reference_length[] = { 8, 16 };
+
+static uint8_t
+null_reference_plaintext[][NULL_MAX_DATA_LEN] = {
+ {0x32, 0x6a, 0x49, 0x4c, 0xd3, 0x3f, 0xe7, 0x56},
+
+ {0x84, 0x40, 0x1f, 0x78, 0xfe, 0x6c, 0x10, 0x87, 0x6d, 0x8e, 0xa2, 0x30,
+ 0x94, 0xea, 0x53, 0x09}
+};
+
/* TDES-CBC reference vectors, according to
* "http://csrc.nist.gov/groups/STM/cavp/documents/des/DESMMT.pdf"
*/
@@ -137,29 +149,31 @@ static uint8_t aes128_gcm_reference_iv[][AES128_GCM_IV_LEN] = {
0xa2, 0xfc, 0xa1, 0xa3 }
};
-static uint32_t aes128_gcm_reference_length[] = { 84, 72, 72, 40};
+static uint32_t aes128_gcm_reference_length[] = { 72, 64, 64, 28};
-static odp_crypto_data_range_t aes128_gcm_cipher_range[] = {
- { .offset = 12, .length = 72 },
- { .offset = 8, .length = 64 },
- { .offset = 8, .length = 64 },
- { .offset = 12, .length = 28 },
-};
+static uint32_t aes128_gcm_reference_tag_length[] = { 16, 16, 16, 16};
-static odp_crypto_data_range_t aes128_gcm_auth_range[] = {
- { .offset = 0, .length = 84 },
- { .offset = 0, .length = 72 },
+static uint32_t aes128_gcm_reference_aad_length[] = { 12, 8, 8, 12};
+
+static odp_packet_data_range_t aes128_gcm_cipher_range[] = {
{ .offset = 0, .length = 72 },
- { .offset = 0, .length = 40 },
+ { .offset = 0, .length = 64 },
+ { .offset = 0, .length = 64 },
+ { .offset = 0, .length = 28 },
+};
+
+static uint8_t aes128_gcm_reference_aad[][AES128_GCM_MAX_DATA_LEN] = {
+ { 0x00, 0x00, 0x43, 0x21, 0x87, 0x65, 0x43, 0x21,
+ 0x00, 0x00, 0x00, 0x00, },
+ { 0x00, 0x00, 0xa5, 0xf8, 0x00, 0x00, 0x00, 0x0a, },
+ { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, },
+ { 0x42, 0xf6, 0x7e, 0x3f, 0x10, 0x10, 0x10, 0x10,
+ 0x10, 0x10, 0x10, 0x10, },
};
static uint8_t
aes128_gcm_reference_plaintext[][AES128_GCM_MAX_DATA_LEN] = {
- { /* Aad */
- 0x00, 0x00, 0x43, 0x21, 0x87, 0x65, 0x43, 0x21,
- 0x00, 0x00, 0x00, 0x00,
- /* Plain */
- 0x45, 0x00, 0x00, 0x48, 0x69, 0x9a, 0x00, 0x00,
+ { 0x45, 0x00, 0x00, 0x48, 0x69, 0x9a, 0x00, 0x00,
0x80, 0x11, 0x4d, 0xb7, 0xc0, 0xa8, 0x01, 0x02,
0xc0, 0xa8, 0x01, 0x01, 0x0a, 0x9b, 0xf1, 0x56,
0x38, 0xd3, 0x01, 0x00, 0x00, 0x01, 0x00, 0x00,
@@ -169,10 +183,7 @@ aes128_gcm_reference_plaintext[][AES128_GCM_MAX_DATA_LEN] = {
0x63, 0x69, 0x74, 0x79, 0x02, 0x64, 0x6b, 0x00,
0x00, 0x21, 0x00, 0x01, 0x01, 0x02, 0x02, 0x01 },
- { /* Aad */
- 0x00, 0x00, 0xa5, 0xf8, 0x00, 0x00, 0x00, 0x0a,
- /* Plain */
- 0x45, 0x00, 0x00, 0x3e, 0x69, 0x8f, 0x00, 0x00,
+ { 0x45, 0x00, 0x00, 0x3e, 0x69, 0x8f, 0x00, 0x00,
0x80, 0x11, 0x4d, 0xcc, 0xc0, 0xa8, 0x01, 0x02,
0xc0, 0xa8, 0x01, 0x01, 0x0a, 0x98, 0x00, 0x35,
0x00, 0x2a, 0x23, 0x43, 0xb2, 0xd0, 0x01, 0x00,
@@ -181,10 +192,7 @@ aes128_gcm_reference_plaintext[][AES128_GCM_MAX_DATA_LEN] = {
0x65, 0x72, 0x63, 0x69, 0x74, 0x79, 0x02, 0x64,
0x6b, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01 },
- { /* Aad */
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
- /* Plain */
- 0x45, 0x00, 0x00, 0x3c, 0x99, 0xc5, 0x00, 0x00,
+ { 0x45, 0x00, 0x00, 0x3c, 0x99, 0xc5, 0x00, 0x00,
0x80, 0x01, 0xcb, 0x7a, 0x40, 0x67, 0x93, 0x18,
0x01, 0x01, 0x01, 0x01, 0x08, 0x00, 0x07, 0x5c,
0x02, 0x00, 0x44, 0x00, 0x61, 0x62, 0x63, 0x64,
@@ -193,11 +201,7 @@ aes128_gcm_reference_plaintext[][AES128_GCM_MAX_DATA_LEN] = {
0x75, 0x76, 0x77, 0x61, 0x62, 0x63, 0x64, 0x65,
0x66, 0x67, 0x68, 0x69, 0x01, 0x02, 0x02, 0x01 },
- { /* Aad */
- 0x42, 0xf6, 0x7e, 0x3f, 0x10, 0x10, 0x10, 0x10,
- 0x10, 0x10, 0x10, 0x10,
- /* Plain */
- 0x45, 0x00, 0x00, 0x1c, 0x42, 0xa2, 0x00, 0x00,
+ { 0x45, 0x00, 0x00, 0x1c, 0x42, 0xa2, 0x00, 0x00,
0x80, 0x01, 0x44, 0x1f, 0x40, 0x67, 0x93, 0xb6,
0xe0, 0x00, 0x00, 0x02, 0x0a, 0x00, 0xf5, 0xff,
0x01, 0x02, 0x02, 0x01 }
@@ -205,10 +209,7 @@ aes128_gcm_reference_plaintext[][AES128_GCM_MAX_DATA_LEN] = {
static uint8_t
aes128_gcm_reference_ciphertext[][AES128_GCM_MAX_DATA_LEN] = {
- { /* Aad */
- 0x00, 0x00, 0x43, 0x21, 0x87, 0x65, 0x43, 0x21,
- 0x00, 0x00, 0x00, 0x00,
- /* Plain */
+ { /* Plain */
0xfe, 0xcf, 0x53, 0x7e, 0x72, 0x9d, 0x5b, 0x07,
0xdc, 0x30, 0xdf, 0x52, 0x8d, 0xd2, 0x2b, 0x76,
0x8d, 0x1b, 0x98, 0x73, 0x66, 0x96, 0xa6, 0xfd,
@@ -222,9 +223,7 @@ aes128_gcm_reference_ciphertext[][AES128_GCM_MAX_DATA_LEN] = {
0x45, 0x90, 0x18, 0x14, 0x8f, 0x6c, 0xbe, 0x72,
0x2f, 0xd0, 0x47, 0x96, 0x56, 0x2d, 0xfd, 0xb4 },
- { /* Aad */
- 0x00, 0x00, 0xa5, 0xf8, 0x00, 0x00, 0x00, 0x0a,
- /* Plain */
+ { /* Plain */
0xde, 0xb2, 0x2c, 0xd9, 0xb0, 0x7c, 0x72, 0xc1,
0x6e, 0x3a, 0x65, 0xbe, 0xeb, 0x8d, 0xf3, 0x04,
0xa5, 0xa5, 0x89, 0x7d, 0x33, 0xae, 0x53, 0x0f,
@@ -236,9 +235,8 @@ aes128_gcm_reference_ciphertext[][AES128_GCM_MAX_DATA_LEN] = {
/* Digest */
0x83, 0xb7, 0x0d, 0x3a, 0xa8, 0xbc, 0x6e, 0xe4,
0xc3, 0x09, 0xe9, 0xd8, 0x5a, 0x41, 0xad, 0x4a },
- { /* Aad */
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
- /* Plain */
+
+ { /* Plain */
0x46, 0x88, 0xda, 0xf2, 0xf9, 0x73, 0xa3, 0x92,
0x73, 0x29, 0x09, 0xc3, 0x31, 0xd5, 0x6d, 0x60,
0xf6, 0x94, 0xab, 0xaa, 0x41, 0x4b, 0x5e, 0x7f,
@@ -251,10 +249,7 @@ aes128_gcm_reference_ciphertext[][AES128_GCM_MAX_DATA_LEN] = {
0xf8, 0x21, 0xd4, 0x96, 0xee, 0xb0, 0x96, 0xe9,
0x8a, 0xd2, 0xb6, 0x9e, 0x47, 0x99, 0xc7, 0x1d },
- { /* Aad */
- 0x42, 0xf6, 0x7e, 0x3f, 0x10, 0x10, 0x10, 0x10,
- 0x10, 0x10, 0x10, 0x10,
- /* Plain */
+ { /* Plain */
0xfb, 0xa2, 0xca, 0x84, 0x5e, 0x5d, 0xf9, 0xf0,
0xf2, 0x2c, 0x3e, 0x6e, 0x86, 0xdd, 0x83, 0x1e,
0x1f, 0xc6, 0x57, 0x92, 0xcd, 0x1a, 0xf9, 0x13,
@@ -306,6 +301,10 @@ static uint8_t hmac_md5_reference_digest[][HMAC_MD5_DIGEST_LEN] = {
0xdb, 0xb8, 0xc7, 0x33, 0xf0, 0xe8, 0xb3, 0xf6 }
};
+static uint32_t hmac_md5_reference_digest_length[] = {
+ 12, 12, 12
+};
+
static uint8_t hmac_sha256_reference_key[][HMAC_SHA256_KEY_LEN] = {
{ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
@@ -350,4 +349,102 @@ static uint8_t hmac_sha256_reference_digest[][HMAC_SHA256_DIGEST_LEN] = {
0x85, 0x4d, 0xb8, 0xeb, 0xd0, 0x91, 0x81, 0xa7 }
};
+static uint32_t hmac_sha256_reference_digest_length[] = {
+ 16, 16, 16
+};
+
+static uint8_t hmac_sha1_reference_key[][HMAC_SHA1_KEY_LEN] = {
+ { 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
+ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
+ 0x0b, 0x0b, 0x0b, 0x0b },
+
+ /* "Jefe" */
+ { 0x4a, 0x65, 0x66, 0x65 },
+
+ { 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+ 0xaa, 0xaa, 0xaa, 0xaa }
+};
+
+static uint32_t hmac_sha1_reference_length[] = { 8, 28, 50 };
+
+static uint8_t
+hmac_sha1_reference_plaintext[][HMAC_SHA1_MAX_DATA_LEN] = {
+ /* "Hi There" */
+ { 0x48, 0x69, 0x20, 0x54, 0x68, 0x65, 0x72, 0x65},
+
+ /* what do ya want for nothing?*/
+ { 0x77, 0x68, 0x61, 0x74, 0x20, 0x64, 0x6f, 0x20,
+ 0x79, 0x61, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x20,
+ 0x66, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x68,
+ 0x69, 0x6e, 0x67, 0x3f },
+
+ { 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
+ 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
+ 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
+ 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
+ 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd }
+};
+
+static uint8_t hmac_sha1_reference_digest[][HMAC_SHA1_DIGEST_LEN] = {
+ { 0xb6, 0x17, 0x31, 0x86, 0x55, 0x05,
+ 0x72, 0x64, 0xe2, 0x8b, 0xc0, 0xb6 },
+
+ { 0xef, 0xfc, 0xdf, 0x6a, 0xe5, 0xeb,
+ 0x2f, 0xa2, 0xd2, 0x74, 0x16, 0xd5 },
+
+ { 0x12, 0x5d, 0x73, 0x42, 0xb9, 0xac,
+ 0x11, 0xcd, 0x91, 0xa3, 0x9a, 0xf4 },
+};
+
+static uint8_t hmac_sha512_reference_key[][HMAC_SHA512_KEY_LEN] = {
+ { 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
+ 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b,
+ 0x0b, 0x0b, 0x0b, 0x0b },
+
+ /* "Jefe" */
+ { 0x4a, 0x65, 0x66, 0x65 },
+
+ { 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+ 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa, 0xaa,
+ 0xaa, 0xaa, 0xaa, 0xaa }
+};
+
+static uint32_t hmac_sha512_reference_length[] = { 8, 28, 50 };
+
+static uint8_t
+hmac_sha512_reference_plaintext[][HMAC_SHA512_MAX_DATA_LEN] = {
+ /* "Hi There" */
+ { 0x48, 0x69, 0x20, 0x54, 0x68, 0x65, 0x72, 0x65},
+
+ /* what do ya want for nothing?*/
+ { 0x77, 0x68, 0x61, 0x74, 0x20, 0x64, 0x6f, 0x20,
+ 0x79, 0x61, 0x20, 0x77, 0x61, 0x6e, 0x74, 0x20,
+ 0x66, 0x6f, 0x72, 0x20, 0x6e, 0x6f, 0x74, 0x68,
+ 0x69, 0x6e, 0x67, 0x3f },
+
+ { 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
+ 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
+ 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
+ 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd,
+ 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd, 0xdd }
+};
+
+static uint8_t hmac_sha512_reference_digest[][HMAC_SHA512_DIGEST_LEN] = {
+ { 0x87, 0xaa, 0x7c, 0xde, 0xa5, 0xef, 0x61, 0x9d,
+ 0x4f, 0xf0, 0xb4, 0x24, 0x1a, 0x1d, 0x6c, 0xb0,
+ 0x23, 0x79, 0xf4, 0xe2, 0xce, 0x4e, 0xc2, 0x78,
+ 0x7a, 0xd0, 0xb3, 0x05, 0x45, 0xe1, 0x7c, 0xde },
+
+ { 0x16, 0x4b, 0x7a, 0x7b, 0xfc, 0xf8, 0x19, 0xe2,
+ 0xe3, 0x95, 0xfb, 0xe7, 0x3b, 0x56, 0xe0, 0xa3,
+ 0x87, 0xbd, 0x64, 0x22, 0x2e, 0x83, 0x1f, 0xd6,
+ 0x10, 0x27, 0x0c, 0xd7, 0xea, 0x25, 0x05, 0x54 },
+
+ { 0xfa, 0x73, 0xb0, 0x08, 0x9d, 0x56, 0xa2, 0x84,
+ 0xef, 0xb0, 0xf0, 0x75, 0x6c, 0x89, 0x0b, 0xe9,
+ 0xb1, 0xb5, 0xdb, 0xdd, 0x8e, 0xe8, 0x1a, 0x36,
+ 0x55, 0xf8, 0x3e, 0x33, 0xb2, 0x27, 0x9d, 0x39 }
+};
+
#endif
diff --git a/test/common_plat/validation/api/crypto/test_vectors_len.h b/test/common_plat/validation/api/crypto/test_vectors_len.h
index 4fbb5cd70..20a7ddbad 100644
--- a/test/common_plat/validation/api/crypto/test_vectors_len.h
+++ b/test/common_plat/validation/api/crypto/test_vectors_len.h
@@ -6,6 +6,9 @@
#ifndef TEST_VECTORS_LEN_
#define TEST_VECTORS_LEN_
+/* NULL */
+#define NULL_MAX_DATA_LEN 16
+
/* TDES-CBC */
#define TDES_CBC_KEY_LEN 24
#define TDES_CBC_IV_LEN 8
@@ -21,18 +24,27 @@
#define AES128_GCM_IV_LEN 12
#define AES128_GCM_MAX_DATA_LEN 106
#define AES128_GCM_DIGEST_LEN 16
-#define AES128_GCM_CHECK_LEN 16
/* HMAC-MD5 */
#define HMAC_MD5_KEY_LEN 16
#define HMAC_MD5_MAX_DATA_LEN 128
#define HMAC_MD5_DIGEST_LEN 16
-#define HMAC_MD5_96_CHECK_LEN 12
/* HMAC-SHA256 */
#define HMAC_SHA256_KEY_LEN 32
#define HMAC_SHA256_MAX_DATA_LEN 128
#define HMAC_SHA256_DIGEST_LEN 32
-#define HMAC_SHA256_128_CHECK_LEN 16
+
+/* HMAC-SHA1 */
+#define HMAC_SHA1_KEY_LEN 20
+#define HMAC_SHA1_MAX_DATA_LEN 128
+#define HMAC_SHA1_DIGEST_LEN 20
+#define HMAC_SHA1_96_CHECK_LEN 12
+
+/* HMAC-SHA512 */
+#define HMAC_SHA512_KEY_LEN 64
+#define HMAC_SHA512_MAX_DATA_LEN 128
+#define HMAC_SHA512_DIGEST_LEN 64
+#define HMAC_SHA512_256_CHECK_LEN 32
#endif
diff --git a/test/common_plat/validation/api/lock/lock.c b/test/common_plat/validation/api/lock/lock.c
index bd9a2aad2..f8a1d8c01 100644
--- a/test/common_plat/validation/api/lock/lock.c
+++ b/test/common_plat/validation/api/lock/lock.c
@@ -257,7 +257,7 @@ static int ticketlock_api_tests(void *arg UNUSED)
static void rwlock_api_test(odp_rwlock_t *rw_lock)
{
- int rc;
+ int rc = 0;
odp_rwlock_init(rw_lock);
/* CU_ASSERT(odp_rwlock_is_locked(rw_lock) == 0); */
@@ -265,23 +265,40 @@ static void rwlock_api_test(odp_rwlock_t *rw_lock)
odp_rwlock_read_lock(rw_lock);
rc = odp_rwlock_read_trylock(rw_lock);
- CU_ASSERT(rc == 0);
+ CU_ASSERT(rc != 0);
+ if (rc == 1)
+ odp_rwlock_read_unlock(rw_lock);
+
rc = odp_rwlock_write_trylock(rw_lock);
CU_ASSERT(rc == 0);
+ if (rc == 1)
+ odp_rwlock_write_unlock(rw_lock);
odp_rwlock_read_unlock(rw_lock);
rc = odp_rwlock_read_trylock(rw_lock);
+ CU_ASSERT(rc != 0);
if (rc == 1)
odp_rwlock_read_unlock(rw_lock);
odp_rwlock_write_lock(rw_lock);
/* CU_ASSERT(odp_rwlock_is_locked(rw_lock) == 1); */
+ rc = odp_rwlock_read_trylock(rw_lock);
+ CU_ASSERT(rc == 0);
+ if (rc == 1)
+ odp_rwlock_read_unlock(rw_lock);
+
+ rc = odp_rwlock_write_trylock(rw_lock);
+ CU_ASSERT(rc == 0);
+ if (rc == 1)
+ odp_rwlock_write_unlock(rw_lock);
+
odp_rwlock_write_unlock(rw_lock);
/* CU_ASSERT(odp_rwlock_is_locked(rw_lock) == 0); */
rc = odp_rwlock_write_trylock(rw_lock);
+ CU_ASSERT(rc != 0);
if (rc == 1)
odp_rwlock_write_unlock(rw_lock);
}
diff --git a/test/common_plat/validation/api/pktio/Makefile.am b/test/common_plat/validation/api/pktio/Makefile.am
index 466d690dc..c6368fba3 100644
--- a/test/common_plat/validation/api/pktio/Makefile.am
+++ b/test/common_plat/validation/api/pktio/Makefile.am
@@ -4,7 +4,7 @@ noinst_LTLIBRARIES = libtestpktio.la
libtestpktio_la_SOURCES = pktio.c
test_PROGRAMS = pktio_main$(EXEEXT)
-dist_pktio_main_SOURCES = pktio_main.c
+dist_pktio_main_SOURCES = pktio_main.c parser.c
pktio_main_LDADD = libtestpktio.la $(LIBCUNIT_COMMON) $(LIBODP)
-EXTRA_DIST = pktio.h
+EXTRA_DIST = pktio.h parser.h
diff --git a/test/common_plat/validation/api/pktio/parser.c b/test/common_plat/validation/api/pktio/parser.c
new file mode 100644
index 000000000..ad7101d08
--- /dev/null
+++ b/test/common_plat/validation/api/pktio/parser.c
@@ -0,0 +1,545 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+#include <odp_api.h>
+#include <odp_cunit_common.h>
+
+#include <odp/helper/odph_api.h>
+
+#include <stdlib.h>
+#include "parser.h"
+#include "pktio.h"
+
+#define MAX_NUM_IFACES 2
+#define PKT_POOL_NUM 256
+#define PKT_POOL_BUF_LEN (2 * 1024)
+
+/**
+ * local container for pktio attributes
+ */
+typedef struct {
+ const char *name;
+ odp_pktio_t hdl;
+ odp_pktout_queue_t pktout;
+ odp_pktin_queue_t pktin;
+} pktio_info_t;
+
+/** Interface names used for testing */
+static const char *iface_name[MAX_NUM_IFACES];
+
+/** Test interfaces */
+pktio_info_t pktios[MAX_NUM_IFACES];
+pktio_info_t *pktio_a;
+pktio_info_t *pktio_b;
+
+/** Number of interfaces being used (1=loopback, 2=pair) */
+static int num_ifaces;
+
+/** While testing real-world interfaces additional time may be needed for
+ * external network to enable link to pktio interface that just become up.
+ */
+static bool wait_for_network;
+
+/** Parser packet pool */
+odp_pool_t parser_pool = ODP_POOL_INVALID;
+
+static inline void wait_linkup(odp_pktio_t pktio)
+{
+ /* wait 1 second for link up */
+ uint64_t wait_ns = (10 * ODP_TIME_MSEC_IN_NS);
+ int wait_num = 100;
+ int i;
+ int ret = -1;
+
+ for (i = 0; i < wait_num; i++) {
+ ret = odp_pktio_link_status(pktio);
+ if (ret < 0 || ret == 1)
+ break;
+ /* link is down, call status again after delay */
+ odp_time_wait_ns(wait_ns);
+ }
+}
+
+static int pkt_pool_create(void)
+{
+ odp_pool_capability_t capa;
+ odp_pool_param_t params;
+
+ if (odp_pool_capability(&capa) != 0) {
+ printf("Error: unable to query pool capability.\n");
+ return -1;
+ }
+
+ if (capa.pkt.max_num && capa.pkt.max_num < PKT_POOL_NUM) {
+ printf("Error: packet pool size not supported.\n");
+ printf("MAX: %" PRIu32 "\n", capa.pkt.max_num);
+ return -1;
+ } else if (capa.pkt.max_len && capa.pkt.max_len < PKT_POOL_BUF_LEN) {
+ printf("Error: packet length not supported.\n");
+ return -1;
+ } else if (capa.pkt.max_seg_len &&
+ capa.pkt.max_seg_len < PKT_POOL_BUF_LEN) {
+ printf("Error: segment length not supported.\n");
+ return -1;
+ }
+
+ odp_pool_param_init(&params);
+ params.pkt.seg_len = PKT_POOL_BUF_LEN;
+ params.pkt.len = PKT_POOL_BUF_LEN;
+ params.pkt.num = PKT_POOL_NUM;
+ params.type = ODP_POOL_PACKET;
+
+ parser_pool = odp_pool_create("pkt_pool_default", &params);
+ if (parser_pool == ODP_POOL_INVALID) {
+ printf("Error: packet pool create failed.\n");
+ return -1;
+ }
+
+ return 0;
+}
+
+static odp_pktio_t create_pktio(int iface_idx, odp_pool_t pool)
+{
+ odp_pktio_t pktio;
+ odp_pktio_config_t config;
+ odp_pktio_param_t pktio_param;
+ const char *iface = iface_name[iface_idx];
+
+ odp_pktio_param_init(&pktio_param);
+ pktio_param.in_mode = ODP_PKTIN_MODE_DIRECT;
+ pktio_param.out_mode = ODP_PKTOUT_MODE_DIRECT;
+
+ pktio = odp_pktio_open(iface, pool, &pktio_param);
+ if (pktio == ODP_PKTIO_INVALID) {
+ printf("Error: failed to open %s\n", iface);
+ return ODP_PKTIO_INVALID;
+ }
+
+ odp_pktio_config_init(&config);
+ config.parser.layer = ODP_PKTIO_PARSER_LAYER_ALL;
+ if (odp_pktio_config(pktio, &config)) {
+ printf("Error: failed to configure %s\n", iface);
+ return ODP_PKTIO_INVALID;
+ }
+
+ /* By default, single input and output queue is used */
+ if (odp_pktin_queue_config(pktio, NULL)) {
+ printf("Error: failed to config input queue for %s\n", iface);
+ return ODP_PKTIO_INVALID;
+ }
+ if (odp_pktout_queue_config(pktio, NULL)) {
+ printf("Error: failed to config output queue for %s\n", iface);
+ return ODP_PKTIO_INVALID;
+ }
+
+ if (wait_for_network)
+ odp_time_wait_ns(ODP_TIME_SEC_IN_NS / 4);
+
+ return pktio;
+}
+
+static odp_packet_t create_packet(const uint8_t *data, uint32_t len)
+{
+ odp_packet_t pkt;
+
+ pkt = odp_packet_alloc(parser_pool, len);
+ if (pkt == ODP_PACKET_INVALID)
+ return ODP_PACKET_INVALID;
+
+ if (odp_packet_copy_from_mem(pkt, 0, len, data)) {
+ printf("Error: failed to copy test packet data\n");
+ odp_packet_free(pkt);
+ return ODP_PACKET_INVALID;
+ }
+
+ odp_packet_l2_offset_set(pkt, 0);
+
+ return pkt;
+}
+
+/**
+ * Receive incoming packets and compare them to the original. Function returns
+ * a valid packet handle only when the received packet matches to the original
+ * packet.
+ */
+static odp_packet_t recv_and_cmp_packet(odp_pktin_queue_t pktin,
+ odp_packet_t orig_pkt, uint64_t ns)
+{
+ odp_packet_t pkt = ODP_PACKET_INVALID;
+ odp_time_t wait_time, end;
+ uint32_t orig_len;
+ uint8_t *orig_data;
+
+ orig_len = odp_packet_len(orig_pkt);
+ orig_data = odp_packet_data(orig_pkt);
+ wait_time = odp_time_local_from_ns(ns);
+ end = odp_time_sum(odp_time_local(), wait_time);
+
+ do {
+ int ret;
+ odp_packet_t tmp_pkt;
+
+ ret = odp_pktin_recv(pktin, &tmp_pkt, 1);
+ if (ret < 0)
+ break;
+
+ if (ret == 1) {
+ uint32_t len;
+ uint8_t *data;
+
+ len = odp_packet_len(tmp_pkt);
+ data = odp_packet_data(tmp_pkt);
+
+ if (len == orig_len &&
+ memcmp(data, orig_data, len) == 0) {
+ pkt = tmp_pkt;
+ break;
+ }
+ odp_packet_free(tmp_pkt);
+ }
+ } while (odp_time_cmp(end, odp_time_local()) > 0);
+
+ return pkt;
+}
+
+/**
+ * Creates a test packet from data array and loops it through the test pktio
+ * interfaces forcing packet parsing.
+ */
+static odp_packet_t loopback_packet(pktio_info_t *pktio_a,
+ pktio_info_t *pktio_b, const uint8_t *data,
+ uint32_t len)
+{
+ odp_packet_t pkt;
+ odp_packet_t sent_pkt;
+
+ pkt = create_packet(data, len);
+ if (pkt == ODP_PACKET_INVALID) {
+ CU_FAIL("failed to generate test packet");
+ return ODP_PACKET_INVALID;
+ }
+
+ pktio_pkt_set_macs(pkt, pktio_a->hdl, pktio_b->hdl);
+
+ sent_pkt = odp_packet_copy(pkt, parser_pool);
+ if (sent_pkt == ODP_PACKET_INVALID) {
+ CU_FAIL_FATAL("failed to copy test packet");
+ odp_packet_free(pkt);
+ return ODP_PACKET_INVALID;
+ }
+
+ while (1) {
+ int ret = odp_pktout_send(pktio_a->pktout, &pkt, 1);
+
+ if (ret < 0) {
+ CU_FAIL_FATAL("failed to send test packet");
+ odp_packet_free(pkt);
+ odp_packet_free(sent_pkt);
+ return ODP_PACKET_INVALID;
+ }
+ if (ret == 1)
+ break;
+ }
+
+ /* and wait for them to arrive back */
+ pkt = recv_and_cmp_packet(pktio_b->pktin, sent_pkt, ODP_TIME_SEC_IN_NS);
+ odp_packet_free(sent_pkt);
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ CU_ASSERT(odp_packet_input(pkt) == pktio_b->hdl);
+ CU_ASSERT(odp_packet_has_error(pkt) == 0);
+
+ return pkt;
+}
+
+void parser_test_arp(void)
+{
+ odp_packet_t pkt;
+
+ pkt = loopback_packet(pktio_a, pktio_b, test_packet_arp,
+ sizeof(test_packet_arp));
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ CU_ASSERT(odp_packet_has_eth(pkt));
+ CU_ASSERT(odp_packet_has_arp(pkt));
+
+ CU_ASSERT(!odp_packet_has_ipv4(pkt));
+ CU_ASSERT(!odp_packet_has_ipv6(pkt));
+
+ odp_packet_free(pkt);
+}
+
+void parser_test_ipv4_icmp(void)
+{
+ odp_packet_t pkt;
+
+ pkt = loopback_packet(pktio_a, pktio_b, test_packet_ipv4_icmp,
+ sizeof(test_packet_ipv4_icmp));
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ CU_ASSERT(odp_packet_has_eth(pkt));
+ CU_ASSERT(odp_packet_has_ipv4(pkt));
+ CU_ASSERT(odp_packet_has_icmp(pkt));
+
+ CU_ASSERT(!odp_packet_has_ipv6(pkt));
+ CU_ASSERT(!odp_packet_has_tcp(pkt));
+ CU_ASSERT(!odp_packet_has_udp(pkt));
+
+ odp_packet_free(pkt);
+}
+
+void parser_test_ipv4_tcp(void)
+{
+ odp_packet_t pkt;
+
+ pkt = loopback_packet(pktio_a, pktio_b, test_packet_ipv4_tcp,
+ sizeof(test_packet_ipv4_tcp));
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ CU_ASSERT(odp_packet_has_eth(pkt));
+ CU_ASSERT(odp_packet_has_ipv4(pkt));
+ CU_ASSERT(odp_packet_has_tcp(pkt));
+
+ CU_ASSERT(!odp_packet_has_ipv6(pkt));
+ CU_ASSERT(!odp_packet_has_udp(pkt));
+
+ odp_packet_free(pkt);
+}
+
+void parser_test_ipv4_udp(void)
+{
+ odp_packet_t pkt;
+
+ pkt = loopback_packet(pktio_a, pktio_b, test_packet_ipv4_udp,
+ sizeof(test_packet_ipv4_udp));
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ CU_ASSERT(odp_packet_has_eth(pkt));
+ CU_ASSERT(odp_packet_has_ipv4(pkt));
+ CU_ASSERT(odp_packet_has_udp(pkt));
+
+ CU_ASSERT(!odp_packet_has_ipv6(pkt));
+ CU_ASSERT(!odp_packet_has_tcp(pkt));
+
+ odp_packet_free(pkt);
+}
+
+void parser_test_vlan_ipv4_udp(void)
+{
+ odp_packet_t pkt;
+
+ pkt = loopback_packet(pktio_a, pktio_b, test_packet_vlan_ipv4_udp,
+ sizeof(test_packet_vlan_ipv4_udp));
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ CU_ASSERT(odp_packet_has_eth(pkt));
+ CU_ASSERT(odp_packet_has_vlan(pkt));
+ CU_ASSERT(odp_packet_has_ipv4(pkt));
+ CU_ASSERT(odp_packet_has_udp(pkt));
+
+ CU_ASSERT(!odp_packet_has_ipv6(pkt));
+ CU_ASSERT(!odp_packet_has_tcp(pkt));
+
+ odp_packet_free(pkt);
+}
+
+void parser_test_vlan_qinq_ipv4_udp(void)
+{
+ odp_packet_t pkt;
+
+ pkt = loopback_packet(pktio_a, pktio_b, test_packet_vlan_qinq_ipv4_udp,
+ sizeof(test_packet_vlan_qinq_ipv4_udp));
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ CU_ASSERT(odp_packet_has_eth(pkt));
+ CU_ASSERT(odp_packet_has_vlan(pkt));
+ CU_ASSERT(odp_packet_has_vlan_qinq(pkt));
+ CU_ASSERT(odp_packet_has_ipv4(pkt));
+ CU_ASSERT(odp_packet_has_udp(pkt));
+
+ CU_ASSERT(!odp_packet_has_ipv6(pkt));
+ CU_ASSERT(!odp_packet_has_tcp(pkt));
+
+ odp_packet_free(pkt);
+}
+
+void parser_test_ipv6_icmp(void)
+{
+ odp_packet_t pkt;
+
+ pkt = loopback_packet(pktio_a, pktio_b, test_packet_ipv6_icmp,
+ sizeof(test_packet_ipv6_icmp));
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ CU_ASSERT(odp_packet_has_eth(pkt));
+ CU_ASSERT(odp_packet_has_ipv6(pkt));
+ CU_ASSERT(odp_packet_has_icmp(pkt));
+
+ CU_ASSERT(!odp_packet_has_ipv4(pkt));
+ CU_ASSERT(!odp_packet_has_tcp(pkt));
+ CU_ASSERT(!odp_packet_has_udp(pkt));
+
+ odp_packet_free(pkt);
+}
+
+void parser_test_ipv6_tcp(void)
+{
+ odp_packet_t pkt;
+
+ pkt = loopback_packet(pktio_a, pktio_b, test_packet_ipv6_tcp,
+ sizeof(test_packet_ipv6_tcp));
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ CU_ASSERT(odp_packet_has_eth(pkt));
+ CU_ASSERT(odp_packet_has_ipv6(pkt));
+ CU_ASSERT(odp_packet_has_tcp(pkt));
+
+ CU_ASSERT(!odp_packet_has_ipv4(pkt));
+ CU_ASSERT(!odp_packet_has_udp(pkt));
+
+ odp_packet_free(pkt);
+}
+
+void parser_test_ipv6_udp(void)
+{
+ odp_packet_t pkt;
+
+ pkt = loopback_packet(pktio_a, pktio_b, test_packet_ipv6_udp,
+ sizeof(test_packet_ipv6_udp));
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ CU_ASSERT(odp_packet_has_eth(pkt));
+ CU_ASSERT(odp_packet_has_ipv6(pkt));
+ CU_ASSERT(odp_packet_has_udp(pkt));
+
+ CU_ASSERT(!odp_packet_has_ipv4(pkt));
+ CU_ASSERT(!odp_packet_has_tcp(pkt));
+
+ odp_packet_free(pkt);
+}
+
+void parser_test_vlan_ipv6_udp(void)
+{
+ odp_packet_t pkt;
+
+ pkt = loopback_packet(pktio_a, pktio_b, test_packet_vlan_ipv6_udp,
+ sizeof(test_packet_vlan_ipv6_udp));
+ CU_ASSERT_FATAL(pkt != ODP_PACKET_INVALID);
+ CU_ASSERT(odp_packet_has_eth(pkt));
+ CU_ASSERT(odp_packet_has_vlan(pkt));
+ CU_ASSERT(odp_packet_has_ipv6(pkt));
+ CU_ASSERT(odp_packet_has_udp(pkt));
+
+ CU_ASSERT(!odp_packet_has_ipv4(pkt));
+ CU_ASSERT(!odp_packet_has_tcp(pkt));
+
+ odp_packet_free(pkt);
+}
+
+int parser_suite_init(void)
+{
+ int i;
+
+ if (getenv("ODP_WAIT_FOR_NETWORK"))
+ wait_for_network = true;
+
+ iface_name[0] = getenv("ODP_PKTIO_IF0");
+ iface_name[1] = getenv("ODP_PKTIO_IF1");
+ num_ifaces = 1;
+
+ if (!iface_name[0]) {
+ printf("No interfaces specified, using default \"loop\".\n");
+ iface_name[0] = "loop";
+ } else if (!iface_name[1]) {
+ printf("Using loopback interface: %s\n", iface_name[0]);
+ } else {
+ num_ifaces = 2;
+ printf("Using paired interfaces: %s %s\n",
+ iface_name[0], iface_name[1]);
+ }
+
+ if (pkt_pool_create() != 0) {
+ printf("Error: failed to create parser pool\n");
+ return -1;
+ }
+
+ /* Create pktios and associate input/output queues */
+ for (i = 0; i < num_ifaces; ++i) {
+ pktio_info_t *io;
+
+ io = &pktios[i];
+ io->name = iface_name[i];
+ io->hdl = create_pktio(i, parser_pool);
+ if (io->hdl == ODP_PKTIO_INVALID) {
+ printf("Error: failed to open iface");
+ return -1;
+ }
+
+ if (odp_pktout_queue(io->hdl, &io->pktout, 1) != 1) {
+ printf("Error: failed to start iface: %s\n", io->name);
+ return -1;
+ }
+
+ if (odp_pktin_queue(io->hdl, &io->pktin, 1) != 1) {
+ printf("Error: failed to start iface: %s\n", io->name);
+ return -1;
+ }
+
+ if (odp_pktio_start(io->hdl)) {
+ printf("Error: failed to start iface: %s\n", io->name);
+ return -1;
+ }
+
+ wait_linkup(io->hdl);
+ }
+
+ pktio_a = &pktios[0];
+ pktio_b = &pktios[1];
+ if (num_ifaces == 1)
+ pktio_b = pktio_a;
+
+ return 0;
+}
+
+int parser_suite_term(void)
+{
+ int i;
+ int ret = 0;
+
+ for (i = 0; i < num_ifaces; ++i) {
+ if (odp_pktio_stop(pktios[i].hdl)) {
+ printf("Error: failed to stop pktio: %s\n",
+ pktios[i].name);
+ ret = -1;
+ }
+ if (odp_pktio_close(pktios[i].hdl)) {
+ printf("Error: failed to close pktio: %s\n",
+ pktios[i].name);
+ ret = -1;
+ }
+ }
+
+ if (odp_pool_destroy(parser_pool) != 0) {
+ printf("Error: failed to destroy packet pool\n");
+ ret = -1;
+ }
+
+ return ret;
+}
+
+/**
+ * Certain tests can only be run with 'loop' pktio.
+ */
+static int loop_pktio(void)
+{
+ if (strcmp(iface_name[0], "loop") == 0)
+ return ODP_TEST_ACTIVE;
+ else
+ return ODP_TEST_INACTIVE;
+}
+
+odp_testinfo_t parser_suite[] = {
+ ODP_TEST_INFO(parser_test_arp),
+ ODP_TEST_INFO(parser_test_ipv4_icmp),
+ ODP_TEST_INFO(parser_test_ipv4_tcp),
+ ODP_TEST_INFO(parser_test_ipv4_udp),
+ ODP_TEST_INFO_CONDITIONAL(parser_test_vlan_ipv4_udp, loop_pktio),
+ ODP_TEST_INFO_CONDITIONAL(parser_test_vlan_qinq_ipv4_udp, loop_pktio),
+ ODP_TEST_INFO(parser_test_ipv6_icmp),
+ ODP_TEST_INFO(parser_test_ipv6_tcp),
+ ODP_TEST_INFO(parser_test_ipv6_udp),
+ ODP_TEST_INFO_CONDITIONAL(parser_test_vlan_ipv6_udp, loop_pktio),
+ ODP_TEST_INFO_NULL
+};
diff --git a/test/common_plat/validation/api/pktio/parser.h b/test/common_plat/validation/api/pktio/parser.h
new file mode 100644
index 000000000..5cc2b988c
--- /dev/null
+++ b/test/common_plat/validation/api/pktio/parser.h
@@ -0,0 +1,180 @@
+/* Copyright (c) 2017, Linaro Limited
+ * All rights reserved.
+ *
+ * SPDX-License-Identifier: BSD-3-Clause
+ */
+
+#ifndef _ODP_TEST_PARSER_H_
+#define _ODP_TEST_PARSER_H_
+
+#include <odp_cunit_common.h>
+
+/* test functions: */
+void parser_test_arp(void);
+void parser_test_ipv4_icmp(void);
+void parser_test_ipv4_tcp(void);
+void parser_test_ipv4_udp(void);
+void parser_test_vlan_ipv4_udp(void);
+void parser_test_vlan_qinq_ipv4_udp(void);
+void parser_test_ipv6_icmp(void);
+void parser_test_ipv6_tcp(void);
+void parser_test_ipv6_udp(void);
+void parser_test_vlan_ipv6_udp(void);
+
+/* test array init/term functions: */
+int parser_suite_term(void);
+int parser_suite_init(void);
+
+/* test arrays: */
+extern odp_testinfo_t parser_suite[];
+
+/* Test packets without CRC */
+
+/**
+ * ARP request
+ */
+static const uint8_t test_packet_arp[] = {
+ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00,
+ 0x09, 0x00, 0x04, 0x00, 0x08, 0x06, 0x00, 0x01,
+ 0x08, 0x00, 0x06, 0x04, 0x00, 0x01, 0x00, 0x00,
+ 0x09, 0x00, 0x04, 0x00, 0xC0, 0xA8, 0x01, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC0, 0xA8,
+ 0x01, 0x02, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
+ 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
+ 0x0E, 0x0F, 0x10, 0x11
+};
+
+/**
+ * ICMPv4 echo reply
+ */
+static const uint8_t test_packet_ipv4_icmp[] = {
+ 0x00, 0x00, 0x09, 0x00, 0x05, 0x00, 0x00, 0x00,
+ 0x09, 0x00, 0x04, 0x00, 0x08, 0x00, 0x45, 0x00,
+ 0x00, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01,
+ 0xF3, 0x7B, 0xC0, 0xA8, 0x01, 0x01, 0xC4, 0xA8,
+ 0x01, 0x02, 0x00, 0x00, 0xB7, 0xAB, 0x00, 0x01,
+ 0x00, 0x02, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
+ 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
+ 0x0E, 0x0F, 0x10, 0x11
+};
+
+/**
+ * IPv4 TCP
+ */
+static const uint8_t test_packet_ipv4_tcp[] = {
+ 0x00, 0x00, 0x09, 0x00, 0x05, 0x00, 0x00, 0x00,
+ 0x09, 0x00, 0x04, 0x00, 0x08, 0x00, 0x45, 0x00,
+ 0x00, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x40, 0x06,
+ 0xF3, 0x76, 0xC0, 0xA8, 0x01, 0x02, 0xC4, 0xA8,
+ 0x01, 0x01, 0x04, 0xD2, 0x10, 0xE1, 0x00, 0x00,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x50, 0x00,
+ 0x00, 0x00, 0x0C, 0xCC, 0x00, 0x00, 0x00, 0x01,
+ 0x02, 0x03, 0x04, 0x05
+};
+
+/**
+ * IPv4 UDP
+ */
+static const uint8_t test_packet_ipv4_udp[] = {
+ 0x00, 0x00, 0x09, 0x00, 0x05, 0x00, 0x00, 0x00,
+ 0x09, 0x00, 0x04, 0x00, 0x08, 0x00, 0x45, 0x00,
+ 0x00, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x40, 0x11,
+ 0xF3, 0x6B, 0xC0, 0xA8, 0x01, 0x02, 0xC4, 0xA8,
+ 0x01, 0x01, 0x00, 0x3F, 0x00, 0x3F, 0x00, 0x1A,
+ 0x2F, 0x97, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
+ 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D,
+ 0x0E, 0x0F, 0x10, 0x11
+};
+
+/**
+ * VLAN IPv4 UDP
+ * - ID: 23
+ */
+static const uint8_t test_packet_vlan_ipv4_udp[] = {
+ 0x00, 0x00, 0x09, 0x00, 0x05, 0x00, 0x00, 0x00,
+ 0x09, 0x00, 0x04, 0x00, 0x81, 0x00, 0x00, 0x17,
+ 0x08, 0x00, 0x45, 0x00, 0x00, 0x2A, 0x00, 0x00,
+ 0x00, 0x00, 0x40, 0x11, 0xF3, 0x6F, 0xC0, 0xA8,
+ 0x01, 0x02, 0xC4, 0xA8, 0x01, 0x01, 0x00, 0x3F,
+ 0x00, 0x3F, 0x00, 0x16, 0x4D, 0xBF, 0x00, 0x01,
+ 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
+ 0x0A, 0x0B, 0x0C, 0x0D
+};
+
+/**
+ * VLAN Q-in-Q IPv4 UDP
+ * - Outer: Tag Protocol ID 0x88a8, VLAN ID 1
+ * - Inner: Tag Protocol ID 0x8100, VLAN ID 2
+ */
+static const uint8_t test_packet_vlan_qinq_ipv4_udp[] = {
+ 0x00, 0x00, 0x09, 0x00, 0x05, 0x00, 0x00, 0x00,
+ 0x09, 0x00, 0x04, 0x00, 0x88, 0xA8, 0x00, 0x01,
+ 0x81, 0x00, 0x00, 0x02, 0x08, 0x00, 0x45, 0x00,
+ 0x00, 0x26, 0x00, 0x00, 0x00, 0x00, 0x40, 0x11,
+ 0xF3, 0x73, 0xC0, 0xA8, 0x01, 0x02, 0xC4, 0xA8,
+ 0x01, 0x01, 0x00, 0x3F, 0x00, 0x3F, 0x00, 0x12,
+ 0x63, 0xDF, 0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
+ 0x06, 0x07, 0x08, 0x09
+};
+
+/**
+ * ICMPv6 echo request
+ */
+static const uint8_t test_packet_ipv6_icmp[] = {
+ 0x00, 0x00, 0x09, 0x00, 0x05, 0x00, 0x00, 0x00,
+ 0x09, 0x00, 0x04, 0x00, 0x86, 0xDD, 0x60, 0x30,
+ 0x00, 0x00, 0x00, 0x08, 0x3A, 0xFF, 0xFE, 0x80,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00,
+ 0x09, 0xFF, 0xFE, 0x00, 0x04, 0x00, 0x35, 0x55,
+ 0x55, 0x55, 0x66, 0x66, 0x66, 0x66, 0x77, 0x77,
+ 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x80, 0x00,
+ 0x1B, 0xC2, 0x00, 0x01, 0x00, 0x02
+};
+
+/**
+ * IPv6 TCP
+ */
+static const uint8_t test_packet_ipv6_tcp[] = {
+ 0x00, 0x00, 0x09, 0x00, 0x05, 0x00, 0x00, 0x00,
+ 0x09, 0x00, 0x04, 0x00, 0x86, 0xDD, 0x60, 0x30,
+ 0x00, 0x00, 0x00, 0x14, 0x06, 0xFF, 0xFE, 0x80,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00,
+ 0x09, 0xFF, 0xFE, 0x00, 0x04, 0x00, 0x35, 0x55,
+ 0x55, 0x55, 0x66, 0x66, 0x66, 0x66, 0x77, 0x77,
+ 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x04, 0xD2,
+ 0x10, 0xE1, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+ 0x00, 0x02, 0x50, 0x00, 0x00, 0x00, 0x36, 0x37,
+ 0x00, 0x00
+};
+
+/**
+ * IPv6 UDP
+ */
+static const uint8_t test_packet_ipv6_udp[] = {
+ 0x00, 0x00, 0x09, 0x00, 0x05, 0x00, 0x00, 0x00,
+ 0x09, 0x00, 0x04, 0x00, 0x86, 0xDD, 0x60, 0x30,
+ 0x00, 0x00, 0x00, 0x08, 0x11, 0xFF, 0xFE, 0x80,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00,
+ 0x09, 0xFF, 0xFE, 0x00, 0x04, 0x00, 0x35, 0x55,
+ 0x55, 0x55, 0x66, 0x66, 0x66, 0x66, 0x77, 0x77,
+ 0x77, 0x77, 0x88, 0x88, 0x88, 0x88, 0x00, 0x3F,
+ 0x00, 0x3F, 0x00, 0x08, 0x9B, 0x68
+};
+
+/**
+ * VLAN IPv6
+ * - ID: 23
+ */
+static const uint8_t test_packet_vlan_ipv6_udp[] = {
+ 0x00, 0x00, 0x09, 0x00, 0x05, 0x00, 0x00, 0x00,
+ 0x09, 0x00, 0x04, 0x00, 0x81, 0x00, 0x00, 0x17,
+ 0x86, 0xDD, 0x60, 0x30, 0x00, 0x00, 0x00, 0x08,
+ 0x11, 0xFF, 0xFE, 0x80, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x02, 0x00, 0x09, 0xFF, 0xFE, 0x00,
+ 0x04, 0x00, 0x35, 0x55, 0x55, 0x55, 0x66, 0x66,
+ 0x66, 0x66, 0x77, 0x77, 0x77, 0x77, 0x88, 0x88,
+ 0x88, 0x88, 0x00, 0x3F, 0x00, 0x3F, 0x00, 0x08,
+ 0x9B, 0x68
+};
+
+#endif
diff --git a/test/common_plat/validation/api/pktio/pktio.c b/test/common_plat/validation/api/pktio/pktio.c
index 54f206efc..c476a7126 100644
--- a/test/common_plat/validation/api/pktio/pktio.c
+++ b/test/common_plat/validation/api/pktio/pktio.c
@@ -10,6 +10,7 @@
#include <stdlib.h>
#include "pktio.h"
+#include "parser.h"
#define PKT_BUF_NUM 32
#define PKT_BUF_SIZE (9 * 1024)
@@ -122,26 +123,28 @@ static inline void _pktio_wait_linkup(odp_pktio_t pktio)
static void set_pool_len(odp_pool_param_t *params, odp_pool_capability_t *capa)
{
+ uint32_t len;
uint32_t seg_len;
+ len = (capa->pkt.max_len && capa->pkt.max_len < PKT_BUF_SIZE) ?
+ capa->pkt.max_len : PKT_BUF_SIZE;
seg_len = capa->pkt.max_seg_len ? capa->pkt.max_seg_len : PKT_BUF_SIZE;
switch (pool_segmentation) {
case PKT_POOL_SEGMENTED:
/* Force segment to minimum size */
params->pkt.seg_len = 0;
- params->pkt.len = PKT_BUF_SIZE;
+ params->pkt.len = len;
break;
case PKT_POOL_UNSEGMENTED:
default:
params->pkt.seg_len = seg_len;
- params->pkt.len = PKT_BUF_SIZE;
+ params->pkt.len = len;
break;
}
}
-static void pktio_pkt_set_macs(odp_packet_t pkt,
- odp_pktio_t src, odp_pktio_t dst)
+void pktio_pkt_set_macs(odp_packet_t pkt, odp_pktio_t src, odp_pktio_t dst)
{
uint32_t len;
odph_ethhdr_t *eth = (odph_ethhdr_t *)odp_packet_l2_ptr(pkt, &len);
@@ -1179,6 +1182,8 @@ void pktio_test_pktio_config(void)
odp_pktio_config_init(&config);
+ CU_ASSERT(config.parser.layer == ODP_PKTIO_PARSER_LAYER_ALL);
+
CU_ASSERT(odp_pktio_config(pktio, NULL) == 0);
CU_ASSERT(odp_pktio_config(pktio, &config) == 0);
@@ -1426,7 +1431,9 @@ int pktio_check_statistics_counters(void)
void pktio_test_statistics_counters(void)
{
odp_pktio_t pktio_rx, pktio_tx;
- odp_pktio_t pktio[MAX_NUM_IFACES];
+ odp_pktio_t pktio[MAX_NUM_IFACES] = {
+ ODP_PKTIO_INVALID, ODP_PKTIO_INVALID
+ };
odp_packet_t pkt;
odp_packet_t tx_pkt[1000];
uint32_t pkt_seq[1000];
@@ -2185,6 +2192,7 @@ odp_suiteinfo_t pktio_suites[] = {
pktio_suite_term, pktio_suite_unsegmented},
{"Packet I/O Segmented", pktio_suite_init_segmented,
pktio_suite_term, pktio_suite_segmented},
+ {"Packet parser", parser_suite_init, parser_suite_term, parser_suite},
ODP_SUITE_INFO_NULL
};
diff --git a/test/common_plat/validation/api/pktio/pktio.h b/test/common_plat/validation/api/pktio/pktio.h
index 8131d05fe..b8799d9eb 100644
--- a/test/common_plat/validation/api/pktio/pktio.h
+++ b/test/common_plat/validation/api/pktio/pktio.h
@@ -61,4 +61,7 @@ extern odp_suiteinfo_t pktio_suites[];
/* main test program: */
int pktio_main(int argc, char *argv[]);
+/* functions shared by parser test suite */
+void pktio_pkt_set_macs(odp_packet_t pkt, odp_pktio_t src, odp_pktio_t dst);
+
#endif
diff --git a/test/common_plat/validation/api/queue/queue.c b/test/common_plat/validation/api/queue/queue.c
index 1f7913a12..6a13c0062 100644
--- a/test/common_plat/validation/api/queue/queue.c
+++ b/test/common_plat/validation/api/queue/queue.c
@@ -56,7 +56,7 @@ void queue_test_capa(void)
odp_queue_param_t qparams;
char name[ODP_QUEUE_NAME_LEN];
odp_queue_t queue[MAX_QUEUES];
- uint32_t num_queues, i;
+ uint32_t num_queues, min, i, j;
memset(&capa, 0, sizeof(odp_queue_capability_t));
CU_ASSERT(odp_queue_capability(&capa) == 0);
@@ -65,34 +65,49 @@ void queue_test_capa(void)
CU_ASSERT(capa.max_ordered_locks != 0);
CU_ASSERT(capa.max_sched_groups != 0);
CU_ASSERT(capa.sched_prios != 0);
+ CU_ASSERT(capa.plain.max_num != 0);
+ CU_ASSERT(capa.sched.max_num != 0);
+
+ min = capa.plain.max_num;
+ if (min > capa.sched.max_num)
+ min = capa.sched.max_num;
+
+ CU_ASSERT(capa.max_queues >= min);
for (i = 0; i < ODP_QUEUE_NAME_LEN; i++)
name[i] = 'A' + (i % 26);
name[ODP_QUEUE_NAME_LEN - 1] = 0;
- if (capa.max_queues > MAX_QUEUES)
- num_queues = MAX_QUEUES;
- else
- num_queues = capa.max_queues;
-
odp_queue_param_init(&qparams);
- for (i = 0; i < num_queues; i++) {
- generate_name(name, i);
- queue[i] = odp_queue_create(name, &qparams);
+ for (j = 0; j < 2; j++) {
+ if (j == 0) {
+ num_queues = capa.plain.max_num;
+ } else {
+ num_queues = capa.sched.max_num;
+ qparams.type = ODP_QUEUE_TYPE_SCHED;
+ }
+
+ if (num_queues > MAX_QUEUES)
+ num_queues = MAX_QUEUES;
- if (queue[i] == ODP_QUEUE_INVALID) {
- CU_FAIL("Queue create failed");
- num_queues = i;
- break;
+ for (i = 0; i < num_queues; i++) {
+ generate_name(name, i);
+ queue[i] = odp_queue_create(name, &qparams);
+
+ if (queue[i] == ODP_QUEUE_INVALID) {
+ CU_FAIL("Queue create failed");
+ num_queues = i;
+ break;
+ }
+
+ CU_ASSERT(odp_queue_lookup(name) != ODP_QUEUE_INVALID);
}
- CU_ASSERT(odp_queue_lookup(name) != ODP_QUEUE_INVALID);
+ for (i = 0; i < num_queues; i++)
+ CU_ASSERT(odp_queue_destroy(queue[i]) == 0);
}
-
- for (i = 0; i < num_queues; i++)
- CU_ASSERT(odp_queue_destroy(queue[i]) == 0);
}
void queue_test_mode(void)
diff --git a/test/common_plat/validation/api/scheduler/scheduler.c b/test/common_plat/validation/api/scheduler/scheduler.c
index 952561cd3..4f99435c9 100644
--- a/test/common_plat/validation/api/scheduler/scheduler.c
+++ b/test/common_plat/validation/api/scheduler/scheduler.c
@@ -129,6 +129,14 @@ static int exit_schedule_loop(void)
return ret;
}
+static void release_context(odp_schedule_sync_t sync)
+{
+ if (sync == ODP_SCHED_SYNC_ATOMIC)
+ odp_schedule_release_atomic();
+ else if (sync == ODP_SCHED_SYNC_ORDERED)
+ odp_schedule_release_ordered();
+}
+
void scheduler_test_wait_time(void)
{
int i;
@@ -251,8 +259,7 @@ void scheduler_test_queue_destroy(void)
CU_ASSERT_FATAL(u32[0] == MAGIC);
odp_buffer_free(buf);
- odp_schedule_release_ordered();
-
+ release_context(qp.sched.sync);
CU_ASSERT_FATAL(odp_queue_destroy(queue) == 0);
}
@@ -820,12 +827,7 @@ static int schedule_common_(void *arg)
}
}
- if (sync == ODP_SCHED_SYNC_ATOMIC)
- odp_schedule_release_atomic();
-
- if (sync == ODP_SCHED_SYNC_ORDERED)
- odp_schedule_release_ordered();
-
+ release_context(sync);
odp_ticketlock_lock(&globals->lock);
globals->buf_count -= num;
@@ -1388,6 +1390,7 @@ static int create_queues(void)
snprintf(name, sizeof(name), "sched_%d_%d_a", i, j);
p.sched.sync = ODP_SCHED_SYNC_ATOMIC;
+ p.size = BUFS_PER_QUEUE_EXCL;
q = odp_queue_create(name, &p);
if (q == ODP_QUEUE_INVALID) {
@@ -1423,6 +1426,7 @@ static int create_queues(void)
snprintf(name, sizeof(name), "sched_%d_%d_o", i, j);
p.sched.sync = ODP_SCHED_SYNC_ORDERED;
p.sched.lock_count = capa.max_ordered_locks;
+ p.size = 0;
q = odp_queue_create(name, &p);
if (q == ODP_QUEUE_INVALID) {
diff --git a/test/common_plat/validation/api/system/system.c b/test/common_plat/validation/api/system/system.c
index 57ff34eb9..5b7ca01ae 100644
--- a/test/common_plat/validation/api/system/system.c
+++ b/test/common_plat/validation/api/system/system.c
@@ -301,6 +301,13 @@ void system_test_odp_cpu_hz_max_id(void)
}
}
+void system_test_info_print(void)
+{
+ printf("\n\nCalling system info print...\n");
+ odp_sys_info_print();
+ printf("...done. ");
+}
+
odp_testinfo_t system_suite[] = {
ODP_TEST_INFO(system_test_odp_version_numbers),
ODP_TEST_INFO(system_test_odp_cpu_count),
@@ -319,6 +326,7 @@ odp_testinfo_t system_suite[] = {
ODP_TEST_INFO(system_test_odp_cpu_cycles_max),
ODP_TEST_INFO(system_test_odp_cpu_cycles_resolution),
ODP_TEST_INFO(system_test_odp_cpu_cycles_diff),
+ ODP_TEST_INFO(system_test_info_print),
ODP_TEST_INFO_NULL,
};
diff --git a/test/common_plat/validation/api/system/system.h b/test/common_plat/validation/api/system/system.h
index cbb994eb0..c33729b94 100644
--- a/test/common_plat/validation/api/system/system.h
+++ b/test/common_plat/validation/api/system/system.h
@@ -30,6 +30,7 @@ void system_test_odp_cpu_cycles_max(void);
void system_test_odp_cpu_cycles(void);
void system_test_odp_cpu_cycles_diff(void);
void system_test_odp_cpu_cycles_resolution(void);
+void system_test_info_print(void);
/* test arrays: */
extern odp_testinfo_t system_suite[];
diff --git a/test/common_plat/validation/api/time/Makefile.am b/test/common_plat/validation/api/time/Makefile.am
index bf2d0268c..82682dfc3 100644
--- a/test/common_plat/validation/api/time/Makefile.am
+++ b/test/common_plat/validation/api/time/Makefile.am
@@ -1,5 +1,12 @@
include ../Makefile.inc
+TESTS_ENVIRONMENT += TEST_DIR=${builddir}
+
+TESTSCRIPTS = time.sh
+TEST_EXTENSIONS = .sh
+
+TESTS = $(TESTSCRIPTS)
+
noinst_LTLIBRARIES = libtesttime.la
libtesttime_la_SOURCES = time.c
@@ -7,4 +14,5 @@ test_PROGRAMS = time_main$(EXEEXT)
dist_time_main_SOURCES = time_main.c
time_main_LDADD = libtesttime.la $(LIBCUNIT_COMMON) $(LIBODP)
-EXTRA_DIST = time.h
+EXTRA_DIST = time_test.h $(TESTSCRIPTS)
+dist_check_SCRIPTS = $(TESTSCRIPTS)
diff --git a/test/common_plat/validation/api/time/time.c b/test/common_plat/validation/api/time/time.c
index 530d5c07a..e2ca2e17c 100644
--- a/test/common_plat/validation/api/time/time.c
+++ b/test/common_plat/validation/api/time/time.c
@@ -6,7 +6,8 @@
#include <odp_api.h>
#include "odp_cunit_common.h"
-#include "time.h"
+#include "time_test.h"
+#include <time.h>
#define BUSY_LOOP_CNT 30000000 /* used for t > min resolution */
#define BUSY_LOOP_CNT_LONG 6000000000 /* used for t > 4 sec */
@@ -140,25 +141,25 @@ void time_test_monotony(void)
CU_ASSERT(ns3 > ns2);
}
-static void time_test_cmp(time_cb time, time_from_ns_cb time_from_ns)
+static void time_test_cmp(time_cb time_cur, time_from_ns_cb time_from_ns)
{
/* volatile to stop optimization of busy loop */
volatile int count = 0;
odp_time_t t1, t2, t3;
- t1 = time();
+ t1 = time_cur();
while (count < BUSY_LOOP_CNT) {
count++;
};
- t2 = time();
+ t2 = time_cur();
while (count < BUSY_LOOP_CNT * 2) {
count++;
};
- t3 = time();
+ t3 = time_cur();
CU_ASSERT(odp_time_cmp(t2, t1) > 0);
CU_ASSERT(odp_time_cmp(t3, t2) > 0);
@@ -191,7 +192,7 @@ void time_test_global_cmp(void)
}
/* check that a time difference gives a reasonable result */
-static void time_test_diff(time_cb time,
+static void time_test_diff(time_cb time_cur,
time_from_ns_cb time_from_ns,
uint64_t res)
{
@@ -202,13 +203,13 @@ static void time_test_diff(time_cb time,
uint64_t upper_limit, lower_limit;
/* test timestamp diff */
- t1 = time();
+ t1 = time_cur();
while (count < BUSY_LOOP_CNT) {
count++;
};
- t2 = time();
+ t2 = time_cur();
CU_ASSERT(odp_time_cmp(t2, t1) > 0);
diff = odp_time_diff(t2, t1);
@@ -268,7 +269,7 @@ void time_test_global_diff(void)
}
/* check that a time sum gives a reasonable result */
-static void time_test_sum(time_cb time,
+static void time_test_sum(time_cb time_cur,
time_from_ns_cb time_from_ns,
uint64_t res)
{
@@ -277,7 +278,7 @@ static void time_test_sum(time_cb time,
uint64_t upper_limit, lower_limit;
/* sum timestamp and interval */
- t1 = time();
+ t1 = time_cur();
ns2 = 103;
t2 = time_from_ns(ns2);
ns1 = odp_time_to_ns(t1);
@@ -319,20 +320,20 @@ void time_test_global_sum(void)
time_test_sum(odp_time_global, odp_time_global_from_ns, global_res);
}
-static void time_test_wait_until(time_cb time, time_from_ns_cb time_from_ns)
+static void time_test_wait_until(time_cb time_cur, time_from_ns_cb time_from_ns)
{
int i;
odp_time_t lower_limit, upper_limit;
odp_time_t start_time, end_time, wait;
odp_time_t second = time_from_ns(ODP_TIME_SEC_IN_NS);
- start_time = time();
+ start_time = time_cur();
wait = start_time;
for (i = 0; i < WAIT_SECONDS; i++) {
wait = odp_time_sum(wait, second);
odp_time_wait_until(wait);
}
- end_time = time();
+ end_time = time_cur();
wait = odp_time_diff(end_time, start_time);
lower_limit = time_from_ns(WAIT_SECONDS * ODP_TIME_SEC_IN_NS -
@@ -398,39 +399,43 @@ void time_test_wait_ns(void)
}
}
-static void time_test_to_u64(time_cb time)
+static void time_test_accuracy(time_cb time_cur, time_from_ns_cb time_from_ns)
{
- volatile int count = 0;
- uint64_t val1, val2;
- odp_time_t t1, t2;
-
- t1 = time();
+ int i;
+ odp_time_t t1, t2, wait, diff;
+ clock_t c1, c2;
+ double sec_t, sec_c;
+ odp_time_t sec = time_from_ns(ODP_TIME_SEC_IN_NS);
- val1 = odp_time_to_u64(t1);
- CU_ASSERT(val1 > 0);
+ c1 = clock();
+ t1 = time_cur();
- while (count < BUSY_LOOP_CNT) {
- count++;
- };
+ wait = odp_time_sum(t1, sec);
+ for (i = 0; i < 5; i++) {
+ odp_time_wait_until(wait);
+ wait = odp_time_sum(wait, sec);
+ }
- t2 = time();
- val2 = odp_time_to_u64(t2);
- CU_ASSERT(val2 > 0);
+ t2 = time_cur();
+ c2 = clock();
- CU_ASSERT(val2 > val1);
+ diff = odp_time_diff(t2, t1);
+ sec_t = ((double)odp_time_to_ns(diff)) / ODP_TIME_SEC_IN_NS;
+ sec_c = ((double)(c2 - c1)) / CLOCKS_PER_SEC;
- val1 = odp_time_to_u64(ODP_TIME_NULL);
- CU_ASSERT(val1 == 0);
+ /* Check that ODP time is within +-5% of system time */
+ CU_ASSERT(sec_t < sec_c * 1.05);
+ CU_ASSERT(sec_t > sec_c * 0.95);
}
-void time_test_local_to_u64(void)
+static void time_test_local_accuracy(void)
{
- time_test_to_u64(odp_time_local);
+ time_test_accuracy(odp_time_local, odp_time_local_from_ns);
}
-void time_test_global_to_u64(void)
+static void time_test_global_accuracy(void)
{
- time_test_to_u64(odp_time_global);
+ time_test_accuracy(odp_time_global, odp_time_global_from_ns);
}
odp_testinfo_t time_suite_time[] = {
@@ -443,14 +448,14 @@ odp_testinfo_t time_suite_time[] = {
ODP_TEST_INFO(time_test_local_sum),
ODP_TEST_INFO(time_test_local_wait_until),
ODP_TEST_INFO(time_test_wait_ns),
- ODP_TEST_INFO(time_test_local_to_u64),
+ ODP_TEST_INFO(time_test_local_accuracy),
ODP_TEST_INFO(time_test_global_res),
ODP_TEST_INFO(time_test_global_conversion),
ODP_TEST_INFO(time_test_global_cmp),
ODP_TEST_INFO(time_test_global_diff),
ODP_TEST_INFO(time_test_global_sum),
ODP_TEST_INFO(time_test_global_wait_until),
- ODP_TEST_INFO(time_test_global_to_u64),
+ ODP_TEST_INFO(time_test_global_accuracy),
ODP_TEST_INFO_NULL
};
diff --git a/test/common_plat/validation/api/time/time.sh b/test/common_plat/validation/api/time/time.sh
new file mode 100755
index 000000000..02bf75a76
--- /dev/null
+++ b/test/common_plat/validation/api/time/time.sh
@@ -0,0 +1,42 @@
+#!/bin/sh
+#
+# Copyright (c) 2017, Linaro Limited
+# All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+
+# directories where time_main binary can be found:
+# -in the validation dir when running make check (intree or out of tree)
+# -in the script directory, when running after 'make install', or
+# -in the validation when running standalone (./time) intree.
+# -in the current directory.
+# running stand alone out of tree requires setting PATH
+PATH=${TEST_DIR}/api/time:$PATH
+PATH=$(dirname $0)/../../../../common_plat/validation/api/time:$PATH
+PATH=$(dirname $0):$PATH
+PATH=`pwd`:$PATH
+
+time_main_path=$(which time_main${EXEEXT})
+if [ -x "$time_main_path" ] ; then
+ echo "running with time_main: $time_run_path"
+else
+ echo "cannot find time_main: please set you PATH for it."
+ exit 1
+fi
+
+# exit codes expected by automake for skipped tests
+TEST_SKIPPED=77
+
+time_main${EXEEXT}
+ret=$?
+
+SIGSEGV=139
+
+if [ "${TRAVIS}" = "true" ] && [ $ret -ne 0 ] &&
+ [ ${TEST} = "coverage" ] && [ $ret -ne ${SIGSEGV} ]; then
+ echo "SKIP: skip due significant slowdown under code coverage"
+ exit ${TEST_SKIPPED}
+fi
+
+exit $ret
diff --git a/test/common_plat/validation/api/time/time_main.c b/test/common_plat/validation/api/time/time_main.c
index f86d638a5..bf1cfe7bd 100644
--- a/test/common_plat/validation/api/time/time_main.c
+++ b/test/common_plat/validation/api/time/time_main.c
@@ -4,7 +4,7 @@
* SPDX-License-Identifier: BSD-3-Clause
*/
-#include "time.h"
+#include "time_test.h"
int main(int argc, char *argv[])
{
diff --git a/test/common_plat/validation/api/time/time.h b/test/common_plat/validation/api/time/time_test.h
index e5132a494..109562944 100644
--- a/test/common_plat/validation/api/time/time.h
+++ b/test/common_plat/validation/api/time/time_test.h
@@ -24,8 +24,6 @@ void time_test_global_sum(void);
void time_test_local_wait_until(void);
void time_test_global_wait_until(void);
void time_test_wait_ns(void);
-void time_test_local_to_u64(void);
-void time_test_global_to_u64(void);
void time_test_monotony(void);
/* test arrays: */
diff --git a/test/common_plat/validation/api/traffic_mngr/Makefile.am b/test/common_plat/validation/api/traffic_mngr/Makefile.am
index 35e689a02..a012c1b3c 100644
--- a/test/common_plat/validation/api/traffic_mngr/Makefile.am
+++ b/test/common_plat/validation/api/traffic_mngr/Makefile.am
@@ -1,10 +1,18 @@
include ../Makefile.inc
+TESTS_ENVIRONMENT += TEST_DIR=${builddir}
+
+TESTSCRIPTS = traffic_mngr.sh
+TEST_EXTENSIONS = .sh
+
+TESTS = $(TESTSCRIPTS)
+
noinst_LTLIBRARIES = libtesttraffic_mngr.la
libtesttraffic_mngr_la_SOURCES = traffic_mngr.c
-test_PROGRAMS = traffic_mngr_main$(EXEEXT)
+bin_PROGRAMS = traffic_mngr_main$(EXEEXT)
dist_traffic_mngr_main_SOURCES = traffic_mngr_main.c
traffic_mngr_main_LDADD = libtesttraffic_mngr.la -lm $(LIBCUNIT_COMMON) $(LIBODP)
-EXTRA_DIST = traffic_mngr.h
+EXTRA_DIST = traffic_mngr.h $(TESTSCRIPTS)
+dist_check_SCRIPTS = $(TESTSCRIPTS)
diff --git a/test/common_plat/validation/api/traffic_mngr/traffic_mngr.sh b/test/common_plat/validation/api/traffic_mngr/traffic_mngr.sh
new file mode 100755
index 000000000..4db7ea384
--- /dev/null
+++ b/test/common_plat/validation/api/traffic_mngr/traffic_mngr.sh
@@ -0,0 +1,41 @@
+#!/bin/sh
+#
+# Copyright (c) 2017, Linaro Limited
+# All rights reserved.
+#
+# SPDX-License-Identifier: BSD-3-Clause
+#
+
+# directories where traffic_mngr_main binary can be found:
+# -in the validation dir when running make check (intree or out of tree)
+# -in the script directory, when running after 'make install', or
+# -in the validation when running standalone (./traffic_mngr) intree.
+# -in the current directory.
+# running stand alone out of tree requires setting PATH
+PATH=${TEST_DIR}/api/traffic_mngr:$PATH
+PATH=$(dirname $0)/../../../../common_plat/validation/api/traffic_mngr:$PATH
+PATH=$(dirname $0):$PATH
+PATH=`pwd`:$PATH
+
+traffic_mngr_main_path=$(which traffic_mngr_main${EXEEXT})
+if [ -x "$traffic_mngr_main_path" ] ; then
+ echo "running with traffic_mngr_main: $traffic_mngr_run_path"
+else
+ echo "cannot find traffic_mngr_main: please set you PATH for it."
+ exit 1
+fi
+
+# exit codes expected by automake for skipped tests
+TEST_SKIPPED=77
+
+traffic_mngr_main${EXEEXT}
+ret=$?
+
+SIGSEGV=139
+
+if [ "${TRAVIS}" = "true" ] && [ $ret -ne 0 ] && [ $ret -ne ${SIGSEGV} ]; then
+ echo "SKIP: skip due to not isolated environment"
+ exit ${TEST_SKIPPED}
+fi
+
+exit $ret