summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFengyuan Gong <gfengyuan@google.com>2025-07-02 16:07:41 +0000
committerJakub Kicinski <kuba@kernel.org>2025-07-08 08:55:33 -0700
commita41851bea7bfb627d00dc51252857019594b5758 (patch)
treec63e6a16bf99e7e7e998c220e1fade90eae10478
parent7725a35e7409cf00fa03717e87e00a810eacfbf7 (diff)
downloadlinux-a41851bea7bfb627d00dc51252857019594b5758.tar.gz
linux-a41851bea7bfb627d00dc51252857019594b5758.zip
net: account for encap headers in qdisc pkt len
Refine qdisc_pkt_len_init to include headers up through the inner transport header when computing header size for encapsulations. Also refine net/sched/sch_cake.c borrowed from qdisc_pkt_len_init(). Signed-off-by: Fengyuan Gong <gfengyuan@google.com> Reviewed-by: Willem de Bruijn <willemb@google.com> Reviewed-by: Eric Dumazet <edumazet@google.com> Acked-by: Toke Høiland-Jørgensen <toke@redhat.com> Link: https://patch.msgid.link/20250702160741.1204919-1-gfengyuan@google.com Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-rw-r--r--net/core/dev.c5
-rw-r--r--net/sched/sch_cake.c5
2 files changed, 8 insertions, 2 deletions
diff --git a/net/core/dev.c b/net/core/dev.c
index 96d33dead604..ea129aa08317 100644
--- a/net/core/dev.c
+++ b/net/core/dev.c
@@ -4026,7 +4026,10 @@ static void qdisc_pkt_len_init(struct sk_buff *skb)
unsigned int hdr_len;
/* mac layer + network layer */
- hdr_len = skb_transport_offset(skb);
+ if (!skb->encapsulation)
+ hdr_len = skb_transport_offset(skb);
+ else
+ hdr_len = skb_inner_transport_offset(skb);
/* + transport layer */
if (likely(shinfo->gso_type & (SKB_GSO_TCPV4 | SKB_GSO_TCPV6))) {
diff --git a/net/sched/sch_cake.c b/net/sched/sch_cake.c
index 48dd8c88903f..dbcfb948c867 100644
--- a/net/sched/sch_cake.c
+++ b/net/sched/sch_cake.c
@@ -1407,7 +1407,10 @@ static u32 cake_overhead(struct cake_sched_data *q, const struct sk_buff *skb)
return cake_calc_overhead(q, len, off);
/* borrowed from qdisc_pkt_len_init() */
- hdr_len = skb_transport_offset(skb);
+ if (!skb->encapsulation)
+ hdr_len = skb_transport_offset(skb);
+ else
+ hdr_len = skb_inner_transport_offset(skb);
/* + transport layer */
if (likely(shinfo->gso_type & (SKB_GSO_TCPV4 |