Skip to content

Commit 9fd4b07

Browse files
Parthasarathy Bhuvaragandavem330
authored andcommitted
tipc: create TIPC_DISCONNECTING as a new sk_state
In this commit, we create a new tipc socket state TIPC_DISCONNECTING in sk_state. TIPC_DISCONNECTING is replacing the socket connection status update using SS_DISCONNECTING. TIPC_DISCONNECTING is set for connection oriented sockets at: - tipc_shutdown() - connection probe timeout - when we receive an error message on the connection. There is no functional change in this commit. Signed-off-by: Parthasarathy Bhuvaragan <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 438adca commit 9fd4b07

File tree

1 file changed

+24
-15
lines changed

1 file changed

+24
-15
lines changed

net/tipc/socket.c

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ enum {
5454
TIPC_LISTEN = TCP_LISTEN,
5555
TIPC_ESTABLISHED = TCP_ESTABLISHED,
5656
TIPC_OPEN = TCP_CLOSE,
57+
TIPC_DISCONNECTING = TCP_CLOSE_WAIT,
5758
};
5859

5960
/**
@@ -362,10 +363,14 @@ static int tipc_set_sk_state(struct sock *sk, int state)
362363
break;
363364
case TIPC_ESTABLISHED:
364365
if (oldstate == SS_CONNECTING ||
365-
oldstate == SS_UNCONNECTED ||
366366
oldsk_state == TIPC_OPEN)
367367
res = 0;
368368
break;
369+
case TIPC_DISCONNECTING:
370+
if (oldstate == SS_CONNECTING ||
371+
oldsk_state == TIPC_ESTABLISHED)
372+
res = 0;
373+
break;
369374
}
370375

371376
if (!res)
@@ -621,13 +626,14 @@ static int tipc_getname(struct socket *sock, struct sockaddr *uaddr,
621626
int *uaddr_len, int peer)
622627
{
623628
struct sockaddr_tipc *addr = (struct sockaddr_tipc *)uaddr;
624-
struct tipc_sock *tsk = tipc_sk(sock->sk);
629+
struct sock *sk = sock->sk;
630+
struct tipc_sock *tsk = tipc_sk(sk);
625631
struct tipc_net *tn = net_generic(sock_net(sock->sk), tipc_net_id);
626632

627633
memset(addr, 0, sizeof(*addr));
628634
if (peer) {
629635
if ((sock->state != SS_CONNECTED) &&
630-
((peer != 2) || (sock->state != SS_DISCONNECTING)))
636+
((peer != 2) || (sk->sk_state != TIPC_DISCONNECTING)))
631637
return -ENOTCONN;
632638
addr->addr.id.ref = tsk_peer_port(tsk);
633639
addr->addr.id.node = tsk_peer_node(tsk);
@@ -693,6 +699,9 @@ static unsigned int tipc_poll(struct file *file, struct socket *sock,
693699
(!skb_queue_empty(&sk->sk_receive_queue)))
694700
mask |= (POLLIN | POLLRDNORM);
695701
break;
702+
case TIPC_DISCONNECTING:
703+
mask = (POLLIN | POLLRDNORM | POLLHUP);
704+
break;
696705
case TIPC_LISTEN:
697706
if (!skb_queue_empty(&sk->sk_receive_queue))
698707
mask |= (POLLIN | POLLRDNORM);
@@ -1028,7 +1037,7 @@ static int tipc_wait_for_sndpkt(struct socket *sock, long *timeo_p)
10281037
int err = sock_error(sk);
10291038
if (err)
10301039
return err;
1031-
if (sock->state == SS_DISCONNECTING)
1040+
if (sk->sk_state == TIPC_DISCONNECTING)
10321041
return -EPIPE;
10331042
else if (sock->state != SS_CONNECTED)
10341043
return -ENOTCONN;
@@ -1098,7 +1107,7 @@ static int __tipc_send_stream(struct socket *sock, struct msghdr *m, size_t dsz)
10981107
return -EMSGSIZE;
10991108

11001109
if (unlikely(sock->state != SS_CONNECTED)) {
1101-
if (sock->state == SS_DISCONNECTING)
1110+
if (sk->sk_state == TIPC_DISCONNECTING)
11021111
return -EPIPE;
11031112
else
11041113
return -ENOTCONN;
@@ -1626,7 +1635,7 @@ static bool filter_connect(struct tipc_sock *tsk, struct sk_buff *skb)
16261635
return false;
16271636

16281637
if (unlikely(msg_errcode(hdr))) {
1629-
sock->state = SS_DISCONNECTING;
1638+
tipc_set_sk_state(sk, TIPC_DISCONNECTING);
16301639
/* Let timer expire on it's own */
16311640
tipc_node_remove_conn(net, tsk_peer_node(tsk),
16321641
tsk->portid);
@@ -1641,13 +1650,13 @@ static bool filter_connect(struct tipc_sock *tsk, struct sk_buff *skb)
16411650
return false;
16421651

16431652
if (unlikely(msg_errcode(hdr))) {
1644-
sock->state = SS_DISCONNECTING;
1653+
tipc_set_sk_state(sk, TIPC_DISCONNECTING);
16451654
sk->sk_err = ECONNREFUSED;
16461655
return true;
16471656
}
16481657

16491658
if (unlikely(!msg_isdata(hdr))) {
1650-
sock->state = SS_DISCONNECTING;
1659+
tipc_set_sk_state(sk, TIPC_DISCONNECTING);
16511660
sk->sk_err = EINVAL;
16521661
return true;
16531662
}
@@ -1674,6 +1683,7 @@ static bool filter_connect(struct tipc_sock *tsk, struct sk_buff *skb)
16741683

16751684
switch (sk->sk_state) {
16761685
case TIPC_OPEN:
1686+
case TIPC_DISCONNECTING:
16771687
break;
16781688
case TIPC_LISTEN:
16791689
/* Accept only SYN message */
@@ -2195,9 +2205,7 @@ static int tipc_shutdown(struct socket *sock, int how)
21952205

21962206
lock_sock(sk);
21972207

2198-
switch (sock->state) {
2199-
case SS_CONNECTING:
2200-
case SS_CONNECTED:
2208+
if (sock->state == SS_CONNECTING || sock->state == SS_CONNECTED) {
22012209

22022210
restart:
22032211
dnode = tsk_peer_node(tsk);
@@ -2218,11 +2226,12 @@ static int tipc_shutdown(struct socket *sock, int how)
22182226
if (skb)
22192227
tipc_node_xmit_skb(net, skb, dnode, tsk->portid);
22202228
}
2221-
sock->state = SS_DISCONNECTING;
2229+
tipc_set_sk_state(sk, TIPC_DISCONNECTING);
22222230
tipc_node_remove_conn(net, dnode, tsk->portid);
2223-
/* fall through */
2231+
}
22242232

2225-
case SS_DISCONNECTING:
2233+
switch (sk->sk_state) {
2234+
case TIPC_DISCONNECTING:
22262235

22272236
/* Discard any unreceived messages */
22282237
__skb_queue_purge(&sk->sk_receive_queue);
@@ -2258,7 +2267,7 @@ static void tipc_sk_timeout(unsigned long data)
22582267

22592268
if (tsk->probe_unacked) {
22602269
if (!sock_owned_by_user(sk)) {
2261-
sk->sk_socket->state = SS_DISCONNECTING;
2270+
tipc_set_sk_state(sk, TIPC_DISCONNECTING);
22622271
tipc_node_remove_conn(sock_net(sk), tsk_peer_node(tsk),
22632272
tsk_peer_port(tsk));
22642273
sk->sk_state_change(sk);

0 commit comments

Comments
 (0)