Changeset View
Changeset View
Standalone View
Standalone View
sys/netinet/tcp_input.c
| Show First 20 Lines • Show All 504 Lines • ▼ Show 20 Lines | cc_post_recovery(struct tcpcb *tp, struct tcphdr *th) | ||||
| /* XXXLAS: KASSERT that we're in recovery? */ | /* XXXLAS: KASSERT that we're in recovery? */ | ||||
| if (CC_ALGO(tp)->post_recovery != NULL) { | if (CC_ALGO(tp)->post_recovery != NULL) { | ||||
| tp->ccv->curack = th->th_ack; | tp->ccv->curack = th->th_ack; | ||||
| CC_ALGO(tp)->post_recovery(tp->ccv); | CC_ALGO(tp)->post_recovery(tp->ccv); | ||||
| } | } | ||||
| /* XXXLAS: EXIT_RECOVERY ? */ | /* XXXLAS: EXIT_RECOVERY ? */ | ||||
| tp->t_bytes_acked = 0; | tp->t_bytes_acked = 0; | ||||
| tp->sackhint.recover_fs = 0; | |||||
| } | } | ||||
| /* | /* | ||||
| * Indicate whether this ack should be delayed. We can delay the ack if | * Indicate whether this ack should be delayed. We can delay the ack if | ||||
| * following conditions are met: | * following conditions are met: | ||||
| * - There is no delayed ack timer in progress. | * - There is no delayed ack timer in progress. | ||||
| * - Our last ack wasn't a 0-sized window. We never want to delay | * - Our last ack wasn't a 0-sized window. We never want to delay | ||||
| * the ack that opens up a 0-sized window. | * the ack that opens up a 0-sized window. | ||||
| ▲ Show 20 Lines • Show All 3,421 Lines • ▼ Show 20 Lines | tcp_prr_partialack(struct tcpcb *tp, struct tcphdr *th) | ||||
| if (SEQ_GEQ(th->th_ack, tp->snd_una)) | if (SEQ_GEQ(th->th_ack, tp->snd_una)) | ||||
| del_data = BYTES_THIS_ACK(tp, th); | del_data = BYTES_THIS_ACK(tp, th); | ||||
| del_data += tp->sackhint.delivered_data; | del_data += tp->sackhint.delivered_data; | ||||
| pipe = (tp->snd_nxt - tp->snd_fack) + tp->sackhint.sack_bytes_rexmit; | pipe = (tp->snd_nxt - tp->snd_fack) + tp->sackhint.sack_bytes_rexmit; | ||||
| tp->sackhint.prr_delivered += del_data; | tp->sackhint.prr_delivered += del_data; | ||||
| /* | /* | ||||
| * Proportional Rate Reduction | * Proportional Rate Reduction | ||||
| */ | */ | ||||
| if (pipe > tp->snd_ssthresh) | if (pipe > tp->snd_ssthresh) { | ||||
| snd_cnt = (tp->sackhint.prr_delivered * tp->snd_ssthresh / tp->sackhint.recover_fs) - | if (tp->sackhint.recover_fs == 0) | ||||
| tp->sackhint.sack_bytes_rexmit; | tp->sackhint.recover_fs = | ||||
| else { | max(1, tp->snd_nxt - tp->snd_una); | ||||
| snd_cnt = (tp->sackhint.prr_delivered * tp->snd_ssthresh / | |||||
| tp->sackhint.recover_fs) - tp->sackhint.sack_bytes_rexmit; | |||||
| } else { | |||||
| if (V_tcp_do_prr_conservative) | if (V_tcp_do_prr_conservative) | ||||
| limit = tp->sackhint.prr_delivered - tp->sackhint.sack_bytes_rexmit; | limit = tp->sackhint.prr_delivered - | ||||
| tp->sackhint.sack_bytes_rexmit; | |||||
| else | else | ||||
| if ((tp->sackhint.prr_delivered - tp->sackhint.sack_bytes_rexmit) > del_data) | if ((tp->sackhint.prr_delivered - | ||||
| limit = tp->sackhint.prr_delivered - tp->sackhint.sack_bytes_rexmit + maxseg; | tp->sackhint.sack_bytes_rexmit) > del_data) | ||||
| limit = tp->sackhint.prr_delivered - | |||||
| tp->sackhint.sack_bytes_rexmit + maxseg; | |||||
| else | else | ||||
| limit = del_data + maxseg; | limit = del_data + maxseg; | ||||
| snd_cnt = min((tp->snd_ssthresh - pipe), limit); | snd_cnt = min((tp->snd_ssthresh - pipe), limit); | ||||
| } | } | ||||
| snd_cnt = max((snd_cnt / maxseg), 0); | snd_cnt = max((snd_cnt / maxseg), 0); | ||||
| /* | /* | ||||
| * Send snd_cnt new data into the network in response to this ack. | * Send snd_cnt new data into the network in response to this ack. | ||||
| * If there is going to be a SACK retransmission, adjust snd_cwnd | * If there is going to be a SACK retransmission, adjust snd_cwnd | ||||
| ▲ Show 20 Lines • Show All 81 Lines • Show Last 20 Lines | |||||