Changeset View
Changeset View
Standalone View
Standalone View
head/sys/netinet/tcp_input.c
Show First 20 Lines • Show All 2,667 Lines • ▼ Show 20 Lines | #endif | ||||
} else { | } else { | ||||
/* | /* | ||||
* This ack is advancing the left edge, reset the | * This ack is advancing the left edge, reset the | ||||
* counter. | * counter. | ||||
*/ | */ | ||||
tp->t_dupacks = 0; | tp->t_dupacks = 0; | ||||
/* | /* | ||||
* If this ack also has new SACK info, increment the | * If this ack also has new SACK info, increment the | ||||
* counter as per rfc6675. | * counter as per rfc6675. The variable | ||||
* sack_changed tracks all changes to the SACK | |||||
* scoreboard, including when partial ACKs without | |||||
* SACK options are received, and clear the scoreboard | |||||
* from the left side. Such partial ACKs should not be | |||||
* counted as dupacks here. | |||||
*/ | */ | ||||
if ((tp->t_flags & TF_SACK_PERMIT) && sack_changed) | if ((tp->t_flags & TF_SACK_PERMIT) && | ||||
(to.to_flags & TOF_SACK) && | |||||
sack_changed) | |||||
tp->t_dupacks++; | tp->t_dupacks++; | ||||
} | } | ||||
KASSERT(SEQ_GT(th->th_ack, tp->snd_una), | KASSERT(SEQ_GT(th->th_ack, tp->snd_una), | ||||
("%s: th_ack <= snd_una", __func__)); | ("%s: th_ack <= snd_una", __func__)); | ||||
/* | /* | ||||
* If the congestion window was inflated to account | * If the congestion window was inflated to account | ||||
▲ Show 20 Lines • Show All 1,200 Lines • Show Last 20 Lines |