Skip to content

Commit f40acba

Browse files
Parthasarathy Bhuvaragandavem330
authored andcommitted
tipc: remove SS_CONNECTED sock state
In this commit, we replace references to sock->state SS_CONNECTE with sk_state TIPC_ESTABLISHED. Finally, the sock->state is no longer explicitly used by tipc. The FSM below is for various types of connection oriented sockets. Stream Server Listening Socket: +-----------+ +-------------+ | TIPC_OPEN |------>| TIPC_LISTEN | +-----------+ +-------------+ Stream Server Data Socket: +-----------+ +------------------+ | TIPC_OPEN |------>| TIPC_ESTABLISHED | +-----------+ +------------------+ ^ | | | | v +--------------------+ | TIPC_DISCONNECTING | +--------------------+ Stream Socket Client: +-----------+ +-----------------+ | TIPC_OPEN |------>| TIPC_CONNECTING |------+ +-----------+ +-----------------+ | | | | | v | +------------------+ | | TIPC_ESTABLISHED | | +------------------+ | ^ | | | | | | v | +--------------------+ | | TIPC_DISCONNECTING |<--+ +--------------------+ Signed-off-by: Parthasarathy Bhuvaragan <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 99a2088 commit f40acba

File tree

1 file changed

+38
-48
lines changed

1 file changed

+38
-48
lines changed

net/tipc/socket.c

Lines changed: 38 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ static void tsk_rej_rx_queue(struct sock *sk)
294294

295295
static bool tipc_sk_connected(struct sock *sk)
296296
{
297-
return sk->sk_socket->state == SS_CONNECTED;
297+
return sk->sk_state == TIPC_ESTABLISHED;
298298
}
299299

300300
/* tipc_sk_type_connectionless - check if the socket is datagram socket
@@ -639,7 +639,7 @@ static int tipc_getname(struct socket *sock, struct sockaddr *uaddr,
639639

640640
memset(addr, 0, sizeof(*addr));
641641
if (peer) {
642-
if ((sock->state != SS_CONNECTED) &&
642+
if ((!tipc_sk_connected(sk)) &&
643643
((peer != 2) || (sk->sk_state != TIPC_DISCONNECTING)))
644644
return -ENOTCONN;
645645
addr->addr.id.ref = tsk_peer_port(tsk);
@@ -690,29 +690,26 @@ static unsigned int tipc_poll(struct file *file, struct socket *sock,
690690
if (sk->sk_shutdown == SHUTDOWN_MASK)
691691
mask |= POLLHUP;
692692

693-
if ((int)sock->state == SS_CONNECTED) {
693+
switch (sk->sk_state) {
694+
case TIPC_ESTABLISHED:
694695
if (!tsk->link_cong && !tsk_conn_cong(tsk))
695696
mask |= POLLOUT;
697+
/* fall thru' */
698+
case TIPC_LISTEN:
699+
case TIPC_CONNECTING:
696700
if (!skb_queue_empty(&sk->sk_receive_queue))
697701
mask |= (POLLIN | POLLRDNORM);
698-
} else {
699-
switch (sk->sk_state) {
700-
case TIPC_OPEN:
701-
if (!tsk->link_cong)
702-
mask |= POLLOUT;
703-
if (tipc_sk_type_connectionless(sk) &&
704-
(!skb_queue_empty(&sk->sk_receive_queue)))
705-
mask |= (POLLIN | POLLRDNORM);
706-
break;
707-
case TIPC_DISCONNECTING:
708-
mask = (POLLIN | POLLRDNORM | POLLHUP);
709-
break;
710-
case TIPC_LISTEN:
711-
case TIPC_CONNECTING:
712-
if (!skb_queue_empty(&sk->sk_receive_queue))
713-
mask |= (POLLIN | POLLRDNORM);
714-
break;
715-
}
702+
break;
703+
case TIPC_OPEN:
704+
if (!tsk->link_cong)
705+
mask |= POLLOUT;
706+
if (tipc_sk_type_connectionless(sk) &&
707+
(!skb_queue_empty(&sk->sk_receive_queue)))
708+
mask |= (POLLIN | POLLRDNORM);
709+
break;
710+
case TIPC_DISCONNECTING:
711+
mask = (POLLIN | POLLRDNORM | POLLHUP);
712+
break;
716713
}
717714

718715
return mask;
@@ -1045,7 +1042,7 @@ static int tipc_wait_for_sndpkt(struct socket *sock, long *timeo_p)
10451042
return err;
10461043
if (sk->sk_state == TIPC_DISCONNECTING)
10471044
return -EPIPE;
1048-
else if (sock->state != SS_CONNECTED)
1045+
else if (!tipc_sk_connected(sk))
10491046
return -ENOTCONN;
10501047
if (!*timeo_p)
10511048
return -EAGAIN;
@@ -1112,7 +1109,7 @@ static int __tipc_send_stream(struct socket *sock, struct msghdr *m, size_t dsz)
11121109
if (dsz > (uint)INT_MAX)
11131110
return -EMSGSIZE;
11141111

1115-
if (unlikely(sock->state != SS_CONNECTED)) {
1112+
if (unlikely(!tipc_sk_connected(sk))) {
11161113
if (sk->sk_state == TIPC_DISCONNECTING)
11171114
return -EPIPE;
11181115
else
@@ -1627,29 +1624,11 @@ static bool filter_connect(struct tipc_sock *tsk, struct sk_buff *skb)
16271624
{
16281625
struct sock *sk = &tsk->sk;
16291626
struct net *net = sock_net(sk);
1630-
struct socket *sock = sk->sk_socket;
16311627
struct tipc_msg *hdr = buf_msg(skb);
16321628

16331629
if (unlikely(msg_mcast(hdr)))
16341630
return false;
16351631

1636-
switch ((int)sock->state) {
1637-
case SS_CONNECTED:
1638-
1639-
/* Accept only connection-based messages sent by peer */
1640-
if (unlikely(!tsk_peer_msg(tsk, hdr)))
1641-
return false;
1642-
1643-
if (unlikely(msg_errcode(hdr))) {
1644-
tipc_set_sk_state(sk, TIPC_DISCONNECTING);
1645-
/* Let timer expire on it's own */
1646-
tipc_node_remove_conn(net, tsk_peer_node(tsk),
1647-
tsk->portid);
1648-
sk->sk_state_change(sk);
1649-
}
1650-
return true;
1651-
}
1652-
16531632
switch (sk->sk_state) {
16541633
case TIPC_CONNECTING:
16551634
/* Accept only ACK or NACK message */
@@ -1670,7 +1649,6 @@ static bool filter_connect(struct tipc_sock *tsk, struct sk_buff *skb)
16701649

16711650
tipc_sk_finish_conn(tsk, msg_origport(hdr), msg_orignode(hdr));
16721651
msg_set_importance(&tsk->phdr, msg_importance(hdr));
1673-
sock->state = SS_CONNECTED;
16741652

16751653
/* If 'ACK+' message, add to socket receive queue */
16761654
if (msg_data_sz(hdr))
@@ -1692,6 +1670,19 @@ static bool filter_connect(struct tipc_sock *tsk, struct sk_buff *skb)
16921670
if (!msg_connected(hdr) && !(msg_errcode(hdr)))
16931671
return true;
16941672
break;
1673+
case TIPC_ESTABLISHED:
1674+
/* Accept only connection-based messages sent by peer */
1675+
if (unlikely(!tsk_peer_msg(tsk, hdr)))
1676+
return false;
1677+
1678+
if (unlikely(msg_errcode(hdr))) {
1679+
tipc_set_sk_state(sk, TIPC_DISCONNECTING);
1680+
/* Let timer expire on it's own */
1681+
tipc_node_remove_conn(net, tsk_peer_node(tsk),
1682+
tsk->portid);
1683+
sk->sk_state_change(sk);
1684+
}
1685+
return true;
16951686
default:
16961687
pr_err("Unknown sk_state %u\n", sk->sk_state);
16971688
}
@@ -2037,13 +2028,13 @@ static int tipc_connect(struct socket *sock, struct sockaddr *dest,
20372028
timeout = msecs_to_jiffies(timeout);
20382029
/* Wait until an 'ACK' or 'RST' arrives, or a timeout occurs */
20392030
res = tipc_wait_for_connect(sock, &timeout);
2040-
goto exit;
2041-
}
2042-
2043-
if (sock->state == SS_CONNECTED)
2031+
break;
2032+
case TIPC_ESTABLISHED:
20442033
res = -EISCONN;
2045-
else
2034+
break;
2035+
default:
20462036
res = -EINVAL;
2037+
}
20472038

20482039
exit:
20492040
release_sock(sk);
@@ -2152,7 +2143,6 @@ static int tipc_accept(struct socket *sock, struct socket *new_sock, int flags)
21522143

21532144
/* Connect new socket to it's peer */
21542145
tipc_sk_finish_conn(new_tsock, msg_origport(msg), msg_orignode(msg));
2155-
new_sock->state = SS_CONNECTED;
21562146

21572147
tsk_set_importance(new_tsock, msg_importance(msg));
21582148
if (msg_named(msg)) {

0 commit comments

Comments
 (0)