__u64 test_result = 0;
SEC("fexit/test_pkt_access") int BPF_PROG(test_main, struct sk_buff *skb, int ret)
{ int len;
__builtin_preserve_access_index(({
len = skb->len;
})); if (len != 74 || ret != 0) return 0;
test_result = 1; return 0;
}
__u64 test_result_subprog1 = 0;
SEC("fexit/test_pkt_access_subprog1") int BPF_PROG(test_subprog1, struct sk_buff *skb, int ret)
{ int len;
__builtin_preserve_access_index(({
len = skb->len;
})); if (len != 74 || ret != 148) return 0;
test_result_subprog1 = 1; return 0;
}
/* Though test_pkt_access_subprog2() is defined in C as: * static __attribute__ ((noinline)) * int test_pkt_access_subprog2(int val, volatile struct __sk_buff *skb) * { * return skb->len * val; * } * llvm optimizations remove 'int val' argument and generate BPF assembly: * r0 = *(u32 *)(r1 + 0) * w0 <<= 1 * exit * In such case the verifier falls back to conservative and * tracing program can access arguments and return value as u64 * instead of accurate types.
*/ struct args_subprog2 {
__u64 args[5];
__u64 ret;
};
__u64 test_result_subprog2 = 0;
SEC("fexit/test_pkt_access_subprog2") int test_subprog2(struct args_subprog2 *ctx)
{ struct sk_buff *skb = (void *)ctx->args[0];
__u64 ret; int len;
ret = ctx->ret; /* bpf_prog_test_load() loads "test_pkt_access.bpf.o" with * BPF_F_TEST_RND_HI32 which randomizes upper 32 bits after BPF_ALU32 * insns. Hence after 'w0 <<= 1' upper bits of $rax are random. That is * expected and correct. Trim them.
*/
ret = (__u32) ret; if (len != 74 || ret != 148) return 0;
test_result_subprog2 = 1; return 0;
}
__u64 test_result_subprog3 = 0;
SEC("fexit/test_pkt_access_subprog3") int BPF_PROG(test_subprog3, int val, struct sk_buff *skb, int ret)
{ int len;
__builtin_preserve_access_index(({
len = skb->len;
})); if (len != 74 || ret != 74 * val || val != 3) return 0;
test_result_subprog3 = 1; return 0;
}
__u64 test_get_skb_len = 0;
SEC("freplace/get_skb_len") int new_get_skb_len(struct __sk_buff *skb)
{ int len = skb->len;
if (len != 74) return 0;
test_get_skb_len = 1; return 74; /* original get_skb_len() returns skb->len */
}
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.