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
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 200
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}
81const 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");
125 odp_packet_t pkt_tbl[TEST_REPEAT_COUNT * TEST_MAX_BURST];
129 odp_event_t event_tbl[TEST_REPEAT_COUNT * TEST_MAX_BURST];
131 void *ptr_tbl[TEST_REPEAT_COUNT];
135 uint32_t output_tbl[TEST_REPEAT_COUNT];
143 uint8_t data_tbl[TEST_REPEAT_COUNT][TEST_MAX_PKT_SIZE];
145 test_common_options_t common_options;
147 double result[TEST_MAX_SIZES][TEST_MAX_BENCH];
151static args_t *gbl_args;
155 if (gbl_args == NULL)
160static int bench_packet_export(
void *data)
162 args_t *gbl_args = data;
165 if (test_common_write(
"%s",
"function name,64B,128B,256B,512B,1024B,1518B,2048B\n")) {
170 for (
int i = 0; i < gbl_args->suite.num_bench; i++) {
171 if (test_common_write(
"odp_%s,%f,%f,%f,%f,%f,%f,%f\n",
172 gbl_args->suite.bench[i].desc != NULL ?
173 gbl_args->suite.bench[i].desc : gbl_args->suite.bench[i].name,
174 gbl_args->result[0][i], gbl_args->result[1][i],
175 gbl_args->result[2][i], gbl_args->result[3][i],
176 gbl_args->result[4][i], gbl_args->result[5][i],
177 gbl_args->result[6][i])) {
184 test_common_write_term();
192static int run_benchmarks(
void *arg)
196 bench_suite_t *suite = &args->suite;
197 int num_sizes = ODPH_ARRAY_SIZE(test_packet_len);
199 for (i = 0; i < num_sizes; i++) {
200 printf(
"Packet length: %6d bytes", test_packet_len[i]);
202 gbl_args->pkt.len = test_packet_len[i];
204 suite->result = args->result[i];
209 printf(
"\n%-35s",
"Benchmark / packet_size [B]");
210 for (i = 0; i < num_sizes; i++)
211 printf(
"%8.1d ", test_packet_len[i]);
213 printf(
"\n---------------------------------");
214 for (i = 0; i < num_sizes; i++)
215 printf(
"----------");
217 for (i = 0; i < suite->num_bench; i++) {
218 printf(
"\n[%02d] odp_%-26s", i + 1, suite->bench[i].desc != NULL ?
219 suite->bench[i].desc : suite->bench[i].name);
221 for (
int j = 0; j < num_sizes; j++)
222 printf(
"%8.1f ", args->result[j][i]);
226 if (args->common_options.is_export) {
227 if (bench_packet_export(args)) {
228 ODPH_ERR(
"Error: Export failed\n");
236static void allocate_test_packets(uint32_t len,
odp_packet_t pkt[],
int num)
246 ODPH_ABORT(
"Allocating test packets failed\n");
252static void alloc_packets_half(
void)
254 allocate_test_packets(gbl_args->pkt.len / 2, gbl_args->pkt_tbl,
258static void alloc_packets_multi(
void)
260 allocate_test_packets(gbl_args->pkt.len, gbl_args->pkt_tbl,
261 TEST_REPEAT_COUNT * gbl_args->appl.burst_size);
264static void alloc_concat_packets(
void)
266 allocate_test_packets(gbl_args->pkt.len / 2, gbl_args->pkt_tbl,
268 allocate_test_packets(gbl_args->pkt.len / 2, gbl_args->pkt2_tbl,
272static void alloc_ref_packets(
void)
278 allocate_test_packets(gbl_args->pkt.len, pkt_tbl, TEST_REPEAT_COUNT);
280 for (i = 0; i < TEST_REPEAT_COUNT; i++) {
283 ODPH_ABORT(
"Allocating packet reference failed\n");
287static void alloc_packets_twice(
void)
289 allocate_test_packets(gbl_args->pkt.len, gbl_args->pkt_tbl,
291 allocate_test_packets(gbl_args->pkt.len, gbl_args->pkt2_tbl,
295typedef struct test_packet_t {
300test_packet_t test_packets[] = {
301 {test_packet_arp,
sizeof(test_packet_arp)},
302 {test_packet_ipv4_icmp,
sizeof(test_packet_ipv4_icmp)},
303 {test_packet_ipv6_icmp,
sizeof(test_packet_ipv6_icmp)},
304 {test_packet_ipv4_tcp,
sizeof(test_packet_ipv4_tcp)},
305 {test_packet_ipv6_tcp,
sizeof(test_packet_ipv6_tcp)},
306 {test_packet_ipv4_udp,
sizeof(test_packet_ipv4_udp)},
307 {test_packet_ipv6_udp,
sizeof(test_packet_ipv6_udp)},
308 {test_packet_ipv4_sctp,
sizeof(test_packet_ipv4_sctp)},
309 {test_packet_ipv6_sctp,
sizeof(test_packet_ipv6_sctp)},
310 {test_packet_vlan_ipv4_udp,
sizeof(test_packet_vlan_ipv4_udp)},
311 {test_packet_mcast_eth_ipv4_udp,
sizeof(test_packet_mcast_eth_ipv4_udp)},
312 {test_packet_mcast_eth_ipv6_udp,
sizeof(test_packet_mcast_eth_ipv6_udp)},
313 {test_packet_ipv4_udp_last_frag,
sizeof(test_packet_ipv4_udp_last_frag)},
316static uint32_t rnd(
void)
318 static uint64_t s = 1;
319 uint64_t prime = 0x7fffffff;
321 s = (0x12345678 * s) % prime;
325static void create_packets_misc(
void)
327 int num_types = ODPH_ARRAY_SIZE(test_packets);
329 for (
int i = 0; i < TEST_REPEAT_COUNT; i++) {
330 test_packet_t *tp = &test_packets[rnd() % num_types];
335 ODPH_ABORT(
"Allocating test packets failed\n");
337 ODPH_ABORT(
"Copying test packet failed\n");
341static void create_packets_misc_parsed(
void)
346 .chksums.all_chksum = 0
349 create_packets_misc();
350 for (
int i = 0; i < TEST_REPEAT_COUNT; i++) {
352 ODPH_ABORT(
"Packet parsing failed\n");
356static void alloc_parse_packets(
const void *pkt_data, uint32_t len)
360 allocate_test_packets(len, gbl_args->pkt_tbl, TEST_REPEAT_COUNT);
362 for (i = 0; i < TEST_REPEAT_COUNT; i++) {
365 ODPH_ABORT(
"Copying test packet failed\n");
369static void alloc_parse_packets_ipv4_tcp(
void)
371 alloc_parse_packets(test_packet_ipv4_tcp,
sizeof(test_packet_ipv4_tcp));
374static void alloc_parse_packets_ipv4_udp(
void)
376 alloc_parse_packets(test_packet_ipv4_udp,
sizeof(test_packet_ipv4_udp));
379static void alloc_parse_packets_ipv6_tcp(
void)
381 alloc_parse_packets(test_packet_ipv6_tcp,
sizeof(test_packet_ipv6_tcp));
384static void alloc_parse_packets_ipv6_udp(
void)
386 alloc_parse_packets(test_packet_ipv6_udp,
sizeof(test_packet_ipv6_udp));
389static void alloc_parse_packets_multi(
const void *pkt_data, uint32_t len)
393 allocate_test_packets(len, gbl_args->pkt_tbl,
394 TEST_REPEAT_COUNT * gbl_args->appl.burst_size);
396 for (i = 0; i < TEST_REPEAT_COUNT * gbl_args->appl.burst_size; i++) {
399 ODPH_ABORT(
"Copying test packet failed\n");
403static void alloc_parse_packets_multi_ipv4_tcp(
void)
405 alloc_parse_packets_multi(test_packet_ipv4_tcp,
406 sizeof(test_packet_ipv4_tcp));
409static void alloc_parse_packets_multi_ipv4_udp(
void)
411 alloc_parse_packets_multi(test_packet_ipv4_udp,
412 sizeof(test_packet_ipv4_udp));
415static void alloc_parse_packets_multi_ipv6_tcp(
void)
417 alloc_parse_packets_multi(test_packet_ipv6_tcp,
418 sizeof(test_packet_ipv6_tcp));
421static void alloc_parse_packets_multi_ipv6_udp(
void)
423 alloc_parse_packets_multi(test_packet_ipv6_udp,
424 sizeof(test_packet_ipv6_udp));
427static void create_packets(
void)
430 uint32_t headroom, tailroom, seg_len;
431 uint32_t min_headroom = 0;
432 uint32_t min_tailroom = 0;
433 uint32_t min_seg_len = 0;
437 allocate_test_packets(gbl_args->pkt.len, gbl_args->pkt_tbl,
440 for (i = 0; i < TEST_REPEAT_COUNT; i++) {
448 min_headroom = headroom;
449 min_tailroom = tailroom;
450 min_seg_len = seg_len;
452 if (headroom < min_headroom)
453 min_headroom = headroom;
454 if (tailroom < min_tailroom)
455 min_tailroom = tailroom;
456 if (seg_len < min_seg_len)
457 min_seg_len = seg_len;
463 ODPH_ABORT(
"Setting test packet offsets failed\n");
468 gbl_args->pkt.headroom = min_headroom;
469 gbl_args->pkt.tailroom = min_tailroom;
470 gbl_args->pkt.seg_len = min_seg_len;
473static int num_misc_event_types = 4;
475static void create_events_misc(
void)
486 ODPH_ABORT(
"Packet alloc failed\n");
490 ODPH_ABORT(
"Buffer alloc failed\n");
494 ODPH_ABORT(
"Timeout alloc failed\n");
503 ODPH_ABORT(
"Event vector alloc failed\n");
506 num_misc_event_types = 3;
509 for (i = 0; i < num_misc_event_types; i++)
510 gbl_args->event_tbl[i] = events[i];
511 for (; i < TEST_REPEAT_COUNT; i++)
512 gbl_args->event_tbl[i] = events[rnd() % num_misc_event_types];
515static void free_events_misc(
void)
517 for (
int i = 0; i < num_misc_event_types; i++)
521static void create_events(
void)
528 for (i = 0; i < TEST_REPEAT_COUNT; i++)
532static void create_events_multi(
void)
537 allocate_test_packets(gbl_args->pkt.len, gbl_args->pkt_tbl,
538 TEST_REPEAT_COUNT * gbl_args->appl.burst_size);
540 for (i = 0; i < TEST_REPEAT_COUNT * gbl_args->appl.burst_size; i++)
544static void free_packets(
void)
549static void free_packets_multi(
void)
552 TEST_REPEAT_COUNT * gbl_args->appl.burst_size);
555static void free_packets_twice(
void)
561static int packet_alloc(
void)
565 for (i = 0; i < TEST_REPEAT_COUNT; i++) {
570 gbl_args->pkt_tbl[i] = pkt;
576static int packet_alloc_multi(
void)
581 for (i = 0; i < TEST_REPEAT_COUNT; i++)
584 &gbl_args->pkt_tbl[pkts],
585 gbl_args->appl.burst_size);
589static int packet_free(
void)
593 for (i = 0; i < TEST_REPEAT_COUNT; i++)
599static int event_free(
void)
603 for (i = 0; i < TEST_REPEAT_COUNT; i++)
609static int packet_free_multi(
void)
613 for (i = 0; i < TEST_REPEAT_COUNT; i++) {
614 int pkt_idx = i * gbl_args->appl.burst_size;
617 gbl_args->appl.burst_size);
622static int event_free_multi(
void)
626 for (i = 0; i < TEST_REPEAT_COUNT; i++) {
627 int pkt_idx = i * gbl_args->appl.burst_size;
630 gbl_args->appl.burst_size);
635static int packet_free_sp(
void)
639 for (i = 0; i < TEST_REPEAT_COUNT; i++) {
640 int pkt_idx = i * gbl_args->appl.burst_size;
643 gbl_args->appl.burst_size);
648static int event_free_sp(
void)
652 for (i = 0; i < TEST_REPEAT_COUNT; i++) {
653 int pkt_idx = i * gbl_args->appl.burst_size;
656 gbl_args->appl.burst_size);
661static int packet_alloc_free(
void)
665 for (i = 0; i < TEST_REPEAT_COUNT; i++) {
675static int packet_alloc_free_multi(
void)
680 for (i = 0; i < TEST_REPEAT_COUNT; i++) {
683 gbl_args->appl.burst_size);
686 ODPH_ABORT(
"Packet alloc failed\n");
693static int packet_reset(
void)
698 for (i = 0; i < TEST_REPEAT_COUNT; i++)
704static int packet_reset_meta(
void)
708 for (i = 0; i < TEST_REPEAT_COUNT; i++)
714static int packet_reset_max_len(
void)
719 for (i = 0; i < TEST_REPEAT_COUNT; i++)
725static int packet_from_event(
void)
730 for (i = 0; i < TEST_REPEAT_COUNT; i++)
736static int packet_from_event_multi(
void)
740 for (i = 0; i < TEST_REPEAT_COUNT; i++) {
741 int idx = i * gbl_args->appl.burst_size;
744 &gbl_args->event_tbl[idx],
745 gbl_args->appl.burst_size);
750static int packet_to_event(
void)
755 for (i = 0; i < TEST_REPEAT_COUNT; i++)
761static int packet_to_event_multi(
void)
765 for (i = 0; i < TEST_REPEAT_COUNT; i++) {
766 int idx = i * gbl_args->appl.burst_size;
769 &gbl_args->event_tbl[idx],
770 gbl_args->appl.burst_size);
775static int packet_head(
void)
779 for (i = 0; i < TEST_REPEAT_COUNT; i++)
785static int packet_buf_len(
void)
790 for (i = 0; i < TEST_REPEAT_COUNT; i++)
796static int packet_data(
void)
800 for (i = 0; i < TEST_REPEAT_COUNT; i++)
806static int packet_data_seg_len(
void)
809 uint32_t *output_tbl = gbl_args->output_tbl;
812 for (i = 0; i < TEST_REPEAT_COUNT; i++)
818static int packet_seg_len(
void)
823 for (i = 0; i < TEST_REPEAT_COUNT; i++)
829static int packet_len(
void)
834 for (i = 0; i < TEST_REPEAT_COUNT; i++)
840static int packet_headroom(
void)
845 for (i = 0; i < TEST_REPEAT_COUNT; i++)
851static int packet_tailroom(
void)
856 for (i = 0; i < TEST_REPEAT_COUNT; i++)
862static int packet_tail(
void)
866 for (i = 0; i < TEST_REPEAT_COUNT; i++)
872static int packet_offset(
void)
875 uint32_t offset = gbl_args->pkt.len / 2;
877 for (i = 0; i < TEST_REPEAT_COUNT; i++)
883static int packet_prefetch(
void)
887 for (i = 0; i < TEST_REPEAT_COUNT; i++)
893static int packet_push_head(
void)
897 uint32_t hroom = gbl_args->pkt.headroom;
899 for (i = 0; i < TEST_REPEAT_COUNT; i++)
905static int packet_pull_head(
void)
908 uint32_t len = gbl_args->pkt.seg_len - 1;
911 for (i = 0; i < TEST_REPEAT_COUNT; i++)
917static int packet_push_tail(
void)
921 uint32_t troom = gbl_args->pkt.tailroom;
923 for (i = 0; i < TEST_REPEAT_COUNT; i++)
929static int packet_pull_tail(
void)
932 uint32_t len = gbl_args->pkt.seg_len - 1;
935 for (i = 0; i < TEST_REPEAT_COUNT; i++)
941static int packet_extend_head(
void)
945 uint32_t len = gbl_args->pkt.len / 2;
947 void **ptr_tbl = gbl_args->ptr_tbl;
948 uint32_t *data_tbl = gbl_args->output_tbl;
950 for (i = 0; i < TEST_REPEAT_COUNT; i++)
956static int packet_trunc_head(
void)
960 uint32_t len = gbl_args->pkt.len / 2;
962 void **ptr_tbl = gbl_args->ptr_tbl;
963 uint32_t *data_tbl = gbl_args->output_tbl;
965 for (i = 0; i < TEST_REPEAT_COUNT; i++)
971static int packet_extend_tail(
void)
975 uint32_t len = gbl_args->pkt.len / 2;
977 void **ptr_tbl = gbl_args->ptr_tbl;
978 uint32_t *data_tbl = gbl_args->output_tbl;
980 for (i = 0; i < TEST_REPEAT_COUNT; i++)
986static int packet_trunc_tail(
void)
990 uint32_t len = gbl_args->pkt.len / 2;
992 void **ptr_tbl = gbl_args->ptr_tbl;
993 uint32_t *data_tbl = gbl_args->output_tbl;
995 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1001static int packet_add_data(
void)
1006 uint32_t len = gbl_args->pkt.len / 2;
1008 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1014static int packet_rem_data(
void)
1019 uint32_t len = gbl_args->pkt.len / 2;
1021 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1027static int packet_align(
void)
1033 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1035 TEST_ALIGN_LEN, TEST_ALIGN);
1039static int packet_is_segmented(
void)
1044 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1047 return (ret == 0) ? 1 : ret;
1050static int packet_num_segs(
void)
1055 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1061static int packet_first_seg(
void)
1066 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1072static int packet_last_seg(
void)
1077 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1083static int packet_next_seg(
void)
1089 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1095static int packet_seg_data(
void)
1101 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1107static int packet_seg_data_len(
void)
1114 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1120static int packet_concat(
void)
1127 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1133static int packet_split(
void)
1143 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1149static int packet_copy(
void)
1155 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1161static int packet_copy_part(
void)
1164 uint32_t len = gbl_args->pkt.len / 2;
1168 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1174static int packet_copy_to_mem(
void)
1178 uint32_t len = gbl_args->pkt.len;
1181 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1183 gbl_args->data_tbl[i]);
1187static int packet_copy_from_mem(
void)
1191 uint32_t len = gbl_args->pkt.len;
1194 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1196 gbl_args->data_tbl[i]);
1200static int packet_copy_from_pkt(
void)
1204 uint32_t len = gbl_args->pkt.len;
1208 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1214static int packet_copy_data(
void)
1218 uint32_t len = gbl_args->pkt.len / 2;
1221 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1227static int packet_move_data(
void)
1231 uint32_t len = gbl_args->pkt.len / 2;
1232 uint32_t offset = len / 2;
1235 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1241static int packet_pool(
void)
1245 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1251static int event_pool(
void)
1255 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1261static int packet_input(
void)
1265 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1271static int packet_input_index(
void)
1276 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1279 return (ret == 0) ? 1 : ret;
1282static int packet_user_ptr(
void)
1287 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1293static int packet_user_ptr_set(
void)
1297 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1299 gbl_args->ptr_tbl[i]);
1304static int packet_user_area(
void)
1309 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1315static int event_user_area(
void)
1320 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1326static int packet_user_area_size(
void)
1331 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1337static int packet_user_flag(
void)
1342 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1348static int event_user_area_and_flag(
void)
1351 void **ptr_tbl = gbl_args->ptr_tbl;
1355 for (
int i = 0; i < TEST_REPEAT_COUNT; i++) {
1363static int packet_user_flag_set(
void)
1367 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1373static int event_user_flag_set(
void)
1377 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1383#define DEF_FLAG_TEST_FUN(name, func) \
1384static int name(void) \
1388 for (int i = 0; i < TEST_REPEAT_COUNT; i++) \
1389 ret += func(gbl_args->pkt_tbl[i]); \
1391 return ret <= TEST_REPEAT_COUNT; \
1422static int packet_l2_type(
void)
1426 for (
int i = 0; i < TEST_REPEAT_COUNT; i++)
1432static int packet_l2_ptr(
void)
1436 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1442static int packet_l2_offset(
void)
1447 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1453static int packet_l2_offset_set(
void)
1457 uint32_t offset = gbl_args->pkt.len / 2;
1459 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1465static int packet_l3_type(
void)
1469 for (
int i = 0; i < TEST_REPEAT_COUNT; i++)
1475static int packet_l3_ptr(
void)
1479 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1485static int packet_l3_offset(
void)
1490 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1496static int packet_l3_offset_set(
void)
1500 uint32_t offset = gbl_args->pkt.len / 2;
1502 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1508static int packet_l4_type(
void)
1512 for (
int i = 0; i < TEST_REPEAT_COUNT; i++)
1518static int packet_l4_ptr(
void)
1522 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1528static int packet_l4_offset(
void)
1533 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1539static int packet_l4_offset_set(
void)
1543 uint32_t offset = gbl_args->pkt.len / 2;
1545 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1551static int packet_flow_hash(
void)
1556 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1562static int packet_flow_hash_set(
void)
1566 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1572static int packet_ts(
void)
1576 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1582static int packet_ts_set(
void)
1587 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1593static int packet_ref_static(
void)
1599 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1605static int packet_ref(
void)
1608 uint32_t offset = TEST_MIN_PKT_SIZE / 2;
1612 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1618static int packet_ref_pkt(
void)
1621 uint32_t offset = TEST_MIN_PKT_SIZE / 2;
1625 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1631static int packet_has_ref(
void)
1637 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1643static int packet_is_referencing(
void)
1649 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1655static int packet_subtype(
void)
1660 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1666static int event_subtype(
void)
1671 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1677static int do_packet_parse(
int chksum)
1691 for (i = 0; i < TEST_REPEAT_COUNT; i++)
1697static int packet_parse(
void)
1699 return do_packet_parse(1);
1702static int packet_parse_no_chksum(
void)
1704 return do_packet_parse(0);
1707static int packet_parse_multi(
void)
1709 int burst_size = gbl_args->appl.burst_size;
1714 uint32_t offsets[burst_size];
1716 memset(&offsets, 0,
sizeof(offsets));
1725 for (i = 0; i < TEST_REPEAT_COUNT; i++) {
1726 int idx = i * burst_size;
1729 burst_size, ¶m);
1731 return (ret == TEST_REPEAT_COUNT * burst_size);
1737static void usage(
char *progname)
1740 "OpenDataPlane Packet function microbenchmark.\n"
1742 "Usage: %s OPTIONS\n"
1745 "Optional OPTIONS:\n"
1746 " -b, --burst <num> Test packet burst size.\n"
1747 " -c, --cache_size <num> Pool cache size.\n"
1748 " -i, --index <idx> Benchmark index to run indefinitely.\n"
1749 " -r, --rounds <num> Run each test case 'num' times (default %u).\n"
1750 " -t, --time <opt> Time measurement. 0: measure CPU cycles (default), 1: measure time\n"
1751 " -h, --help Display help and exit.\n\n"
1752 "\n", NO_PATH(progname), NO_PATH(progname), TEST_ROUNDS);
1762static void parse_args(
int argc,
char *argv[], appl_args_t *appl_args)
1765 static const struct option longopts[] = {
1766 {
"burst", required_argument, NULL,
'b'},
1767 {
"cache_size", required_argument, NULL,
'c'},
1768 {
"index", required_argument, NULL,
'i'},
1769 {
"rounds", required_argument, NULL,
'r'},
1770 {
"time", required_argument, NULL,
't'},
1771 {
"help", no_argument, NULL,
'h'},
1775 static const char *shortopts =
"c:b:i:r:t:h";
1777 appl_args->bench_idx = 0;
1778 appl_args->burst_size = TEST_DEF_BURST;
1779 appl_args->cache_size = -1;
1780 appl_args->rounds = TEST_ROUNDS;
1781 appl_args->time = 0;
1784 opt = getopt_long(argc, argv, shortopts, longopts, NULL);
1791 appl_args->cache_size = atoi(optarg);
1794 appl_args->burst_size = atoi(optarg);
1797 appl_args->bench_idx = atoi(optarg);
1800 appl_args->rounds = atoi(optarg);
1803 appl_args->time = atoi(optarg);
1815 if (appl_args->burst_size < 1 ||
1816 appl_args->burst_size > TEST_MAX_BURST) {
1817 printf(
"Invalid burst size (max %d)\n", TEST_MAX_BURST);
1821 if (appl_args->rounds < 1) {
1822 printf(
"Invalid number test rounds: %d\n", appl_args->rounds);
1832static void print_info(
char *progname, appl_args_t *appl_args
ODP_UNUSED)
1836 printf(
"Running ODP appl: \"%s\"\n"
1837 "-----------------\n", progname);
1844bench_info_t test_suite[] = {
1845 BENCH_INFO(packet_alloc, NULL, free_packets, NULL),
1846 BENCH_INFO(packet_alloc_multi, NULL, free_packets_multi, NULL),
1847 BENCH_INFO(packet_free, create_packets, NULL, NULL),
1848 BENCH_INFO(event_free, create_events, NULL, NULL),
1849 BENCH_INFO(packet_free_multi, alloc_packets_multi, NULL, NULL),
1850 BENCH_INFO(event_free_multi, create_events_multi, NULL, NULL),
1851 BENCH_INFO(packet_free_sp, alloc_packets_multi, NULL, NULL),
1852 BENCH_INFO(event_free_sp, create_events_multi, NULL, NULL),
1853 BENCH_INFO(packet_alloc_free, NULL, NULL, NULL),
1854 BENCH_INFO(packet_alloc_free_multi, NULL, NULL, NULL),
1855 BENCH_INFO(packet_reset, create_packets, free_packets, NULL),
1856 BENCH_INFO(packet_reset_meta, create_packets, free_packets, NULL),
1857 BENCH_INFO(packet_reset_max_len, create_packets, free_packets, NULL),
1858 BENCH_INFO(packet_from_event, create_events, free_packets, NULL),
1859 BENCH_INFO(packet_from_event_multi, create_events_multi, free_packets_multi, NULL),
1860 BENCH_INFO(packet_to_event, create_packets, free_packets, NULL),
1861 BENCH_INFO(packet_to_event_multi, alloc_packets_multi, free_packets_multi, NULL),
1862 BENCH_INFO(packet_head, create_packets, free_packets, NULL),
1863 BENCH_INFO(packet_buf_len, create_packets, free_packets, NULL),
1864 BENCH_INFO(packet_data, create_packets, free_packets, NULL),
1865 BENCH_INFO(packet_data_seg_len, create_packets, free_packets, NULL),
1866 BENCH_INFO(packet_seg_len, create_packets, free_packets, NULL),
1867 BENCH_INFO(packet_len, create_packets, free_packets, NULL),
1868 BENCH_INFO(packet_headroom, create_packets, free_packets, NULL),
1869 BENCH_INFO(packet_tailroom, create_packets, free_packets, NULL),
1870 BENCH_INFO(packet_tail, create_packets, free_packets, NULL),
1871 BENCH_INFO(packet_offset, create_packets, free_packets, NULL),
1872 BENCH_INFO(packet_prefetch, create_packets, free_packets, NULL),
1873 BENCH_INFO(packet_push_head, create_packets, free_packets, NULL),
1874 BENCH_INFO(packet_pull_head, create_packets, free_packets, NULL),
1875 BENCH_INFO(packet_push_tail, create_packets, free_packets, NULL),
1876 BENCH_INFO(packet_pull_tail, create_packets, free_packets, NULL),
1877 BENCH_INFO(packet_extend_head, alloc_packets_half, free_packets, NULL),
1878 BENCH_INFO(packet_trunc_head, create_packets, free_packets, NULL),
1879 BENCH_INFO(packet_extend_tail, alloc_packets_half, free_packets, NULL),
1880 BENCH_INFO(packet_trunc_tail, create_packets, free_packets, NULL),
1881 BENCH_INFO(packet_add_data, alloc_packets_half, free_packets, NULL),
1882 BENCH_INFO(packet_rem_data, create_packets, free_packets, NULL),
1883 BENCH_INFO(packet_align, create_packets, free_packets, NULL),
1884 BENCH_INFO(packet_is_segmented, create_packets, free_packets, NULL),
1885 BENCH_INFO(packet_num_segs, create_packets, free_packets, NULL),
1886 BENCH_INFO(packet_first_seg, create_packets, free_packets, NULL),
1887 BENCH_INFO(packet_last_seg, create_packets, free_packets, NULL),
1888 BENCH_INFO(packet_next_seg, create_packets, free_packets, NULL),
1889 BENCH_INFO(packet_seg_data, create_packets, free_packets, NULL),
1890 BENCH_INFO(packet_seg_data_len, create_packets, free_packets, NULL),
1891 BENCH_INFO(packet_concat, alloc_concat_packets, free_packets, NULL),
1892 BENCH_INFO(packet_split, create_packets, free_packets_twice, NULL),
1893 BENCH_INFO(packet_copy, create_packets, free_packets_twice, NULL),
1894 BENCH_INFO(packet_copy_part, create_packets, free_packets_twice, NULL),
1895 BENCH_INFO(packet_copy_to_mem, create_packets, free_packets, NULL),
1896 BENCH_INFO(packet_copy_from_mem, create_packets, free_packets, NULL),
1897 BENCH_INFO(packet_copy_from_pkt, alloc_packets_twice, free_packets_twice, NULL),
1898 BENCH_INFO(packet_copy_data, create_packets, free_packets, NULL),
1899 BENCH_INFO(packet_move_data, create_packets, free_packets, NULL),
1900 BENCH_INFO(packet_pool, create_packets, free_packets, NULL),
1901 BENCH_INFO(event_pool, create_events, free_packets, NULL),
1902 BENCH_INFO(packet_input, create_packets, free_packets, NULL),
1903 BENCH_INFO(packet_input_index, create_packets, free_packets, NULL),
1904 BENCH_INFO(packet_user_ptr, create_packets, free_packets, NULL),
1905 BENCH_INFO(packet_user_ptr_set, create_packets, free_packets, NULL),
1906 BENCH_INFO(packet_user_area, create_packets, free_packets, NULL),
1907 BENCH_INFO(event_user_area, create_events, free_packets, NULL),
1908 BENCH_INFO(event_user_area, create_events_misc, free_events_misc,
1909 "event_user_area_misc"),
1910 BENCH_INFO(packet_user_area_size, create_packets, free_packets, NULL),
1911 BENCH_INFO(packet_user_flag, create_packets, free_packets, NULL),
1912 BENCH_INFO(event_user_area_and_flag, create_events, free_packets, NULL),
1913 BENCH_INFO(event_user_area_and_flag, create_events_misc, free_events_misc,
1914 "event_user_area_and_flag_misc"),
1915 BENCH_INFO(packet_user_flag_set, create_packets, free_packets, NULL),
1916 BENCH_INFO(event_user_flag_set, create_events, free_packets, NULL),
1917 BENCH_INFO(event_user_flag_set, create_events_misc, free_events_misc,
1918 "event_user_flag_set_misc"),
1920#define BINFO(fun) BENCH_INFO(fun, create_packets_misc_parsed, free_packets, NULL)
1921 BINFO(packet_has_error),
1922 BINFO(packet_has_l2_error),
1923 BINFO(packet_has_l3_error),
1924 BINFO(packet_has_l4_error),
1925 BINFO(packet_has_l2),
1926 BINFO(packet_has_l3),
1927 BINFO(packet_has_l4),
1928 BINFO(packet_has_eth),
1929 BINFO(packet_has_eth_bcast),
1930 BINFO(packet_has_eth_mcast),
1931 BINFO(packet_has_jumbo),
1932 BINFO(packet_has_vlan),
1933 BINFO(packet_has_vlan_qinq),
1934 BINFO(packet_has_arp),
1935 BINFO(packet_has_ipv4),
1936 BINFO(packet_has_ipv6),
1937 BINFO(packet_has_ip_bcast),
1938 BINFO(packet_has_ip_mcast),
1939 BINFO(packet_has_ipfrag),
1940 BINFO(packet_has_ipopt),
1941 BINFO(packet_has_ipsec),
1942 BINFO(packet_has_udp),
1943 BINFO(packet_has_tcp),
1944 BINFO(packet_has_sctp),
1945 BINFO(packet_has_icmp),
1946 BINFO(packet_has_flow_hash),
1947 BINFO(packet_has_ts),
1949 BENCH_INFO(packet_l2_type, create_packets_misc_parsed, free_packets, NULL),
1950 BENCH_INFO(packet_l2_ptr, create_packets, free_packets, NULL),
1951 BENCH_INFO(packet_l2_offset, create_packets, free_packets, NULL),
1952 BENCH_INFO(packet_l2_offset_set, create_packets, free_packets, NULL),
1953 BENCH_INFO(packet_l3_type, create_packets_misc_parsed, free_packets, NULL),
1954 BENCH_INFO(packet_l3_ptr, create_packets, free_packets, NULL),
1955 BENCH_INFO(packet_l3_offset, create_packets, free_packets, NULL),
1956 BENCH_INFO(packet_l3_offset_set, create_packets, free_packets, NULL),
1957 BENCH_INFO(packet_l4_type, create_packets_misc_parsed, free_packets, NULL),
1958 BENCH_INFO(packet_l4_ptr, create_packets, free_packets, NULL),
1959 BENCH_INFO(packet_l4_offset, create_packets, free_packets, NULL),
1960 BENCH_INFO(packet_l4_offset_set, create_packets, free_packets, NULL),
1961 BENCH_INFO(packet_flow_hash, create_packets, free_packets, NULL),
1962 BENCH_INFO(packet_flow_hash_set, create_packets, free_packets, NULL),
1963 BENCH_INFO(packet_ts, create_packets, free_packets, NULL),
1964 BENCH_INFO(packet_ts_set, create_packets, free_packets, NULL),
1965 BENCH_INFO(packet_ref_static, create_packets, free_packets_twice, NULL),
1966 BENCH_INFO(packet_ref, create_packets, free_packets_twice, NULL),
1967 BENCH_INFO(packet_ref_pkt, alloc_packets_twice, free_packets_twice, NULL),
1968 BENCH_INFO(packet_has_ref, alloc_ref_packets, free_packets_twice, NULL),
1969 BENCH_INFO(packet_is_referencing, alloc_ref_packets, free_packets_twice, NULL),
1970 BENCH_INFO(packet_subtype, create_packets, free_packets, NULL),
1971 BENCH_INFO(event_subtype, create_events, free_packets, NULL),
1972 BENCH_INFO(packet_parse, alloc_parse_packets_ipv4_tcp, free_packets,
1973 "packet_parse_ipv4/tcp"),
1974 BENCH_INFO(packet_parse, alloc_parse_packets_ipv4_udp, free_packets,
1975 "packet_parse_ipv4/udp"),
1976 BENCH_INFO(packet_parse, alloc_parse_packets_ipv6_tcp, free_packets,
1977 "packet_parse_ipv6/tcp"),
1978 BENCH_INFO(packet_parse, alloc_parse_packets_ipv6_udp, free_packets,
1979 "packet_parse_ipv6/udp"),
1980 BENCH_INFO(packet_parse, create_packets_misc, free_packets,
1981 "packet_parse_misc"),
1982 BENCH_INFO(packet_parse_no_chksum, create_packets_misc, free_packets,
1983 "packet_parse_misc_no_csum"),
1984 BENCH_INFO(packet_parse_multi, alloc_parse_packets_multi_ipv4_tcp, free_packets_multi,
1985 "packet_parse_multi_ipv4/tcp"),
1986 BENCH_INFO(packet_parse_multi, alloc_parse_packets_multi_ipv4_udp, free_packets_multi,
1987 "packet_parse_multi_ipv4/udp"),
1988 BENCH_INFO(packet_parse_multi, alloc_parse_packets_multi_ipv6_tcp, free_packets_multi,
1989 "packet_parse_multi_ipv6/tcp"),
1990 BENCH_INFO(packet_parse_multi, alloc_parse_packets_multi_ipv6_udp, free_packets_multi,
1991 "packet_parse_multi_ipv6/udp"),
1995 "Result array is too small to hold all the results");
2002 ODPH_ERR(
"Error: %s pool creation failed.\n", name);
2017 return create_pool(
"buf", ¶m);
2028 return create_pool(
"tmo", ¶m);
2043 return create_pool(
"evv", ¶m);
2049int main(
int argc,
char *argv[])
2051 odph_helper_options_t helper_options;
2052 test_common_options_t common_options;
2053 odph_thread_t worker_thread;
2054 odph_thread_common_param_t thr_common;
2055 odph_thread_param_t thr_param;
2064 uint32_t pkt_num, seg_len;
2068 argc = odph_parse_options(argc, argv);
2069 if (odph_options(&helper_options)) {
2070 ODPH_ERR(
"Error: reading ODP helper options failed.\n");
2074 argc = test_common_parse_options(argc, argv);
2075 if (test_common_options(&common_options)) {
2076 ODPH_ERR(
"Error: reading test options failed\n");
2081 init_param.
mem_model = helper_options.mem_model;
2085 ODPH_ERR(
"Error: ODP global init failed.\n");
2091 ODPH_ERR(
"Error: ODP local init failed.\n");
2097 ODP_CACHE_LINE_SIZE, 0);
2100 ODPH_ERR(
"Error: shared mem reserve failed.\n");
2106 if (gbl_args == NULL) {
2107 ODPH_ERR(
"Error: shared mem alloc failed.\n");
2111 memset(gbl_args, 0,
sizeof(args_t));
2113 gbl_args->common_options = common_options;
2116 parse_args(argc, argv, &gbl_args->appl);
2118 bench_suite_init(&gbl_args->suite);
2119 gbl_args->suite.bench = test_suite;
2120 gbl_args->suite.num_bench = ODPH_ARRAY_SIZE(test_suite);
2121 gbl_args->suite.indef_idx = gbl_args->appl.bench_idx;
2122 gbl_args->suite.rounds = gbl_args->appl.rounds;
2123 gbl_args->suite.repeat_count = TEST_REPEAT_COUNT;
2124 gbl_args->suite.measure_time = !!gbl_args->appl.time;
2127 print_info(NO_PATH(argv[0]), &gbl_args->appl);
2131 ODPH_ERR(
"Error: unable to allocate worker thread.\n");
2139 ODPH_ERR(
"Error: unable to query pool capability.\n");
2145 pkt_num = (gbl_args->appl.burst_size > 4) ?
2146 gbl_args->appl.burst_size * TEST_REPEAT_COUNT :
2147 4 * TEST_REPEAT_COUNT;
2150 ODPH_ERR(
"Error: packet pool size not supported.\n");
2151 printf(
"MAX: %" PRIu32
"\n", capa.
pkt.
max_num);
2155 ODPH_ERR(
"Error: packet length not supported.\n");
2159 ODPH_ERR(
"Error: user area size not supported.\n");
2162 ODPH_ERR(
"Error: cache size not supported (max %" PRIu32
")\n",
2167 seg_len = TEST_MAX_PKT_SIZE;
2170 printf(
"\nWarn: allocated packets may be segmented (min seg_len=%" PRIu32
")\n\n",
2181 params.
pkt.
len = 2 * TEST_MAX_PKT_SIZE;
2182 params.
pkt.
num = pkt_num;
2184 if (gbl_args->appl.cache_size >= 0)
2190 ODPH_ERR(
"Error: packet pool create failed.\n");
2193 gbl_args->pool_buf = create_buffer_pool(&capa);
2194 gbl_args->pool_tmo = create_timeout_pool(&capa);
2195 gbl_args->pool_evv = create_evv_pool(&capa);
2198 printf(
"CPU mask: %s\n", cpumaskstr);
2199 printf(
"Burst size: %d\n", gbl_args->appl.burst_size);
2200 printf(
"Bench repeat: %d\n", TEST_REPEAT_COUNT);
2201 printf(
"Measurement unit: %s\n", gbl_args->appl.time ?
"nsec" :
"CPU cycles");
2202 printf(
"Test rounds: %u\n", gbl_args->appl.rounds);
2203 if (gbl_args->appl.cache_size < 0)
2204 printf(
"Pool cache size: default\n");
2206 printf(
"Pool cache size: %d\n", gbl_args->appl.cache_size);
2210 memset(&worker_thread, 0,
sizeof(odph_thread_t));
2212 signal(SIGINT, sig_handler);
2222 odph_thread_common_param_init(&thr_common);
2223 thr_common.instance = instance;
2224 thr_common.cpumask = &thd_mask;
2225 thr_common.share_param = 1;
2227 odph_thread_param_init(&thr_param);
2228 thr_param.start = run_benchmarks;
2229 thr_param.arg = gbl_args;
2232 odph_thread_create(&worker_thread, &thr_common, &thr_param, 1);
2234 odph_thread_join(&worker_thread, 1);
2236 ret = gbl_args->suite.retval;
2242 ODPH_ERR(
"Error: pool destroy\n");
2249 ODPH_ERR(
"Error: shm free\n");
2254 ODPH_ERR(
"Error: term local\n");
2259 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.
odp_event_t odp_buffer_to_event(odp_buffer_t buf)
Convert buffer handle to event.
odp_buffer_t odp_buffer_alloc(odp_pool_t pool)
Buffer alloc.
#define ODP_BUFFER_INVALID
Invalid buffer.
#define ODP_UNUSED
Intentionally unused variables of functions.
void odp_cpumask_set(odp_cpumask_t *mask, int cpu)
Add CPU to mask.
int odp_cpumask_default_worker(odp_cpumask_t *mask, int num)
Default CPU mask for worker threads.
int odp_cpumask_first(const odp_cpumask_t *mask)
Find first set CPU in mask.
void odp_cpumask_zero(odp_cpumask_t *mask)
Clear entire CPU mask.
int32_t odp_cpumask_to_str(const odp_cpumask_t *mask, char *str, int32_t size)
Format a string from CPU mask.
#define ODP_CPUMASK_STR_SIZE
The maximum number of characters needed to record any CPU mask as a string (output of odp_cpumask_to_...
odp_event_t odp_event_vector_to_event(odp_event_vector_t evv)
Convert event vector handle to event.
odp_event_vector_t odp_event_vector_alloc(odp_pool_t pool)
Allocate event vector from event vector pool.
#define ODP_EVENT_VECTOR_INVALID
Invalid event vector.
void odp_event_free_sp(const odp_event_t event[], int num)
Free multiple events to the same pool.
void odp_event_free_multi(const odp_event_t event[], int num)
Free multiple events.
odp_event_subtype_t odp_event_subtype(odp_event_t event)
Event subtype of an event.
void odp_event_free(odp_event_t event)
Free event.
odp_pool_t odp_event_pool(odp_event_t event)
Event pool.
void * odp_event_user_area(odp_event_t event)
Event user area.
void odp_event_user_flag_set(odp_event_t event, int val)
Set event user flag.
void * odp_event_user_area_and_flag(odp_event_t event, int *flag)
Event user area and flag.
void odp_init_param_init(odp_init_t *param)
Initialize the odp_init_t to default values for all fields.
#define ODP_STATIC_ASSERT(cond, msg)
Compile time assertion macro.
int odp_init_local(odp_instance_t instance, odp_thread_type_t thr_type)
Thread local ODP initialization.
int odp_init_global(odp_instance_t *instance, const odp_init_t *params, const odp_platform_init_t *platform_params)
Global ODP initialization.
int odp_term_local(void)
Thread local ODP termination.
int odp_term_global(odp_instance_t instance)
Global ODP termination.
uint64_t odp_instance_t
ODP instance ID.
int odp_packet_is_segmented(odp_packet_t pkt)
Tests if packet is segmented.
void odp_packet_from_event_multi(odp_packet_t pkt[], const odp_event_t ev[], int num)
Convert multiple packet events to packet handles.
odp_packet_t odp_packet_ref_pkt(odp_packet_t pkt, uint32_t offset, odp_packet_t hdr)
Create a packet with a header and shared data.
int odp_packet_has_l3(odp_packet_t pkt)
Check for layer 3 protocols.
void * odp_packet_head(odp_packet_t pkt)
Packet head address.
uint32_t odp_packet_flow_hash(odp_packet_t pkt)
Packet flow hash value.
int odp_packet_has_ip_mcast(odp_packet_t pkt)
Check for IP multicast address.
int odp_packet_has_ipfrag(odp_packet_t pkt)
Check for IP fragment.
odp_proto_l4_type_t odp_packet_l4_type(odp_packet_t pkt)
Layer 4 protocol type.
int odp_packet_trunc_tail(odp_packet_t *pkt, uint32_t len, void **tail_ptr, uint32_t *tailroom)
Truncate packet tail.
int odp_packet_has_ts(odp_packet_t pkt)
Check for packet timestamp.
int odp_packet_l3_offset_set(odp_packet_t pkt, uint32_t offset)
Set layer 3 start offset.
odp_event_subtype_t odp_packet_subtype(odp_packet_t packet)
Event subtype of a packet.
odp_packet_seg_t odp_packet_last_seg(odp_packet_t pkt)
Last segment in packet.
int odp_packet_input_index(odp_packet_t pkt)
Packet input interface index.
int odp_packet_has_ipopt(odp_packet_t pkt)
Check for IP options.
odp_event_t odp_packet_to_event(odp_packet_t pkt)
Convert packet handle to event.
void odp_packet_to_event_multi(const odp_packet_t pkt[], odp_event_t ev[], int num)
Convert multiple packet handles to events.
uint32_t odp_packet_seg_len(odp_packet_t pkt)
Packet data length following the data pointer.
int odp_packet_add_data(odp_packet_t *pkt, uint32_t offset, uint32_t len)
Add data into an offset.
int odp_packet_concat(odp_packet_t *dst, odp_packet_t src)
Concatenate two packets.
int odp_packet_parse_multi(const odp_packet_t pkt[], const uint32_t offset[], int num, const odp_packet_parse_param_t *param)
Parse multiple packets.
uint32_t odp_packet_headroom(odp_packet_t pkt)
Packet headroom length.
void odp_packet_prefetch(odp_packet_t pkt, uint32_t offset, uint32_t len)
Packet data prefetch.
void odp_packet_user_flag_set(odp_packet_t pkt, int val)
Set user flag.
int odp_packet_num_segs(odp_packet_t pkt)
Number of segments.
int odp_packet_has_icmp(odp_packet_t pkt)
Check for ICMP.
odp_packet_t odp_packet_copy(odp_packet_t pkt, odp_pool_t pool)
Full copy of a packet.
int odp_packet_has_ipv4(odp_packet_t pkt)
Check for IPv4.
int odp_packet_has_ip_bcast(odp_packet_t pkt)
Check for IP broadcast address.
uint32_t odp_packet_seg_data_len(odp_packet_t pkt, odp_packet_seg_t seg)
Segment data length.
uint32_t odp_packet_user_area_size(odp_packet_t pkt)
User area size.
uint32_t odp_packet_l4_offset(odp_packet_t pkt)
Layer 4 start offset.
void * odp_packet_data(odp_packet_t pkt)
Packet data pointer.
void * odp_packet_offset(odp_packet_t pkt, uint32_t offset, uint32_t *len, odp_packet_seg_t *seg)
Packet offset pointer.
int odp_packet_copy_data(odp_packet_t pkt, uint32_t dst_offset, uint32_t src_offset, uint32_t len)
Copy data within packet.
int odp_packet_has_eth(odp_packet_t pkt)
Check for Ethernet header.
int odp_packet_l4_offset_set(odp_packet_t pkt, uint32_t offset)
Set layer 4 start offset.
void * odp_packet_data_seg_len(odp_packet_t pkt, uint32_t *seg_len)
Packet data pointer with segment length.
void * odp_packet_push_head(odp_packet_t pkt, uint32_t len)
Push out packet head.
int odp_packet_extend_head(odp_packet_t *pkt, uint32_t len, void **data_ptr, uint32_t *seg_len)
Extend packet head.
int odp_packet_has_vlan_qinq(odp_packet_t pkt)
Check for VLAN QinQ (stacked VLAN)
odp_packet_t odp_packet_ref(odp_packet_t pkt, uint32_t offset)
Create a packet that references packet data of another packet.
odp_proto_l2_type_t odp_packet_l2_type(odp_packet_t pkt)
Layer 2 protocol type.
int odp_packet_split(odp_packet_t *pkt, uint32_t len, odp_packet_t *tail)
Split packet into two packets.
int odp_packet_is_referencing(odp_packet_t pkt)
Test if a packet is a referencing packet.
int odp_packet_has_eth_bcast(odp_packet_t pkt)
Check for Ethernet broadcast address.
int odp_packet_move_data(odp_packet_t pkt, uint32_t dst_offset, uint32_t src_offset, uint32_t len)
Move data within packet.
int odp_packet_has_l4(odp_packet_t pkt)
Check for layer 4 protocols.
uint32_t odp_packet_len(odp_packet_t pkt)
Packet data length.
int odp_packet_has_error(odp_packet_t pkt)
Check for all parse errors in packet.
int odp_packet_extend_tail(odp_packet_t *pkt, uint32_t len, void **data_ptr, uint32_t *seg_len)
Extend packet tail.
int odp_packet_has_ipv6(odp_packet_t pkt)
Check for IPv6.
odp_packet_t odp_packet_alloc(odp_pool_t pool, uint32_t len)
Allocate a packet from a packet pool.
int odp_packet_rem_data(odp_packet_t *pkt, uint32_t offset, uint32_t len)
Remove data from an offset.
int odp_packet_l2_offset_set(odp_packet_t pkt, uint32_t offset)
Set layer 2 start offset.
int odp_packet_has_flow_hash(odp_packet_t pkt)
Check for packet flow hash.
int odp_packet_has_l2(odp_packet_t pkt)
Check for layer 2 protocols.
void * odp_packet_l3_ptr(odp_packet_t pkt, uint32_t *len)
Layer 3 start pointer.
odp_packet_seg_t odp_packet_next_seg(odp_packet_t pkt, odp_packet_seg_t seg)
Next segment in packet.
int odp_packet_align(odp_packet_t *pkt, uint32_t offset, uint32_t len, uint32_t align)
Align packet data.
odp_packet_t odp_packet_from_event(odp_event_t ev)
Get packet handle from event.
void * odp_packet_tail(odp_packet_t pkt)
Packet tailroom pointer.
void odp_packet_free(odp_packet_t pkt)
Free packet.
odp_packet_seg_t odp_packet_first_seg(odp_packet_t pkt)
First segment in packet.
int odp_packet_has_l2_error(odp_packet_t pkt)
Check for errors in layer 2.
int odp_packet_trunc_head(odp_packet_t *pkt, uint32_t len, void **data_ptr, uint32_t *seg_len)
Truncate packet head.
uint32_t odp_packet_reset_max_len(odp_packet_t pkt)
Maximum packet data reset length.
void odp_packet_flow_hash_set(odp_packet_t pkt, uint32_t flow_hash)
Set packet flow hash value.
int odp_packet_has_vlan(odp_packet_t pkt)
Check for VLAN.
uint32_t odp_packet_l3_offset(odp_packet_t pkt)
Layer 3 start offset.
void odp_packet_reset_meta(odp_packet_t pkt)
Reset packet metadata.
uint32_t odp_packet_buf_len(odp_packet_t pkt)
Total packet buffer length.
int odp_packet_has_jumbo(odp_packet_t pkt)
Check for jumbo frame.
int odp_packet_reset(odp_packet_t pkt, uint32_t len)
Reset packet.
int odp_packet_has_l4_error(odp_packet_t pkt)
Check for errors in layer 4.
int odp_packet_copy_from_pkt(odp_packet_t dst, uint32_t dst_offset, odp_packet_t src, uint32_t src_offset, uint32_t len)
Copy data from another packet.
void * odp_packet_push_tail(odp_packet_t pkt, uint32_t len)
Push out packet tail.
void * odp_packet_l2_ptr(odp_packet_t pkt, uint32_t *len)
Layer 2 start pointer.
int odp_packet_has_arp(odp_packet_t pkt)
Check for ARP.
int odp_packet_parse(odp_packet_t pkt, uint32_t offset, const odp_packet_parse_param_t *param)
Parse packet.
int odp_packet_has_eth_mcast(odp_packet_t pkt)
Check for Ethernet multicast address.
int odp_packet_copy_from_mem(odp_packet_t pkt, uint32_t offset, uint32_t len, const void *src)
Copy data from memory to packet.
int odp_packet_has_ipsec(odp_packet_t pkt)
Check for IPSec.
#define ODP_PACKET_INVALID
Invalid packet.
void odp_packet_user_ptr_set(odp_packet_t pkt, const void *user_ptr)
Set user context pointer.
int odp_packet_has_sctp(odp_packet_t pkt)
Check for SCTP.
odp_proto_l3_type_t odp_packet_l3_type(odp_packet_t pkt)
Layer 3 protocol type.
void * odp_packet_user_area(odp_packet_t pkt)
User area address.
int odp_packet_has_tcp(odp_packet_t pkt)
Check for TCP.
int odp_packet_has_l3_error(odp_packet_t pkt)
Check for errors in layer 3.
void odp_packet_free_multi(const odp_packet_t pkt[], int num)
Free multiple packets.
void * odp_packet_seg_data(odp_packet_t pkt, odp_packet_seg_t seg)
Segment data pointer.
int odp_packet_user_flag(odp_packet_t pkt)
Check user flag.
int odp_packet_alloc_multi(odp_pool_t pool, uint32_t len, odp_packet_t pkt[], int num)
Allocate multiple packets from a packet pool.
odp_pool_t odp_packet_pool(odp_packet_t pkt)
Packet pool.
void * odp_packet_l4_ptr(odp_packet_t pkt, uint32_t *len)
Layer 4 start pointer.
void odp_packet_ts_set(odp_packet_t pkt, odp_time_t timestamp)
Set packet timestamp.
int odp_packet_copy_to_mem(odp_packet_t pkt, uint32_t offset, uint32_t len, void *dst)
Copy data from packet to memory.
odp_packet_t odp_packet_copy_part(odp_packet_t pkt, uint32_t offset, uint32_t len, odp_pool_t pool)
Partial copy of a packet.
void * odp_packet_user_ptr(odp_packet_t pkt)
User context pointer.
odp_packet_t odp_packet_ref_static(odp_packet_t pkt)
Create a static reference to a packet.
void * odp_packet_pull_tail(odp_packet_t pkt, uint32_t len)
Pull in packet tail.
int odp_packet_has_ref(odp_packet_t pkt)
Test if packet has multiple references.
odp_time_t odp_packet_ts(odp_packet_t pkt)
Packet timestamp.
int odp_packet_has_udp(odp_packet_t pkt)
Check for UDP.
void odp_packet_free_sp(const odp_packet_t pkt[], int num)
Free multiple packets to the same pool.
void * odp_packet_pull_head(odp_packet_t pkt, uint32_t len)
Pull in packet head.
uint32_t odp_packet_tailroom(odp_packet_t pkt)
Packet tailroom length.
odp_pktio_t odp_packet_input(odp_packet_t pkt)
Packet input interface.
uint32_t odp_packet_l2_offset(odp_packet_t pkt)
Layer 2 start offset.
@ ODP_PROTO_ETH
Ethernet (including VLAN)
@ ODP_PROTO_LAYER_ALL
All layers.
odp_pool_t odp_pool_create(const char *name, const odp_pool_param_t *param)
Create a pool.
int odp_pool_capability(odp_pool_capability_t *capa)
Query pool capabilities.
void odp_pool_param_init(odp_pool_param_t *param)
Initialize pool params.
int odp_pool_destroy(odp_pool_t pool)
Destroy a pool previously created by odp_pool_create()
void odp_pool_print(odp_pool_t pool)
Print pool info.
#define ODP_POOL_INVALID
Invalid pool.
@ ODP_POOL_TIMEOUT
Timeout pool.
@ ODP_POOL_BUFFER
Buffer pool.
@ ODP_POOL_PACKET
Packet pool.
@ ODP_POOL_EVENT_VECTOR
Event vector pool.
int odp_shm_free(odp_shm_t shm)
Free a contiguous block of shared memory.
void * odp_shm_addr(odp_shm_t shm)
Shared memory block address.
#define ODP_SHM_INVALID
Invalid shared memory block.
odp_shm_t odp_shm_reserve(const char *name, uint64_t size, uint64_t align, uint32_t flags)
Reserve a contiguous block of shared memory.
void odp_sys_info_print(void)
Print system info.
@ ODP_THREAD_WORKER
Worker thread.
@ ODP_THREAD_CONTROL
Control thread.
odp_time_t odp_time_local(void)
Current local time.
odp_timeout_t odp_timeout_alloc(odp_pool_t pool)
Timeout alloc.
odp_event_t odp_timeout_to_event(odp_timeout_t tmo)
Convert timeout handle to event handle.
#define ODP_TIMEOUT_INVALID
Invalid timeout handle.
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.
uint32_t max_num
Maximum number of buffers of any size.
struct odp_pool_capability_t::@133 buf
Buffer pool capabilities
struct odp_pool_capability_t::@135 tmo
Timeout pool capabilities
uint32_t max_uarea_size
Maximum user area size in bytes.
struct odp_pool_capability_t::@134 pkt
Packet pool capabilities
struct odp_pool_capability_t::@137 event_vector
Event vector pool capabilities.
uint32_t max_size
Maximum buffer data size in bytes.
uint32_t max_cache_size
Maximum size of thread local cache.
uint32_t max_pools
Maximum number of pools of any type (odp_pool_type_t)
uint32_t max_seg_len
Maximum packet segment data length in bytes.
uint32_t max_len
Maximum packet data length in bytes.
uint32_t uarea_size
Minimum user area size in bytes.
uint32_t num
Number of buffers in the pool.
struct odp_pool_param_t::@139 pkt
Parameters for packet pools.
struct odp_pool_param_t::@142 event_vector
Parameters for event vector pools.
uint32_t cache_size
Maximum number of buffers cached locally per thread.
uint32_t size
Minimum buffer size in bytes.
odp_pool_type_t type
Pool type.
uint32_t len
Minimum length of 'num' packets.
uint32_t max_size
Maximum number of handles (such as odp_packet_t) in a vector.
struct odp_pool_param_t::@138 buf
Parameters for buffer pools.
struct odp_pool_param_t::@140 tmo
Parameters for timeout pools.
uint32_t seg_len
Minimum number of packet data bytes that can be stored in the first segment of a newly allocated pack...
uint32_t ipv4
IPv4 header checksum.
struct odp_proto_chksums_t::@124 chksum
Individual checksum bits.
uint32_t tcp
TCP checksum.
uint32_t udp
UDP checksum.