In this commit, we create a new tipc socket state TIPC_CONNECTING by primarily replacing the SS_CONNECTING with TIPC_CONNECTING.
There is no functional change in this commit. Acked-by: Ying Xue <ying....@windriver.com> Signed-off-by: Parthasarathy Bhuvaragan <parthasarathy.bhuvara...@ericsson.com> --- v2: removed redundant switch in filter_connect() as mentioned by Ying Xue --- include/uapi/linux/tipc.h | 1 + net/tipc/socket.c | 59 ++++++++++++++++++++++------------------------- 2 files changed, 29 insertions(+), 31 deletions(-) diff --git a/include/uapi/linux/tipc.h b/include/uapi/linux/tipc.h index a45ebf273e76..f2d9294d0920 100644 --- a/include/uapi/linux/tipc.h +++ b/include/uapi/linux/tipc.h @@ -186,6 +186,7 @@ enum { TIPC_OPEN, TIPC_DISCONNECTING, TIPC_CLOSING, + TIPC_CONNECTING, }; /* diff --git a/net/tipc/socket.c b/net/tipc/socket.c index 9a20b46a8ad1..5aef1142a80c 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c @@ -342,7 +342,6 @@ static bool tsk_peer_msg(struct tipc_sock *tsk, struct tipc_msg *msg) */ static int tipc_set_sk_state(struct sock *sk, int state) { - int oldstate = sk->sk_socket->state; int oldsk_state = sk->sk_state; int res = -EINVAL; @@ -352,6 +351,7 @@ static int tipc_set_sk_state(struct sock *sk, int state) res = 0; break; case TIPC_LISTEN: + case TIPC_CONNECTING: if (oldsk_state == TIPC_OPEN) res = 0; break; @@ -366,7 +366,7 @@ static int tipc_set_sk_state(struct sock *sk, int state) case TIPC_DISCONNECTING: if (oldsk_state == TIPC_PROBING || oldsk_state == TIPC_ESTABLISHED || - oldstate == SS_CONNECTING) + oldsk_state == TIPC_CONNECTING) res = 0; break; } @@ -516,7 +516,7 @@ static int tipc_release(struct socket *sock) if (TIPC_SKB_CB(skb)->bytes_read) kfree_skb(skb); else { - if ((sock->state == SS_CONNECTING) || + if ((sk->sk_state == TIPC_CONNECTING) || (sock->state == SS_CONNECTED)) { tipc_set_sk_state(sk, TIPC_CLOSING); tipc_node_remove_conn(net, dnode, tsk->portid); @@ -677,16 +677,12 @@ static unsigned int tipc_poll(struct file *file, struct socket *sock, sock_poll_wait(file, sk_sleep(sk), wait); - switch ((int)sock->state) { - case SS_CONNECTED: + if ((int)sock->state == SS_CONNECTED) { if (!tsk->link_cong && !tsk_conn_cong(tsk)) mask |= POLLOUT; - /* fall thru' */ - case SS_CONNECTING: if (!skb_queue_empty(&sk->sk_receive_queue)) mask |= (POLLIN | POLLRDNORM); - break; - default: + } else { switch (sk->sk_state) { case TIPC_OPEN: if (!tsk->link_cong) @@ -700,6 +696,7 @@ static unsigned int tipc_poll(struct file *file, struct socket *sock, mask = (POLLIN | POLLRDNORM | POLLHUP); break; case TIPC_LISTEN: + case TIPC_CONNECTING: if (!skb_queue_empty(&sk->sk_receive_queue)) mask |= (POLLIN | POLLRDNORM); break; @@ -1001,7 +998,7 @@ new_mtu: rc = tipc_node_xmit(net, &pktchain, dnode, tsk->portid); if (likely(!rc)) { if (!is_connectionless) - sock->state = SS_CONNECTING; + tipc_set_sk_state(sk, TIPC_CONNECTING); return dsz; } if (rc == -ELINKCONG) { @@ -1633,9 +1630,10 @@ static bool filter_connect(struct tipc_sock *tsk, struct sk_buff *skb) tsk->portid); } return true; + } - case SS_CONNECTING: - + switch (sk->sk_state) { + case TIPC_CONNECTING: /* Accept only ACK or NACK message */ if (unlikely(!msg_connected(hdr))) return false; @@ -1939,7 +1937,8 @@ static int tipc_wait_for_connect(struct socket *sock, long *timeo_p) return sock_intr_errno(*timeo_p); prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE); - done = sk_wait_event(sk, timeo_p, sock->state != SS_CONNECTING); + done = sk_wait_event(sk, timeo_p, + sk->sk_state != TIPC_CONNECTING); finish_wait(sk_sleep(sk), &wait); } while (!done); return 0; @@ -1962,7 +1961,7 @@ static int tipc_connect(struct socket *sock, struct sockaddr *dest, struct sockaddr_tipc *dst = (struct sockaddr_tipc *)dest; struct msghdr m = {NULL,}; long timeout = (flags & O_NONBLOCK) ? 0 : tsk->conn_timeout; - socket_state previous; + int previous; int res = 0; lock_sock(sk); @@ -1990,7 +1989,7 @@ static int tipc_connect(struct socket *sock, struct sockaddr *dest, goto exit; } - previous = sock->state; + previous = sk->sk_state; switch (sk->sk_state) { case TIPC_OPEN: @@ -2008,31 +2007,29 @@ static int tipc_connect(struct socket *sock, struct sockaddr *dest, if ((res < 0) && (res != -EWOULDBLOCK)) goto exit; - /* Just entered SS_CONNECTING state; the only + /* Just entered TIPC_CONNECTING state; the only * difference is that return value in non-blocking * case is EINPROGRESS, rather than EALREADY. */ res = -EINPROGRESS; - break; - } - - switch (sock->state) { - case SS_CONNECTING: - if (previous == SS_CONNECTING) - res = -EALREADY; - if (!timeout) + /* fall thru' */ + case TIPC_CONNECTING: + if (!timeout) { + if (previous == TIPC_CONNECTING) + res = -EALREADY; goto exit; + } timeout = msecs_to_jiffies(timeout); /* Wait until an 'ACK' or 'RST' arrives, or a timeout occurs */ res = tipc_wait_for_connect(sock, &timeout); - break; - case SS_CONNECTED: + goto exit; + } + + if (sock->state == SS_CONNECTED) res = -EISCONN; - break; - default: + else res = -EINVAL; - break; - } + exit: release_sock(sk); return res; @@ -2194,7 +2191,7 @@ static int tipc_shutdown(struct socket *sock, int how) lock_sock(sk); - if (sock->state == SS_CONNECTING || sock->state == SS_CONNECTED) { + if (sock->state == SS_CONNECTED || sk->sk_state == TIPC_CONNECTING) { restart: dnode = tsk_peer_node(tsk); -- 2.1.4 ------------------------------------------------------------------------------ _______________________________________________ tipc-discussion mailing list tipc-discussion@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/tipc-discussion