firecracker-microvm / firecracker

Secure and fast microVMs for serverless computing.
http://firecracker-microvm.io
Apache License 2.0
26.37k stars 1.83k forks source link

[Feature Request] Add SEQPACKET socket type for vsock #4822

Open gabivlj opened 2 months ago

gabivlj commented 2 months ago

Feature Request

https://docs.oasis-open.org/virtio/virtio/v1.2/csd01/virtio-v1.2-csd01.html

VIRTIO_VSOCK_F_SEQPACKET has been introduced as an option for virtio vsock. It would enable the use-case of VMs that are relaying datagrams over a vsock and need to keep the boundaries without a SOCK_STREAM combining them together.

Right now you can connect from the VM opening a vsock with SOCK_STREAM type, but not with SOCK_SEQPACKET. This would also mean that on the host side the created UDS needs to match the socket type of the vsock.

Describe the desired solution

This should work:

    socketFd, err := unix.Socket(unix.AF_VSOCK, unix.SOCK_SEQPACKET, 0)
    if err != nil {
        return nil, 0, err
    }

    sockaddr := &unix.SockaddrVM{
        CID:  2,
        Port: 500,
    }
    if err := unix.Connect(socketFd, sockaddr); err != nil {
        return nil, 0, err
    }

And if the opened UDS on the host side doesn't match the sock type it should not go ahead with the connection.

Describe possible alternatives

I worked around this by implementing packet boundaries within the stream socket, but it's clearly a not very efficient solution and slow.

Checks

I am curious if this is something the Firecracker team is interested in implementing for their vsock virtio component.

JackThomson2 commented 1 month ago

Hi gabivlj, Thank you very much for your interest into Firecracker and this feature request. While at the moment we are not actively working to implement this feature, we are more than happy to receive contribution from the community to implement it. We will make sure to review any implementation of it. Thanks, Jack