In this commit, we create a new tipc socket state TIPC_CLOSING in sk_state. We primarily replace all the remaining references to SS_DISCONNECTING sock->state with TIPC_CLOSING. Thus the FSM for sockets will be as follows:
For connectionless sockets: +-----------+ +--------------+ | TIPC_OPEN |------>| TIPC_CLOSING | +-----------+ +--------------+ For connection oriented sockets: +-----------+ +------------------+ +--------------+ | TIPC_OPEN |------>| TIPC_XXXX (1..N) |----->| TIPC_CLOSING | +-----------+ +------------------+ +--------------+ There is no functional change in this commit. Signed-off-by: Parthasarathy Bhuvaragan <parthasarathy.bhuvara...@ericsson.com> --- include/uapi/linux/tipc.h | 1 + net/tipc/socket.c | 19 ++++++++----------- 2 files changed, 9 insertions(+), 11 deletions(-) diff --git a/include/uapi/linux/tipc.h b/include/uapi/linux/tipc.h index f5c03fdfc8a8..a45ebf273e76 100644 --- a/include/uapi/linux/tipc.h +++ b/include/uapi/linux/tipc.h @@ -185,6 +185,7 @@ enum { TIPC_ESTABLISHED, TIPC_OPEN, TIPC_DISCONNECTING, + TIPC_CLOSING, }; /* diff --git a/net/tipc/socket.c b/net/tipc/socket.c index 416027549745..9a20b46a8ad1 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c @@ -348,6 +348,7 @@ static int tipc_set_sk_state(struct sock *sk, int state) switch (state) { case TIPC_OPEN: + case TIPC_CLOSING: res = 0; break; case TIPC_LISTEN: @@ -508,7 +509,7 @@ static int tipc_release(struct socket *sock) * (which disconnects locally & sends a 'FIN+' to peer) */ dnode = tsk_peer_node(tsk); - while (sock->state != SS_DISCONNECTING) { + while (sk->sk_state != TIPC_CLOSING) { skb = __skb_dequeue(&sk->sk_receive_queue); if (skb == NULL) break; @@ -517,7 +518,7 @@ static int tipc_release(struct socket *sock) else { if ((sock->state == SS_CONNECTING) || (sock->state == SS_CONNECTED)) { - sock->state = SS_DISCONNECTING; + tipc_set_sk_state(sk, TIPC_CLOSING); tipc_node_remove_conn(net, dnode, tsk->portid); } tipc_sk_respond(sk, skb, TIPC_ERR_NO_PORT); @@ -538,7 +539,7 @@ static int tipc_release(struct socket *sock) } /* Reject any messages that accumulated in backlog queue */ - sock->state = SS_DISCONNECTING; + tipc_set_sk_state(sk, TIPC_CLOSING); release_sock(sk); call_rcu(&tsk->rcu, tipc_sk_callback); @@ -685,9 +686,6 @@ static unsigned int tipc_poll(struct file *file, struct socket *sock, if (!skb_queue_empty(&sk->sk_receive_queue)) mask |= (POLLIN | POLLRDNORM); break; - case SS_DISCONNECTING: - mask = (POLLIN | POLLRDNORM | POLLHUP); - break; default: switch (sk->sk_state) { case TIPC_OPEN: @@ -697,6 +695,7 @@ static unsigned int tipc_poll(struct file *file, struct socket *sock, (!skb_queue_empty(&sk->sk_receive_queue))) mask |= (POLLIN | POLLRDNORM); break; + case TIPC_CLOSING: case TIPC_DISCONNECTING: mask = (POLLIN | POLLRDNORM | POLLHUP); break; @@ -878,7 +877,7 @@ static int tipc_wait_for_sndmsg(struct socket *sock, long *timeo_p) int err = sock_error(sk); if (err) return err; - if (sock->state == SS_DISCONNECTING) + if (sk->sk_state == TIPC_CLOSING) return -EPIPE; if (!*timeo_p) return -EAGAIN; @@ -1328,7 +1327,7 @@ static int tipc_wait_for_rcvmsg(struct socket *sock, long *timeop) for (;;) { prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE); if (timeo && skb_queue_empty(&sk->sk_receive_queue)) { - if (sock->state == SS_DISCONNECTING) { + if (sk->sk_state == TIPC_CLOSING) { err = -ENOTCONN; break; } @@ -1668,13 +1667,11 @@ static bool filter_connect(struct tipc_sock *tsk, struct sk_buff *skb) /* 'ACK-' message is neither accepted nor rejected: */ msg_set_dest_droppable(hdr, 1); return false; - - case SS_DISCONNECTING: - break; } switch (sk->sk_state) { case TIPC_OPEN: + case TIPC_CLOSING: case TIPC_DISCONNECTING: break; case TIPC_LISTEN: -- 2.1.4 ------------------------------------------------------------------------------ _______________________________________________ tipc-discussion mailing list tipc-discussion@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/tipc-discussion