diff options
author | Stefan Hajnoczi <stefanha@redhat.com> | 2017-10-05 16:46:52 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-10-05 21:44:17 -0400 |
commit | 3b4477d2dcf2709d0be89e2a8dced3d0f4a017f2 (patch) | |
tree | eb48feadc95fd95ac671a19f0095621781dc8b69 | |
parent | bf359b8127719535f88494adb3c2b73c06667dcd (diff) |
VSOCK: use TCP state constants for sk_state
There are two state fields: socket->state and sock->sk_state. The
socket->state field uses SS_UNCONNECTED, SS_CONNECTED, etc while the
sock->sk_state typically uses values that match TCP state constants
(TCP_CLOSE, TCP_ESTABLISHED). AF_VSOCK does not follow this convention
and instead uses SS_* constants for both fields.
The sk_state field will be exposed to userspace through the vsock_diag
interface for ss(8), netstat(8), and other programs.
This patch switches sk_state to TCP state constants so that the meaning
of this field is consistent with other address families. Not just
AF_INET and AF_INET6 use the TCP constants, AF_UNIX and others do too.
The following mapping was used to convert the code:
SS_FREE -> TCP_CLOSE
SS_UNCONNECTED -> TCP_CLOSE
SS_CONNECTING -> TCP_SYN_SENT
SS_CONNECTED -> TCP_ESTABLISHED
SS_DISCONNECTING -> TCP_CLOSING
VSOCK_SS_LISTEN -> TCP_LISTEN
In __vsock_create() the sk_state initialization was dropped because
sock_init_data() already initializes sk_state to TCP_CLOSE.
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | include/net/af_vsock.h | 3 | ||||
-rw-r--r-- | net/vmw_vsock/af_vsock.c | 46 | ||||
-rw-r--r-- | net/vmw_vsock/hyperv_transport.c | 12 | ||||
-rw-r--r-- | net/vmw_vsock/virtio_transport.c | 2 | ||||
-rw-r--r-- | net/vmw_vsock/virtio_transport_common.c | 22 | ||||
-rw-r--r-- | net/vmw_vsock/vmci_transport.c | 34 | ||||
-rw-r--r-- | net/vmw_vsock/vmci_transport_notify.c | 2 | ||||
-rw-r--r-- | net/vmw_vsock/vmci_transport_notify_qstate.c | 2 |
8 files changed, 64 insertions, 59 deletions
diff --git a/include/net/af_vsock.h b/include/net/af_vsock.h index 3dd217718a2f..9324ac2d9ff2 100644 --- a/include/net/af_vsock.h +++ b/include/net/af_vsock.h | |||
@@ -22,9 +22,6 @@ | |||
22 | 22 | ||
23 | #include "vsock_addr.h" | 23 | #include "vsock_addr.h" |
24 | 24 | ||
25 | /* vsock-specific sock->sk_state constants */ | ||
26 | #define VSOCK_SS_LISTEN 255 | ||
27 | |||
28 | #define LAST_RESERVED_PORT 1023 | 25 | #define LAST_RESERVED_PORT 1023 |
29 | 26 | ||
30 | #define VSOCK_HASH_SIZE 251 | 27 | #define VSOCK_HASH_SIZE 251 |
diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c index 9b179a0081b3..98359c19522f 100644 --- a/net/vmw_vsock/af_vsock.c +++ b/net/vmw_vsock/af_vsock.c | |||
@@ -36,7 +36,7 @@ | |||
36 | * not support simultaneous connects (two "client" sockets connecting). | 36 | * not support simultaneous connects (two "client" sockets connecting). |
37 | * | 37 | * |
38 | * - "Server" sockets are referred to as listener sockets throughout this | 38 | * - "Server" sockets are referred to as listener sockets throughout this |
39 | * implementation because they are in the VSOCK_SS_LISTEN state. When a | 39 | * implementation because they are in the TCP_LISTEN state. When a |
40 | * connection request is received (the second kind of socket mentioned above), | 40 | * connection request is received (the second kind of socket mentioned above), |
41 | * we create a new socket and refer to it as a pending socket. These pending | 41 | * we create a new socket and refer to it as a pending socket. These pending |
42 | * sockets are placed on the pending connection list of the listener socket. | 42 | * sockets are placed on the pending connection list of the listener socket. |
@@ -82,6 +82,15 @@ | |||
82 | * argument, we must ensure the reference count is increased to ensure the | 82 | * argument, we must ensure the reference count is increased to ensure the |
83 | * socket isn't freed before the function is run; the deferred function will | 83 | * socket isn't freed before the function is run; the deferred function will |
84 | * then drop the reference. | 84 | * then drop the reference. |
85 | * | ||
86 | * - sk->sk_state uses the TCP state constants because they are widely used by | ||
87 | * other address families and exposed to userspace tools like ss(8): | ||
88 | * | ||
89 | * TCP_CLOSE - unconnected | ||
90 | * TCP_SYN_SENT - connecting | ||
91 | * TCP_ESTABLISHED - connected | ||
92 | * TCP_CLOSING - disconnecting | ||
93 | * TCP_LISTEN - listening | ||
85 | */ | 94 | */ |
86 | 95 | ||
87 | #include <linux/types.h> | 96 | #include <linux/types.h> |
@@ -477,7 +486,7 @@ void vsock_pending_work(struct work_struct *work) | |||
477 | if (vsock_in_connected_table(vsk)) | 486 | if (vsock_in_connected_table(vsk)) |
478 | vsock_remove_connected(vsk); | 487 | vsock_remove_connected(vsk); |
479 | 488 | ||
480 | sk->sk_state = SS_FREE; | 489 | sk->sk_state = TCP_CLOSE; |
481 | 490 | ||
482 | out: | 491 | out: |
483 | release_sock(sk); | 492 | release_sock(sk); |
@@ -617,7 +626,6 @@ struct sock *__vsock_create(struct net *net, | |||
617 | 626 | ||
618 | sk->sk_destruct = vsock_sk_destruct; | 627 | sk->sk_destruct = vsock_sk_destruct; |
619 | sk->sk_backlog_rcv = vsock_queue_rcv_skb; | 628 | sk->sk_backlog_rcv = vsock_queue_rcv_skb; |
620 | sk->sk_state = 0; | ||
621 | sock_reset_flag(sk, SOCK_DONE); | 629 | sock_reset_flag(sk, SOCK_DONE); |
622 | 630 | ||
623 | INIT_LIST_HEAD(&vsk->bound_table); | 631 | INIT_LIST_HEAD(&vsk->bound_table); |
@@ -891,7 +899,7 @@ static unsigned int vsock_poll(struct file *file, struct socket *sock, | |||
891 | /* Listening sockets that have connections in their accept | 899 | /* Listening sockets that have connections in their accept |
892 | * queue can be read. | 900 | * queue can be read. |
893 | */ | 901 | */ |
894 | if (sk->sk_state == VSOCK_SS_LISTEN | 902 | if (sk->sk_state == TCP_LISTEN |
895 | && !vsock_is_accept_queue_empty(sk)) | 903 | && !vsock_is_accept_queue_empty(sk)) |
896 | mask |= POLLIN | POLLRDNORM; | 904 | mask |= POLLIN | POLLRDNORM; |
897 | 905 | ||
@@ -920,7 +928,7 @@ static unsigned int vsock_poll(struct file *file, struct socket *sock, | |||
920 | } | 928 | } |
921 | 929 | ||
922 | /* Connected sockets that can produce data can be written. */ | 930 | /* Connected sockets that can produce data can be written. */ |
923 | if (sk->sk_state == SS_CONNECTED) { | 931 | if (sk->sk_state == TCP_ESTABLISHED) { |
924 | if (!(sk->sk_shutdown & SEND_SHUTDOWN)) { | 932 | if (!(sk->sk_shutdown & SEND_SHUTDOWN)) { |
925 | bool space_avail_now = false; | 933 | bool space_avail_now = false; |
926 | int ret = transport->notify_poll_out( | 934 | int ret = transport->notify_poll_out( |
@@ -942,7 +950,7 @@ static unsigned int vsock_poll(struct file *file, struct socket *sock, | |||
942 | * POLLOUT|POLLWRNORM when peer is closed and nothing to read, | 950 | * POLLOUT|POLLWRNORM when peer is closed and nothing to read, |
943 | * but local send is not shutdown. | 951 | * but local send is not shutdown. |
944 | */ | 952 | */ |
945 | if (sk->sk_state == SS_UNCONNECTED) { | 953 | if (sk->sk_state == TCP_CLOSE) { |
946 | if (!(sk->sk_shutdown & SEND_SHUTDOWN)) | 954 | if (!(sk->sk_shutdown & SEND_SHUTDOWN)) |
947 | mask |= POLLOUT | POLLWRNORM; | 955 | mask |= POLLOUT | POLLWRNORM; |
948 | 956 | ||
@@ -1112,9 +1120,9 @@ static void vsock_connect_timeout(struct work_struct *work) | |||
1112 | sk = sk_vsock(vsk); | 1120 | sk = sk_vsock(vsk); |
1113 | 1121 | ||
1114 | lock_sock(sk); | 1122 | lock_sock(sk); |
1115 | if (sk->sk_state == SS_CONNECTING && | 1123 | if (sk->sk_state == TCP_SYN_SENT && |
1116 | (sk->sk_shutdown != SHUTDOWN_MASK)) { | 1124 | (sk->sk_shutdown != SHUTDOWN_MASK)) { |
1117 | sk->sk_state = SS_UNCONNECTED; | 1125 | sk->sk_state = TCP_CLOSE; |
1118 | sk->sk_err = ETIMEDOUT; | 1126 | sk->sk_err = ETIMEDOUT; |
1119 | sk->sk_error_report(sk); | 1127 | sk->sk_error_report(sk); |
1120 | cancel = 1; | 1128 | cancel = 1; |
@@ -1160,7 +1168,7 @@ static int vsock_stream_connect(struct socket *sock, struct sockaddr *addr, | |||
1160 | err = -EALREADY; | 1168 | err = -EALREADY; |
1161 | break; | 1169 | break; |
1162 | default: | 1170 | default: |
1163 | if ((sk->sk_state == VSOCK_SS_LISTEN) || | 1171 | if ((sk->sk_state == TCP_LISTEN) || |
1164 | vsock_addr_cast(addr, addr_len, &remote_addr) != 0) { | 1172 | vsock_addr_cast(addr, addr_len, &remote_addr) != 0) { |
1165 | err = -EINVAL; | 1173 | err = -EINVAL; |
1166 | goto out; | 1174 | goto out; |
@@ -1183,7 +1191,7 @@ static int vsock_stream_connect(struct socket *sock, struct sockaddr *addr, | |||
1183 | if (err) | 1191 | if (err) |
1184 | goto out; | 1192 | goto out; |
1185 | 1193 | ||
1186 | sk->sk_state = SS_CONNECTING; | 1194 | sk->sk_state = TCP_SYN_SENT; |
1187 | 1195 | ||
1188 | err = transport->connect(vsk); | 1196 | err = transport->connect(vsk); |
1189 | if (err < 0) | 1197 | if (err < 0) |
@@ -1203,7 +1211,7 @@ static int vsock_stream_connect(struct socket *sock, struct sockaddr *addr, | |||
1203 | timeout = vsk->connect_timeout; | 1211 | timeout = vsk->connect_timeout; |
1204 | prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE); | 1212 | prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE); |
1205 | 1213 | ||
1206 | while (sk->sk_state != SS_CONNECTED && sk->sk_err == 0) { | 1214 | while (sk->sk_state != TCP_ESTABLISHED && sk->sk_err == 0) { |
1207 | if (flags & O_NONBLOCK) { | 1215 | if (flags & O_NONBLOCK) { |
1208 | /* If we're not going to block, we schedule a timeout | 1216 | /* If we're not going to block, we schedule a timeout |
1209 | * function to generate a timeout on the connection | 1217 | * function to generate a timeout on the connection |
@@ -1226,13 +1234,13 @@ static int vsock_stream_connect(struct socket *sock, struct sockaddr *addr, | |||
1226 | 1234 | ||
1227 | if (signal_pending(current)) { | 1235 | if (signal_pending(current)) { |
1228 | err = sock_intr_errno(timeout); | 1236 | err = sock_intr_errno(timeout); |
1229 | sk->sk_state = SS_UNCONNECTED; | 1237 | sk->sk_state = TCP_CLOSE; |
1230 | sock->state = SS_UNCONNECTED; | 1238 | sock->state = SS_UNCONNECTED; |
1231 | vsock_transport_cancel_pkt(vsk); | 1239 | vsock_transport_cancel_pkt(vsk); |
1232 | goto out_wait; | 1240 | goto out_wait; |
1233 | } else if (timeout == 0) { | 1241 | } else if (timeout == 0) { |
1234 | err = -ETIMEDOUT; | 1242 | err = -ETIMEDOUT; |
1235 | sk->sk_state = SS_UNCONNECTED; | 1243 | sk->sk_state = TCP_CLOSE; |
1236 | sock->state = SS_UNCONNECTED; | 1244 | sock->state = SS_UNCONNECTED; |
1237 | vsock_transport_cancel_pkt(vsk); | 1245 | vsock_transport_cancel_pkt(vsk); |
1238 | goto out_wait; | 1246 | goto out_wait; |
@@ -1243,7 +1251,7 @@ static int vsock_stream_connect(struct socket *sock, struct sockaddr *addr, | |||
1243 | 1251 | ||
1244 | if (sk->sk_err) { | 1252 | if (sk->sk_err) { |
1245 | err = -sk->sk_err; | 1253 | err = -sk->sk_err; |
1246 | sk->sk_state = SS_UNCONNECTED; | 1254 | sk->sk_state = TCP_CLOSE; |
1247 | sock->state = SS_UNCONNECTED; | 1255 | sock->state = SS_UNCONNECTED; |
1248 | } else { | 1256 | } else { |
1249 | err = 0; | 1257 | err = 0; |
@@ -1276,7 +1284,7 @@ static int vsock_accept(struct socket *sock, struct socket *newsock, int flags, | |||
1276 | goto out; | 1284 | goto out; |
1277 | } | 1285 | } |
1278 | 1286 | ||
1279 | if (listener->sk_state != VSOCK_SS_LISTEN) { | 1287 | if (listener->sk_state != TCP_LISTEN) { |
1280 | err = -EINVAL; | 1288 | err = -EINVAL; |
1281 | goto out; | 1289 | goto out; |
1282 | } | 1290 | } |
@@ -1366,7 +1374,7 @@ static int vsock_listen(struct socket *sock, int backlog) | |||
1366 | } | 1374 | } |
1367 | 1375 | ||
1368 | sk->sk_max_ack_backlog = backlog; | 1376 | sk->sk_max_ack_backlog = backlog; |
1369 | sk->sk_state = VSOCK_SS_LISTEN; | 1377 | sk->sk_state = TCP_LISTEN; |
1370 | 1378 | ||
1371 | err = 0; | 1379 | err = 0; |
1372 | 1380 | ||
@@ -1546,7 +1554,7 @@ static int vsock_stream_sendmsg(struct socket *sock, struct msghdr *msg, | |||
1546 | 1554 | ||
1547 | /* Callers should not provide a destination with stream sockets. */ | 1555 | /* Callers should not provide a destination with stream sockets. */ |
1548 | if (msg->msg_namelen) { | 1556 | if (msg->msg_namelen) { |
1549 | err = sk->sk_state == SS_CONNECTED ? -EISCONN : -EOPNOTSUPP; | 1557 | err = sk->sk_state == TCP_ESTABLISHED ? -EISCONN : -EOPNOTSUPP; |
1550 | goto out; | 1558 | goto out; |
1551 | } | 1559 | } |
1552 | 1560 | ||
@@ -1557,7 +1565,7 @@ static int vsock_stream_sendmsg(struct socket *sock, struct msghdr *msg, | |||
1557 | goto out; | 1565 | goto out; |
1558 | } | 1566 | } |
1559 | 1567 | ||
1560 | if (sk->sk_state != SS_CONNECTED || | 1568 | if (sk->sk_state != TCP_ESTABLISHED || |
1561 | !vsock_addr_bound(&vsk->local_addr)) { | 1569 | !vsock_addr_bound(&vsk->local_addr)) { |
1562 | err = -ENOTCONN; | 1570 | err = -ENOTCONN; |
1563 | goto out; | 1571 | goto out; |
@@ -1681,7 +1689,7 @@ vsock_stream_recvmsg(struct socket *sock, struct msghdr *msg, size_t len, | |||
1681 | 1689 | ||
1682 | lock_sock(sk); | 1690 | lock_sock(sk); |
1683 | 1691 | ||
1684 | if (sk->sk_state != SS_CONNECTED) { | 1692 | if (sk->sk_state != TCP_ESTABLISHED) { |
1685 | /* Recvmsg is supposed to return 0 if a peer performs an | 1693 | /* Recvmsg is supposed to return 0 if a peer performs an |
1686 | * orderly shutdown. Differentiate between that case and when a | 1694 | * orderly shutdown. Differentiate between that case and when a |
1687 | * peer has not connected or a local shutdown occured with the | 1695 | * peer has not connected or a local shutdown occured with the |
diff --git a/net/vmw_vsock/hyperv_transport.c b/net/vmw_vsock/hyperv_transport.c index 14ed5a344cdf..bbac023e70d1 100644 --- a/net/vmw_vsock/hyperv_transport.c +++ b/net/vmw_vsock/hyperv_transport.c | |||
@@ -310,7 +310,7 @@ static void hvs_close_connection(struct vmbus_channel *chan) | |||
310 | struct sock *sk = get_per_channel_state(chan); | 310 | struct sock *sk = get_per_channel_state(chan); |
311 | struct vsock_sock *vsk = vsock_sk(sk); | 311 | struct vsock_sock *vsk = vsock_sk(sk); |
312 | 312 | ||
313 | sk->sk_state = SS_UNCONNECTED; | 313 | sk->sk_state = TCP_CLOSE; |
314 | sock_set_flag(sk, SOCK_DONE); | 314 | sock_set_flag(sk, SOCK_DONE); |
315 | vsk->peer_shutdown |= SEND_SHUTDOWN | RCV_SHUTDOWN; | 315 | vsk->peer_shutdown |= SEND_SHUTDOWN | RCV_SHUTDOWN; |
316 | 316 | ||
@@ -344,8 +344,8 @@ static void hvs_open_connection(struct vmbus_channel *chan) | |||
344 | if (!sk) | 344 | if (!sk) |
345 | return; | 345 | return; |
346 | 346 | ||
347 | if ((conn_from_host && sk->sk_state != VSOCK_SS_LISTEN) || | 347 | if ((conn_from_host && sk->sk_state != TCP_LISTEN) || |
348 | (!conn_from_host && sk->sk_state != SS_CONNECTING)) | 348 | (!conn_from_host && sk->sk_state != TCP_SYN_SENT)) |
349 | goto out; | 349 | goto out; |
350 | 350 | ||
351 | if (conn_from_host) { | 351 | if (conn_from_host) { |
@@ -357,7 +357,7 @@ static void hvs_open_connection(struct vmbus_channel *chan) | |||
357 | if (!new) | 357 | if (!new) |
358 | goto out; | 358 | goto out; |
359 | 359 | ||
360 | new->sk_state = SS_CONNECTING; | 360 | new->sk_state = TCP_SYN_SENT; |
361 | vnew = vsock_sk(new); | 361 | vnew = vsock_sk(new); |
362 | hvs_new = vnew->trans; | 362 | hvs_new = vnew->trans; |
363 | hvs_new->chan = chan; | 363 | hvs_new->chan = chan; |
@@ -384,7 +384,7 @@ static void hvs_open_connection(struct vmbus_channel *chan) | |||
384 | vmbus_set_chn_rescind_callback(chan, hvs_close_connection); | 384 | vmbus_set_chn_rescind_callback(chan, hvs_close_connection); |
385 | 385 | ||
386 | if (conn_from_host) { | 386 | if (conn_from_host) { |
387 | new->sk_state = SS_CONNECTED; | 387 | new->sk_state = TCP_ESTABLISHED; |
388 | sk->sk_ack_backlog++; | 388 | sk->sk_ack_backlog++; |
389 | 389 | ||
390 | hvs_addr_init(&vnew->local_addr, if_type); | 390 | hvs_addr_init(&vnew->local_addr, if_type); |
@@ -399,7 +399,7 @@ static void hvs_open_connection(struct vmbus_channel *chan) | |||
399 | vsock_enqueue_accept(sk, new); | 399 | vsock_enqueue_accept(sk, new); |
400 | release_sock(sk); | 400 | release_sock(sk); |
401 | } else { | 401 | } else { |
402 | sk->sk_state = SS_CONNECTED; | 402 | sk->sk_state = TCP_ESTABLISHED; |
403 | sk->sk_socket->state = SS_CONNECTED; | 403 | sk->sk_socket->state = SS_CONNECTED; |
404 | 404 | ||
405 | vsock_insert_connected(vsock_sk(sk)); | 405 | vsock_insert_connected(vsock_sk(sk)); |
diff --git a/net/vmw_vsock/virtio_transport.c b/net/vmw_vsock/virtio_transport.c index 403d86e80162..8e03bd3f3668 100644 --- a/net/vmw_vsock/virtio_transport.c +++ b/net/vmw_vsock/virtio_transport.c | |||
@@ -414,7 +414,7 @@ static void virtio_vsock_event_fill(struct virtio_vsock *vsock) | |||
414 | static void virtio_vsock_reset_sock(struct sock *sk) | 414 | static void virtio_vsock_reset_sock(struct sock *sk) |
415 | { | 415 | { |
416 | lock_sock(sk); | 416 | lock_sock(sk); |
417 | sk->sk_state = SS_UNCONNECTED; | 417 | sk->sk_state = TCP_CLOSE; |
418 | sk->sk_err = ECONNRESET; | 418 | sk->sk_err = ECONNRESET; |
419 | sk->sk_error_report(sk); | 419 | sk->sk_error_report(sk); |
420 | release_sock(sk); | 420 | release_sock(sk); |
diff --git a/net/vmw_vsock/virtio_transport_common.c b/net/vmw_vsock/virtio_transport_common.c index edba7ab97563..3ae3a33da70b 100644 --- a/net/vmw_vsock/virtio_transport_common.c +++ b/net/vmw_vsock/virtio_transport_common.c | |||
@@ -708,7 +708,7 @@ static void virtio_transport_do_close(struct vsock_sock *vsk, | |||
708 | sock_set_flag(sk, SOCK_DONE); | 708 | sock_set_flag(sk, SOCK_DONE); |
709 | vsk->peer_shutdown = SHUTDOWN_MASK; | 709 | vsk->peer_shutdown = SHUTDOWN_MASK; |
710 | if (vsock_stream_has_data(vsk) <= 0) | 710 | if (vsock_stream_has_data(vsk) <= 0) |
711 | sk->sk_state = SS_DISCONNECTING; | 711 | sk->sk_state = TCP_CLOSING; |
712 | sk->sk_state_change(sk); | 712 | sk->sk_state_change(sk); |
713 | 713 | ||
714 | if (vsk->close_work_scheduled && | 714 | if (vsk->close_work_scheduled && |
@@ -748,8 +748,8 @@ static bool virtio_transport_close(struct vsock_sock *vsk) | |||
748 | { | 748 | { |
749 | struct sock *sk = &vsk->sk; | 749 | struct sock *sk = &vsk->sk; |
750 | 750 | ||
751 | if (!(sk->sk_state == SS_CONNECTED || | 751 | if (!(sk->sk_state == TCP_ESTABLISHED || |
752 | sk->sk_state == SS_DISCONNECTING)) | 752 | sk->sk_state == TCP_CLOSING)) |
753 | return true; | 753 | return true; |
754 | 754 | ||
755 | /* Already received SHUTDOWN from peer, reply with RST */ | 755 | /* Already received SHUTDOWN from peer, reply with RST */ |
@@ -801,7 +801,7 @@ virtio_transport_recv_connecting(struct sock *sk, | |||
801 | 801 | ||
802 | switch (le16_to_cpu(pkt->hdr.op)) { | 802 | switch (le16_to_cpu(pkt->hdr.op)) { |
803 | case VIRTIO_VSOCK_OP_RESPONSE: | 803 | case VIRTIO_VSOCK_OP_RESPONSE: |
804 | sk->sk_state = SS_CONNECTED; | 804 | sk->sk_state = TCP_ESTABLISHED; |
805 | sk->sk_socket->state = SS_CONNECTED; | 805 | sk->sk_socket->state = SS_CONNECTED; |
806 | vsock_insert_connected(vsk); | 806 | vsock_insert_connected(vsk); |
807 | sk->sk_state_change(sk); | 807 | sk->sk_state_change(sk); |
@@ -821,7 +821,7 @@ virtio_transport_recv_connecting(struct sock *sk, | |||
821 | 821 | ||
822 | destroy: | 822 | destroy: |
823 | virtio_transport_reset(vsk, pkt); | 823 | virtio_transport_reset(vsk, pkt); |
824 | sk->sk_state = SS_UNCONNECTED; | 824 | sk->sk_state = TCP_CLOSE; |
825 | sk->sk_err = skerr; | 825 | sk->sk_err = skerr; |
826 | sk->sk_error_report(sk); | 826 | sk->sk_error_report(sk); |
827 | return err; | 827 | return err; |
@@ -857,7 +857,7 @@ virtio_transport_recv_connected(struct sock *sk, | |||
857 | vsk->peer_shutdown |= SEND_SHUTDOWN; | 857 | vsk->peer_shutdown |= SEND_SHUTDOWN; |
858 | if (vsk->peer_shutdown == SHUTDOWN_MASK && | 858 | if (vsk->peer_shutdown == SHUTDOWN_MASK && |
859 | vsock_stream_has_data(vsk) <= 0) | 859 | vsock_stream_has_data(vsk) <= 0) |
860 | sk->sk_state = SS_DISCONNECTING; | 860 | sk->sk_state = TCP_CLOSING; |
861 | if (le32_to_cpu(pkt->hdr.flags)) | 861 | if (le32_to_cpu(pkt->hdr.flags)) |
862 | sk->sk_state_change(sk); | 862 | sk->sk_state_change(sk); |
863 | break; | 863 | break; |
@@ -928,7 +928,7 @@ virtio_transport_recv_listen(struct sock *sk, struct virtio_vsock_pkt *pkt) | |||
928 | 928 | ||
929 | lock_sock_nested(child, SINGLE_DEPTH_NESTING); | 929 | lock_sock_nested(child, SINGLE_DEPTH_NESTING); |
930 | 930 | ||
931 | child->sk_state = SS_CONNECTED; | 931 | child->sk_state = TCP_ESTABLISHED; |
932 | 932 | ||
933 | vchild = vsock_sk(child); | 933 | vchild = vsock_sk(child); |
934 | vsock_addr_init(&vchild->local_addr, le64_to_cpu(pkt->hdr.dst_cid), | 934 | vsock_addr_init(&vchild->local_addr, le64_to_cpu(pkt->hdr.dst_cid), |
@@ -1016,18 +1016,18 @@ void virtio_transport_recv_pkt(struct virtio_vsock_pkt *pkt) | |||
1016 | sk->sk_write_space(sk); | 1016 | sk->sk_write_space(sk); |
1017 | 1017 | ||
1018 | switch (sk->sk_state) { | 1018 | switch (sk->sk_state) { |
1019 | case VSOCK_SS_LISTEN: | 1019 | case TCP_LISTEN: |
1020 | virtio_transport_recv_listen(sk, pkt); | 1020 | virtio_transport_recv_listen(sk, pkt); |
1021 | virtio_transport_free_pkt(pkt); | 1021 | virtio_transport_free_pkt(pkt); |
1022 | break; | 1022 | break; |
1023 | case SS_CONNECTING: | 1023 | case TCP_SYN_SENT: |
1024 | virtio_transport_recv_connecting(sk, pkt); | 1024 | virtio_transport_recv_connecting(sk, pkt); |
1025 | virtio_transport_free_pkt(pkt); | 1025 | virtio_transport_free_pkt(pkt); |
1026 | break; | 1026 | break; |
1027 | case SS_CONNECTED: | 1027 | case TCP_ESTABLISHED: |
1028 | virtio_transport_recv_connected(sk, pkt); | 1028 | virtio_transport_recv_connected(sk, pkt); |
1029 | break; | 1029 | break; |
1030 | case SS_DISCONNECTING: | 1030 | case TCP_CLOSING: |
1031 | virtio_transport_recv_disconnecting(sk, pkt); | 1031 | virtio_transport_recv_disconnecting(sk, pkt); |
1032 | virtio_transport_free_pkt(pkt); | 1032 | virtio_transport_free_pkt(pkt); |
1033 | break; | 1033 | break; |
diff --git a/net/vmw_vsock/vmci_transport.c b/net/vmw_vsock/vmci_transport.c index 0206155bff53..391775e3575c 100644 --- a/net/vmw_vsock/vmci_transport.c +++ b/net/vmw_vsock/vmci_transport.c | |||
@@ -742,7 +742,7 @@ static int vmci_transport_recv_stream_cb(void *data, struct vmci_datagram *dg) | |||
742 | /* The local context ID may be out of date, update it. */ | 742 | /* The local context ID may be out of date, update it. */ |
743 | vsk->local_addr.svm_cid = dst.svm_cid; | 743 | vsk->local_addr.svm_cid = dst.svm_cid; |
744 | 744 | ||
745 | if (sk->sk_state == SS_CONNECTED) | 745 | if (sk->sk_state == TCP_ESTABLISHED) |
746 | vmci_trans(vsk)->notify_ops->handle_notify_pkt( | 746 | vmci_trans(vsk)->notify_ops->handle_notify_pkt( |
747 | sk, pkt, true, &dst, &src, | 747 | sk, pkt, true, &dst, &src, |
748 | &bh_process_pkt); | 748 | &bh_process_pkt); |
@@ -800,7 +800,9 @@ static void vmci_transport_handle_detach(struct sock *sk) | |||
800 | * left in our consume queue. | 800 | * left in our consume queue. |
801 | */ | 801 | */ |
802 | if (vsock_stream_has_data(vsk) <= 0) { | 802 | if (vsock_stream_has_data(vsk) <= 0) { |
803 | if (sk->sk_state == SS_CONNECTING) { | 803 | sk->sk_state = TCP_CLOSE; |
804 | |||
805 | if (sk->sk_state == TCP_SYN_SENT) { | ||
804 | /* The peer may detach from a queue pair while | 806 | /* The peer may detach from a queue pair while |
805 | * we are still in the connecting state, i.e., | 807 | * we are still in the connecting state, i.e., |
806 | * if the peer VM is killed after attaching to | 808 | * if the peer VM is killed after attaching to |
@@ -809,12 +811,10 @@ static void vmci_transport_handle_detach(struct sock *sk) | |||
809 | * event like a reset. | 811 | * event like a reset. |
810 | */ | 812 | */ |
811 | 813 | ||
812 | sk->sk_state = SS_UNCONNECTED; | ||
813 | sk->sk_err = ECONNRESET; | 814 | sk->sk_err = ECONNRESET; |
814 | sk->sk_error_report(sk); | 815 | sk->sk_error_report(sk); |
815 | return; | 816 | return; |
816 | } | 817 | } |
817 | sk->sk_state = SS_UNCONNECTED; | ||
818 | } | 818 | } |
819 | sk->sk_state_change(sk); | 819 | sk->sk_state_change(sk); |
820 | } | 820 | } |
@@ -882,17 +882,17 @@ static void vmci_transport_recv_pkt_work(struct work_struct *work) | |||
882 | vsock_sk(sk)->local_addr.svm_cid = pkt->dg.dst.context; | 882 | vsock_sk(sk)->local_addr.svm_cid = pkt->dg.dst.context; |
883 | 883 | ||
884 | switch (sk->sk_state) { | 884 | switch (sk->sk_state) { |
885 | case VSOCK_SS_LISTEN: | 885 | case TCP_LISTEN: |
886 | vmci_transport_recv_listen(sk, pkt); | 886 | vmci_transport_recv_listen(sk, pkt); |
887 | break; | 887 | break; |
888 | case SS_CONNECTING: | 888 | case TCP_SYN_SENT: |
889 | /* Processing of pending connections for servers goes through | 889 | /* Processing of pending connections for servers goes through |
890 | * the listening socket, so see vmci_transport_recv_listen() | 890 | * the listening socket, so see vmci_transport_recv_listen() |
891 | * for that path. | 891 | * for that path. |
892 | */ | 892 | */ |
893 | vmci_transport_recv_connecting_client(sk, pkt); | 893 | vmci_transport_recv_connecting_client(sk, pkt); |
894 | break; | 894 | break; |
895 | case SS_CONNECTED: | 895 | case TCP_ESTABLISHED: |
896 | vmci_transport_recv_connected(sk, pkt); | 896 | vmci_transport_recv_connected(sk, pkt); |
897 | break; | 897 | break; |
898 | default: | 898 | default: |
@@ -941,7 +941,7 @@ static int vmci_transport_recv_listen(struct sock *sk, | |||
941 | vsock_sk(pending)->local_addr.svm_cid = pkt->dg.dst.context; | 941 | vsock_sk(pending)->local_addr.svm_cid = pkt->dg.dst.context; |
942 | 942 | ||
943 | switch (pending->sk_state) { | 943 | switch (pending->sk_state) { |
944 | case SS_CONNECTING: | 944 | case TCP_SYN_SENT: |
945 | err = vmci_transport_recv_connecting_server(sk, | 945 | err = vmci_transport_recv_connecting_server(sk, |
946 | pending, | 946 | pending, |
947 | pkt); | 947 | pkt); |
@@ -1071,7 +1071,7 @@ static int vmci_transport_recv_listen(struct sock *sk, | |||
1071 | vsock_add_pending(sk, pending); | 1071 | vsock_add_pending(sk, pending); |
1072 | sk->sk_ack_backlog++; | 1072 | sk->sk_ack_backlog++; |
1073 | 1073 | ||
1074 | pending->sk_state = SS_CONNECTING; | 1074 | pending->sk_state = TCP_SYN_SENT; |
1075 | vmci_trans(vpending)->produce_size = | 1075 | vmci_trans(vpending)->produce_size = |
1076 | vmci_trans(vpending)->consume_size = qp_size; | 1076 | vmci_trans(vpending)->consume_size = qp_size; |
1077 | vmci_trans(vpending)->queue_pair_size = qp_size; | 1077 | vmci_trans(vpending)->queue_pair_size = qp_size; |
@@ -1196,11 +1196,11 @@ vmci_transport_recv_connecting_server(struct sock *listener, | |||
1196 | * the socket will be valid until it is removed from the queue. | 1196 | * the socket will be valid until it is removed from the queue. |
1197 | * | 1197 | * |
1198 | * If we fail sending the attach below, we remove the socket from the | 1198 | * If we fail sending the attach below, we remove the socket from the |
1199 | * connected list and move the socket to SS_UNCONNECTED before | 1199 | * connected list and move the socket to TCP_CLOSE before |
1200 | * releasing the lock, so a pending slow path processing of an incoming | 1200 | * releasing the lock, so a pending slow path processing of an incoming |
1201 | * packet will not see the socket in the connected state in that case. | 1201 | * packet will not see the socket in the connected state in that case. |
1202 | */ | 1202 | */ |
1203 | pending->sk_state = SS_CONNECTED; | 1203 | pending->sk_state = TCP_ESTABLISHED; |
1204 | 1204 | ||
1205 | vsock_insert_connected(vpending); | 1205 | vsock_insert_connected(vpending); |
1206 | 1206 | ||
@@ -1231,7 +1231,7 @@ vmci_transport_recv_connecting_server(struct sock *listener, | |||
1231 | 1231 | ||
1232 | destroy: | 1232 | destroy: |
1233 | pending->sk_err = skerr; | 1233 | pending->sk_err = skerr; |
1234 | pending->sk_state = SS_UNCONNECTED; | 1234 | pending->sk_state = TCP_CLOSE; |
1235 | /* As long as we drop our reference, all necessary cleanup will handle | 1235 | /* As long as we drop our reference, all necessary cleanup will handle |
1236 | * when the cleanup function drops its reference and our destruct | 1236 | * when the cleanup function drops its reference and our destruct |
1237 | * implementation is called. Note that since the listen handler will | 1237 | * implementation is called. Note that since the listen handler will |
@@ -1269,7 +1269,7 @@ vmci_transport_recv_connecting_client(struct sock *sk, | |||
1269 | * accounting (it can already be found since it's in the bound | 1269 | * accounting (it can already be found since it's in the bound |
1270 | * table). | 1270 | * table). |
1271 | */ | 1271 | */ |
1272 | sk->sk_state = SS_CONNECTED; | 1272 | sk->sk_state = TCP_ESTABLISHED; |
1273 | sk->sk_socket->state = SS_CONNECTED; | 1273 | sk->sk_socket->state = SS_CONNECTED; |
1274 | vsock_insert_connected(vsk); | 1274 | vsock_insert_connected(vsk); |
1275 | sk->sk_state_change(sk); | 1275 | sk->sk_state_change(sk); |
@@ -1337,7 +1337,7 @@ vmci_transport_recv_connecting_client(struct sock *sk, | |||
1337 | destroy: | 1337 | destroy: |
1338 | vmci_transport_send_reset(sk, pkt); | 1338 | vmci_transport_send_reset(sk, pkt); |
1339 | 1339 | ||
1340 | sk->sk_state = SS_UNCONNECTED; | 1340 | sk->sk_state = TCP_CLOSE; |
1341 | sk->sk_err = skerr; | 1341 | sk->sk_err = skerr; |
1342 | sk->sk_error_report(sk); | 1342 | sk->sk_error_report(sk); |
1343 | return err; | 1343 | return err; |
@@ -1525,7 +1525,7 @@ static int vmci_transport_recv_connected(struct sock *sk, | |||
1525 | sock_set_flag(sk, SOCK_DONE); | 1525 | sock_set_flag(sk, SOCK_DONE); |
1526 | vsk->peer_shutdown = SHUTDOWN_MASK; | 1526 | vsk->peer_shutdown = SHUTDOWN_MASK; |
1527 | if (vsock_stream_has_data(vsk) <= 0) | 1527 | if (vsock_stream_has_data(vsk) <= 0) |
1528 | sk->sk_state = SS_DISCONNECTING; | 1528 | sk->sk_state = TCP_CLOSING; |
1529 | 1529 | ||
1530 | sk->sk_state_change(sk); | 1530 | sk->sk_state_change(sk); |
1531 | break; | 1531 | break; |
@@ -1789,7 +1789,7 @@ static int vmci_transport_connect(struct vsock_sock *vsk) | |||
1789 | err = vmci_transport_send_conn_request( | 1789 | err = vmci_transport_send_conn_request( |
1790 | sk, vmci_trans(vsk)->queue_pair_size); | 1790 | sk, vmci_trans(vsk)->queue_pair_size); |
1791 | if (err < 0) { | 1791 | if (err < 0) { |
1792 | sk->sk_state = SS_UNCONNECTED; | 1792 | sk->sk_state = TCP_CLOSE; |
1793 | return err; | 1793 | return err; |
1794 | } | 1794 | } |
1795 | } else { | 1795 | } else { |
@@ -1799,7 +1799,7 @@ static int vmci_transport_connect(struct vsock_sock *vsk) | |||
1799 | sk, vmci_trans(vsk)->queue_pair_size, | 1799 | sk, vmci_trans(vsk)->queue_pair_size, |
1800 | supported_proto_versions); | 1800 | supported_proto_versions); |
1801 | if (err < 0) { | 1801 | if (err < 0) { |
1802 | sk->sk_state = SS_UNCONNECTED; | 1802 | sk->sk_state = TCP_CLOSE; |
1803 | return err; | 1803 | return err; |
1804 | } | 1804 | } |
1805 | 1805 | ||
diff --git a/net/vmw_vsock/vmci_transport_notify.c b/net/vmw_vsock/vmci_transport_notify.c index 1406db4d97d1..41fb427f150a 100644 --- a/net/vmw_vsock/vmci_transport_notify.c +++ b/net/vmw_vsock/vmci_transport_notify.c | |||
@@ -355,7 +355,7 @@ vmci_transport_notify_pkt_poll_in(struct sock *sk, | |||
355 | * queue. Ask for notifications when there is something to | 355 | * queue. Ask for notifications when there is something to |
356 | * read. | 356 | * read. |
357 | */ | 357 | */ |
358 | if (sk->sk_state == SS_CONNECTED) { | 358 | if (sk->sk_state == TCP_ESTABLISHED) { |
359 | if (!send_waiting_read(sk, 1)) | 359 | if (!send_waiting_read(sk, 1)) |
360 | return -1; | 360 | return -1; |
361 | 361 | ||
diff --git a/net/vmw_vsock/vmci_transport_notify_qstate.c b/net/vmw_vsock/vmci_transport_notify_qstate.c index f3a0afc46208..0cc84f2bb05e 100644 --- a/net/vmw_vsock/vmci_transport_notify_qstate.c +++ b/net/vmw_vsock/vmci_transport_notify_qstate.c | |||
@@ -176,7 +176,7 @@ vmci_transport_notify_pkt_poll_in(struct sock *sk, | |||
176 | * queue. Ask for notifications when there is something to | 176 | * queue. Ask for notifications when there is something to |
177 | * read. | 177 | * read. |
178 | */ | 178 | */ |
179 | if (sk->sk_state == SS_CONNECTED) | 179 | if (sk->sk_state == TCP_ESTABLISHED) |
180 | vsock_block_update_write_window(sk); | 180 | vsock_block_update_write_window(sk); |
181 | *data_ready_now = false; | 181 | *data_ready_now = false; |
182 | } | 182 | } |