diff --git a/shared/bpf/skb_parse.h b/shared/bpf/skb_parse.h index a6460fd..d8abc50 100644 --- a/shared/bpf/skb_parse.h +++ b/shared/bpf/skb_parse.h @@ -323,6 +323,19 @@ static try_inline int probe_parse_ip(void *ip, parse_ctx_t *ctx) return -1; } +static __always_inline u8 sk_get_protocol(struct sock *sk) +{ + u32 flags = _(((u32 *)(&sk->__sk_flags_offset))[0]); + u8 l4_proto; + +#ifdef CONFIG_CPU_BIG_ENDIAN + l4_proto = (flags << 8) >> 24; +#else + l4_proto = (flags << 16) >> 24; +#endif + return l4_proto; +} + static try_inline int __probe_parse_sk(parse_ctx_t *ctx) { struct inet_connection_sock *icsk; @@ -354,15 +367,17 @@ static try_inline int __probe_parse_sk(parse_ctx_t *ctx) if (FILTER_CHECK(ctx, l3_proto, l3_proto)) goto err; +#ifdef COMPAT_MODE #ifdef BPF_FEAT_SK_PRPTOCOL_LEGACY - u32 flags = _(((u32 *)(&sk->__sk_flags_offset))[0]); -#ifdef CONFIG_CPU_BIG_ENDIAN - l4_proto = (flags << 8) >> 24; + l4_proto = sk_get_protocol(sk); #else - l4_proto = (flags << 16) >> 24; + l4_proto = _C(sk, sk_protocol); #endif #else - l4_proto = _C(sk, sk_protocol); + if (bpf_core_field_size(sk->sk_protocol) == 2) + l4_proto = _C(sk, sk_protocol); + else + l4_proto = sk_get_protocol(sk); #endif if (l4_proto == IPPROTO_IP) diff --git a/shared/bpf/vmlinux_arm64.h b/shared/bpf/vmlinux_arm64.h index fba6cad..572e649 100644 --- a/shared/bpf/vmlinux_arm64.h +++ b/shared/bpf/vmlinux_arm64.h @@ -8018,16 +8018,16 @@ struct sock { unsigned int sk_gso_max_size; gfp_t sk_allocation; __u32 sk_txhash; - unsigned int __sk_flags_offset[0]; - unsigned int sk_padding: 1; - unsigned int sk_kern_sock: 1; - unsigned int sk_no_check_tx: 1; - unsigned int sk_no_check_rx: 1; - unsigned int sk_userlocks: 4; - unsigned int sk_protocol: 8; - unsigned int sk_type: 16; - u16 sk_gso_max_segs; + unsigned int __sk_flags_offset[0]; + u8 sk_padding: 1; + u8 sk_kern_sock: 1; + u8 sk_no_check_tx: 1; + u8 sk_no_check_rx: 1; + u8 sk_userlocks: 4; u8 sk_pacing_shift; + u16 sk_type; + u16 sk_protocol; + u16 sk_gso_max_segs; long unsigned int sk_lingertime; struct proto *sk_prot_creator; rwlock_t sk_callback_lock; diff --git a/shared/bpf/vmlinux_x86.h b/shared/bpf/vmlinux_x86.h index 914b8f6..483375b 100644 --- a/shared/bpf/vmlinux_x86.h +++ b/shared/bpf/vmlinux_x86.h @@ -8733,6 +8733,7 @@ struct sock { unsigned int sk_gso_max_size; gfp_t sk_allocation; __u32 sk_txhash; + unsigned int __sk_flags_offset[0]; u8 sk_padding: 1; u8 sk_kern_sock: 1; u8 sk_no_check_tx: 1;