From owner-p4-projects@FreeBSD.ORG Mon Jan 14 01:56:06 2008 Return-Path: Delivered-To: p4-projects@freebsd.org Received: by hub.freebsd.org (Postfix, from userid 32767) id 5683116A41B; Mon, 14 Jan 2008 01:56:06 +0000 (UTC) Delivered-To: perforce@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 1BAEE16A419 for ; Mon, 14 Jan 2008 01:56:06 +0000 (UTC) (envelope-from andre@freebsd.org) Received: from repoman.freebsd.org (repoman.freebsd.org [IPv6:2001:4f8:fff6::29]) by mx1.freebsd.org (Postfix) with ESMTP id 11E7A13C448 for ; Mon, 14 Jan 2008 01:56:06 +0000 (UTC) (envelope-from andre@freebsd.org) Received: from repoman.freebsd.org (localhost [127.0.0.1]) by repoman.freebsd.org (8.14.1/8.14.1) with ESMTP id m0E1u5x5083310 for ; Mon, 14 Jan 2008 01:56:05 GMT (envelope-from andre@freebsd.org) Received: (from perforce@localhost) by repoman.freebsd.org (8.14.1/8.14.1/Submit) id m0E1u5q9083307 for perforce@freebsd.org; Mon, 14 Jan 2008 01:56:05 GMT (envelope-from andre@freebsd.org) Date: Mon, 14 Jan 2008 01:56:05 GMT Message-Id: <200801140156.m0E1u5q9083307@repoman.freebsd.org> X-Authentication-Warning: repoman.freebsd.org: perforce set sender to andre@freebsd.org using -f From: Andre Oppermann To: Perforce Change Reviews Cc: Subject: PERFORCE change 133211 for review X-BeenThere: p4-projects@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: p4 projects tree changes List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 14 Jan 2008 01:56:06 -0000 http://perforce.freebsd.org/chv.cgi?CH=133211 Change 133211 by andre@andre_flirtbox on 2008/01/14 01:55:13 When missing segment prepend to first block instead of creating a new one Fix segment prepending Add KASSERT Update comments Affected files ... .. //depot/projects/tcp_reass/netinet/tcp_reass.c#3 edit Differences ... ==== //depot/projects/tcp_reass/netinet/tcp_reass.c#3 (text+ko) ==== @@ -182,7 +182,7 @@ /* Accounting. */ tcpstat.tcps_rcvoopack++; tcpstat.tcps_rcvoobyte += *tlenp; - /* NB: m_adj(m, -i) may free mbufs at the tail of a chain. */ + /* NB: m_adj(m, -i) may free mbufs at the tail of a chain. */ for (n = m; n; n = n->m_next) segs++; tp->t_trqlen += segs; @@ -206,11 +206,14 @@ tqe = TAILQ_FIRST(&tp->t_trq); KASSERT(tqe != NULL, ("%s: missing segment but nothing in queue", __func__)); + KASSERT(SEQ_GT(tqe->trq_seq, th->th_seq), + ("%s: first block already contains missing segment", __func__)); if (SEQ_LT(tqe->trq_seq, th->th_seq + *tlenp)) { - /* Trim tail. */ + /* Trim tail of segment. */ if ((i = tqe->trq_seq - (th->th_seq + *tlenp))) { m_adj(m, i); *tlenp -= i; + /* tcpstat */ /* Update accounting. */ if (segs > 1) { for (n = m; n; n = n->m_next) @@ -219,18 +222,26 @@ tcp_reass_qsize -= segs; } } + /* Segment prepends first block. */ + tqe->trq_len += *tlenp; + tqe->trq_segs += segs; + tqe->trq_seq = th->th_seq; + n = m_last(m); + n->m_next = tqe->trq_m; + tqe->trq_m = m; + goto present; } goto insert; } /* See where it fits. */ TAILQ_FOREACH(tqe, &tp->t_trq, trq_q) { - /* Segment is after our coverage. */ + /* Segment is after this blocks coverage. */ if (SEQ_LT(tqe->trq_seq + tqe->trq_len, th->th_seq)) continue; - /* Segment is after the previous one but before us. */ + /* Segment is after the previous one but before this one. */ if (SEQ_GT(tqe->trq_seq, th->th_seq + *tlenp)) - break; + break; /* Insert as new block. */ /* Segment is already fully covered. */ if (SEQ_LEQ(tqe->trq_seq, th->th_seq) && SEQ_GEQ(tqe->trq_seq + tqe->trq_len, th->th_seq + *tlenp)) { @@ -242,25 +253,28 @@ *tlenp = 0; return (0); } - /* Segment appends. */ + /* Segment appends to this block. */ if (SEQ_LEQ(tqe->trq_seq + tqe->trq_len, th->th_seq)) { - /* Trim head. */ + /* Trim head of segment. */ if ((i = tqe->trq_seq + tqe->trq_len - th->th_seq)) { m_adj(m, i); *tlenp -= i; + /* tcpstat */ } tqe->trq_len += *tlenp; tqe->trq_segs += segs; tqe->trq_ml->m_next = m; tqe->trq_ml = m_last(m); - /* Check for next block to merge. */ + /* Check if segment bridges two blocks to merge. */ if ((tqen = TAILQ_NEXT(tqe, trq_q)) && SEQ_GEQ(tqe->trq_seq + tqe->trq_len, tqen->trq_seq)) { - /* Trim head. */ + /* Trim head of next block. */ + /* XXXAO: Should trim tail of segment instead. */ if ((i = tqe->trq_seq + tqe->trq_len - tqen->trq_seq)) { m_adj(tqen->trq_m, i); tqen->trq_len -= i; + /* tcpstat */ } tqe->trq_len += tqen->trq_len; tqe->trq_segs += tqen->trq_segs; @@ -273,7 +287,7 @@ } /* Segment prepends. */ if (SEQ_GT(tqe->trq_seq, th->th_seq)) { - /* Trim tail. */ + /* Trim tail of segment. */ if ((i = tqe->trq_seq - (th->th_seq + *tlenp))) { m_adj(m, i); *tlenp -= i; @@ -287,9 +301,10 @@ } tqe->trq_len += *tlenp; tqe->trq_segs += segs; - tqe->trq_m = m; + tqe->trq_seq = th->th_seq; n = m_last(m); n->m_next = tqe->trq_m; + tqe->trq_m = m; return (0); } }