PERFORCE change 200208 for review
Catalin Nicutar
cnicutar at FreeBSD.org
Fri Oct 14 20:02:19 UTC 2011
http://p4web.freebsd.org/@@200208?ac=10
Change 200208 by cnicutar at cnicutar_cronos on 2011/10/14 20:02:16
Fix segment bumping introduced in 198632. (UTO sometimes caused a
segment to be spilled by TCPOLEN_UTO bytes which meant splitting).
Simplify TF_SND_UTO handling - set it from the retransmit handler.
Affected files ...
.. //depot/projects/soc2011/cnicutar_tcputo_9/src/sys/netinet/tcp_output.c#5 edit
.. //depot/projects/soc2011/cnicutar_tcputo_9/src/sys/netinet/tcp_timer.c#5 edit
Differences ...
==== //depot/projects/soc2011/cnicutar_tcputo_9/src/sys/netinet/tcp_output.c#5 (text+ko) ====
@@ -709,10 +709,12 @@
* UTO. The option is sent with the SYN and with the first
* non-SYN segment.
*/
- if (tp->t_flags & TF_SND_UTO && (flags & TH_SYN ||
- FIRST_NON_SYN(tp))) {
+ if (tp->t_flags & TF_SND_UTO) {
to.to_uto = tp->snd_uto;
to.to_flags |= TOF_UTO;
+
+ if (!(flags & TH_SYN))
+ tp->t_flags &= ~TF_SND_UTO;
}
#ifdef TCP_SIGNATURE
/* TCP-MD5 (RFC2385). */
@@ -747,6 +749,16 @@
if (len + optlen + ipoptlen > tp->t_maxopd) {
flags &= ~TH_FIN;
+ /*
+ * When doing a retransmission that includes UTO, the extra
+ * TCPOLEN_UTO (4) bytes might cause the segment to spill.
+ */
+ if (to.to_flags & TOF_UTO && len + optlen + ipoptlen -
+ TCPOLEN_UTO <= tp->t_maxopd) {
+ len -= TCPOLEN_UTO;
+ goto lenfixed;
+ }
+
if (tso) {
KASSERT(ipoptlen == 0,
("%s: TSO can't do IP options", __func__));
@@ -787,6 +799,7 @@
}
} else
tso = 0;
+lenfixed:
KASSERT(len + hdrlen + ipoptlen <= IP_MAXPACKET,
("%s: len > IP_MAXPACKET", __func__));
==== //depot/projects/soc2011/cnicutar_tcputo_9/src/sys/netinet/tcp_timer.c#5 (text+ko) ====
@@ -618,6 +618,11 @@
}
tp->snd_nxt = tp->snd_una;
tp->snd_recover = tp->snd_max;
+
+ /* Check if we need to push UTO. */
+ if (tp->snd_uto && FIRST_NON_SYN(tp))
+ tp->t_flags |= TF_SND_UTO;
+
/*
* Force a segment to be sent.
*/
More information about the p4-projects
mailing list