14 #include <odp/helper/odph_api.h>
25 #define QUEUES_PER_GROUP 4
26 #define PKTS_PER_QUEUE 256
28 #define MAX_EVENT_BURST 32
29 #define CRC_INIT_VAL 123456789
30 #define PASS_PACKETS 10000
33 #define DEF_LOOKUP_TBL_SIZE (1024 * 1024)
36 (((ODP_THREAD_COUNT_MAX - 1) > (MAX_GROUPS * QUEUES_PER_GROUP)) ? \
37 (MAX_GROUPS * QUEUES_PER_GROUP) : \
38 (ODP_THREAD_COUNT_MAX - 1))
41 "Not enough queues for all workers");
44 #define NO_PATH(file_name) (strrchr((file_name), '/') ? \
45 strrchr((file_name), '/') + 1 : (file_name))
63 uint64_t lookup_tbl_size;
65 unsigned int cpu_count;
75 uint64_t dropped_pkts;
82 uint8_t padding[ODP_CACHE_LINE_SIZE];
86 typedef struct thread_args_t {
94 thread_args_t thread[MAX_WORKERS];
103 lookup_entry_t *lookup_tbl;
109 static args_t *gbl_args;
111 static const uint8_t test_udp_packet[] = {
112 0x00, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x00, 0x01,
113 0x02, 0x03, 0x04, 0x05, 0x08, 0x00, 0x45, 0x00,
114 0x02, 0x1C, 0x00, 0x01, 0x00, 0x00, 0x40, 0x11,
115 0xF7, 0x7C, 0xC0, 0xA8, 0x00, 0x01, 0xC0, 0xA8,
116 0x00, 0x02, 0x04, 0xD2, 0x1A, 0x82, 0x02, 0x08,
117 0x24, 0x1E, 0xC9, 0x56, 0xB4, 0xD6, 0x4B, 0x64,
118 0xB3, 0x01, 0xA1, 0x97, 0x4D, 0xD1, 0xA4, 0x76,
119 0xF5, 0x7B, 0x27, 0x22, 0x6C, 0xA9, 0xED, 0x29,
120 0x6E, 0x02, 0x80, 0xF7, 0xC4, 0x2D, 0x2A, 0x96,
121 0x2D, 0xF6, 0x02, 0x8E, 0x89, 0x9F, 0x8C, 0xF4,
122 0x0D, 0xC5, 0xE5, 0x1F, 0xA1, 0x52, 0xC3, 0x4B,
123 0x5C, 0x4C, 0xDF, 0x14, 0x05, 0x6A, 0xA8, 0xD7,
124 0xAD, 0x4F, 0x22, 0xA6, 0xB8, 0xF9, 0x52, 0x5A,
125 0xB8, 0xF9, 0xE2, 0x2C, 0x05, 0x2A, 0x6F, 0xF2,
126 0xCA, 0xA1, 0xA7, 0xC3, 0x56, 0xE1, 0xDB, 0xC1,
127 0xDB, 0x86, 0x26, 0x55, 0xAC, 0xBE, 0xE1, 0x3D,
128 0x82, 0x86, 0xB9, 0xDE, 0x3E, 0xD3, 0x11, 0xAB,
129 0x65, 0x6A, 0xED, 0x1B, 0x60, 0xBE, 0x69, 0x71,
130 0xB2, 0xA8, 0x5B, 0xB1, 0x06, 0xE3, 0x48, 0x14,
131 0xC9, 0x13, 0x73, 0xDA, 0xBE, 0xE4, 0x7A, 0x5F,
132 0xC0, 0xE0, 0xCA, 0xF3, 0x7A, 0xCA, 0x3F, 0xC9,
133 0x4A, 0xEE, 0x47, 0x76, 0x67, 0xF0, 0x0D, 0x3F,
134 0x7F, 0x3D, 0x69, 0xEA, 0x39, 0x53, 0x7C, 0xE3,
135 0xED, 0x78, 0x79, 0x47, 0x60, 0x95, 0xCB, 0xDC,
136 0x26, 0x60, 0x46, 0xAC, 0x47, 0xDA, 0x4C, 0x4D,
137 0x0F, 0xE1, 0x68, 0x43, 0xBC, 0xCD, 0x4E, 0xFE,
138 0x2E, 0xD6, 0xC2, 0x6E, 0x63, 0xEA, 0xB3, 0x98,
139 0xCA, 0x8F, 0x7F, 0x05, 0xDF, 0x72, 0x8F, 0x6E,
140 0x3E, 0x6D, 0xC7, 0x94, 0x59, 0x9D, 0x15, 0x5B,
141 0xB8, 0x02, 0x52, 0x4F, 0x68, 0x3A, 0xF1, 0xFF,
142 0xA9, 0xA4, 0x30, 0x29, 0xE0, 0x1C, 0xA0, 0x1B,
143 0x50, 0xAB, 0xFD, 0x06, 0x84, 0xD4, 0x33, 0x51,
144 0x01, 0xB3, 0x5F, 0x49, 0x5F, 0x21, 0xA0, 0xA1,
145 0xC9, 0x08, 0xB3, 0xDF, 0x72, 0x9B, 0x5B, 0x70,
146 0x89, 0x96, 0x08, 0x25, 0x88, 0x1E, 0xED, 0x52,
147 0xDC, 0x98, 0xA0, 0xB8, 0x83, 0x2A, 0xA0, 0x90,
148 0x45, 0xC9, 0x77, 0xD2, 0x19, 0xD7, 0x6B, 0xAB,
149 0x49, 0x67, 0x7C, 0xD1, 0xE0, 0x23, 0xA2, 0x36,
150 0xB2, 0x91, 0x3B, 0x23, 0x3B, 0x03, 0x36, 0xAF,
151 0xAD, 0x81, 0xFA, 0x6F, 0x68, 0xD5, 0xBE, 0x73,
152 0x1D, 0x56, 0x8A, 0xE8, 0x1A, 0xB4, 0xA8, 0x7C,
153 0xF3, 0x82, 0x10, 0xD0, 0xF2, 0x1D, 0x9C, 0xEA,
154 0xAB, 0xE7, 0xEC, 0x53, 0x6D, 0x52, 0xBD, 0x29,
155 0x86, 0x21, 0xCE, 0xAA, 0xF3, 0x68, 0xA6, 0xEC,
156 0x7E, 0xCA, 0x6F, 0xEB, 0xE1, 0x81, 0x80, 0x7C,
157 0xF3, 0xE5, 0x22, 0xA0, 0x91, 0x08, 0xB7, 0x35,
158 0x15, 0x87, 0x0C, 0x77, 0x31, 0x9C, 0x2F, 0x73,
159 0xCE, 0x29, 0x6F, 0xC6, 0xAC, 0x9F, 0x68, 0xB8,
160 0x6A, 0xFC, 0xD3, 0xB5, 0x08, 0x98, 0xAE, 0xE4,
161 0x20, 0x84, 0x24, 0x69, 0xA5, 0xF5, 0x4A, 0x9D,
162 0x44, 0x26, 0x5A, 0xF9, 0x6B, 0x5E, 0x5D, 0xC8,
163 0x6F, 0xD4, 0x62, 0x91, 0xE5, 0x8E, 0x80, 0x05,
164 0xA1, 0x95, 0x09, 0xEA, 0xFE, 0x84, 0x6D, 0xC3,
165 0x0D, 0xD4, 0x32, 0xA4, 0x38, 0xB2, 0xF7, 0x9D,
166 0x58, 0xD3, 0x5D, 0x93, 0x5F, 0x67, 0x86, 0xE1,
167 0xAF, 0xFF, 0xE9, 0xFE, 0xF4, 0x71, 0x63, 0xE3,
168 0x3E, 0xE1, 0x7A, 0x80, 0x5A, 0x23, 0x4F, 0x5B,
169 0x54, 0x21, 0x0E, 0xE2, 0xAF, 0x01, 0x2E, 0xA4,
170 0xF5, 0x1F, 0x59, 0x96, 0x3E, 0x82, 0xF3, 0x44,
171 0xDF, 0xA6, 0x7C, 0x64, 0x5D, 0xC7, 0x79, 0xA1,
172 0x17, 0xE1, 0x06, 0x14, 0x3E, 0x1B, 0x46, 0xCA,
173 0x71, 0xC8, 0x05, 0x62, 0xD0, 0x56, 0x23, 0x9B,
174 0xBA, 0xFE, 0x6D, 0xA8, 0x03, 0x4C, 0x23, 0xD8,
175 0x98, 0x8A, 0xE8, 0x9C, 0x93, 0x8E, 0xB7, 0x24,
176 0x31, 0x2A, 0x81, 0x72, 0x8F, 0x13, 0xD4, 0x7E,
177 0xEB, 0xB1, 0xEE, 0x33, 0xD9, 0xF4, 0x96, 0x5E,
178 0x6C, 0x3D, 0x45, 0x9C, 0xE0, 0x71, 0xA3, 0xFA,
179 0x17, 0x2B, 0xC3, 0x07, 0xD6, 0x86, 0xA2, 0x06,
180 0xC5, 0x33, 0xF0, 0xEA, 0x25, 0x70, 0x68, 0x56,
186 if (gbl_args == NULL)
191 static inline void init_packet(
odp_packet_t pkt, uint32_t seq, uint16_t group)
201 ODPH_ABORT(
"odp_packet_parse() failed\n");
205 ODPH_UDPHDR_LEN, NULL, NULL);
207 if (odph_udp_chksum_set(pkt))
208 ODPH_ABORT(
"odph_udp_chksum_set() failed\n");
222 odph_udphdr_t *udp_hdr;
224 lookup_entry_t *lookup_entry;
242 ODPH_ERR(
"Error: Invalid packet crc\n");
248 ODPH_ERR(
"Error: odp_packet_parse() failed\n");
254 lookup_entry = &gbl_args->lookup_tbl[(crc + hdr->seq) %
255 gbl_args->appl.lookup_tbl_size];
258 ODPH_UDPHDR_LEN, NULL, NULL);
260 *payload += lookup_entry->idx % 2 ? lookup_entry->val1 :
263 udp_hdr->chksum = ~(~udp_hdr->chksum + (-old_val) + new_val);
267 *payload += hdr->seq;
269 udp_hdr->chksum = ~(~udp_hdr->chksum + (-old_val) + new_val);
273 return gbl_args->queue[hdr->group][hdr->seq++ % QUEUES_PER_GROUP];
279 static int run_thread(
void *arg)
281 thread_args_t *thr_args = arg;
282 stats_t *stats = &thr_args->stats;
298 event_tbl, MAX_EVENT_BURST);
302 for (i = 0; i < num_events; i++) {
305 dst_queue = work_on_event(event);
307 stats->s.dropped_pkts++;
313 ODPH_ERR(
"Error: odp_queue_enq() failed\n");
314 stats->s.dropped_pkts++;
326 stats->s.cycles = c2 - c1;
350 static void usage(
char *progname)
353 "OpenDataPlane CPU benchmarking application.\n"
355 "Usage: %s [options]\n"
357 " E.g. %s -c 4 -t 30\n"
359 " -c, --count <number> CPU count, 0=all available, default=1\n"
360 " -t, --time <sec> Time in seconds to run\n"
361 " (default is 10 second).\n"
362 " -a, --accuracy <sec> Time in seconds get print statistics\n"
363 " (default is 1 second).\n"
364 " -l, --lookup_tbl <num> Number of entries in dummy lookup table\n"
365 " (default is %d).\n"
366 " -h, --help Display help and exit.\n\n"
367 "\n", NO_PATH(progname), NO_PATH(progname), DEF_LOOKUP_TBL_SIZE);
377 static void parse_args(
int argc,
char *argv[], appl_args_t *appl_args)
381 static const struct option longopts[] = {
382 {
"accuracy", required_argument, NULL,
'a'},
383 {
"cpu", required_argument, NULL,
'c'},
384 {
"lookup_tbl", required_argument, NULL,
'l'},
385 {
"time", required_argument, NULL,
't'},
386 {
"help", no_argument, NULL,
'h'},
390 static const char *shortopts =
"+a:c:l:t:h";
392 appl_args->accuracy = 1;
393 appl_args->cpu_count = 1;
394 appl_args->lookup_tbl_size = DEF_LOOKUP_TBL_SIZE;
395 appl_args->time = 10;
398 opt = getopt_long(argc, argv, shortopts, longopts, NULL);
405 appl_args->accuracy = atoi(optarg);
408 appl_args->cpu_count = atoi(optarg);
411 appl_args->lookup_tbl_size = atoi(optarg);
414 appl_args->time = atoi(optarg);
426 if (appl_args->lookup_tbl_size < 1) {
427 printf(
"At least one lookup table entry required.\n");
439 static int print_stats(
int num_workers, stats_t **thr_stats,
int duration,
444 uint64_t pkts_prev = 0;
449 int stats_enabled = 1;
450 int loop_forever = (duration == 0);
466 for (i = 0; i < num_workers; i++) {
467 pkts += thr_stats[i]->s.pkts;
468 dropped += thr_stats[i]->s.dropped_pkts;
471 pps = (pkts - pkts_prev) / accuracy;
474 printf(
"%.2f Mpps, ", pps / 1000000.0);
476 printf(
"%" PRIu64
" dropped\n", dropped);
482 (loop_forever || (elapsed < duration)));
489 for (i = 0; i < num_workers; i++) {
490 pkts += thr_stats[i]->s.pkts;
491 dropped += thr_stats[i]->s.dropped_pkts;
492 nsec += thr_stats[i]->s.nsec;
493 cycles += thr_stats[i]->s.cycles;
496 printf(
"\nRESULTS - per thread (Million packets per sec):\n");
497 printf(
"-----------------------------------------------\n");
498 printf(
" avg 1 2 3 4 5 6 7 8 9 10\n");
499 printf(
"%6.2f ", pkts / (nsec / 1000.0));
501 for (i = 0; i < num_workers; i++) {
502 if (i != 0 && (i % 10) == 0)
505 printf(
"%6.2f ", thr_stats[i]->s.pkts /
506 (thr_stats[i]->s.nsec / 1000.0));
511 printf(
"RESULTS - total over %i threads:\n", num_workers);
512 printf(
"----------------------------------\n");
513 printf(
" avg packets per sec: %.3f M\n", pkts / (nsec / 1000.0));
514 printf(
" avg cycles per packet: %" PRIu64
"\n", cycles / pkts);
515 printf(
" dropped packets: %" PRIu64
"\n\n", dropped);
517 return pkts > PASS_PACKETS ? 0 : -1;
520 static void gbl_args_init(args_t *args)
522 memset(args, 0,
sizeof(args_t));
529 int main(
int argc,
char *argv[])
531 stats_t *stats[MAX_WORKERS];
532 odph_helper_options_t helper_options;
533 odph_thread_t thread_tbl[MAX_WORKERS];
534 odph_thread_common_param_t thr_common;
535 odph_thread_param_t thr_param[MAX_WORKERS];
549 uint32_t pkts_per_group;
552 unsigned int num_workers;
557 argc = odph_parse_options(argc, argv);
558 if (odph_options(&helper_options)) {
559 ODPH_ERR(
"Error: reading ODP helper options failed.\n");
573 init.
mem_model = helper_options.mem_model;
577 signal(SIGINT, sig_handler);
580 ODPH_ERR(
"Error: ODP global init failed\n");
585 ODPH_ERR(
"Error: ODP local init failed\n");
592 ODPH_ERR(
"Error: shared mem reserve failed.\n");
597 if (gbl_args == NULL) {
598 ODPH_ERR(
"Error: shared mem alloc failed\n");
601 gbl_args_init(gbl_args);
604 parse_args(argc, argv, &gbl_args->appl);
607 sizeof(lookup_entry_t) *
608 gbl_args->appl.lookup_tbl_size,
609 ODP_CACHE_LINE_SIZE, 0);
611 ODPH_ERR(
"Error: shared mem reserve failed.\n");
616 if (gbl_args->lookup_tbl == NULL) {
617 ODPH_ERR(
"Error: lookup table mem alloc failed\n");
625 num_workers = MAX_WORKERS;
626 if (gbl_args->appl.cpu_count && gbl_args->appl.cpu_count < MAX_WORKERS)
627 num_workers = gbl_args->appl.cpu_count;
633 printf(
"num worker threads: %i\n", num_workers);
635 printf(
"cpu mask: %s\n", cpumaskstr);
641 pkts_per_group = QUEUES_PER_GROUP * PKTS_PER_QUEUE;
647 if (schedule_config.
num_queues < QUEUES_PER_GROUP) {
648 ODPH_ERR(
"Error: min %d queues required\n", QUEUES_PER_GROUP);
651 num_queues = num_workers > schedule_config.
num_queues ?
653 num_groups = (num_queues + QUEUES_PER_GROUP - 1) / QUEUES_PER_GROUP;
654 if (num_groups * QUEUES_PER_GROUP > schedule_config.
num_queues)
656 num_queues = num_groups * QUEUES_PER_GROUP;
658 for (i = 0; i < num_groups; i++) {
659 for (j = 0; j < QUEUES_PER_GROUP; j++) {
668 param.
size = pkts_per_group;
672 ODPH_ERR(
"Error: odp_queue_create() failed\n");
675 gbl_args->queue[i][j] = queue;
681 ODPH_ERR(
"Error: odp_pool_capability() failed\n");
684 num_pkts = pkts_per_group * num_groups;
688 pkt_len =
sizeof(test_udp_packet);
695 if (pkt_len <
sizeof(test_udp_packet)) {
696 ODPH_ERR(
"Error: min %dB single segment packets required\n",
697 (
int)
sizeof(test_udp_packet));
703 ODPH_ERR(
"Error: min %dB of packet user area required\n",
704 (
int)
sizeof(test_hdr_t));
712 params.
pkt.
num = num_pkts;
718 ODPH_ERR(
"Error: packet pool create failed\n");
723 printf(
"CPU bench args\n--------------\n");
724 printf(
" workers: %u\n", num_workers);
725 printf(
" queues: %" PRIu32
"\n", num_queues);
726 printf(
" pkts: %" PRIu32
"\n", num_pkts);
727 printf(
" pkt size: %" PRIu32
" B\n", pkt_len);
728 printf(
" lookup entries: %" PRIu64
"\n\n",
729 gbl_args->appl.lookup_tbl_size);
732 for (i = 0; i < num_pkts; i++) {
736 uint16_t group = i % num_groups;
739 ODPH_ERR(
"Error: odp_packet_alloc() failed\n");
745 init_packet(pkt, i, group);
747 queue = gbl_args->queue[group][i % QUEUES_PER_GROUP];
751 ODPH_ERR(
"Error: odp_queue_enq() failed\n");
760 init_val = CRC_INIT_VAL;
761 for (i = 0; i < gbl_args->appl.lookup_tbl_size; i++) {
762 uint32_t *val0 = &gbl_args->lookup_tbl[i].val0;
763 uint32_t *val1 = &gbl_args->lookup_tbl[i].val1;
765 gbl_args->lookup_tbl[i].idx = i;
774 odph_thread_common_param_init(&thr_common);
775 thr_common.instance = instance;
776 thr_common.cpumask = &cpumask;
778 for (i = 0; i < num_workers; i++) {
779 gbl_args->thread[i].idx = i;
780 stats[i] = &gbl_args->thread[i].stats;
782 odph_thread_param_init(&thr_param[i]);
783 thr_param[i].start = run_thread;
784 thr_param[i].arg = &gbl_args->thread[i];
788 memset(thread_tbl, 0,
sizeof(thread_tbl));
789 odph_thread_create(thread_tbl, &thr_common, thr_param, num_workers);
791 ret = print_stats(num_workers, stats, gbl_args->appl.time,
792 gbl_args->appl.accuracy);
795 odph_thread_join(thread_tbl, num_workers);
797 for (i = 0; i < num_groups; i++) {
798 for (j = 0; j < QUEUES_PER_GROUP; j++) {
800 ODPH_ERR(
"Error: queue destroy\n");
809 ODPH_ERR(
"Error: pool destroy\n");
814 ODPH_ERR(
"Error: shm free\n");
819 ODPH_ERR(
"Error: shm free\n");
824 ODPH_ERR(
"Error: term local\n");
829 ODPH_ERR(
"Error: term global\n");
void odp_atomic_init_u32(odp_atomic_u32_t *atom, uint32_t val)
Initialize atomic uint32 variable.
uint32_t odp_atomic_load_u32(odp_atomic_u32_t *atom)
Load value of atomic uint32 variable.
void odp_atomic_store_u32(odp_atomic_u32_t *atom, uint32_t val)
Store value to atomic uint32 variable.
void odp_barrier_init(odp_barrier_t *barr, int count)
Initialize barrier with thread count.
void odp_mb_full(void)
Full memory barrier.
void odp_barrier_wait(odp_barrier_t *barr)
Synchronize thread execution on barrier.
#define ODP_ALIGNED_CACHE
Defines type/struct/variable to be cache line size aligned.
#define odp_unlikely(x)
Branch unlikely taken.
#define ODP_UNUSED
Intentionally unused variables of functions.
uint64_t odp_cpu_cycles(void)
Current CPU cycle count.
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_...
void odp_event_free(odp_event_t event)
Free event.
odp_event_type_t odp_event_type(odp_event_t event)
Event type of an event.
#define ODP_EVENT_INVALID
Invalid event.
uint32_t odp_hash_crc32c(const void *data, uint32_t data_len, uint32_t init_val)
Calculate CRC-32C.
void odp_init_param_init(odp_init_t *param)
Initialize the odp_init_t to default values for all fields.
#define ODP_STATIC_ASSERT(cond, msg)
Compile time assertion macro.
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_event_t odp_packet_to_event(odp_packet_t pkt)
Convert packet handle to event.
uint32_t odp_packet_l4_offset(odp_packet_t pkt)
Layer 4 start offset.
void * odp_packet_data(odp_packet_t pkt)
Packet data pointer.
void * odp_packet_user_area(odp_packet_t pkt)
User area address.
uint32_t odp_packet_len(odp_packet_t pkt)
Packet data length.
odp_packet_t odp_packet_alloc(odp_pool_t pool, uint32_t len)
Allocate a packet from a packet pool.
odp_packet_t odp_packet_from_event(odp_event_t ev)
Get packet handle from event.
int odp_packet_parse(odp_packet_t pkt, uint32_t offset, const odp_packet_parse_param_t *param)
Parse packet.
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.
void * odp_packet_l4_ptr(odp_packet_t pkt, uint32_t *len)
Layer 4 start pointer.
#define ODP_PACKET_INVALID
Invalid packet.
void * odp_packet_offset(odp_packet_t pkt, uint32_t offset, uint32_t *len, odp_packet_seg_t *seg)
Packet offset pointer.
@ ODP_PROTO_ETH
Ethernet (including VLAN)
@ ODP_PROTO_LAYER_ALL
All layers.
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.
#define ODP_POOL_INVALID
Invalid pool.
@ ODP_POOL_PACKET
Packet pool.
void odp_queue_param_init(odp_queue_param_t *param)
Initialize queue params.
#define ODP_QUEUE_INVALID
Invalid queue.
int odp_queue_enq(odp_queue_t queue, odp_event_t ev)
Enqueue an event to 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.
@ ODP_QUEUE_TYPE_SCHED
Scheduled 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.
void odp_schedule_config_init(odp_schedule_config_t *config)
Initialize schedule configuration options.
#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.
uint64_t odp_schedule_wait_time(uint64_t ns)
Schedule wait time.
odp_event_t odp_schedule(odp_queue_t *from, uint64_t wait)
Schedule an event.
#define ODP_SCHED_GROUP_ALL
Group of all threads.
int odp_shm_free(odp_shm_t shm)
Free a contiguous block of shared memory.
#define ODP_SHM_INVALID
Invalid shared memory block.
void * odp_shm_addr(odp_shm_t shm)
Shared memory block address.
odp_shm_t odp_shm_reserve(const char *name, uint64_t size, uint64_t align, uint32_t flags)
Reserve a contiguous block of shared memory.
uint32_t odp_una_u32_t
Unaligned uint32_t type.
void odp_sys_info_print(void)
Print system info.
@ ODP_THREAD_WORKER
Worker thread.
@ ODP_THREAD_CONTROL
Control thread.
odp_time_t odp_time_local(void)
Current local time.
#define ODP_TIME_MSEC_IN_NS
A millisecond in nanoseconds.
uint64_t odp_time_diff_ns(odp_time_t t2, odp_time_t t1)
Time difference in nanoseconds.
Global initialization parameters.
odp_mem_model_t mem_model
Application memory model.
odp_feature_t not_used
Unused features.
odp_proto_chksums_t chksums
Flags to control payload data checksums checks up to the selected parse layer.
odp_proto_layer_t last_layer
Continue parsing until this layer.
odp_proto_t proto
Protocol header at parse starting point.
struct odp_pool_capability_t::@122 pkt
Packet pool capabilities
uint32_t max_num
Maximum number of buffers of any size.
uint32_t max_uarea_size
Maximum user area size in bytes.
uint32_t max_seg_len
Maximum packet segment data length in bytes.
uint32_t max_len
Maximum packet data length in bytes.
uint32_t uarea_size
Minimum user area size in bytes.
uint32_t num
Number of buffers in the pool.
uint32_t max_len
Maximum packet length that will be allocated from the pool.
uint32_t max_num
Maximum number of packets.
odp_pool_type_t type
Pool type.
uint32_t len
Minimum length of 'num' packets.
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.
odp_schedule_param_t sched
Scheduler parameters.
odp_queue_type_t type
Queue type.
uint32_t num_queues
Maximum number of scheduled queues to be supported.
uint32_t queue_size
Maximum number of events required to be stored simultaneously in scheduled queue.
odp_schedule_group_t group
Thread group.
odp_schedule_prio_t prio
Priority level.
odp_schedule_sync_t sync
Synchronization method.
uint32_t tm
Traffic Manager APIs, e.g., odp_tm_xxx()
uint32_t crypto
Crypto APIs, e.g., odp_crypto_xxx()
uint32_t ipsec
IPsec APIs, e.g., odp_ipsec_xxx()
uint32_t timer
Timer APIs, e.g., odp_timer_xxx(), odp_timeout_xxx()
uint32_t cls
Classifier APIs, e.g., odp_cls_xxx(), odp_cos_xxx()
struct odp_feature_t::@148 feat
Individual feature bits.
uint32_t compress
Compression APIs, e.g., odp_comp_xxx()
uint32_t all_chksum
All checksum bits.