Reorder/Fix comments to clarify.

This commit is contained in:
maxv 2018-03-29 17:46:17 +00:00
parent 0ec7f434fe
commit 8e8bd5fe5f
1 changed files with 48 additions and 39 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: tcp_input.c,v 1.398 2018/03/29 17:12:36 maxv Exp $ */
/* $NetBSD: tcp_input.c,v 1.399 2018/03/29 17:46:17 maxv Exp $ */
/*
* Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
@ -148,7 +148,7 @@
*/
#include <sys/cdefs.h>
__KERNEL_RCSID(0, "$NetBSD: tcp_input.c,v 1.398 2018/03/29 17:12:36 maxv Exp $");
__KERNEL_RCSID(0, "$NetBSD: tcp_input.c,v 1.399 2018/03/29 17:46:17 maxv Exp $");
#ifdef _KERNEL_OPT
#include "opt_inet.h"
@ -444,6 +444,11 @@ tcpipqent_free(struct ipqent *ipqe)
splx(s);
}
/*
* Insert segment ti into reassembly queue of tcp with
* control block tp. Return TH_FIN if reassembly now includes
* a segment with FIN.
*/
static int
tcp_reass(struct tcpcb *tp, const struct tcphdr *th, struct mbuf *m, int tlen)
{
@ -479,8 +484,8 @@ tcp_reass(struct tcpcb *tp, const struct tcphdr *th, struct mbuf *m, int tlen)
rcvoobyte = tlen;
/*
* Copy these to local variables because the tcpiphdr
* gets munged while we are collapsing mbufs.
* Copy these to local variables because the TCP header gets munged
* while we are collapsing mbufs.
*/
pkt_seq = th->th_seq;
pkt_len = tlen;
@ -547,6 +552,7 @@ tcp_reass(struct tcpcb *tp, const struct tcphdr *th, struct mbuf *m, int tlen)
#ifdef TCP_REASS_COUNTERS
count++;
#endif
/*
* If the received segment is just right after this
* fragment, merge the two together and then check
@ -567,14 +573,16 @@ tcp_reass(struct tcpcb *tp, const struct tcphdr *th, struct mbuf *m, int tlen)
TCP_REASS_COUNTER_INCR(&tcp_reass_append);
goto free_ipqe;
}
/*
* If the received segment is completely past this
* fragment, we need to go the next fragment.
* fragment, we need to go to the next fragment.
*/
if (SEQ_LT(q->ipqe_seq + q->ipqe_len, pkt_seq)) {
p = q;
continue;
}
/*
* If the fragment is past the received segment,
* it (or any following) can't be concatenated.
@ -586,7 +594,7 @@ tcp_reass(struct tcpcb *tp, const struct tcphdr *th, struct mbuf *m, int tlen)
/*
* We've received all the data in this segment before.
* mark it as a duplicate and return.
* Mark it as a duplicate and return.
*/
if (SEQ_LEQ(q->ipqe_seq, pkt_seq) &&
SEQ_GEQ(q->ipqe_seq + q->ipqe_len, pkt_seq + pkt_len)) {
@ -602,6 +610,7 @@ tcp_reass(struct tcpcb *tp, const struct tcphdr *th, struct mbuf *m, int tlen)
TCP_REASS_COUNTER_INCR(&tcp_reass_segdup);
goto out;
}
/*
* Received segment completely overlaps this fragment
* so we drop the fragment (this keeps the temporal
@ -614,11 +623,11 @@ tcp_reass(struct tcpcb *tp, const struct tcphdr *th, struct mbuf *m, int tlen)
TCP_REASS_COUNTER_INCR(&tcp_reass_fragdup);
goto free_ipqe;
}
/*
* RX'ed segment extends past the end of the
* fragment. Drop the overlapping bytes. Then
* merge the fragment and segment then treat as
* a longer received packet.
* Received segment extends past the end of the fragment.
* Drop the overlapping bytes, merge the fragment and
* segment, and treat as a longer received packet.
*/
if (SEQ_LT(q->ipqe_seq, pkt_seq) &&
SEQ_GT(q->ipqe_seq + q->ipqe_len, pkt_seq)) {
@ -639,11 +648,12 @@ tcp_reass(struct tcpcb *tp, const struct tcphdr *th, struct mbuf *m, int tlen)
TCP_REASS_COUNTER_INCR(&tcp_reass_overlaptail);
goto free_ipqe;
}
/*
* RX'ed segment extends past the front of the
* fragment. Drop the overlapping bytes on the
* received packet. The packet will then be
* contatentated with this fragment a bit later.
* Received segment extends past the front of the fragment.
* Drop the overlapping bytes on the received packet. The
* packet will then be concatenated with this fragment a
* bit later.
*/
if (SEQ_GT(q->ipqe_seq, pkt_seq) &&
SEQ_LT(q->ipqe_seq, pkt_seq + pkt_len)) {
@ -659,8 +669,9 @@ tcp_reass(struct tcpcb *tp, const struct tcphdr *th, struct mbuf *m, int tlen)
TCP_REASS_COUNTER_INCR(&tcp_reass_overlapfront);
rcvoobyte -= overlap;
}
/*
* If the received segment immediates precedes this
* If the received segment immediately precedes this
* fragment then tack the fragment onto this segment
* and reinsert the data.
*/
@ -688,11 +699,12 @@ tcp_reass(struct tcpcb *tp, const struct tcphdr *th, struct mbuf *m, int tlen)
TCP_REASS_COUNTER_INCR(&tcp_reass_prepend);
break;
}
/*
* If the fragment is before the segment, remember it.
* When this loop is terminated, p will contain the
* pointer to fragment that is right before the received
* segment.
* pointer to the fragment that is right before the
* received segment.
*/
if (SEQ_LEQ(q->ipqe_seq, pkt_seq))
p = q;
@ -724,14 +736,13 @@ tcp_reass(struct tcpcb *tp, const struct tcphdr *th, struct mbuf *m, int tlen)
TCP_REASS_COUNTER_INCR(&tcp_reass_iteration[count]);
#endif
insert_it:
insert_it:
/*
* Allocate a new queue entry since the received segment did not
* collapse onto any other out-of-order block; thus we are allocating
* a new block. If it had collapsed, tiqe would not be NULL and
* we would be reusing it.
* XXX If we can't, just drop the packet. XXX
* Allocate a new queue entry (block) since the received segment
* did not collapse onto any other out-of-order block. If it had
* collapsed, tiqe would not be NULL and we would be reusing it.
*
* If the allocation fails, drop the packet.
*/
if (tiqe == NULL) {
tiqe = tcpipqent_alloc();
@ -781,7 +792,6 @@ tcp_reass(struct tcpcb *tp, const struct tcphdr *th, struct mbuf *m, int tlen)
tp->t_segqlen++;
skip_replacement:
TAILQ_INSERT_HEAD(&tp->timeq, tiqe, ipqe_timeq);
present:
@ -814,10 +824,11 @@ present:
tcpipqent_free(q);
TCP_REASS_UNLOCK(tp);
sorwakeup(so);
return (pkt_flags);
return pkt_flags;
out:
TCP_REASS_UNLOCK(tp);
return (0);
return 0;
}
#ifdef INET6
@ -2300,7 +2311,7 @@ after_listen:
TCP_STAT_PUTREF();
}
tcp_new_dsack(tp, th->th_seq, todrop);
hdroptlen += todrop; /* drop from head afterwards */
hdroptlen += todrop; /* drop from head afterwards (m_adj) */
th->th_seq += todrop;
tlen -= todrop;
tcp_urp_drop(th, todrop, &tiflags);
@ -2795,18 +2806,16 @@ dodata:
if ((tlen || (tiflags & TH_FIN)) &&
TCPS_HAVERCVDFIN(tp->t_state) == 0) {
/*
* Insert segment ti into reassembly queue of tcp with
* control block tp. Return TH_FIN if reassembly now includes
* a segment with FIN. The macro form does the common case
* inline (segment is the next to be received on an
* established connection, and the queue is empty),
* avoiding linkage into and removal from the queue and
* repetition of various conversions.
* Set DELACK for segments received in order, but ack
* immediately when segments are out of order
* (so fast retransmit can work).
* Handle the common case:
* o Segment is the next to be received, and
* o The queue is empty, and
* o The connection is established
* In this case, we avoid calling tcp_reass.
*
* tcp_setup_ack: set DELACK for segments received in order,
* but ack immediately when segments are out of order (so that
* fast retransmit can work).
*/
/* NOTE: this was TCP_REASS() macro, but used only once */
TCP_REASS_LOCK(tp);
if (th->th_seq == tp->rcv_nxt &&
TAILQ_FIRST(&tp->segq) == NULL &&