Skip to content

Commit 2596f64

Browse files
jrfastabborkmann
authored andcommitted
bpf: sockmap, add BPF_F_INGRESS tests
Add a set of tests to verify ingress flag in redirect helpers works correctly with various msg sizes. Signed-off-by: John Fastabend <[email protected]> Signed-off-by: Daniel Borkmann <[email protected]>
1 parent 8934ce2 commit 2596f64

File tree

3 files changed

+87
-11
lines changed

3 files changed

+87
-11
lines changed

samples/sockmap/sockmap_kern.c

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ struct bpf_map_def SEC("maps") sock_map_redir = {
5454
.type = BPF_MAP_TYPE_SOCKMAP,
5555
.key_size = sizeof(int),
5656
.value_size = sizeof(int),
57-
.max_entries = 1,
57+
.max_entries = 20,
5858
};
5959

6060
struct bpf_map_def SEC("maps") sock_apply_bytes = {
@@ -78,6 +78,13 @@ struct bpf_map_def SEC("maps") sock_pull_bytes = {
7878
.max_entries = 2
7979
};
8080

81+
struct bpf_map_def SEC("maps") sock_redir_flags = {
82+
.type = BPF_MAP_TYPE_ARRAY,
83+
.key_size = sizeof(int),
84+
.value_size = sizeof(int),
85+
.max_entries = 1
86+
};
87+
8188

8289
SEC("sk_skb1")
8390
int bpf_prog1(struct __sk_buff *skb)
@@ -197,8 +204,9 @@ int bpf_prog5(struct sk_msg_md *msg)
197204
SEC("sk_msg3")
198205
int bpf_prog6(struct sk_msg_md *msg)
199206
{
200-
int *bytes, zero = 0, one = 1;
201-
int *start, *end;
207+
int *bytes, zero = 0, one = 1, key = 0;
208+
int *start, *end, *f;
209+
__u64 flags = 0;
202210

203211
bytes = bpf_map_lookup_elem(&sock_apply_bytes, &zero);
204212
if (bytes)
@@ -210,15 +218,22 @@ int bpf_prog6(struct sk_msg_md *msg)
210218
end = bpf_map_lookup_elem(&sock_pull_bytes, &one);
211219
if (start && end)
212220
bpf_msg_pull_data(msg, *start, *end, 0);
213-
return bpf_msg_redirect_map(msg, &sock_map_redir, zero, 0);
221+
f = bpf_map_lookup_elem(&sock_redir_flags, &zero);
222+
if (f && *f) {
223+
key = 2;
224+
flags = *f;
225+
}
226+
return bpf_msg_redirect_map(msg, &sock_map_redir, key, flags);
214227
}
215228

216229
SEC("sk_msg4")
217230
int bpf_prog7(struct sk_msg_md *msg)
218231
{
219-
int err1 = 0, err2 = 0, zero = 0, one = 1;
220-
int *bytes, *start, *end, len1, len2;
232+
int err1 = 0, err2 = 0, zero = 0, one = 1, key = 0;
233+
int *f, *bytes, *start, *end, len1, len2;
234+
__u64 flags = 0;
221235

236+
int err;
222237
bytes = bpf_map_lookup_elem(&sock_apply_bytes, &zero);
223238
if (bytes)
224239
err1 = bpf_msg_apply_bytes(msg, *bytes);
@@ -229,7 +244,6 @@ int bpf_prog7(struct sk_msg_md *msg)
229244
start = bpf_map_lookup_elem(&sock_pull_bytes, &zero);
230245
end = bpf_map_lookup_elem(&sock_pull_bytes, &one);
231246
if (start && end) {
232-
int err;
233247

234248
bpf_printk("sk_msg2: pull(%i:%i)\n",
235249
start ? *start : 0, end ? *end : 0);
@@ -241,9 +255,16 @@ int bpf_prog7(struct sk_msg_md *msg)
241255
bpf_printk("sk_msg2: length update %i->%i\n",
242256
len1, len2);
243257
}
244-
bpf_printk("sk_msg3: redirect(%iB) err1=%i err2=%i\n",
245-
len1, err1, err2);
246-
return bpf_msg_redirect_map(msg, &sock_map_redir, zero, 0);
258+
f = bpf_map_lookup_elem(&sock_redir_flags, &zero);
259+
if (f && *f) {
260+
key = 2;
261+
flags = *f;
262+
}
263+
bpf_printk("sk_msg3: redirect(%iB) flags=%i err=%i\n",
264+
len1, flags, err1 ? err1 : err2);
265+
err = bpf_msg_redirect_map(msg, &sock_map_redir, key, flags);
266+
bpf_printk("sk_msg3: err %i\n", err);
267+
return err;
247268
}
248269

249270
SEC("sk_msg5")

samples/sockmap/sockmap_test.sh

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#Test a bunch of positive cases to verify basic functionality
2-
for prog in "--txmsg" "--txmsg_redir" "--txmsg_drop"; do
2+
for prog in "--txmsg_redir --txmsg_ingress" "--txmsg" "--txmsg_redir" "--txmsg_redir --txmsg_ingress" "--txmsg_drop"; do
33
for t in "sendmsg" "sendpage"; do
44
for r in 1 10 100; do
55
for i in 1 10 100; do
@@ -100,6 +100,16 @@ for t in "sendmsg" "sendpage"; do
100100
sleep 2
101101
done
102102

103+
prog="--txmsg_redir --txmsg_apply 1 --txmsg_ingress"
104+
105+
for t in "sendmsg" "sendpage"; do
106+
TEST="./sockmap --cgroup /mnt/cgroup2/ -t $t -r $r -i $i -l $l $prog"
107+
echo $TEST
108+
$TEST
109+
sleep 2
110+
done
111+
112+
103113
# Test apply and redirect with larger value than send
104114
r=1
105115
i=8
@@ -113,6 +123,16 @@ for t in "sendmsg" "sendpage"; do
113123
sleep 2
114124
done
115125

126+
prog="--txmsg_redir --txmsg_apply 2048 --txmsg_ingress"
127+
128+
for t in "sendmsg" "sendpage"; do
129+
TEST="./sockmap --cgroup /mnt/cgroup2/ -t $t -r $r -i $i -l $l $prog"
130+
echo $TEST
131+
$TEST
132+
sleep 2
133+
done
134+
135+
116136
# Test apply and redirect with apply that never reaches limit
117137
r=1024
118138
i=1

samples/sockmap/sockmap_user.c

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ int txmsg_apply;
6464
int txmsg_cork;
6565
int txmsg_start;
6666
int txmsg_end;
67+
int txmsg_ingress;
6768

6869
static const struct option long_options[] = {
6970
{"help", no_argument, NULL, 'h' },
@@ -83,6 +84,7 @@ static const struct option long_options[] = {
8384
{"txmsg_cork", required_argument, NULL, 'k'},
8485
{"txmsg_start", required_argument, NULL, 's'},
8586
{"txmsg_end", required_argument, NULL, 'e'},
87+
{"txmsg_ingress", no_argument, &txmsg_ingress, 1 },
8688
{0, 0, NULL, 0 }
8789
};
8890

@@ -793,6 +795,39 @@ int main(int argc, char **argv)
793795
return err;
794796
}
795797
}
798+
799+
if (txmsg_ingress) {
800+
int in = BPF_F_INGRESS;
801+
802+
i = 0;
803+
err = bpf_map_update_elem(map_fd[6], &i, &in, BPF_ANY);
804+
if (err) {
805+
fprintf(stderr,
806+
"ERROR: bpf_map_update_elem (txmsg_ingress): %d (%s)\n",
807+
err, strerror(errno));
808+
}
809+
i = 1;
810+
err = bpf_map_update_elem(map_fd[1], &i, &p1, BPF_ANY);
811+
if (err) {
812+
fprintf(stderr,
813+
"ERROR: bpf_map_update_elem (p1 txmsg): %d (%s)\n",
814+
err, strerror(errno));
815+
}
816+
err = bpf_map_update_elem(map_fd[2], &i, &p1, BPF_ANY);
817+
if (err) {
818+
fprintf(stderr,
819+
"ERROR: bpf_map_update_elem (p1 redir): %d (%s)\n",
820+
err, strerror(errno));
821+
}
822+
823+
i = 2;
824+
err = bpf_map_update_elem(map_fd[2], &i, &p2, BPF_ANY);
825+
if (err) {
826+
fprintf(stderr,
827+
"ERROR: bpf_map_update_elem (p2 txmsg): %d (%s)\n",
828+
err, strerror(errno));
829+
}
830+
}
796831
}
797832

798833
if (txmsg_drop)

0 commit comments

Comments
 (0)