In this commit, we create a new tipc socket state TIPC_UNCONNECTED in sk_state. We primarily replace the SS_UNCONNECTED sock->state with TIPC_UNCONNECTED.
Signed-off-by: Parthasarathy Bhuvaragan <parthasarathy.bhuvara...@ericsson.com> --- include/uapi/linux/tipc.h | 1 + net/tipc/socket.c | 61 ++++++++++++++++++++++++++++------------------- 2 files changed, 38 insertions(+), 24 deletions(-) diff --git a/include/uapi/linux/tipc.h b/include/uapi/linux/tipc.h index 189bfed0363c..8579bc9e4a24 100644 --- a/include/uapi/linux/tipc.h +++ b/include/uapi/linux/tipc.h @@ -183,6 +183,7 @@ enum { TIPC_LISTEN = 1, TIPC_PROBING, TIPC_ESTABLISHED, + TIPC_UNCONNECTED, }; /* diff --git a/net/tipc/socket.c b/net/tipc/socket.c index 2de6aab825cc..c1eb6cd7c7d3 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c @@ -347,8 +347,11 @@ static int tipc_set_state(struct sock *sk, int state) int res = -EINVAL; switch (state) { + case TIPC_UNCONNECTED: + res = 0; + break; case TIPC_LISTEN: - if (oldstate == SS_UNCONNECTED) + if (oldsk_state == TIPC_UNCONNECTED) res = 0; break; case TIPC_PROBING: @@ -359,7 +362,7 @@ static int tipc_set_state(struct sock *sk, int state) if (oldsk_state == TIPC_PROBING || oldsk_state == TIPC_ESTABLISHED || oldstate == SS_CONNECTING || - oldstate == SS_UNCONNECTED) + oldsk_state == TIPC_UNCONNECTED) res = 0; break; } @@ -426,8 +429,8 @@ static int tipc_sk_create(struct net *net, struct socket *sock, /* Finish initializing socket data structures */ sock->ops = ops; - sock->state = SS_UNCONNECTED; sock_init_data(sock, sk); + tipc_set_state(sk, TIPC_UNCONNECTED); if (tipc_sk_insert(tsk)) { pr_warn("Socket create failed; port number exhausted\n"); return -EINVAL; @@ -451,6 +454,7 @@ static int tipc_sk_create(struct net *net, struct socket *sock, if (sock->type == SOCK_DGRAM) tsk_set_unreliable(tsk, true); } + return 0; } @@ -699,18 +703,6 @@ static unsigned int tipc_poll(struct file *file, struct socket *sock, } switch ((int)sock->state) { - case SS_UNCONNECTED: - switch (sk->sk_state) { - case TIPC_LISTEN: - if (!skb_queue_empty(&sk->sk_receive_queue)) - mask |= (POLLIN | POLLRDNORM); - break; - default: - if (!tsk->link_cong) - mask |= POLLOUT; - break; - } - break; case SS_CONNECTED: if (!tsk->link_cong && !tsk_conn_cong(tsk)) mask |= POLLOUT; @@ -722,6 +714,17 @@ static unsigned int tipc_poll(struct file *file, struct socket *sock, case SS_DISCONNECTING: mask = (POLLIN | POLLRDNORM | POLLHUP); break; + default: + switch (sk->sk_state) { + case TIPC_UNCONNECTED: + if (!tsk->link_cong) + mask |= POLLOUT; + break; + case TIPC_LISTEN: + if (!skb_queue_empty(&sk->sk_receive_queue)) + mask |= (POLLIN | POLLRDNORM); + break; + } } return mask; @@ -966,7 +969,7 @@ static int __tipc_sendmsg(struct socket *sock, struct msghdr *m, size_t dsz) if (!is_connectionless) { if (sk->sk_state == TIPC_LISTEN) return -EPIPE; - if (sock->state != SS_UNCONNECTED) + if (sk->sk_state != TIPC_UNCONNECTED) return -EISCONN; if (tsk->published) return -EOPNOTSUPP; @@ -1398,7 +1401,7 @@ static int tipc_recvmsg(struct socket *sock, struct msghdr *m, size_t buf_len, lock_sock(sk); - if (!is_connectionless && unlikely(sock->state == SS_UNCONNECTED)) { + if (!is_connectionless && unlikely(sk->sk_state == TIPC_UNCONNECTED)) { res = -ENOTCONN; goto exit; } @@ -1495,7 +1498,7 @@ static int tipc_recv_stream(struct socket *sock, struct msghdr *m, lock_sock(sk); - if (unlikely(sock->state == SS_UNCONNECTED)) { + if (unlikely(sk->sk_state == TIPC_UNCONNECTED)) { res = -ENOTCONN; goto exit; } @@ -1684,17 +1687,22 @@ static bool filter_connect(struct tipc_sock *tsk, struct sk_buff *skb) msg_set_dest_droppable(hdr, 1); return false; - case SS_UNCONNECTED: + case SS_DISCONNECTING: + break; + } + switch (sk->sk_state) { + case TIPC_UNCONNECTED: + break; + case TIPC_LISTEN: /* Accept only SYN message */ if (!msg_connected(hdr) && !(msg_errcode(hdr))) return true; break; - case SS_DISCONNECTING: - break; default: - pr_err("Unknown socket state %u\n", sock->state); + pr_err("Unknown sk_state %u\n", sk->sk_state); } + return false; } @@ -2003,8 +2011,9 @@ static int tipc_connect(struct socket *sock, struct sockaddr *dest, } previous = sock->state; - switch (sock->state) { - case SS_UNCONNECTED: + + switch (sk->sk_state) { + case TIPC_UNCONNECTED: /* Send a 'SYN-' to destination */ m.msg_name = dest; m.msg_namelen = destlen; @@ -2024,6 +2033,10 @@ static int tipc_connect(struct socket *sock, struct sockaddr *dest, * case is EINPROGRESS, rather than EALREADY. */ res = -EINPROGRESS; + break; + } + + switch (sock->state) { case SS_CONNECTING: if (previous == SS_CONNECTING) res = -EALREADY; -- 2.1.4 ------------------------------------------------------------------------------ What NetFlow Analyzer can do for you? Monitors network bandwidth and traffic patterns at an interface-level. Reveals which users, apps, and protocols are consuming the most bandwidth. Provides multi-vendor support for NetFlow, J-Flow, sFlow and other flows. Make informed decisions using capacity planning reports. http://sdm.link/zohodev2dev _______________________________________________ tipc-discussion mailing list tipc-discussion@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/tipc-discussion