Commit 39fdc9c7 authored by Jon Maloy's avatar Jon Maloy Committed by David S. Miller

tipc: refactor function tipc_sk_filter_connect()

We refactor the function tipc_sk_filter_connect(), both to make it
more readable and as a preparation for the next commit.
Acked-by: default avatarYing Xue <ying.xue@windriver.com>
Signed-off-by: default avatarJon Maloy <jon.maloy@ericsson.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent afe8792f
...@@ -1959,91 +1959,76 @@ static void tipc_sk_proto_rcv(struct sock *sk, ...@@ -1959,91 +1959,76 @@ static void tipc_sk_proto_rcv(struct sock *sk,
} }
/** /**
* tipc_filter_connect - Handle incoming message for a connection-based socket * tipc_sk_filter_connect - check incoming message for a connection-based socket
* @tsk: TIPC socket * @tsk: TIPC socket
* @skb: pointer to message buffer. Set to NULL if buffer is consumed * @skb: pointer to message buffer.
* * Returns true if message should be added to receive queue, false otherwise
* Returns true if everything ok, false otherwise
*/ */
static bool tipc_sk_filter_connect(struct tipc_sock *tsk, struct sk_buff *skb) static bool tipc_sk_filter_connect(struct tipc_sock *tsk, struct sk_buff *skb)
{ {
struct sock *sk = &tsk->sk; struct sock *sk = &tsk->sk;
struct net *net = sock_net(sk); struct net *net = sock_net(sk);
struct tipc_msg *hdr = buf_msg(skb); struct tipc_msg *hdr = buf_msg(skb);
u32 pport = msg_origport(hdr); bool con_msg = msg_connected(hdr);
u32 pnode = msg_orignode(hdr); u32 pport = tsk_peer_port(tsk);
u32 pnode = tsk_peer_node(tsk);
u32 oport = msg_origport(hdr);
u32 onode = msg_orignode(hdr);
int err = msg_errcode(hdr);
if (unlikely(msg_mcast(hdr))) if (unlikely(msg_mcast(hdr)))
return false; return false;
switch (sk->sk_state) { switch (sk->sk_state) {
case TIPC_CONNECTING: case TIPC_CONNECTING:
/* Accept only ACK or NACK message */ /* Setup ACK */
if (unlikely(!msg_connected(hdr))) { if (likely(con_msg)) {
if (pport != tsk_peer_port(tsk) || if (err)
pnode != tsk_peer_node(tsk)) break;
return false; tipc_sk_finish_conn(tsk, oport, onode);
tipc_set_sk_state(sk, TIPC_DISCONNECTING);
sk->sk_err = ECONNREFUSED;
sk->sk_state_change(sk);
return true;
}
if (unlikely(msg_errcode(hdr))) {
tipc_set_sk_state(sk, TIPC_DISCONNECTING);
sk->sk_err = ECONNREFUSED;
sk->sk_state_change(sk);
return true;
}
if (unlikely(!msg_isdata(hdr))) {
tipc_set_sk_state(sk, TIPC_DISCONNECTING);
sk->sk_err = EINVAL;
sk->sk_state_change(sk);
return true;
}
tipc_sk_finish_conn(tsk, msg_origport(hdr), msg_orignode(hdr));
msg_set_importance(&tsk->phdr, msg_importance(hdr)); msg_set_importance(&tsk->phdr, msg_importance(hdr));
/* ACK+ message with data is added to receive queue */
/* If 'ACK+' message, add to socket receive queue */
if (msg_data_sz(hdr)) if (msg_data_sz(hdr))
return true; return true;
/* Empty ACK-, - wake up sleeping connect() and drop */
/* If empty 'ACK-' message, wake up sleeping connect() */
sk->sk_data_ready(sk); sk->sk_data_ready(sk);
/* 'ACK-' message is neither accepted nor rejected: */
msg_set_dest_droppable(hdr, 1); msg_set_dest_droppable(hdr, 1);
return false; return false;
}
/* Ignore connectionless message if not from listening socket */
if (oport != pport || onode != pnode)
return false;
/* Rejected SYN - abort */
break;
case TIPC_OPEN: case TIPC_OPEN:
case TIPC_DISCONNECTING: case TIPC_DISCONNECTING:
break; return false;
case TIPC_LISTEN: case TIPC_LISTEN:
/* Accept only SYN message */ /* Accept only SYN message */
if (!msg_connected(hdr) && !(msg_errcode(hdr))) if (!con_msg && !err)
return true; return true;
break; return false;
case TIPC_ESTABLISHED: case TIPC_ESTABLISHED:
/* Accept only connection-based messages sent by peer */ /* Accept only connection-based messages sent by peer */
if (unlikely(!tsk_peer_msg(tsk, hdr))) if (likely(con_msg && !err && pport == oport && pnode == onode))
return true;
if (!tsk_peer_msg(tsk, hdr))
return false; return false;
if (!err)
if (unlikely(msg_errcode(hdr))) { return true;
tipc_set_sk_state(sk, TIPC_DISCONNECTING); tipc_set_sk_state(sk, TIPC_DISCONNECTING);
/* Let timer expire on it's own */ tipc_node_remove_conn(net, pnode, tsk->portid);
tipc_node_remove_conn(net, tsk_peer_node(tsk),
tsk->portid);
sk->sk_state_change(sk); sk->sk_state_change(sk);
}
return true; return true;
default: default:
pr_err("Unknown sk_state %u\n", sk->sk_state); pr_err("Unknown sk_state %u\n", sk->sk_state);
} }
/* Abort connection setup attempt */
return false; tipc_set_sk_state(sk, TIPC_DISCONNECTING);
sk->sk_err = ECONNREFUSED;
sk->sk_state_change(sk);
return true;
} }
/** /**
......
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