diff --git a/src/linux/net/newip/tcp_nip_input.c b/src/linux/net/newip/tcp_nip_input.c index 0e3b1fffde7b9b0438251a6bcbadbf2ed6448531..4e92daaa967505573eba794ed3fd386333b1a87a 100644 --- a/src/linux/net/newip/tcp_nip_input.c +++ b/src/linux/net/newip/tcp_nip_input.c @@ -340,7 +340,15 @@ coalesce_done: goto insert; } - if (after(seq, TCP_SKB_CB(tp->ooo_last_skb)->seq)) { + if (!before(seq, TCP_SKB_CB(tp->ooo_last_skb)->seq)) { + if (!after(end_seq, TCP_SKB_CB(tp->ooo_last_skb)->end_seq)) { + /* ooo_last_skb->seq <= seq, end_seq <= ooo_last_skb->end_seq */ + nip_dbg("ooo_last_skb completely overlapping new skb, drop pkt"); + NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPOFOMERGE); + tcp_nip_drop(sk, skb); + skb = NULL; + goto end; + } tcp_nip_left_overlap(skb, tp->ooo_last_skb); if (tcp_nip_ooo_try_coalesce(sk, tp->ooo_last_skb, skb, &fragstolen)) { nip_dbg("ofo skb coalesce ooo_last_skb done");