-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
selftests: bpf: add selftest for __sk_buff context in BPF_PROG_TEST_RUN
Simple test that sets cb to {1,2,3,4,5} and priority to 6, runs bpf program that fails if cb is not what we expect and increments cb[i] and priority. When the test finishes, we check that cb is now {2,3,4,5,6} and priority is 7. We also test the sanity checks: * ctx_in is provided, but ctx_size_in is zero (same for ctx_out/ctx_size_out) * unexpected non-zero fields in __sk_buff return EINVAL Signed-off-by: Stanislav Fomichev <sdf@google.com> Acked-by: Martin KaFai Lau <kafai@fb.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
- Loading branch information
Stanislav Fomichev
authored and
Daniel Borkmann
committed
Apr 11, 2019
1 parent
5e903c6
commit 3daf8e7
Showing
2 changed files
with
110 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,89 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
#include <test_progs.h> | ||
|
||
void test_skb_ctx(void) | ||
{ | ||
struct __sk_buff skb = { | ||
.cb[0] = 1, | ||
.cb[1] = 2, | ||
.cb[2] = 3, | ||
.cb[3] = 4, | ||
.cb[4] = 5, | ||
.priority = 6, | ||
}; | ||
struct bpf_prog_test_run_attr tattr = { | ||
.data_in = &pkt_v4, | ||
.data_size_in = sizeof(pkt_v4), | ||
.ctx_in = &skb, | ||
.ctx_size_in = sizeof(skb), | ||
.ctx_out = &skb, | ||
.ctx_size_out = sizeof(skb), | ||
}; | ||
struct bpf_object *obj; | ||
int err; | ||
int i; | ||
|
||
err = bpf_prog_load("./test_skb_ctx.o", BPF_PROG_TYPE_SCHED_CLS, &obj, | ||
&tattr.prog_fd); | ||
if (CHECK_ATTR(err, "load", "err %d errno %d\n", err, errno)) | ||
return; | ||
|
||
/* ctx_in != NULL, ctx_size_in == 0 */ | ||
|
||
tattr.ctx_size_in = 0; | ||
err = bpf_prog_test_run_xattr(&tattr); | ||
CHECK_ATTR(err == 0, "ctx_size_in", "err %d errno %d\n", err, errno); | ||
tattr.ctx_size_in = sizeof(skb); | ||
|
||
/* ctx_out != NULL, ctx_size_out == 0 */ | ||
|
||
tattr.ctx_size_out = 0; | ||
err = bpf_prog_test_run_xattr(&tattr); | ||
CHECK_ATTR(err == 0, "ctx_size_out", "err %d errno %d\n", err, errno); | ||
tattr.ctx_size_out = sizeof(skb); | ||
|
||
/* non-zero [len, tc_index] fields should be rejected*/ | ||
|
||
skb.len = 1; | ||
err = bpf_prog_test_run_xattr(&tattr); | ||
CHECK_ATTR(err == 0, "len", "err %d errno %d\n", err, errno); | ||
skb.len = 0; | ||
|
||
skb.tc_index = 1; | ||
err = bpf_prog_test_run_xattr(&tattr); | ||
CHECK_ATTR(err == 0, "tc_index", "err %d errno %d\n", err, errno); | ||
skb.tc_index = 0; | ||
|
||
/* non-zero [hash, sk] fields should be rejected */ | ||
|
||
skb.hash = 1; | ||
err = bpf_prog_test_run_xattr(&tattr); | ||
CHECK_ATTR(err == 0, "hash", "err %d errno %d\n", err, errno); | ||
skb.hash = 0; | ||
|
||
skb.sk = (struct bpf_sock *)1; | ||
err = bpf_prog_test_run_xattr(&tattr); | ||
CHECK_ATTR(err == 0, "sk", "err %d errno %d\n", err, errno); | ||
skb.sk = 0; | ||
|
||
err = bpf_prog_test_run_xattr(&tattr); | ||
CHECK_ATTR(err != 0 || tattr.retval, | ||
"run", | ||
"err %d errno %d retval %d\n", | ||
err, errno, tattr.retval); | ||
|
||
CHECK_ATTR(tattr.ctx_size_out != sizeof(skb), | ||
"ctx_size_out", | ||
"incorrect output size, want %lu have %u\n", | ||
sizeof(skb), tattr.ctx_size_out); | ||
|
||
for (i = 0; i < 5; i++) | ||
CHECK_ATTR(skb.cb[i] != i + 2, | ||
"ctx_out_cb", | ||
"skb->cb[i] == %d, expected %d\n", | ||
skb.cb[i], i + 2); | ||
CHECK_ATTR(skb.priority != 7, | ||
"ctx_out_priority", | ||
"skb->priority == %d, expected %d\n", | ||
skb.priority, 7); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
// SPDX-License-Identifier: GPL-2.0 | ||
|
||
#include <linux/bpf.h> | ||
#include "bpf_helpers.h" | ||
|
||
int _version SEC("version") = 1; | ||
char _license[] SEC("license") = "GPL"; | ||
|
||
SEC("skb_ctx") | ||
int process(struct __sk_buff *skb) | ||
{ | ||
#pragma clang loop unroll(full) | ||
for (int i = 0; i < 5; i++) { | ||
if (skb->cb[i] != i + 1) | ||
return 1; | ||
skb->cb[i]++; | ||
} | ||
skb->priority++; | ||
|
||
return 0; | ||
} |