Skip to content

Commit 4687d1c

Browse files
committed
bpf: allow new DECAP flags and add guard rails
commit-author Nick Hudson <nhudson@akamai.com> commit - commit-source https://lore.kernel.org/netdev/20260504101759.3319427-5-nhudson@akamai.com/ Add checks to require shrink-only decap, reject conflicting decap flag combinations, and verify removed length is sufficient for claimed header decapsulation. Co-developed-by: Max Tottenham <mtottenh@akamai.com> Signed-off-by: Max Tottenham <mtottenh@akamai.com> Co-developed-by: Anna Glasgall <aglasgal@akamai.com> Signed-off-by: Anna Glasgall <aglasgal@akamai.com> Signed-off-by: Nick Hudson <nhudson@akamai.com> Reviewed-by: Willem de Bruijn <willemb@google.com> Signed-off-by: Brett Mastbergen <bmastbergen@ciq.com>
1 parent bd9e5af commit 4687d1c

1 file changed

Lines changed: 43 additions & 1 deletion

File tree

net/core/filter.c

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
#include <net/sock_reuseport.h>
5757
#include <net/busy_poll.h>
5858
#include <net/tcp.h>
59+
#include <net/gre.h>
5960
#include <net/xfrm.h>
6061
#include <net/udp.h>
6162
#include <linux/bpf_trace.h>
@@ -3420,14 +3421,22 @@ static u32 bpf_skb_net_base_len(const struct sk_buff *skb)
34203421
#define BPF_F_ADJ_ROOM_DECAP_L3_MASK (BPF_F_ADJ_ROOM_DECAP_L3_IPV4 | \
34213422
BPF_F_ADJ_ROOM_DECAP_L3_IPV6)
34223423

3424+
#define BPF_F_ADJ_ROOM_DECAP_L4_MASK (BPF_F_ADJ_ROOM_DECAP_L4_UDP | \
3425+
BPF_F_ADJ_ROOM_DECAP_L4_GRE)
3426+
3427+
#define BPF_F_ADJ_ROOM_DECAP_IPXIP_MASK (BPF_F_ADJ_ROOM_DECAP_IPXIP4 | \
3428+
BPF_F_ADJ_ROOM_DECAP_IPXIP6)
3429+
34233430
#define BPF_F_ADJ_ROOM_ENCAP_MASK (BPF_F_ADJ_ROOM_ENCAP_L3_MASK | \
34243431
BPF_F_ADJ_ROOM_ENCAP_L4_GRE | \
34253432
BPF_F_ADJ_ROOM_ENCAP_L4_UDP | \
34263433
BPF_F_ADJ_ROOM_ENCAP_L2_ETH | \
34273434
BPF_F_ADJ_ROOM_ENCAP_L2( \
34283435
BPF_ADJ_ROOM_ENCAP_L2_MASK))
34293436

3430-
#define BPF_F_ADJ_ROOM_DECAP_MASK (BPF_F_ADJ_ROOM_DECAP_L3_MASK)
3437+
#define BPF_F_ADJ_ROOM_DECAP_MASK (BPF_F_ADJ_ROOM_DECAP_L3_MASK | \
3438+
BPF_F_ADJ_ROOM_DECAP_L4_MASK | \
3439+
BPF_F_ADJ_ROOM_DECAP_IPXIP_MASK)
34313440

34323441
#define BPF_F_ADJ_ROOM_MASK (BPF_F_ADJ_ROOM_FIXED_GSO | \
34333442
BPF_F_ADJ_ROOM_ENCAP_MASK | \
@@ -3669,6 +3678,8 @@ BPF_CALL_4(bpf_skb_adjust_room, struct sk_buff *, skb, s32, len_diff,
36693678
}
36703679

36713680
if (flags & BPF_F_ADJ_ROOM_DECAP_MASK) {
3681+
u32 len_decap_min = 0;
3682+
36723683
if (!shrink)
36733684
return -EINVAL;
36743685

@@ -3677,6 +3688,37 @@ BPF_CALL_4(bpf_skb_adjust_room, struct sk_buff *, skb, s32, len_diff,
36773688
BPF_F_ADJ_ROOM_DECAP_L3_MASK)
36783689
return -EINVAL;
36793690

3691+
if ((flags & BPF_F_ADJ_ROOM_DECAP_L4_MASK) ==
3692+
BPF_F_ADJ_ROOM_DECAP_L4_MASK)
3693+
return -EINVAL;
3694+
3695+
if ((flags & BPF_F_ADJ_ROOM_DECAP_IPXIP_MASK) ==
3696+
BPF_F_ADJ_ROOM_DECAP_IPXIP_MASK)
3697+
return -EINVAL;
3698+
3699+
/* Reject mutually exclusive decap tunnel type flags. */
3700+
if ((flags & BPF_F_ADJ_ROOM_DECAP_L4_MASK) &&
3701+
(flags & BPF_F_ADJ_ROOM_DECAP_IPXIP_MASK))
3702+
return -EINVAL;
3703+
3704+
if (flags & BPF_F_ADJ_ROOM_DECAP_L4_MASK)
3705+
len_decap_min += bpf_skb_net_base_len(skb);
3706+
3707+
if (flags & BPF_F_ADJ_ROOM_DECAP_L4_UDP)
3708+
len_decap_min += sizeof(struct udphdr);
3709+
3710+
if (flags & BPF_F_ADJ_ROOM_DECAP_L4_GRE)
3711+
len_decap_min += sizeof(struct gre_base_hdr);
3712+
3713+
if (flags & BPF_F_ADJ_ROOM_DECAP_IPXIP4)
3714+
len_decap_min += sizeof(struct iphdr);
3715+
3716+
if (flags & BPF_F_ADJ_ROOM_DECAP_IPXIP6)
3717+
len_decap_min += sizeof(struct ipv6hdr);
3718+
3719+
if (len_diff_abs < len_decap_min)
3720+
return -EINVAL;
3721+
36803722
if (flags & BPF_F_ADJ_ROOM_DECAP_L3_IPV4)
36813723
len_min = sizeof(struct iphdr);
36823724

0 commit comments

Comments
 (0)