Commit c752023a authored by Parthasarathy Bhuvaragan's avatar Parthasarathy Bhuvaragan Committed by David S. Miller

tipc: remove socket state SS_READY

Until now, tipc socket state SS_READY declares that the socket is a
connectionless socket.

In this commit, we remove the state SS_READY and replace it with a
condition which returns true for datagram / connectionless sockets.
Acked-by: default avatarYing Xue <ying.xue@windriver.com>
Acked-by: default avatarJon Maloy <jon.maloy@ericsson.com>
Signed-off-by: default avatarParthasarathy Bhuvaragan <parthasarathy.bhuvaragan@ericsson.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 360aab6b
...@@ -45,7 +45,6 @@ ...@@ -45,7 +45,6 @@
#include "netlink.h" #include "netlink.h"
#define SS_LISTENING -1 /* socket is listening */ #define SS_LISTENING -1 /* socket is listening */
#define SS_READY -2 /* socket is connectionless */
#define CONN_TIMEOUT_DEFAULT 8000 /* default connect timeout = 8s */ #define CONN_TIMEOUT_DEFAULT 8000 /* default connect timeout = 8s */
#define CONN_PROBING_INTERVAL msecs_to_jiffies(3600000) /* [ms] => 1 h */ #define CONN_PROBING_INTERVAL msecs_to_jiffies(3600000) /* [ms] => 1 h */
...@@ -294,6 +293,16 @@ static bool tipc_sk_connected(struct sock *sk) ...@@ -294,6 +293,16 @@ static bool tipc_sk_connected(struct sock *sk)
return sk->sk_socket->state == SS_CONNECTED; return sk->sk_socket->state == SS_CONNECTED;
} }
/* tipc_sk_type_connectionless - check if the socket is datagram socket
* @sk: socket
*
* Returns true if connection less, false otherwise
*/
static bool tipc_sk_type_connectionless(struct sock *sk)
{
return sk->sk_type == SOCK_RDM || sk->sk_type == SOCK_DGRAM;
}
/* tsk_peer_msg - verify if message was sent by connected port's peer /* tsk_peer_msg - verify if message was sent by connected port's peer
* *
* Handles cases where the node's network address has changed from * Handles cases where the node's network address has changed from
...@@ -345,7 +354,6 @@ static int tipc_sk_create(struct net *net, struct socket *sock, ...@@ -345,7 +354,6 @@ static int tipc_sk_create(struct net *net, struct socket *sock,
{ {
struct tipc_net *tn; struct tipc_net *tn;
const struct proto_ops *ops; const struct proto_ops *ops;
socket_state state;
struct sock *sk; struct sock *sk;
struct tipc_sock *tsk; struct tipc_sock *tsk;
struct tipc_msg *msg; struct tipc_msg *msg;
...@@ -357,16 +365,13 @@ static int tipc_sk_create(struct net *net, struct socket *sock, ...@@ -357,16 +365,13 @@ static int tipc_sk_create(struct net *net, struct socket *sock,
switch (sock->type) { switch (sock->type) {
case SOCK_STREAM: case SOCK_STREAM:
ops = &stream_ops; ops = &stream_ops;
state = SS_UNCONNECTED;
break; break;
case SOCK_SEQPACKET: case SOCK_SEQPACKET:
ops = &packet_ops; ops = &packet_ops;
state = SS_UNCONNECTED;
break; break;
case SOCK_DGRAM: case SOCK_DGRAM:
case SOCK_RDM: case SOCK_RDM:
ops = &msg_ops; ops = &msg_ops;
state = SS_READY;
break; break;
default: default:
return -EPROTOTYPE; return -EPROTOTYPE;
...@@ -387,7 +392,7 @@ static int tipc_sk_create(struct net *net, struct socket *sock, ...@@ -387,7 +392,7 @@ static int tipc_sk_create(struct net *net, struct socket *sock,
/* Finish initializing socket data structures */ /* Finish initializing socket data structures */
sock->ops = ops; sock->ops = ops;
sock->state = state; sock->state = SS_UNCONNECTED;
sock_init_data(sock, sk); sock_init_data(sock, sk);
if (tipc_sk_insert(tsk)) { if (tipc_sk_insert(tsk)) {
pr_warn("Socket create failed; port number exhausted\n"); pr_warn("Socket create failed; port number exhausted\n");
...@@ -407,7 +412,7 @@ static int tipc_sk_create(struct net *net, struct socket *sock, ...@@ -407,7 +412,7 @@ static int tipc_sk_create(struct net *net, struct socket *sock,
tsk->snd_win = tsk_adv_blocks(RCVBUF_MIN); tsk->snd_win = tsk_adv_blocks(RCVBUF_MIN);
tsk->rcv_win = tsk->snd_win; tsk->rcv_win = tsk->snd_win;
if (sock->state == SS_READY) { if (tipc_sk_type_connectionless(sk)) {
tsk_set_unreturnable(tsk, true); tsk_set_unreturnable(tsk, true);
if (sock->type == SOCK_DGRAM) if (sock->type == SOCK_DGRAM)
tsk_set_unreliable(tsk, true); tsk_set_unreliable(tsk, true);
...@@ -651,12 +656,19 @@ static unsigned int tipc_poll(struct file *file, struct socket *sock, ...@@ -651,12 +656,19 @@ static unsigned int tipc_poll(struct file *file, struct socket *sock,
sock_poll_wait(file, sk_sleep(sk), wait); sock_poll_wait(file, sk_sleep(sk), wait);
if (tipc_sk_type_connectionless(sk)) {
if (!tsk->link_cong)
mask |= POLLOUT;
if (!skb_queue_empty(&sk->sk_receive_queue))
mask |= (POLLIN | POLLRDNORM);
return mask;
}
switch ((int)sock->state) { switch ((int)sock->state) {
case SS_UNCONNECTED: case SS_UNCONNECTED:
if (!tsk->link_cong) if (!tsk->link_cong)
mask |= POLLOUT; mask |= POLLOUT;
break; break;
case SS_READY:
case SS_CONNECTED: case SS_CONNECTED:
if (!tsk->link_cong && !tsk_conn_cong(tsk)) if (!tsk->link_cong && !tsk_conn_cong(tsk))
mask |= POLLOUT; mask |= POLLOUT;
...@@ -893,6 +905,7 @@ static int __tipc_sendmsg(struct socket *sock, struct msghdr *m, size_t dsz) ...@@ -893,6 +905,7 @@ static int __tipc_sendmsg(struct socket *sock, struct msghdr *m, size_t dsz)
struct tipc_msg *mhdr = &tsk->phdr; struct tipc_msg *mhdr = &tsk->phdr;
u32 dnode, dport; u32 dnode, dport;
struct sk_buff_head pktchain; struct sk_buff_head pktchain;
bool is_connectionless = tipc_sk_type_connectionless(sk);
struct sk_buff *skb; struct sk_buff *skb;
struct tipc_name_seq *seq; struct tipc_name_seq *seq;
struct iov_iter save; struct iov_iter save;
...@@ -903,7 +916,7 @@ static int __tipc_sendmsg(struct socket *sock, struct msghdr *m, size_t dsz) ...@@ -903,7 +916,7 @@ static int __tipc_sendmsg(struct socket *sock, struct msghdr *m, size_t dsz)
if (dsz > TIPC_MAX_USER_MSG_SIZE) if (dsz > TIPC_MAX_USER_MSG_SIZE)
return -EMSGSIZE; return -EMSGSIZE;
if (unlikely(!dest)) { if (unlikely(!dest)) {
if (sock->state == SS_READY && tsk->peer.family == AF_TIPC) if (is_connectionless && tsk->peer.family == AF_TIPC)
dest = &tsk->peer; dest = &tsk->peer;
else else
return -EDESTADDRREQ; return -EDESTADDRREQ;
...@@ -911,7 +924,7 @@ static int __tipc_sendmsg(struct socket *sock, struct msghdr *m, size_t dsz) ...@@ -911,7 +924,7 @@ static int __tipc_sendmsg(struct socket *sock, struct msghdr *m, size_t dsz)
dest->family != AF_TIPC) { dest->family != AF_TIPC) {
return -EINVAL; return -EINVAL;
} }
if (unlikely(sock->state != SS_READY)) { if (!is_connectionless) {
if (sock->state == SS_LISTENING) if (sock->state == SS_LISTENING)
return -EPIPE; return -EPIPE;
if (sock->state != SS_UNCONNECTED) if (sock->state != SS_UNCONNECTED)
...@@ -966,7 +979,7 @@ static int __tipc_sendmsg(struct socket *sock, struct msghdr *m, size_t dsz) ...@@ -966,7 +979,7 @@ static int __tipc_sendmsg(struct socket *sock, struct msghdr *m, size_t dsz)
TIPC_SKB_CB(skb)->wakeup_pending = tsk->link_cong; TIPC_SKB_CB(skb)->wakeup_pending = tsk->link_cong;
rc = tipc_node_xmit(net, &pktchain, dnode, tsk->portid); rc = tipc_node_xmit(net, &pktchain, dnode, tsk->portid);
if (likely(!rc)) { if (likely(!rc)) {
if (sock->state != SS_READY) if (!is_connectionless)
sock->state = SS_CONNECTING; sock->state = SS_CONNECTING;
return dsz; return dsz;
} }
...@@ -1337,6 +1350,7 @@ static int tipc_recvmsg(struct socket *sock, struct msghdr *m, size_t buf_len, ...@@ -1337,6 +1350,7 @@ static int tipc_recvmsg(struct socket *sock, struct msghdr *m, size_t buf_len,
struct tipc_sock *tsk = tipc_sk(sk); struct tipc_sock *tsk = tipc_sk(sk);
struct sk_buff *buf; struct sk_buff *buf;
struct tipc_msg *msg; struct tipc_msg *msg;
bool is_connectionless = tipc_sk_type_connectionless(sk);
long timeo; long timeo;
unsigned int sz; unsigned int sz;
u32 err; u32 err;
...@@ -1348,7 +1362,7 @@ static int tipc_recvmsg(struct socket *sock, struct msghdr *m, size_t buf_len, ...@@ -1348,7 +1362,7 @@ static int tipc_recvmsg(struct socket *sock, struct msghdr *m, size_t buf_len,
lock_sock(sk); lock_sock(sk);
if (unlikely(sock->state == SS_UNCONNECTED)) { if (!is_connectionless && unlikely(sock->state == SS_UNCONNECTED)) {
res = -ENOTCONN; res = -ENOTCONN;
goto exit; goto exit;
} }
...@@ -1393,8 +1407,8 @@ static int tipc_recvmsg(struct socket *sock, struct msghdr *m, size_t buf_len, ...@@ -1393,8 +1407,8 @@ static int tipc_recvmsg(struct socket *sock, struct msghdr *m, size_t buf_len,
goto exit; goto exit;
res = sz; res = sz;
} else { } else {
if ((sock->state == SS_READY) || if (is_connectionless || err == TIPC_CONN_SHUTDOWN ||
((err == TIPC_CONN_SHUTDOWN) || m->msg_control)) m->msg_control)
res = 0; res = 0;
else else
res = -ECONNRESET; res = -ECONNRESET;
...@@ -1403,7 +1417,7 @@ static int tipc_recvmsg(struct socket *sock, struct msghdr *m, size_t buf_len, ...@@ -1403,7 +1417,7 @@ static int tipc_recvmsg(struct socket *sock, struct msghdr *m, size_t buf_len,
if (unlikely(flags & MSG_PEEK)) if (unlikely(flags & MSG_PEEK))
goto exit; goto exit;
if (likely(sock->state != SS_READY)) { if (likely(!is_connectionless)) {
tsk->rcv_unacked += tsk_inc(tsk, hlen + sz); tsk->rcv_unacked += tsk_inc(tsk, hlen + sz);
if (unlikely(tsk->rcv_unacked >= (tsk->rcv_win / 4))) if (unlikely(tsk->rcv_unacked >= (tsk->rcv_win / 4)))
tipc_sk_send_ack(tsk); tipc_sk_send_ack(tsk);
...@@ -1699,7 +1713,6 @@ static unsigned int rcvbuf_limit(struct sock *sk, struct sk_buff *skb) ...@@ -1699,7 +1713,6 @@ static unsigned int rcvbuf_limit(struct sock *sk, struct sk_buff *skb)
static bool filter_rcv(struct sock *sk, struct sk_buff *skb, static bool filter_rcv(struct sock *sk, struct sk_buff *skb,
struct sk_buff_head *xmitq) struct sk_buff_head *xmitq)
{ {
struct socket *sock = sk->sk_socket;
struct tipc_sock *tsk = tipc_sk(sk); struct tipc_sock *tsk = tipc_sk(sk);
struct tipc_msg *hdr = buf_msg(skb); struct tipc_msg *hdr = buf_msg(skb);
unsigned int limit = rcvbuf_limit(sk, skb); unsigned int limit = rcvbuf_limit(sk, skb);
...@@ -1725,7 +1738,7 @@ static bool filter_rcv(struct sock *sk, struct sk_buff *skb, ...@@ -1725,7 +1738,7 @@ static bool filter_rcv(struct sock *sk, struct sk_buff *skb,
} }
/* Reject if wrong message type for current socket state */ /* Reject if wrong message type for current socket state */
if (unlikely(sock->state == SS_READY)) { if (tipc_sk_type_connectionless(sk)) {
if (msg_connected(hdr)) { if (msg_connected(hdr)) {
err = TIPC_ERR_NO_PORT; err = TIPC_ERR_NO_PORT;
goto reject; goto reject;
...@@ -1935,7 +1948,7 @@ static int tipc_connect(struct socket *sock, struct sockaddr *dest, ...@@ -1935,7 +1948,7 @@ static int tipc_connect(struct socket *sock, struct sockaddr *dest,
lock_sock(sk); lock_sock(sk);
/* DGRAM/RDM connect(), just save the destaddr */ /* DGRAM/RDM connect(), just save the destaddr */
if (sock->state == SS_READY) { if (tipc_sk_type_connectionless(sk)) {
if (dst->family == AF_UNSPEC) { if (dst->family == AF_UNSPEC) {
memset(&tsk->peer, 0, sizeof(struct sockaddr_tipc)); memset(&tsk->peer, 0, sizeof(struct sockaddr_tipc));
} else if (destlen != sizeof(struct sockaddr_tipc)) { } else if (destlen != sizeof(struct sockaddr_tipc)) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment