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 uint32_t get_test_pkt_offset(void)
1423{
1424 uint32_t len = gbl_args->pkt.len;
1425
1426 if (len <= 2)
1427 return len / 2;
1428 /*
1429 * Make the offset nonzero, not a compile time constant and
1430 * small enough to be accepted by typical ODP implementations.
1431 */
1432 return ((len / 2) % 0x7f) + 1;
1433}
1434
1435static int packet_l2_type(void)
1436{
1437 uint32_t ret = 0;
1438
1439 for (int i = 0; i < TEST_REPEAT_COUNT; i++)
1440 ret += odp_packet_l2_type(gbl_args->pkt_tbl[i]);
1441
1442 return ret;
1443}
1444
1445static int packet_l2_ptr(void)
1446{
1447 int i;
1448
1449 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1450 gbl_args->ptr_tbl[i] = odp_packet_l2_ptr(gbl_args->pkt_tbl[i],
1451 NULL);
1452 return i;
1453}
1454
1455static int packet_l2_offset(void)
1456{
1457 int i;
1458 int ret = 0;
1459
1460 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1461 ret += odp_packet_l2_offset(gbl_args->pkt_tbl[i]);
1462
1463 return ret >= 0;
1464}
1465
1466static int packet_l2_offset_set(void)
1467{
1468 int i;
1469 uint32_t ret = 0;
1470 uint32_t offset = get_test_pkt_offset();
1471
1472 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1473 ret += odp_packet_l2_offset_set(gbl_args->pkt_tbl[i], offset);
1474
1475 return !ret;
1476}
1477
1478static int packet_l3_type(void)
1479{
1480 uint32_t ret = 0;
1481
1482 for (int i = 0; i < TEST_REPEAT_COUNT; i++)
1483 ret += odp_packet_l3_type(gbl_args->pkt_tbl[i]);
1484
1485 return ret;
1486}
1487
1488static int packet_l3_ptr(void)
1489{
1490 int i;
1491
1492 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1493 gbl_args->ptr_tbl[i] = odp_packet_l3_ptr(gbl_args->pkt_tbl[i],
1494 NULL);
1495 return i;
1496}
1497
1498static int packet_l3_offset(void)
1499{
1500 int i;
1501 int ret = 0;
1502
1503 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1504 ret += odp_packet_l3_offset(gbl_args->pkt_tbl[i]);
1505
1506 return ret >= 0;
1507}
1508
1509static int packet_l3_offset_set(void)
1510{
1511 int i;
1512 uint32_t ret = 0;
1513 uint32_t offset = get_test_pkt_offset();
1514
1515 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1516 ret += odp_packet_l3_offset_set(gbl_args->pkt_tbl[i], offset);
1517
1518 return !ret;
1519}
1520
1521static int packet_l4_type(void)
1522{
1523 uint32_t ret = 0;
1524
1525 for (int i = 0; i < TEST_REPEAT_COUNT; i++)
1526 ret += odp_packet_l4_type(gbl_args->pkt_tbl[i]);
1527
1528 return ret;
1529}
1530
1531static int packet_l4_ptr(void)
1532{
1533 int i;
1534
1535 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1536 gbl_args->ptr_tbl[i] = odp_packet_l4_ptr(gbl_args->pkt_tbl[i],
1537 NULL);
1538 return i;
1539}
1540
1541static int packet_l4_offset(void)
1542{
1543 int i;
1544 int ret = 0;
1545
1546 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1547 ret += odp_packet_l4_offset(gbl_args->pkt_tbl[i]);
1548
1549 return ret >= 0;
1550}
1551
1552static int packet_l4_offset_set(void)
1553{
1554 int i;
1555 uint32_t ret = 0;
1556 uint32_t offset = get_test_pkt_offset();
1557
1558 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1559 ret += odp_packet_l4_offset_set(gbl_args->pkt_tbl[i], offset);
1560
1561 return !ret;
1562}
1563
1564static int packet_flow_hash(void)
1565{
1566 int i;
1567 uint32_t ret = 0;
1568
1569 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1570 ret += odp_packet_flow_hash(gbl_args->pkt_tbl[i]);
1571
1572 return ret;
1573}
1574
1575static int packet_flow_hash_set(void)
1576{
1577 int i;
1578
1579 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1580 odp_packet_flow_hash_set(gbl_args->pkt_tbl[i], i);
1581
1582 return i;
1583}
1584
1585static int packet_ts(void)
1586{
1587 int i;
1588
1589 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1590 gbl_args->ts_tbl[i] = odp_packet_ts(gbl_args->pkt_tbl[i]);
1591
1592 return i;
1593}
1594
1595static int packet_ts_set(void)
1596{
1597 int i;
1599
1600 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1601 odp_packet_ts_set(gbl_args->pkt_tbl[i], ts);
1602
1603 return i;
1604}
1605
1606static int packet_ref_static(void)
1607{
1608 int i;
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_static(pkt_tbl[i]);
1614
1615 return i;
1616}
1617
1618static int packet_ref(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 *ref_tbl = gbl_args->pkt2_tbl;
1624
1625 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1626 ref_tbl[i] = odp_packet_ref(pkt_tbl[i], offset);
1627
1628 return i;
1629}
1630
1631static int packet_ref_pkt(void)
1632{
1633 int i;
1634 uint32_t offset = TEST_MIN_PKT_SIZE / 2;
1635 odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1636 odp_packet_t *hdr_tbl = gbl_args->pkt2_tbl;
1637
1638 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1639 hdr_tbl[i] = odp_packet_ref_pkt(pkt_tbl[i], offset, hdr_tbl[i]);
1640
1641 return i;
1642}
1643
1644static int packet_has_ref(void)
1645{
1646 int i;
1647 uint32_t ret = 0;
1648 odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1649
1650 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1651 ret += odp_packet_has_ref(pkt_tbl[i]);
1652
1653 return i + ret;
1654}
1655
1656static int packet_is_referencing(void)
1657{
1658 int i;
1659 uint32_t ret = 0;
1660 odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1661
1662 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1663 ret += odp_packet_is_referencing(pkt_tbl[i]);
1664
1665 return i + ret;
1666}
1667
1668static int packet_subtype(void)
1669{
1670 int i;
1671 odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1672
1673 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1674 gbl_args->output_tbl[i] = odp_packet_subtype(pkt_tbl[i]);
1675
1676 return i;
1677}
1678
1679static int event_subtype(void)
1680{
1681 int i;
1682 odp_event_t *event_tbl = gbl_args->event_tbl;
1683
1684 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1685 gbl_args->output_tbl[i] = odp_event_subtype(event_tbl[i]);
1686
1687 return i;
1688}
1689
1690static int do_packet_parse(int chksum)
1691{
1693 odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1694 int ret = 0;
1695 int i;
1696
1697 memset(&param, 0, sizeof(odp_packet_parse_param_t));
1698 param.proto = ODP_PROTO_ETH;
1700 param.chksums.chksum.ipv4 = !!chksum;
1701 param.chksums.chksum.tcp = !!chksum;
1702 param.chksums.chksum.udp = !!chksum;
1703
1704 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1705 ret += odp_packet_parse(pkt_tbl[i], 0, &param);
1706
1707 return !ret;
1708}
1709
1710static int packet_parse(void)
1711{
1712 return do_packet_parse(1);
1713}
1714
1715static int packet_parse_no_chksum(void)
1716{
1717 return do_packet_parse(0);
1718}
1719
1720static int packet_parse_multi(void)
1721{
1722 int burst_size = gbl_args->appl.burst_size;
1723 int ret = 0;
1724 int i;
1726 odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1727 uint32_t offsets[burst_size];
1728
1729 memset(&offsets, 0, sizeof(offsets));
1730
1731 memset(&param, 0, sizeof(odp_packet_parse_param_t));
1732 param.proto = ODP_PROTO_ETH;
1734 param.chksums.chksum.ipv4 = 1;
1735 param.chksums.chksum.tcp = 1;
1736 param.chksums.chksum.udp = 1;
1737
1738 for (i = 0; i < TEST_REPEAT_COUNT; i++) {
1739 int idx = i * burst_size;
1740
1741 ret += odp_packet_parse_multi(&pkt_tbl[idx], offsets,
1742 burst_size, &param);
1743 }
1744 return (ret == TEST_REPEAT_COUNT * burst_size);
1745}
1746
1750static void usage(char *progname)
1751{
1752 printf("\n"
1753 "OpenDataPlane Packet function microbenchmark.\n"
1754 "\n"
1755 "Usage: %s OPTIONS\n"
1756 " E.g. %s\n"
1757 "\n"
1758 "Optional OPTIONS:\n"
1759 " -b, --burst <num> Test packet burst size.\n"
1760 " -c, --cache_size <num> Pool cache size.\n"
1761 " -i, --index <idx> Benchmark index to run indefinitely.\n"
1762 " -r, --rounds <num> Run each test case 'num' times (default %u).\n"
1763 " -t, --time <opt> Time measurement. 0: measure CPU cycles (default), 1: measure time\n"
1764 " -h, --help Display help and exit.\n\n"
1765 "\n", NO_PATH(progname), NO_PATH(progname), TEST_ROUNDS);
1766}
1767
1775static void parse_args(int argc, char *argv[], appl_args_t *appl_args)
1776{
1777 int opt;
1778 static const struct option longopts[] = {
1779 {"burst", required_argument, NULL, 'b'},
1780 {"cache_size", required_argument, NULL, 'c'},
1781 {"index", required_argument, NULL, 'i'},
1782 {"rounds", required_argument, NULL, 'r'},
1783 {"time", required_argument, NULL, 't'},
1784 {"help", no_argument, NULL, 'h'},
1785 {NULL, 0, NULL, 0}
1786 };
1787
1788 static const char *shortopts = "c:b:i:r:t:h";
1789
1790 appl_args->bench_idx = 0; /* Run all benchmarks */
1791 appl_args->burst_size = TEST_DEF_BURST;
1792 appl_args->cache_size = -1;
1793 appl_args->rounds = TEST_ROUNDS;
1794 appl_args->time = 0;
1795
1796 while (1) {
1797 opt = getopt_long(argc, argv, shortopts, longopts, NULL);
1798
1799 if (opt == -1)
1800 break; /* No more options */
1801
1802 switch (opt) {
1803 case 'c':
1804 appl_args->cache_size = atoi(optarg);
1805 break;
1806 case 'b':
1807 appl_args->burst_size = atoi(optarg);
1808 break;
1809 case 'i':
1810 appl_args->bench_idx = atoi(optarg);
1811 break;
1812 case 'r':
1813 appl_args->rounds = atoi(optarg);
1814 break;
1815 case 't':
1816 appl_args->time = atoi(optarg);
1817 break;
1818 case 'h':
1819 usage(argv[0]);
1820 exit(EXIT_SUCCESS);
1821 break;
1822 default:
1823 usage(argv[0]);
1824 exit(EXIT_FAILURE);
1825 }
1826 }
1827
1828 if (appl_args->burst_size < 1 ||
1829 appl_args->burst_size > TEST_MAX_BURST) {
1830 printf("Invalid burst size (max %d)\n", TEST_MAX_BURST);
1831 exit(EXIT_FAILURE);
1832 }
1833
1834 if (appl_args->rounds < 1) {
1835 printf("Invalid number test rounds: %d\n", appl_args->rounds);
1836 exit(EXIT_FAILURE);
1837 }
1838
1839 optind = 1; /* Reset 'extern optind' from the getopt lib */
1840}
1841
1845static void print_info(char *progname, appl_args_t *appl_args ODP_UNUSED)
1846{
1848
1849 printf("Running ODP appl: \"%s\"\n"
1850 "-----------------\n", progname);
1851 fflush(NULL);
1852}
1853
1857bench_info_t test_suite[] = {
1858 BENCH_INFO(packet_alloc, NULL, free_packets, NULL),
1859 BENCH_INFO(packet_alloc_multi, NULL, free_packets_multi, NULL),
1860 BENCH_INFO(packet_free, create_packets, NULL, NULL),
1861 BENCH_INFO(event_free, create_events, NULL, NULL),
1862 BENCH_INFO(packet_free_multi, alloc_packets_multi, NULL, NULL),
1863 BENCH_INFO(event_free_multi, create_events_multi, NULL, NULL),
1864 BENCH_INFO(packet_free_sp, alloc_packets_multi, NULL, NULL),
1865 BENCH_INFO(event_free_sp, create_events_multi, NULL, NULL),
1866 BENCH_INFO(packet_alloc_free, NULL, NULL, NULL),
1867 BENCH_INFO(packet_alloc_free_multi, NULL, NULL, NULL),
1868 BENCH_INFO(packet_reset, create_packets, free_packets, NULL),
1869 BENCH_INFO(packet_reset_meta, create_packets, free_packets, NULL),
1870 BENCH_INFO(packet_reset_max_len, create_packets, free_packets, NULL),
1871 BENCH_INFO(packet_from_event, create_events, free_packets, NULL),
1872 BENCH_INFO(packet_from_event_multi, create_events_multi, free_packets_multi, NULL),
1873 BENCH_INFO(packet_to_event, create_packets, free_packets, NULL),
1874 BENCH_INFO(packet_to_event_multi, alloc_packets_multi, free_packets_multi, NULL),
1875 BENCH_INFO(packet_head, create_packets, free_packets, NULL),
1876 BENCH_INFO(packet_buf_len, create_packets, free_packets, NULL),
1877 BENCH_INFO(packet_data, create_packets, free_packets, NULL),
1878 BENCH_INFO(packet_data_seg_len, create_packets, free_packets, NULL),
1879 BENCH_INFO(packet_seg_len, create_packets, free_packets, NULL),
1880 BENCH_INFO(packet_len, create_packets, free_packets, NULL),
1881 BENCH_INFO(packet_headroom, create_packets, free_packets, NULL),
1882 BENCH_INFO(packet_tailroom, create_packets, free_packets, NULL),
1883 BENCH_INFO(packet_tail, create_packets, free_packets, NULL),
1884 BENCH_INFO(packet_offset, create_packets, free_packets, NULL),
1885 BENCH_INFO(packet_prefetch, create_packets, free_packets, NULL),
1886 BENCH_INFO(packet_push_head, create_packets, free_packets, NULL),
1887 BENCH_INFO(packet_pull_head, create_packets, free_packets, NULL),
1888 BENCH_INFO(packet_push_tail, create_packets, free_packets, NULL),
1889 BENCH_INFO(packet_pull_tail, create_packets, free_packets, NULL),
1890 BENCH_INFO(packet_extend_head, alloc_packets_half, free_packets, NULL),
1891 BENCH_INFO(packet_trunc_head, create_packets, free_packets, NULL),
1892 BENCH_INFO(packet_extend_tail, alloc_packets_half, free_packets, NULL),
1893 BENCH_INFO(packet_trunc_tail, create_packets, free_packets, NULL),
1894 BENCH_INFO(packet_add_data, alloc_packets_half, free_packets, NULL),
1895 BENCH_INFO(packet_rem_data, create_packets, free_packets, NULL),
1896 BENCH_INFO(packet_align, create_packets, free_packets, NULL),
1897 BENCH_INFO(packet_is_segmented, create_packets, free_packets, NULL),
1898 BENCH_INFO(packet_num_segs, create_packets, free_packets, NULL),
1899 BENCH_INFO(packet_first_seg, create_packets, free_packets, NULL),
1900 BENCH_INFO(packet_last_seg, create_packets, free_packets, NULL),
1901 BENCH_INFO(packet_next_seg, create_packets, free_packets, NULL),
1902 BENCH_INFO(packet_seg_data, create_packets, free_packets, NULL),
1903 BENCH_INFO(packet_seg_data_len, create_packets, free_packets, NULL),
1904 BENCH_INFO(packet_concat, alloc_concat_packets, free_packets, NULL),
1905 BENCH_INFO(packet_split, create_packets, free_packets_twice, NULL),
1906 BENCH_INFO(packet_copy, create_packets, free_packets_twice, NULL),
1907 BENCH_INFO(packet_copy_part, create_packets, free_packets_twice, NULL),
1908 BENCH_INFO(packet_copy_to_mem, create_packets, free_packets, NULL),
1909 BENCH_INFO(packet_copy_from_mem, create_packets, free_packets, NULL),
1910 BENCH_INFO(packet_copy_from_pkt, alloc_packets_twice, free_packets_twice, NULL),
1911 BENCH_INFO(packet_copy_data, create_packets, free_packets, NULL),
1912 BENCH_INFO(packet_move_data, create_packets, free_packets, NULL),
1913 BENCH_INFO(packet_pool, create_packets, free_packets, NULL),
1914 BENCH_INFO(event_pool, create_events, free_packets, NULL),
1915 BENCH_INFO(packet_input, create_packets, free_packets, NULL),
1916 BENCH_INFO(packet_input_index, create_packets, free_packets, NULL),
1917 BENCH_INFO(packet_user_ptr, create_packets, free_packets, NULL),
1918 BENCH_INFO(packet_user_ptr_set, create_packets, free_packets, NULL),
1919 BENCH_INFO(packet_user_area, create_packets, free_packets, NULL),
1920 BENCH_INFO(event_user_area, create_events, free_packets, NULL),
1921 BENCH_INFO(event_user_area, create_events_misc, free_events_misc,
1922 "event_user_area_misc"),
1923 BENCH_INFO(packet_user_area_size, create_packets, free_packets, NULL),
1924 BENCH_INFO(packet_user_flag, create_packets, free_packets, NULL),
1925 BENCH_INFO(event_user_area_and_flag, create_events, free_packets, NULL),
1926 BENCH_INFO(event_user_area_and_flag, create_events_misc, free_events_misc,
1927 "event_user_area_and_flag_misc"),
1928 BENCH_INFO(packet_user_flag_set, create_packets, free_packets, NULL),
1929 BENCH_INFO(event_user_flag_set, create_events, free_packets, NULL),
1930 BENCH_INFO(event_user_flag_set, create_events_misc, free_events_misc,
1931 "event_user_flag_set_misc"),
1932
1933#define BINFO(fun) BENCH_INFO(fun, create_packets_misc_parsed, free_packets, NULL)
1934 BINFO(packet_has_error),
1935 BINFO(packet_has_l2_error),
1936 BINFO(packet_has_l3_error),
1937 BINFO(packet_has_l4_error),
1938 BINFO(packet_has_l2),
1939 BINFO(packet_has_l3),
1940 BINFO(packet_has_l4),
1941 BINFO(packet_has_eth),
1942 BINFO(packet_has_eth_bcast),
1943 BINFO(packet_has_eth_mcast),
1944 BINFO(packet_has_jumbo),
1945 BINFO(packet_has_vlan),
1946 BINFO(packet_has_vlan_qinq),
1947 BINFO(packet_has_arp),
1948 BINFO(packet_has_ipv4),
1949 BINFO(packet_has_ipv6),
1950 BINFO(packet_has_ip_bcast),
1951 BINFO(packet_has_ip_mcast),
1952 BINFO(packet_has_ipfrag),
1953 BINFO(packet_has_ipopt),
1954 BINFO(packet_has_ipsec),
1955 BINFO(packet_has_udp),
1956 BINFO(packet_has_tcp),
1957 BINFO(packet_has_sctp),
1958 BINFO(packet_has_icmp),
1959 BINFO(packet_has_flow_hash),
1960 BINFO(packet_has_ts),
1961
1962 BENCH_INFO(packet_l2_type, create_packets_misc_parsed, free_packets, NULL),
1963 BENCH_INFO(packet_l2_ptr, create_packets, free_packets, NULL),
1964 BENCH_INFO(packet_l2_offset, create_packets, free_packets, NULL),
1965 BENCH_INFO(packet_l2_offset_set, create_packets, free_packets, NULL),
1966 BENCH_INFO(packet_l3_type, create_packets_misc_parsed, free_packets, NULL),
1967 BENCH_INFO(packet_l3_ptr, create_packets, free_packets, NULL),
1968 BENCH_INFO(packet_l3_offset, create_packets, free_packets, NULL),
1969 BENCH_INFO(packet_l3_offset_set, create_packets, free_packets, NULL),
1970 BENCH_INFO(packet_l4_type, create_packets_misc_parsed, free_packets, NULL),
1971 BENCH_INFO(packet_l4_ptr, create_packets, free_packets, NULL),
1972 BENCH_INFO(packet_l4_offset, create_packets, free_packets, NULL),
1973 BENCH_INFO(packet_l4_offset_set, create_packets, free_packets, NULL),
1974 BENCH_INFO(packet_flow_hash, create_packets, free_packets, NULL),
1975 BENCH_INFO(packet_flow_hash_set, create_packets, free_packets, NULL),
1976 BENCH_INFO(packet_ts, create_packets, free_packets, NULL),
1977 BENCH_INFO(packet_ts_set, create_packets, free_packets, NULL),
1978 BENCH_INFO(packet_ref_static, create_packets, free_packets_twice, NULL),
1979 BENCH_INFO(packet_ref, create_packets, free_packets_twice, NULL),
1980 BENCH_INFO(packet_ref_pkt, alloc_packets_twice, free_packets_twice, NULL),
1981 BENCH_INFO(packet_has_ref, alloc_ref_packets, free_packets_twice, NULL),
1982 BENCH_INFO(packet_is_referencing, alloc_ref_packets, free_packets_twice, NULL),
1983 BENCH_INFO(packet_subtype, create_packets, free_packets, NULL),
1984 BENCH_INFO(event_subtype, create_events, free_packets, NULL),
1985 BENCH_INFO(packet_parse, alloc_parse_packets_ipv4_tcp, free_packets,
1986 "packet_parse_ipv4/tcp"),
1987 BENCH_INFO(packet_parse, alloc_parse_packets_ipv4_udp, free_packets,
1988 "packet_parse_ipv4/udp"),
1989 BENCH_INFO(packet_parse, alloc_parse_packets_ipv6_tcp, free_packets,
1990 "packet_parse_ipv6/tcp"),
1991 BENCH_INFO(packet_parse, alloc_parse_packets_ipv6_udp, free_packets,
1992 "packet_parse_ipv6/udp"),
1993 BENCH_INFO(packet_parse, create_packets_misc, free_packets,
1994 "packet_parse_misc"),
1995 BENCH_INFO(packet_parse_no_chksum, create_packets_misc, free_packets,
1996 "packet_parse_misc_no_csum"),
1997 BENCH_INFO(packet_parse_multi, alloc_parse_packets_multi_ipv4_tcp, free_packets_multi,
1998 "packet_parse_multi_ipv4/tcp"),
1999 BENCH_INFO(packet_parse_multi, alloc_parse_packets_multi_ipv4_udp, free_packets_multi,
2000 "packet_parse_multi_ipv4/udp"),
2001 BENCH_INFO(packet_parse_multi, alloc_parse_packets_multi_ipv6_tcp, free_packets_multi,
2002 "packet_parse_multi_ipv6/tcp"),
2003 BENCH_INFO(packet_parse_multi, alloc_parse_packets_multi_ipv6_udp, free_packets_multi,
2004 "packet_parse_multi_ipv6/udp"),
2005};
2006
2007ODP_STATIC_ASSERT(ODPH_ARRAY_SIZE(test_suite) < TEST_MAX_BENCH,
2008 "Result array is too small to hold all the results");
2009
2010static odp_pool_t create_pool(const char *name, const odp_pool_param_t *param)
2011{
2012 odp_pool_t pool = odp_pool_create(name, param);
2013
2014 if (pool == ODP_POOL_INVALID) {
2015 ODPH_ERR("Error: %s pool creation failed.\n", name);
2016 exit(EXIT_FAILURE);
2017 }
2018 return pool;
2019}
2020
2021static odp_pool_t create_buffer_pool(const odp_pool_capability_t *capa)
2022{
2023 odp_pool_param_t param;
2024
2025 odp_pool_param_init(&param);
2026 param.type = ODP_POOL_BUFFER;
2027 param.buf.num = 1;
2028 param.buf.size = 1;
2029 param.buf.uarea_size = capa->buf.max_uarea_size > 0 ? 1 : 0;
2030 return create_pool("buf", &param);
2031}
2032
2033static odp_pool_t create_timeout_pool(const odp_pool_capability_t *capa)
2034{
2035 odp_pool_param_t param;
2036
2037 odp_pool_param_init(&param);
2038 param.type = ODP_POOL_TIMEOUT;
2039 param.tmo.num = 1;
2040 param.tmo.uarea_size = capa->tmo.max_uarea_size > 0 ? 1 : 0;
2041 return create_pool("tmo", &param);
2042}
2043
2044static odp_pool_t create_evv_pool(const odp_pool_capability_t *capa)
2045{
2046 odp_pool_param_t param;
2047
2048 if (capa->event_vector.max_pools == 0)
2049 return ODP_POOL_INVALID;
2050
2051 odp_pool_param_init(&param);
2053 param.event_vector.num = 1;
2055 param.event_vector.uarea_size = capa->event_vector.max_uarea_size > 0 ? 1 : 0;
2056 return create_pool("evv", &param);
2057}
2058
2062int main(int argc, char *argv[])
2063{
2064 odph_helper_options_t helper_options;
2065 test_common_options_t common_options;
2066 odph_thread_t worker_thread;
2067 odph_thread_common_param_t thr_common;
2068 odph_thread_param_t thr_param;
2069 int cpu;
2070 odp_shm_t shm;
2071 odp_cpumask_t cpumask;
2072 char cpumaskstr[ODP_CPUMASK_STR_SIZE];
2074 odp_pool_param_t params;
2075 odp_instance_t instance;
2076 odp_init_t init_param;
2077 uint32_t pkt_num, seg_len;
2078 uint8_t ret;
2079
2080 /* Let helper collect its own arguments (e.g. --odph_proc) */
2081 argc = odph_parse_options(argc, argv);
2082 if (odph_options(&helper_options)) {
2083 ODPH_ERR("Error: reading ODP helper options failed.\n");
2084 exit(EXIT_FAILURE);
2085 }
2086
2087 argc = test_common_parse_options(argc, argv);
2088 if (test_common_options(&common_options)) {
2089 ODPH_ERR("Error: reading test options failed\n");
2090 exit(EXIT_FAILURE);
2091 }
2092
2093 odp_init_param_init(&init_param);
2094 init_param.mem_model = helper_options.mem_model;
2095
2096 /* Init ODP before calling anything else */
2097 if (odp_init_global(&instance, &init_param, NULL)) {
2098 ODPH_ERR("Error: ODP global init failed.\n");
2099 exit(EXIT_FAILURE);
2100 }
2101
2102 /* Init this thread */
2103 if (odp_init_local(instance, ODP_THREAD_CONTROL)) {
2104 ODPH_ERR("Error: ODP local init failed.\n");
2105 exit(EXIT_FAILURE);
2106 }
2107
2108 /* Reserve memory for args from shared mem */
2109 shm = odp_shm_reserve("shm_args", sizeof(args_t),
2110 ODP_CACHE_LINE_SIZE, 0);
2111
2112 if (shm == ODP_SHM_INVALID) {
2113 ODPH_ERR("Error: shared mem reserve failed.\n");
2114 exit(EXIT_FAILURE);
2115 }
2116
2117 gbl_args = odp_shm_addr(shm);
2118
2119 if (gbl_args == NULL) {
2120 ODPH_ERR("Error: shared mem alloc failed.\n");
2121 exit(EXIT_FAILURE);
2122 }
2123
2124 memset(gbl_args, 0, sizeof(args_t));
2125
2126 gbl_args->common_options = common_options;
2127
2128 /* Parse and store the application arguments */
2129 parse_args(argc, argv, &gbl_args->appl);
2130
2131 bench_suite_init(&gbl_args->suite);
2132 gbl_args->suite.bench = test_suite;
2133 gbl_args->suite.num_bench = ODPH_ARRAY_SIZE(test_suite);
2134 gbl_args->suite.indef_idx = gbl_args->appl.bench_idx;
2135 gbl_args->suite.rounds = gbl_args->appl.rounds;
2136 gbl_args->suite.repeat_count = TEST_REPEAT_COUNT;
2137 gbl_args->suite.measure_time = !!gbl_args->appl.time;
2138
2139 /* Print both system and application information */
2140 print_info(NO_PATH(argv[0]), &gbl_args->appl);
2141
2142 /* Get default worker cpumask */
2143 if (odp_cpumask_default_worker(&cpumask, 1) != 1) {
2144 ODPH_ERR("Error: unable to allocate worker thread.\n");
2145 exit(EXIT_FAILURE);
2146 }
2147
2148 (void)odp_cpumask_to_str(&cpumask, cpumaskstr, sizeof(cpumaskstr));
2149
2150 /* Check pool capability */
2151 if (odp_pool_capability(&capa)) {
2152 ODPH_ERR("Error: unable to query pool capability.\n");
2153 exit(EXIT_FAILURE);
2154 }
2155
2156 /* At least 2 x TEST_REPEAT_COUNT packets are required for the tests and depending on the
2157 * implementation extra packets may be required for packet references. */
2158 pkt_num = (gbl_args->appl.burst_size > 4) ?
2159 gbl_args->appl.burst_size * TEST_REPEAT_COUNT :
2160 4 * TEST_REPEAT_COUNT;
2161
2162 if (capa.pkt.max_num && capa.pkt.max_num < pkt_num) {
2163 ODPH_ERR("Error: packet pool size not supported.\n");
2164 printf("MAX: %" PRIu32 "\n", capa.pkt.max_num);
2165 exit(EXIT_FAILURE);
2166 } else if (capa.pkt.max_len &&
2167 capa.pkt.max_len < 2 * TEST_MAX_PKT_SIZE) {
2168 ODPH_ERR("Error: packet length not supported.\n");
2169 exit(EXIT_FAILURE);
2170 } else if (capa.pkt.max_uarea_size &&
2171 capa.pkt.max_uarea_size < PKT_POOL_UAREA_SIZE) {
2172 ODPH_ERR("Error: user area size not supported.\n");
2173 exit(EXIT_FAILURE);
2174 } else if (gbl_args->appl.cache_size > (int)capa.pkt.max_cache_size) {
2175 ODPH_ERR("Error: cache size not supported (max %" PRIu32 ")\n",
2176 capa.pkt.max_cache_size);
2177 exit(EXIT_FAILURE);
2178 }
2179
2180 seg_len = TEST_MAX_PKT_SIZE;
2181 if (capa.pkt.max_seg_len && capa.pkt.max_seg_len < seg_len) {
2182 seg_len = capa.pkt.max_seg_len;
2183 printf("\nWarn: allocated packets may be segmented (min seg_len=%" PRIu32 ")\n\n",
2184 seg_len);
2185 }
2186
2187 /* Create packet pool */
2188 odp_pool_param_init(&params);
2189 params.pkt.seg_len = seg_len;
2190 /* Using packet length as twice the TEST_MAX_PKT_SIZE as some
2191 * test cases (packet_ref_pkt) might allocate a bigger
2192 * packet than TEST_MAX_PKT_SIZE.
2193 */
2194 params.pkt.len = 2 * TEST_MAX_PKT_SIZE;
2195 params.pkt.num = pkt_num;
2196 params.pkt.uarea_size = PKT_POOL_UAREA_SIZE;
2197 if (gbl_args->appl.cache_size >= 0)
2198 params.pkt.cache_size = gbl_args->appl.cache_size;
2199 params.type = ODP_POOL_PACKET;
2200
2201 gbl_args->pool = odp_pool_create("packet pool", &params);
2202 if (gbl_args->pool == ODP_POOL_INVALID) {
2203 ODPH_ERR("Error: packet pool create failed.\n");
2204 exit(EXIT_FAILURE);
2205 }
2206 gbl_args->pool_buf = create_buffer_pool(&capa);
2207 gbl_args->pool_tmo = create_timeout_pool(&capa);
2208 gbl_args->pool_evv = create_evv_pool(&capa);
2209
2210 printf("CPU: %i\n", odp_cpumask_first(&cpumask));
2211 printf("CPU mask: %s\n", cpumaskstr);
2212 printf("Burst size: %d\n", gbl_args->appl.burst_size);
2213 printf("Bench repeat: %d\n", TEST_REPEAT_COUNT);
2214 printf("Measurement unit: %s\n", gbl_args->appl.time ? "nsec" : "CPU cycles");
2215 printf("Test rounds: %u\n", gbl_args->appl.rounds);
2216 if (gbl_args->appl.cache_size < 0)
2217 printf("Pool cache size: default\n");
2218 else
2219 printf("Pool cache size: %d\n", gbl_args->appl.cache_size);
2220
2221 odp_pool_print(gbl_args->pool);
2222
2223 memset(&worker_thread, 0, sizeof(odph_thread_t));
2224
2225 signal(SIGINT, sig_handler);
2226
2227 /* Create worker threads */
2228 cpu = odp_cpumask_first(&cpumask);
2229
2230 odp_cpumask_t thd_mask;
2231
2232 odp_cpumask_zero(&thd_mask);
2233 odp_cpumask_set(&thd_mask, cpu);
2234
2235 odph_thread_common_param_init(&thr_common);
2236 thr_common.instance = instance;
2237 thr_common.cpumask = &thd_mask;
2238 thr_common.share_param = 1;
2239
2240 odph_thread_param_init(&thr_param);
2241 thr_param.start = run_benchmarks;
2242 thr_param.arg = gbl_args;
2243 thr_param.thr_type = ODP_THREAD_WORKER;
2244
2245 odph_thread_create(&worker_thread, &thr_common, &thr_param, 1);
2246
2247 odph_thread_join(&worker_thread, 1);
2248
2249 ret = gbl_args->suite.retval;
2250
2251 if (odp_pool_destroy(gbl_args->pool) ||
2252 odp_pool_destroy(gbl_args->pool_buf) ||
2253 odp_pool_destroy(gbl_args->pool_tmo) ||
2254 (gbl_args->pool_evv != ODP_POOL_INVALID && odp_pool_destroy(gbl_args->pool_evv))) {
2255 ODPH_ERR("Error: pool destroy\n");
2256 exit(EXIT_FAILURE);
2257 }
2258 gbl_args = NULL;
2259 odp_mb_full();
2260
2261 if (odp_shm_free(shm)) {
2262 ODPH_ERR("Error: shm free\n");
2263 exit(EXIT_FAILURE);
2264 }
2265
2266 if (odp_term_local()) {
2267 ODPH_ERR("Error: term local\n");
2268 exit(EXIT_FAILURE);
2269 }
2270
2271 if (odp_term_global(instance)) {
2272 ODPH_ERR("Error: term global\n");
2273 exit(EXIT_FAILURE);
2274 }
2275
2276 return ret;
2277}
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.