25 #include <sys/resource.h>
28 #include <odp/helper/odph_api.h>
34 #define POOL_NUM_PKT 4096
36 #define MAX_DEQUEUE_BURST 16
38 static uint8_t test_salt[16] =
"0123456789abcdef";
40 static uint8_t test_key16[16] = { 0x01, 0x02, 0x03, 0x04, 0x05,
41 0x06, 0x07, 0x08, 0x09, 0x0a,
42 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
46 static uint8_t test_key20[20] = { 0x01, 0x02, 0x03, 0x04, 0x05,
47 0x06, 0x07, 0x08, 0x09, 0x0a,
48 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
49 0x10, 0x11, 0x12, 0x13, 0x14,
52 static uint8_t test_key24[24] = { 0x01, 0x02, 0x03, 0x04, 0x05,
53 0x06, 0x07, 0x08, 0x09, 0x0a,
54 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
55 0x10, 0x11, 0x12, 0x13, 0x14,
56 0x15, 0x16, 0x17, 0x18
59 static uint8_t test_key32[32] = { 0x01, 0x02, 0x03, 0x04, 0x05,
60 0x06, 0x07, 0x08, 0x09, 0x0a,
61 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
62 0x10, 0x11, 0x12, 0x13, 0x14,
63 0x15, 0x16, 0x17, 0x18, 0x19,
64 0x1a, 0x1b, 0x1c, 0x1d, 0x1e,
68 static uint8_t test_key64[64] = { 0x01, 0x02, 0x03, 0x04, 0x05,
69 0x06, 0x07, 0x08, 0x09, 0x0a,
70 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
71 0x10, 0x11, 0x12, 0x13, 0x14,
72 0x15, 0x16, 0x17, 0x18, 0x19,
73 0x1a, 0x1b, 0x1c, 0x1d, 0x1e,
74 0x1f, 0x20, 0x21, 0x22, 0x23,
75 0x24, 0x25, 0x26, 0x27, 0x28,
76 0x29, 0x2a, 0x4b, 0x2c, 0x2d,
77 0x2e, 0x2f, 0x30, 0x31, 0x32,
78 0x33, 0x34, 0x55, 0x36, 0x37,
79 0x38, 0x39, 0x5a, 0x3b, 0x3c,
80 0x3d, 0x3e, 0x5f, 0x40,
121 unsigned int payload_length;
128 ipsec_alg_config_t *alg_config;
165 uint32_t vec_pkt_size;
190 double rusage_thread;
191 } ipsec_run_result_t;
198 struct rusage ru_self;
199 struct rusage ru_thread;
205 static unsigned int global_payloads[] = {
214 static unsigned int global_num_payloads;
219 static ipsec_alg_config_t algs_config[] = {
221 .name =
"3des-cbc-null",
226 .length =
sizeof(test_key24)
232 .name =
"3des-cbc-hmac-md5-96",
237 .length =
sizeof(test_key24)
242 .length =
sizeof(test_key16)
247 .name =
"null-hmac-md5-96",
253 .length =
sizeof(test_key16)
258 .name =
"aes-cbc-null",
263 .length =
sizeof(test_key16)
269 .name =
"aes-cbc-hmac-sha1-96",
274 .length =
sizeof(test_key16)
279 .length =
sizeof(test_key20)
284 .name =
"aes-ctr-null",
289 .length =
sizeof(test_key16)
291 .cipher_key_extra = {
299 .name =
"aes-ctr-hmac-sha1-96",
304 .length =
sizeof(test_key16)
306 .cipher_key_extra = {
313 .length =
sizeof(test_key20)
318 .name =
"null-hmac-sha1-96",
324 .length =
sizeof(test_key20)
329 .name =
"null-hmac-sha256-128",
335 .length =
sizeof(test_key32)
340 .name =
"null-hmac-sha512-256",
346 .length =
sizeof(test_key64)
351 .name =
"null-aes-gmac",
357 .length =
sizeof(test_key16)
371 .length =
sizeof(test_key16)
373 .cipher_key_extra = {
386 .length =
sizeof(test_key16)
388 .cipher_key_extra = {
396 .name =
"chacha20-poly1305",
401 .length =
sizeof(test_key32)
403 .cipher_key_extra = {
416 static ipsec_alg_config_t *
417 find_config_by_name(
const char *name)
420 ipsec_alg_config_t *ret = NULL;
422 for (i = 0; i < ODPH_ARRAY_SIZE(algs_config); i++) {
423 if (strcmp(algs_config[i].name, name) == 0) {
424 ret = algs_config + i;
436 print_config_names(
const char *prefix)
440 for (i = 0; i < ODPH_ARRAY_SIZE(algs_config); i++)
441 printf(
"%s %s\n", prefix, algs_config[i].name);
448 fill_time_record(time_record_t *rec)
450 gettimeofday(&rec->tv, NULL);
451 getrusage(RUSAGE_SELF, &rec->ru_self);
452 getrusage(RUSAGE_THREAD, &rec->ru_thread);
459 static unsigned long long
460 get_rusage_diff(
struct rusage *start,
struct rusage *end)
462 unsigned long long rusage_diff;
463 unsigned long long rusage_start;
464 unsigned long long rusage_end;
466 rusage_start = (start->ru_utime.tv_sec * 1000000) +
467 (start->ru_utime.tv_usec);
468 rusage_start += (start->ru_stime.tv_sec * 1000000) +
469 (start->ru_stime.tv_usec);
471 rusage_end = (end->ru_utime.tv_sec * 1000000) +
472 (end->ru_utime.tv_usec);
473 rusage_end += (end->ru_stime.tv_sec * 1000000) +
474 (end->ru_stime.tv_usec);
476 rusage_diff = rusage_end - rusage_start;
485 static unsigned long long
486 get_rusage_self_diff(time_record_t *start, time_record_t *end)
488 return get_rusage_diff(&start->ru_self, &end->ru_self);
495 static unsigned long long
496 get_rusage_thread_diff(time_record_t *start, time_record_t *end)
498 return get_rusage_diff(&start->ru_thread, &end->ru_thread);
504 static unsigned long long
505 get_elapsed_usec(time_record_t *start, time_record_t *end)
507 unsigned long long s;
508 unsigned long long e;
510 s = (start->tv.tv_sec * 1000000) + (start->tv.tv_usec);
511 e = (end->tv.tv_sec * 1000000) + (end->tv.tv_usec);
520 print_result_header(
void)
522 printf(
"\n%30.30s %15s %15s %15s %15s %15s %15s\n",
523 "algorithm",
"avg over #",
"payload (bytes)",
"elapsed (us)",
524 "rusg self (us)",
"rusg thrd (us)",
"throughput (Kb)");
531 print_result(ipsec_args_t *cargs,
532 unsigned int payload_length,
533 ipsec_alg_config_t *config,
534 ipsec_run_result_t *result)
536 unsigned int throughput;
538 throughput = (1000000.0 / result->elapsed) * payload_length / 1024;
539 printf(
"%30.30s %15d %15d %15.3f %15.3f %15.3f %15d\n",
540 config->name, cargs->packet_count, payload_length,
541 result->elapsed, result->rusage_self, result->rusage_thread,
545 #define IPV4ADDR(a, b, c, d) odp_cpu_to_be_32((a << 24) | \
554 create_sa_from_config(ipsec_alg_config_t *config,
561 memcpy(¶m.
crypto, &config->crypto,
568 uint32_t src = IPV4ADDR(10, 0, 111, 2);
569 uint32_t dst = IPV4ADDR(10, 0, 222, 2);
572 memset(&tunnel, 0,
sizeof(tunnel));
584 if (cargs->schedule || cargs->poll) {
587 ODPH_ERR(
"ipsec-out queue not found\n");
598 static uint8_t test_data[] = {
600 0x45, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00,
601 0x40, 0x01, 0xac, 0x27, 0xc0, 0xa8, 0x6f, 0x02,
602 0xc0, 0xa8, 0xde, 0x02,
605 0x08, 0x00, 0xfb, 0x37, 0x12, 0x34, 0x00, 0x00
608 static inline void debug_packets(
int debug,
odp_packet_t *pkt,
int num_pkts)
612 for (
int i = 0; i < num_pkts; i++)
617 make_packet_multi(
odp_pool_t pkt_pool,
unsigned int payload_length,
624 ODPH_ERR(
"Could not allocate buffer\n");
630 for (i = 0; i < num; i++) {
636 memset(mem +
sizeof(test_data), 1, payload_length -
sizeof(test_data));
642 static inline void check_ipsec_result(
odp_packet_t ipsec_pkt)
647 ODPH_ERR(
"odp_ipsec_result() failed\n");
649 ODPH_ERR(
"IPsec processing error: %" PRIu32
"\n",
658 run_measure_one(ipsec_args_t *cargs,
660 unsigned int payload_length,
661 time_record_t *start,
664 int in_flight, pkts_allowed, num_out, num_pkts, rc = 0;
665 const int max_in_flight = cargs->in_flight;
666 const int burst_size = cargs->burst_size;
667 const int packet_count = cargs->packet_count;
668 const int debug = cargs->debug_packets;
674 ODPH_ERR(
"pkt_pool not found\n");
678 if (payload_length <
sizeof(test_data))
681 int packets_sent = 0;
682 int packets_received = 0;
685 memset(¶m, 0,
sizeof(param));
690 fill_time_record(start);
692 while ((packets_sent < packet_count) ||
693 (packets_received < packet_count)) {
694 num_pkts = packet_count - packets_sent;
697 num_pkts = num_pkts > burst_size ? burst_size : num_pkts;
700 in_flight = packets_sent - packets_received;
701 pkts_allowed = max_in_flight - in_flight;
704 num_pkts = num_pkts > pkts_allowed ? 0 : num_pkts;
717 debug_packets(debug, pkt, num_pkts);
724 ODPH_ERR(
"Failed odp_ipsec_out: rc = %d\n", rc);
729 for (i = 0; i < num_out; i++)
730 check_ipsec_result(out_pkt[i]);
733 packets_received += num_out;
734 debug_packets(debug, out_pkt, num_out);
742 fill_time_record(end);
744 return rc < 0 ? rc : 0;
747 static uint32_t dequeue_burst(
odp_queue_t polled_queue,
767 static inline uint32_t vec_pkt_handle(
int debug,
odp_event_t ev)
776 for (j = 0; j < vec_size; j++)
777 check_ipsec_result(pkt_tbl[j]);
779 debug_packets(debug, pkt_tbl, vec_size);
788 run_measure_one_async(ipsec_args_t *cargs,
790 unsigned int payload_length,
791 time_record_t *start,
794 int in_flight, packets_allowed, num_pkts, rc = 0;
795 const int max_in_flight = cargs->in_flight;
796 const int burst_size = cargs->burst_size;
797 const int packet_count = cargs->packet_count;
798 const int debug = cargs->debug_packets;
805 ODPH_ERR(
"pkt_pool not found\n");
812 ODPH_ERR(
"ipsec-out queue not found\n");
817 if (payload_length <
sizeof(test_data))
820 int packets_sent = 0;
821 int packets_received = 0;
824 memset(¶m, 0,
sizeof(param));
829 fill_time_record(start);
831 while ((packets_sent < packet_count) ||
832 (packets_received < packet_count)) {
834 num_pkts = packet_count - packets_sent;
837 num_pkts = num_pkts > burst_size ? burst_size : num_pkts;
840 in_flight = packets_sent - packets_received;
841 packets_allowed = max_in_flight - in_flight;
843 if (num_pkts > 0 && num_pkts <= packets_allowed) {
852 debug_packets(debug, pkt, num_pkts);
856 ODPH_ERR(
"Failed odp_ipsec_out_enq: rc = %d\n",
875 while (num_pkts > packets_allowed ||
876 (num_pkts == 0 && packets_received < packet_count)) {
880 num = dequeue_burst(polled_queue, events, MAX_DEQUEUE_BURST);
882 for (uint32_t n = 0; n < num; n++) {
886 vec_size = vec_pkt_handle(debug, events[n]);
887 packets_received += vec_size - 1;
888 packets_allowed += vec_size - 1;
891 check_ipsec_result(pkt_out[i]);
896 packets_received += num;
897 packets_allowed += num;
899 debug_packets(debug, pkt_out, i);
906 fill_time_record(end);
908 return rc < 0 ? rc : 0;
916 run_measure_one_config(ipsec_args_t *cargs,
917 ipsec_alg_config_t *config)
919 unsigned int num_payloads = global_num_payloads;
920 unsigned int *payloads = global_payloads;
927 ODPH_ERR(
"IPSEC capability call failed.\n");
932 ODPH_ERR(
"IPSEC AH protocol not supported.\n");
936 rc = odph_ipsec_alg_check(&capa, config->crypto.cipher_alg,
937 config->crypto.cipher_key.length,
938 config->crypto.auth_alg,
939 config->crypto.auth_key.length);
942 printf(
" => %s skipped\n\n", config->name);
946 sa = create_sa_from_config(config, cargs);
948 ODPH_ERR(
"IPsec SA create failed.\n");
952 print_result_header();
953 if (cargs->payload_length) {
955 payloads = &cargs->payload_length;
958 for (i = 0; i < num_payloads; i++) {
960 ipsec_run_result_t result;
961 time_record_t start, end;
963 if (cargs->schedule || cargs->poll)
964 rc = run_measure_one_async(cargs, sa,
968 rc = run_measure_one(cargs, sa,
974 count = get_elapsed_usec(&start, &end);
975 result.elapsed = count / cargs->packet_count;
977 count = get_rusage_self_diff(&start, &end);
978 result.rusage_self = count / cargs->packet_count;
980 count = get_rusage_thread_diff(&start, &end);
981 result.rusage_thread = count / cargs->packet_count;
983 print_result(cargs, payloads[i],
988 if (cargs->schedule || cargs->poll) {
1013 typedef struct thr_arg {
1014 ipsec_args_t ipsec_args;
1015 ipsec_alg_config_t *ipsec_alg_config;
1018 static int run_thr_func(
void *arg)
1020 thr_arg_t *thr_args = (thr_arg_t *)arg;
1022 run_measure_one_config(&thr_args->ipsec_args,
1023 thr_args->ipsec_alg_config);
1030 static void usage(
char *progname)
1033 "Usage: %s OPTIONS\n"
1034 " E.g. %s -i 100000\n"
1036 "OpenDataPlane crypto speed measure.\n"
1037 "Optional OPTIONS\n"
1038 " -a, --algorithm <name> Specify algorithm name (default all)\n"
1039 " Supported values are:\n",
1040 progname, progname);
1042 print_config_names(
" ");
1043 printf(
" -d, --debug Enable dump of processed packets.\n"
1044 " -f, --flight <number> Max number of packet processed in parallel (default 1)\n"
1045 " -c, --count <number> Number of packets (default 10000)\n"
1046 " -b, --burst <number> Number of packets in one IPsec API submission (default 1)\n"
1047 " -v, --vector <number> Enable vector packet completion from IPsec APIs with specified vector size.\n"
1048 " -l, --payload Payload length.\n"
1049 " -s, --schedule Use scheduler for completion events.\n"
1050 " -p, --poll Poll completion queue for completion events.\n"
1051 " -t, --tunnel Use tunnel-mode IPsec transformation.\n"
1052 " -u, --ah Use AH transformation instead of ESP.\n"
1053 " -h, --help Display help and exit.\n"
1057 static void parse_args(
int argc,
char *argv[], ipsec_args_t *cargs)
1060 static const struct option longopts[] = {
1061 {
"algorithm", optional_argument, NULL,
'a'},
1062 {
"debug", no_argument, NULL,
'd'},
1063 {
"flight", optional_argument, NULL,
'f'},
1064 {
"help", no_argument, NULL,
'h'},
1065 {
"count", optional_argument, NULL,
'c'},
1066 {
"burst", optional_argument, NULL,
'b'},
1067 {
"vector", optional_argument, NULL,
'v'},
1068 {
"payload", optional_argument, NULL,
'l'},
1069 {
"sessions", optional_argument, NULL,
'm'},
1070 {
"poll", no_argument, NULL,
'p'},
1071 {
"schedule", no_argument, NULL,
's'},
1072 {
"tunnel", no_argument, NULL,
't'},
1073 {
"ah", no_argument, NULL,
'u'},
1077 static const char *shortopts =
"+a:b:c:df:hm:nl:sptuv:";
1079 cargs->in_flight = 1;
1080 cargs->debug_packets = 0;
1081 cargs->packet_count = 10000;
1082 cargs->burst_size = 1;
1083 cargs->vec_pkt_size = 0;
1084 cargs->payload_length = 0;
1085 cargs->alg_config = NULL;
1086 cargs->schedule = 0;
1090 opt = getopt_long(argc, argv, shortopts, longopts, NULL);
1097 cargs->alg_config = find_config_by_name(optarg);
1098 if (!cargs->alg_config) {
1099 printf(
"cannot test crypto '%s' configuration\n",
1106 cargs->debug_packets = 1;
1109 cargs->packet_count = atoi(optarg);
1113 cargs->burst_size = 32;
1115 cargs->burst_size = atoi(optarg);
1116 if (cargs->burst_size > POOL_NUM_PKT) {
1117 printf(
"Invalid burst size (max allowed: %d)\n", POOL_NUM_PKT);
1123 cargs->vec_pkt_size = 32;
1125 cargs->vec_pkt_size = atoi(optarg);
1128 cargs->in_flight = atoi(optarg);
1135 cargs->payload_length = atoi(optarg);
1138 cargs->schedule = 1;
1154 if (cargs->in_flight < cargs->burst_size) {
1155 printf(
"-f (flight) must be greater than or equal to -b (burst)\n");
1161 if (cargs->schedule && cargs->poll) {
1162 printf(
"-s (schedule) and -p (poll) options are not compatible\n");
1168 int main(
int argc,
char *argv[])
1179 int num_workers = 1;
1180 odph_helper_options_t helper_options;
1181 odph_thread_t thread_tbl[num_workers];
1182 odph_thread_common_param_t thr_common;
1183 odph_thread_param_t thr_param;
1189 uint32_t max_seg_len;
1193 argc = odph_parse_options(argc, argv);
1194 if (odph_options(&helper_options)) {
1195 ODPH_ERR(
"Reading ODP helper options failed.\n");
1200 init_param.
mem_model = helper_options.mem_model;
1202 memset(&cargs, 0,
sizeof(cargs));
1205 parse_args(argc, argv, &cargs);
1209 ODPH_ERR(
"ODP global init failed.\n");
1215 ODPH_ERR(
"ODP local init failed.\n");
1222 ODPH_ERR(
"Pool capability request failed.\n");
1228 for (i = 0; i < ODPH_ARRAY_SIZE(global_payloads); i++) {
1229 if (global_payloads[i] > max_seg_len)
1233 global_num_payloads = i;
1238 param.
pkt.
len = max_seg_len;
1239 param.
pkt.
num = POOL_NUM_PKT;
1244 ODPH_ERR(
"packet pool create failed.\n");
1250 ODPH_ERR(
"IPSEC capability call failed.\n");
1255 ODPH_ERR(
"Scheduled type destination queue not supported.\n");
1260 ODPH_ERR(
"Plain type destination queue not supported.\n");
1264 if (cargs.vec_pkt_size) {
1266 ODPH_ERR(
"Vector packet pool not available");
1271 ODPH_ERR(
"Vector packet completion not supported by IPsec.\n");
1276 ODPH_ERR(
"Vector size larger than max size supported by vector pool.\n");
1280 if (!cargs.schedule && !cargs.poll) {
1281 ODPH_ERR(
"Vector packet is not supported with sync APIs.\n");
1293 ODPH_ERR(
"Vector packet pool create failed.\n");
1313 if (cargs.schedule) {
1320 }
else if (cargs.poll) {
1324 if (cargs.schedule || cargs.poll) {
1326 ODPH_ERR(
"ipsec-out queue create failed.\n");
1338 ODPH_ERR(
"odp_ipsec_config() failed\n");
1342 if (cargs.schedule) {
1343 printf(
"Run in async scheduled mode\n");
1345 thr_arg.ipsec_args = cargs;
1346 thr_arg.ipsec_alg_config = cargs.alg_config;
1350 sizeof(cpumaskstr));
1351 printf(
"num worker threads: %i\n",
1353 printf(
"first CPU: %i\n",
1355 printf(
"cpu mask: %s\n",
1357 }
else if (cargs.poll) {
1358 printf(
"Run in async poll mode\n");
1360 printf(
"Run in sync mode\n");
1363 if (cargs.alg_config) {
1364 odph_thread_common_param_init(&thr_common);
1365 thr_common.instance = instance;
1366 thr_common.cpumask = &cpumask;
1367 thr_common.share_param = 1;
1369 if (cargs.schedule) {
1370 odph_thread_param_init(&thr_param);
1371 thr_param.start = run_thr_func;
1372 thr_param.arg = &thr_arg;
1375 memset(thread_tbl, 0,
sizeof(thread_tbl));
1376 odph_thread_create(thread_tbl, &thr_common, &thr_param, num_workers);
1378 odph_thread_join(thread_tbl, num_workers);
1380 run_measure_one_config(&cargs, cargs.alg_config);
1383 for (i = 0; i < ODPH_ARRAY_SIZE(algs_config); i++) {
1385 algs_config[i].crypto.cipher_alg !=
1388 run_measure_one_config(&cargs, algs_config + i);
1392 if (cargs.schedule || cargs.poll)
1395 if (cargs.vec_pkt_size) {
1397 ODPH_ERR(
"Error: vector pool destroy\n");
1403 ODPH_ERR(
"Error: pool destroy\n");
1408 ODPH_ERR(
"Error: term local\n");
1413 ODPH_ERR(
"Error: term global\n");
#define odp_unlikely(x)
Branch unlikely taken.
odp_u16be_t odp_cpu_to_be_16(uint16_t cpu16)
Convert cpu native uint16_t to 16bit big endian.
#define odp_likely(x)
Branch likely taken.
int odp_cpumask_default_worker(odp_cpumask_t *mask, int num)
Default CPU mask for worker threads.
int odp_cpumask_first(const odp_cpumask_t *mask)
Find first set CPU in mask.
int32_t odp_cpumask_to_str(const odp_cpumask_t *mask, char *str, int32_t size)
Format a string from CPU mask.
#define ODP_CPUMASK_STR_SIZE
The maximum number of characters needed to record any CPU mask as a string (output of odp_cpumask_to_...
@ ODP_CIPHER_ALG_AES_CCM
AES-CCM.
@ ODP_CIPHER_ALG_AES_CTR
AES with counter mode.
@ ODP_CIPHER_ALG_CHACHA20_POLY1305
ChaCha20-Poly1305.
@ ODP_CIPHER_ALG_AES_CBC
AES with cipher block chaining.
@ ODP_CIPHER_ALG_AES_GCM
AES-GCM.
@ ODP_CIPHER_ALG_3DES_CBC
Triple DES with cipher block chaining.
@ ODP_CIPHER_ALG_NULL
No cipher algorithm specified.
@ ODP_AUTH_ALG_CHACHA20_POLY1305
ChaCha20-Poly1305 AEAD.
@ ODP_AUTH_ALG_NULL
No authentication algorithm specified.
@ ODP_AUTH_ALG_MD5_HMAC
HMAC-MD5.
@ ODP_AUTH_ALG_SHA512_HMAC
HMAC-SHA-512.
@ ODP_AUTH_ALG_SHA1_HMAC
HMAC-SHA-1.
@ ODP_AUTH_ALG_SHA256_HMAC
HMAC-SHA-256.
@ ODP_AUTH_ALG_AES_GMAC
AES-GMAC.
@ ODP_AUTH_ALG_AES_GCM
AES-GCM.
@ ODP_AUTH_ALG_AES_CCM
AES-CCM.
odp_event_type_t odp_event_type(odp_event_t event)
Event type of an event.
#define ODP_EVENT_INVALID
Invalid event.
void odp_init_param_init(odp_init_t *param)
Initialize the odp_init_t to default values for all fields.
int odp_init_local(odp_instance_t instance, odp_thread_type_t thr_type)
Thread local ODP initialization.
int odp_init_global(odp_instance_t *instance, const odp_init_t *params, const odp_platform_init_t *platform_params)
Global ODP initialization.
int odp_term_local(void)
Thread local ODP termination.
int odp_term_global(odp_instance_t instance)
Global ODP termination.
uint64_t odp_instance_t
ODP instance ID.
odp_packet_t odp_ipsec_packet_from_event(odp_event_t ev)
Convert IPSEC processed packet event to packet handle.
#define ODP_IPSEC_OK
IPSEC operation status has no errors.
int odp_ipsec_capability(odp_ipsec_capability_t *capa)
Query IPSEC capabilities.
int odp_ipsec_out(const odp_packet_t pkt_in[], int num_in, odp_packet_t pkt_out[], int *num_out, const odp_ipsec_out_param_t *param)
Outbound synchronous IPSEC operation.
void odp_ipsec_config_init(odp_ipsec_config_t *config)
Initialize IPSEC configuration options.
void odp_ipsec_sa_param_init(odp_ipsec_sa_param_t *param)
Initialize IPSEC SA parameters.
int odp_ipsec_config(const odp_ipsec_config_t *config)
Global IPSEC configuration.
int odp_ipsec_sa_disable(odp_ipsec_sa_t sa)
Disable IPSEC SA.
int odp_ipsec_out_enq(const odp_packet_t pkt[], int num, const odp_ipsec_out_param_t *param)
Outbound asynchronous IPSEC operation.
int odp_ipsec_status(odp_ipsec_status_t *status, odp_event_t event)
Get IPSEC status information from an ODP_EVENT_IPSEC_STATUS event.
#define ODP_IPSEC_SA_INVALID
Invalid IPSEC SA.
odp_ipsec_sa_t odp_ipsec_sa_create(const odp_ipsec_sa_param_t *param)
Create IPSEC SA.
int odp_ipsec_sa_destroy(odp_ipsec_sa_t sa)
Destroy IPSEC SA.
int odp_ipsec_result(odp_ipsec_packet_result_t *result, odp_packet_t packet)
Get IPSEC operation results from an IPSEC processed packet.
@ ODP_IPSEC_OP_MODE_SYNC
Synchronous IPSEC operation.
@ ODP_IPSEC_OP_MODE_ASYNC
Asynchronous IPSEC operation.
@ ODP_IPSEC_STATUS_SA_DISABLE
Response to SA disable command.
@ ODP_IPSEC_ESP
ESP protocol.
@ ODP_IPSEC_TUNNEL_IPV4
Outer header is IPv4.
@ ODP_IPSEC_MODE_TRANSPORT
IPSEC transport mode.
@ ODP_IPSEC_MODE_TUNNEL
IPSEC tunnel mode.
@ ODP_IPSEC_DIR_OUTBOUND
Outbound IPSEC SA.
void odp_packet_print_data(odp_packet_t pkt, uint32_t offset, uint32_t len)
Print packet data.
int odp_packet_l3_offset_set(odp_packet_t pkt, uint32_t offset)
Set layer 3 start offset.
odp_packet_vector_t odp_packet_vector_from_event(odp_event_t ev)
Get packet vector handle from event.
void * odp_packet_data(odp_packet_t pkt)
Packet data pointer.
uint32_t odp_packet_len(odp_packet_t pkt)
Packet data length.
void odp_packet_vector_free(odp_packet_vector_t pktv)
Free packet vector.
int odp_packet_copy_from_mem(odp_packet_t pkt, uint32_t offset, uint32_t len, const void *src)
Copy data from memory to packet.
uint32_t odp_packet_vector_tbl(odp_packet_vector_t pktv, odp_packet_t **pkt_tbl)
Get packet vector table.
int odp_packet_alloc_multi(odp_pool_t pool, uint32_t len, odp_packet_t pkt[], int num)
Allocate multiple packets from a packet pool.
void odp_packet_free_sp(const odp_packet_t pkt[], int num)
Free multiple packets to the same pool.
uint32_t odp_packet_vector_size(odp_packet_vector_t pktv)
Number of packets in a vector.
odp_pool_t odp_pool_create(const char *name, const odp_pool_param_t *param)
Create a pool.
int odp_pool_capability(odp_pool_capability_t *capa)
Query pool capabilities.
void odp_pool_param_init(odp_pool_param_t *param)
Initialize pool params.
int odp_pool_destroy(odp_pool_t pool)
Destroy a pool previously created by odp_pool_create()
void odp_pool_print(odp_pool_t pool)
Print pool info.
odp_pool_t odp_pool_lookup(const char *name)
Find a pool by name.
#define ODP_POOL_INVALID
Invalid pool.
@ ODP_POOL_VECTOR
Vector event pool.
@ ODP_POOL_PACKET
Packet pool.
odp_queue_t odp_queue_lookup(const char *name)
Find a queue by name.
void odp_queue_param_init(odp_queue_param_t *param)
Initialize queue params.
#define ODP_QUEUE_INVALID
Invalid queue.
odp_event_t odp_queue_deq(odp_queue_t queue)
Dequeue an event from a queue.
odp_queue_t odp_queue_create(const char *name, const odp_queue_param_t *param)
Queue create.
int odp_queue_destroy(odp_queue_t queue)
Destroy ODP queue.
int odp_queue_deq_multi(odp_queue_t queue, odp_event_t events[], int num)
Dequeue multiple events from a queue.
@ ODP_QUEUE_TYPE_SCHED
Scheduled queue.
@ ODP_QUEUE_TYPE_PLAIN
Plain queue.
#define ODP_SCHED_SYNC_PARALLEL
Parallel scheduled queues.
int odp_schedule_multi(odp_queue_t *from, uint64_t wait, odp_event_t events[], int num)
Schedule multiple events.
#define ODP_SCHED_NO_WAIT
Do not wait.
int odp_schedule_default_prio(void)
Default scheduling priority level.
int odp_schedule_config(const odp_schedule_config_t *config)
Global schedule configuration.
odp_event_t odp_schedule(odp_queue_t *from, uint64_t wait)
Schedule an event.
#define ODP_SCHED_GROUP_ALL
Group of all threads.
@ ODP_SUPPORT_NO
Feature is not supported.
void odp_sys_info_print(void)
Print system info.
@ ODP_THREAD_WORKER
Worker thread.
Global initialization parameters.
odp_mem_model_t mem_model
Application memory model.
odp_pktin_vector_capability_t vector
Support for returning completion packets as vectors.
odp_bool_t queue_type_sched
Scheduled queue support.
odp_bool_t queue_type_plain
Plain queue support.
odp_support_t proto_ah
IP Authenticated Header (ODP_IPSEC_AH) support.
IPSEC configuration options.
odp_pktin_vector_config_t vector
Packet vector configuration for async and inline operations.
odp_ipsec_op_mode_t outbound_mode
Outbound IPSEC operation mode.
odp_ipsec_inbound_config_t inbound
IPSEC inbound processing configuration.
uint32_t max_num_sa
Maximum number of IPSEC SAs that application will use simultaneously.
odp_ipsec_outbound_config_t outbound
IPSEC outbound processing configuration.
odp_ipsec_op_mode_t inbound_mode
Inbound IPSEC operation mode.
odp_cipher_alg_t cipher_alg
Cipher algorithm.
uint32_t all
All error bits.
odp_queue_t default_queue
Default destination queue for IPSEC events.
odp_proto_chksums_t chksums
Flags to control IPSEC payload data checks up to the selected parse level.
uint8_t ttl
IPv4 Time To Live.
void * src_addr
IPv4 source address (NETWORK ENDIAN)
void * dst_addr
IPv4 destination address (NETWORK ENDIAN)
odp_ipsec_error_t error
IPSEC errors.
IPSEC outbound operation parameters.
int num_opt
Number of outbound operation options.
const odp_ipsec_sa_t * sa
Pointer to an array of IPSEC SAs.
uint32_t all_chksum
All bits of the bit field structure.
IPSEC operation result for a packet.
odp_ipsec_op_status_t status
IPSEC operation status.
IPSEC Security Association (SA) parameters.
odp_ipsec_crypto_param_t crypto
Parameters for crypto and authentication algorithms.
odp_queue_t dest_queue
Destination queue for IPSEC events.
odp_ipsec_mode_t mode
IPSEC protocol mode: transport or tunnel.
odp_ipsec_dir_t dir
IPSEC SA direction: inbound or outbound.
struct odp_ipsec_sa_param_t::@47::@50 outbound
Outbound specific parameters.
odp_ipsec_protocol_t proto
IPSEC protocol: ESP or AH.
odp_ipsec_sa_t sa
IPSEC SA that was target of the operation.
odp_ipsec_status_id_t id
IPSEC status ID.
odp_ipsec_tunnel_type_t type
Tunnel type: IPv4 or IPv6.
odp_ipsec_ipv4_param_t ipv4
IPv4 header parameters.
uint64_t max_tmo_ns
Maximum timeout in nanoseconds for the producer to wait for the vector of packets.
odp_support_t supported
Packet input vector availability.
odp_bool_t enable
Enable packet input vector.
uint32_t max_size
Maximum number of packets in a vector.
uint64_t max_tmo_ns
Maximum time to wait for packets.
odp_pool_t pool
Vector pool.
struct odp_pool_capability_t::@122 pkt
Packet pool capabilities
struct odp_pool_capability_t::@124 vector
Vector pool capabilities.
uint32_t max_size
Maximum buffer data size in bytes.
uint32_t max_pools
Maximum number of pools of any type (odp_pool_type_t)
uint32_t max_seg_len
Maximum packet segment data length in bytes.
uint32_t num
Number of buffers in the pool.
odp_pool_type_t type
Pool type.
uint32_t len
Minimum length of 'num' packets.
uint32_t max_size
Maximum number of handles (such as odp_packet_t) in a vector.
uint32_t seg_len
Minimum number of packet data bytes that can be stored in the first segment of a newly allocated pack...
struct odp_pool_param_t::@126 pkt
Parameters for packet pools.
struct odp_pool_param_t::@128 vector
Parameters for vector pools.
odp_schedule_param_t sched
Scheduler parameters.
odp_queue_type_t type
Queue type.
odp_schedule_group_t group
Thread group.
odp_schedule_prio_t prio
Priority level.
odp_schedule_sync_t sync
Synchronization method.
uint32_t all_chksum
All checksum bits.