1 // SPDX-License-Identifier: GPL-2.0
2 #include <test_progs.h>
4 static void test_l4lb(const char *file
)
6 unsigned int nr_cpus
= bpf_num_possible_cpus();
7 struct vip key
= {.protocol
= 6};
11 } value
= {.vip_num
= VIP_NUM
};
12 __u32 stats_key
= VIP_NUM
;
17 struct real_definition
{
23 } real_def
= {.dst
= MAGIC_VAL
};
24 __u32 ch_key
= 11, real_num
= 3;
25 __u32 duration
, retval
, size
;
26 int err
, i
, prog_fd
, map_fd
;
27 __u64 bytes
= 0, pkts
= 0;
28 struct bpf_object
*obj
;
30 u32
*magic
= (u32
*)buf
;
32 err
= bpf_prog_load(file
, BPF_PROG_TYPE_SCHED_CLS
, &obj
, &prog_fd
);
38 map_fd
= bpf_find_map(__func__
, obj
, "vip_map");
41 bpf_map_update_elem(map_fd
, &key
, &value
, 0);
43 map_fd
= bpf_find_map(__func__
, obj
, "ch_rings");
46 bpf_map_update_elem(map_fd
, &ch_key
, &real_num
, 0);
48 map_fd
= bpf_find_map(__func__
, obj
, "reals");
51 bpf_map_update_elem(map_fd
, &real_num
, &real_def
, 0);
53 err
= bpf_prog_test_run(prog_fd
, NUM_ITER
, &pkt_v4
, sizeof(pkt_v4
),
54 buf
, &size
, &retval
, &duration
);
55 CHECK(err
|| retval
!= 7/*TC_ACT_REDIRECT*/ || size
!= 54 ||
56 *magic
!= MAGIC_VAL
, "ipv4",
57 "err %d errno %d retval %d size %d magic %x\n",
58 err
, errno
, retval
, size
, *magic
);
60 err
= bpf_prog_test_run(prog_fd
, NUM_ITER
, &pkt_v6
, sizeof(pkt_v6
),
61 buf
, &size
, &retval
, &duration
);
62 CHECK(err
|| retval
!= 7/*TC_ACT_REDIRECT*/ || size
!= 74 ||
63 *magic
!= MAGIC_VAL
, "ipv6",
64 "err %d errno %d retval %d size %d magic %x\n",
65 err
, errno
, retval
, size
, *magic
);
67 map_fd
= bpf_find_map(__func__
, obj
, "stats");
70 bpf_map_lookup_elem(map_fd
, &stats_key
, stats
);
71 for (i
= 0; i
< nr_cpus
; i
++) {
72 bytes
+= stats
[i
].bytes
;
73 pkts
+= stats
[i
].pkts
;
75 if (bytes
!= MAGIC_BYTES
* NUM_ITER
* 2 || pkts
!= NUM_ITER
* 2) {
77 printf("test_l4lb:FAIL:stats %lld %lld\n", bytes
, pkts
);
80 bpf_object__close(obj
);
83 void test_l4lb_all(void)
85 const char *file1
= "./test_l4lb.o";
86 const char *file2
= "./test_l4lb_noinline.o";