Skip to content

Commit 39fdc9c

Browse files
Jon Maloydavem330
authored andcommitted
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: Ying Xue <[email protected]> Signed-off-by: Jon Maloy <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent afe8792 commit 39fdc9c

File tree

1 file changed

+43
-58
lines changed

1 file changed

+43
-58
lines changed

net/tipc/socket.c

Lines changed: 43 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1959,91 +1959,76 @@ static void tipc_sk_proto_rcv(struct sock *sk,
19591959
}
19601960

19611961
/**
1962-
* tipc_filter_connect - Handle incoming message for a connection-based socket
1962+
* tipc_sk_filter_connect - check incoming message for a connection-based socket
19631963
* @tsk: TIPC socket
1964-
* @skb: pointer to message buffer. Set to NULL if buffer is consumed
1965-
*
1966-
* Returns true if everything ok, false otherwise
1964+
* @skb: pointer to message buffer.
1965+
* Returns true if message should be added to receive queue, false otherwise
19671966
*/
19681967
static bool tipc_sk_filter_connect(struct tipc_sock *tsk, struct sk_buff *skb)
19691968
{
19701969
struct sock *sk = &tsk->sk;
19711970
struct net *net = sock_net(sk);
19721971
struct tipc_msg *hdr = buf_msg(skb);
1973-
u32 pport = msg_origport(hdr);
1974-
u32 pnode = msg_orignode(hdr);
1972+
bool con_msg = msg_connected(hdr);
1973+
u32 pport = tsk_peer_port(tsk);
1974+
u32 pnode = tsk_peer_node(tsk);
1975+
u32 oport = msg_origport(hdr);
1976+
u32 onode = msg_orignode(hdr);
1977+
int err = msg_errcode(hdr);
19751978

19761979
if (unlikely(msg_mcast(hdr)))
19771980
return false;
19781981

19791982
switch (sk->sk_state) {
19801983
case TIPC_CONNECTING:
1981-
/* Accept only ACK or NACK message */
1982-
if (unlikely(!msg_connected(hdr))) {
1983-
if (pport != tsk_peer_port(tsk) ||
1984-
pnode != tsk_peer_node(tsk))
1985-
return false;
1986-
1987-
tipc_set_sk_state(sk, TIPC_DISCONNECTING);
1988-
sk->sk_err = ECONNREFUSED;
1989-
sk->sk_state_change(sk);
1990-
return true;
1991-
}
1992-
1993-
if (unlikely(msg_errcode(hdr))) {
1994-
tipc_set_sk_state(sk, TIPC_DISCONNECTING);
1995-
sk->sk_err = ECONNREFUSED;
1996-
sk->sk_state_change(sk);
1997-
return true;
1998-
}
1999-
2000-
if (unlikely(!msg_isdata(hdr))) {
2001-
tipc_set_sk_state(sk, TIPC_DISCONNECTING);
2002-
sk->sk_err = EINVAL;
2003-
sk->sk_state_change(sk);
2004-
return true;
1984+
/* Setup ACK */
1985+
if (likely(con_msg)) {
1986+
if (err)
1987+
break;
1988+
tipc_sk_finish_conn(tsk, oport, onode);
1989+
msg_set_importance(&tsk->phdr, msg_importance(hdr));
1990+
/* ACK+ message with data is added to receive queue */
1991+
if (msg_data_sz(hdr))
1992+
return true;
1993+
/* Empty ACK-, - wake up sleeping connect() and drop */
1994+
sk->sk_data_ready(sk);
1995+
msg_set_dest_droppable(hdr, 1);
1996+
return false;
20051997
}
1998+
/* Ignore connectionless message if not from listening socket */
1999+
if (oport != pport || onode != pnode)
2000+
return false;
20062001

2007-
tipc_sk_finish_conn(tsk, msg_origport(hdr), msg_orignode(hdr));
2008-
msg_set_importance(&tsk->phdr, msg_importance(hdr));
2009-
2010-
/* If 'ACK+' message, add to socket receive queue */
2011-
if (msg_data_sz(hdr))
2012-
return true;
2013-
2014-
/* If empty 'ACK-' message, wake up sleeping connect() */
2015-
sk->sk_data_ready(sk);
2016-
2017-
/* 'ACK-' message is neither accepted nor rejected: */
2018-
msg_set_dest_droppable(hdr, 1);
2019-
return false;
2020-
2002+
/* Rejected SYN - abort */
2003+
break;
20212004
case TIPC_OPEN:
20222005
case TIPC_DISCONNECTING:
2023-
break;
2006+
return false;
20242007
case TIPC_LISTEN:
20252008
/* Accept only SYN message */
2026-
if (!msg_connected(hdr) && !(msg_errcode(hdr)))
2009+
if (!con_msg && !err)
20272010
return true;
2028-
break;
2011+
return false;
20292012
case TIPC_ESTABLISHED:
20302013
/* Accept only connection-based messages sent by peer */
2031-
if (unlikely(!tsk_peer_msg(tsk, hdr)))
2014+
if (likely(con_msg && !err && pport == oport && pnode == onode))
2015+
return true;
2016+
if (!tsk_peer_msg(tsk, hdr))
20322017
return false;
2033-
2034-
if (unlikely(msg_errcode(hdr))) {
2035-
tipc_set_sk_state(sk, TIPC_DISCONNECTING);
2036-
/* Let timer expire on it's own */
2037-
tipc_node_remove_conn(net, tsk_peer_node(tsk),
2038-
tsk->portid);
2039-
sk->sk_state_change(sk);
2040-
}
2018+
if (!err)
2019+
return true;
2020+
tipc_set_sk_state(sk, TIPC_DISCONNECTING);
2021+
tipc_node_remove_conn(net, pnode, tsk->portid);
2022+
sk->sk_state_change(sk);
20412023
return true;
20422024
default:
20432025
pr_err("Unknown sk_state %u\n", sk->sk_state);
20442026
}
2045-
2046-
return false;
2027+
/* Abort connection setup attempt */
2028+
tipc_set_sk_state(sk, TIPC_DISCONNECTING);
2029+
sk->sk_err = ECONNREFUSED;
2030+
sk->sk_state_change(sk);
2031+
return true;
20472032
}
20482033

20492034
/**

0 commit comments

Comments
 (0)