Stefano Garzarella
2021-Feb-01 11:04 UTC
[RFC PATCH v3 10/13] virtio/vsock: rest of SOCK_SEQPACKET support
On Fri, Jan 29, 2021 at 07:00:16PM +0300, Arseny Krasnov wrote:> >On 29.01.2021 14:03, Stefano Garzarella wrote: >> On Mon, Jan 25, 2021 at 02:15:26PM +0300, Arseny Krasnov wrote: >>> This adds rest of logic for SEQPACKET: >>> 1) Shared functions for packet sending now set valid type of packet >>> according socket type. >>> 2) SEQPACKET specific function like SEQ_BEGIN send and data dequeue. >>> 3) TAP support for SEQPACKET is not so easy if it is necessary to >>> send whole record to TAP interface. This could be done by allocating >>> new packet when whole record is received, data of record must be >>> copied to TAP packet. >>> >>> Signed-off-by: Arseny Krasnov <arseny.krasnov at kaspersky.com> >>> --- >>> include/linux/virtio_vsock.h | 7 ++++ >>> net/vmw_vsock/virtio_transport_common.c | 55 +++++++++++++++++++++---- >>> 2 files changed, 55 insertions(+), 7 deletions(-) >>> >>> diff --git a/include/linux/virtio_vsock.h b/include/linux/virtio_vsock.h >>> index af8705ea8b95..ad9783df97c9 100644 >>> --- a/include/linux/virtio_vsock.h >>> +++ b/include/linux/virtio_vsock.h >>> @@ -84,7 +84,14 @@ virtio_transport_dgram_dequeue(struct vsock_sock *vsk, >>> struct msghdr *msg, >>> size_t len, int flags); >>> >>> +bool virtio_transport_seqpacket_seq_send_len(struct vsock_sock *vsk, size_t len); >>> size_t virtio_transport_seqpacket_seq_get_len(struct vsock_sock *vsk); >>> +ssize_t >>> +virtio_transport_seqpacket_dequeue(struct vsock_sock *vsk, >>> + struct msghdr *msg, >>> + size_t len, >>> + int type); >>> + >>> s64 virtio_transport_stream_has_data(struct vsock_sock *vsk); >>> s64 virtio_transport_stream_has_space(struct vsock_sock *vsk); >>> >>> diff --git a/net/vmw_vsock/virtio_transport_common.c b/net/vmw_vsock/virtio_transport_common.c >>> index 90f9feef9d8f..fab14679ca7b 100644 >>> --- a/net/vmw_vsock/virtio_transport_common.c >>> +++ b/net/vmw_vsock/virtio_transport_common.c >>> @@ -139,6 +139,7 @@ static struct sk_buff *virtio_transport_build_skb(void *opaque) >>> break; >>> case VIRTIO_VSOCK_OP_CREDIT_UPDATE: >>> case VIRTIO_VSOCK_OP_CREDIT_REQUEST: >>> + case VIRTIO_VSOCK_OP_SEQ_BEGIN: >>> hdr->op = cpu_to_le16(AF_VSOCK_OP_CONTROL); >>> break; >>> default: >>> @@ -157,6 +158,10 @@ static struct sk_buff *virtio_transport_build_skb(void *opaque) >>> >>> void virtio_transport_deliver_tap_pkt(struct virtio_vsock_pkt *pkt) >>> { >>> + /* TODO: implement tap support for SOCK_SEQPACKET. */ >> I think we should do this before merging SOCK_SEQPACKET support because >> it can be very useful to use tcpdump to figure out what's going on, do >> you think it's complicated? > >It is not complicated if for TAP interface we will consider seqpacket > >same as stream, e.g. TAP reader won't see whole record as one > >packet,it will see fragments of record as in stream socket. ImplementMaybe as initial support we can have this limitation and complete it later.> >normal interpretation of seqpacket is not complicated, but requires > >some extra work. Ok, i'll check itThanks, Stefano