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 | 56 ++++++++++++++++++++++------------------------- 2 files changed, 27 insertions(+), 30 deletions(-) diff --git a/include/uapi/linux/tipc.h b/include/uapi/linux/tipc.h index ce344581f755..338b46f80ee8 100644 --- a/include/uapi/linux/tipc.h +++ b/include/uapi/linux/tipc.h @@ -185,6 +185,7 @@ enum { TIPC_ESTABLISHED, TIPC_UNCONNECTED, TIPC_DISCONNECTING, + TIPC_CONNECTING, }; /* diff --git a/net/tipc/socket.c b/net/tipc/socket.c index 309e0b31a1f7..1e31029198fd 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_UNCONNECTED) res = 0; break; @@ -362,7 +362,7 @@ static int tipc_set_sk_state(struct sock *sk, int state) case TIPC_ESTABLISHED: if (oldsk_state == TIPC_PROBING || oldsk_state == TIPC_ESTABLISHED || - oldstate == SS_CONNECTING || + oldsk_state == TIPC_CONNECTING || oldsk_state == TIPC_UNCONNECTED) res = 0; break; @@ -513,7 +513,7 @@ static int tipc_release(struct socket *sock) if (TIPC_SKB_CB(skb)->handle != NULL) 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_DISCONNECTING); tipc_node_remove_conn(net, dnode, tsk->portid); @@ -708,8 +708,6 @@ static unsigned int tipc_poll(struct file *file, struct socket *sock, case 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; @@ -720,6 +718,7 @@ static unsigned int tipc_poll(struct file *file, struct socket *sock, mask |= POLLOUT; break; case TIPC_LISTEN: + case TIPC_CONNECTING: if (!skb_queue_empty(&sk->sk_receive_queue)) mask |= (POLLIN | POLLRDNORM); break; @@ -1024,7 +1023,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) { @@ -1654,9 +1653,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; @@ -1689,9 +1689,6 @@ static bool filter_connect(struct tipc_sock *tsk, struct sk_buff *skb) msg_set_dest_droppable(hdr, 1); return false; - } - - switch (sk->sk_state) { case TIPC_UNCONNECTED: case TIPC_DISCONNECTING: break; @@ -1960,7 +1957,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; @@ -1983,7 +1981,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); @@ -2011,7 +2009,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_UNCONNECTED: @@ -2029,31 +2027,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; @@ -2215,7 +2211,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