@@ -361,15 +361,30 @@ int BPF_PROG(tcp_v4_connect_fexit, struct sock *sk, struct sockaddr *uaddr, int
361361}
362362
363363SEC ("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
420435SEC ("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