A corner-case for the 3rd-ack after a data-on-synack is for some but not all of the data to be acked. Support this by adding to the retransmit-queue trim routine to handle a linear sk_buff. Signed-off-by: Jeremy Harris <jgh@xxxxxxxx> --- net/ipv4/tcp_output.c | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c index c50553c1c795..bff5934ff04b 100644 --- a/net/ipv4/tcp_output.c +++ b/net/ipv4/tcp_output.c @@ -1708,8 +1708,22 @@ static int __pskb_trim_head(struct sk_buff *skb, int len) struct skb_shared_info *shinfo; int i, k, eat; - DEBUG_NET_WARN_ON_ONCE(skb_headlen(skb)); - eat = len; + eat = skb_headlen(skb); + if (unlikely(eat)) { + if (len < eat) + eat = len; + skb->head += eat; + skb->len -= eat; + if (skb->data_len) + skb->data_len -= eat; + + eat = len - eat; + if (eat == 0) + return len; + } else { + eat = len; + } + k = 0; shinfo = skb_shinfo(skb); for (i = 0; i < shinfo->nr_frags; i++) { -- 2.49.0