> diff --git a/tools/testing/selftests/bpf/progs/test_tc_tunnel.c 
> b/tools/testing/selftests/bpf/progs/test_tc_tunnel.c
> index 7376df405a6b..511022630bb1 100644
> --- a/tools/testing/selftests/bpf/progs/test_tc_tunnel.c
> +++ b/tools/testing/selftests/bpf/progs/test_tc_tunnel.c

[ ... ]

> @@ -621,6 +640,11 @@ static int decap_internal(struct __sk_buff *skb, int 
> off, int len, char proto)
>               break;
>       case IPPROTO_GRE:
>               olen += sizeof(struct gre_hdr);
> +             if (!bpf_core_enum_value_exists(enum bpf_adj_room_flags,
> +                                             BPF_F_ADJ_ROOM_DECAP_L4_GRE))
> +                     return TC_ACT_SHOT;
> +             flags |= BPF_F_ADJ_ROOM_DECAP_L4_GRE;
> +

[ ... ]

> @@ -634,6 +658,10 @@ static int decap_internal(struct __sk_buff *skb, int 
> off, int len, char proto)
>               break;
>       case IPPROTO_UDP:
>               olen += sizeof(struct udphdr);
> +             if (!bpf_core_enum_value_exists(enum bpf_adj_room_flags,
> +                                             BPF_F_ADJ_ROOM_DECAP_L4_UDP))
> +                     return TC_ACT_SHOT;
> +             flags |= BPF_F_ADJ_ROOM_DECAP_L4_UDP;

[ ... ]

> @@ -655,6 +683,35 @@ static int decap_internal(struct __sk_buff *skb, int 
> off, int len, char proto)
>       if (bpf_skb_adjust_room(skb, -olen, BPF_ADJ_ROOM_MAC, flags))
>               return TC_ACT_SHOT;
>
> +     kskb = bpf_cast_to_kern_ctx(skb);
> +     shinfo = bpf_core_cast(kskb->head + kskb->end, struct skb_shared_info);

Could the pointer arithmetic here cause compilation issues on 32-bit
architectures?

On 32-bit architectures without NET_SKBUFF_DATA_USES_OFFSET, sk_buff::end
is defined as a pointer (unsigned char *) rather than an offset. Adding
two pointers is invalid in C and would fail to compile.

Martin KaFai Lau noted that other tests use this pattern and suggested it
could be addressed with bpf_core_field_size(kskb->end) if 32-bit support
becomes necessary in the future.

Ref: https://lore.kernel.org/bpf/[email protected]/

> +     if (!shinfo->gso_size)
> +             return TC_ACT_OK;
> +
> +     if ((flags & BPF_F_ADJ_ROOM_DECAP_L4_UDP) &&
> +         (shinfo->gso_type & SKB_GSO_UDP_TUNNEL_MASK))
> +             return TC_ACT_SHOT;
> +
> +     if ((flags & BPF_F_ADJ_ROOM_DECAP_L4_GRE) &&
> +         (shinfo->gso_type & (SKB_GSO_GRE | SKB_GSO_GRE_CSUM)))
> +             return TC_ACT_SHOT;
> +
> +     if ((flags & BPF_F_ADJ_ROOM_DECAP_IPXIP4) &&
> +         (shinfo->gso_type & SKB_GSO_IPXIP4))
> +             return TC_ACT_SHOT;
> +
> +     if ((flags & BPF_F_ADJ_ROOM_DECAP_IPXIP6) &&
> +         (shinfo->gso_type & SKB_GSO_IPXIP6))
> +             return TC_ACT_SHOT;

Are these IPXIP4 and IPXIP6 checks reachable?

Looking earlier in decap_internal(), for IPPROTO_IPIP and IPPROTO_IPV6
cases, the function only sets BPF_F_ADJ_ROOM_DECAP_L3_IPV4 and
BPF_F_ADJ_ROOM_DECAP_L3_IPV6 on the flags variable (around the protocol
switch statement).

Because BPF_F_ADJ_ROOM_DECAP_IPXIP4 and BPF_F_ADJ_ROOM_DECAP_IPXIP6 are
never added to flags, wouldn't these validation checks always be skipped?

Ref: https://lore.kernel.org/bpf/[email protected]/

> +
> +     if (flags & (BPF_F_ADJ_ROOM_DECAP_L4_MASK |
> +                  BPF_F_ADJ_ROOM_DECAP_IPXIP_MASK)) {
> +             if ((shinfo->gso_type & SKB_GSO_TUNNEL_MASK) && 
> !kskb->encapsulation)
> +                     return TC_ACT_SHOT;
> +             if (!(shinfo->gso_type & SKB_GSO_TUNNEL_MASK) && 
> kskb->encapsulation)
> +                     return TC_ACT_SHOT;
> +     }
> +
>       return TC_ACT_OK;
>  }


---
AI reviewed your patch. Please fix the bug or email reply why it's not a bug.
See: https://github.com/kernel-patches/vmtest/blob/master/ci/claude/README.md

CI run summary: https://github.com/kernel-patches/bpf/actions/runs/24662733093

Reply via email to