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>
This commit is contained in:
committed by
David S. Miller
parent
bf359b8127
commit
3b4477d2dc
@@ -708,7 +708,7 @@ static void virtio_transport_do_close(struct vsock_sock *vsk,
|
||||
sock_set_flag(sk, SOCK_DONE);
|
||||
vsk->peer_shutdown = SHUTDOWN_MASK;
|
||||
if (vsock_stream_has_data(vsk) <= 0)
|
||||
sk->sk_state = SS_DISCONNECTING;
|
||||
sk->sk_state = TCP_CLOSING;
|
||||
sk->sk_state_change(sk);
|
||||
|
||||
if (vsk->close_work_scheduled &&
|
||||
@@ -748,8 +748,8 @@ static bool virtio_transport_close(struct vsock_sock *vsk)
|
||||
{
|
||||
struct sock *sk = &vsk->sk;
|
||||
|
||||
if (!(sk->sk_state == SS_CONNECTED ||
|
||||
sk->sk_state == SS_DISCONNECTING))
|
||||
if (!(sk->sk_state == TCP_ESTABLISHED ||
|
||||
sk->sk_state == TCP_CLOSING))
|
||||
return true;
|
||||
|
||||
/* Already received SHUTDOWN from peer, reply with RST */
|
||||
@@ -801,7 +801,7 @@ virtio_transport_recv_connecting(struct sock *sk,
|
||||
|
||||
switch (le16_to_cpu(pkt->hdr.op)) {
|
||||
case VIRTIO_VSOCK_OP_RESPONSE:
|
||||
sk->sk_state = SS_CONNECTED;
|
||||
sk->sk_state = TCP_ESTABLISHED;
|
||||
sk->sk_socket->state = SS_CONNECTED;
|
||||
vsock_insert_connected(vsk);
|
||||
sk->sk_state_change(sk);
|
||||
@@ -821,7 +821,7 @@ virtio_transport_recv_connecting(struct sock *sk,
|
||||
|
||||
destroy:
|
||||
virtio_transport_reset(vsk, pkt);
|
||||
sk->sk_state = SS_UNCONNECTED;
|
||||
sk->sk_state = TCP_CLOSE;
|
||||
sk->sk_err = skerr;
|
||||
sk->sk_error_report(sk);
|
||||
return err;
|
||||
@@ -857,7 +857,7 @@ virtio_transport_recv_connected(struct sock *sk,
|
||||
vsk->peer_shutdown |= SEND_SHUTDOWN;
|
||||
if (vsk->peer_shutdown == SHUTDOWN_MASK &&
|
||||
vsock_stream_has_data(vsk) <= 0)
|
||||
sk->sk_state = SS_DISCONNECTING;
|
||||
sk->sk_state = TCP_CLOSING;
|
||||
if (le32_to_cpu(pkt->hdr.flags))
|
||||
sk->sk_state_change(sk);
|
||||
break;
|
||||
@@ -928,7 +928,7 @@ virtio_transport_recv_listen(struct sock *sk, struct virtio_vsock_pkt *pkt)
|
||||
|
||||
lock_sock_nested(child, SINGLE_DEPTH_NESTING);
|
||||
|
||||
child->sk_state = SS_CONNECTED;
|
||||
child->sk_state = TCP_ESTABLISHED;
|
||||
|
||||
vchild = vsock_sk(child);
|
||||
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)
|
||||
sk->sk_write_space(sk);
|
||||
|
||||
switch (sk->sk_state) {
|
||||
case VSOCK_SS_LISTEN:
|
||||
case TCP_LISTEN:
|
||||
virtio_transport_recv_listen(sk, pkt);
|
||||
virtio_transport_free_pkt(pkt);
|
||||
break;
|
||||
case SS_CONNECTING:
|
||||
case TCP_SYN_SENT:
|
||||
virtio_transport_recv_connecting(sk, pkt);
|
||||
virtio_transport_free_pkt(pkt);
|
||||
break;
|
||||
case SS_CONNECTED:
|
||||
case TCP_ESTABLISHED:
|
||||
virtio_transport_recv_connected(sk, pkt);
|
||||
break;
|
||||
case SS_DISCONNECTING:
|
||||
case TCP_CLOSING:
|
||||
virtio_transport_recv_disconnecting(sk, pkt);
|
||||
virtio_transport_free_pkt(pkt);
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user