Skip to content

Commit 8f63bdc

Browse files
committed
feat: pkg/plugin/dropreason/_cprog/drop_reason.c: support Linux 6.10+
See #1906 for details. Signed-off-by: Mateusz Gozdek <[email protected]>
1 parent a84dd36 commit 8f63bdc

File tree

1 file changed

+32
-5
lines changed

1 file changed

+32
-5
lines changed

pkg/plugin/dropreason/_cprog/drop_reason.c

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -361,15 +361,30 @@ int BPF_PROG(tcp_v4_connect_fexit, struct sock *sk, struct sockaddr *uaddr, int
361361
}
362362

363363
SEC("kprobe/inet_csk_accept")
364-
int BPF_KPROBE(inet_csk_accept, struct sock *sk, int flags, int *err, bool kern)
364+
int BPF_KPROBE(inet_csk_accept)
365365
{
366366
/*
367367
This function will save the reference value to error.
368368
in kretprobe we look at the value we got back in that reference
369369
*/
370370
__u64 pid_tgid = bpf_get_current_pid_tgid();
371371
__u32 pid = pid_tgid >> 32;
372-
__u64 err_ptr = (__u64)err;
372+
373+
__u64 err_ptr = 0;
374+
375+
// Linux v6.10-rc1+
376+
// https://github.com/torvalds/linux/commit/92ef0fd55ac80dfc2e4654edfe5d1ddfa6e070fe
377+
if (bpf_core_type_exists(struct proto_accept_arg)) {
378+
struct proto_accept_arg *arg = (struct proto_accept_arg *)PT_REGS_PARM2(ctx);
379+
380+
int *err_ptr_raw = 0;
381+
bpf_core_read(&err_ptr_raw, sizeof(err_ptr_raw), &arg->err);
382+
err_ptr = (__u64)err_ptr_raw;
383+
} else {
384+
int *err = (int *)PT_REGS_PARM3(ctx);
385+
err_ptr = (__u64)err;
386+
}
387+
373388
bpf_map_update_elem(&retina_dropreason_accept_pids, &pid, &err_ptr, BPF_ANY);
374389
return 0;
375390
}
@@ -418,16 +433,28 @@ int BPF_KRETPROBE(inet_csk_accept_ret, struct sock *sk)
418433
}
419434

420435
SEC("fexit/inet_csk_accept")
421-
int BPF_PROG(inet_csk_accept_fexit, struct sock *sk, int flags, int *err, struct sock *retsk)
436+
int BPF_PROG(inet_csk_accept_fexit)
422437
{
438+
// Use bpf_core_read for compatibility with both Linux v6.10-rc1+ and older versions.
439+
// https://github.com/torvalds/linux/commit/92ef0fd55ac80dfc2e4654edfe5d1ddfa6e070fe
440+
struct sock *retsk = NULL;
441+
442+
int offset;
443+
if (bpf_core_type_exists(struct proto_accept_arg))
444+
offset = 8 * 2; // Linux 6.10+: 2 parameters (sk, arg)
445+
else
446+
offset = 8 * 4; // Older kernels: 4 parameters (sk, newsock, flags, err)
447+
448+
bpf_core_read(&retsk, sizeof(retsk), (void *)ctx + offset);
449+
423450
if (retsk != NULL) {
424451
return 0;
425452
}
426453

427454
// TODO
428455
// Pass 0 packet length - get_packet_from_sock above doesn't obtain this value, either.
429456
// Pass 0 return value; verifier failure, same as buggy kprobe above.
430-
update_metrics_map_basic(TCP_ACCEPT_BASIC, 0, 0);
457+
update_metrics_map_basic(TCP_ACCEPT_BASIC, 0, 0);
431458

432459
return 0;
433460
}
@@ -552,4 +579,4 @@ int BPF_PROG(nf_conntrack_confirm_fexit, struct sk_buff *skb, int retVal)
552579

553580
update_metrics_map_basic(CONNTRACK_ADD_DROP, retVal, skb_len);
554581
return 0;
555-
}
582+
}

0 commit comments

Comments
 (0)