diff options
| -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; |
