mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-26 10:49:33 +00:00
sctp: retran_path update bug fix
If the current retran_path is the only active one, it should update it to the the next inactive one. Signed-off-by: Gui Jianfeng <guijianfeng@cn.fujitsu.com> Signed-off-by: Vlad Yasevich <vladislav.yasevich@hp.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
aed5a833fb
commit
4141ddc02a
1 changed files with 12 additions and 9 deletions
|
@ -1203,6 +1203,9 @@ void sctp_assoc_update_retran_path(struct sctp_association *asoc)
|
||||||
struct list_head *head = &asoc->peer.transport_addr_list;
|
struct list_head *head = &asoc->peer.transport_addr_list;
|
||||||
struct list_head *pos;
|
struct list_head *pos;
|
||||||
|
|
||||||
|
if (asoc->peer.transport_count == 1)
|
||||||
|
return;
|
||||||
|
|
||||||
/* Find the next transport in a round-robin fashion. */
|
/* Find the next transport in a round-robin fashion. */
|
||||||
t = asoc->peer.retran_path;
|
t = asoc->peer.retran_path;
|
||||||
pos = &t->transports;
|
pos = &t->transports;
|
||||||
|
@ -1217,6 +1220,15 @@ void sctp_assoc_update_retran_path(struct sctp_association *asoc)
|
||||||
|
|
||||||
t = list_entry(pos, struct sctp_transport, transports);
|
t = list_entry(pos, struct sctp_transport, transports);
|
||||||
|
|
||||||
|
/* We have exhausted the list, but didn't find any
|
||||||
|
* other active transports. If so, use the next
|
||||||
|
* transport.
|
||||||
|
*/
|
||||||
|
if (t == asoc->peer.retran_path) {
|
||||||
|
t = next;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
/* Try to find an active transport. */
|
/* Try to find an active transport. */
|
||||||
|
|
||||||
if ((t->state == SCTP_ACTIVE) ||
|
if ((t->state == SCTP_ACTIVE) ||
|
||||||
|
@ -1229,15 +1241,6 @@ void sctp_assoc_update_retran_path(struct sctp_association *asoc)
|
||||||
if (!next)
|
if (!next)
|
||||||
next = t;
|
next = t;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We have exhausted the list, but didn't find any
|
|
||||||
* other active transports. If so, use the next
|
|
||||||
* transport.
|
|
||||||
*/
|
|
||||||
if (t == asoc->peer.retran_path) {
|
|
||||||
t = next;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
asoc->peer.retran_path = t;
|
asoc->peer.retran_path = t;
|
||||||
|
|
Loading…
Reference in a new issue