21 #include <test_packet_ipv4.h>
22 #include <test_packet_ipv6.h>
25 #include <odp/helper/odph_api.h>
27 #include <bench_common.h>
28 #include <export_results.h>
31 #define PKT_POOL_UAREA_SIZE 8
34 #define TEST_MIN_PKT_SIZE 64
37 #define TEST_MAX_PKT_SIZE 2048
40 #define TEST_REPEAT_COUNT 1000
43 #define TEST_ROUNDS 2u
46 #define TEST_MAX_BURST 64
49 #define TEST_ALIGN_OFFSET 16
52 #define TEST_ALIGN_LEN 32
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)
63 #define TEST_DEF_BURST 8
66 #define TEST_MAX_BENCH 100
68 #define TEST_MAX_SIZES 7
71 #define NO_PATH(file_name) (strrchr((file_name), '/') ? \
72 strrchr((file_name), '/') + 1 : (file_name))
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}
81 const uint32_t test_packet_len[] = {TEST_MIN_PKT_SIZE, 128, 256, 512,
82 1024, 1518, TEST_MAX_PKT_SIZE};
85 "Result array is too small to hold all the results");
119 odp_packet_t pkt_tbl[TEST_REPEAT_COUNT * TEST_MAX_BURST];
123 odp_event_t event_tbl[TEST_REPEAT_COUNT * TEST_MAX_BURST];
125 void *ptr_tbl[TEST_REPEAT_COUNT];
129 uint32_t output_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];
145 static args_t *gbl_args;
149 if (gbl_args == NULL)
154 static int bench_packet_export(
void *data)
156 args_t *gbl_args = data;
159 if (test_common_write(
"%s",
"Function name,64B,128B,256B,512B,1024B,1518B,2048B\n")) {
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])) {
178 test_common_write_term();
186 static int run_benchmarks(
void *arg)
190 bench_suite_t *suite = &args->suite;
191 int num_sizes = ODPH_ARRAY_SIZE(test_packet_len);
193 for (i = 0; i < num_sizes; i++) {
194 printf(
"Packet length: %6d bytes", test_packet_len[i]);
196 gbl_args->pkt.len = test_packet_len[i];
198 suite->result = args->result[i];
203 printf(
"\n%-35s",
"Benchmark / packet_size [B]");
204 for (i = 0; i < num_sizes; i++)
205 printf(
"%8.1d ", test_packet_len[i]);
207 printf(
"\n---------------------------------");
208 for (i = 0; i < num_sizes; i++)
209 printf(
"----------");
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);
215 for (
int j = 0; j < num_sizes; j++)
216 printf(
"%8.1f ", args->result[j][i]);
220 if (args->common_options.is_export) {
221 if (bench_packet_export(args)) {
222 ODPH_ERR(
"Error: Export failed\n");
230 static void allocate_test_packets(uint32_t len,
odp_packet_t pkt[],
int num)
240 ODPH_ABORT(
"Allocating test packets failed\n");
246 static void alloc_packets_half(
void)
248 allocate_test_packets(gbl_args->pkt.len / 2, gbl_args->pkt_tbl,
252 static void alloc_packets_multi(
void)
254 allocate_test_packets(gbl_args->pkt.len, gbl_args->pkt_tbl,
255 TEST_REPEAT_COUNT * gbl_args->appl.burst_size);
258 static void alloc_concat_packets(
void)
260 allocate_test_packets(gbl_args->pkt.len / 2, gbl_args->pkt_tbl,
262 allocate_test_packets(gbl_args->pkt.len / 2, gbl_args->pkt2_tbl,
266 static void alloc_ref_packets(
void)
272 allocate_test_packets(gbl_args->pkt.len, pkt_tbl, TEST_REPEAT_COUNT);
274 for (i = 0; i < TEST_REPEAT_COUNT; i++) {
277 ODPH_ABORT(
"Allocating packet reference failed\n");
281 static void alloc_packets_twice(
void)
283 allocate_test_packets(gbl_args->pkt.len, gbl_args->pkt_tbl,
285 allocate_test_packets(gbl_args->pkt.len, gbl_args->pkt2_tbl,
289 static void alloc_parse_packets(
const void *pkt_data, uint32_t len)
293 allocate_test_packets(len, gbl_args->pkt_tbl, TEST_REPEAT_COUNT);
295 for (i = 0; i < TEST_REPEAT_COUNT; i++) {
298 ODPH_ABORT(
"Copying test packet failed\n");
302 static void alloc_parse_packets_ipv4_tcp(
void)
304 alloc_parse_packets(test_packet_ipv4_tcp,
sizeof(test_packet_ipv4_tcp));
307 static void alloc_parse_packets_ipv4_udp(
void)
309 alloc_parse_packets(test_packet_ipv4_udp,
sizeof(test_packet_ipv4_udp));
312 static void alloc_parse_packets_ipv6_tcp(
void)
314 alloc_parse_packets(test_packet_ipv6_tcp,
sizeof(test_packet_ipv6_tcp));
317 static void alloc_parse_packets_ipv6_udp(
void)
319 alloc_parse_packets(test_packet_ipv6_udp,
sizeof(test_packet_ipv6_udp));
322 static void alloc_parse_packets_multi(
const void *pkt_data, uint32_t len)
326 allocate_test_packets(len, gbl_args->pkt_tbl,
327 TEST_REPEAT_COUNT * gbl_args->appl.burst_size);
329 for (i = 0; i < TEST_REPEAT_COUNT * gbl_args->appl.burst_size; i++) {
332 ODPH_ABORT(
"Copying test packet failed\n");
336 static void alloc_parse_packets_multi_ipv4_tcp(
void)
338 alloc_parse_packets_multi(test_packet_ipv4_tcp,
339 sizeof(test_packet_ipv4_tcp));
342 static void alloc_parse_packets_multi_ipv4_udp(
void)
344 alloc_parse_packets_multi(test_packet_ipv4_udp,
345 sizeof(test_packet_ipv4_udp));
348 static void alloc_parse_packets_multi_ipv6_tcp(
void)
350 alloc_parse_packets_multi(test_packet_ipv6_tcp,
351 sizeof(test_packet_ipv6_tcp));
354 static void alloc_parse_packets_multi_ipv6_udp(
void)
356 alloc_parse_packets_multi(test_packet_ipv6_udp,
357 sizeof(test_packet_ipv6_udp));
360 static void create_packets(
void)
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;
370 allocate_test_packets(gbl_args->pkt.len, gbl_args->pkt_tbl,
373 for (i = 0; i < TEST_REPEAT_COUNT; i++) {
381 min_headroom = headroom;
382 min_tailroom = tailroom;
383 min_seg_len = seg_len;
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;
396 ODPH_ABORT(
"Setting test packet offsets failed\n");
401 gbl_args->pkt.headroom = min_headroom;
402 gbl_args->pkt.tailroom = min_tailroom;
403 gbl_args->pkt.seg_len = min_seg_len;
406 static void create_events(
void)
413 for (i = 0; i < TEST_REPEAT_COUNT; i++)
417 static void create_events_multi(
void)
422 allocate_test_packets(gbl_args->pkt.len, gbl_args->pkt_tbl,
423 TEST_REPEAT_COUNT * gbl_args->appl.burst_size);
425 for (i = 0; i < TEST_REPEAT_COUNT * gbl_args->appl.burst_size; i++)
429 static void free_packets(
void)
434 static void free_packets_multi(
void)
437 TEST_REPEAT_COUNT * gbl_args->appl.burst_size);
440 static void free_packets_twice(
void)
446 static int packet_alloc(
void)
450 for (i = 0; i < TEST_REPEAT_COUNT; i++) {
455 gbl_args->pkt_tbl[i] = pkt;
461 static int packet_alloc_multi(
void)
466 for (i = 0; i < TEST_REPEAT_COUNT; i++)
469 &gbl_args->pkt_tbl[pkts],
470 gbl_args->appl.burst_size);
474 static int packet_free(
void)
478 for (i = 0; i < TEST_REPEAT_COUNT; i++)
484 static int event_free(
void)
488 for (i = 0; i < TEST_REPEAT_COUNT; i++)
494 static int packet_free_multi(
void)
498 for (i = 0; i < TEST_REPEAT_COUNT; i++) {
499 int pkt_idx = i * gbl_args->appl.burst_size;
502 gbl_args->appl.burst_size);
507 static int event_free_multi(
void)
511 for (i = 0; i < TEST_REPEAT_COUNT; i++) {
512 int pkt_idx = i * gbl_args->appl.burst_size;
515 gbl_args->appl.burst_size);
520 static int packet_free_sp(
void)
524 for (i = 0; i < TEST_REPEAT_COUNT; i++) {
525 int pkt_idx = i * gbl_args->appl.burst_size;
528 gbl_args->appl.burst_size);
533 static int event_free_sp(
void)
537 for (i = 0; i < TEST_REPEAT_COUNT; i++) {
538 int pkt_idx = i * gbl_args->appl.burst_size;
541 gbl_args->appl.burst_size);
546 static int packet_alloc_free(
void)
550 for (i = 0; i < TEST_REPEAT_COUNT; i++) {
560 static int packet_alloc_free_multi(
void)
565 for (i = 0; i < TEST_REPEAT_COUNT; i++) {
568 gbl_args->appl.burst_size);
571 ODPH_ABORT(
"Packet alloc failed\n");
578 static int packet_reset(
void)
583 for (i = 0; i < TEST_REPEAT_COUNT; i++)
589 static int packet_reset_meta(
void)
593 for (i = 0; i < TEST_REPEAT_COUNT; i++)
599 static int packet_reset_max_len(
void)
604 for (i = 0; i < TEST_REPEAT_COUNT; i++)
610 static int packet_from_event(
void)
615 for (i = 0; i < TEST_REPEAT_COUNT; i++)
621 static int packet_from_event_multi(
void)
625 for (i = 0; i < TEST_REPEAT_COUNT; i++) {
626 int idx = i * gbl_args->appl.burst_size;
629 &gbl_args->event_tbl[idx],
630 gbl_args->appl.burst_size);
635 static int packet_to_event(
void)
640 for (i = 0; i < TEST_REPEAT_COUNT; i++)
646 static int packet_to_event_multi(
void)
650 for (i = 0; i < TEST_REPEAT_COUNT; i++) {
651 int idx = i * gbl_args->appl.burst_size;
654 &gbl_args->event_tbl[idx],
655 gbl_args->appl.burst_size);
660 static int packet_head(
void)
664 for (i = 0; i < TEST_REPEAT_COUNT; i++)
670 static int packet_buf_len(
void)
675 for (i = 0; i < TEST_REPEAT_COUNT; i++)
681 static int packet_data(
void)
685 for (i = 0; i < TEST_REPEAT_COUNT; i++)
691 static int packet_data_seg_len(
void)
694 uint32_t *output_tbl = gbl_args->output_tbl;
697 for (i = 0; i < TEST_REPEAT_COUNT; i++)
703 static int packet_seg_len(
void)
708 for (i = 0; i < TEST_REPEAT_COUNT; i++)
714 static int packet_len(
void)
719 for (i = 0; i < TEST_REPEAT_COUNT; i++)
725 static int packet_headroom(
void)
730 for (i = 0; i < TEST_REPEAT_COUNT; i++)
736 static int packet_tailroom(
void)
741 for (i = 0; i < TEST_REPEAT_COUNT; i++)
747 static int packet_tail(
void)
751 for (i = 0; i < TEST_REPEAT_COUNT; i++)
757 static int packet_offset(
void)
760 uint32_t offset = gbl_args->pkt.len / 2;
762 for (i = 0; i < TEST_REPEAT_COUNT; i++)
768 static int packet_prefetch(
void)
772 for (i = 0; i < TEST_REPEAT_COUNT; i++)
778 static int packet_push_head(
void)
782 uint32_t hroom = gbl_args->pkt.headroom;
784 for (i = 0; i < TEST_REPEAT_COUNT; i++)
790 static int packet_pull_head(
void)
793 uint32_t len = gbl_args->pkt.seg_len - 1;
796 for (i = 0; i < TEST_REPEAT_COUNT; i++)
802 static int packet_push_tail(
void)
806 uint32_t troom = gbl_args->pkt.tailroom;
808 for (i = 0; i < TEST_REPEAT_COUNT; i++)
814 static int packet_pull_tail(
void)
817 uint32_t len = gbl_args->pkt.seg_len - 1;
820 for (i = 0; i < TEST_REPEAT_COUNT; i++)
826 static int packet_extend_head(
void)
830 uint32_t len = gbl_args->pkt.len / 2;
832 void **ptr_tbl = gbl_args->ptr_tbl;
833 uint32_t *data_tbl = gbl_args->output_tbl;
835 for (i = 0; i < TEST_REPEAT_COUNT; i++)
841 static int packet_trunc_head(
void)
845 uint32_t len = gbl_args->pkt.len / 2;
847 void **ptr_tbl = gbl_args->ptr_tbl;
848 uint32_t *data_tbl = gbl_args->output_tbl;
850 for (i = 0; i < TEST_REPEAT_COUNT; i++)
856 static int packet_extend_tail(
void)
860 uint32_t len = gbl_args->pkt.len / 2;
862 void **ptr_tbl = gbl_args->ptr_tbl;
863 uint32_t *data_tbl = gbl_args->output_tbl;
865 for (i = 0; i < TEST_REPEAT_COUNT; i++)
871 static int packet_trunc_tail(
void)
875 uint32_t len = gbl_args->pkt.len / 2;
877 void **ptr_tbl = gbl_args->ptr_tbl;
878 uint32_t *data_tbl = gbl_args->output_tbl;
880 for (i = 0; i < TEST_REPEAT_COUNT; i++)
886 static int packet_add_data(
void)
891 uint32_t len = gbl_args->pkt.len / 2;
893 for (i = 0; i < TEST_REPEAT_COUNT; i++)
899 static int packet_rem_data(
void)
904 uint32_t len = gbl_args->pkt.len / 2;
906 for (i = 0; i < TEST_REPEAT_COUNT; i++)
912 static int packet_align(
void)
918 for (i = 0; i < TEST_REPEAT_COUNT; i++)
920 TEST_ALIGN_LEN, TEST_ALIGN);
924 static int packet_is_segmented(
void)
929 for (i = 0; i < TEST_REPEAT_COUNT; i++)
932 return (ret == 0) ? 1 : ret;
935 static int packet_num_segs(
void)
940 for (i = 0; i < TEST_REPEAT_COUNT; i++)
946 static int packet_first_seg(
void)
951 for (i = 0; i < TEST_REPEAT_COUNT; i++)
957 static int packet_last_seg(
void)
962 for (i = 0; i < TEST_REPEAT_COUNT; i++)
968 static int packet_next_seg(
void)
974 for (i = 0; i < TEST_REPEAT_COUNT; i++)
980 static int packet_seg_data(
void)
986 for (i = 0; i < TEST_REPEAT_COUNT; i++)
992 static int packet_seg_data_len(
void)
999 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1005 static int packet_concat(
void)
1012 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1018 static int packet_split(
void)
1028 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1034 static int packet_copy(
void)
1040 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1046 static int packet_copy_part(
void)
1049 uint32_t len = gbl_args->pkt.len / 2;
1053 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1059 static int packet_copy_to_mem(
void)
1063 uint32_t len = gbl_args->pkt.len;
1066 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1068 gbl_args->data_tbl[i]);
1072 static int packet_copy_from_mem(
void)
1076 uint32_t len = gbl_args->pkt.len;
1079 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1081 gbl_args->data_tbl[i]);
1085 static int packet_copy_from_pkt(
void)
1089 uint32_t len = gbl_args->pkt.len;
1093 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1099 static int packet_copy_data(
void)
1103 uint32_t len = gbl_args->pkt.len / 2;
1106 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1112 static int packet_move_data(
void)
1116 uint32_t len = gbl_args->pkt.len / 2;
1117 uint32_t offset = len / 2;
1120 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1126 static int packet_pool(
void)
1130 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1136 static int event_pool(
void)
1140 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1146 static int packet_input(
void)
1150 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1156 static int packet_input_index(
void)
1161 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1164 return (ret == 0) ? 1 : ret;
1167 static int packet_user_ptr(
void)
1172 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1178 static int packet_user_ptr_set(
void)
1182 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1184 gbl_args->ptr_tbl[i]);
1189 static int packet_user_area(
void)
1194 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1200 static int event_user_area(
void)
1205 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1211 static int packet_user_area_size(
void)
1216 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1222 static int packet_user_flag(
void)
1227 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1233 static int event_user_area_and_flag(
void)
1236 void **ptr_tbl = gbl_args->ptr_tbl;
1240 for (
int i = 0; i < TEST_REPEAT_COUNT; i++) {
1248 static int packet_user_flag_set(
void)
1252 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1258 static int event_user_flag_set(
void)
1262 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1268 static int packet_l2_ptr(
void)
1272 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1278 static int packet_l2_offset(
void)
1283 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1289 static int packet_l2_offset_set(
void)
1293 uint32_t offset = gbl_args->pkt.len / 2;
1295 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1301 static int packet_l3_ptr(
void)
1305 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1311 static int packet_l3_offset(
void)
1316 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1322 static int packet_l3_offset_set(
void)
1326 uint32_t offset = gbl_args->pkt.len / 2;
1328 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1334 static int packet_l4_ptr(
void)
1338 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1344 static int packet_l4_offset(
void)
1349 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1355 static int packet_l4_offset_set(
void)
1359 uint32_t offset = gbl_args->pkt.len / 2;
1361 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1367 static int packet_flow_hash(
void)
1372 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1378 static int packet_flow_hash_set(
void)
1382 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1388 static int packet_ts(
void)
1392 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1398 static int packet_ts_set(
void)
1403 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1409 static int packet_ref_static(
void)
1415 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1421 static int packet_ref(
void)
1424 uint32_t offset = TEST_MIN_PKT_SIZE / 2;
1428 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1434 static int packet_ref_pkt(
void)
1437 uint32_t offset = TEST_MIN_PKT_SIZE / 2;
1441 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1447 static int packet_has_ref(
void)
1453 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1459 static int packet_subtype(
void)
1464 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1470 static int event_subtype(
void)
1475 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1481 static int packet_parse(
void)
1495 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1501 static int packet_parse_multi(
void)
1503 int burst_size = gbl_args->appl.burst_size;
1508 uint32_t offsets[burst_size];
1510 memset(&offsets, 0,
sizeof(offsets));
1519 for (i = 0; i < TEST_REPEAT_COUNT; i++) {
1520 int idx = i * burst_size;
1523 burst_size, ¶m);
1525 return (ret == TEST_REPEAT_COUNT * burst_size);
1531 static void usage(
char *progname)
1534 "OpenDataPlane Packet function microbenchmark.\n"
1536 "Usage: %s OPTIONS\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);
1556 static void parse_args(
int argc,
char *argv[], appl_args_t *appl_args)
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'},
1569 static const char *shortopts =
"c:b:i:r:t:h";
1571 appl_args->bench_idx = 0;
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;
1578 opt = getopt_long(argc, argv, shortopts, longopts, NULL);
1585 appl_args->cache_size = atoi(optarg);
1588 appl_args->burst_size = atoi(optarg);
1591 appl_args->bench_idx = atoi(optarg);
1594 appl_args->rounds = atoi(optarg);
1597 appl_args->time = atoi(optarg);
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);
1615 if (appl_args->rounds < 1) {
1616 printf(
"Invalid number test rounds: %d\n", appl_args->rounds);
1626 static void print_info(
char *progname, appl_args_t *appl_args
ODP_UNUSED)
1630 printf(
"Running ODP appl: \"%s\"\n"
1631 "-----------------\n", progname);
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"),
1745 "Result array is too small to hold all the results");
1750 int main(
int argc,
char *argv[])
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;
1765 uint32_t pkt_num, seg_len;
1769 argc = odph_parse_options(argc, argv);
1770 if (odph_options(&helper_options)) {
1771 ODPH_ERR(
"Error: reading ODP helper options failed.\n");
1775 argc = test_common_parse_options(argc, argv);
1776 if (test_common_options(&common_options)) {
1777 ODPH_ERR(
"Error: reading test options failed\n");
1782 init_param.
mem_model = helper_options.mem_model;
1786 ODPH_ERR(
"Error: ODP global init failed.\n");
1792 ODPH_ERR(
"Error: ODP local init failed.\n");
1798 ODP_CACHE_LINE_SIZE, 0);
1801 ODPH_ERR(
"Error: shared mem reserve failed.\n");
1807 if (gbl_args == NULL) {
1808 ODPH_ERR(
"Error: shared mem alloc failed.\n");
1812 memset(gbl_args, 0,
sizeof(args_t));
1814 gbl_args->common_options = common_options;
1817 parse_args(argc, argv, &gbl_args->appl);
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;
1828 print_info(NO_PATH(argv[0]), &gbl_args->appl);
1832 ODPH_ERR(
"Error: unable to allocate worker thread.\n");
1840 ODPH_ERR(
"Error: unable to query pool capability.\n");
1846 pkt_num = (gbl_args->appl.burst_size > 4) ?
1847 gbl_args->appl.burst_size * TEST_REPEAT_COUNT :
1848 4 * TEST_REPEAT_COUNT;
1851 ODPH_ERR(
"Error: packet pool size not supported.\n");
1852 printf(
"MAX: %" PRIu32
"\n", capa.
pkt.
max_num);
1856 ODPH_ERR(
"Error: packet length not supported.\n");
1860 ODPH_ERR(
"Error: user area size not supported.\n");
1863 ODPH_ERR(
"Error: cache size not supported (max %" PRIu32
")\n",
1868 seg_len = TEST_MAX_PKT_SIZE;
1871 printf(
"\nWarn: allocated packets may be segmented (min seg_len=%" PRIu32
")\n\n",
1882 params.
pkt.
len = 2 * TEST_MAX_PKT_SIZE;
1883 params.
pkt.
num = pkt_num;
1885 if (gbl_args->appl.cache_size >= 0)
1892 ODPH_ERR(
"Error: packet pool create failed.\n");
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");
1905 printf(
"Pool cache size: %d\n", gbl_args->appl.cache_size);
1909 memset(&worker_thread, 0,
sizeof(odph_thread_t));
1911 signal(SIGINT, sig_handler);
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;
1926 odph_thread_param_init(&thr_param);
1927 thr_param.start = run_benchmarks;
1928 thr_param.arg = gbl_args;
1931 odph_thread_create(&worker_thread, &thr_common, &thr_param, 1);
1933 odph_thread_join(&worker_thread, 1);
1935 ret = gbl_args->suite.retval;
1938 ODPH_ERR(
"Error: pool destroy\n");
1945 ODPH_ERR(
"Error: shm free\n");
1950 ODPH_ERR(
"Error: term local\n");
1955 ODPH_ERR(
"Error: term global\n");
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.
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.
Global initialization parameters.
odp_mem_model_t mem_model
Application memory model.
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.
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.