Module Name: src Committed By: maxv Date: Thu Mar 29 17:46:17 UTC 2018
Modified Files: src/sys/netinet: tcp_input.c Log Message: Reorder/Fix comments to clarify. To generate a diff of this commit: cvs rdiff -u -r1.398 -r1.399 src/sys/netinet/tcp_input.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/netinet/tcp_input.c diff -u src/sys/netinet/tcp_input.c:1.398 src/sys/netinet/tcp_input.c:1.399 --- src/sys/netinet/tcp_input.c:1.398 Thu Mar 29 17:12:36 2018 +++ src/sys/netinet/tcp_input.c Thu Mar 29 17:46:17 2018 @@ -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 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 #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 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 /* * 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 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 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 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 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 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 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 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 &&