diff options
Diffstat (limited to 'net/sctp/output.c')
-rw-r--r-- | net/sctp/output.c | 50 |
1 files changed, 13 insertions, 37 deletions
diff --git a/net/sctp/output.c b/net/sctp/output.c index 5cbda8f1ddfd..7c5589363433 100644 --- a/net/sctp/output.c +++ b/net/sctp/output.c | |||
@@ -429,23 +429,22 @@ int sctp_packet_transmit(struct sctp_packet *packet) | |||
429 | list_del_init(&chunk->list); | 429 | list_del_init(&chunk->list); |
430 | if (sctp_chunk_is_data(chunk)) { | 430 | if (sctp_chunk_is_data(chunk)) { |
431 | 431 | ||
432 | if (!chunk->has_tsn) { | 432 | if (!chunk->resent) { |
433 | sctp_chunk_assign_ssn(chunk); | 433 | |
434 | sctp_chunk_assign_tsn(chunk); | 434 | /* 6.3.1 C4) When data is in flight and when allowed |
435 | 435 | * by rule C5, a new RTT measurement MUST be made each | |
436 | /* 6.3.1 C4) When data is in flight and when allowed | 436 | * round trip. Furthermore, new RTT measurements |
437 | * by rule C5, a new RTT measurement MUST be made each | 437 | * SHOULD be made no more than once per round-trip |
438 | * round trip. Furthermore, new RTT measurements | 438 | * for a given destination transport address. |
439 | * SHOULD be made no more than once per round-trip | 439 | */ |
440 | * for a given destination transport address. | ||
441 | */ | ||
442 | 440 | ||
443 | if (!tp->rto_pending) { | 441 | if (!tp->rto_pending) { |
444 | chunk->rtt_in_progress = 1; | 442 | chunk->rtt_in_progress = 1; |
445 | tp->rto_pending = 1; | 443 | tp->rto_pending = 1; |
446 | } | 444 | } |
447 | } else | 445 | } |
448 | chunk->resent = 1; | 446 | |
447 | chunk->resent = 1; | ||
449 | 448 | ||
450 | has_data = 1; | 449 | has_data = 1; |
451 | } | 450 | } |
@@ -557,8 +556,6 @@ int sctp_packet_transmit(struct sctp_packet *packet) | |||
557 | struct timer_list *timer; | 556 | struct timer_list *timer; |
558 | unsigned long timeout; | 557 | unsigned long timeout; |
559 | 558 | ||
560 | tp->last_time_used = jiffies; | ||
561 | |||
562 | /* Restart the AUTOCLOSE timer when sending data. */ | 559 | /* Restart the AUTOCLOSE timer when sending data. */ |
563 | if (sctp_state(asoc, ESTABLISHED) && asoc->autoclose) { | 560 | if (sctp_state(asoc, ESTABLISHED) && asoc->autoclose) { |
564 | timer = &asoc->timers[SCTP_EVENT_TIMEOUT_AUTOCLOSE]; | 561 | timer = &asoc->timers[SCTP_EVENT_TIMEOUT_AUTOCLOSE]; |
@@ -617,7 +614,6 @@ static sctp_xmit_t sctp_packet_can_append_data(struct sctp_packet *packet, | |||
617 | sctp_xmit_t retval = SCTP_XMIT_OK; | 614 | sctp_xmit_t retval = SCTP_XMIT_OK; |
618 | size_t datasize, rwnd, inflight, flight_size; | 615 | size_t datasize, rwnd, inflight, flight_size; |
619 | struct sctp_transport *transport = packet->transport; | 616 | struct sctp_transport *transport = packet->transport; |
620 | __u32 max_burst_bytes; | ||
621 | struct sctp_association *asoc = transport->asoc; | 617 | struct sctp_association *asoc = transport->asoc; |
622 | struct sctp_outq *q = &asoc->outqueue; | 618 | struct sctp_outq *q = &asoc->outqueue; |
623 | 619 | ||
@@ -650,28 +646,6 @@ static sctp_xmit_t sctp_packet_can_append_data(struct sctp_packet *packet, | |||
650 | } | 646 | } |
651 | } | 647 | } |
652 | 648 | ||
653 | /* sctpimpguide-05 2.14.2 | ||
654 | * D) When the time comes for the sender to | ||
655 | * transmit new DATA chunks, the protocol parameter Max.Burst MUST | ||
656 | * first be applied to limit how many new DATA chunks may be sent. | ||
657 | * The limit is applied by adjusting cwnd as follows: | ||
658 | * if ((flightsize + Max.Burst * MTU) < cwnd) | ||
659 | * cwnd = flightsize + Max.Burst * MTU | ||
660 | */ | ||
661 | max_burst_bytes = asoc->max_burst * asoc->pathmtu; | ||
662 | if ((flight_size + max_burst_bytes) < transport->cwnd) { | ||
663 | transport->cwnd = flight_size + max_burst_bytes; | ||
664 | SCTP_DEBUG_PRINTK("%s: cwnd limited by max_burst: " | ||
665 | "transport: %p, cwnd: %d, " | ||
666 | "ssthresh: %d, flight_size: %d, " | ||
667 | "pba: %d\n", | ||
668 | __func__, transport, | ||
669 | transport->cwnd, | ||
670 | transport->ssthresh, | ||
671 | transport->flight_size, | ||
672 | transport->partial_bytes_acked); | ||
673 | } | ||
674 | |||
675 | /* RFC 2960 6.1 Transmission of DATA Chunks | 649 | /* RFC 2960 6.1 Transmission of DATA Chunks |
676 | * | 650 | * |
677 | * B) At any given time, the sender MUST NOT transmit new data | 651 | * B) At any given time, the sender MUST NOT transmit new data |
@@ -747,6 +721,8 @@ static void sctp_packet_append_data(struct sctp_packet *packet, | |||
747 | /* Has been accepted for transmission. */ | 721 | /* Has been accepted for transmission. */ |
748 | if (!asoc->peer.prsctp_capable) | 722 | if (!asoc->peer.prsctp_capable) |
749 | chunk->msg->can_abandon = 0; | 723 | chunk->msg->can_abandon = 0; |
724 | sctp_chunk_assign_tsn(chunk); | ||
725 | sctp_chunk_assign_ssn(chunk); | ||
750 | } | 726 | } |
751 | 727 | ||
752 | static sctp_xmit_t sctp_packet_will_fit(struct sctp_packet *packet, | 728 | static sctp_xmit_t sctp_packet_will_fit(struct sctp_packet *packet, |