Changeset View
Changeset View
Standalone View
Standalone View
sys/netinet/tcp_input.c
Show First 20 Lines • Show All 439 Lines • ▼ Show 20 Lines | #endif | ||||
case CC_NDUPACK: | case CC_NDUPACK: | ||||
if (!IN_FASTRECOVERY(tp->t_flags)) { | if (!IN_FASTRECOVERY(tp->t_flags)) { | ||||
tp->snd_recover = tp->snd_max; | tp->snd_recover = tp->snd_max; | ||||
if (tp->t_flags2 & TF2_ECN_PERMIT) | if (tp->t_flags2 & TF2_ECN_PERMIT) | ||||
tp->t_flags2 |= TF2_ECN_SND_CWR; | tp->t_flags2 |= TF2_ECN_SND_CWR; | ||||
} | } | ||||
break; | break; | ||||
case CC_ECN: | case CC_ECN: | ||||
if (!IN_CONGRECOVERY(tp->t_flags)) { | if (!IN_CONGRECOVERY(tp->t_flags) || | ||||
/* | |||||
* allow ECN reaction on ACK to CWR, if | |||||
* that data segment was also CE marked | |||||
*/ | |||||
SEQ_GEQ(th->th_ack, tp->snd_recover)) { | |||||
EXIT_CONGRECOVERY(tp->t_flags); | |||||
TCPSTAT_INC(tcps_ecn_rcwnd); | TCPSTAT_INC(tcps_ecn_rcwnd); | ||||
tp->snd_recover = tp->snd_max; | tp->snd_recover = tp->snd_max+1; | ||||
if (tp->t_flags2 & TF2_ECN_PERMIT) | if (tp->t_flags2 & TF2_ECN_PERMIT) | ||||
tp->t_flags2 |= TF2_ECN_SND_CWR; | tp->t_flags2 |= TF2_ECN_SND_CWR; | ||||
} | } | ||||
break; | break; | ||||
case CC_RTO: | case CC_RTO: | ||||
maxseg = tcp_maxseg(tp); | maxseg = tcp_maxseg(tp); | ||||
tp->t_dupacks = 0; | tp->t_dupacks = 0; | ||||
tp->t_bytes_acked = 0; | tp->t_bytes_acked = 0; | ||||
▲ Show 20 Lines • Show All 3,381 Lines • Show Last 20 Lines |