diff options
| author | Sridhar Samudrala <sri@us.ibm.com> | 2006-09-29 20:09:05 -0400 |
|---|---|---|
| committer | David S. Miller <davem@davemloft.net> | 2006-09-29 20:09:05 -0400 |
| commit | cd49788563d3b9e2ec0b316fa57aef1c0cb3bd4b (patch) | |
| tree | a05455a25c805f5ec775f730ee7cab789948649d | |
| parent | 208edef6a5b6c50363c77efcf34c4b4020681029 (diff) | |
[SCTP]: Include sk_buff overhead while updating the peer's receive window.
Currently if the sender is sending small messages, it can cause a receiver
to run out of receive buffer space even when the advertised receive window
is still open and results in packet drops and retransmissions. Including
a overhead while updating the sender's view of peer receive window will
reduce the chances of receive buffer space overshooting the receive window.
Signed-off-by: Sridhar Samudrala <sri@us.ibm.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
| -rw-r--r-- | net/sctp/output.c | 10 | ||||
| -rw-r--r-- | net/sctp/outqueue.c | 3 |
2 files changed, 10 insertions, 3 deletions
diff --git a/net/sctp/output.c b/net/sctp/output.c index cdc5a3936766..3ef4351dd956 100644 --- a/net/sctp/output.c +++ b/net/sctp/output.c | |||
| @@ -633,7 +633,7 @@ static sctp_xmit_t sctp_packet_append_data(struct sctp_packet *packet, | |||
| 633 | * data will fit or delay in hopes of bundling a full | 633 | * data will fit or delay in hopes of bundling a full |
| 634 | * sized packet. | 634 | * sized packet. |
| 635 | */ | 635 | */ |
| 636 | if (len < asoc->pathmtu - packet->overhead) { | 636 | if (len < asoc->frag_point) { |
| 637 | retval = SCTP_XMIT_NAGLE_DELAY; | 637 | retval = SCTP_XMIT_NAGLE_DELAY; |
| 638 | goto finish; | 638 | goto finish; |
| 639 | } | 639 | } |
| @@ -645,7 +645,13 @@ static sctp_xmit_t sctp_packet_append_data(struct sctp_packet *packet, | |||
| 645 | /* Keep track of how many bytes are in flight to the receiver. */ | 645 | /* Keep track of how many bytes are in flight to the receiver. */ |
| 646 | asoc->outqueue.outstanding_bytes += datasize; | 646 | asoc->outqueue.outstanding_bytes += datasize; |
| 647 | 647 | ||
| 648 | /* Update our view of the receiver's rwnd. */ | 648 | /* Update our view of the receiver's rwnd. Include sk_buff overhead |
| 649 | * while updating peer.rwnd so that it reduces the chances of a | ||
| 650 | * receiver running out of receive buffer space even when receive | ||
| 651 | * window is still open. This can happen when a sender is sending | ||
| 652 | * sending small messages. | ||
| 653 | */ | ||
| 654 | datasize += sizeof(struct sk_buff); | ||
| 649 | if (datasize < rwnd) | 655 | if (datasize < rwnd) |
| 650 | rwnd -= datasize; | 656 | rwnd -= datasize; |
| 651 | else | 657 | else |
diff --git a/net/sctp/outqueue.c b/net/sctp/outqueue.c index 37074a39ecbb..739582415bf6 100644 --- a/net/sctp/outqueue.c +++ b/net/sctp/outqueue.c | |||
| @@ -416,7 +416,8 @@ void sctp_retransmit_mark(struct sctp_outq *q, | |||
| 416 | * (Section 7.2.4)), add the data size of those | 416 | * (Section 7.2.4)), add the data size of those |
| 417 | * chunks to the rwnd. | 417 | * chunks to the rwnd. |
| 418 | */ | 418 | */ |
| 419 | q->asoc->peer.rwnd += sctp_data_size(chunk); | 419 | q->asoc->peer.rwnd += (sctp_data_size(chunk) + |
| 420 | sizeof(struct sk_buff)); | ||
| 420 | q->outstanding_bytes -= sctp_data_size(chunk); | 421 | q->outstanding_bytes -= sctp_data_size(chunk); |
| 421 | transport->flight_size -= sctp_data_size(chunk); | 422 | transport->flight_size -= sctp_data_size(chunk); |
| 422 | 423 | ||
