Commit b3be5e3e authored by Erik Hugne's avatar Erik Hugne Committed by David S. Miller

tipc: disconnect socket directly after probe failure

If the TIPC connection timer expires in a probing state, a
self abort message is supposed to be generated and delivered
to the local socket. This is currently broken, and the abort
message is actually sent out to the peer node with invalid
addressing information. This will cause the link to enter
a constant retransmission state and eventually reset.
We fix this by removing the self-abort message creation and
tear down connection immediately instead.
Signed-off-by: default avatarErik Hugne <erik.hugne@ericsson.com>
Reviewed-by: default avatarYing Xue <ying.xue@windriver.com>
Reviewed-by: default avatarJon Maloy <jon.maloy@ericsson.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 1b0ccfe5
...@@ -2142,11 +2142,17 @@ static void tipc_sk_timeout(unsigned long data) ...@@ -2142,11 +2142,17 @@ static void tipc_sk_timeout(unsigned long data)
peer_node = tsk_peer_node(tsk); peer_node = tsk_peer_node(tsk);
if (tsk->probing_state == TIPC_CONN_PROBING) { if (tsk->probing_state == TIPC_CONN_PROBING) {
/* Previous probe not answered -> self abort */ if (!sock_owned_by_user(sk)) {
skb = tipc_msg_create(TIPC_CRITICAL_IMPORTANCE, sk->sk_socket->state = SS_DISCONNECTING;
TIPC_CONN_MSG, SHORT_H_SIZE, 0, tsk->connected = 0;
own_node, peer_node, tsk->portid, tipc_node_remove_conn(sock_net(sk), tsk_peer_node(tsk),
peer_port, TIPC_ERR_NO_PORT); tsk_peer_port(tsk));
sk->sk_state_change(sk);
} else {
/* Try again later */
sk_reset_timer(sk, &sk->sk_timer, (HZ / 20));
}
} else { } else {
skb = tipc_msg_create(CONN_MANAGER, CONN_PROBE, skb = tipc_msg_create(CONN_MANAGER, CONN_PROBE,
INT_H_SIZE, 0, peer_node, own_node, INT_H_SIZE, 0, peer_node, own_node,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment