|
@@ -36,7 +36,7 @@
|
|
|
* not support simultaneous connects (two "client" sockets connecting).
|
|
|
*
|
|
|
* - "Server" sockets are referred to as listener sockets throughout this
|
|
|
- * implementation because they are in the VSOCK_SS_LISTEN state. When a
|
|
|
+ * implementation because they are in the TCP_LISTEN state. When a
|
|
|
* connection request is received (the second kind of socket mentioned above),
|
|
|
* we create a new socket and refer to it as a pending socket. These pending
|
|
|
* sockets are placed on the pending connection list of the listener socket.
|
|
@@ -82,6 +82,15 @@
|
|
|
* argument, we must ensure the reference count is increased to ensure the
|
|
|
* socket isn't freed before the function is run; the deferred function will
|
|
|
* then drop the reference.
|
|
|
+ *
|
|
|
+ * - sk->sk_state uses the TCP state constants because they are widely used by
|
|
|
+ * other address families and exposed to userspace tools like ss(8):
|
|
|
+ *
|
|
|
+ * TCP_CLOSE - unconnected
|
|
|
+ * TCP_SYN_SENT - connecting
|
|
|
+ * TCP_ESTABLISHED - connected
|
|
|
+ * TCP_CLOSING - disconnecting
|
|
|
+ * TCP_LISTEN - listening
|
|
|
*/
|
|
|
|
|
|
#include <linux/types.h>
|
|
@@ -477,7 +486,7 @@ void vsock_pending_work(struct work_struct *work)
|
|
|
if (vsock_in_connected_table(vsk))
|
|
|
vsock_remove_connected(vsk);
|
|
|
|
|
|
- sk->sk_state = SS_FREE;
|
|
|
+ sk->sk_state = TCP_CLOSE;
|
|
|
|
|
|
out:
|
|
|
release_sock(sk);
|
|
@@ -617,7 +626,6 @@ struct sock *__vsock_create(struct net *net,
|
|
|
|
|
|
sk->sk_destruct = vsock_sk_destruct;
|
|
|
sk->sk_backlog_rcv = vsock_queue_rcv_skb;
|
|
|
- sk->sk_state = 0;
|
|
|
sock_reset_flag(sk, SOCK_DONE);
|
|
|
|
|
|
INIT_LIST_HEAD(&vsk->bound_table);
|
|
@@ -891,7 +899,7 @@ static unsigned int vsock_poll(struct file *file, struct socket *sock,
|
|
|
/* Listening sockets that have connections in their accept
|
|
|
* queue can be read.
|
|
|
*/
|
|
|
- if (sk->sk_state == VSOCK_SS_LISTEN
|
|
|
+ if (sk->sk_state == TCP_LISTEN
|
|
|
&& !vsock_is_accept_queue_empty(sk))
|
|
|
mask |= POLLIN | POLLRDNORM;
|
|
|
|
|
@@ -920,7 +928,7 @@ static unsigned int vsock_poll(struct file *file, struct socket *sock,
|
|
|
}
|
|
|
|
|
|
/* Connected sockets that can produce data can be written. */
|
|
|
- if (sk->sk_state == SS_CONNECTED) {
|
|
|
+ if (sk->sk_state == TCP_ESTABLISHED) {
|
|
|
if (!(sk->sk_shutdown & SEND_SHUTDOWN)) {
|
|
|
bool space_avail_now = false;
|
|
|
int ret = transport->notify_poll_out(
|
|
@@ -942,7 +950,7 @@ static unsigned int vsock_poll(struct file *file, struct socket *sock,
|
|
|
* POLLOUT|POLLWRNORM when peer is closed and nothing to read,
|
|
|
* but local send is not shutdown.
|
|
|
*/
|
|
|
- if (sk->sk_state == SS_UNCONNECTED) {
|
|
|
+ if (sk->sk_state == TCP_CLOSE) {
|
|
|
if (!(sk->sk_shutdown & SEND_SHUTDOWN))
|
|
|
mask |= POLLOUT | POLLWRNORM;
|
|
|
|
|
@@ -1112,9 +1120,9 @@ static void vsock_connect_timeout(struct work_struct *work)
|
|
|
sk = sk_vsock(vsk);
|
|
|
|
|
|
lock_sock(sk);
|
|
|
- if (sk->sk_state == SS_CONNECTING &&
|
|
|
+ if (sk->sk_state == TCP_SYN_SENT &&
|
|
|
(sk->sk_shutdown != SHUTDOWN_MASK)) {
|
|
|
- sk->sk_state = SS_UNCONNECTED;
|
|
|
+ sk->sk_state = TCP_CLOSE;
|
|
|
sk->sk_err = ETIMEDOUT;
|
|
|
sk->sk_error_report(sk);
|
|
|
cancel = 1;
|
|
@@ -1160,7 +1168,7 @@ static int vsock_stream_connect(struct socket *sock, struct sockaddr *addr,
|
|
|
err = -EALREADY;
|
|
|
break;
|
|
|
default:
|
|
|
- if ((sk->sk_state == VSOCK_SS_LISTEN) ||
|
|
|
+ if ((sk->sk_state == TCP_LISTEN) ||
|
|
|
vsock_addr_cast(addr, addr_len, &remote_addr) != 0) {
|
|
|
err = -EINVAL;
|
|
|
goto out;
|
|
@@ -1183,7 +1191,7 @@ static int vsock_stream_connect(struct socket *sock, struct sockaddr *addr,
|
|
|
if (err)
|
|
|
goto out;
|
|
|
|
|
|
- sk->sk_state = SS_CONNECTING;
|
|
|
+ sk->sk_state = TCP_SYN_SENT;
|
|
|
|
|
|
err = transport->connect(vsk);
|
|
|
if (err < 0)
|
|
@@ -1203,7 +1211,7 @@ static int vsock_stream_connect(struct socket *sock, struct sockaddr *addr,
|
|
|
timeout = vsk->connect_timeout;
|
|
|
prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE);
|
|
|
|
|
|
- while (sk->sk_state != SS_CONNECTED && sk->sk_err == 0) {
|
|
|
+ while (sk->sk_state != TCP_ESTABLISHED && sk->sk_err == 0) {
|
|
|
if (flags & O_NONBLOCK) {
|
|
|
/* If we're not going to block, we schedule a timeout
|
|
|
* function to generate a timeout on the connection
|
|
@@ -1226,13 +1234,13 @@ static int vsock_stream_connect(struct socket *sock, struct sockaddr *addr,
|
|
|
|
|
|
if (signal_pending(current)) {
|
|
|
err = sock_intr_errno(timeout);
|
|
|
- sk->sk_state = SS_UNCONNECTED;
|
|
|
+ sk->sk_state = TCP_CLOSE;
|
|
|
sock->state = SS_UNCONNECTED;
|
|
|
vsock_transport_cancel_pkt(vsk);
|
|
|
goto out_wait;
|
|
|
} else if (timeout == 0) {
|
|
|
err = -ETIMEDOUT;
|
|
|
- sk->sk_state = SS_UNCONNECTED;
|
|
|
+ sk->sk_state = TCP_CLOSE;
|
|
|
sock->state = SS_UNCONNECTED;
|
|
|
vsock_transport_cancel_pkt(vsk);
|
|
|
goto out_wait;
|
|
@@ -1243,7 +1251,7 @@ static int vsock_stream_connect(struct socket *sock, struct sockaddr *addr,
|
|
|
|
|
|
if (sk->sk_err) {
|
|
|
err = -sk->sk_err;
|
|
|
- sk->sk_state = SS_UNCONNECTED;
|
|
|
+ sk->sk_state = TCP_CLOSE;
|
|
|
sock->state = SS_UNCONNECTED;
|
|
|
} else {
|
|
|
err = 0;
|
|
@@ -1276,7 +1284,7 @@ static int vsock_accept(struct socket *sock, struct socket *newsock, int flags,
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
- if (listener->sk_state != VSOCK_SS_LISTEN) {
|
|
|
+ if (listener->sk_state != TCP_LISTEN) {
|
|
|
err = -EINVAL;
|
|
|
goto out;
|
|
|
}
|
|
@@ -1366,7 +1374,7 @@ static int vsock_listen(struct socket *sock, int backlog)
|
|
|
}
|
|
|
|
|
|
sk->sk_max_ack_backlog = backlog;
|
|
|
- sk->sk_state = VSOCK_SS_LISTEN;
|
|
|
+ sk->sk_state = TCP_LISTEN;
|
|
|
|
|
|
err = 0;
|
|
|
|
|
@@ -1546,7 +1554,7 @@ static int vsock_stream_sendmsg(struct socket *sock, struct msghdr *msg,
|
|
|
|
|
|
/* Callers should not provide a destination with stream sockets. */
|
|
|
if (msg->msg_namelen) {
|
|
|
- err = sk->sk_state == SS_CONNECTED ? -EISCONN : -EOPNOTSUPP;
|
|
|
+ err = sk->sk_state == TCP_ESTABLISHED ? -EISCONN : -EOPNOTSUPP;
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
@@ -1557,7 +1565,7 @@ static int vsock_stream_sendmsg(struct socket *sock, struct msghdr *msg,
|
|
|
goto out;
|
|
|
}
|
|
|
|
|
|
- if (sk->sk_state != SS_CONNECTED ||
|
|
|
+ if (sk->sk_state != TCP_ESTABLISHED ||
|
|
|
!vsock_addr_bound(&vsk->local_addr)) {
|
|
|
err = -ENOTCONN;
|
|
|
goto out;
|
|
@@ -1681,7 +1689,7 @@ vsock_stream_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
|
|
|
|
|
|
lock_sock(sk);
|
|
|
|
|
|
- if (sk->sk_state != SS_CONNECTED) {
|
|
|
+ if (sk->sk_state != TCP_ESTABLISHED) {
|
|
|
/* Recvmsg is supposed to return 0 if a peer performs an
|
|
|
* orderly shutdown. Differentiate between that case and when a
|
|
|
* peer has not connected or a local shutdown occured with the
|