Stefano Garzarella
2021-May-13 12:14 UTC
[RFC PATCH v9 12/19] virtio/vsock: add SEQPACKET receive logic
On Sat, May 08, 2021 at 07:35:40PM +0300, Arseny Krasnov wrote:>This modifies current receive logic for SEQPACKET support: >1) Inserts 'RW' packet to socket's rx queue, but without merging with > buffer of last packet in queue.This is not true anymore, right?>2) Performs check for packet and socket types on receive(if mismatch, > then reset connection). > >Signed-off-by: Arseny Krasnov <arseny.krasnov at kaspersky.com> >Reviewed-by: Stefano Garzarella <sgarzare at redhat.com>Also this patch is changed :-)>--- > net/vmw_vsock/virtio_transport_common.c | 28 +++++++++++++++++++++++-- > 1 file changed, 26 insertions(+), 2 deletions(-) > >diff --git a/net/vmw_vsock/virtio_transport_common.c b/net/vmw_vsock/virtio_transport_common.c >index f649a21dd23b..7fea0a2192f7 100644 >--- a/net/vmw_vsock/virtio_transport_common.c >+++ b/net/vmw_vsock/virtio_transport_common.c >@@ -165,6 +165,14 @@ void virtio_transport_deliver_tap_pkt(struct virtio_vsock_pkt *pkt) > } > EXPORT_SYMBOL_GPL(virtio_transport_deliver_tap_pkt); > >+static u16 virtio_transport_get_type(struct sock *sk) >+{ >+ if (sk->sk_type == SOCK_STREAM) >+ return VIRTIO_VSOCK_TYPE_STREAM; >+ else >+ return VIRTIO_VSOCK_TYPE_SEQPACKET; >+} >+ > /* This function can only be used on connecting/connected sockets, > * since a socket assigned to a transport is required. > * >@@ -980,11 +988,15 @@ virtio_transport_recv_enqueue(struct vsock_sock *vsk, > /* If there is space in the last packet queued, we copy the > * new packet in its buffer. > */ >- if (pkt->len <= last_pkt->buf_len - last_pkt->len) { >+ if ((pkt->len <= last_pkt->buf_len - last_pkt->len) && >+ !(le32_to_cpu(last_pkt->hdr.flags) & VIRTIO_VSOCK_SEQ_EOR)) {Maybe we should update the comment above.> memcpy(last_pkt->buf + last_pkt->len, pkt->buf, > pkt->len); > last_pkt->len += pkt->len; > free_pkt = true; >+ >+ if (le32_to_cpu(pkt->hdr.flags) & VIRTIO_VSOCK_SEQ_EOR) >+ last_pkt->hdr.flags |= cpu_to_le32(VIRTIO_VSOCK_SEQ_EOR);What about doing the following in any case? last_pkt->hdr.flags |= pkt->hdr.flags;> goto out; > } > }