Skip to content

Commit 6eb7fba

Browse files
LorenzoBianconiAlexei Starovoitov
authored andcommitted
selftests/bpf: Add tests for new nf_conntrack kfuncs
Introduce selftests for the following kfunc helpers: - bpf_xdp_ct_alloc - bpf_skb_ct_alloc - bpf_ct_insert_entry - bpf_ct_set_timeout - bpf_ct_change_timeout - bpf_ct_set_status - bpf_ct_change_status Signed-off-by: Lorenzo Bianconi <[email protected]> Signed-off-by: Kumar Kartikeya Dwivedi <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Alexei Starovoitov <[email protected]>
1 parent 8dd5e75 commit 6eb7fba

File tree

2 files changed

+81
-12
lines changed

2 files changed

+81
-12
lines changed

tools/testing/selftests/bpf/prog_tests/bpf_nf.c

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,14 @@ void test_bpf_nf_ct(int mode)
3939
ASSERT_EQ(skel->bss->test_enonet_netns_id, -ENONET, "Test ENONET for bad but valid netns_id");
4040
ASSERT_EQ(skel->bss->test_enoent_lookup, -ENOENT, "Test ENOENT for failed lookup");
4141
ASSERT_EQ(skel->bss->test_eafnosupport, -EAFNOSUPPORT, "Test EAFNOSUPPORT for invalid len__tuple");
42+
ASSERT_EQ(skel->data->test_alloc_entry, 0, "Test for alloc new entry");
43+
ASSERT_EQ(skel->data->test_insert_entry, 0, "Test for insert new entry");
44+
ASSERT_EQ(skel->data->test_succ_lookup, 0, "Test for successful lookup");
45+
/* allow some tolerance for test_delta_timeout value to avoid races. */
46+
ASSERT_GT(skel->bss->test_delta_timeout, 8, "Test for min ct timeout update");
47+
ASSERT_LE(skel->bss->test_delta_timeout, 10, "Test for max ct timeout update");
48+
/* expected status is IPS_SEEN_REPLY */
49+
ASSERT_EQ(skel->bss->test_status, 2, "Test for ct status update ");
4250
end:
4351
test_bpf_nf__destroy(skel);
4452
}

tools/testing/selftests/bpf/progs/test_bpf_nf.c

Lines changed: 73 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
#define EINVAL 22
99
#define ENOENT 2
1010

11+
extern unsigned long CONFIG_HZ __kconfig;
12+
1113
int test_einval_bpf_tuple = 0;
1214
int test_einval_reserved = 0;
1315
int test_einval_netns_id = 0;
@@ -16,6 +18,11 @@ int test_eproto_l4proto = 0;
1618
int test_enonet_netns_id = 0;
1719
int test_enoent_lookup = 0;
1820
int test_eafnosupport = 0;
21+
int test_alloc_entry = -EINVAL;
22+
int test_insert_entry = -EAFNOSUPPORT;
23+
int test_succ_lookup = -ENOENT;
24+
u32 test_delta_timeout = 0;
25+
u32 test_status = 0;
1926

2027
struct nf_conn;
2128

@@ -26,31 +33,44 @@ struct bpf_ct_opts___local {
2633
u8 reserved[3];
2734
} __attribute__((preserve_access_index));
2835

36+
struct nf_conn *bpf_xdp_ct_alloc(struct xdp_md *, struct bpf_sock_tuple *, u32,
37+
struct bpf_ct_opts___local *, u32) __ksym;
2938
struct nf_conn *bpf_xdp_ct_lookup(struct xdp_md *, struct bpf_sock_tuple *, u32,
3039
struct bpf_ct_opts___local *, u32) __ksym;
40+
struct nf_conn *bpf_skb_ct_alloc(struct __sk_buff *, struct bpf_sock_tuple *, u32,
41+
struct bpf_ct_opts___local *, u32) __ksym;
3142
struct nf_conn *bpf_skb_ct_lookup(struct __sk_buff *, struct bpf_sock_tuple *, u32,
3243
struct bpf_ct_opts___local *, u32) __ksym;
44+
struct nf_conn *bpf_ct_insert_entry(struct nf_conn *) __ksym;
3345
void bpf_ct_release(struct nf_conn *) __ksym;
46+
void bpf_ct_set_timeout(struct nf_conn *, u32) __ksym;
47+
int bpf_ct_change_timeout(struct nf_conn *, u32) __ksym;
48+
int bpf_ct_set_status(struct nf_conn *, u32) __ksym;
49+
int bpf_ct_change_status(struct nf_conn *, u32) __ksym;
3450

3551
static __always_inline void
36-
nf_ct_test(struct nf_conn *(*func)(void *, struct bpf_sock_tuple *, u32,
37-
struct bpf_ct_opts___local *, u32),
52+
nf_ct_test(struct nf_conn *(*lookup_fn)(void *, struct bpf_sock_tuple *, u32,
53+
struct bpf_ct_opts___local *, u32),
54+
struct nf_conn *(*alloc_fn)(void *, struct bpf_sock_tuple *, u32,
55+
struct bpf_ct_opts___local *, u32),
3856
void *ctx)
3957
{
4058
struct bpf_ct_opts___local opts_def = { .l4proto = IPPROTO_TCP, .netns_id = -1 };
4159
struct bpf_sock_tuple bpf_tuple;
4260
struct nf_conn *ct;
61+
int err;
4362

4463
__builtin_memset(&bpf_tuple, 0, sizeof(bpf_tuple.ipv4));
4564

46-
ct = func(ctx, NULL, 0, &opts_def, sizeof(opts_def));
65+
ct = lookup_fn(ctx, NULL, 0, &opts_def, sizeof(opts_def));
4766
if (ct)
4867
bpf_ct_release(ct);
4968
else
5069
test_einval_bpf_tuple = opts_def.error;
5170

5271
opts_def.reserved[0] = 1;
53-
ct = func(ctx, &bpf_tuple, sizeof(bpf_tuple.ipv4), &opts_def, sizeof(opts_def));
72+
ct = lookup_fn(ctx, &bpf_tuple, sizeof(bpf_tuple.ipv4), &opts_def,
73+
sizeof(opts_def));
5474
opts_def.reserved[0] = 0;
5575
opts_def.l4proto = IPPROTO_TCP;
5676
if (ct)
@@ -59,59 +79,100 @@ nf_ct_test(struct nf_conn *(*func)(void *, struct bpf_sock_tuple *, u32,
5979
test_einval_reserved = opts_def.error;
6080

6181
opts_def.netns_id = -2;
62-
ct = func(ctx, &bpf_tuple, sizeof(bpf_tuple.ipv4), &opts_def, sizeof(opts_def));
82+
ct = lookup_fn(ctx, &bpf_tuple, sizeof(bpf_tuple.ipv4), &opts_def,
83+
sizeof(opts_def));
6384
opts_def.netns_id = -1;
6485
if (ct)
6586
bpf_ct_release(ct);
6687
else
6788
test_einval_netns_id = opts_def.error;
6889

69-
ct = func(ctx, &bpf_tuple, sizeof(bpf_tuple.ipv4), &opts_def, sizeof(opts_def) - 1);
90+
ct = lookup_fn(ctx, &bpf_tuple, sizeof(bpf_tuple.ipv4), &opts_def,
91+
sizeof(opts_def) - 1);
7092
if (ct)
7193
bpf_ct_release(ct);
7294
else
7395
test_einval_len_opts = opts_def.error;
7496

7597
opts_def.l4proto = IPPROTO_ICMP;
76-
ct = func(ctx, &bpf_tuple, sizeof(bpf_tuple.ipv4), &opts_def, sizeof(opts_def));
98+
ct = lookup_fn(ctx, &bpf_tuple, sizeof(bpf_tuple.ipv4), &opts_def,
99+
sizeof(opts_def));
77100
opts_def.l4proto = IPPROTO_TCP;
78101
if (ct)
79102
bpf_ct_release(ct);
80103
else
81104
test_eproto_l4proto = opts_def.error;
82105

83106
opts_def.netns_id = 0xf00f;
84-
ct = func(ctx, &bpf_tuple, sizeof(bpf_tuple.ipv4), &opts_def, sizeof(opts_def));
107+
ct = lookup_fn(ctx, &bpf_tuple, sizeof(bpf_tuple.ipv4), &opts_def,
108+
sizeof(opts_def));
85109
opts_def.netns_id = -1;
86110
if (ct)
87111
bpf_ct_release(ct);
88112
else
89113
test_enonet_netns_id = opts_def.error;
90114

91-
ct = func(ctx, &bpf_tuple, sizeof(bpf_tuple.ipv4), &opts_def, sizeof(opts_def));
115+
ct = lookup_fn(ctx, &bpf_tuple, sizeof(bpf_tuple.ipv4), &opts_def,
116+
sizeof(opts_def));
92117
if (ct)
93118
bpf_ct_release(ct);
94119
else
95120
test_enoent_lookup = opts_def.error;
96121

97-
ct = func(ctx, &bpf_tuple, sizeof(bpf_tuple.ipv4) - 1, &opts_def, sizeof(opts_def));
122+
ct = lookup_fn(ctx, &bpf_tuple, sizeof(bpf_tuple.ipv4) - 1, &opts_def,
123+
sizeof(opts_def));
98124
if (ct)
99125
bpf_ct_release(ct);
100126
else
101127
test_eafnosupport = opts_def.error;
128+
129+
bpf_tuple.ipv4.saddr = bpf_get_prandom_u32(); /* src IP */
130+
bpf_tuple.ipv4.daddr = bpf_get_prandom_u32(); /* dst IP */
131+
bpf_tuple.ipv4.sport = bpf_get_prandom_u32(); /* src port */
132+
bpf_tuple.ipv4.dport = bpf_get_prandom_u32(); /* dst port */
133+
134+
ct = alloc_fn(ctx, &bpf_tuple, sizeof(bpf_tuple.ipv4), &opts_def,
135+
sizeof(opts_def));
136+
if (ct) {
137+
struct nf_conn *ct_ins;
138+
139+
bpf_ct_set_timeout(ct, 10000);
140+
bpf_ct_set_status(ct, IPS_CONFIRMED);
141+
142+
ct_ins = bpf_ct_insert_entry(ct);
143+
if (ct_ins) {
144+
struct nf_conn *ct_lk;
145+
146+
ct_lk = lookup_fn(ctx, &bpf_tuple, sizeof(bpf_tuple.ipv4),
147+
&opts_def, sizeof(opts_def));
148+
if (ct_lk) {
149+
/* update ct entry timeout */
150+
bpf_ct_change_timeout(ct_lk, 10000);
151+
test_delta_timeout = ct_lk->timeout - bpf_jiffies64();
152+
test_delta_timeout /= CONFIG_HZ;
153+
test_status = IPS_SEEN_REPLY;
154+
bpf_ct_change_status(ct_lk, IPS_SEEN_REPLY);
155+
bpf_ct_release(ct_lk);
156+
test_succ_lookup = 0;
157+
}
158+
bpf_ct_release(ct_ins);
159+
test_insert_entry = 0;
160+
}
161+
test_alloc_entry = 0;
162+
}
102163
}
103164

104165
SEC("xdp")
105166
int nf_xdp_ct_test(struct xdp_md *ctx)
106167
{
107-
nf_ct_test((void *)bpf_xdp_ct_lookup, ctx);
168+
nf_ct_test((void *)bpf_xdp_ct_lookup, (void *)bpf_xdp_ct_alloc, ctx);
108169
return 0;
109170
}
110171

111172
SEC("tc")
112173
int nf_skb_ct_test(struct __sk_buff *ctx)
113174
{
114-
nf_ct_test((void *)bpf_skb_ct_lookup, ctx);
175+
nf_ct_test((void *)bpf_skb_ct_lookup, (void *)bpf_skb_ct_alloc, ctx);
115176
return 0;
116177
}
117178

0 commit comments

Comments
 (0)