Page Menu
Home
FreeBSD
Search
Configure Global Search
Log In
Files
F107020801
D36046.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Flag For Later
Award Token
Size
3 KB
Referenced Files
None
Subscribers
None
D36046.diff
View Options
diff --git a/sys/netinet/tcp_input.c b/sys/netinet/tcp_input.c
--- a/sys/netinet/tcp_input.c
+++ b/sys/netinet/tcp_input.c
@@ -268,6 +268,20 @@
counter_u64_add(VNET(tcpstat)[statnum], val);
}
+/*
+ * Make sure that we only start a SACK loss recovery when
+ * receiving a duplicate ACK with a SACK block, and also
+ * complete SACK loss recovery in case the other end
+ * reneges.
+ */
+static bool inline
+tcp_is_sack_recovery(struct tcpcb *tp, struct tcpopt *to)
+{
+ return ((tp->t_flags & TF_SACK_PERMIT) &&
+ ((to->to_flags & TOF_SACK) ||
+ (!TAILQ_EMPTY(&tp->snd_holes))));
+}
+
#ifdef TCP_HHOOK
/*
* Wrapper for the TCP established input helper hook.
@@ -2491,9 +2505,7 @@
TCPSTAT_INC(tcps_rcvacktoomuch);
goto dropafterack;
}
- if ((tp->t_flags & TF_SACK_PERMIT) &&
- ((to.to_flags & TOF_SACK) ||
- !TAILQ_EMPTY(&tp->snd_holes))) {
+ if (tcp_is_sack_recovery(tp, &to)) {
if (((sack_changed = tcp_sack_doack(tp, &to, th->th_ack)) != 0) &&
(tp->t_flags & TF_LRD)) {
tcp_sack_lost_retransmission(tp, th);
@@ -2566,8 +2578,7 @@
* duplicating packets or a possible DoS attack.
*/
if (th->th_ack != tp->snd_una ||
- ((tp->t_flags & TF_SACK_PERMIT) &&
- (to.to_flags & TOF_SACK) &&
+ (tcp_is_sack_recovery(tp, &to) &&
!sack_changed))
break;
else if (!tcp_timer_active(tp, TT_REXMT))
@@ -2579,8 +2590,7 @@
if (V_tcp_do_prr &&
IN_FASTRECOVERY(tp->t_flags)) {
tcp_do_prr_ack(tp, th, &to);
- } else if ((tp->t_flags & TF_SACK_PERMIT) &&
- (to.to_flags & TOF_SACK) &&
+ } else if (tcp_is_sack_recovery(tp, &to) &&
IN_FASTRECOVERY(tp->t_flags)) {
int awnd;
@@ -2653,8 +2663,7 @@
* snd_ssthresh is already updated by
* cc_cong_signal.
*/
- if ((tp->t_flags & TF_SACK_PERMIT) &&
- (to.to_flags & TOF_SACK)) {
+ if (tcp_is_sack_recovery(tp, &to)) {
tp->sackhint.prr_delivered =
tp->sackhint.sacked_bytes;
} else {
@@ -2666,8 +2675,7 @@
tp->sackhint.recover_fs = max(1,
tp->snd_nxt - tp->snd_una);
}
- if ((tp->t_flags & TF_SACK_PERMIT) &&
- (to.to_flags & TOF_SACK)) {
+ if (tcp_is_sack_recovery(tp, &to)) {
TCPSTAT_INC(
tcps_sack_recovery_episode);
tp->snd_recover = tp->snd_nxt;
@@ -2759,8 +2767,7 @@
* from the left side. Such partial ACKs should not be
* counted as dupacks here.
*/
- if ((tp->t_flags & TF_SACK_PERMIT) &&
- (to.to_flags & TOF_SACK) &&
+ if (tcp_is_sack_recovery(tp, &to) &&
sack_changed) {
tp->t_dupacks++;
/* limit overhead by setting maxseg last */
@@ -3942,8 +3949,7 @@
* (del_data) and an estimate of how many bytes are in the
* network.
*/
- if (((tp->t_flags & TF_SACK_PERMIT) &&
- (to->to_flags & TOF_SACK)) ||
+ if (tcp_is_sack_recovery(tp, to) ||
(IN_CONGRECOVERY(tp->t_flags) &&
!IN_FASTRECOVERY(tp->t_flags))) {
del_data = tp->sackhint.delivered_data;
@@ -3987,8 +3993,7 @@
* accordingly.
*/
if (IN_FASTRECOVERY(tp->t_flags)) {
- if ((tp->t_flags & TF_SACK_PERMIT) &&
- (to->to_flags & TOF_SACK)) {
+ if (tcp_is_sack_recovery(tp, to)) {
tp->snd_cwnd = tp->snd_nxt - tp->snd_recover +
tp->sackhint.sack_bytes_rexmit +
(snd_cnt * maxseg);
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Fri, Jan 10, 2:13 AM (11 h, 2 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
15738410
Default Alt Text
D36046.diff (3 KB)
Attached To
Mode
D36046: Keep doing SACK loss recovery when ACKs suddenly lack SACK blocks
Attached
Detach File
Event Timeline
Log In to Comment