SEC("tc") int kfunc_call_test1(struct __sk_buff *skb)
{ struct bpf_sock *sk = skb->sk;
__u64 a = 1ULL << 32;
__u32 ret;
if (!sk) return -1;
sk = bpf_sk_fullsock(sk); if (!sk) return -1;
a = bpf_kfunc_call_test1((struct sock *)sk, 1, a | 2, 3, a | 4);
ret = a >> 32; /* ret should be 2 */
ret += (__u32)a; /* ret should be 12 */
return ret;
}
SEC("tc") int kfunc_call_test_ref_btf_id(struct __sk_buff *skb)
{ struct prog_test_ref_kfunc *pt; unsignedlong s = 0; int ret = 0;
pt = bpf_kfunc_call_test_acquire(&s); if (pt) { if (pt->a != 42 || pt->b != 108)
ret = -1;
bpf_kfunc_call_test_release(pt);
} return ret;
}
SEC("tc") int kfunc_call_test_pass(struct __sk_buff *skb)
{ struct prog_test_pass1 p1 = {}; struct prog_test_pass2 p2 = {}; short a = 0;
__u64 b = 0; long c = 0; char d = 0; int e = 0;
SEC("syscall") int kfunc_syscall_test_null(struct syscall_test_args *args)
{ /* Must be called with args as a NULL pointer * we do not check for it to have the verifier consider that * the pointer might not be null, and so we can load it. * * So the following can not be added: * * if (args) * return -22;
*/
bpf_kfunc_call_test_mem_len_pass1(args, 0);
return 0;
}
SEC("tc") int kfunc_call_test_get_mem(struct __sk_buff *skb)
{ struct prog_test_ref_kfunc *pt; unsignedlong s = 0; int *p = NULL; int ret = 0;
pt = bpf_kfunc_call_test_acquire(&s); if (pt) {
p = bpf_kfunc_call_test_get_rdwr_mem(pt, 2 * sizeof(int)); if (p) {
p[0] = 42;
ret = p[1]; /* 108 */
} else {
ret = -1;
}
if (ret >= 0) {
p = bpf_kfunc_call_test_get_rdonly_mem(pt, 2 * sizeof(int)); if (p)
ret = p[0]; /* 42 */ else
ret = -1;
}
bpf_kfunc_call_test_release(pt);
} return ret;
}
SEC("tc") int kfunc_call_test_static_unused_arg(struct __sk_buff *skb)
{
u32 expected = 5, actual;
actual = bpf_kfunc_call_test_static_unused_arg(expected, 0xdeadbeef); return actual != expected ? -1 : 0;
}
SEC("tc") int kfunc_call_ctx(struct __sk_buff *skb)
{ struct bpf_testmod_ctx *ctx; int err = 0;
ctx = bpf_testmod_ctx_create(&err); if (!ctx && !err)
err = -1; if (ctx) { int key = 0; struct ctx_val *ctx_val = bpf_map_lookup_elem(&ctx_map, &key);
/* Transfer ctx to map to be freed via implicit dtor call * on cleanup.
*/ if (ctx_val)
ctx = bpf_kptr_xchg(&ctx_val->ctx, ctx); if (ctx) {
bpf_testmod_ctx_release(ctx);
err = -1;
}
} return err;
}
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.