summaryrefslogtreecommitdiff
path: root/net/sctp/associola.c
diff options
context:
space:
mode:
authorVlad Yasevich <vladislav.yasevich@hp.com>2009-11-23 23:53:57 +0300
committerVlad Yasevich <vladislav.yasevich@hp.com>2009-11-23 23:53:57 +0300
commite0e9db178a5ba4dbb5f16f958f1affbdc63d2cc4 (patch)
tree22affd5fd2b2975de845a9626a89c40ad1c2df24 /net/sctp/associola.c
parent6383cfb3ed3c5c0bea06da0099c219ef4237ecf5 (diff)
downloadlinux-e0e9db178a5ba4dbb5f16f958f1affbdc63d2cc4.tar.xz
sctp: Select a working primary during sctp_connectx()
When sctp_connectx() is used, we pick the first address as primary, even though it may not have worked. This results in excessive retransmits and poor performance. We should select the address that the association was established with. Reported-by: Thomas Dreibholz <dreibh@iem.uni-due.de> Signed-off-by: Vlad Yasevich <vladislav.yasevich@hp.com>
Diffstat (limited to 'net/sctp/associola.c')
-rw-r--r--net/sctp/associola.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/net/sctp/associola.c b/net/sctp/associola.c
index 7eed77a39d0d..8e755ebff3b8 100644
--- a/net/sctp/associola.c
+++ b/net/sctp/associola.c
@@ -512,7 +512,13 @@ void sctp_assoc_set_primary(struct sctp_association *asoc,
* to this destination address earlier. The sender MUST set
* CYCLING_CHANGEOVER to indicate that this switch is a
* double switch to the same destination address.
+ *
+ * Really, only bother is we have data queued or outstanding on
+ * the association.
*/
+ if (!asoc->outqueue.outstanding_bytes && !asoc->outqueue.out_qlen)
+ return;
+
if (transport->cacc.changeover_active)
transport->cacc.cycling_changeover = changeover;