Inter-revision diff: patch 10

Comparing v8 (message) to v3 (message)

--- v8
+++ v3
@@ -1,49 +1,200 @@
-This adds set of defines and constants for SOCK_SEQPACKET
-support in vsock.
+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@kaspersky.com>
 ---
-v7 -> v8:
- - Things like SEQ_BEGIN, SEQ_END, 'msg_len' and 'msg_id' now removed.
-   Now only last RW packet of each message marked by 'VIRTIO_VSOCK_SEQ_EOR'
-   bit in 'flags' field of header.
-  
+ include/linux/virtio_vsock.h            |  7 ++++
+ net/vmw_vsock/virtio_transport_common.c | 55 +++++++++++++++++++++----
+ 2 files changed, 55 insertions(+), 7 deletions(-)
 
- include/uapi/linux/virtio_vsock.h | 9 +++++++++
- 1 file changed, 9 insertions(+)
-
-diff --git a/include/uapi/linux/virtio_vsock.h b/include/uapi/linux/virtio_vsock.h
-index 1d57ed3d84d2..e035b07afe3e 100644
---- a/include/uapi/linux/virtio_vsock.h
-+++ b/include/uapi/linux/virtio_vsock.h
-@@ -38,6 +38,9 @@
- #include <linux/virtio_ids.h>
- #include <linux/virtio_config.h>
- 
-+/* The feature bitmap for virtio vsock */
-+#define VIRTIO_VSOCK_F_SEQPACKET	0	/* SOCK_SEQPACKET supported */
-+
- struct virtio_vsock_config {
- 	__le64 guest_cid;
- } __attribute__((packed));
-@@ -65,6 +68,7 @@ struct virtio_vsock_hdr {
- 
- enum virtio_vsock_type {
- 	VIRTIO_VSOCK_TYPE_STREAM = 1,
-+	VIRTIO_VSOCK_TYPE_SEQPACKET = 2,
- };
- 
- enum virtio_vsock_op {
-@@ -91,4 +95,9 @@ enum virtio_vsock_shutdown {
- 	VIRTIO_VSOCK_SHUTDOWN_SEND = 2,
- };
- 
-+/* VIRTIO_VSOCK_OP_RW flags values */
-+enum virtio_vsock_rw {
-+	VIRTIO_VSOCK_SEQ_EOR = 1,
-+};
-+
- #endif /* _UAPI_LINUX_VIRTIO_VSOCK_H */
+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. */
++	if (le16_to_cpu(pkt->hdr.type) == VIRTIO_VSOCK_TYPE_SEQPACKET)
++		return;
++
+ 	if (pkt->tap_delivered)
+ 		return;
+ 
+@@ -405,6 +410,19 @@ static u16 virtio_transport_get_type(struct sock *sk)
+ 		return VIRTIO_VSOCK_TYPE_SEQPACKET;
+ }
+ 
++bool virtio_transport_seqpacket_seq_send_len(struct vsock_sock *vsk, size_t len)
++{
++	struct virtio_vsock_pkt_info info = {
++		.type = VIRTIO_VSOCK_TYPE_SEQPACKET,
++		.op = VIRTIO_VSOCK_OP_SEQ_BEGIN,
++		.vsk = vsk,
++		.flags = len
++	};
++
++	return virtio_transport_send_pkt_info(vsk, &info);
++}
++EXPORT_SYMBOL_GPL(virtio_transport_seqpacket_seq_send_len);
++
+ static inline void virtio_transport_del_n_free_pkt(struct virtio_vsock_pkt *pkt)
+ {
+ 	list_del(&pkt->list);
+@@ -576,6 +594,18 @@ virtio_transport_stream_dequeue(struct vsock_sock *vsk,
+ }
+ EXPORT_SYMBOL_GPL(virtio_transport_stream_dequeue);
+ 
++ssize_t
++virtio_transport_seqpacket_dequeue(struct vsock_sock *vsk,
++				   struct msghdr *msg,
++				   size_t len, int flags)
++{
++	if (flags & MSG_PEEK)
++		return -EOPNOTSUPP;
++
++	return virtio_transport_seqpacket_do_dequeue(vsk, msg, len);
++}
++EXPORT_SYMBOL_GPL(virtio_transport_seqpacket_dequeue);
++
+ int
+ virtio_transport_dgram_dequeue(struct vsock_sock *vsk,
+ 			       struct msghdr *msg,
+@@ -659,14 +689,15 @@ EXPORT_SYMBOL_GPL(virtio_transport_do_socket_init);
+ void virtio_transport_notify_buffer_size(struct vsock_sock *vsk, u64 *val)
+ {
+ 	struct virtio_vsock_sock *vvs = vsk->trans;
++	int type;
+ 
+ 	if (*val > VIRTIO_VSOCK_MAX_BUF_SIZE)
+ 		*val = VIRTIO_VSOCK_MAX_BUF_SIZE;
+ 
+ 	vvs->buf_alloc = *val;
+ 
+-	virtio_transport_send_credit_update(vsk, VIRTIO_VSOCK_TYPE_STREAM,
+-					    NULL);
++	type = virtio_transport_get_type(sk_vsock(vsk));
++	virtio_transport_send_credit_update(vsk, type, NULL);
+ }
+ EXPORT_SYMBOL_GPL(virtio_transport_notify_buffer_size);
+ 
+@@ -793,10 +824,11 @@ int virtio_transport_connect(struct vsock_sock *vsk)
+ {
+ 	struct virtio_vsock_pkt_info info = {
+ 		.op = VIRTIO_VSOCK_OP_REQUEST,
+-		.type = VIRTIO_VSOCK_TYPE_STREAM,
+ 		.vsk = vsk,
+ 	};
+ 
++	info.type = virtio_transport_get_type(sk_vsock(vsk));
++
+ 	return virtio_transport_send_pkt_info(vsk, &info);
+ }
+ EXPORT_SYMBOL_GPL(virtio_transport_connect);
+@@ -805,7 +837,6 @@ int virtio_transport_shutdown(struct vsock_sock *vsk, int mode)
+ {
+ 	struct virtio_vsock_pkt_info info = {
+ 		.op = VIRTIO_VSOCK_OP_SHUTDOWN,
+-		.type = VIRTIO_VSOCK_TYPE_STREAM,
+ 		.flags = (mode & RCV_SHUTDOWN ?
+ 			  VIRTIO_VSOCK_SHUTDOWN_RCV : 0) |
+ 			 (mode & SEND_SHUTDOWN ?
+@@ -813,6 +844,8 @@ int virtio_transport_shutdown(struct vsock_sock *vsk, int mode)
+ 		.vsk = vsk,
+ 	};
+ 
++	info.type = virtio_transport_get_type(sk_vsock(vsk));
++
+ 	return virtio_transport_send_pkt_info(vsk, &info);
+ }
+ EXPORT_SYMBOL_GPL(virtio_transport_shutdown);
+@@ -834,12 +867,18 @@ virtio_transport_stream_enqueue(struct vsock_sock *vsk,
+ {
+ 	struct virtio_vsock_pkt_info info = {
+ 		.op = VIRTIO_VSOCK_OP_RW,
+-		.type = VIRTIO_VSOCK_TYPE_STREAM,
+ 		.msg = msg,
+ 		.pkt_len = len,
+ 		.vsk = vsk,
++		.flags = 0,
+ 	};
+ 
++	info.type = virtio_transport_get_type(sk_vsock(vsk));
++
++	if (info.type == VIRTIO_VSOCK_TYPE_SEQPACKET &&
++	    msg->msg_flags & MSG_EOR)
++		info.flags |= VIRTIO_VSOCK_RW_EOR;
++
+ 	return virtio_transport_send_pkt_info(vsk, &info);
+ }
+ EXPORT_SYMBOL_GPL(virtio_transport_stream_enqueue);
+@@ -857,7 +896,6 @@ static int virtio_transport_reset(struct vsock_sock *vsk,
+ {
+ 	struct virtio_vsock_pkt_info info = {
+ 		.op = VIRTIO_VSOCK_OP_RST,
+-		.type = VIRTIO_VSOCK_TYPE_STREAM,
+ 		.reply = !!pkt,
+ 		.vsk = vsk,
+ 	};
+@@ -866,6 +904,8 @@ static int virtio_transport_reset(struct vsock_sock *vsk,
+ 	if (pkt && le16_to_cpu(pkt->hdr.op) == VIRTIO_VSOCK_OP_RST)
+ 		return 0;
+ 
++	info.type = virtio_transport_get_type(sk_vsock(vsk));
++
+ 	return virtio_transport_send_pkt_info(vsk, &info);
+ }
+ 
+@@ -1177,13 +1217,14 @@ virtio_transport_send_response(struct vsock_sock *vsk,
+ {
+ 	struct virtio_vsock_pkt_info info = {
+ 		.op = VIRTIO_VSOCK_OP_RESPONSE,
+-		.type = VIRTIO_VSOCK_TYPE_STREAM,
+ 		.remote_cid = le64_to_cpu(pkt->hdr.src_cid),
+ 		.remote_port = le32_to_cpu(pkt->hdr.src_port),
+ 		.reply = true,
+ 		.vsk = vsk,
+ 	};
+ 
++	info.type = virtio_transport_get_type(sk_vsock(vsk));
++
+ 	return virtio_transport_send_pkt_info(vsk, &info);
+ }
+ 
 -- 
 2.25.1
 
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help