aboutsummaryrefslogtreecommitdiffstats
path: root/net/sctp/transport.c
diff options
context:
space:
mode:
Diffstat (limited to 'net/sctp/transport.c')
-rw-r--r--net/sctp/transport.c38
1 files changed, 38 insertions, 0 deletions
diff --git a/net/sctp/transport.c b/net/sctp/transport.c
index 2df29cbdaf5a..9a6cb22d129f 100644
--- a/net/sctp/transport.c
+++ b/net/sctp/transport.c
@@ -576,6 +576,43 @@ void sctp_transport_lower_cwnd(struct sctp_transport *transport,
576 transport->cwnd, transport->ssthresh); 576 transport->cwnd, transport->ssthresh);
577} 577}
578 578
579/* Apply Max.Burst limit to the congestion window:
580 * sctpimpguide-05 2.14.2
581 * D) When the time comes for the sender to
582 * transmit new DATA chunks, the protocol parameter Max.Burst MUST
583 * first be applied to limit how many new DATA chunks may be sent.
584 * The limit is applied by adjusting cwnd as follows:
585 * if ((flightsize+ Max.Burst * MTU) < cwnd)
586 * cwnd = flightsize + Max.Burst * MTU
587 */
588
589void sctp_transport_burst_limited(struct sctp_transport *t)
590{
591 struct sctp_association *asoc = t->asoc;
592 u32 old_cwnd = t->cwnd;
593 u32 max_burst_bytes;
594
595 if (t->burst_limited)
596 return;
597
598 max_burst_bytes = t->flight_size + (asoc->max_burst * asoc->pathmtu);
599 if (max_burst_bytes < old_cwnd) {
600 t->cwnd = max_burst_bytes;
601 t->burst_limited = old_cwnd;
602 }
603}
604
605/* Restore the old cwnd congestion window, after the burst had it's
606 * desired effect.
607 */
608void sctp_transport_burst_reset(struct sctp_transport *t)
609{
610 if (t->burst_limited) {
611 t->cwnd = t->burst_limited;
612 t->burst_limited = 0;
613 }
614}
615
579/* What is the next timeout value for this transport? */ 616/* What is the next timeout value for this transport? */
580unsigned long sctp_transport_timeout(struct sctp_transport *t) 617unsigned long sctp_transport_timeout(struct sctp_transport *t)
581{ 618{
@@ -598,6 +635,7 @@ void sctp_transport_reset(struct sctp_transport *t)
598 * (see Section 6.2.1) 635 * (see Section 6.2.1)
599 */ 636 */
600 t->cwnd = min(4*asoc->pathmtu, max_t(__u32, 2*asoc->pathmtu, 4380)); 637 t->cwnd = min(4*asoc->pathmtu, max_t(__u32, 2*asoc->pathmtu, 4380));
638 t->burst_limited = 0;
601 t->ssthresh = asoc->peer.i.a_rwnd; 639 t->ssthresh = asoc->peer.i.a_rwnd;
602 t->last_rto = t->rto = asoc->rto_initial; 640 t->last_rto = t->rto = asoc->rto_initial;
603 t->rtt = 0; 641 t->rtt = 0;