Skip to content

Commit 5455e74

Browse files
Asphalttbrb
authored andcommitted
Fix verifier error to run --filter-trace-tc + --filter-track-bpf-helpers
When to run `./pwru --filter-track-bpf-helpers --filter-trace-tc --filter-func '.*udp.*' --output-limit-lines 10 icmp`, there will be a verifier error: ```log 2024/10/08 13:11:17 Attaching tc-bpf progs... 2024/10/08 13:11:17 failed to trace TC progs: failed to trace bpf progs: failed to load objects: Verifier error: load program: permission denied: func#0 @0 func#1 @43 func#2 @1062 func#3 @1118 0: R1=ctx() R10=fp0 ; int BPF_PROG(fentry_tc, struct sk_buff *skb) { @ kprobe_pwru.c:594 ... ; u64 fp = PT_REGS_FP(ctx); @ kprobe_pwru.c:399 69: (79) r1 = *(u64 *)(r10 -64) ; frame1: R1_w=ctx() R10=fp0 fp-64=ctx() 70: (79) r7 = *(u64 *)(r1 +32) func 'entry2' doesn't have 3-th argument invalid bpf_context access off=32 size=8 processed 51 insns (limit 1000000) max_states_per_insn 0 total_states 1 peak_states 1 mark_read 1 program fentry_tc: load program: permission denied: func 'entry2' doesn't have 3-th argument: invalid bpf_context access off=32 size=8 (110 line(s) omitted) ``` That's because `fentry` does not support `PT_REGS_FP`. And, there's no way for `fentry` to get FP. So, let us skip getting FP for `fentry_tc`. Signed-off-by: Leon Hwang <[email protected]>
1 parent bde4f64 commit 5455e74

File tree

1 file changed

+6
-6
lines changed

1 file changed

+6
-6
lines changed

bpf/kprobe_pwru.c

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -434,13 +434,13 @@ set_output(void *ctx, struct sk_buff *skb, struct event_t *event) {
434434
}
435435

436436
static __noinline bool
437-
handle_everything(struct sk_buff *skb, void *ctx, struct event_t *event, u64 *_stackid) {
437+
handle_everything(struct sk_buff *skb, void *ctx, struct event_t *event, u64 *_stackid, const bool is_kprobe) {
438438
u8 tracked_by;
439439
u64 skb_addr = (u64) skb;
440440
u64 skb_head = (u64) BPF_CORE_READ(skb, head);
441441
u64 stackid;
442442

443-
if (cfg->track_skb_by_stackid)
443+
if (cfg->track_skb_by_stackid && is_kprobe)
444444
stackid = _stackid ? *_stackid : get_stackid(ctx);
445445

446446
if (cfg->is_set) {
@@ -457,7 +457,7 @@ handle_everything(struct sk_buff *skb, void *ctx, struct event_t *event, u64 *_s
457457
goto cont;
458458
}
459459

460-
if (cfg->track_skb_by_stackid && bpf_map_lookup_elem(&stackid_skb, &stackid)) {
460+
if (cfg->track_skb_by_stackid && is_kprobe && bpf_map_lookup_elem(&stackid_skb, &stackid)) {
461461
tracked_by = TRACKED_BY_STACKID;
462462
goto cont;
463463
}
@@ -479,7 +479,7 @@ handle_everything(struct sk_buff *skb, void *ctx, struct event_t *event, u64 *_s
479479
bpf_map_update_elem(&xdp_dhs_skb_heads, &skb_head, &skb_addr, BPF_ANY);
480480
}
481481

482-
if (cfg->track_skb_by_stackid && tracked_by != TRACKED_BY_STACKID) {
482+
if (cfg->track_skb_by_stackid && is_kprobe && tracked_by != TRACKED_BY_STACKID) {
483483
u64 *old_stackid = bpf_map_lookup_elem(&skb_stackid, &skb);
484484
if (old_stackid && *old_stackid != stackid) {
485485
bpf_map_delete_elem(&stackid_skb, old_stackid);
@@ -499,7 +499,7 @@ static __always_inline int
499499
kprobe_skb(struct sk_buff *skb, struct pt_regs *ctx, bool has_get_func_ip, u64 *_stackid) {
500500
struct event_t event = {};
501501

502-
if (!handle_everything(skb, ctx, &event, _stackid))
502+
if (!handle_everything(skb, ctx, &event, _stackid, true))
503503
return BPF_OK;
504504

505505
event.skb_addr = (u64) skb;
@@ -596,7 +596,7 @@ SEC("fentry/tc")
596596
int BPF_PROG(fentry_tc, struct sk_buff *skb) {
597597
struct event_t event = {};
598598

599-
if (!handle_everything(skb, ctx, &event, NULL))
599+
if (!handle_everything(skb, ctx, &event, NULL, false))
600600
return BPF_OK;
601601

602602
event.skb_addr = (u64) skb;

0 commit comments

Comments
 (0)