Changeset View
Changeset View
Standalone View
Standalone View
sys/netinet/tcp_input.c
Show First 20 Lines • Show All 2,570 Lines • ▼ Show 20 Lines | if (SEQ_LEQ(th->th_ack, tp->snd_una)) { | ||||
tp->t_dupacks = 0; | tp->t_dupacks = 0; | ||||
else if (++tp->t_dupacks > tcprexmtthresh || | else if (++tp->t_dupacks > tcprexmtthresh || | ||||
IN_FASTRECOVERY(tp->t_flags)) { | IN_FASTRECOVERY(tp->t_flags)) { | ||||
cc_ack_received(tp, th, nsegs, | cc_ack_received(tp, th, nsegs, | ||||
CC_DUPACK); | CC_DUPACK); | ||||
if (V_tcp_do_prr && | if (V_tcp_do_prr && | ||||
IN_FASTRECOVERY(tp->t_flags) && | IN_FASTRECOVERY(tp->t_flags) && | ||||
(tp->t_flags & TF_SACK_PERMIT)) { | (tp->t_flags & TF_SACK_PERMIT)) { | ||||
tcp_do_prr_ack(tp, th); | tcp_do_prr_ack(tp, th, &to); | ||||
} else if ((tp->t_flags & TF_SACK_PERMIT) && | } else if ((tp->t_flags & TF_SACK_PERMIT) && | ||||
(to.to_flags & TOF_SACK) && | (to.to_flags & TOF_SACK) && | ||||
IN_FASTRECOVERY(tp->t_flags)) { | IN_FASTRECOVERY(tp->t_flags)) { | ||||
int awnd; | int awnd; | ||||
/* | /* | ||||
* Compute the amount of data in flight first. | * Compute the amount of data in flight first. | ||||
* We can inject new data into the pipe iff | * We can inject new data into the pipe iff | ||||
▲ Show 20 Lines • Show All 184 Lines • ▼ Show 20 Lines | resume_partialack: | ||||
* for the other side's cached packets, retract it. | * for the other side's cached packets, retract it. | ||||
*/ | */ | ||||
if (IN_FASTRECOVERY(tp->t_flags)) { | if (IN_FASTRECOVERY(tp->t_flags)) { | ||||
if (SEQ_LT(th->th_ack, tp->snd_recover)) { | if (SEQ_LT(th->th_ack, tp->snd_recover)) { | ||||
if (tp->t_flags & TF_SACK_PERMIT) | if (tp->t_flags & TF_SACK_PERMIT) | ||||
if (V_tcp_do_prr && to.to_flags & TOF_SACK) { | if (V_tcp_do_prr && to.to_flags & TOF_SACK) { | ||||
tcp_timer_activate(tp, TT_REXMT, 0); | tcp_timer_activate(tp, TT_REXMT, 0); | ||||
tp->t_rtttime = 0; | tp->t_rtttime = 0; | ||||
tcp_do_prr_ack(tp, th); | tcp_do_prr_ack(tp, th, &to); | ||||
tp->t_flags |= TF_ACKNOW; | tp->t_flags |= TF_ACKNOW; | ||||
(void) tcp_output(tp); | (void) tcp_output(tp); | ||||
} else | } else | ||||
tcp_sack_partialack(tp, th); | tcp_sack_partialack(tp, th); | ||||
else | else | ||||
tcp_newreno_partial_ack(tp, th); | tcp_newreno_partial_ack(tp, th); | ||||
} else | } else | ||||
cc_post_recovery(tp, th); | cc_post_recovery(tp, th); | ||||
} else if (IN_CONGRECOVERY(tp->t_flags)) { | } else if (IN_CONGRECOVERY(tp->t_flags)) { | ||||
if (SEQ_LT(th->th_ack, tp->snd_recover)) { | if (SEQ_LT(th->th_ack, tp->snd_recover)) { | ||||
if (V_tcp_do_prr) { | if (V_tcp_do_prr) { | ||||
tp->sackhint.delivered_data = BYTES_THIS_ACK(tp, th); | tp->sackhint.delivered_data = BYTES_THIS_ACK(tp, th); | ||||
tp->snd_fack = th->th_ack; | tp->snd_fack = th->th_ack; | ||||
tcp_do_prr_ack(tp, th); | tcp_do_prr_ack(tp, th, &to); | ||||
(void) tcp_output(tp); | (void) tcp_output(tp); | ||||
} | } | ||||
} else | } else | ||||
cc_post_recovery(tp, th); | cc_post_recovery(tp, th); | ||||
} | } | ||||
/* | /* | ||||
* If we reach this point, ACK is not a duplicate, | * If we reach this point, ACK is not a duplicate, | ||||
* i.e., it ACKs something we sent. | * i.e., it ACKs something we sent. | ||||
▲ Show 20 Lines • Show All 1,112 Lines • ▼ Show 20 Lines | if (maxmtu && thcmtu) | ||||
mss = min(maxmtu, thcmtu) - min_protoh; | mss = min(maxmtu, thcmtu) - min_protoh; | ||||
else if (maxmtu || thcmtu) | else if (maxmtu || thcmtu) | ||||
mss = max(maxmtu, thcmtu) - min_protoh; | mss = max(maxmtu, thcmtu) - min_protoh; | ||||
return (mss); | return (mss); | ||||
} | } | ||||
void | void | ||||
tcp_do_prr_ack(struct tcpcb *tp, struct tcphdr *th) | tcp_do_prr_ack(struct tcpcb *tp, struct tcphdr *th, struct tcpopt *to) | ||||
{ | { | ||||
int snd_cnt = 0, limit = 0, del_data = 0, pipe = 0; | int snd_cnt = 0, limit = 0, del_data = 0, pipe = 0; | ||||
int maxseg = tcp_maxseg(tp); | int maxseg = tcp_maxseg(tp); | ||||
INP_WLOCK_ASSERT(tp->t_inpcb); | INP_WLOCK_ASSERT(tp->t_inpcb); | ||||
/* | /* | ||||
* Compute the amount of data that this ACK is indicating | * Compute the amount of data that this ACK is indicating | ||||
▲ Show 20 Lines • Show All 116 Lines • Show Last 20 Lines |