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
);
36 map_fd
= bpf_find_map(__func__
, obj
, "vip_map");
39 bpf_map_update_elem(map_fd
, &key
, &value
, 0);
41 map_fd
= bpf_find_map(__func__
, obj
, "ch_rings");
44 bpf_map_update_elem(map_fd
, &ch_key
, &real_num
, 0);
46 map_fd
= bpf_find_map(__func__
, obj
, "reals");
49 bpf_map_update_elem(map_fd
, &real_num
, &real_def
, 0);
51 err
= bpf_prog_test_run(prog_fd
, NUM_ITER
, &pkt_v4
, sizeof(pkt_v4
),
52 buf
, &size
, &retval
, &duration
);
53 CHECK(err
|| retval
!= 7/*TC_ACT_REDIRECT*/ || size
!= 54 ||
54 *magic
!= MAGIC_VAL
, "ipv4",
55 "err %d errno %d retval %d size %d magic %x\n",
56 err
, errno
, retval
, size
, *magic
);
58 err
= bpf_prog_test_run(prog_fd
, NUM_ITER
, &pkt_v6
, sizeof(pkt_v6
),
59 buf
, &size
, &retval
, &duration
);
60 CHECK(err
|| retval
!= 7/*TC_ACT_REDIRECT*/ || size
!= 74 ||
61 *magic
!= MAGIC_VAL
, "ipv6",
62 "err %d errno %d retval %d size %d magic %x\n",
63 err
, errno
, retval
, size
, *magic
);
65 map_fd
= bpf_find_map(__func__
, obj
, "stats");
68 bpf_map_lookup_elem(map_fd
, &stats_key
, stats
);
69 for (i
= 0; i
< nr_cpus
; i
++) {
70 bytes
+= stats
[i
].bytes
;
71 pkts
+= stats
[i
].pkts
;
73 if (CHECK_FAIL(bytes
!= MAGIC_BYTES
* NUM_ITER
* 2 ||
74 pkts
!= NUM_ITER
* 2))
75 printf("test_l4lb:FAIL:stats %lld %lld\n", bytes
, pkts
);
77 bpf_object__close(obj
);
80 void test_l4lb_all(void)
82 const char *file1
= "./test_l4lb.o";
83 const char *file2
= "./test_l4lb_noinline.o";