@@ -323,6 +323,19 @@ static try_inline int probe_parse_ip(void *ip, parse_ctx_t *ctx)
323323 return -1 ;
324324}
325325
326+ static __always_inline u8 sk_get_protocol (struct sock * sk )
327+ {
328+ u32 flags = _ (((u32 * )(& sk -> __sk_flags_offset ))[0 ]);
329+ u8 l4_proto ;
330+
331+ #ifdef CONFIG_CPU_BIG_ENDIAN
332+ l4_proto = (flags << 8 ) >> 24 ;
333+ #else
334+ l4_proto = (flags << 16 ) >> 24 ;
335+ #endif
336+ return l4_proto ;
337+ }
338+
326339static try_inline int __probe_parse_sk (parse_ctx_t * ctx )
327340{
328341 struct inet_connection_sock * icsk ;
@@ -354,15 +367,17 @@ static try_inline int __probe_parse_sk(parse_ctx_t *ctx)
354367 if (FILTER_CHECK (ctx , l3_proto , l3_proto ))
355368 goto err ;
356369
370+ #ifdef COMPAT_MODE
357371#ifdef BPF_FEAT_SK_PRPTOCOL_LEGACY
358- u32 flags = _ (((u32 * )(& sk -> __sk_flags_offset ))[0 ]);
359- #ifdef CONFIG_CPU_BIG_ENDIAN
360- l4_proto = (flags << 8 ) >> 24 ;
372+ l4_proto = sk_get_protocol (sk );
361373#else
362- l4_proto = ( flags << 16 ) >> 24 ;
374+ l4_proto = _C ( sk , sk_protocol ) ;
363375#endif
364376#else
365- l4_proto = _C (sk , sk_protocol );
377+ if (bpf_core_field_size (sk -> sk_protocol ) == 2 )
378+ l4_proto = _C (sk , sk_protocol );
379+ else
380+ l4_proto = sk_get_protocol (sk );
366381#endif
367382
368383 if (l4_proto == IPPROTO_IP )
0 commit comments