Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Stefan Hajnoczi and committed by
David S. Miller
3b4477d2 bf359b81

+64 -59
-3
include/net/af_vsock.h
··· 22 22 23 23 #include "vsock_addr.h" 24 24 25 - /* vsock-specific sock->sk_state constants */ 26 - #define VSOCK_SS_LISTEN 255 27 - 28 25 #define LAST_RESERVED_PORT 1023 29 26 30 27 #define VSOCK_HASH_SIZE 251
+27 -19
net/vmw_vsock/af_vsock.c
··· 36 36 * not support simultaneous connects (two "client" sockets connecting). 37 37 * 38 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 40 * connection request is received (the second kind of socket mentioned above), 41 41 * we create a new socket and refer to it as a pending socket. These pending 42 42 * sockets are placed on the pending connection list of the listener socket. ··· 82 82 * argument, we must ensure the reference count is increased to ensure the 83 83 * socket isn't freed before the function is run; the deferred function will 84 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 96 #include <linux/types.h> ··· 486 477 if (vsock_in_connected_table(vsk)) 487 478 vsock_remove_connected(vsk); 488 479 489 - sk->sk_state = SS_FREE; 480 + sk->sk_state = TCP_CLOSE; 490 481 491 482 out: 492 483 release_sock(sk); ··· 626 617 627 618 sk->sk_destruct = vsock_sk_destruct; 628 619 sk->sk_backlog_rcv = vsock_queue_rcv_skb; 629 - sk->sk_state = 0; 630 620 sock_reset_flag(sk, SOCK_DONE); 631 621 632 622 INIT_LIST_HEAD(&vsk->bound_table); ··· 899 891 /* Listening sockets that have connections in their accept 900 892 * queue can be read. 901 893 */ 902 - if (sk->sk_state == VSOCK_SS_LISTEN 894 + if (sk->sk_state == TCP_LISTEN 903 895 && !vsock_is_accept_queue_empty(sk)) 904 896 mask |= POLLIN | POLLRDNORM; 905 897 ··· 928 920 } 929 921 930 922 /* Connected sockets that can produce data can be written. */ 931 - if (sk->sk_state == SS_CONNECTED) { 923 + if (sk->sk_state == TCP_ESTABLISHED) { 932 924 if (!(sk->sk_shutdown & SEND_SHUTDOWN)) { 933 925 bool space_avail_now = false; 934 926 int ret = transport->notify_poll_out( ··· 950 942 * POLLOUT|POLLWRNORM when peer is closed and nothing to read, 951 943 * but local send is not shutdown. 952 944 */ 953 - if (sk->sk_state == SS_UNCONNECTED) { 945 + if (sk->sk_state == TCP_CLOSE) { 954 946 if (!(sk->sk_shutdown & SEND_SHUTDOWN)) 955 947 mask |= POLLOUT | POLLWRNORM; 956 948 ··· 1120 1112 sk = sk_vsock(vsk); 1121 1113 1122 1114 lock_sock(sk); 1123 - if (sk->sk_state == SS_CONNECTING && 1115 + if (sk->sk_state == TCP_SYN_SENT && 1124 1116 (sk->sk_shutdown != SHUTDOWN_MASK)) { 1125 - sk->sk_state = SS_UNCONNECTED; 1117 + sk->sk_state = TCP_CLOSE; 1126 1118 sk->sk_err = ETIMEDOUT; 1127 1119 sk->sk_error_report(sk); 1128 1120 cancel = 1; ··· 1168 1160 err = -EALREADY; 1169 1161 break; 1170 1162 default: 1171 - if ((sk->sk_state == VSOCK_SS_LISTEN) || 1163 + if ((sk->sk_state == TCP_LISTEN) || 1172 1164 vsock_addr_cast(addr, addr_len, &remote_addr) != 0) { 1173 1165 err = -EINVAL; 1174 1166 goto out; ··· 1191 1183 if (err) 1192 1184 goto out; 1193 1185 1194 - sk->sk_state = SS_CONNECTING; 1186 + sk->sk_state = TCP_SYN_SENT; 1195 1187 1196 1188 err = transport->connect(vsk); 1197 1189 if (err < 0) ··· 1211 1203 timeout = vsk->connect_timeout; 1212 1204 prepare_to_wait(sk_sleep(sk), &wait, TASK_INTERRUPTIBLE); 1213 1205 1214 - while (sk->sk_state != SS_CONNECTED && sk->sk_err == 0) { 1206 + while (sk->sk_state != TCP_ESTABLISHED && sk->sk_err == 0) { 1215 1207 if (flags & O_NONBLOCK) { 1216 1208 /* If we're not going to block, we schedule a timeout 1217 1209 * function to generate a timeout on the connection ··· 1234 1226 1235 1227 if (signal_pending(current)) { 1236 1228 err = sock_intr_errno(timeout); 1237 - sk->sk_state = SS_UNCONNECTED; 1229 + sk->sk_state = TCP_CLOSE; 1238 1230 sock->state = SS_UNCONNECTED; 1239 1231 vsock_transport_cancel_pkt(vsk); 1240 1232 goto out_wait; 1241 1233 } else if (timeout == 0) { 1242 1234 err = -ETIMEDOUT; 1243 - sk->sk_state = SS_UNCONNECTED; 1235 + sk->sk_state = TCP_CLOSE; 1244 1236 sock->state = SS_UNCONNECTED; 1245 1237 vsock_transport_cancel_pkt(vsk); 1246 1238 goto out_wait; ··· 1251 1243 1252 1244 if (sk->sk_err) { 1253 1245 err = -sk->sk_err; 1254 - sk->sk_state = SS_UNCONNECTED; 1246 + sk->sk_state = TCP_CLOSE; 1255 1247 sock->state = SS_UNCONNECTED; 1256 1248 } else { 1257 1249 err = 0; ··· 1284 1276 goto out; 1285 1277 } 1286 1278 1287 - if (listener->sk_state != VSOCK_SS_LISTEN) { 1279 + if (listener->sk_state != TCP_LISTEN) { 1288 1280 err = -EINVAL; 1289 1281 goto out; 1290 1282 } ··· 1374 1366 } 1375 1367 1376 1368 sk->sk_max_ack_backlog = backlog; 1377 - sk->sk_state = VSOCK_SS_LISTEN; 1369 + sk->sk_state = TCP_LISTEN; 1378 1370 1379 1371 err = 0; 1380 1372 ··· 1554 1546 1555 1547 /* Callers should not provide a destination with stream sockets. */ 1556 1548 if (msg->msg_namelen) { 1557 - err = sk->sk_state == SS_CONNECTED ? -EISCONN : -EOPNOTSUPP; 1549 + err = sk->sk_state == TCP_ESTABLISHED ? -EISCONN : -EOPNOTSUPP; 1558 1550 goto out; 1559 1551 } 1560 1552 ··· 1565 1557 goto out; 1566 1558 } 1567 1559 1568 - if (sk->sk_state != SS_CONNECTED || 1560 + if (sk->sk_state != TCP_ESTABLISHED || 1569 1561 !vsock_addr_bound(&vsk->local_addr)) { 1570 1562 err = -ENOTCONN; 1571 1563 goto out; ··· 1689 1681 1690 1682 lock_sock(sk); 1691 1683 1692 - if (sk->sk_state != SS_CONNECTED) { 1684 + if (sk->sk_state != TCP_ESTABLISHED) { 1693 1685 /* Recvmsg is supposed to return 0 if a peer performs an 1694 1686 * orderly shutdown. Differentiate between that case and when a 1695 1687 * peer has not connected or a local shutdown occured with the
+6 -6
net/vmw_vsock/hyperv_transport.c
··· 310 310 struct sock *sk = get_per_channel_state(chan); 311 311 struct vsock_sock *vsk = vsock_sk(sk); 312 312 313 - sk->sk_state = SS_UNCONNECTED; 313 + sk->sk_state = TCP_CLOSE; 314 314 sock_set_flag(sk, SOCK_DONE); 315 315 vsk->peer_shutdown |= SEND_SHUTDOWN | RCV_SHUTDOWN; 316 316 ··· 344 344 if (!sk) 345 345 return; 346 346 347 - if ((conn_from_host && sk->sk_state != VSOCK_SS_LISTEN) || 348 - (!conn_from_host && sk->sk_state != SS_CONNECTING)) 347 + if ((conn_from_host && sk->sk_state != TCP_LISTEN) || 348 + (!conn_from_host && sk->sk_state != TCP_SYN_SENT)) 349 349 goto out; 350 350 351 351 if (conn_from_host) { ··· 357 357 if (!new) 358 358 goto out; 359 359 360 - new->sk_state = SS_CONNECTING; 360 + new->sk_state = TCP_SYN_SENT; 361 361 vnew = vsock_sk(new); 362 362 hvs_new = vnew->trans; 363 363 hvs_new->chan = chan; ··· 384 384 vmbus_set_chn_rescind_callback(chan, hvs_close_connection); 385 385 386 386 if (conn_from_host) { 387 - new->sk_state = SS_CONNECTED; 387 + new->sk_state = TCP_ESTABLISHED; 388 388 sk->sk_ack_backlog++; 389 389 390 390 hvs_addr_init(&vnew->local_addr, if_type); ··· 399 399 vsock_enqueue_accept(sk, new); 400 400 release_sock(sk); 401 401 } else { 402 - sk->sk_state = SS_CONNECTED; 402 + sk->sk_state = TCP_ESTABLISHED; 403 403 sk->sk_socket->state = SS_CONNECTED; 404 404 405 405 vsock_insert_connected(vsock_sk(sk));
+1 -1
net/vmw_vsock/virtio_transport.c
··· 414 414 static void virtio_vsock_reset_sock(struct sock *sk) 415 415 { 416 416 lock_sock(sk); 417 - sk->sk_state = SS_UNCONNECTED; 417 + sk->sk_state = TCP_CLOSE; 418 418 sk->sk_err = ECONNRESET; 419 419 sk->sk_error_report(sk); 420 420 release_sock(sk);
+11 -11
net/vmw_vsock/virtio_transport_common.c
··· 708 708 sock_set_flag(sk, SOCK_DONE); 709 709 vsk->peer_shutdown = SHUTDOWN_MASK; 710 710 if (vsock_stream_has_data(vsk) <= 0) 711 - sk->sk_state = SS_DISCONNECTING; 711 + sk->sk_state = TCP_CLOSING; 712 712 sk->sk_state_change(sk); 713 713 714 714 if (vsk->close_work_scheduled && ··· 748 748 { 749 749 struct sock *sk = &vsk->sk; 750 750 751 - if (!(sk->sk_state == SS_CONNECTED || 752 - sk->sk_state == SS_DISCONNECTING)) 751 + if (!(sk->sk_state == TCP_ESTABLISHED || 752 + sk->sk_state == TCP_CLOSING)) 753 753 return true; 754 754 755 755 /* Already received SHUTDOWN from peer, reply with RST */ ··· 801 801 802 802 switch (le16_to_cpu(pkt->hdr.op)) { 803 803 case VIRTIO_VSOCK_OP_RESPONSE: 804 - sk->sk_state = SS_CONNECTED; 804 + sk->sk_state = TCP_ESTABLISHED; 805 805 sk->sk_socket->state = SS_CONNECTED; 806 806 vsock_insert_connected(vsk); 807 807 sk->sk_state_change(sk); ··· 821 821 822 822 destroy: 823 823 virtio_transport_reset(vsk, pkt); 824 - sk->sk_state = SS_UNCONNECTED; 824 + sk->sk_state = TCP_CLOSE; 825 825 sk->sk_err = skerr; 826 826 sk->sk_error_report(sk); 827 827 return err; ··· 857 857 vsk->peer_shutdown |= SEND_SHUTDOWN; 858 858 if (vsk->peer_shutdown == SHUTDOWN_MASK && 859 859 vsock_stream_has_data(vsk) <= 0) 860 - sk->sk_state = SS_DISCONNECTING; 860 + sk->sk_state = TCP_CLOSING; 861 861 if (le32_to_cpu(pkt->hdr.flags)) 862 862 sk->sk_state_change(sk); 863 863 break; ··· 928 928 929 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 933 vchild = vsock_sk(child); 934 934 vsock_addr_init(&vchild->local_addr, le64_to_cpu(pkt->hdr.dst_cid), ··· 1016 1016 sk->sk_write_space(sk); 1017 1017 1018 1018 switch (sk->sk_state) { 1019 - case VSOCK_SS_LISTEN: 1019 + case TCP_LISTEN: 1020 1020 virtio_transport_recv_listen(sk, pkt); 1021 1021 virtio_transport_free_pkt(pkt); 1022 1022 break; 1023 - case SS_CONNECTING: 1023 + case TCP_SYN_SENT: 1024 1024 virtio_transport_recv_connecting(sk, pkt); 1025 1025 virtio_transport_free_pkt(pkt); 1026 1026 break; 1027 - case SS_CONNECTED: 1027 + case TCP_ESTABLISHED: 1028 1028 virtio_transport_recv_connected(sk, pkt); 1029 1029 break; 1030 - case SS_DISCONNECTING: 1030 + case TCP_CLOSING: 1031 1031 virtio_transport_recv_disconnecting(sk, pkt); 1032 1032 virtio_transport_free_pkt(pkt); 1033 1033 break;
+17 -17
net/vmw_vsock/vmci_transport.c
··· 742 742 /* The local context ID may be out of date, update it. */ 743 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 746 vmci_trans(vsk)->notify_ops->handle_notify_pkt( 747 747 sk, pkt, true, &dst, &src, 748 748 &bh_process_pkt); ··· 800 800 * left in our consume queue. 801 801 */ 802 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 806 /* The peer may detach from a queue pair while 805 807 * we are still in the connecting state, i.e., 806 808 * if the peer VM is killed after attaching to ··· 811 809 * event like a reset. 812 810 */ 813 811 814 - sk->sk_state = SS_UNCONNECTED; 815 812 sk->sk_err = ECONNRESET; 816 813 sk->sk_error_report(sk); 817 814 return; 818 815 } 819 - sk->sk_state = SS_UNCONNECTED; 820 816 } 821 817 sk->sk_state_change(sk); 822 818 } ··· 882 882 vsock_sk(sk)->local_addr.svm_cid = pkt->dg.dst.context; 883 883 884 884 switch (sk->sk_state) { 885 - case VSOCK_SS_LISTEN: 885 + case TCP_LISTEN: 886 886 vmci_transport_recv_listen(sk, pkt); 887 887 break; 888 - case SS_CONNECTING: 888 + case TCP_SYN_SENT: 889 889 /* Processing of pending connections for servers goes through 890 890 * the listening socket, so see vmci_transport_recv_listen() 891 891 * for that path. 892 892 */ 893 893 vmci_transport_recv_connecting_client(sk, pkt); 894 894 break; 895 - case SS_CONNECTED: 895 + case TCP_ESTABLISHED: 896 896 vmci_transport_recv_connected(sk, pkt); 897 897 break; 898 898 default: ··· 941 941 vsock_sk(pending)->local_addr.svm_cid = pkt->dg.dst.context; 942 942 943 943 switch (pending->sk_state) { 944 - case SS_CONNECTING: 944 + case TCP_SYN_SENT: 945 945 err = vmci_transport_recv_connecting_server(sk, 946 946 pending, 947 947 pkt); ··· 1071 1071 vsock_add_pending(sk, pending); 1072 1072 sk->sk_ack_backlog++; 1073 1073 1074 - pending->sk_state = SS_CONNECTING; 1074 + pending->sk_state = TCP_SYN_SENT; 1075 1075 vmci_trans(vpending)->produce_size = 1076 1076 vmci_trans(vpending)->consume_size = qp_size; 1077 1077 vmci_trans(vpending)->queue_pair_size = qp_size; ··· 1196 1196 * the socket will be valid until it is removed from the queue. 1197 1197 * 1198 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 1200 * releasing the lock, so a pending slow path processing of an incoming 1201 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 1205 vsock_insert_connected(vpending); 1206 1206 ··· 1231 1231 1232 1232 destroy: 1233 1233 pending->sk_err = skerr; 1234 - pending->sk_state = SS_UNCONNECTED; 1234 + pending->sk_state = TCP_CLOSE; 1235 1235 /* As long as we drop our reference, all necessary cleanup will handle 1236 1236 * when the cleanup function drops its reference and our destruct 1237 1237 * implementation is called. Note that since the listen handler will ··· 1269 1269 * accounting (it can already be found since it's in the bound 1270 1270 * table). 1271 1271 */ 1272 - sk->sk_state = SS_CONNECTED; 1272 + sk->sk_state = TCP_ESTABLISHED; 1273 1273 sk->sk_socket->state = SS_CONNECTED; 1274 1274 vsock_insert_connected(vsk); 1275 1275 sk->sk_state_change(sk); ··· 1337 1337 destroy: 1338 1338 vmci_transport_send_reset(sk, pkt); 1339 1339 1340 - sk->sk_state = SS_UNCONNECTED; 1340 + sk->sk_state = TCP_CLOSE; 1341 1341 sk->sk_err = skerr; 1342 1342 sk->sk_error_report(sk); 1343 1343 return err; ··· 1525 1525 sock_set_flag(sk, SOCK_DONE); 1526 1526 vsk->peer_shutdown = SHUTDOWN_MASK; 1527 1527 if (vsock_stream_has_data(vsk) <= 0) 1528 - sk->sk_state = SS_DISCONNECTING; 1528 + sk->sk_state = TCP_CLOSING; 1529 1529 1530 1530 sk->sk_state_change(sk); 1531 1531 break; ··· 1789 1789 err = vmci_transport_send_conn_request( 1790 1790 sk, vmci_trans(vsk)->queue_pair_size); 1791 1791 if (err < 0) { 1792 - sk->sk_state = SS_UNCONNECTED; 1792 + sk->sk_state = TCP_CLOSE; 1793 1793 return err; 1794 1794 } 1795 1795 } else { ··· 1799 1799 sk, vmci_trans(vsk)->queue_pair_size, 1800 1800 supported_proto_versions); 1801 1801 if (err < 0) { 1802 - sk->sk_state = SS_UNCONNECTED; 1802 + sk->sk_state = TCP_CLOSE; 1803 1803 return err; 1804 1804 } 1805 1805
+1 -1
net/vmw_vsock/vmci_transport_notify.c
··· 355 355 * queue. Ask for notifications when there is something to 356 356 * read. 357 357 */ 358 - if (sk->sk_state == SS_CONNECTED) { 358 + if (sk->sk_state == TCP_ESTABLISHED) { 359 359 if (!send_waiting_read(sk, 1)) 360 360 return -1; 361 361
+1 -1
net/vmw_vsock/vmci_transport_notify_qstate.c
··· 176 176 * queue. Ask for notifications when there is something to 177 177 * read. 178 178 */ 179 - if (sk->sk_state == SS_CONNECTED) 179 + if (sk->sk_state == TCP_ESTABLISHED) 180 180 vsock_block_update_write_window(sk); 181 181 *data_ready_now = false; 182 182 }