diff --git a/newip/third_party/linux-5.10/include/net/tcp_nip.h b/newip/third_party/linux-5.10/include/net/tcp_nip.h index 1e30efd..feece7a 100644 --- a/newip/third_party/linux-5.10/include/net/tcp_nip.h +++ b/newip/third_party/linux-5.10/include/net/tcp_nip.h @@ -163,6 +163,12 @@ static inline struct tcp_nip_request_sock *tcp_nip_rsk(const struct request_sock return (struct tcp_nip_request_sock *)req; } +static inline void tcp_nip_modify_send_head(struct sock *sk, const struct sk_buff *skb) +{ + if (tcp_skb_is_last(sk, skb)) + sk->sk_send_head = NULL; +} + /* connect */ int __tcp_nip_connect(struct sock *sk); int _tcp_nip_conn_request(struct request_sock_ops *rsk_ops, diff --git a/newip/third_party/linux-5.10/net/newip/tcp_nip.c b/newip/third_party/linux-5.10/net/newip/tcp_nip.c index 39a2c7f..0d1a771 100644 --- a/newip/third_party/linux-5.10/net/newip/tcp_nip.c +++ b/newip/third_party/linux-5.10/net/newip/tcp_nip.c @@ -1578,6 +1578,7 @@ out: do_fault: if (!skb->len) { + tcp_nip_modify_send_head(sk, skb); tcp_unlink_write_queue(skb, sk); sk_wmem_free_skb(sk, skb); } diff --git a/newip/third_party/linux-5.10/net/newip/tcp_nip_input.c b/newip/third_party/linux-5.10/net/newip/tcp_nip_input.c index 7c2eabf..0fedaf2 100644 --- a/newip/third_party/linux-5.10/net/newip/tcp_nip_input.c +++ b/newip/third_party/linux-5.10/net/newip/tcp_nip_input.c @@ -817,6 +817,7 @@ static int tcp_nip_clean_rtx_queue(struct sock *sk, ktime_t *skb_snd_tstamp) if (*skb_snd_tstamp == 0) *skb_snd_tstamp = skb->tstamp; + tcp_nip_modify_send_head(sk, skb); tcp_unlink_write_queue(skb, sk); sk_wmem_free_skb(sk, skb); }