1 // SPDX-License-Identifier: GPL-2.0
2 #include <test_progs.h>
4 void test_xdp_noinline(void)
6 const char *file
= "./test_xdp_noinline.o";
7 unsigned int nr_cpus
= bpf_num_possible_cpus();
8 struct vip key
= {.protocol
= 6};
12 } value
= {.vip_num
= VIP_NUM
};
13 __u32 stats_key
= VIP_NUM
;
18 struct real_definition
{
24 } real_def
= {.dst
= MAGIC_VAL
};
25 __u32 ch_key
= 11, real_num
= 3;
26 __u32 duration
, retval
, size
;
27 int err
, i
, prog_fd
, map_fd
;
28 __u64 bytes
= 0, pkts
= 0;
29 struct bpf_object
*obj
;
31 u32
*magic
= (u32
*)buf
;
33 err
= bpf_prog_load(file
, BPF_PROG_TYPE_XDP
, &obj
, &prog_fd
);
37 map_fd
= bpf_find_map(__func__
, obj
, "vip_map");
40 bpf_map_update_elem(map_fd
, &key
, &value
, 0);
42 map_fd
= bpf_find_map(__func__
, obj
, "ch_rings");
45 bpf_map_update_elem(map_fd
, &ch_key
, &real_num
, 0);
47 map_fd
= bpf_find_map(__func__
, obj
, "reals");
50 bpf_map_update_elem(map_fd
, &real_num
, &real_def
, 0);
52 err
= bpf_prog_test_run(prog_fd
, NUM_ITER
, &pkt_v4
, sizeof(pkt_v4
),
53 buf
, &size
, &retval
, &duration
);
54 CHECK(err
|| retval
!= 1 || size
!= 54 ||
55 *magic
!= MAGIC_VAL
, "ipv4",
56 "err %d errno %d retval %d size %d magic %x\n",
57 err
, errno
, retval
, size
, *magic
);
59 err
= bpf_prog_test_run(prog_fd
, NUM_ITER
, &pkt_v6
, sizeof(pkt_v6
),
60 buf
, &size
, &retval
, &duration
);
61 CHECK(err
|| retval
!= 1 || size
!= 74 ||
62 *magic
!= MAGIC_VAL
, "ipv6",
63 "err %d errno %d retval %d size %d magic %x\n",
64 err
, errno
, retval
, size
, *magic
);
66 map_fd
= bpf_find_map(__func__
, obj
, "stats");
69 bpf_map_lookup_elem(map_fd
, &stats_key
, stats
);
70 for (i
= 0; i
< nr_cpus
; i
++) {
71 bytes
+= stats
[i
].bytes
;
72 pkts
+= stats
[i
].pkts
;
74 if (CHECK_FAIL(bytes
!= MAGIC_BYTES
* NUM_ITER
* 2 ||
75 pkts
!= NUM_ITER
* 2)) {
76 printf("test_xdp_noinline:FAIL:stats %lld %lld\n",
80 bpf_object__close(obj
);