|
6 | 6 | #include <linux/if_tun.h>
|
7 | 7 | #include <sys/uio.h>
|
8 | 8 |
|
| 9 | +#include "bpf_flow.skel.h" |
| 10 | + |
9 | 11 | #ifndef IP_MF
|
10 | 12 | #define IP_MF 0x2000
|
11 | 13 | #endif
|
@@ -444,17 +446,54 @@ static int ifup(const char *ifname)
|
444 | 446 | return 0;
|
445 | 447 | }
|
446 | 448 |
|
| 449 | +static int init_prog_array(struct bpf_object *obj, struct bpf_map *prog_array) |
| 450 | +{ |
| 451 | + int i, err, map_fd, prog_fd; |
| 452 | + struct bpf_program *prog; |
| 453 | + char prog_name[32]; |
| 454 | + |
| 455 | + map_fd = bpf_map__fd(prog_array); |
| 456 | + if (map_fd < 0) |
| 457 | + return -1; |
| 458 | + |
| 459 | + for (i = 0; i < bpf_map__def(prog_array)->max_entries; i++) { |
| 460 | + snprintf(prog_name, sizeof(prog_name), "flow_dissector/%i", i); |
| 461 | + |
| 462 | + prog = bpf_object__find_program_by_title(obj, prog_name); |
| 463 | + if (!prog) |
| 464 | + return -1; |
| 465 | + |
| 466 | + prog_fd = bpf_program__fd(prog); |
| 467 | + if (prog_fd < 0) |
| 468 | + return -1; |
| 469 | + |
| 470 | + err = bpf_map_update_elem(map_fd, &i, &prog_fd, BPF_ANY); |
| 471 | + if (err) |
| 472 | + return -1; |
| 473 | + } |
| 474 | + return 0; |
| 475 | +} |
| 476 | + |
447 | 477 | void test_flow_dissector(void)
|
448 | 478 | {
|
449 | 479 | int i, err, prog_fd, keys_fd = -1, tap_fd;
|
450 |
| - struct bpf_object *obj; |
| 480 | + struct bpf_flow *skel; |
451 | 481 | __u32 duration = 0;
|
452 | 482 |
|
453 |
| - err = bpf_flow_load(&obj, "./bpf_flow.o", "flow_dissector", |
454 |
| - "jmp_table", "last_dissection", &prog_fd, &keys_fd); |
455 |
| - if (CHECK_FAIL(err)) |
| 483 | + skel = bpf_flow__open_and_load(); |
| 484 | + if (CHECK(!skel, "skel", "failed to open/load skeleton\n")) |
456 | 485 | return;
|
457 | 486 |
|
| 487 | + prog_fd = bpf_program__fd(skel->progs._dissect); |
| 488 | + if (CHECK(prog_fd < 0, "bpf_program__fd", "err %d\n", prog_fd)) |
| 489 | + goto out_destroy_skel; |
| 490 | + keys_fd = bpf_map__fd(skel->maps.last_dissection); |
| 491 | + if (CHECK(keys_fd < 0, "bpf_map__fd", "err %d\n", keys_fd)) |
| 492 | + goto out_destroy_skel; |
| 493 | + err = init_prog_array(skel->obj, skel->maps.jmp_table); |
| 494 | + if (CHECK(err, "init_prog_array", "err %d\n", err)) |
| 495 | + goto out_destroy_skel; |
| 496 | + |
458 | 497 | for (i = 0; i < ARRAY_SIZE(tests); i++) {
|
459 | 498 | struct bpf_flow_keys flow_keys;
|
460 | 499 | struct bpf_prog_test_run_attr tattr = {
|
@@ -526,5 +565,6 @@ void test_flow_dissector(void)
|
526 | 565 |
|
527 | 566 | close(tap_fd);
|
528 | 567 | bpf_prog_detach(prog_fd, BPF_FLOW_DISSECTOR);
|
529 |
| - bpf_object__close(obj); |
| 568 | +out_destroy_skel: |
| 569 | + bpf_flow__destroy(skel); |
530 | 570 | }
|
0 commit comments