diff options
Diffstat (limited to 'net/sctp/associola.c')
-rw-r--r-- | net/sctp/associola.c | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/net/sctp/associola.c b/net/sctp/associola.c index b4cd2b71953f..532634861db1 100644 --- a/net/sctp/associola.c +++ b/net/sctp/associola.c | |||
@@ -1203,6 +1203,9 @@ void sctp_assoc_update_retran_path(struct sctp_association *asoc) | |||
1203 | struct list_head *head = &asoc->peer.transport_addr_list; | 1203 | struct list_head *head = &asoc->peer.transport_addr_list; |
1204 | struct list_head *pos; | 1204 | struct list_head *pos; |
1205 | 1205 | ||
1206 | if (asoc->peer.transport_count == 1) | ||
1207 | return; | ||
1208 | |||
1206 | /* Find the next transport in a round-robin fashion. */ | 1209 | /* Find the next transport in a round-robin fashion. */ |
1207 | t = asoc->peer.retran_path; | 1210 | t = asoc->peer.retran_path; |
1208 | pos = &t->transports; | 1211 | pos = &t->transports; |
@@ -1217,6 +1220,15 @@ void sctp_assoc_update_retran_path(struct sctp_association *asoc) | |||
1217 | 1220 | ||
1218 | t = list_entry(pos, struct sctp_transport, transports); | 1221 | t = list_entry(pos, struct sctp_transport, transports); |
1219 | 1222 | ||
1223 | /* We have exhausted the list, but didn't find any | ||
1224 | * other active transports. If so, use the next | ||
1225 | * transport. | ||
1226 | */ | ||
1227 | if (t == asoc->peer.retran_path) { | ||
1228 | t = next; | ||
1229 | break; | ||
1230 | } | ||
1231 | |||
1220 | /* Try to find an active transport. */ | 1232 | /* Try to find an active transport. */ |
1221 | 1233 | ||
1222 | if ((t->state == SCTP_ACTIVE) || | 1234 | if ((t->state == SCTP_ACTIVE) || |
@@ -1229,15 +1241,6 @@ void sctp_assoc_update_retran_path(struct sctp_association *asoc) | |||
1229 | if (!next) | 1241 | if (!next) |
1230 | next = t; | 1242 | next = t; |
1231 | } | 1243 | } |
1232 | |||
1233 | /* We have exhausted the list, but didn't find any | ||
1234 | * other active transports. If so, use the next | ||
1235 | * transport. | ||
1236 | */ | ||
1237 | if (t == asoc->peer.retran_path) { | ||
1238 | t = next; | ||
1239 | break; | ||
1240 | } | ||
1241 | } | 1244 | } |
1242 | 1245 | ||
1243 | asoc->peer.retran_path = t; | 1246 | asoc->peer.retran_path = t; |