diff --git a/bpf/progs/offload.c b/bpf/progs/offload.c index 1c64eb679c..3937ba634d 100644 --- a/bpf/progs/offload.c +++ b/bpf/progs/offload.c @@ -178,6 +178,9 @@ static inline __always_inline int do_forward6(struct __sk_buff* skb, uint64_t packets = 1; uint64_t L3_bytes = skb->len - l2_header_size; if (L3_bytes > v->pmtu) { + if (KVER_IS_AT_LEAST(kver, 5, 4, 0)) { + if (skb->gso_segs <= 1) TC_PUNT(ABOVE_IPV6_PMTU); + } const int tcp6_overhead = sizeof(struct ipv6hdr) + sizeof(struct tcphdr) + 12; const int mss = v->pmtu - tcp6_overhead; const uint64_t payload = L3_bytes - tcp6_overhead; diff --git a/bpf/progs/offload.h b/bpf/progs/offload.h index 4d6d3e41f6..870983ec7d 100644 --- a/bpf/progs/offload.h +++ b/bpf/progs/offload.h @@ -41,6 +41,7 @@ ERR(BELOW_IPV4_MTU) \ ERR(ABOVE_IPV4_PMTU) \ ERR(BELOW_IPV6_MTU) \ + ERR(ABOVE_IPV6_PMTU) \ ERR(LIMIT_REACHED) \ ERR(CHANGE_HEAD_FAILED) \ ERR(TOO_SHORT) \