API Reference Manual 1.51.0
Loading...
Searching...
No Matches
odp_bench_packet.c
1/* SPDX-License-Identifier: BSD-3-Clause
2 * Copyright (c) 2017-2018 Linaro Limited
3 * Copyright (c) 2022-2026 Nokia
4 */
5
14#include <stdlib.h>
15#include <getopt.h>
16#include <unistd.h>
17#include <errno.h>
18#include <inttypes.h>
19#include <signal.h>
20
21#include <test_packet_ipv4.h>
22#include <test_packet_ipv6.h>
23
24#include <odp_api.h>
25#include <odp/helper/odph_api.h>
26
27#include <bench_common.h>
28#include <export_results.h>
29
31#define PKT_POOL_UAREA_SIZE 8
32
34#define TEST_MIN_PKT_SIZE 64
35
37#define TEST_MAX_PKT_SIZE 2048
38
40#define TEST_REPEAT_COUNT 1000
41
43#define TEST_ROUNDS 2u
44
46#define TEST_MAX_BURST 64
47
49#define TEST_ALIGN_OFFSET 16
50
52#define TEST_ALIGN_LEN 32
53
55#define TEST_ALIGN 32
56
58#define TEST_L2_OFFSET 0
59#define TEST_L3_OFFSET (TEST_MIN_PKT_SIZE / 4)
60#define TEST_L4_OFFSET (TEST_MIN_PKT_SIZE / 2)
61
63#define TEST_DEF_BURST 8
64
66#define TEST_MAX_BENCH 200
67
68#define TEST_MAX_SIZES 7
69
71#define NO_PATH(file_name) (strrchr((file_name), '/') ? \
72 strrchr((file_name), '/') + 1 : (file_name))
73
74#define BENCH_INFO(run_fn, init_fn, term_fn, alt_name) \
75 {.name = #run_fn, .run = run_fn, .init = init_fn, .term = term_fn, .desc = alt_name}
76
77ODP_STATIC_ASSERT((TEST_ALIGN_OFFSET + TEST_ALIGN_LEN) <= TEST_MIN_PKT_SIZE,
78 "Invalid_alignment");
79
81const uint32_t test_packet_len[] = {TEST_MIN_PKT_SIZE, 128, 256, 512,
82 1024, 1518, TEST_MAX_PKT_SIZE};
83
84ODP_STATIC_ASSERT(ODPH_ARRAY_SIZE(test_packet_len) <= TEST_MAX_SIZES,
85 "Result array is too small to hold all the results");
86
90typedef struct {
91 int bench_idx;
92 int burst_size;
93 int cache_size;
94 int time;
95 uint32_t rounds;
96} appl_args_t;
97
101typedef struct {
103 appl_args_t appl;
105 bench_suite_t suite;
107 odp_pool_t pool;
109 odp_pool_t pool_buf;
111 odp_pool_t pool_tmo;
113 odp_pool_t pool_evv;
114 struct {
116 uint32_t len;
118 uint32_t headroom;
120 uint32_t tailroom;
122 uint32_t seg_len;
123 } pkt;
125 odp_packet_t pkt_tbl[TEST_REPEAT_COUNT * TEST_MAX_BURST];
127 odp_packet_t pkt2_tbl[TEST_REPEAT_COUNT];
129 odp_event_t event_tbl[TEST_REPEAT_COUNT * TEST_MAX_BURST];
131 void *ptr_tbl[TEST_REPEAT_COUNT];
133 odp_packet_seg_t seg_tbl[TEST_REPEAT_COUNT];
135 uint32_t output_tbl[TEST_REPEAT_COUNT];
137 odp_pool_t pool_tbl[TEST_REPEAT_COUNT];
139 odp_pktio_t pktio_tbl[TEST_REPEAT_COUNT];
141 odp_time_t ts_tbl[TEST_REPEAT_COUNT];
143 uint8_t data_tbl[TEST_REPEAT_COUNT][TEST_MAX_PKT_SIZE];
145 test_common_options_t common_options;
147 double result[TEST_MAX_SIZES][TEST_MAX_BENCH];
148} args_t;
149
151static args_t *gbl_args;
152
153static void sig_handler(int signo ODP_UNUSED)
154{
155 if (gbl_args == NULL)
156 return;
157 odp_atomic_store_u32(&gbl_args->suite.exit_worker, 1);
158}
159
160static int bench_packet_export(void *data)
161{
162 args_t *gbl_args = data;
163 int ret = 0;
164
165 if (test_common_write("%s", "function name,64B,128B,256B,512B,1024B,1518B,2048B\n")) {
166 ret = -1;
167 goto exit;
168 }
169
170 for (int i = 0; i < gbl_args->suite.num_bench; i++) {
171 if (test_common_write("odp_%s,%f,%f,%f,%f,%f,%f,%f\n",
172 gbl_args->suite.bench[i].desc != NULL ?
173 gbl_args->suite.bench[i].desc : gbl_args->suite.bench[i].name,
174 gbl_args->result[0][i], gbl_args->result[1][i],
175 gbl_args->result[2][i], gbl_args->result[3][i],
176 gbl_args->result[4][i], gbl_args->result[5][i],
177 gbl_args->result[6][i])) {
178 ret = -1;
179 goto exit;
180 }
181 }
182
183exit:
184 test_common_write_term();
185
186 return ret;
187}
188
192static int run_benchmarks(void *arg)
193{
194 int i;
195 args_t *args = arg;
196 bench_suite_t *suite = &args->suite;
197 int num_sizes = ODPH_ARRAY_SIZE(test_packet_len);
198
199 for (i = 0; i < num_sizes; i++) {
200 printf("Packet length: %6d bytes", test_packet_len[i]);
201
202 gbl_args->pkt.len = test_packet_len[i];
203
204 suite->result = args->result[i];
205
206 bench_run(suite);
207 }
208
209 printf("\n%-35s", "Benchmark / packet_size [B]");
210 for (i = 0; i < num_sizes; i++)
211 printf("%8.1d ", test_packet_len[i]);
212
213 printf("\n---------------------------------");
214 for (i = 0; i < num_sizes; i++)
215 printf("----------");
216
217 for (i = 0; i < suite->num_bench; i++) {
218 printf("\n[%02d] odp_%-26s", i + 1, suite->bench[i].desc != NULL ?
219 suite->bench[i].desc : suite->bench[i].name);
220
221 for (int j = 0; j < num_sizes; j++)
222 printf("%8.1f ", args->result[j][i]);
223 }
224 printf("\n\n");
225
226 if (args->common_options.is_export) {
227 if (bench_packet_export(args)) {
228 ODPH_ERR("Error: Export failed\n");
229 return -1;
230 }
231 }
232
233 return 0;
234}
235
236static void allocate_test_packets(uint32_t len, odp_packet_t pkt[], int num)
237{
238 int pkts = 0;
239
240 while (pkts < num) {
241 int ret;
242
243 ret = odp_packet_alloc_multi(gbl_args->pool, len, &pkt[pkts],
244 num - pkts);
245 if (ret < 0)
246 ODPH_ABORT("Allocating test packets failed\n");
247
248 pkts += ret;
249 }
250}
251
252static void alloc_packets_half(void)
253{
254 allocate_test_packets(gbl_args->pkt.len / 2, gbl_args->pkt_tbl,
255 TEST_REPEAT_COUNT);
256}
257
258static void alloc_packets_multi(void)
259{
260 allocate_test_packets(gbl_args->pkt.len, gbl_args->pkt_tbl,
261 TEST_REPEAT_COUNT * gbl_args->appl.burst_size);
262}
263
264static void alloc_concat_packets(void)
265{
266 allocate_test_packets(gbl_args->pkt.len / 2, gbl_args->pkt_tbl,
267 TEST_REPEAT_COUNT);
268 allocate_test_packets(gbl_args->pkt.len / 2, gbl_args->pkt2_tbl,
269 TEST_REPEAT_COUNT);
270}
271
272static void alloc_ref_packets(void)
273{
274 int i;
275 odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
276 odp_packet_t *ref_tbl = gbl_args->pkt2_tbl;
277
278 allocate_test_packets(gbl_args->pkt.len, pkt_tbl, TEST_REPEAT_COUNT);
279
280 for (i = 0; i < TEST_REPEAT_COUNT; i++) {
281 ref_tbl[i] = odp_packet_ref(pkt_tbl[i], TEST_MIN_PKT_SIZE / 2);
282 if (ref_tbl[i] == ODP_PACKET_INVALID)
283 ODPH_ABORT("Allocating packet reference failed\n");
284 }
285}
286
287static void alloc_packets_twice(void)
288{
289 allocate_test_packets(gbl_args->pkt.len, gbl_args->pkt_tbl,
290 TEST_REPEAT_COUNT);
291 allocate_test_packets(gbl_args->pkt.len, gbl_args->pkt2_tbl,
292 TEST_REPEAT_COUNT);
293}
294
295typedef struct test_packet_t {
296 const uint8_t *data;
297 int len;
298} test_packet_t;
299
300test_packet_t test_packets[] = {
301 {test_packet_arp, sizeof(test_packet_arp)},
302 {test_packet_ipv4_icmp, sizeof(test_packet_ipv4_icmp)},
303 {test_packet_ipv6_icmp, sizeof(test_packet_ipv6_icmp)},
304 {test_packet_ipv4_tcp, sizeof(test_packet_ipv4_tcp)},
305 {test_packet_ipv6_tcp, sizeof(test_packet_ipv6_tcp)},
306 {test_packet_ipv4_udp, sizeof(test_packet_ipv4_udp)},
307 {test_packet_ipv6_udp, sizeof(test_packet_ipv6_udp)},
308 {test_packet_ipv4_sctp, sizeof(test_packet_ipv4_sctp)},
309 {test_packet_ipv6_sctp, sizeof(test_packet_ipv6_sctp)},
310 {test_packet_vlan_ipv4_udp, sizeof(test_packet_vlan_ipv4_udp)},
311 {test_packet_mcast_eth_ipv4_udp, sizeof(test_packet_mcast_eth_ipv4_udp)},
312 {test_packet_mcast_eth_ipv6_udp, sizeof(test_packet_mcast_eth_ipv6_udp)},
313 {test_packet_ipv4_udp_last_frag, sizeof(test_packet_ipv4_udp_last_frag)},
314};
315
316static uint32_t rnd(void)
317{
318 static uint64_t s = 1;
319 uint64_t prime = 0x7fffffff;
320
321 s = (0x12345678 * s) % prime;
322 return s;
323}
324
325static void create_packets_misc(void)
326{
327 int num_types = ODPH_ARRAY_SIZE(test_packets);
328
329 for (int i = 0; i < TEST_REPEAT_COUNT; i++) {
330 test_packet_t *tp = &test_packets[rnd() % num_types];
331 odp_packet_t *pkt = &gbl_args->pkt_tbl[i];
332
333 *pkt = odp_packet_alloc(gbl_args->pool, tp->len);
334 if (*pkt == ODP_PACKET_INVALID)
335 ODPH_ABORT("Allocating test packets failed\n");
336 if (odp_packet_copy_from_mem(*pkt, 0, tp->len, tp->data))
337 ODPH_ABORT("Copying test packet failed\n");
338 }
339}
340
341static void create_packets_misc_parsed(void)
342{
345 .last_layer = ODP_PROTO_LAYER_ALL,
346 .chksums.all_chksum = 0
347 };
348
349 create_packets_misc();
350 for (int i = 0; i < TEST_REPEAT_COUNT; i++) {
351 if (odp_packet_parse(gbl_args->pkt_tbl[i], 0, &param))
352 ODPH_ABORT("Packet parsing failed\n");
353 }
354}
355
356static void alloc_parse_packets(const void *pkt_data, uint32_t len)
357{
358 int i;
359
360 allocate_test_packets(len, gbl_args->pkt_tbl, TEST_REPEAT_COUNT);
361
362 for (i = 0; i < TEST_REPEAT_COUNT; i++) {
363 if (odp_packet_copy_from_mem(gbl_args->pkt_tbl[i], 0, len,
364 pkt_data))
365 ODPH_ABORT("Copying test packet failed\n");
366 }
367}
368
369static void alloc_parse_packets_ipv4_tcp(void)
370{
371 alloc_parse_packets(test_packet_ipv4_tcp, sizeof(test_packet_ipv4_tcp));
372}
373
374static void alloc_parse_packets_ipv4_udp(void)
375{
376 alloc_parse_packets(test_packet_ipv4_udp, sizeof(test_packet_ipv4_udp));
377}
378
379static void alloc_parse_packets_ipv6_tcp(void)
380{
381 alloc_parse_packets(test_packet_ipv6_tcp, sizeof(test_packet_ipv6_tcp));
382}
383
384static void alloc_parse_packets_ipv6_udp(void)
385{
386 alloc_parse_packets(test_packet_ipv6_udp, sizeof(test_packet_ipv6_udp));
387}
388
389static void alloc_parse_packets_multi(const void *pkt_data, uint32_t len)
390{
391 int i;
392
393 allocate_test_packets(len, gbl_args->pkt_tbl,
394 TEST_REPEAT_COUNT * gbl_args->appl.burst_size);
395
396 for (i = 0; i < TEST_REPEAT_COUNT * gbl_args->appl.burst_size; i++) {
397 if (odp_packet_copy_from_mem(gbl_args->pkt_tbl[i], 0, len,
398 pkt_data))
399 ODPH_ABORT("Copying test packet failed\n");
400 }
401}
402
403static void alloc_parse_packets_multi_ipv4_tcp(void)
404{
405 alloc_parse_packets_multi(test_packet_ipv4_tcp,
406 sizeof(test_packet_ipv4_tcp));
407}
408
409static void alloc_parse_packets_multi_ipv4_udp(void)
410{
411 alloc_parse_packets_multi(test_packet_ipv4_udp,
412 sizeof(test_packet_ipv4_udp));
413}
414
415static void alloc_parse_packets_multi_ipv6_tcp(void)
416{
417 alloc_parse_packets_multi(test_packet_ipv6_tcp,
418 sizeof(test_packet_ipv6_tcp));
419}
420
421static void alloc_parse_packets_multi_ipv6_udp(void)
422{
423 alloc_parse_packets_multi(test_packet_ipv6_udp,
424 sizeof(test_packet_ipv6_udp));
425}
426
427static void create_packets(void)
428{
429 int i;
430 uint32_t headroom, tailroom, seg_len;
431 uint32_t min_headroom = 0;
432 uint32_t min_tailroom = 0;
433 uint32_t min_seg_len = 0;
434 odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
435 odp_packet_seg_t *seg_tbl = gbl_args->seg_tbl;
436
437 allocate_test_packets(gbl_args->pkt.len, gbl_args->pkt_tbl,
438 TEST_REPEAT_COUNT);
439
440 for (i = 0; i < TEST_REPEAT_COUNT; i++) {
441 headroom = odp_packet_headroom(pkt_tbl[i]);
442 tailroom = odp_packet_tailroom(pkt_tbl[i]);
443 seg_len = odp_packet_seg_len(pkt_tbl[i]);
444
445 seg_tbl[i] = odp_packet_first_seg(pkt_tbl[i]);
446
447 if (i == 0) {
448 min_headroom = headroom;
449 min_tailroom = tailroom;
450 min_seg_len = seg_len;
451 } else {
452 if (headroom < min_headroom)
453 min_headroom = headroom;
454 if (tailroom < min_tailroom)
455 min_tailroom = tailroom;
456 if (seg_len < min_seg_len)
457 min_seg_len = seg_len;
458 }
459
460 if (odp_packet_l2_offset_set(pkt_tbl[i], TEST_L2_OFFSET) ||
461 odp_packet_l3_offset_set(pkt_tbl[i], TEST_L3_OFFSET) ||
462 odp_packet_l4_offset_set(pkt_tbl[i], TEST_L4_OFFSET))
463 ODPH_ABORT("Setting test packet offsets failed\n");
464
465 odp_packet_flow_hash_set(pkt_tbl[i], i);
466 odp_packet_ts_set(pkt_tbl[i], odp_time_local());
467 }
468 gbl_args->pkt.headroom = min_headroom;
469 gbl_args->pkt.tailroom = min_tailroom;
470 gbl_args->pkt.seg_len = min_seg_len;
471}
472
473static int num_misc_event_types = 4;
474
475static void create_events_misc(void)
476{
477 odp_packet_t pkt;
478 odp_buffer_t buf;
479 odp_timeout_t tmo;
481 odp_event_t events[num_misc_event_types];
482 int i;
483
484 pkt = odp_packet_alloc(gbl_args->pool, gbl_args->pkt.len);
485 if (pkt == ODP_PACKET_INVALID)
486 ODPH_ABORT("Packet alloc failed\n");
487
488 buf = odp_buffer_alloc(gbl_args->pool_buf);
489 if (buf == ODP_BUFFER_INVALID)
490 ODPH_ABORT("Buffer alloc failed\n");
491
492 tmo = odp_timeout_alloc(gbl_args->pool_tmo);
493 if (tmo == ODP_TIMEOUT_INVALID)
494 ODPH_ABORT("Timeout alloc failed\n");
495
496 events[0] = odp_packet_to_event(pkt);
497 events[1] = odp_buffer_to_event(buf);
498 events[2] = odp_timeout_to_event(tmo);
499
500 if (gbl_args->pool_evv != ODP_POOL_INVALID) {
501 evv = odp_event_vector_alloc(gbl_args->pool_evv);
502 if (evv == ODP_EVENT_VECTOR_INVALID)
503 ODPH_ABORT("Event vector alloc failed\n");
504 events[3] = odp_event_vector_to_event(evv);
505 } else {
506 num_misc_event_types = 3;
507 }
508
509 for (i = 0; i < num_misc_event_types; i++)
510 gbl_args->event_tbl[i] = events[i];
511 for (; i < TEST_REPEAT_COUNT; i++)
512 gbl_args->event_tbl[i] = events[rnd() % num_misc_event_types];
513}
514
515static void free_events_misc(void)
516{
517 for (int i = 0; i < num_misc_event_types; i++)
518 odp_event_free(gbl_args->event_tbl[i]);
519}
520
521static void create_events(void)
522{
523 int i;
524 odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
525
526 create_packets();
527
528 for (i = 0; i < TEST_REPEAT_COUNT; i++)
529 gbl_args->event_tbl[i] = odp_packet_to_event(pkt_tbl[i]);
530}
531
532static void create_events_multi(void)
533{
534 int i;
535 odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
536
537 allocate_test_packets(gbl_args->pkt.len, gbl_args->pkt_tbl,
538 TEST_REPEAT_COUNT * gbl_args->appl.burst_size);
539
540 for (i = 0; i < TEST_REPEAT_COUNT * gbl_args->appl.burst_size; i++)
541 gbl_args->event_tbl[i] = odp_packet_to_event(pkt_tbl[i]);
542}
543
544static void free_packets(void)
545{
546 odp_packet_free_multi(gbl_args->pkt_tbl, TEST_REPEAT_COUNT);
547}
548
549static void free_packets_multi(void)
550{
551 odp_packet_free_multi(gbl_args->pkt_tbl,
552 TEST_REPEAT_COUNT * gbl_args->appl.burst_size);
553}
554
555static void free_packets_twice(void)
556{
557 odp_packet_free_multi(gbl_args->pkt_tbl, TEST_REPEAT_COUNT);
558 odp_packet_free_multi(gbl_args->pkt2_tbl, TEST_REPEAT_COUNT);
559}
560
561static int packet_alloc(void)
562{
563 int i;
564
565 for (i = 0; i < TEST_REPEAT_COUNT; i++) {
566 odp_packet_t pkt;
567
568 pkt = odp_packet_alloc(gbl_args->pool, gbl_args->pkt.len);
569
570 gbl_args->pkt_tbl[i] = pkt;
571 }
572
573 return i;
574}
575
576static int packet_alloc_multi(void)
577{
578 int i;
579 int pkts = 0;
580
581 for (i = 0; i < TEST_REPEAT_COUNT; i++)
582 pkts += odp_packet_alloc_multi(gbl_args->pool,
583 gbl_args->pkt.len,
584 &gbl_args->pkt_tbl[pkts],
585 gbl_args->appl.burst_size);
586 return pkts;
587}
588
589static int packet_free(void)
590{
591 int i;
592
593 for (i = 0; i < TEST_REPEAT_COUNT; i++)
594 odp_packet_free(gbl_args->pkt_tbl[i]);
595
596 return i;
597}
598
599static int event_free(void)
600{
601 int i;
602
603 for (i = 0; i < TEST_REPEAT_COUNT; i++)
604 odp_event_free(gbl_args->event_tbl[i]);
605
606 return i;
607}
608
609static int packet_free_multi(void)
610{
611 int i;
612
613 for (i = 0; i < TEST_REPEAT_COUNT; i++) {
614 int pkt_idx = i * gbl_args->appl.burst_size;
615
616 odp_packet_free_multi(&gbl_args->pkt_tbl[pkt_idx],
617 gbl_args->appl.burst_size);
618 }
619 return i;
620}
621
622static int event_free_multi(void)
623{
624 int i;
625
626 for (i = 0; i < TEST_REPEAT_COUNT; i++) {
627 int pkt_idx = i * gbl_args->appl.burst_size;
628
629 odp_event_free_multi(&gbl_args->event_tbl[pkt_idx],
630 gbl_args->appl.burst_size);
631 }
632 return i;
633}
634
635static int packet_free_sp(void)
636{
637 int i;
638
639 for (i = 0; i < TEST_REPEAT_COUNT; i++) {
640 int pkt_idx = i * gbl_args->appl.burst_size;
641
642 odp_packet_free_sp(&gbl_args->pkt_tbl[pkt_idx],
643 gbl_args->appl.burst_size);
644 }
645 return i;
646}
647
648static int event_free_sp(void)
649{
650 int i;
651
652 for (i = 0; i < TEST_REPEAT_COUNT; i++) {
653 int pkt_idx = i * gbl_args->appl.burst_size;
654
655 odp_event_free_sp(&gbl_args->event_tbl[pkt_idx],
656 gbl_args->appl.burst_size);
657 }
658 return i;
659}
660
661static int packet_alloc_free(void)
662{
663 int i;
664
665 for (i = 0; i < TEST_REPEAT_COUNT; i++) {
666 odp_packet_t pkt;
667
668 pkt = odp_packet_alloc(gbl_args->pool, gbl_args->pkt.len);
669
670 odp_packet_free(pkt);
671 }
672 return i;
673}
674
675static int packet_alloc_free_multi(void)
676{
677 int i;
678 int pkts;
679
680 for (i = 0; i < TEST_REPEAT_COUNT; i++) {
681 pkts = odp_packet_alloc_multi(gbl_args->pool, gbl_args->pkt.len,
682 gbl_args->pkt_tbl,
683 gbl_args->appl.burst_size);
684
685 if (pkts < 0)
686 ODPH_ABORT("Packet alloc failed\n");
687
688 odp_packet_free_multi(gbl_args->pkt_tbl, pkts);
689 }
690 return i;
691}
692
693static int packet_reset(void)
694{
695 int i;
696 int ret = 0;
697
698 for (i = 0; i < TEST_REPEAT_COUNT; i++)
699 ret += odp_packet_reset(gbl_args->pkt_tbl[i],
700 gbl_args->pkt.len);
701 return !ret;
702}
703
704static int packet_reset_meta(void)
705{
706 int i;
707
708 for (i = 0; i < TEST_REPEAT_COUNT; i++)
709 odp_packet_reset_meta(gbl_args->pkt_tbl[i]);
710
711 return i;
712}
713
714static int packet_reset_max_len(void)
715{
716 int i;
717 uint32_t ret = 0;
718
719 for (i = 0; i < TEST_REPEAT_COUNT; i++)
720 ret += odp_packet_reset_max_len(gbl_args->pkt_tbl[i]);
721
722 return ret;
723}
724
725static int packet_from_event(void)
726{
727 int i;
728 odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
729
730 for (i = 0; i < TEST_REPEAT_COUNT; i++)
731 pkt_tbl[i] = odp_packet_from_event(gbl_args->event_tbl[i]);
732
733 return i;
734}
735
736static int packet_from_event_multi(void)
737{
738 int i;
739
740 for (i = 0; i < TEST_REPEAT_COUNT; i++) {
741 int idx = i * gbl_args->appl.burst_size;
742
743 odp_packet_from_event_multi(&gbl_args->pkt_tbl[idx],
744 &gbl_args->event_tbl[idx],
745 gbl_args->appl.burst_size);
746 }
747 return i;
748}
749
750static int packet_to_event(void)
751{
752 int i;
753 odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
754
755 for (i = 0; i < TEST_REPEAT_COUNT; i++)
756 gbl_args->event_tbl[i] = odp_packet_to_event(pkt_tbl[i]);
757
758 return i;
759}
760
761static int packet_to_event_multi(void)
762{
763 int i;
764
765 for (i = 0; i < TEST_REPEAT_COUNT; i++) {
766 int idx = i * gbl_args->appl.burst_size;
767
768 odp_packet_to_event_multi(&gbl_args->pkt_tbl[idx],
769 &gbl_args->event_tbl[idx],
770 gbl_args->appl.burst_size);
771 }
772 return i;
773}
774
775static int packet_head(void)
776{
777 int i;
778
779 for (i = 0; i < TEST_REPEAT_COUNT; i++)
780 gbl_args->ptr_tbl[i] = odp_packet_head(gbl_args->pkt_tbl[i]);
781
782 return i;
783}
784
785static int packet_buf_len(void)
786{
787 int i;
788 uint32_t ret = 0;
789
790 for (i = 0; i < TEST_REPEAT_COUNT; i++)
791 ret += odp_packet_buf_len(gbl_args->pkt_tbl[i]);
792
793 return ret;
794}
795
796static int packet_data(void)
797{
798 int i;
799
800 for (i = 0; i < TEST_REPEAT_COUNT; i++)
801 gbl_args->ptr_tbl[i] = odp_packet_data(gbl_args->pkt_tbl[i]);
802
803 return i;
804}
805
806static int packet_data_seg_len(void)
807{
808 odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
809 uint32_t *output_tbl = gbl_args->output_tbl;
810 int i;
811
812 for (i = 0; i < TEST_REPEAT_COUNT; i++)
813 gbl_args->ptr_tbl[i] = odp_packet_data_seg_len(pkt_tbl[i],
814 &output_tbl[i]);
815 return i;
816}
817
818static int packet_seg_len(void)
819{
820 int i;
821 uint32_t ret = 0;
822
823 for (i = 0; i < TEST_REPEAT_COUNT; i++)
824 ret += odp_packet_seg_len(gbl_args->pkt_tbl[i]);
825
826 return ret;
827}
828
829static int packet_len(void)
830{
831 int i;
832 uint32_t ret = 0;
833
834 for (i = 0; i < TEST_REPEAT_COUNT; i++)
835 ret += odp_packet_len(gbl_args->pkt_tbl[i]);
836
837 return ret;
838}
839
840static int packet_headroom(void)
841{
842 int i;
843 uint32_t ret = 0;
844
845 for (i = 0; i < TEST_REPEAT_COUNT; i++)
846 ret += odp_packet_headroom(gbl_args->pkt_tbl[i]);
847
848 return i + ret;
849}
850
851static int packet_tailroom(void)
852{
853 int i;
854 uint32_t ret = 0;
855
856 for (i = 0; i < TEST_REPEAT_COUNT; i++)
857 ret += odp_packet_tailroom(gbl_args->pkt_tbl[i]);
858
859 return i + ret;
860}
861
862static int packet_tail(void)
863{
864 int i;
865
866 for (i = 0; i < TEST_REPEAT_COUNT; i++)
867 gbl_args->ptr_tbl[i] = odp_packet_tail(gbl_args->pkt_tbl[i]);
868
869 return i;
870}
871
872static int packet_offset(void)
873{
874 int i;
875 uint32_t offset = gbl_args->pkt.len / 2;
876
877 for (i = 0; i < TEST_REPEAT_COUNT; i++)
878 gbl_args->ptr_tbl[i] = odp_packet_offset(gbl_args->pkt_tbl[i],
879 offset, NULL, NULL);
880 return i;
881}
882
883static int packet_prefetch(void)
884{
885 int i;
886
887 for (i = 0; i < TEST_REPEAT_COUNT; i++)
888 odp_packet_prefetch(gbl_args->pkt_tbl[i], 0, gbl_args->pkt.len);
889
890 return i;
891}
892
893static int packet_push_head(void)
894{
895 int i;
896 odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
897 uint32_t hroom = gbl_args->pkt.headroom;
898
899 for (i = 0; i < TEST_REPEAT_COUNT; i++)
900 gbl_args->ptr_tbl[i] = odp_packet_push_head(pkt_tbl[i], hroom);
901
902 return i;
903}
904
905static int packet_pull_head(void)
906{
907 int i;
908 uint32_t len = gbl_args->pkt.seg_len - 1;
909 odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
910
911 for (i = 0; i < TEST_REPEAT_COUNT; i++)
912 gbl_args->ptr_tbl[i] = odp_packet_pull_head(pkt_tbl[i], len);
913
914 return i;
915}
916
917static int packet_push_tail(void)
918{
919 int i;
920 odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
921 uint32_t troom = gbl_args->pkt.tailroom;
922
923 for (i = 0; i < TEST_REPEAT_COUNT; i++)
924 gbl_args->ptr_tbl[i] = odp_packet_push_tail(pkt_tbl[i], troom);
925
926 return i;
927}
928
929static int packet_pull_tail(void)
930{
931 int i;
932 uint32_t len = gbl_args->pkt.seg_len - 1;
933 odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
934
935 for (i = 0; i < TEST_REPEAT_COUNT; i++)
936 gbl_args->ptr_tbl[i] = odp_packet_pull_tail(pkt_tbl[i], len);
937
938 return i;
939}
940
941static int packet_extend_head(void)
942{
943 int i;
944 int ret = 0;
945 uint32_t len = gbl_args->pkt.len / 2;
946 odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
947 void **ptr_tbl = gbl_args->ptr_tbl;
948 uint32_t *data_tbl = gbl_args->output_tbl;
949
950 for (i = 0; i < TEST_REPEAT_COUNT; i++)
951 ret += odp_packet_extend_head(&pkt_tbl[i], len, &ptr_tbl[i],
952 &data_tbl[i]);
953 return ret >= 0;
954}
955
956static int packet_trunc_head(void)
957{
958 int i;
959 int ret = 0;
960 uint32_t len = gbl_args->pkt.len / 2;
961 odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
962 void **ptr_tbl = gbl_args->ptr_tbl;
963 uint32_t *data_tbl = gbl_args->output_tbl;
964
965 for (i = 0; i < TEST_REPEAT_COUNT; i++)
966 ret += odp_packet_trunc_head(&pkt_tbl[i], len, &ptr_tbl[i],
967 &data_tbl[i]);
968 return ret >= 0;
969}
970
971static int packet_extend_tail(void)
972{
973 int i;
974 int ret = 0;
975 uint32_t len = gbl_args->pkt.len / 2;
976 odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
977 void **ptr_tbl = gbl_args->ptr_tbl;
978 uint32_t *data_tbl = gbl_args->output_tbl;
979
980 for (i = 0; i < TEST_REPEAT_COUNT; i++)
981 ret += odp_packet_extend_tail(&pkt_tbl[i], len, &ptr_tbl[i],
982 &data_tbl[i]);
983 return ret >= 0;
984}
985
986static int packet_trunc_tail(void)
987{
988 int i;
989 int ret = 0;
990 uint32_t len = gbl_args->pkt.len / 2;
991 odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
992 void **ptr_tbl = gbl_args->ptr_tbl;
993 uint32_t *data_tbl = gbl_args->output_tbl;
994
995 for (i = 0; i < TEST_REPEAT_COUNT; i++)
996 ret += odp_packet_trunc_tail(&pkt_tbl[i], len, &ptr_tbl[i],
997 &data_tbl[i]);
998 return ret >= 0;
999}
1000
1001static int packet_add_data(void)
1002{
1003 int i;
1004 int ret = 0;
1005 odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1006 uint32_t len = gbl_args->pkt.len / 2;
1007
1008 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1009 ret += odp_packet_add_data(&pkt_tbl[i], 0, len);
1010
1011 return ret >= 0;
1012}
1013
1014static int packet_rem_data(void)
1015{
1016 int i;
1017 int ret = 0;
1018 odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1019 uint32_t len = gbl_args->pkt.len / 2;
1020
1021 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1022 ret += odp_packet_rem_data(&pkt_tbl[i], 0, len);
1023
1024 return ret >= 0;
1025}
1026
1027static int packet_align(void)
1028{
1029 int i;
1030 int ret = 0;
1031 odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1032
1033 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1034 ret += odp_packet_align(&pkt_tbl[i], TEST_ALIGN_OFFSET,
1035 TEST_ALIGN_LEN, TEST_ALIGN);
1036 return ret >= 0;
1037}
1038
1039static int packet_is_segmented(void)
1040{
1041 int i;
1042 uint32_t ret = 0;
1043
1044 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1045 ret += odp_packet_is_segmented(gbl_args->pkt_tbl[i]);
1046
1047 return (ret == 0) ? 1 : ret;
1048}
1049
1050static int packet_num_segs(void)
1051{
1052 int i;
1053 uint32_t ret = 0;
1054
1055 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1056 ret += odp_packet_num_segs(gbl_args->pkt_tbl[i]);
1057
1058 return ret;
1059}
1060
1061static int packet_first_seg(void)
1062{
1063 int i;
1064 odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1065
1066 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1067 gbl_args->seg_tbl[i] = odp_packet_first_seg(pkt_tbl[i]);
1068
1069 return i;
1070}
1071
1072static int packet_last_seg(void)
1073{
1074 int i;
1075 odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1076
1077 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1078 gbl_args->seg_tbl[i] = odp_packet_last_seg(pkt_tbl[i]);
1079
1080 return i;
1081}
1082
1083static int packet_next_seg(void)
1084{
1085 int i;
1086 odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1087 odp_packet_seg_t *seg_tbl = gbl_args->seg_tbl;
1088
1089 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1090 gbl_args->seg_tbl[i] = odp_packet_next_seg(pkt_tbl[i],
1091 seg_tbl[i]);
1092 return i;
1093}
1094
1095static int packet_seg_data(void)
1096{
1097 int i;
1098 odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1099 odp_packet_seg_t *seg_tbl = gbl_args->seg_tbl;
1100
1101 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1102 gbl_args->ptr_tbl[i] = odp_packet_seg_data(pkt_tbl[i],
1103 seg_tbl[i]);
1104 return i;
1105}
1106
1107static int packet_seg_data_len(void)
1108{
1109 int i;
1110 uint32_t ret = 0;
1111 odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1112 odp_packet_seg_t *seg_tbl = gbl_args->seg_tbl;
1113
1114 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1115 ret += odp_packet_seg_data_len(pkt_tbl[i], seg_tbl[i]);
1116
1117 return ret;
1118}
1119
1120static int packet_concat(void)
1121{
1122 int i;
1123 int ret = 0;
1124 odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1125 odp_packet_t *frag_tbl = gbl_args->pkt2_tbl;
1126
1127 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1128 ret += odp_packet_concat(&pkt_tbl[i], frag_tbl[i]);
1129
1130 return ret >= 0;
1131}
1132
1133static int packet_split(void)
1134{
1135 int i;
1136 int ret = 0;
1137 uint32_t head_len;
1138 odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1139 odp_packet_t *frag_tbl = gbl_args->pkt2_tbl;
1140
1141 head_len = odp_packet_len(pkt_tbl[0]) / 2;
1142
1143 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1144 ret += odp_packet_split(&pkt_tbl[i], head_len, &frag_tbl[i]);
1145
1146 return ret >= 0;
1147}
1148
1149static int packet_copy(void)
1150{
1151 int i;
1152 odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1153 odp_packet_t *cpy_tbl = gbl_args->pkt2_tbl;
1154
1155 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1156 cpy_tbl[i] = odp_packet_copy(pkt_tbl[i], gbl_args->pool);
1157
1158 return i;
1159}
1160
1161static int packet_copy_part(void)
1162{
1163 int i;
1164 uint32_t len = gbl_args->pkt.len / 2;
1165 odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1166 odp_packet_t *cpy_tbl = gbl_args->pkt2_tbl;
1167
1168 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1169 cpy_tbl[i] = odp_packet_copy_part(pkt_tbl[i], 0, len,
1170 gbl_args->pool);
1171 return i;
1172}
1173
1174static int packet_copy_to_mem(void)
1175{
1176 int i;
1177 uint32_t ret = 0;
1178 uint32_t len = gbl_args->pkt.len;
1179 odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1180
1181 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1182 ret += odp_packet_copy_to_mem(pkt_tbl[i], 0, len,
1183 gbl_args->data_tbl[i]);
1184 return !ret;
1185}
1186
1187static int packet_copy_from_mem(void)
1188{
1189 int i;
1190 uint32_t ret = 0;
1191 uint32_t len = gbl_args->pkt.len;
1192 odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1193
1194 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1195 ret += odp_packet_copy_from_mem(pkt_tbl[i], 0, len,
1196 gbl_args->data_tbl[i]);
1197 return !ret;
1198}
1199
1200static int packet_copy_from_pkt(void)
1201{
1202 int i;
1203 uint32_t ret = 0;
1204 uint32_t len = gbl_args->pkt.len;
1205 odp_packet_t *dst_tbl = gbl_args->pkt_tbl;
1206 odp_packet_t *src_tbl = gbl_args->pkt2_tbl;
1207
1208 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1209 ret += odp_packet_copy_from_pkt(dst_tbl[i], 0, src_tbl[i], 0,
1210 len);
1211 return !ret;
1212}
1213
1214static int packet_copy_data(void)
1215{
1216 int i;
1217 uint32_t ret = 0;
1218 uint32_t len = gbl_args->pkt.len / 2;
1219 odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1220
1221 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1222 ret += odp_packet_copy_data(pkt_tbl[i], 0, len, len);
1223
1224 return !ret;
1225}
1226
1227static int packet_move_data(void)
1228{
1229 int i;
1230 uint32_t ret = 0;
1231 uint32_t len = gbl_args->pkt.len / 2;
1232 uint32_t offset = len / 2;
1233 odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1234
1235 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1236 ret += odp_packet_move_data(pkt_tbl[i], offset, len, len);
1237
1238 return !ret;
1239}
1240
1241static int packet_pool(void)
1242{
1243 int i;
1244
1245 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1246 gbl_args->pool_tbl[i] = odp_packet_pool(gbl_args->pkt_tbl[i]);
1247
1248 return i;
1249}
1250
1251static int event_pool(void)
1252{
1253 int i;
1254
1255 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1256 gbl_args->pool_tbl[i] = odp_event_pool(gbl_args->event_tbl[i]);
1257
1258 return i;
1259}
1260
1261static int packet_input(void)
1262{
1263 int i;
1264
1265 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1266 gbl_args->pktio_tbl[i] = odp_packet_input(gbl_args->pkt_tbl[i]);
1267
1268 return i;
1269}
1270
1271static int packet_input_index(void)
1272{
1273 int i;
1274 int ret = 0;
1275
1276 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1277 ret += odp_packet_input_index(gbl_args->pkt_tbl[i]);
1278
1279 return (ret == 0) ? 1 : ret;
1280}
1281
1282static int packet_user_ptr(void)
1283{
1284 int i;
1285 odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1286
1287 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1288 gbl_args->ptr_tbl[i] = odp_packet_user_ptr(pkt_tbl[i]);
1289
1290 return i;
1291}
1292
1293static int packet_user_ptr_set(void)
1294{
1295 int i;
1296
1297 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1298 odp_packet_user_ptr_set(gbl_args->pkt_tbl[i],
1299 gbl_args->ptr_tbl[i]);
1300
1301 return i;
1302}
1303
1304static int packet_user_area(void)
1305{
1306 int i;
1307 odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1308
1309 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1310 gbl_args->ptr_tbl[i] = odp_packet_user_area(pkt_tbl[i]);
1311
1312 return i;
1313}
1314
1315static int event_user_area(void)
1316{
1317 int i;
1318 odp_event_t *event_tbl = gbl_args->event_tbl;
1319
1320 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1321 gbl_args->ptr_tbl[i] = odp_event_user_area(event_tbl[i]);
1322
1323 return i;
1324}
1325
1326static int packet_user_area_size(void)
1327{
1328 int i;
1329 uint32_t ret = 0;
1330
1331 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1332 ret += odp_packet_user_area_size(gbl_args->pkt_tbl[i]);
1333
1334 return ret;
1335}
1336
1337static int packet_user_flag(void)
1338{
1339 int i;
1340 uint32_t ret = 0;
1341
1342 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1343 ret += !odp_packet_user_flag(gbl_args->pkt_tbl[i]);
1344
1345 return ret;
1346}
1347
1348static int event_user_area_and_flag(void)
1349{
1350 odp_event_t *event_tbl = gbl_args->event_tbl;
1351 void **ptr_tbl = gbl_args->ptr_tbl;
1352 int ret = 0;
1353 int flag;
1354
1355 for (int i = 0; i < TEST_REPEAT_COUNT; i++) {
1356 ptr_tbl[i] = odp_event_user_area_and_flag(event_tbl[i], &flag);
1357 ret += !flag;
1358 }
1359
1360 return ret;
1361}
1362
1363static int packet_user_flag_set(void)
1364{
1365 int i;
1366
1367 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1368 odp_packet_user_flag_set(gbl_args->pkt_tbl[i], 1);
1369
1370 return i;
1371}
1372
1373static int event_user_flag_set(void)
1374{
1375 int i;
1376
1377 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1378 odp_event_user_flag_set(gbl_args->event_tbl[i], 1);
1379
1380 return i;
1381}
1382
1383#define DEF_FLAG_TEST_FUN(name, func) \
1384static int name(void) \
1385{ \
1386 uint32_t ret = 0; \
1387 \
1388 for (int i = 0; i < TEST_REPEAT_COUNT; i++) \
1389 ret += func(gbl_args->pkt_tbl[i]); \
1390 \
1391 return ret <= TEST_REPEAT_COUNT; \
1392}
1393
1394DEF_FLAG_TEST_FUN(packet_has_error, odp_packet_has_error)
1395DEF_FLAG_TEST_FUN(packet_has_l2_error, odp_packet_has_l2_error)
1396DEF_FLAG_TEST_FUN(packet_has_l3_error, odp_packet_has_l3_error)
1397DEF_FLAG_TEST_FUN(packet_has_l4_error, odp_packet_has_l4_error)
1398DEF_FLAG_TEST_FUN(packet_has_l2, odp_packet_has_l2)
1399DEF_FLAG_TEST_FUN(packet_has_l3, odp_packet_has_l3)
1400DEF_FLAG_TEST_FUN(packet_has_l4, odp_packet_has_l4)
1401DEF_FLAG_TEST_FUN(packet_has_eth, odp_packet_has_eth)
1402DEF_FLAG_TEST_FUN(packet_has_eth_bcast, odp_packet_has_eth_bcast)
1403DEF_FLAG_TEST_FUN(packet_has_eth_mcast, odp_packet_has_eth_mcast)
1404DEF_FLAG_TEST_FUN(packet_has_jumbo, odp_packet_has_jumbo)
1405DEF_FLAG_TEST_FUN(packet_has_vlan, odp_packet_has_vlan)
1406DEF_FLAG_TEST_FUN(packet_has_vlan_qinq, odp_packet_has_vlan_qinq)
1407DEF_FLAG_TEST_FUN(packet_has_arp, odp_packet_has_arp)
1408DEF_FLAG_TEST_FUN(packet_has_ipv4, odp_packet_has_ipv4)
1409DEF_FLAG_TEST_FUN(packet_has_ipv6, odp_packet_has_ipv6)
1410DEF_FLAG_TEST_FUN(packet_has_ip_bcast, odp_packet_has_ip_bcast)
1411DEF_FLAG_TEST_FUN(packet_has_ip_mcast, odp_packet_has_ip_mcast)
1412DEF_FLAG_TEST_FUN(packet_has_ipfrag, odp_packet_has_ipfrag)
1413DEF_FLAG_TEST_FUN(packet_has_ipopt, odp_packet_has_ipopt)
1414DEF_FLAG_TEST_FUN(packet_has_ipsec, odp_packet_has_ipsec)
1415DEF_FLAG_TEST_FUN(packet_has_udp, odp_packet_has_udp)
1416DEF_FLAG_TEST_FUN(packet_has_tcp, odp_packet_has_tcp)
1417DEF_FLAG_TEST_FUN(packet_has_sctp, odp_packet_has_sctp)
1418DEF_FLAG_TEST_FUN(packet_has_icmp, odp_packet_has_icmp)
1419DEF_FLAG_TEST_FUN(packet_has_flow_hash, odp_packet_has_flow_hash)
1420DEF_FLAG_TEST_FUN(packet_has_ts, odp_packet_has_ts)
1421
1422static int packet_l2_type(void)
1423{
1424 uint32_t ret = 0;
1425
1426 for (int i = 0; i < TEST_REPEAT_COUNT; i++)
1427 ret += odp_packet_l2_type(gbl_args->pkt_tbl[i]);
1428
1429 return ret;
1430}
1431
1432static int packet_l2_ptr(void)
1433{
1434 int i;
1435
1436 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1437 gbl_args->ptr_tbl[i] = odp_packet_l2_ptr(gbl_args->pkt_tbl[i],
1438 NULL);
1439 return i;
1440}
1441
1442static int packet_l2_offset(void)
1443{
1444 int i;
1445 int ret = 0;
1446
1447 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1448 ret += odp_packet_l2_offset(gbl_args->pkt_tbl[i]);
1449
1450 return ret >= 0;
1451}
1452
1453static int packet_l2_offset_set(void)
1454{
1455 int i;
1456 uint32_t ret = 0;
1457 uint32_t offset = gbl_args->pkt.len / 2;
1458
1459 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1460 ret += odp_packet_l2_offset_set(gbl_args->pkt_tbl[i], offset);
1461
1462 return !ret;
1463}
1464
1465static int packet_l3_type(void)
1466{
1467 uint32_t ret = 0;
1468
1469 for (int i = 0; i < TEST_REPEAT_COUNT; i++)
1470 ret += odp_packet_l3_type(gbl_args->pkt_tbl[i]);
1471
1472 return ret;
1473}
1474
1475static int packet_l3_ptr(void)
1476{
1477 int i;
1478
1479 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1480 gbl_args->ptr_tbl[i] = odp_packet_l3_ptr(gbl_args->pkt_tbl[i],
1481 NULL);
1482 return i;
1483}
1484
1485static int packet_l3_offset(void)
1486{
1487 int i;
1488 int ret = 0;
1489
1490 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1491 ret += odp_packet_l3_offset(gbl_args->pkt_tbl[i]);
1492
1493 return ret >= 0;
1494}
1495
1496static int packet_l3_offset_set(void)
1497{
1498 int i;
1499 uint32_t ret = 0;
1500 uint32_t offset = gbl_args->pkt.len / 2;
1501
1502 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1503 ret += odp_packet_l3_offset_set(gbl_args->pkt_tbl[i], offset);
1504
1505 return !ret;
1506}
1507
1508static int packet_l4_type(void)
1509{
1510 uint32_t ret = 0;
1511
1512 for (int i = 0; i < TEST_REPEAT_COUNT; i++)
1513 ret += odp_packet_l4_type(gbl_args->pkt_tbl[i]);
1514
1515 return ret;
1516}
1517
1518static int packet_l4_ptr(void)
1519{
1520 int i;
1521
1522 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1523 gbl_args->ptr_tbl[i] = odp_packet_l4_ptr(gbl_args->pkt_tbl[i],
1524 NULL);
1525 return i;
1526}
1527
1528static int packet_l4_offset(void)
1529{
1530 int i;
1531 int ret = 0;
1532
1533 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1534 ret += odp_packet_l4_offset(gbl_args->pkt_tbl[i]);
1535
1536 return ret >= 0;
1537}
1538
1539static int packet_l4_offset_set(void)
1540{
1541 int i;
1542 uint32_t ret = 0;
1543 uint32_t offset = gbl_args->pkt.len / 2;
1544
1545 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1546 ret += odp_packet_l4_offset_set(gbl_args->pkt_tbl[i], offset);
1547
1548 return !ret;
1549}
1550
1551static int packet_flow_hash(void)
1552{
1553 int i;
1554 uint32_t ret = 0;
1555
1556 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1557 ret += odp_packet_flow_hash(gbl_args->pkt_tbl[i]);
1558
1559 return ret;
1560}
1561
1562static int packet_flow_hash_set(void)
1563{
1564 int i;
1565
1566 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1567 odp_packet_flow_hash_set(gbl_args->pkt_tbl[i], i);
1568
1569 return i;
1570}
1571
1572static int packet_ts(void)
1573{
1574 int i;
1575
1576 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1577 gbl_args->ts_tbl[i] = odp_packet_ts(gbl_args->pkt_tbl[i]);
1578
1579 return i;
1580}
1581
1582static int packet_ts_set(void)
1583{
1584 int i;
1586
1587 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1588 odp_packet_ts_set(gbl_args->pkt_tbl[i], ts);
1589
1590 return i;
1591}
1592
1593static int packet_ref_static(void)
1594{
1595 int i;
1596 odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1597 odp_packet_t *ref_tbl = gbl_args->pkt2_tbl;
1598
1599 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1600 ref_tbl[i] = odp_packet_ref_static(pkt_tbl[i]);
1601
1602 return i;
1603}
1604
1605static int packet_ref(void)
1606{
1607 int i;
1608 uint32_t offset = TEST_MIN_PKT_SIZE / 2;
1609 odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1610 odp_packet_t *ref_tbl = gbl_args->pkt2_tbl;
1611
1612 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1613 ref_tbl[i] = odp_packet_ref(pkt_tbl[i], offset);
1614
1615 return i;
1616}
1617
1618static int packet_ref_pkt(void)
1619{
1620 int i;
1621 uint32_t offset = TEST_MIN_PKT_SIZE / 2;
1622 odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1623 odp_packet_t *hdr_tbl = gbl_args->pkt2_tbl;
1624
1625 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1626 hdr_tbl[i] = odp_packet_ref_pkt(pkt_tbl[i], offset, hdr_tbl[i]);
1627
1628 return i;
1629}
1630
1631static int packet_has_ref(void)
1632{
1633 int i;
1634 uint32_t ret = 0;
1635 odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1636
1637 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1638 ret += odp_packet_has_ref(pkt_tbl[i]);
1639
1640 return i + ret;
1641}
1642
1643static int packet_is_referencing(void)
1644{
1645 int i;
1646 uint32_t ret = 0;
1647 odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1648
1649 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1650 ret += odp_packet_is_referencing(pkt_tbl[i]);
1651
1652 return i + ret;
1653}
1654
1655static int packet_subtype(void)
1656{
1657 int i;
1658 odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1659
1660 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1661 gbl_args->output_tbl[i] = odp_packet_subtype(pkt_tbl[i]);
1662
1663 return i;
1664}
1665
1666static int event_subtype(void)
1667{
1668 int i;
1669 odp_event_t *event_tbl = gbl_args->event_tbl;
1670
1671 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1672 gbl_args->output_tbl[i] = odp_event_subtype(event_tbl[i]);
1673
1674 return i;
1675}
1676
1677static int do_packet_parse(int chksum)
1678{
1680 odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1681 int ret = 0;
1682 int i;
1683
1684 memset(&param, 0, sizeof(odp_packet_parse_param_t));
1685 param.proto = ODP_PROTO_ETH;
1687 param.chksums.chksum.ipv4 = !!chksum;
1688 param.chksums.chksum.tcp = !!chksum;
1689 param.chksums.chksum.udp = !!chksum;
1690
1691 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1692 ret += odp_packet_parse(pkt_tbl[i], 0, &param);
1693
1694 return !ret;
1695}
1696
1697static int packet_parse(void)
1698{
1699 return do_packet_parse(1);
1700}
1701
1702static int packet_parse_no_chksum(void)
1703{
1704 return do_packet_parse(0);
1705}
1706
1707static int packet_parse_multi(void)
1708{
1709 int burst_size = gbl_args->appl.burst_size;
1710 int ret = 0;
1711 int i;
1713 odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1714 uint32_t offsets[burst_size];
1715
1716 memset(&offsets, 0, sizeof(offsets));
1717
1718 memset(&param, 0, sizeof(odp_packet_parse_param_t));
1719 param.proto = ODP_PROTO_ETH;
1721 param.chksums.chksum.ipv4 = 1;
1722 param.chksums.chksum.tcp = 1;
1723 param.chksums.chksum.udp = 1;
1724
1725 for (i = 0; i < TEST_REPEAT_COUNT; i++) {
1726 int idx = i * burst_size;
1727
1728 ret += odp_packet_parse_multi(&pkt_tbl[idx], offsets,
1729 burst_size, &param);
1730 }
1731 return (ret == TEST_REPEAT_COUNT * burst_size);
1732}
1733
1737static void usage(char *progname)
1738{
1739 printf("\n"
1740 "OpenDataPlane Packet function microbenchmark.\n"
1741 "\n"
1742 "Usage: %s OPTIONS\n"
1743 " E.g. %s\n"
1744 "\n"
1745 "Optional OPTIONS:\n"
1746 " -b, --burst <num> Test packet burst size.\n"
1747 " -c, --cache_size <num> Pool cache size.\n"
1748 " -i, --index <idx> Benchmark index to run indefinitely.\n"
1749 " -r, --rounds <num> Run each test case 'num' times (default %u).\n"
1750 " -t, --time <opt> Time measurement. 0: measure CPU cycles (default), 1: measure time\n"
1751 " -h, --help Display help and exit.\n\n"
1752 "\n", NO_PATH(progname), NO_PATH(progname), TEST_ROUNDS);
1753}
1754
1762static void parse_args(int argc, char *argv[], appl_args_t *appl_args)
1763{
1764 int opt;
1765 static const struct option longopts[] = {
1766 {"burst", required_argument, NULL, 'b'},
1767 {"cache_size", required_argument, NULL, 'c'},
1768 {"index", required_argument, NULL, 'i'},
1769 {"rounds", required_argument, NULL, 'r'},
1770 {"time", required_argument, NULL, 't'},
1771 {"help", no_argument, NULL, 'h'},
1772 {NULL, 0, NULL, 0}
1773 };
1774
1775 static const char *shortopts = "c:b:i:r:t:h";
1776
1777 appl_args->bench_idx = 0; /* Run all benchmarks */
1778 appl_args->burst_size = TEST_DEF_BURST;
1779 appl_args->cache_size = -1;
1780 appl_args->rounds = TEST_ROUNDS;
1781 appl_args->time = 0;
1782
1783 while (1) {
1784 opt = getopt_long(argc, argv, shortopts, longopts, NULL);
1785
1786 if (opt == -1)
1787 break; /* No more options */
1788
1789 switch (opt) {
1790 case 'c':
1791 appl_args->cache_size = atoi(optarg);
1792 break;
1793 case 'b':
1794 appl_args->burst_size = atoi(optarg);
1795 break;
1796 case 'i':
1797 appl_args->bench_idx = atoi(optarg);
1798 break;
1799 case 'r':
1800 appl_args->rounds = atoi(optarg);
1801 break;
1802 case 't':
1803 appl_args->time = atoi(optarg);
1804 break;
1805 case 'h':
1806 usage(argv[0]);
1807 exit(EXIT_SUCCESS);
1808 break;
1809 default:
1810 usage(argv[0]);
1811 exit(EXIT_FAILURE);
1812 }
1813 }
1814
1815 if (appl_args->burst_size < 1 ||
1816 appl_args->burst_size > TEST_MAX_BURST) {
1817 printf("Invalid burst size (max %d)\n", TEST_MAX_BURST);
1818 exit(EXIT_FAILURE);
1819 }
1820
1821 if (appl_args->rounds < 1) {
1822 printf("Invalid number test rounds: %d\n", appl_args->rounds);
1823 exit(EXIT_FAILURE);
1824 }
1825
1826 optind = 1; /* Reset 'extern optind' from the getopt lib */
1827}
1828
1832static void print_info(char *progname, appl_args_t *appl_args ODP_UNUSED)
1833{
1835
1836 printf("Running ODP appl: \"%s\"\n"
1837 "-----------------\n", progname);
1838 fflush(NULL);
1839}
1840
1844bench_info_t test_suite[] = {
1845 BENCH_INFO(packet_alloc, NULL, free_packets, NULL),
1846 BENCH_INFO(packet_alloc_multi, NULL, free_packets_multi, NULL),
1847 BENCH_INFO(packet_free, create_packets, NULL, NULL),
1848 BENCH_INFO(event_free, create_events, NULL, NULL),
1849 BENCH_INFO(packet_free_multi, alloc_packets_multi, NULL, NULL),
1850 BENCH_INFO(event_free_multi, create_events_multi, NULL, NULL),
1851 BENCH_INFO(packet_free_sp, alloc_packets_multi, NULL, NULL),
1852 BENCH_INFO(event_free_sp, create_events_multi, NULL, NULL),
1853 BENCH_INFO(packet_alloc_free, NULL, NULL, NULL),
1854 BENCH_INFO(packet_alloc_free_multi, NULL, NULL, NULL),
1855 BENCH_INFO(packet_reset, create_packets, free_packets, NULL),
1856 BENCH_INFO(packet_reset_meta, create_packets, free_packets, NULL),
1857 BENCH_INFO(packet_reset_max_len, create_packets, free_packets, NULL),
1858 BENCH_INFO(packet_from_event, create_events, free_packets, NULL),
1859 BENCH_INFO(packet_from_event_multi, create_events_multi, free_packets_multi, NULL),
1860 BENCH_INFO(packet_to_event, create_packets, free_packets, NULL),
1861 BENCH_INFO(packet_to_event_multi, alloc_packets_multi, free_packets_multi, NULL),
1862 BENCH_INFO(packet_head, create_packets, free_packets, NULL),
1863 BENCH_INFO(packet_buf_len, create_packets, free_packets, NULL),
1864 BENCH_INFO(packet_data, create_packets, free_packets, NULL),
1865 BENCH_INFO(packet_data_seg_len, create_packets, free_packets, NULL),
1866 BENCH_INFO(packet_seg_len, create_packets, free_packets, NULL),
1867 BENCH_INFO(packet_len, create_packets, free_packets, NULL),
1868 BENCH_INFO(packet_headroom, create_packets, free_packets, NULL),
1869 BENCH_INFO(packet_tailroom, create_packets, free_packets, NULL),
1870 BENCH_INFO(packet_tail, create_packets, free_packets, NULL),
1871 BENCH_INFO(packet_offset, create_packets, free_packets, NULL),
1872 BENCH_INFO(packet_prefetch, create_packets, free_packets, NULL),
1873 BENCH_INFO(packet_push_head, create_packets, free_packets, NULL),
1874 BENCH_INFO(packet_pull_head, create_packets, free_packets, NULL),
1875 BENCH_INFO(packet_push_tail, create_packets, free_packets, NULL),
1876 BENCH_INFO(packet_pull_tail, create_packets, free_packets, NULL),
1877 BENCH_INFO(packet_extend_head, alloc_packets_half, free_packets, NULL),
1878 BENCH_INFO(packet_trunc_head, create_packets, free_packets, NULL),
1879 BENCH_INFO(packet_extend_tail, alloc_packets_half, free_packets, NULL),
1880 BENCH_INFO(packet_trunc_tail, create_packets, free_packets, NULL),
1881 BENCH_INFO(packet_add_data, alloc_packets_half, free_packets, NULL),
1882 BENCH_INFO(packet_rem_data, create_packets, free_packets, NULL),
1883 BENCH_INFO(packet_align, create_packets, free_packets, NULL),
1884 BENCH_INFO(packet_is_segmented, create_packets, free_packets, NULL),
1885 BENCH_INFO(packet_num_segs, create_packets, free_packets, NULL),
1886 BENCH_INFO(packet_first_seg, create_packets, free_packets, NULL),
1887 BENCH_INFO(packet_last_seg, create_packets, free_packets, NULL),
1888 BENCH_INFO(packet_next_seg, create_packets, free_packets, NULL),
1889 BENCH_INFO(packet_seg_data, create_packets, free_packets, NULL),
1890 BENCH_INFO(packet_seg_data_len, create_packets, free_packets, NULL),
1891 BENCH_INFO(packet_concat, alloc_concat_packets, free_packets, NULL),
1892 BENCH_INFO(packet_split, create_packets, free_packets_twice, NULL),
1893 BENCH_INFO(packet_copy, create_packets, free_packets_twice, NULL),
1894 BENCH_INFO(packet_copy_part, create_packets, free_packets_twice, NULL),
1895 BENCH_INFO(packet_copy_to_mem, create_packets, free_packets, NULL),
1896 BENCH_INFO(packet_copy_from_mem, create_packets, free_packets, NULL),
1897 BENCH_INFO(packet_copy_from_pkt, alloc_packets_twice, free_packets_twice, NULL),
1898 BENCH_INFO(packet_copy_data, create_packets, free_packets, NULL),
1899 BENCH_INFO(packet_move_data, create_packets, free_packets, NULL),
1900 BENCH_INFO(packet_pool, create_packets, free_packets, NULL),
1901 BENCH_INFO(event_pool, create_events, free_packets, NULL),
1902 BENCH_INFO(packet_input, create_packets, free_packets, NULL),
1903 BENCH_INFO(packet_input_index, create_packets, free_packets, NULL),
1904 BENCH_INFO(packet_user_ptr, create_packets, free_packets, NULL),
1905 BENCH_INFO(packet_user_ptr_set, create_packets, free_packets, NULL),
1906 BENCH_INFO(packet_user_area, create_packets, free_packets, NULL),
1907 BENCH_INFO(event_user_area, create_events, free_packets, NULL),
1908 BENCH_INFO(event_user_area, create_events_misc, free_events_misc,
1909 "event_user_area_misc"),
1910 BENCH_INFO(packet_user_area_size, create_packets, free_packets, NULL),
1911 BENCH_INFO(packet_user_flag, create_packets, free_packets, NULL),
1912 BENCH_INFO(event_user_area_and_flag, create_events, free_packets, NULL),
1913 BENCH_INFO(event_user_area_and_flag, create_events_misc, free_events_misc,
1914 "event_user_area_and_flag_misc"),
1915 BENCH_INFO(packet_user_flag_set, create_packets, free_packets, NULL),
1916 BENCH_INFO(event_user_flag_set, create_events, free_packets, NULL),
1917 BENCH_INFO(event_user_flag_set, create_events_misc, free_events_misc,
1918 "event_user_flag_set_misc"),
1919
1920#define BINFO(fun) BENCH_INFO(fun, create_packets_misc_parsed, free_packets, NULL)
1921 BINFO(packet_has_error),
1922 BINFO(packet_has_l2_error),
1923 BINFO(packet_has_l3_error),
1924 BINFO(packet_has_l4_error),
1925 BINFO(packet_has_l2),
1926 BINFO(packet_has_l3),
1927 BINFO(packet_has_l4),
1928 BINFO(packet_has_eth),
1929 BINFO(packet_has_eth_bcast),
1930 BINFO(packet_has_eth_mcast),
1931 BINFO(packet_has_jumbo),
1932 BINFO(packet_has_vlan),
1933 BINFO(packet_has_vlan_qinq),
1934 BINFO(packet_has_arp),
1935 BINFO(packet_has_ipv4),
1936 BINFO(packet_has_ipv6),
1937 BINFO(packet_has_ip_bcast),
1938 BINFO(packet_has_ip_mcast),
1939 BINFO(packet_has_ipfrag),
1940 BINFO(packet_has_ipopt),
1941 BINFO(packet_has_ipsec),
1942 BINFO(packet_has_udp),
1943 BINFO(packet_has_tcp),
1944 BINFO(packet_has_sctp),
1945 BINFO(packet_has_icmp),
1946 BINFO(packet_has_flow_hash),
1947 BINFO(packet_has_ts),
1948
1949 BENCH_INFO(packet_l2_type, create_packets_misc_parsed, free_packets, NULL),
1950 BENCH_INFO(packet_l2_ptr, create_packets, free_packets, NULL),
1951 BENCH_INFO(packet_l2_offset, create_packets, free_packets, NULL),
1952 BENCH_INFO(packet_l2_offset_set, create_packets, free_packets, NULL),
1953 BENCH_INFO(packet_l3_type, create_packets_misc_parsed, free_packets, NULL),
1954 BENCH_INFO(packet_l3_ptr, create_packets, free_packets, NULL),
1955 BENCH_INFO(packet_l3_offset, create_packets, free_packets, NULL),
1956 BENCH_INFO(packet_l3_offset_set, create_packets, free_packets, NULL),
1957 BENCH_INFO(packet_l4_type, create_packets_misc_parsed, free_packets, NULL),
1958 BENCH_INFO(packet_l4_ptr, create_packets, free_packets, NULL),
1959 BENCH_INFO(packet_l4_offset, create_packets, free_packets, NULL),
1960 BENCH_INFO(packet_l4_offset_set, create_packets, free_packets, NULL),
1961 BENCH_INFO(packet_flow_hash, create_packets, free_packets, NULL),
1962 BENCH_INFO(packet_flow_hash_set, create_packets, free_packets, NULL),
1963 BENCH_INFO(packet_ts, create_packets, free_packets, NULL),
1964 BENCH_INFO(packet_ts_set, create_packets, free_packets, NULL),
1965 BENCH_INFO(packet_ref_static, create_packets, free_packets_twice, NULL),
1966 BENCH_INFO(packet_ref, create_packets, free_packets_twice, NULL),
1967 BENCH_INFO(packet_ref_pkt, alloc_packets_twice, free_packets_twice, NULL),
1968 BENCH_INFO(packet_has_ref, alloc_ref_packets, free_packets_twice, NULL),
1969 BENCH_INFO(packet_is_referencing, alloc_ref_packets, free_packets_twice, NULL),
1970 BENCH_INFO(packet_subtype, create_packets, free_packets, NULL),
1971 BENCH_INFO(event_subtype, create_events, free_packets, NULL),
1972 BENCH_INFO(packet_parse, alloc_parse_packets_ipv4_tcp, free_packets,
1973 "packet_parse_ipv4/tcp"),
1974 BENCH_INFO(packet_parse, alloc_parse_packets_ipv4_udp, free_packets,
1975 "packet_parse_ipv4/udp"),
1976 BENCH_INFO(packet_parse, alloc_parse_packets_ipv6_tcp, free_packets,
1977 "packet_parse_ipv6/tcp"),
1978 BENCH_INFO(packet_parse, alloc_parse_packets_ipv6_udp, free_packets,
1979 "packet_parse_ipv6/udp"),
1980 BENCH_INFO(packet_parse, create_packets_misc, free_packets,
1981 "packet_parse_misc"),
1982 BENCH_INFO(packet_parse_no_chksum, create_packets_misc, free_packets,
1983 "packet_parse_misc_no_csum"),
1984 BENCH_INFO(packet_parse_multi, alloc_parse_packets_multi_ipv4_tcp, free_packets_multi,
1985 "packet_parse_multi_ipv4/tcp"),
1986 BENCH_INFO(packet_parse_multi, alloc_parse_packets_multi_ipv4_udp, free_packets_multi,
1987 "packet_parse_multi_ipv4/udp"),
1988 BENCH_INFO(packet_parse_multi, alloc_parse_packets_multi_ipv6_tcp, free_packets_multi,
1989 "packet_parse_multi_ipv6/tcp"),
1990 BENCH_INFO(packet_parse_multi, alloc_parse_packets_multi_ipv6_udp, free_packets_multi,
1991 "packet_parse_multi_ipv6/udp"),
1992};
1993
1994ODP_STATIC_ASSERT(ODPH_ARRAY_SIZE(test_suite) < TEST_MAX_BENCH,
1995 "Result array is too small to hold all the results");
1996
1997static odp_pool_t create_pool(const char *name, const odp_pool_param_t *param)
1998{
1999 odp_pool_t pool = odp_pool_create(name, param);
2000
2001 if (pool == ODP_POOL_INVALID) {
2002 ODPH_ERR("Error: %s pool creation failed.\n", name);
2003 exit(EXIT_FAILURE);
2004 }
2005 return pool;
2006}
2007
2008static odp_pool_t create_buffer_pool(const odp_pool_capability_t *capa)
2009{
2010 odp_pool_param_t param;
2011
2012 odp_pool_param_init(&param);
2013 param.type = ODP_POOL_BUFFER;
2014 param.buf.num = 1;
2015 param.buf.size = 1;
2016 param.buf.uarea_size = capa->buf.max_uarea_size > 0 ? 1 : 0;
2017 return create_pool("buf", &param);
2018}
2019
2020static odp_pool_t create_timeout_pool(const odp_pool_capability_t *capa)
2021{
2022 odp_pool_param_t param;
2023
2024 odp_pool_param_init(&param);
2025 param.type = ODP_POOL_TIMEOUT;
2026 param.tmo.num = 1;
2027 param.tmo.uarea_size = capa->tmo.max_uarea_size > 0 ? 1 : 0;
2028 return create_pool("tmo", &param);
2029}
2030
2031static odp_pool_t create_evv_pool(const odp_pool_capability_t *capa)
2032{
2033 odp_pool_param_t param;
2034
2035 if (capa->event_vector.max_pools == 0)
2036 return ODP_POOL_INVALID;
2037
2038 odp_pool_param_init(&param);
2040 param.event_vector.num = 1;
2042 param.event_vector.uarea_size = capa->event_vector.max_uarea_size > 0 ? 1 : 0;
2043 return create_pool("evv", &param);
2044}
2045
2049int main(int argc, char *argv[])
2050{
2051 odph_helper_options_t helper_options;
2052 test_common_options_t common_options;
2053 odph_thread_t worker_thread;
2054 odph_thread_common_param_t thr_common;
2055 odph_thread_param_t thr_param;
2056 int cpu;
2057 odp_shm_t shm;
2058 odp_cpumask_t cpumask;
2059 char cpumaskstr[ODP_CPUMASK_STR_SIZE];
2061 odp_pool_param_t params;
2062 odp_instance_t instance;
2063 odp_init_t init_param;
2064 uint32_t pkt_num, seg_len;
2065 uint8_t ret;
2066
2067 /* Let helper collect its own arguments (e.g. --odph_proc) */
2068 argc = odph_parse_options(argc, argv);
2069 if (odph_options(&helper_options)) {
2070 ODPH_ERR("Error: reading ODP helper options failed.\n");
2071 exit(EXIT_FAILURE);
2072 }
2073
2074 argc = test_common_parse_options(argc, argv);
2075 if (test_common_options(&common_options)) {
2076 ODPH_ERR("Error: reading test options failed\n");
2077 exit(EXIT_FAILURE);
2078 }
2079
2080 odp_init_param_init(&init_param);
2081 init_param.mem_model = helper_options.mem_model;
2082
2083 /* Init ODP before calling anything else */
2084 if (odp_init_global(&instance, &init_param, NULL)) {
2085 ODPH_ERR("Error: ODP global init failed.\n");
2086 exit(EXIT_FAILURE);
2087 }
2088
2089 /* Init this thread */
2090 if (odp_init_local(instance, ODP_THREAD_CONTROL)) {
2091 ODPH_ERR("Error: ODP local init failed.\n");
2092 exit(EXIT_FAILURE);
2093 }
2094
2095 /* Reserve memory for args from shared mem */
2096 shm = odp_shm_reserve("shm_args", sizeof(args_t),
2097 ODP_CACHE_LINE_SIZE, 0);
2098
2099 if (shm == ODP_SHM_INVALID) {
2100 ODPH_ERR("Error: shared mem reserve failed.\n");
2101 exit(EXIT_FAILURE);
2102 }
2103
2104 gbl_args = odp_shm_addr(shm);
2105
2106 if (gbl_args == NULL) {
2107 ODPH_ERR("Error: shared mem alloc failed.\n");
2108 exit(EXIT_FAILURE);
2109 }
2110
2111 memset(gbl_args, 0, sizeof(args_t));
2112
2113 gbl_args->common_options = common_options;
2114
2115 /* Parse and store the application arguments */
2116 parse_args(argc, argv, &gbl_args->appl);
2117
2118 bench_suite_init(&gbl_args->suite);
2119 gbl_args->suite.bench = test_suite;
2120 gbl_args->suite.num_bench = ODPH_ARRAY_SIZE(test_suite);
2121 gbl_args->suite.indef_idx = gbl_args->appl.bench_idx;
2122 gbl_args->suite.rounds = gbl_args->appl.rounds;
2123 gbl_args->suite.repeat_count = TEST_REPEAT_COUNT;
2124 gbl_args->suite.measure_time = !!gbl_args->appl.time;
2125
2126 /* Print both system and application information */
2127 print_info(NO_PATH(argv[0]), &gbl_args->appl);
2128
2129 /* Get default worker cpumask */
2130 if (odp_cpumask_default_worker(&cpumask, 1) != 1) {
2131 ODPH_ERR("Error: unable to allocate worker thread.\n");
2132 exit(EXIT_FAILURE);
2133 }
2134
2135 (void)odp_cpumask_to_str(&cpumask, cpumaskstr, sizeof(cpumaskstr));
2136
2137 /* Check pool capability */
2138 if (odp_pool_capability(&capa)) {
2139 ODPH_ERR("Error: unable to query pool capability.\n");
2140 exit(EXIT_FAILURE);
2141 }
2142
2143 /* At least 2 x TEST_REPEAT_COUNT packets are required for the tests and depending on the
2144 * implementation extra packets may be required for packet references. */
2145 pkt_num = (gbl_args->appl.burst_size > 4) ?
2146 gbl_args->appl.burst_size * TEST_REPEAT_COUNT :
2147 4 * TEST_REPEAT_COUNT;
2148
2149 if (capa.pkt.max_num && capa.pkt.max_num < pkt_num) {
2150 ODPH_ERR("Error: packet pool size not supported.\n");
2151 printf("MAX: %" PRIu32 "\n", capa.pkt.max_num);
2152 exit(EXIT_FAILURE);
2153 } else if (capa.pkt.max_len &&
2154 capa.pkt.max_len < 2 * TEST_MAX_PKT_SIZE) {
2155 ODPH_ERR("Error: packet length not supported.\n");
2156 exit(EXIT_FAILURE);
2157 } else if (capa.pkt.max_uarea_size &&
2158 capa.pkt.max_uarea_size < PKT_POOL_UAREA_SIZE) {
2159 ODPH_ERR("Error: user area size not supported.\n");
2160 exit(EXIT_FAILURE);
2161 } else if (gbl_args->appl.cache_size > (int)capa.pkt.max_cache_size) {
2162 ODPH_ERR("Error: cache size not supported (max %" PRIu32 ")\n",
2163 capa.pkt.max_cache_size);
2164 exit(EXIT_FAILURE);
2165 }
2166
2167 seg_len = TEST_MAX_PKT_SIZE;
2168 if (capa.pkt.max_seg_len && capa.pkt.max_seg_len < seg_len) {
2169 seg_len = capa.pkt.max_seg_len;
2170 printf("\nWarn: allocated packets may be segmented (min seg_len=%" PRIu32 ")\n\n",
2171 seg_len);
2172 }
2173
2174 /* Create packet pool */
2175 odp_pool_param_init(&params);
2176 params.pkt.seg_len = seg_len;
2177 /* Using packet length as twice the TEST_MAX_PKT_SIZE as some
2178 * test cases (packet_ref_pkt) might allocate a bigger
2179 * packet than TEST_MAX_PKT_SIZE.
2180 */
2181 params.pkt.len = 2 * TEST_MAX_PKT_SIZE;
2182 params.pkt.num = pkt_num;
2183 params.pkt.uarea_size = PKT_POOL_UAREA_SIZE;
2184 if (gbl_args->appl.cache_size >= 0)
2185 params.pkt.cache_size = gbl_args->appl.cache_size;
2186 params.type = ODP_POOL_PACKET;
2187
2188 gbl_args->pool = odp_pool_create("packet pool", &params);
2189 if (gbl_args->pool == ODP_POOL_INVALID) {
2190 ODPH_ERR("Error: packet pool create failed.\n");
2191 exit(EXIT_FAILURE);
2192 }
2193 gbl_args->pool_buf = create_buffer_pool(&capa);
2194 gbl_args->pool_tmo = create_timeout_pool(&capa);
2195 gbl_args->pool_evv = create_evv_pool(&capa);
2196
2197 printf("CPU: %i\n", odp_cpumask_first(&cpumask));
2198 printf("CPU mask: %s\n", cpumaskstr);
2199 printf("Burst size: %d\n", gbl_args->appl.burst_size);
2200 printf("Bench repeat: %d\n", TEST_REPEAT_COUNT);
2201 printf("Measurement unit: %s\n", gbl_args->appl.time ? "nsec" : "CPU cycles");
2202 printf("Test rounds: %u\n", gbl_args->appl.rounds);
2203 if (gbl_args->appl.cache_size < 0)
2204 printf("Pool cache size: default\n");
2205 else
2206 printf("Pool cache size: %d\n", gbl_args->appl.cache_size);
2207
2208 odp_pool_print(gbl_args->pool);
2209
2210 memset(&worker_thread, 0, sizeof(odph_thread_t));
2211
2212 signal(SIGINT, sig_handler);
2213
2214 /* Create worker threads */
2215 cpu = odp_cpumask_first(&cpumask);
2216
2217 odp_cpumask_t thd_mask;
2218
2219 odp_cpumask_zero(&thd_mask);
2220 odp_cpumask_set(&thd_mask, cpu);
2221
2222 odph_thread_common_param_init(&thr_common);
2223 thr_common.instance = instance;
2224 thr_common.cpumask = &thd_mask;
2225 thr_common.share_param = 1;
2226
2227 odph_thread_param_init(&thr_param);
2228 thr_param.start = run_benchmarks;
2229 thr_param.arg = gbl_args;
2230 thr_param.thr_type = ODP_THREAD_WORKER;
2231
2232 odph_thread_create(&worker_thread, &thr_common, &thr_param, 1);
2233
2234 odph_thread_join(&worker_thread, 1);
2235
2236 ret = gbl_args->suite.retval;
2237
2238 if (odp_pool_destroy(gbl_args->pool) ||
2239 odp_pool_destroy(gbl_args->pool_buf) ||
2240 odp_pool_destroy(gbl_args->pool_tmo) ||
2241 (gbl_args->pool_evv != ODP_POOL_INVALID && odp_pool_destroy(gbl_args->pool_evv))) {
2242 ODPH_ERR("Error: pool destroy\n");
2243 exit(EXIT_FAILURE);
2244 }
2245 gbl_args = NULL;
2246 odp_mb_full();
2247
2248 if (odp_shm_free(shm)) {
2249 ODPH_ERR("Error: shm free\n");
2250 exit(EXIT_FAILURE);
2251 }
2252
2253 if (odp_term_local()) {
2254 ODPH_ERR("Error: term local\n");
2255 exit(EXIT_FAILURE);
2256 }
2257
2258 if (odp_term_global(instance)) {
2259 ODPH_ERR("Error: term global\n");
2260 exit(EXIT_FAILURE);
2261 }
2262
2263 return ret;
2264}
void odp_atomic_store_u32(odp_atomic_u32_t *atom, uint32_t val)
Store value to atomic uint32 variable.
void odp_mb_full(void)
Full memory barrier.
odp_event_t odp_buffer_to_event(odp_buffer_t buf)
Convert buffer handle to event.
odp_buffer_t odp_buffer_alloc(odp_pool_t pool)
Buffer alloc.
#define ODP_BUFFER_INVALID
Invalid buffer.
#define ODP_UNUSED
Intentionally unused variables of functions.
Definition spec/hints.h:54
void odp_cpumask_set(odp_cpumask_t *mask, int cpu)
Add CPU to mask.
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.
void odp_cpumask_zero(odp_cpumask_t *mask)
Clear entire CPU 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_event_t odp_event_vector_to_event(odp_event_vector_t evv)
Convert event vector handle to event.
odp_event_vector_t odp_event_vector_alloc(odp_pool_t pool)
Allocate event vector from event vector pool.
#define ODP_EVENT_VECTOR_INVALID
Invalid event vector.
void odp_event_free_sp(const odp_event_t event[], int num)
Free multiple events to the same pool.
void odp_event_free_multi(const odp_event_t event[], int num)
Free multiple events.
odp_event_subtype_t odp_event_subtype(odp_event_t event)
Event subtype of an event.
void odp_event_free(odp_event_t event)
Free event.
odp_pool_t odp_event_pool(odp_event_t event)
Event pool.
void * odp_event_user_area(odp_event_t event)
Event user area.
void odp_event_user_flag_set(odp_event_t event, int val)
Set event user flag.
void * odp_event_user_area_and_flag(odp_event_t event, int *flag)
Event user area and flag.
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.
int odp_packet_is_segmented(odp_packet_t pkt)
Tests if packet is segmented.
void odp_packet_from_event_multi(odp_packet_t pkt[], const odp_event_t ev[], int num)
Convert multiple packet events to packet handles.
odp_packet_t odp_packet_ref_pkt(odp_packet_t pkt, uint32_t offset, odp_packet_t hdr)
Create a packet with a header and shared data.
int odp_packet_has_l3(odp_packet_t pkt)
Check for layer 3 protocols.
void * odp_packet_head(odp_packet_t pkt)
Packet head address.
uint32_t odp_packet_flow_hash(odp_packet_t pkt)
Packet flow hash value.
int odp_packet_has_ip_mcast(odp_packet_t pkt)
Check for IP multicast address.
int odp_packet_has_ipfrag(odp_packet_t pkt)
Check for IP fragment.
odp_proto_l4_type_t odp_packet_l4_type(odp_packet_t pkt)
Layer 4 protocol type.
int odp_packet_trunc_tail(odp_packet_t *pkt, uint32_t len, void **tail_ptr, uint32_t *tailroom)
Truncate packet tail.
int odp_packet_has_ts(odp_packet_t pkt)
Check for packet timestamp.
int odp_packet_l3_offset_set(odp_packet_t pkt, uint32_t offset)
Set layer 3 start offset.
odp_event_subtype_t odp_packet_subtype(odp_packet_t packet)
Event subtype of a packet.
odp_packet_seg_t odp_packet_last_seg(odp_packet_t pkt)
Last segment in packet.
int odp_packet_input_index(odp_packet_t pkt)
Packet input interface index.
int odp_packet_has_ipopt(odp_packet_t pkt)
Check for IP options.
odp_event_t odp_packet_to_event(odp_packet_t pkt)
Convert packet handle to event.
void odp_packet_to_event_multi(const odp_packet_t pkt[], odp_event_t ev[], int num)
Convert multiple packet handles to events.
uint32_t odp_packet_seg_len(odp_packet_t pkt)
Packet data length following the data pointer.
int odp_packet_add_data(odp_packet_t *pkt, uint32_t offset, uint32_t len)
Add data into an offset.
int odp_packet_concat(odp_packet_t *dst, odp_packet_t src)
Concatenate two packets.
int odp_packet_parse_multi(const odp_packet_t pkt[], const uint32_t offset[], int num, const odp_packet_parse_param_t *param)
Parse multiple packets.
uint32_t odp_packet_headroom(odp_packet_t pkt)
Packet headroom length.
void odp_packet_prefetch(odp_packet_t pkt, uint32_t offset, uint32_t len)
Packet data prefetch.
void odp_packet_user_flag_set(odp_packet_t pkt, int val)
Set user flag.
int odp_packet_num_segs(odp_packet_t pkt)
Number of segments.
int odp_packet_has_icmp(odp_packet_t pkt)
Check for ICMP.
odp_packet_t odp_packet_copy(odp_packet_t pkt, odp_pool_t pool)
Full copy of a packet.
int odp_packet_has_ipv4(odp_packet_t pkt)
Check for IPv4.
int odp_packet_has_ip_bcast(odp_packet_t pkt)
Check for IP broadcast address.
uint32_t odp_packet_seg_data_len(odp_packet_t pkt, odp_packet_seg_t seg)
Segment data length.
uint32_t odp_packet_user_area_size(odp_packet_t pkt)
User area size.
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_offset(odp_packet_t pkt, uint32_t offset, uint32_t *len, odp_packet_seg_t *seg)
Packet offset pointer.
int odp_packet_copy_data(odp_packet_t pkt, uint32_t dst_offset, uint32_t src_offset, uint32_t len)
Copy data within packet.
int odp_packet_has_eth(odp_packet_t pkt)
Check for Ethernet header.
int odp_packet_l4_offset_set(odp_packet_t pkt, uint32_t offset)
Set layer 4 start offset.
void * odp_packet_data_seg_len(odp_packet_t pkt, uint32_t *seg_len)
Packet data pointer with segment length.
void * odp_packet_push_head(odp_packet_t pkt, uint32_t len)
Push out packet head.
int odp_packet_extend_head(odp_packet_t *pkt, uint32_t len, void **data_ptr, uint32_t *seg_len)
Extend packet head.
int odp_packet_has_vlan_qinq(odp_packet_t pkt)
Check for VLAN QinQ (stacked VLAN)
odp_packet_t odp_packet_ref(odp_packet_t pkt, uint32_t offset)
Create a packet that references packet data of another packet.
odp_proto_l2_type_t odp_packet_l2_type(odp_packet_t pkt)
Layer 2 protocol type.
int odp_packet_split(odp_packet_t *pkt, uint32_t len, odp_packet_t *tail)
Split packet into two packets.
int odp_packet_is_referencing(odp_packet_t pkt)
Test if a packet is a referencing packet.
int odp_packet_has_eth_bcast(odp_packet_t pkt)
Check for Ethernet broadcast address.
int odp_packet_move_data(odp_packet_t pkt, uint32_t dst_offset, uint32_t src_offset, uint32_t len)
Move data within packet.
int odp_packet_has_l4(odp_packet_t pkt)
Check for layer 4 protocols.
uint32_t odp_packet_len(odp_packet_t pkt)
Packet data length.
int odp_packet_has_error(odp_packet_t pkt)
Check for all parse errors in packet.
int odp_packet_extend_tail(odp_packet_t *pkt, uint32_t len, void **data_ptr, uint32_t *seg_len)
Extend packet tail.
int odp_packet_has_ipv6(odp_packet_t pkt)
Check for IPv6.
odp_packet_t odp_packet_alloc(odp_pool_t pool, uint32_t len)
Allocate a packet from a packet pool.
int odp_packet_rem_data(odp_packet_t *pkt, uint32_t offset, uint32_t len)
Remove data from an offset.
int odp_packet_l2_offset_set(odp_packet_t pkt, uint32_t offset)
Set layer 2 start offset.
int odp_packet_has_flow_hash(odp_packet_t pkt)
Check for packet flow hash.
int odp_packet_has_l2(odp_packet_t pkt)
Check for layer 2 protocols.
void * odp_packet_l3_ptr(odp_packet_t pkt, uint32_t *len)
Layer 3 start pointer.
odp_packet_seg_t odp_packet_next_seg(odp_packet_t pkt, odp_packet_seg_t seg)
Next segment in packet.
int odp_packet_align(odp_packet_t *pkt, uint32_t offset, uint32_t len, uint32_t align)
Align packet data.
odp_packet_t odp_packet_from_event(odp_event_t ev)
Get packet handle from event.
void * odp_packet_tail(odp_packet_t pkt)
Packet tailroom pointer.
void odp_packet_free(odp_packet_t pkt)
Free packet.
odp_packet_seg_t odp_packet_first_seg(odp_packet_t pkt)
First segment in packet.
int odp_packet_has_l2_error(odp_packet_t pkt)
Check for errors in layer 2.
int odp_packet_trunc_head(odp_packet_t *pkt, uint32_t len, void **data_ptr, uint32_t *seg_len)
Truncate packet head.
uint32_t odp_packet_reset_max_len(odp_packet_t pkt)
Maximum packet data reset length.
void odp_packet_flow_hash_set(odp_packet_t pkt, uint32_t flow_hash)
Set packet flow hash value.
int odp_packet_has_vlan(odp_packet_t pkt)
Check for VLAN.
uint32_t odp_packet_l3_offset(odp_packet_t pkt)
Layer 3 start offset.
void odp_packet_reset_meta(odp_packet_t pkt)
Reset packet metadata.
uint32_t odp_packet_buf_len(odp_packet_t pkt)
Total packet buffer length.
int odp_packet_has_jumbo(odp_packet_t pkt)
Check for jumbo frame.
int odp_packet_reset(odp_packet_t pkt, uint32_t len)
Reset packet.
int odp_packet_has_l4_error(odp_packet_t pkt)
Check for errors in layer 4.
int odp_packet_copy_from_pkt(odp_packet_t dst, uint32_t dst_offset, odp_packet_t src, uint32_t src_offset, uint32_t len)
Copy data from another packet.
void * odp_packet_push_tail(odp_packet_t pkt, uint32_t len)
Push out packet tail.
void * odp_packet_l2_ptr(odp_packet_t pkt, uint32_t *len)
Layer 2 start pointer.
int odp_packet_has_arp(odp_packet_t pkt)
Check for ARP.
int odp_packet_parse(odp_packet_t pkt, uint32_t offset, const odp_packet_parse_param_t *param)
Parse packet.
int odp_packet_has_eth_mcast(odp_packet_t pkt)
Check for Ethernet multicast address.
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.
int odp_packet_has_ipsec(odp_packet_t pkt)
Check for IPSec.
#define ODP_PACKET_INVALID
Invalid packet.
void odp_packet_user_ptr_set(odp_packet_t pkt, const void *user_ptr)
Set user context pointer.
int odp_packet_has_sctp(odp_packet_t pkt)
Check for SCTP.
odp_proto_l3_type_t odp_packet_l3_type(odp_packet_t pkt)
Layer 3 protocol type.
void * odp_packet_user_area(odp_packet_t pkt)
User area address.
int odp_packet_has_tcp(odp_packet_t pkt)
Check for TCP.
int odp_packet_has_l3_error(odp_packet_t pkt)
Check for errors in layer 3.
void odp_packet_free_multi(const odp_packet_t pkt[], int num)
Free multiple packets.
void * odp_packet_seg_data(odp_packet_t pkt, odp_packet_seg_t seg)
Segment data pointer.
int odp_packet_user_flag(odp_packet_t pkt)
Check user flag.
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.
odp_pool_t odp_packet_pool(odp_packet_t pkt)
Packet pool.
void * odp_packet_l4_ptr(odp_packet_t pkt, uint32_t *len)
Layer 4 start pointer.
void odp_packet_ts_set(odp_packet_t pkt, odp_time_t timestamp)
Set packet timestamp.
int odp_packet_copy_to_mem(odp_packet_t pkt, uint32_t offset, uint32_t len, void *dst)
Copy data from packet to memory.
odp_packet_t odp_packet_copy_part(odp_packet_t pkt, uint32_t offset, uint32_t len, odp_pool_t pool)
Partial copy of a packet.
void * odp_packet_user_ptr(odp_packet_t pkt)
User context pointer.
odp_packet_t odp_packet_ref_static(odp_packet_t pkt)
Create a static reference to a packet.
void * odp_packet_pull_tail(odp_packet_t pkt, uint32_t len)
Pull in packet tail.
int odp_packet_has_ref(odp_packet_t pkt)
Test if packet has multiple references.
odp_time_t odp_packet_ts(odp_packet_t pkt)
Packet timestamp.
int odp_packet_has_udp(odp_packet_t pkt)
Check for UDP.
void odp_packet_free_sp(const odp_packet_t pkt[], int num)
Free multiple packets to the same pool.
void * odp_packet_pull_head(odp_packet_t pkt, uint32_t len)
Pull in packet head.
uint32_t odp_packet_tailroom(odp_packet_t pkt)
Packet tailroom length.
odp_pktio_t odp_packet_input(odp_packet_t pkt)
Packet input interface.
uint32_t odp_packet_l2_offset(odp_packet_t pkt)
Layer 2 start offset.
@ 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_TIMEOUT
Timeout pool.
@ ODP_POOL_BUFFER
Buffer pool.
@ ODP_POOL_PACKET
Packet pool.
@ ODP_POOL_EVENT_VECTOR
Event vector pool.
int odp_shm_free(odp_shm_t shm)
Free a contiguous block of shared memory.
void * odp_shm_addr(odp_shm_t shm)
Shared memory block address.
#define ODP_SHM_INVALID
Invalid shared memory block.
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.
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.
odp_timeout_t odp_timeout_alloc(odp_pool_t pool)
Timeout alloc.
odp_event_t odp_timeout_to_event(odp_timeout_t tmo)
Convert timeout handle to event handle.
#define ODP_TIMEOUT_INVALID
Invalid timeout handle.
The OpenDataPlane API.
Global initialization parameters.
odp_mem_model_t mem_model
Application memory model.
Packet parse parameters.
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.
uint32_t max_num
Maximum number of buffers of any size.
struct odp_pool_capability_t::@133 buf
Buffer pool capabilities
struct odp_pool_capability_t::@135 tmo
Timeout pool capabilities
uint32_t max_uarea_size
Maximum user area size in bytes.
struct odp_pool_capability_t::@134 pkt
Packet pool capabilities
struct odp_pool_capability_t::@137 event_vector
Event vector pool capabilities.
uint32_t max_size
Maximum buffer data size in bytes.
uint32_t max_cache_size
Maximum size of thread local cache.
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 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.
struct odp_pool_param_t::@139 pkt
Parameters for packet pools.
struct odp_pool_param_t::@142 event_vector
Parameters for event vector pools.
uint32_t cache_size
Maximum number of buffers cached locally per thread.
uint32_t size
Minimum buffer size in bytes.
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.
struct odp_pool_param_t::@138 buf
Parameters for buffer pools.
struct odp_pool_param_t::@140 tmo
Parameters for timeout pools.
uint32_t seg_len
Minimum number of packet data bytes that can be stored in the first segment of a newly allocated pack...
uint32_t ipv4
IPv4 header checksum.
struct odp_proto_chksums_t::@124 chksum
Individual checksum bits.
uint32_t tcp
TCP checksum.
uint32_t udp
UDP checksum.