API Reference Manual  1.46.0
odp_bench_packet.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright (c) 2017-2018 Linaro Limited
3  * Copyright (c) 2022-2024 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 100
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 
77 ODP_STATIC_ASSERT((TEST_ALIGN_OFFSET + TEST_ALIGN_LEN) <= TEST_MIN_PKT_SIZE,
78  "Invalid_alignment");
79 
81 const uint32_t test_packet_len[] = {TEST_MIN_PKT_SIZE, 128, 256, 512,
82  1024, 1518, TEST_MAX_PKT_SIZE};
83 
84 ODP_STATIC_ASSERT(ODPH_ARRAY_SIZE(test_packet_len) <= TEST_MAX_SIZES,
85  "Result array is too small to hold all the results");
86 
90 typedef 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 
101 typedef struct {
103  appl_args_t appl;
105  bench_suite_t suite;
107  odp_pool_t pool;
108  struct {
110  uint32_t len;
112  uint32_t headroom;
114  uint32_t tailroom;
116  uint32_t seg_len;
117  } pkt;
119  odp_packet_t pkt_tbl[TEST_REPEAT_COUNT * TEST_MAX_BURST];
121  odp_packet_t pkt2_tbl[TEST_REPEAT_COUNT];
123  odp_event_t event_tbl[TEST_REPEAT_COUNT * TEST_MAX_BURST];
125  void *ptr_tbl[TEST_REPEAT_COUNT];
127  odp_packet_seg_t seg_tbl[TEST_REPEAT_COUNT];
129  uint32_t output_tbl[TEST_REPEAT_COUNT];
131  odp_pool_t pool_tbl[TEST_REPEAT_COUNT];
133  odp_pktio_t pktio_tbl[TEST_REPEAT_COUNT];
135  odp_time_t ts_tbl[TEST_REPEAT_COUNT];
137  uint8_t data_tbl[TEST_REPEAT_COUNT][TEST_MAX_PKT_SIZE];
139  test_common_options_t common_options;
141  double result[TEST_MAX_SIZES][TEST_MAX_BENCH];
142 } args_t;
143 
145 static args_t *gbl_args;
146 
147 static void sig_handler(int signo ODP_UNUSED)
148 {
149  if (gbl_args == NULL)
150  return;
151  odp_atomic_store_u32(&gbl_args->suite.exit_worker, 1);
152 }
153 
154 static int bench_packet_export(void *data)
155 {
156  args_t *gbl_args = data;
157  int ret = 0;
158 
159  if (test_common_write("%s", "Function name,64B,128B,256B,512B,1024B,1518B,2048B\n")) {
160  ret = -1;
161  goto exit;
162  }
163 
164  for (int i = 0; i < gbl_args->suite.num_bench; i++) {
165  if (test_common_write("odp_%s,%f,%f,%f,%f,%f,%f,%f\n",
166  gbl_args->suite.bench[i].desc != NULL ?
167  gbl_args->suite.bench[i].desc : gbl_args->suite.bench[i].name,
168  gbl_args->result[0][i], gbl_args->result[1][i],
169  gbl_args->result[2][i], gbl_args->result[3][i],
170  gbl_args->result[4][i], gbl_args->result[5][i],
171  gbl_args->result[6][i])) {
172  ret = -1;
173  goto exit;
174  }
175  }
176 
177 exit:
178  test_common_write_term();
179 
180  return ret;
181 }
182 
186 static int run_benchmarks(void *arg)
187 {
188  int i;
189  args_t *args = arg;
190  bench_suite_t *suite = &args->suite;
191  int num_sizes = ODPH_ARRAY_SIZE(test_packet_len);
192 
193  for (i = 0; i < num_sizes; i++) {
194  printf("Packet length: %6d bytes", test_packet_len[i]);
195 
196  gbl_args->pkt.len = test_packet_len[i];
197 
198  suite->result = args->result[i];
199 
200  bench_run(suite);
201  }
202 
203  printf("\n%-35s", "Benchmark / packet_size [B]");
204  for (i = 0; i < num_sizes; i++)
205  printf("%8.1d ", test_packet_len[i]);
206 
207  printf("\n---------------------------------");
208  for (i = 0; i < num_sizes; i++)
209  printf("----------");
210 
211  for (i = 0; i < suite->num_bench; i++) {
212  printf("\n[%02d] odp_%-26s", i + 1, suite->bench[i].desc != NULL ?
213  suite->bench[i].desc : suite->bench[i].name);
214 
215  for (int j = 0; j < num_sizes; j++)
216  printf("%8.1f ", args->result[j][i]);
217  }
218  printf("\n\n");
219 
220  if (args->common_options.is_export) {
221  if (bench_packet_export(args)) {
222  ODPH_ERR("Error: Export failed\n");
223  return -1;
224  }
225  }
226 
227  return 0;
228 }
229 
230 static void allocate_test_packets(uint32_t len, odp_packet_t pkt[], int num)
231 {
232  int pkts = 0;
233 
234  while (pkts < num) {
235  int ret;
236 
237  ret = odp_packet_alloc_multi(gbl_args->pool, len, &pkt[pkts],
238  num - pkts);
239  if (ret < 0)
240  ODPH_ABORT("Allocating test packets failed\n");
241 
242  pkts += ret;
243  }
244 }
245 
246 static void alloc_packets_half(void)
247 {
248  allocate_test_packets(gbl_args->pkt.len / 2, gbl_args->pkt_tbl,
249  TEST_REPEAT_COUNT);
250 }
251 
252 static void alloc_packets_multi(void)
253 {
254  allocate_test_packets(gbl_args->pkt.len, gbl_args->pkt_tbl,
255  TEST_REPEAT_COUNT * gbl_args->appl.burst_size);
256 }
257 
258 static void alloc_concat_packets(void)
259 {
260  allocate_test_packets(gbl_args->pkt.len / 2, gbl_args->pkt_tbl,
261  TEST_REPEAT_COUNT);
262  allocate_test_packets(gbl_args->pkt.len / 2, gbl_args->pkt2_tbl,
263  TEST_REPEAT_COUNT);
264 }
265 
266 static void alloc_ref_packets(void)
267 {
268  int i;
269  odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
270  odp_packet_t *ref_tbl = gbl_args->pkt2_tbl;
271 
272  allocate_test_packets(gbl_args->pkt.len, pkt_tbl, TEST_REPEAT_COUNT);
273 
274  for (i = 0; i < TEST_REPEAT_COUNT; i++) {
275  ref_tbl[i] = odp_packet_ref(pkt_tbl[i], TEST_MIN_PKT_SIZE / 2);
276  if (ref_tbl[i] == ODP_PACKET_INVALID)
277  ODPH_ABORT("Allocating packet reference failed\n");
278  }
279 }
280 
281 static void alloc_packets_twice(void)
282 {
283  allocate_test_packets(gbl_args->pkt.len, gbl_args->pkt_tbl,
284  TEST_REPEAT_COUNT);
285  allocate_test_packets(gbl_args->pkt.len, gbl_args->pkt2_tbl,
286  TEST_REPEAT_COUNT);
287 }
288 
289 static void alloc_parse_packets(const void *pkt_data, uint32_t len)
290 {
291  int i;
292 
293  allocate_test_packets(len, gbl_args->pkt_tbl, TEST_REPEAT_COUNT);
294 
295  for (i = 0; i < TEST_REPEAT_COUNT; i++) {
296  if (odp_packet_copy_from_mem(gbl_args->pkt_tbl[i], 0, len,
297  pkt_data))
298  ODPH_ABORT("Copying test packet failed\n");
299  }
300 }
301 
302 static void alloc_parse_packets_ipv4_tcp(void)
303 {
304  alloc_parse_packets(test_packet_ipv4_tcp, sizeof(test_packet_ipv4_tcp));
305 }
306 
307 static void alloc_parse_packets_ipv4_udp(void)
308 {
309  alloc_parse_packets(test_packet_ipv4_udp, sizeof(test_packet_ipv4_udp));
310 }
311 
312 static void alloc_parse_packets_ipv6_tcp(void)
313 {
314  alloc_parse_packets(test_packet_ipv6_tcp, sizeof(test_packet_ipv6_tcp));
315 }
316 
317 static void alloc_parse_packets_ipv6_udp(void)
318 {
319  alloc_parse_packets(test_packet_ipv6_udp, sizeof(test_packet_ipv6_udp));
320 }
321 
322 static void alloc_parse_packets_multi(const void *pkt_data, uint32_t len)
323 {
324  int i;
325 
326  allocate_test_packets(len, gbl_args->pkt_tbl,
327  TEST_REPEAT_COUNT * gbl_args->appl.burst_size);
328 
329  for (i = 0; i < TEST_REPEAT_COUNT * gbl_args->appl.burst_size; i++) {
330  if (odp_packet_copy_from_mem(gbl_args->pkt_tbl[i], 0, len,
331  pkt_data))
332  ODPH_ABORT("Copying test packet failed\n");
333  }
334 }
335 
336 static void alloc_parse_packets_multi_ipv4_tcp(void)
337 {
338  alloc_parse_packets_multi(test_packet_ipv4_tcp,
339  sizeof(test_packet_ipv4_tcp));
340 }
341 
342 static void alloc_parse_packets_multi_ipv4_udp(void)
343 {
344  alloc_parse_packets_multi(test_packet_ipv4_udp,
345  sizeof(test_packet_ipv4_udp));
346 }
347 
348 static void alloc_parse_packets_multi_ipv6_tcp(void)
349 {
350  alloc_parse_packets_multi(test_packet_ipv6_tcp,
351  sizeof(test_packet_ipv6_tcp));
352 }
353 
354 static void alloc_parse_packets_multi_ipv6_udp(void)
355 {
356  alloc_parse_packets_multi(test_packet_ipv6_udp,
357  sizeof(test_packet_ipv6_udp));
358 }
359 
360 static void create_packets(void)
361 {
362  int i;
363  uint32_t headroom, tailroom, seg_len;
364  uint32_t min_headroom = 0;
365  uint32_t min_tailroom = 0;
366  uint32_t min_seg_len = 0;
367  odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
368  odp_packet_seg_t *seg_tbl = gbl_args->seg_tbl;
369 
370  allocate_test_packets(gbl_args->pkt.len, gbl_args->pkt_tbl,
371  TEST_REPEAT_COUNT);
372 
373  for (i = 0; i < TEST_REPEAT_COUNT; i++) {
374  headroom = odp_packet_headroom(pkt_tbl[i]);
375  tailroom = odp_packet_tailroom(pkt_tbl[i]);
376  seg_len = odp_packet_seg_len(pkt_tbl[i]);
377 
378  seg_tbl[i] = odp_packet_first_seg(pkt_tbl[i]);
379 
380  if (i == 0) {
381  min_headroom = headroom;
382  min_tailroom = tailroom;
383  min_seg_len = seg_len;
384  } else {
385  if (headroom < min_headroom)
386  min_headroom = headroom;
387  if (tailroom < min_tailroom)
388  min_tailroom = tailroom;
389  if (seg_len < min_seg_len)
390  min_seg_len = seg_len;
391  }
392 
393  if (odp_packet_l2_offset_set(pkt_tbl[i], TEST_L2_OFFSET) ||
394  odp_packet_l3_offset_set(pkt_tbl[i], TEST_L3_OFFSET) ||
395  odp_packet_l4_offset_set(pkt_tbl[i], TEST_L4_OFFSET))
396  ODPH_ABORT("Setting test packet offsets failed\n");
397 
398  odp_packet_flow_hash_set(pkt_tbl[i], i);
399  odp_packet_ts_set(pkt_tbl[i], odp_time_local());
400  }
401  gbl_args->pkt.headroom = min_headroom;
402  gbl_args->pkt.tailroom = min_tailroom;
403  gbl_args->pkt.seg_len = min_seg_len;
404 }
405 
406 static void create_events(void)
407 {
408  int i;
409  odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
410 
411  create_packets();
412 
413  for (i = 0; i < TEST_REPEAT_COUNT; i++)
414  gbl_args->event_tbl[i] = odp_packet_to_event(pkt_tbl[i]);
415 }
416 
417 static void create_events_multi(void)
418 {
419  int i;
420  odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
421 
422  allocate_test_packets(gbl_args->pkt.len, gbl_args->pkt_tbl,
423  TEST_REPEAT_COUNT * gbl_args->appl.burst_size);
424 
425  for (i = 0; i < TEST_REPEAT_COUNT * gbl_args->appl.burst_size; i++)
426  gbl_args->event_tbl[i] = odp_packet_to_event(pkt_tbl[i]);
427 }
428 
429 static void free_packets(void)
430 {
431  odp_packet_free_multi(gbl_args->pkt_tbl, TEST_REPEAT_COUNT);
432 }
433 
434 static void free_packets_multi(void)
435 {
436  odp_packet_free_multi(gbl_args->pkt_tbl,
437  TEST_REPEAT_COUNT * gbl_args->appl.burst_size);
438 }
439 
440 static void free_packets_twice(void)
441 {
442  odp_packet_free_multi(gbl_args->pkt_tbl, TEST_REPEAT_COUNT);
443  odp_packet_free_multi(gbl_args->pkt2_tbl, TEST_REPEAT_COUNT);
444 }
445 
446 static int packet_alloc(void)
447 {
448  int i;
449 
450  for (i = 0; i < TEST_REPEAT_COUNT; i++) {
451  odp_packet_t pkt;
452 
453  pkt = odp_packet_alloc(gbl_args->pool, gbl_args->pkt.len);
454 
455  gbl_args->pkt_tbl[i] = pkt;
456  }
457 
458  return i;
459 }
460 
461 static int packet_alloc_multi(void)
462 {
463  int i;
464  int pkts = 0;
465 
466  for (i = 0; i < TEST_REPEAT_COUNT; i++)
467  pkts += odp_packet_alloc_multi(gbl_args->pool,
468  gbl_args->pkt.len,
469  &gbl_args->pkt_tbl[pkts],
470  gbl_args->appl.burst_size);
471  return pkts;
472 }
473 
474 static int packet_free(void)
475 {
476  int i;
477 
478  for (i = 0; i < TEST_REPEAT_COUNT; i++)
479  odp_packet_free(gbl_args->pkt_tbl[i]);
480 
481  return i;
482 }
483 
484 static int event_free(void)
485 {
486  int i;
487 
488  for (i = 0; i < TEST_REPEAT_COUNT; i++)
489  odp_event_free(gbl_args->event_tbl[i]);
490 
491  return i;
492 }
493 
494 static int packet_free_multi(void)
495 {
496  int i;
497 
498  for (i = 0; i < TEST_REPEAT_COUNT; i++) {
499  int pkt_idx = i * gbl_args->appl.burst_size;
500 
501  odp_packet_free_multi(&gbl_args->pkt_tbl[pkt_idx],
502  gbl_args->appl.burst_size);
503  }
504  return i;
505 }
506 
507 static int event_free_multi(void)
508 {
509  int i;
510 
511  for (i = 0; i < TEST_REPEAT_COUNT; i++) {
512  int pkt_idx = i * gbl_args->appl.burst_size;
513 
514  odp_event_free_multi(&gbl_args->event_tbl[pkt_idx],
515  gbl_args->appl.burst_size);
516  }
517  return i;
518 }
519 
520 static int packet_free_sp(void)
521 {
522  int i;
523 
524  for (i = 0; i < TEST_REPEAT_COUNT; i++) {
525  int pkt_idx = i * gbl_args->appl.burst_size;
526 
527  odp_packet_free_sp(&gbl_args->pkt_tbl[pkt_idx],
528  gbl_args->appl.burst_size);
529  }
530  return i;
531 }
532 
533 static int event_free_sp(void)
534 {
535  int i;
536 
537  for (i = 0; i < TEST_REPEAT_COUNT; i++) {
538  int pkt_idx = i * gbl_args->appl.burst_size;
539 
540  odp_event_free_sp(&gbl_args->event_tbl[pkt_idx],
541  gbl_args->appl.burst_size);
542  }
543  return i;
544 }
545 
546 static int packet_alloc_free(void)
547 {
548  int i;
549 
550  for (i = 0; i < TEST_REPEAT_COUNT; i++) {
551  odp_packet_t pkt;
552 
553  pkt = odp_packet_alloc(gbl_args->pool, gbl_args->pkt.len);
554 
555  odp_packet_free(pkt);
556  }
557  return i;
558 }
559 
560 static int packet_alloc_free_multi(void)
561 {
562  int i;
563  int pkts;
564 
565  for (i = 0; i < TEST_REPEAT_COUNT; i++) {
566  pkts = odp_packet_alloc_multi(gbl_args->pool, gbl_args->pkt.len,
567  gbl_args->pkt_tbl,
568  gbl_args->appl.burst_size);
569 
570  if (pkts < 0)
571  ODPH_ABORT("Packet alloc failed\n");
572 
573  odp_packet_free_multi(gbl_args->pkt_tbl, pkts);
574  }
575  return i;
576 }
577 
578 static int packet_reset(void)
579 {
580  int i;
581  int ret = 0;
582 
583  for (i = 0; i < TEST_REPEAT_COUNT; i++)
584  ret += odp_packet_reset(gbl_args->pkt_tbl[i],
585  gbl_args->pkt.len);
586  return !ret;
587 }
588 
589 static int packet_reset_meta(void)
590 {
591  int i;
592 
593  for (i = 0; i < TEST_REPEAT_COUNT; i++)
594  odp_packet_reset_meta(gbl_args->pkt_tbl[i]);
595 
596  return i;
597 }
598 
599 static int packet_reset_max_len(void)
600 {
601  int i;
602  uint32_t ret = 0;
603 
604  for (i = 0; i < TEST_REPEAT_COUNT; i++)
605  ret += odp_packet_reset_max_len(gbl_args->pkt_tbl[i]);
606 
607  return ret;
608 }
609 
610 static int packet_from_event(void)
611 {
612  int i;
613  odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
614 
615  for (i = 0; i < TEST_REPEAT_COUNT; i++)
616  pkt_tbl[i] = odp_packet_from_event(gbl_args->event_tbl[i]);
617 
618  return i;
619 }
620 
621 static int packet_from_event_multi(void)
622 {
623  int i;
624 
625  for (i = 0; i < TEST_REPEAT_COUNT; i++) {
626  int idx = i * gbl_args->appl.burst_size;
627 
628  odp_packet_from_event_multi(&gbl_args->pkt_tbl[idx],
629  &gbl_args->event_tbl[idx],
630  gbl_args->appl.burst_size);
631  }
632  return i;
633 }
634 
635 static int packet_to_event(void)
636 {
637  int i;
638  odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
639 
640  for (i = 0; i < TEST_REPEAT_COUNT; i++)
641  gbl_args->event_tbl[i] = odp_packet_to_event(pkt_tbl[i]);
642 
643  return i;
644 }
645 
646 static int packet_to_event_multi(void)
647 {
648  int i;
649 
650  for (i = 0; i < TEST_REPEAT_COUNT; i++) {
651  int idx = i * gbl_args->appl.burst_size;
652 
653  odp_packet_to_event_multi(&gbl_args->pkt_tbl[idx],
654  &gbl_args->event_tbl[idx],
655  gbl_args->appl.burst_size);
656  }
657  return i;
658 }
659 
660 static int packet_head(void)
661 {
662  int i;
663 
664  for (i = 0; i < TEST_REPEAT_COUNT; i++)
665  gbl_args->ptr_tbl[i] = odp_packet_head(gbl_args->pkt_tbl[i]);
666 
667  return i;
668 }
669 
670 static int packet_buf_len(void)
671 {
672  int i;
673  uint32_t ret = 0;
674 
675  for (i = 0; i < TEST_REPEAT_COUNT; i++)
676  ret += odp_packet_buf_len(gbl_args->pkt_tbl[i]);
677 
678  return ret;
679 }
680 
681 static int packet_data(void)
682 {
683  int i;
684 
685  for (i = 0; i < TEST_REPEAT_COUNT; i++)
686  gbl_args->ptr_tbl[i] = odp_packet_data(gbl_args->pkt_tbl[i]);
687 
688  return i;
689 }
690 
691 static int packet_data_seg_len(void)
692 {
693  odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
694  uint32_t *output_tbl = gbl_args->output_tbl;
695  int i;
696 
697  for (i = 0; i < TEST_REPEAT_COUNT; i++)
698  gbl_args->ptr_tbl[i] = odp_packet_data_seg_len(pkt_tbl[i],
699  &output_tbl[i]);
700  return i;
701 }
702 
703 static int packet_seg_len(void)
704 {
705  int i;
706  uint32_t ret = 0;
707 
708  for (i = 0; i < TEST_REPEAT_COUNT; i++)
709  ret += odp_packet_seg_len(gbl_args->pkt_tbl[i]);
710 
711  return ret;
712 }
713 
714 static int packet_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_len(gbl_args->pkt_tbl[i]);
721 
722  return ret;
723 }
724 
725 static int packet_headroom(void)
726 {
727  int i;
728  uint32_t ret = 0;
729 
730  for (i = 0; i < TEST_REPEAT_COUNT; i++)
731  ret += odp_packet_headroom(gbl_args->pkt_tbl[i]);
732 
733  return i + ret;
734 }
735 
736 static int packet_tailroom(void)
737 {
738  int i;
739  uint32_t ret = 0;
740 
741  for (i = 0; i < TEST_REPEAT_COUNT; i++)
742  ret += odp_packet_tailroom(gbl_args->pkt_tbl[i]);
743 
744  return i + ret;
745 }
746 
747 static int packet_tail(void)
748 {
749  int i;
750 
751  for (i = 0; i < TEST_REPEAT_COUNT; i++)
752  gbl_args->ptr_tbl[i] = odp_packet_tail(gbl_args->pkt_tbl[i]);
753 
754  return i;
755 }
756 
757 static int packet_offset(void)
758 {
759  int i;
760  uint32_t offset = gbl_args->pkt.len / 2;
761 
762  for (i = 0; i < TEST_REPEAT_COUNT; i++)
763  gbl_args->ptr_tbl[i] = odp_packet_offset(gbl_args->pkt_tbl[i],
764  offset, NULL, NULL);
765  return i;
766 }
767 
768 static int packet_prefetch(void)
769 {
770  int i;
771 
772  for (i = 0; i < TEST_REPEAT_COUNT; i++)
773  odp_packet_prefetch(gbl_args->pkt_tbl[i], 0, gbl_args->pkt.len);
774 
775  return i;
776 }
777 
778 static int packet_push_head(void)
779 {
780  int i;
781  odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
782  uint32_t hroom = gbl_args->pkt.headroom;
783 
784  for (i = 0; i < TEST_REPEAT_COUNT; i++)
785  gbl_args->ptr_tbl[i] = odp_packet_push_head(pkt_tbl[i], hroom);
786 
787  return i;
788 }
789 
790 static int packet_pull_head(void)
791 {
792  int i;
793  uint32_t len = gbl_args->pkt.seg_len - 1;
794  odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
795 
796  for (i = 0; i < TEST_REPEAT_COUNT; i++)
797  gbl_args->ptr_tbl[i] = odp_packet_pull_head(pkt_tbl[i], len);
798 
799  return i;
800 }
801 
802 static int packet_push_tail(void)
803 {
804  int i;
805  odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
806  uint32_t troom = gbl_args->pkt.tailroom;
807 
808  for (i = 0; i < TEST_REPEAT_COUNT; i++)
809  gbl_args->ptr_tbl[i] = odp_packet_push_tail(pkt_tbl[i], troom);
810 
811  return i;
812 }
813 
814 static int packet_pull_tail(void)
815 {
816  int i;
817  uint32_t len = gbl_args->pkt.seg_len - 1;
818  odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
819 
820  for (i = 0; i < TEST_REPEAT_COUNT; i++)
821  gbl_args->ptr_tbl[i] = odp_packet_pull_tail(pkt_tbl[i], len);
822 
823  return i;
824 }
825 
826 static int packet_extend_head(void)
827 {
828  int i;
829  int ret = 0;
830  uint32_t len = gbl_args->pkt.len / 2;
831  odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
832  void **ptr_tbl = gbl_args->ptr_tbl;
833  uint32_t *data_tbl = gbl_args->output_tbl;
834 
835  for (i = 0; i < TEST_REPEAT_COUNT; i++)
836  ret += odp_packet_extend_head(&pkt_tbl[i], len, &ptr_tbl[i],
837  &data_tbl[i]);
838  return ret >= 0;
839 }
840 
841 static int packet_trunc_head(void)
842 {
843  int i;
844  int ret = 0;
845  uint32_t len = gbl_args->pkt.len / 2;
846  odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
847  void **ptr_tbl = gbl_args->ptr_tbl;
848  uint32_t *data_tbl = gbl_args->output_tbl;
849 
850  for (i = 0; i < TEST_REPEAT_COUNT; i++)
851  ret += odp_packet_trunc_head(&pkt_tbl[i], len, &ptr_tbl[i],
852  &data_tbl[i]);
853  return ret >= 0;
854 }
855 
856 static int packet_extend_tail(void)
857 {
858  int i;
859  int ret = 0;
860  uint32_t len = gbl_args->pkt.len / 2;
861  odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
862  void **ptr_tbl = gbl_args->ptr_tbl;
863  uint32_t *data_tbl = gbl_args->output_tbl;
864 
865  for (i = 0; i < TEST_REPEAT_COUNT; i++)
866  ret += odp_packet_extend_tail(&pkt_tbl[i], len, &ptr_tbl[i],
867  &data_tbl[i]);
868  return ret >= 0;
869 }
870 
871 static int packet_trunc_tail(void)
872 {
873  int i;
874  int ret = 0;
875  uint32_t len = gbl_args->pkt.len / 2;
876  odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
877  void **ptr_tbl = gbl_args->ptr_tbl;
878  uint32_t *data_tbl = gbl_args->output_tbl;
879 
880  for (i = 0; i < TEST_REPEAT_COUNT; i++)
881  ret += odp_packet_trunc_tail(&pkt_tbl[i], len, &ptr_tbl[i],
882  &data_tbl[i]);
883  return ret >= 0;
884 }
885 
886 static int packet_add_data(void)
887 {
888  int i;
889  int ret = 0;
890  odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
891  uint32_t len = gbl_args->pkt.len / 2;
892 
893  for (i = 0; i < TEST_REPEAT_COUNT; i++)
894  ret += odp_packet_add_data(&pkt_tbl[i], 0, len);
895 
896  return ret >= 0;
897 }
898 
899 static int packet_rem_data(void)
900 {
901  int i;
902  int ret = 0;
903  odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
904  uint32_t len = gbl_args->pkt.len / 2;
905 
906  for (i = 0; i < TEST_REPEAT_COUNT; i++)
907  ret += odp_packet_rem_data(&pkt_tbl[i], 0, len);
908 
909  return ret >= 0;
910 }
911 
912 static int packet_align(void)
913 {
914  int i;
915  int ret = 0;
916  odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
917 
918  for (i = 0; i < TEST_REPEAT_COUNT; i++)
919  ret += odp_packet_align(&pkt_tbl[i], TEST_ALIGN_OFFSET,
920  TEST_ALIGN_LEN, TEST_ALIGN);
921  return ret >= 0;
922 }
923 
924 static int packet_is_segmented(void)
925 {
926  int i;
927  uint32_t ret = 0;
928 
929  for (i = 0; i < TEST_REPEAT_COUNT; i++)
930  ret += odp_packet_is_segmented(gbl_args->pkt_tbl[i]);
931 
932  return (ret == 0) ? 1 : ret;
933 }
934 
935 static int packet_num_segs(void)
936 {
937  int i;
938  uint32_t ret = 0;
939 
940  for (i = 0; i < TEST_REPEAT_COUNT; i++)
941  ret += odp_packet_num_segs(gbl_args->pkt_tbl[i]);
942 
943  return ret;
944 }
945 
946 static int packet_first_seg(void)
947 {
948  int i;
949  odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
950 
951  for (i = 0; i < TEST_REPEAT_COUNT; i++)
952  gbl_args->seg_tbl[i] = odp_packet_first_seg(pkt_tbl[i]);
953 
954  return i;
955 }
956 
957 static int packet_last_seg(void)
958 {
959  int i;
960  odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
961 
962  for (i = 0; i < TEST_REPEAT_COUNT; i++)
963  gbl_args->seg_tbl[i] = odp_packet_last_seg(pkt_tbl[i]);
964 
965  return i;
966 }
967 
968 static int packet_next_seg(void)
969 {
970  int i;
971  odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
972  odp_packet_seg_t *seg_tbl = gbl_args->seg_tbl;
973 
974  for (i = 0; i < TEST_REPEAT_COUNT; i++)
975  gbl_args->seg_tbl[i] = odp_packet_next_seg(pkt_tbl[i],
976  seg_tbl[i]);
977  return i;
978 }
979 
980 static int packet_seg_data(void)
981 {
982  int i;
983  odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
984  odp_packet_seg_t *seg_tbl = gbl_args->seg_tbl;
985 
986  for (i = 0; i < TEST_REPEAT_COUNT; i++)
987  gbl_args->ptr_tbl[i] = odp_packet_seg_data(pkt_tbl[i],
988  seg_tbl[i]);
989  return i;
990 }
991 
992 static int packet_seg_data_len(void)
993 {
994  int i;
995  uint32_t ret = 0;
996  odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
997  odp_packet_seg_t *seg_tbl = gbl_args->seg_tbl;
998 
999  for (i = 0; i < TEST_REPEAT_COUNT; i++)
1000  ret += odp_packet_seg_data_len(pkt_tbl[i], seg_tbl[i]);
1001 
1002  return ret;
1003 }
1004 
1005 static int packet_concat(void)
1006 {
1007  int i;
1008  int ret = 0;
1009  odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1010  odp_packet_t *frag_tbl = gbl_args->pkt2_tbl;
1011 
1012  for (i = 0; i < TEST_REPEAT_COUNT; i++)
1013  ret += odp_packet_concat(&pkt_tbl[i], frag_tbl[i]);
1014 
1015  return ret >= 0;
1016 }
1017 
1018 static int packet_split(void)
1019 {
1020  int i;
1021  int ret = 0;
1022  uint32_t head_len;
1023  odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1024  odp_packet_t *frag_tbl = gbl_args->pkt2_tbl;
1025 
1026  head_len = odp_packet_len(pkt_tbl[0]) / 2;
1027 
1028  for (i = 0; i < TEST_REPEAT_COUNT; i++)
1029  ret += odp_packet_split(&pkt_tbl[i], head_len, &frag_tbl[i]);
1030 
1031  return ret >= 0;
1032 }
1033 
1034 static int packet_copy(void)
1035 {
1036  int i;
1037  odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1038  odp_packet_t *cpy_tbl = gbl_args->pkt2_tbl;
1039 
1040  for (i = 0; i < TEST_REPEAT_COUNT; i++)
1041  cpy_tbl[i] = odp_packet_copy(pkt_tbl[i], gbl_args->pool);
1042 
1043  return i;
1044 }
1045 
1046 static int packet_copy_part(void)
1047 {
1048  int i;
1049  uint32_t len = gbl_args->pkt.len / 2;
1050  odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1051  odp_packet_t *cpy_tbl = gbl_args->pkt2_tbl;
1052 
1053  for (i = 0; i < TEST_REPEAT_COUNT; i++)
1054  cpy_tbl[i] = odp_packet_copy_part(pkt_tbl[i], 0, len,
1055  gbl_args->pool);
1056  return i;
1057 }
1058 
1059 static int packet_copy_to_mem(void)
1060 {
1061  int i;
1062  uint32_t ret = 0;
1063  uint32_t len = gbl_args->pkt.len;
1064  odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1065 
1066  for (i = 0; i < TEST_REPEAT_COUNT; i++)
1067  ret += odp_packet_copy_to_mem(pkt_tbl[i], 0, len,
1068  gbl_args->data_tbl[i]);
1069  return !ret;
1070 }
1071 
1072 static int packet_copy_from_mem(void)
1073 {
1074  int i;
1075  uint32_t ret = 0;
1076  uint32_t len = gbl_args->pkt.len;
1077  odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1078 
1079  for (i = 0; i < TEST_REPEAT_COUNT; i++)
1080  ret += odp_packet_copy_from_mem(pkt_tbl[i], 0, len,
1081  gbl_args->data_tbl[i]);
1082  return !ret;
1083 }
1084 
1085 static int packet_copy_from_pkt(void)
1086 {
1087  int i;
1088  uint32_t ret = 0;
1089  uint32_t len = gbl_args->pkt.len;
1090  odp_packet_t *dst_tbl = gbl_args->pkt_tbl;
1091  odp_packet_t *src_tbl = gbl_args->pkt2_tbl;
1092 
1093  for (i = 0; i < TEST_REPEAT_COUNT; i++)
1094  ret += odp_packet_copy_from_pkt(dst_tbl[i], 0, src_tbl[i], 0,
1095  len);
1096  return !ret;
1097 }
1098 
1099 static int packet_copy_data(void)
1100 {
1101  int i;
1102  uint32_t ret = 0;
1103  uint32_t len = gbl_args->pkt.len / 2;
1104  odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1105 
1106  for (i = 0; i < TEST_REPEAT_COUNT; i++)
1107  ret += odp_packet_copy_data(pkt_tbl[i], 0, len, len);
1108 
1109  return !ret;
1110 }
1111 
1112 static int packet_move_data(void)
1113 {
1114  int i;
1115  uint32_t ret = 0;
1116  uint32_t len = gbl_args->pkt.len / 2;
1117  uint32_t offset = len / 2;
1118  odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1119 
1120  for (i = 0; i < TEST_REPEAT_COUNT; i++)
1121  ret += odp_packet_move_data(pkt_tbl[i], offset, len, len);
1122 
1123  return !ret;
1124 }
1125 
1126 static int packet_pool(void)
1127 {
1128  int i;
1129 
1130  for (i = 0; i < TEST_REPEAT_COUNT; i++)
1131  gbl_args->pool_tbl[i] = odp_packet_pool(gbl_args->pkt_tbl[i]);
1132 
1133  return i;
1134 }
1135 
1136 static int event_pool(void)
1137 {
1138  int i;
1139 
1140  for (i = 0; i < TEST_REPEAT_COUNT; i++)
1141  gbl_args->pool_tbl[i] = odp_event_pool(gbl_args->event_tbl[i]);
1142 
1143  return i;
1144 }
1145 
1146 static int packet_input(void)
1147 {
1148  int i;
1149 
1150  for (i = 0; i < TEST_REPEAT_COUNT; i++)
1151  gbl_args->pktio_tbl[i] = odp_packet_input(gbl_args->pkt_tbl[i]);
1152 
1153  return i;
1154 }
1155 
1156 static int packet_input_index(void)
1157 {
1158  int i;
1159  int ret = 0;
1160 
1161  for (i = 0; i < TEST_REPEAT_COUNT; i++)
1162  ret += odp_packet_input_index(gbl_args->pkt_tbl[i]);
1163 
1164  return (ret == 0) ? 1 : ret;
1165 }
1166 
1167 static int packet_user_ptr(void)
1168 {
1169  int i;
1170  odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1171 
1172  for (i = 0; i < TEST_REPEAT_COUNT; i++)
1173  gbl_args->ptr_tbl[i] = odp_packet_user_ptr(pkt_tbl[i]);
1174 
1175  return i;
1176 }
1177 
1178 static int packet_user_ptr_set(void)
1179 {
1180  int i;
1181 
1182  for (i = 0; i < TEST_REPEAT_COUNT; i++)
1183  odp_packet_user_ptr_set(gbl_args->pkt_tbl[i],
1184  gbl_args->ptr_tbl[i]);
1185 
1186  return i;
1187 }
1188 
1189 static int packet_user_area(void)
1190 {
1191  int i;
1192  odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1193 
1194  for (i = 0; i < TEST_REPEAT_COUNT; i++)
1195  gbl_args->ptr_tbl[i] = odp_packet_user_area(pkt_tbl[i]);
1196 
1197  return i;
1198 }
1199 
1200 static int event_user_area(void)
1201 {
1202  int i;
1203  odp_event_t *event_tbl = gbl_args->event_tbl;
1204 
1205  for (i = 0; i < TEST_REPEAT_COUNT; i++)
1206  gbl_args->ptr_tbl[i] = odp_event_user_area(event_tbl[i]);
1207 
1208  return i;
1209 }
1210 
1211 static int packet_user_area_size(void)
1212 {
1213  int i;
1214  uint32_t ret = 0;
1215 
1216  for (i = 0; i < TEST_REPEAT_COUNT; i++)
1217  ret += odp_packet_user_area_size(gbl_args->pkt_tbl[i]);
1218 
1219  return ret;
1220 }
1221 
1222 static int packet_user_flag(void)
1223 {
1224  int i;
1225  uint32_t ret = 0;
1226 
1227  for (i = 0; i < TEST_REPEAT_COUNT; i++)
1228  ret += !odp_packet_user_flag(gbl_args->pkt_tbl[i]);
1229 
1230  return ret;
1231 }
1232 
1233 static int event_user_area_and_flag(void)
1234 {
1235  odp_event_t *event_tbl = gbl_args->event_tbl;
1236  void **ptr_tbl = gbl_args->ptr_tbl;
1237  int ret = 0;
1238  int flag;
1239 
1240  for (int i = 0; i < TEST_REPEAT_COUNT; i++) {
1241  ptr_tbl[i] = odp_event_user_area_and_flag(event_tbl[i], &flag);
1242  ret += !flag;
1243  }
1244 
1245  return ret;
1246 }
1247 
1248 static int packet_user_flag_set(void)
1249 {
1250  int i;
1251 
1252  for (i = 0; i < TEST_REPEAT_COUNT; i++)
1253  odp_packet_user_flag_set(gbl_args->pkt_tbl[i], 1);
1254 
1255  return i;
1256 }
1257 
1258 static int event_user_flag_set(void)
1259 {
1260  int i;
1261 
1262  for (i = 0; i < TEST_REPEAT_COUNT; i++)
1263  odp_event_user_flag_set(gbl_args->event_tbl[i], 1);
1264 
1265  return i;
1266 }
1267 
1268 static int packet_l2_ptr(void)
1269 {
1270  int i;
1271 
1272  for (i = 0; i < TEST_REPEAT_COUNT; i++)
1273  gbl_args->ptr_tbl[i] = odp_packet_l2_ptr(gbl_args->pkt_tbl[i],
1274  NULL);
1275  return i;
1276 }
1277 
1278 static int packet_l2_offset(void)
1279 {
1280  int i;
1281  int ret = 0;
1282 
1283  for (i = 0; i < TEST_REPEAT_COUNT; i++)
1284  ret += odp_packet_l2_offset(gbl_args->pkt_tbl[i]);
1285 
1286  return ret >= 0;
1287 }
1288 
1289 static int packet_l2_offset_set(void)
1290 {
1291  int i;
1292  uint32_t ret = 0;
1293  uint32_t offset = gbl_args->pkt.len / 2;
1294 
1295  for (i = 0; i < TEST_REPEAT_COUNT; i++)
1296  ret += odp_packet_l2_offset_set(gbl_args->pkt_tbl[i], offset);
1297 
1298  return !ret;
1299 }
1300 
1301 static int packet_l3_ptr(void)
1302 {
1303  int i;
1304 
1305  for (i = 0; i < TEST_REPEAT_COUNT; i++)
1306  gbl_args->ptr_tbl[i] = odp_packet_l3_ptr(gbl_args->pkt_tbl[i],
1307  NULL);
1308  return i;
1309 }
1310 
1311 static int packet_l3_offset(void)
1312 {
1313  int i;
1314  int ret = 0;
1315 
1316  for (i = 0; i < TEST_REPEAT_COUNT; i++)
1317  ret += odp_packet_l3_offset(gbl_args->pkt_tbl[i]);
1318 
1319  return ret >= 0;
1320 }
1321 
1322 static int packet_l3_offset_set(void)
1323 {
1324  int i;
1325  uint32_t ret = 0;
1326  uint32_t offset = gbl_args->pkt.len / 2;
1327 
1328  for (i = 0; i < TEST_REPEAT_COUNT; i++)
1329  ret += odp_packet_l3_offset_set(gbl_args->pkt_tbl[i], offset);
1330 
1331  return !ret;
1332 }
1333 
1334 static int packet_l4_ptr(void)
1335 {
1336  int i;
1337 
1338  for (i = 0; i < TEST_REPEAT_COUNT; i++)
1339  gbl_args->ptr_tbl[i] = odp_packet_l4_ptr(gbl_args->pkt_tbl[i],
1340  NULL);
1341  return i;
1342 }
1343 
1344 static int packet_l4_offset(void)
1345 {
1346  int i;
1347  int ret = 0;
1348 
1349  for (i = 0; i < TEST_REPEAT_COUNT; i++)
1350  ret += odp_packet_l4_offset(gbl_args->pkt_tbl[i]);
1351 
1352  return ret >= 0;
1353 }
1354 
1355 static int packet_l4_offset_set(void)
1356 {
1357  int i;
1358  uint32_t ret = 0;
1359  uint32_t offset = gbl_args->pkt.len / 2;
1360 
1361  for (i = 0; i < TEST_REPEAT_COUNT; i++)
1362  ret += odp_packet_l4_offset_set(gbl_args->pkt_tbl[i], offset);
1363 
1364  return !ret;
1365 }
1366 
1367 static int packet_flow_hash(void)
1368 {
1369  int i;
1370  uint32_t ret = 0;
1371 
1372  for (i = 0; i < TEST_REPEAT_COUNT; i++)
1373  ret += odp_packet_flow_hash(gbl_args->pkt_tbl[i]);
1374 
1375  return ret;
1376 }
1377 
1378 static int packet_flow_hash_set(void)
1379 {
1380  int i;
1381 
1382  for (i = 0; i < TEST_REPEAT_COUNT; i++)
1383  odp_packet_flow_hash_set(gbl_args->pkt_tbl[i], i);
1384 
1385  return i;
1386 }
1387 
1388 static int packet_ts(void)
1389 {
1390  int i;
1391 
1392  for (i = 0; i < TEST_REPEAT_COUNT; i++)
1393  gbl_args->ts_tbl[i] = odp_packet_ts(gbl_args->pkt_tbl[i]);
1394 
1395  return i;
1396 }
1397 
1398 static int packet_ts_set(void)
1399 {
1400  int i;
1401  odp_time_t ts = odp_time_local();
1402 
1403  for (i = 0; i < TEST_REPEAT_COUNT; i++)
1404  odp_packet_ts_set(gbl_args->pkt_tbl[i], ts);
1405 
1406  return i;
1407 }
1408 
1409 static int packet_ref_static(void)
1410 {
1411  int i;
1412  odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1413  odp_packet_t *ref_tbl = gbl_args->pkt2_tbl;
1414 
1415  for (i = 0; i < TEST_REPEAT_COUNT; i++)
1416  ref_tbl[i] = odp_packet_ref_static(pkt_tbl[i]);
1417 
1418  return i;
1419 }
1420 
1421 static int packet_ref(void)
1422 {
1423  int i;
1424  uint32_t offset = TEST_MIN_PKT_SIZE / 2;
1425  odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1426  odp_packet_t *ref_tbl = gbl_args->pkt2_tbl;
1427 
1428  for (i = 0; i < TEST_REPEAT_COUNT; i++)
1429  ref_tbl[i] = odp_packet_ref(pkt_tbl[i], offset);
1430 
1431  return i;
1432 }
1433 
1434 static int packet_ref_pkt(void)
1435 {
1436  int i;
1437  uint32_t offset = TEST_MIN_PKT_SIZE / 2;
1438  odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1439  odp_packet_t *hdr_tbl = gbl_args->pkt2_tbl;
1440 
1441  for (i = 0; i < TEST_REPEAT_COUNT; i++)
1442  hdr_tbl[i] = odp_packet_ref_pkt(pkt_tbl[i], offset, hdr_tbl[i]);
1443 
1444  return i;
1445 }
1446 
1447 static int packet_has_ref(void)
1448 {
1449  int i;
1450  uint32_t ret = 0;
1451  odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1452 
1453  for (i = 0; i < TEST_REPEAT_COUNT; i++)
1454  ret += odp_packet_has_ref(pkt_tbl[i]);
1455 
1456  return i + ret;
1457 }
1458 
1459 static int packet_subtype(void)
1460 {
1461  int i;
1462  odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1463 
1464  for (i = 0; i < TEST_REPEAT_COUNT; i++)
1465  gbl_args->output_tbl[i] = odp_packet_subtype(pkt_tbl[i]);
1466 
1467  return i;
1468 }
1469 
1470 static int event_subtype(void)
1471 {
1472  int i;
1473  odp_event_t *event_tbl = gbl_args->event_tbl;
1474 
1475  for (i = 0; i < TEST_REPEAT_COUNT; i++)
1476  gbl_args->output_tbl[i] = odp_event_subtype(event_tbl[i]);
1477 
1478  return i;
1479 }
1480 
1481 static int packet_parse(void)
1482 {
1484  odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1485  int ret = 0;
1486  int i;
1487 
1488  memset(&param, 0, sizeof(odp_packet_parse_param_t));
1489  param.proto = ODP_PROTO_ETH;
1491  param.chksums.chksum.ipv4 = 1;
1492  param.chksums.chksum.tcp = 1;
1493  param.chksums.chksum.udp = 1;
1494 
1495  for (i = 0; i < TEST_REPEAT_COUNT; i++)
1496  ret += odp_packet_parse(pkt_tbl[i], 0, &param);
1497 
1498  return !ret;
1499 }
1500 
1501 static int packet_parse_multi(void)
1502 {
1503  int burst_size = gbl_args->appl.burst_size;
1504  int ret = 0;
1505  int i;
1507  odp_packet_t *pkt_tbl = gbl_args->pkt_tbl;
1508  uint32_t offsets[burst_size];
1509 
1510  memset(&offsets, 0, sizeof(offsets));
1511 
1512  memset(&param, 0, sizeof(odp_packet_parse_param_t));
1513  param.proto = ODP_PROTO_ETH;
1515  param.chksums.chksum.ipv4 = 1;
1516  param.chksums.chksum.tcp = 1;
1517  param.chksums.chksum.udp = 1;
1518 
1519  for (i = 0; i < TEST_REPEAT_COUNT; i++) {
1520  int idx = i * burst_size;
1521 
1522  ret += odp_packet_parse_multi(&pkt_tbl[idx], offsets,
1523  burst_size, &param);
1524  }
1525  return (ret == TEST_REPEAT_COUNT * burst_size);
1526 }
1527 
1531 static void usage(char *progname)
1532 {
1533  printf("\n"
1534  "OpenDataPlane Packet function microbenchmark.\n"
1535  "\n"
1536  "Usage: %s OPTIONS\n"
1537  " E.g. %s\n"
1538  "\n"
1539  "Optional OPTIONS:\n"
1540  " -b, --burst <num> Test packet burst size.\n"
1541  " -c, --cache_size <num> Pool cache size.\n"
1542  " -i, --index <idx> Benchmark index to run indefinitely.\n"
1543  " -r, --rounds <num> Run each test case 'num' times (default %u).\n"
1544  " -t, --time <opt> Time measurement. 0: measure CPU cycles (default), 1: measure time\n"
1545  " -h, --help Display help and exit.\n\n"
1546  "\n", NO_PATH(progname), NO_PATH(progname), TEST_ROUNDS);
1547 }
1548 
1556 static void parse_args(int argc, char *argv[], appl_args_t *appl_args)
1557 {
1558  int opt;
1559  static const struct option longopts[] = {
1560  {"burst", required_argument, NULL, 'b'},
1561  {"cache_size", required_argument, NULL, 'c'},
1562  {"index", required_argument, NULL, 'i'},
1563  {"rounds", required_argument, NULL, 'r'},
1564  {"time", required_argument, NULL, 't'},
1565  {"help", no_argument, NULL, 'h'},
1566  {NULL, 0, NULL, 0}
1567  };
1568 
1569  static const char *shortopts = "c:b:i:r:t:h";
1570 
1571  appl_args->bench_idx = 0; /* Run all benchmarks */
1572  appl_args->burst_size = TEST_DEF_BURST;
1573  appl_args->cache_size = -1;
1574  appl_args->rounds = TEST_ROUNDS;
1575  appl_args->time = 0;
1576 
1577  while (1) {
1578  opt = getopt_long(argc, argv, shortopts, longopts, NULL);
1579 
1580  if (opt == -1)
1581  break; /* No more options */
1582 
1583  switch (opt) {
1584  case 'c':
1585  appl_args->cache_size = atoi(optarg);
1586  break;
1587  case 'b':
1588  appl_args->burst_size = atoi(optarg);
1589  break;
1590  case 'i':
1591  appl_args->bench_idx = atoi(optarg);
1592  break;
1593  case 'r':
1594  appl_args->rounds = atoi(optarg);
1595  break;
1596  case 't':
1597  appl_args->time = atoi(optarg);
1598  break;
1599  case 'h':
1600  usage(argv[0]);
1601  exit(EXIT_SUCCESS);
1602  break;
1603  default:
1604  usage(argv[0]);
1605  exit(EXIT_FAILURE);
1606  }
1607  }
1608 
1609  if (appl_args->burst_size < 1 ||
1610  appl_args->burst_size > TEST_MAX_BURST) {
1611  printf("Invalid burst size (max %d)\n", TEST_MAX_BURST);
1612  exit(EXIT_FAILURE);
1613  }
1614 
1615  if (appl_args->rounds < 1) {
1616  printf("Invalid number test rounds: %d\n", appl_args->rounds);
1617  exit(EXIT_FAILURE);
1618  }
1619 
1620  optind = 1; /* Reset 'extern optind' from the getopt lib */
1621 }
1622 
1626 static void print_info(char *progname, appl_args_t *appl_args ODP_UNUSED)
1627 {
1629 
1630  printf("Running ODP appl: \"%s\"\n"
1631  "-----------------\n", progname);
1632  fflush(NULL);
1633 }
1634 
1638 bench_info_t test_suite[] = {
1639  BENCH_INFO(packet_alloc, NULL, free_packets, NULL),
1640  BENCH_INFO(packet_alloc_multi, NULL, free_packets_multi, NULL),
1641  BENCH_INFO(packet_free, create_packets, NULL, NULL),
1642  BENCH_INFO(event_free, create_events, NULL, NULL),
1643  BENCH_INFO(packet_free_multi, alloc_packets_multi, NULL, NULL),
1644  BENCH_INFO(event_free_multi, create_events_multi, NULL, NULL),
1645  BENCH_INFO(packet_free_sp, alloc_packets_multi, NULL, NULL),
1646  BENCH_INFO(event_free_sp, create_events_multi, NULL, NULL),
1647  BENCH_INFO(packet_alloc_free, NULL, NULL, NULL),
1648  BENCH_INFO(packet_alloc_free_multi, NULL, NULL, NULL),
1649  BENCH_INFO(packet_reset, create_packets, free_packets, NULL),
1650  BENCH_INFO(packet_reset_meta, create_packets, free_packets, NULL),
1651  BENCH_INFO(packet_reset_max_len, create_packets, free_packets, NULL),
1652  BENCH_INFO(packet_from_event, create_events, free_packets, NULL),
1653  BENCH_INFO(packet_from_event_multi, create_events_multi, free_packets_multi, NULL),
1654  BENCH_INFO(packet_to_event, create_packets, free_packets, NULL),
1655  BENCH_INFO(packet_to_event_multi, alloc_packets_multi, free_packets_multi, NULL),
1656  BENCH_INFO(packet_head, create_packets, free_packets, NULL),
1657  BENCH_INFO(packet_buf_len, create_packets, free_packets, NULL),
1658  BENCH_INFO(packet_data, create_packets, free_packets, NULL),
1659  BENCH_INFO(packet_data_seg_len, create_packets, free_packets, NULL),
1660  BENCH_INFO(packet_seg_len, create_packets, free_packets, NULL),
1661  BENCH_INFO(packet_len, create_packets, free_packets, NULL),
1662  BENCH_INFO(packet_headroom, create_packets, free_packets, NULL),
1663  BENCH_INFO(packet_tailroom, create_packets, free_packets, NULL),
1664  BENCH_INFO(packet_tail, create_packets, free_packets, NULL),
1665  BENCH_INFO(packet_offset, create_packets, free_packets, NULL),
1666  BENCH_INFO(packet_prefetch, create_packets, free_packets, NULL),
1667  BENCH_INFO(packet_push_head, create_packets, free_packets, NULL),
1668  BENCH_INFO(packet_pull_head, create_packets, free_packets, NULL),
1669  BENCH_INFO(packet_push_tail, create_packets, free_packets, NULL),
1670  BENCH_INFO(packet_pull_tail, create_packets, free_packets, NULL),
1671  BENCH_INFO(packet_extend_head, alloc_packets_half, free_packets, NULL),
1672  BENCH_INFO(packet_trunc_head, create_packets, free_packets, NULL),
1673  BENCH_INFO(packet_extend_tail, alloc_packets_half, free_packets, NULL),
1674  BENCH_INFO(packet_trunc_tail, create_packets, free_packets, NULL),
1675  BENCH_INFO(packet_add_data, alloc_packets_half, free_packets, NULL),
1676  BENCH_INFO(packet_rem_data, create_packets, free_packets, NULL),
1677  BENCH_INFO(packet_align, create_packets, free_packets, NULL),
1678  BENCH_INFO(packet_is_segmented, create_packets, free_packets, NULL),
1679  BENCH_INFO(packet_num_segs, create_packets, free_packets, NULL),
1680  BENCH_INFO(packet_first_seg, create_packets, free_packets, NULL),
1681  BENCH_INFO(packet_last_seg, create_packets, free_packets, NULL),
1682  BENCH_INFO(packet_next_seg, create_packets, free_packets, NULL),
1683  BENCH_INFO(packet_seg_data, create_packets, free_packets, NULL),
1684  BENCH_INFO(packet_seg_data_len, create_packets, free_packets, NULL),
1685  BENCH_INFO(packet_concat, alloc_concat_packets, free_packets, NULL),
1686  BENCH_INFO(packet_split, create_packets, free_packets_twice, NULL),
1687  BENCH_INFO(packet_copy, create_packets, free_packets_twice, NULL),
1688  BENCH_INFO(packet_copy_part, create_packets, free_packets_twice, NULL),
1689  BENCH_INFO(packet_copy_to_mem, create_packets, free_packets, NULL),
1690  BENCH_INFO(packet_copy_from_mem, create_packets, free_packets, NULL),
1691  BENCH_INFO(packet_copy_from_pkt, alloc_packets_twice, free_packets_twice, NULL),
1692  BENCH_INFO(packet_copy_data, create_packets, free_packets, NULL),
1693  BENCH_INFO(packet_move_data, create_packets, free_packets, NULL),
1694  BENCH_INFO(packet_pool, create_packets, free_packets, NULL),
1695  BENCH_INFO(event_pool, create_events, free_packets, NULL),
1696  BENCH_INFO(packet_input, create_packets, free_packets, NULL),
1697  BENCH_INFO(packet_input_index, create_packets, free_packets, NULL),
1698  BENCH_INFO(packet_user_ptr, create_packets, free_packets, NULL),
1699  BENCH_INFO(packet_user_ptr_set, create_packets, free_packets, NULL),
1700  BENCH_INFO(packet_user_area, create_packets, free_packets, NULL),
1701  BENCH_INFO(event_user_area, create_events, free_packets, NULL),
1702  BENCH_INFO(packet_user_area_size, create_packets, free_packets, NULL),
1703  BENCH_INFO(packet_user_flag, create_packets, free_packets, NULL),
1704  BENCH_INFO(event_user_area_and_flag, create_events, free_packets, NULL),
1705  BENCH_INFO(packet_user_flag_set, create_packets, free_packets, NULL),
1706  BENCH_INFO(event_user_flag_set, create_events, free_packets, NULL),
1707  BENCH_INFO(packet_l2_ptr, create_packets, free_packets, NULL),
1708  BENCH_INFO(packet_l2_offset, create_packets, free_packets, NULL),
1709  BENCH_INFO(packet_l2_offset_set, create_packets, free_packets, NULL),
1710  BENCH_INFO(packet_l3_ptr, create_packets, free_packets, NULL),
1711  BENCH_INFO(packet_l3_offset, create_packets, free_packets, NULL),
1712  BENCH_INFO(packet_l3_offset_set, create_packets, free_packets, NULL),
1713  BENCH_INFO(packet_l4_ptr, create_packets, free_packets, NULL),
1714  BENCH_INFO(packet_l4_offset, create_packets, free_packets, NULL),
1715  BENCH_INFO(packet_l4_offset_set, create_packets, free_packets, NULL),
1716  BENCH_INFO(packet_flow_hash, create_packets, free_packets, NULL),
1717  BENCH_INFO(packet_flow_hash_set, create_packets, free_packets, NULL),
1718  BENCH_INFO(packet_ts, create_packets, free_packets, NULL),
1719  BENCH_INFO(packet_ts_set, create_packets, free_packets, NULL),
1720  BENCH_INFO(packet_ref_static, create_packets, free_packets_twice, NULL),
1721  BENCH_INFO(packet_ref, create_packets, free_packets_twice, NULL),
1722  BENCH_INFO(packet_ref_pkt, alloc_packets_twice, free_packets_twice, NULL),
1723  BENCH_INFO(packet_has_ref, alloc_ref_packets, free_packets_twice, NULL),
1724  BENCH_INFO(packet_subtype, create_packets, free_packets, NULL),
1725  BENCH_INFO(event_subtype, create_events, free_packets, NULL),
1726  BENCH_INFO(packet_parse, alloc_parse_packets_ipv4_tcp, free_packets,
1727  "packet_parse ipv4/tcp"),
1728  BENCH_INFO(packet_parse, alloc_parse_packets_ipv4_udp, free_packets,
1729  "packet_parse ipv4/udp"),
1730  BENCH_INFO(packet_parse, alloc_parse_packets_ipv6_tcp, free_packets,
1731  "packet_parse ipv6/tcp"),
1732  BENCH_INFO(packet_parse, alloc_parse_packets_ipv6_udp, free_packets,
1733  "packet_parse ipv6/udp"),
1734  BENCH_INFO(packet_parse_multi, alloc_parse_packets_multi_ipv4_tcp, free_packets_multi,
1735  "packet_parse_multi ipv4/tcp"),
1736  BENCH_INFO(packet_parse_multi, alloc_parse_packets_multi_ipv4_udp, free_packets_multi,
1737  "packet_parse_multi ipv4/udp"),
1738  BENCH_INFO(packet_parse_multi, alloc_parse_packets_multi_ipv6_tcp, free_packets_multi,
1739  "packet_parse_multi ipv6/tcp"),
1740  BENCH_INFO(packet_parse_multi, alloc_parse_packets_multi_ipv6_udp, free_packets_multi,
1741  "packet_parse_multi ipv6/udp"),
1742 };
1743 
1744 ODP_STATIC_ASSERT(ODPH_ARRAY_SIZE(test_suite) < TEST_MAX_BENCH,
1745  "Result array is too small to hold all the results");
1746 
1750 int main(int argc, char *argv[])
1751 {
1752  odph_helper_options_t helper_options;
1753  test_common_options_t common_options;
1754  odph_thread_t worker_thread;
1755  odph_thread_common_param_t thr_common;
1756  odph_thread_param_t thr_param;
1757  int cpu;
1758  odp_shm_t shm;
1759  odp_cpumask_t cpumask;
1760  char cpumaskstr[ODP_CPUMASK_STR_SIZE];
1761  odp_pool_capability_t capa;
1762  odp_pool_param_t params;
1763  odp_instance_t instance;
1764  odp_init_t init_param;
1765  uint32_t pkt_num, seg_len;
1766  uint8_t ret;
1767 
1768  /* Let helper collect its own arguments (e.g. --odph_proc) */
1769  argc = odph_parse_options(argc, argv);
1770  if (odph_options(&helper_options)) {
1771  ODPH_ERR("Error: reading ODP helper options failed.\n");
1772  exit(EXIT_FAILURE);
1773  }
1774 
1775  argc = test_common_parse_options(argc, argv);
1776  if (test_common_options(&common_options)) {
1777  ODPH_ERR("Error: reading test options failed\n");
1778  exit(EXIT_FAILURE);
1779  }
1780 
1781  odp_init_param_init(&init_param);
1782  init_param.mem_model = helper_options.mem_model;
1783 
1784  /* Init ODP before calling anything else */
1785  if (odp_init_global(&instance, &init_param, NULL)) {
1786  ODPH_ERR("Error: ODP global init failed.\n");
1787  exit(EXIT_FAILURE);
1788  }
1789 
1790  /* Init this thread */
1791  if (odp_init_local(instance, ODP_THREAD_CONTROL)) {
1792  ODPH_ERR("Error: ODP local init failed.\n");
1793  exit(EXIT_FAILURE);
1794  }
1795 
1796  /* Reserve memory for args from shared mem */
1797  shm = odp_shm_reserve("shm_args", sizeof(args_t),
1798  ODP_CACHE_LINE_SIZE, 0);
1799 
1800  if (shm == ODP_SHM_INVALID) {
1801  ODPH_ERR("Error: shared mem reserve failed.\n");
1802  exit(EXIT_FAILURE);
1803  }
1804 
1805  gbl_args = odp_shm_addr(shm);
1806 
1807  if (gbl_args == NULL) {
1808  ODPH_ERR("Error: shared mem alloc failed.\n");
1809  exit(EXIT_FAILURE);
1810  }
1811 
1812  memset(gbl_args, 0, sizeof(args_t));
1813 
1814  gbl_args->common_options = common_options;
1815 
1816  /* Parse and store the application arguments */
1817  parse_args(argc, argv, &gbl_args->appl);
1818 
1819  bench_suite_init(&gbl_args->suite);
1820  gbl_args->suite.bench = test_suite;
1821  gbl_args->suite.num_bench = ODPH_ARRAY_SIZE(test_suite);
1822  gbl_args->suite.indef_idx = gbl_args->appl.bench_idx;
1823  gbl_args->suite.rounds = gbl_args->appl.rounds;
1824  gbl_args->suite.repeat_count = TEST_REPEAT_COUNT;
1825  gbl_args->suite.measure_time = !!gbl_args->appl.time;
1826 
1827  /* Print both system and application information */
1828  print_info(NO_PATH(argv[0]), &gbl_args->appl);
1829 
1830  /* Get default worker cpumask */
1831  if (odp_cpumask_default_worker(&cpumask, 1) != 1) {
1832  ODPH_ERR("Error: unable to allocate worker thread.\n");
1833  exit(EXIT_FAILURE);
1834  }
1835 
1836  (void)odp_cpumask_to_str(&cpumask, cpumaskstr, sizeof(cpumaskstr));
1837 
1838  /* Check pool capability */
1839  if (odp_pool_capability(&capa)) {
1840  ODPH_ERR("Error: unable to query pool capability.\n");
1841  exit(EXIT_FAILURE);
1842  }
1843 
1844  /* At least 2 x TEST_REPEAT_COUNT packets are required for the tests and depending on the
1845  * implementation extra packets may be required for packet references. */
1846  pkt_num = (gbl_args->appl.burst_size > 4) ?
1847  gbl_args->appl.burst_size * TEST_REPEAT_COUNT :
1848  4 * TEST_REPEAT_COUNT;
1849 
1850  if (capa.pkt.max_num && capa.pkt.max_num < pkt_num) {
1851  ODPH_ERR("Error: packet pool size not supported.\n");
1852  printf("MAX: %" PRIu32 "\n", capa.pkt.max_num);
1853  exit(EXIT_FAILURE);
1854  } else if (capa.pkt.max_len &&
1855  capa.pkt.max_len < 2 * TEST_MAX_PKT_SIZE) {
1856  ODPH_ERR("Error: packet length not supported.\n");
1857  exit(EXIT_FAILURE);
1858  } else if (capa.pkt.max_uarea_size &&
1859  capa.pkt.max_uarea_size < PKT_POOL_UAREA_SIZE) {
1860  ODPH_ERR("Error: user area size not supported.\n");
1861  exit(EXIT_FAILURE);
1862  } else if (gbl_args->appl.cache_size > (int)capa.pkt.max_cache_size) {
1863  ODPH_ERR("Error: cache size not supported (max %" PRIu32 ")\n",
1864  capa.pkt.max_cache_size);
1865  exit(EXIT_FAILURE);
1866  }
1867 
1868  seg_len = TEST_MAX_PKT_SIZE;
1869  if (capa.pkt.max_seg_len && capa.pkt.max_seg_len < seg_len) {
1870  seg_len = capa.pkt.max_seg_len;
1871  printf("\nWarn: allocated packets may be segmented (min seg_len=%" PRIu32 ")\n\n",
1872  seg_len);
1873  }
1874 
1875  /* Create packet pool */
1876  odp_pool_param_init(&params);
1877  params.pkt.seg_len = seg_len;
1878  /* Using packet length as twice the TEST_MAX_PKT_SIZE as some
1879  * test cases (packet_ref_pkt) might allocate a bigger
1880  * packet than TEST_MAX_PKT_SIZE.
1881  */
1882  params.pkt.len = 2 * TEST_MAX_PKT_SIZE;
1883  params.pkt.num = pkt_num;
1884  params.pkt.uarea_size = PKT_POOL_UAREA_SIZE;
1885  if (gbl_args->appl.cache_size >= 0)
1886  params.pkt.cache_size = gbl_args->appl.cache_size;
1887  params.type = ODP_POOL_PACKET;
1888 
1889  gbl_args->pool = odp_pool_create("packet pool", &params);
1890 
1891  if (gbl_args->pool == ODP_POOL_INVALID) {
1892  ODPH_ERR("Error: packet pool create failed.\n");
1893  exit(EXIT_FAILURE);
1894  }
1895 
1896  printf("CPU: %i\n", odp_cpumask_first(&cpumask));
1897  printf("CPU mask: %s\n", cpumaskstr);
1898  printf("Burst size: %d\n", gbl_args->appl.burst_size);
1899  printf("Bench repeat: %d\n", TEST_REPEAT_COUNT);
1900  printf("Measurement unit: %s\n", gbl_args->appl.time ? "nsec" : "CPU cycles");
1901  printf("Test rounds: %u\n", gbl_args->appl.rounds);
1902  if (gbl_args->appl.cache_size < 0)
1903  printf("Pool cache size: default\n");
1904  else
1905  printf("Pool cache size: %d\n", gbl_args->appl.cache_size);
1906 
1907  odp_pool_print(gbl_args->pool);
1908 
1909  memset(&worker_thread, 0, sizeof(odph_thread_t));
1910 
1911  signal(SIGINT, sig_handler);
1912 
1913  /* Create worker threads */
1914  cpu = odp_cpumask_first(&cpumask);
1915 
1916  odp_cpumask_t thd_mask;
1917 
1918  odp_cpumask_zero(&thd_mask);
1919  odp_cpumask_set(&thd_mask, cpu);
1920 
1921  odph_thread_common_param_init(&thr_common);
1922  thr_common.instance = instance;
1923  thr_common.cpumask = &thd_mask;
1924  thr_common.share_param = 1;
1925 
1926  odph_thread_param_init(&thr_param);
1927  thr_param.start = run_benchmarks;
1928  thr_param.arg = gbl_args;
1929  thr_param.thr_type = ODP_THREAD_WORKER;
1930 
1931  odph_thread_create(&worker_thread, &thr_common, &thr_param, 1);
1932 
1933  odph_thread_join(&worker_thread, 1);
1934 
1935  ret = gbl_args->suite.retval;
1936 
1937  if (odp_pool_destroy(gbl_args->pool)) {
1938  ODPH_ERR("Error: pool destroy\n");
1939  exit(EXIT_FAILURE);
1940  }
1941  gbl_args = NULL;
1942  odp_mb_full();
1943 
1944  if (odp_shm_free(shm)) {
1945  ODPH_ERR("Error: shm free\n");
1946  exit(EXIT_FAILURE);
1947  }
1948 
1949  if (odp_term_local()) {
1950  ODPH_ERR("Error: term local\n");
1951  exit(EXIT_FAILURE);
1952  }
1953 
1954  if (odp_term_global(instance)) {
1955  ODPH_ERR("Error: term global\n");
1956  exit(EXIT_FAILURE);
1957  }
1958 
1959  return ret;
1960 }
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.
#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_...
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_flag_set(odp_event_t event, int val)
Set event user flag.
void * odp_event_user_area(odp_event_t event)
Event user area.
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 reference to a packet with a header packet.
uint32_t odp_packet_flow_hash(odp_packet_t pkt)
Packet flow hash value.
void * odp_packet_pull_head(odp_packet_t pkt, uint32_t len)
Pull in packet head.
void * odp_packet_user_ptr(odp_packet_t pkt)
User context pointer.
int odp_packet_trunc_tail(odp_packet_t *pkt, uint32_t len, void **tail_ptr, uint32_t *tailroom)
Truncate packet tail.
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.
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_push_head(odp_packet_t pkt, uint32_t len)
Push out packet head.
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.
odp_packet_t odp_packet_copy(odp_packet_t pkt, odp_pool_t pool)
Full copy of a packet.
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.
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_l4_offset_set(odp_packet_t pkt, uint32_t offset)
Set layer 4 start offset.
int odp_packet_extend_head(odp_packet_t *pkt, uint32_t len, void **data_ptr, uint32_t *seg_len)
Extend packet head.
odp_packet_t odp_packet_ref(odp_packet_t pkt, uint32_t offset)
Create a reference to a packet.
void * odp_packet_push_tail(odp_packet_t pkt, uint32_t len)
Push out packet tail.
int odp_packet_split(odp_packet_t *pkt, uint32_t len, odp_packet_t *tail)
Split packet into two packets.
void * odp_packet_seg_data(odp_packet_t pkt, odp_packet_seg_t seg)
Segment data pointer.
int odp_packet_move_data(odp_packet_t pkt, uint32_t dst_offset, uint32_t src_offset, uint32_t len)
Move data within packet.
void * odp_packet_user_area(odp_packet_t pkt)
User area address.
uint32_t odp_packet_len(odp_packet_t pkt)
Packet data length.
int odp_packet_extend_tail(odp_packet_t *pkt, uint32_t len, void **data_ptr, uint32_t *seg_len)
Extend packet tail.
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.
void * odp_packet_tail(odp_packet_t pkt)
Packet tailroom 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_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_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_l2_ptr(odp_packet_t pkt, uint32_t *len)
Layer 2 start pointer.
void odp_packet_flow_hash_set(odp_packet_t pkt, uint32_t flow_hash)
Set packet flow hash value.
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_reset(odp_packet_t pkt, uint32_t len)
Reset packet.
void * odp_packet_head(odp_packet_t pkt)
Packet head address.
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.
int odp_packet_parse(odp_packet_t pkt, uint32_t offset, const odp_packet_parse_param_t *param)
Parse packet.
int odp_packet_copy_from_mem(odp_packet_t pkt, uint32_t offset, uint32_t len, const void *src)
Copy data from memory to packet.
void * odp_packet_l4_ptr(odp_packet_t pkt, uint32_t *len)
Layer 4 start pointer.
#define ODP_PACKET_INVALID
Invalid packet.
void odp_packet_user_ptr_set(odp_packet_t pkt, const void *user_ptr)
Set user context pointer.
void * odp_packet_data_seg_len(odp_packet_t pkt, uint32_t *seg_len)
Packet data pointer with segment length.
void * odp_packet_l3_ptr(odp_packet_t pkt, uint32_t *len)
Layer 3 start pointer.
void odp_packet_free_multi(const odp_packet_t pkt[], int num)
Free multiple packets.
void * odp_packet_pull_tail(odp_packet_t pkt, uint32_t len)
Pull in packet tail.
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_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.
odp_packet_t odp_packet_ref_static(odp_packet_t pkt)
Create a static reference to a packet.
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.
void odp_packet_free_sp(const odp_packet_t pkt[], int num)
Free multiple packets to the same pool.
void * odp_packet_offset(odp_packet_t pkt, uint32_t offset, uint32_t *len, odp_packet_seg_t *seg)
Packet offset pointer.
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_PACKET
Packet pool.
int odp_shm_free(odp_shm_t shm)
Free a contiguous block of shared memory.
#define ODP_SHM_INVALID
Invalid shared memory block.
void * odp_shm_addr(odp_shm_t shm)
Shared memory block address.
odp_shm_t odp_shm_reserve(const char *name, uint64_t size, uint64_t align, uint32_t flags)
Reserve a contiguous block of shared memory.
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.
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.
struct odp_pool_capability_t::@122 pkt
Packet pool capabilities
uint32_t max_num
Maximum number of buffers of any size.
uint32_t max_uarea_size
Maximum user area size in bytes.
uint32_t max_cache_size
Maximum size of thread local cache.
uint32_t max_seg_len
Maximum packet segment data length in bytes.
uint32_t max_len
Maximum packet data length in bytes.
Pool parameters.
uint32_t uarea_size
Minimum user area size in bytes.
uint32_t num
Number of buffers in the pool.
uint32_t cache_size
Maximum number of buffers cached locally per thread.
odp_pool_type_t type
Pool type.
uint32_t len
Minimum length of 'num' packets.
uint32_t seg_len
Minimum number of packet data bytes that can be stored in the first segment of a newly allocated pack...
struct odp_pool_param_t::@126 pkt
Parameters for packet pools.
struct odp_proto_chksums_t::@116 chksum
Individual checksum bits.
uint32_t ipv4
IPv4 header checksum.
uint32_t tcp
TCP checksum.
uint32_t udp
UDP checksum.