@@ -28,15 +28,15 @@ index 66a0f060770e..d49a46b421ae 100644
2828+++ b/drivers/vhost/vsock.c
2929@@ -421,9 +421,11 @@ static struct virtio_transport vhost_transport = {
3030 .cancel_pkt = vhost_transport_cancel_pkt,
31-
31+
3232 .dgram_enqueue = virtio_transport_dgram_enqueue,
3333- .dgram_dequeue = virtio_transport_dgram_dequeue,
3434 .dgram_bind = virtio_transport_dgram_bind,
3535 .dgram_allow = virtio_transport_dgram_allow,
3636+ .dgram_get_cid = virtio_transport_dgram_get_cid,
3737+ .dgram_get_port = virtio_transport_dgram_get_port,
3838+ .dgram_get_length = virtio_transport_dgram_get_length,
39-
39+
4040 .stream_enqueue = virtio_transport_stream_enqueue,
4141 .stream_dequeue = virtio_transport_stream_dequeue,
4242diff --git a/include/linux/virtio_vsock.h b/include/linux/virtio_vsock.h
@@ -50,15 +50,15 @@ index 6c00687539cf..7df9b94e65fa 100644
5050+ int virtio_transport_dgram_get_cid(struct sk_buff *skb, unsigned int *cid);
5151+ int virtio_transport_dgram_get_port(struct sk_buff *skb, unsigned int *port);
5252+ int virtio_transport_dgram_get_length(struct sk_buff *skb, size_t *len);
53-
53+
5454 int virtio_transport_connect(struct vsock_sock *vsk);
55-
55+
5656diff --git a/include/net/af_vsock.h b/include/net/af_vsock.h
5757index 70302c92d329..9ba6e2bcef94 100644
5858--- a/include/net/af_vsock.h
5959+++ b/include/net/af_vsock.h
6060@@ -120,11 +120,20 @@ struct vsock_transport {
61-
61+
6262 /* DGRAM. */
6363 int (*dgram_bind)(struct vsock_sock *, struct sockaddr_vm *);
6464- int (*dgram_dequeue)(struct vsock_sock *vsk, struct msghdr *msg,
@@ -77,7 +77,7 @@ index 70302c92d329..9ba6e2bcef94 100644
7777+ * header.
7878+ */
7979+ const size_t dgram_payload_offset;
80-
80+
8181 /* STREAM. */
8282 /* TODO: stream_bind() */
8383diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c
@@ -99,7 +99,7 @@ index ef519b55a3d9..784139c2717d 100644
9999+
100100+ sk = sock->sk;
101101+ vsk = vsock_sk(sk);
102-
102+
103103- return vsk->transport->dgram_dequeue(vsk, msg, len, flags);
104104+ if (flags & MSG_OOB || flags & MSG_ERRQUEUE)
105105+ return -EOPNOTSUPP;
@@ -148,7 +148,7 @@ index ef519b55a3d9..784139c2717d 100644
148148+ skb_free_datagram(&vsk->sk, skb);
149149+ return err;
150150 }
151-
151+
152152 int vsock_dgram_recvmsg(struct socket *sock, struct msghdr *msg,
153153diff --git a/net/vmw_vsock/hyperv_transport.c b/net/vmw_vsock/hyperv_transport.c
154154index 56c232cf5b0f..cc0a6c3401d3 100644
@@ -157,7 +157,7 @@ index 56c232cf5b0f..cc0a6c3401d3 100644
157157@@ -557,8 +557,17 @@ static int hvs_dgram_bind(struct vsock_sock *vsk, struct sockaddr_vm *addr)
158158 return -EOPNOTSUPP;
159159 }
160-
160+
161161- static int hvs_dgram_dequeue(struct vsock_sock *vsk, struct msghdr *msg,
162162- size_t len, int flags)
163163+ static int hvs_dgram_get_cid(struct sk_buff *skb, unsigned int *cid)
@@ -176,30 +176,30 @@ index 56c232cf5b0f..cc0a6c3401d3 100644
176176 }
177177@@ -834,7 +843,9 @@ static struct vsock_transport hvs_transport = {
178178 .shutdown = hvs_shutdown,
179-
179+
180180 .dgram_bind = hvs_dgram_bind,
181181- .dgram_dequeue = hvs_dgram_dequeue,
182182+ .dgram_get_cid = hvs_dgram_get_cid,
183183+ .dgram_get_port = hvs_dgram_get_port,
184184+ .dgram_get_length = hvs_dgram_get_length,
185185 .dgram_enqueue = hvs_dgram_enqueue,
186186 .dgram_allow = hvs_dgram_allow,
187-
187+
188188diff --git a/net/vmw_vsock/virtio_transport.c b/net/vmw_vsock/virtio_transport.c
189189index 1ef6f7829d29..4751acddd117 100644
190190--- a/net/vmw_vsock/virtio_transport.c
191191+++ b/net/vmw_vsock/virtio_transport.c
192192@@ -552,9 +552,11 @@ static struct virtio_transport virtio_transport = {
193193 .cancel_pkt = virtio_transport_cancel_pkt,
194-
194+
195195 .dgram_bind = virtio_transport_dgram_bind,
196196- .dgram_dequeue = virtio_transport_dgram_dequeue,
197197 .dgram_enqueue = virtio_transport_dgram_enqueue,
198198 .dgram_allow = virtio_transport_dgram_allow,
199199+ .dgram_get_cid = virtio_transport_dgram_get_cid,
200200+ .dgram_get_port = virtio_transport_dgram_get_port,
201201+ .dgram_get_length = virtio_transport_dgram_get_length,
202-
202+
203203 .stream_dequeue = virtio_transport_stream_dequeue,
204204 .stream_enqueue = virtio_transport_stream_enqueue,
205205diff --git a/net/vmw_vsock/virtio_transport_common.c b/net/vmw_vsock/virtio_transport_common.c
@@ -209,7 +209,7 @@ index 2c9b1011cdcc..ad4dedcfa320 100644
209209@@ -1054,6 +1054,24 @@ int virtio_transport_dgram_bind(struct vsock_sock *vsk,
210210 }
211211 EXPORT_SYMBOL_GPL(virtio_transport_dgram_bind);
212-
212+
213213+ int virtio_transport_dgram_get_cid(struct sk_buff *skb, unsigned int *cid)
214214+ {
215215+ return -EOPNOTSUPP;
@@ -238,7 +238,7 @@ index 7eccd6708d66..dea4f9474228 100644
238238@@ -1731,57 +1731,40 @@ static int vmci_transport_dgram_enqueue(
239239 return err - sizeof(*dg);
240240 }
241-
241+
242242- static int vmci_transport_dgram_dequeue(struct vsock_sock *vsk,
243243- struct msghdr *msg, size_t len,
244244- int flags)
@@ -248,13 +248,13 @@ index 7eccd6708d66..dea4f9474228 100644
248248 struct vmci_datagram *dg;
249249- size_t payload_len;
250250- struct sk_buff *skb;
251-
251+
252252- if (flags & MSG_OOB || flags & MSG_ERRQUEUE)
253253- return -EOPNOTSUPP;
254254+ dg = (struct vmci_datagram *)skb->data;
255255+ if (!dg)
256256+ return -EINVAL;
257-
257+
258258- /* Retrieve the head sk_buff from the socket's receive queue. */
259259- err = 0;
260260- skb = skb_recv_datagram(&vsk->sk, flags, &err);
@@ -267,7 +267,7 @@ index 7eccd6708d66..dea4f9474228 100644
267267+ static int vmci_transport_dgram_get_port(struct sk_buff *skb, unsigned int *port)
268268+ {
269269+ struct vmci_datagram *dg;
270-
270+
271271 dg = (struct vmci_datagram *)skb->data;
272272 if (!dg)
273273- /* err is 0, meaning we read zero bytes. */
@@ -280,23 +280,23 @@ index 7eccd6708d66..dea4f9474228 100644
280280- goto out;
281281- }
282282+ return -EINVAL;
283-
283+
284284- if (payload_len > len) {
285285- payload_len = len;
286286- msg->msg_flags |= MSG_TRUNC;
287287- }
288288+ *port = dg->src.resource;
289289+ return 0;
290290+ }
291-
291+
292292- /* Place the datagram payload in the user's iovec. */
293293- err = skb_copy_datagram_msg(skb, sizeof(*dg), msg, payload_len);
294294- if (err)
295295- goto out;
296296+ static int vmci_transport_dgram_get_length(struct sk_buff *skb, size_t *len)
297297+ {
298298+ struct vmci_datagram *dg;
299-
299+
300300- if (msg->msg_name) {
301301- /* Provide the address of the sender. */
302302- DECLARE_SOCKADDR(struct sockaddr_vm *, vm_addr, msg->msg_name);
@@ -307,14 +307,14 @@ index 7eccd6708d66..dea4f9474228 100644
307307+ dg = (struct vmci_datagram *)skb->data;
308308+ if (!dg)
309309+ return -EINVAL;
310-
310+
311311- out:
312312- skb_free_datagram(&vsk->sk, skb);
313313- return err;
314314+ *len = dg->payload_size;
315315+ return 0;
316316 }
317-
317+
318318 static bool vmci_transport_dgram_allow(u32 cid, u32 port)
319319@@ -2040,9 +2023,12 @@ static struct vsock_transport vmci_transport = {
320320 .release = vmci_transport_release,
@@ -336,17 +336,17 @@ index 6e78927a598e..3d5e05d8950f 100644
336336+++ b/net/vmw_vsock/vsock_loopback.c
337337@@ -66,9 +66,11 @@ static struct virtio_transport loopback_transport = {
338338 .cancel_pkt = vsock_loopback_cancel_pkt,
339-
339+
340340 .dgram_bind = virtio_transport_dgram_bind,
341341- .dgram_dequeue = virtio_transport_dgram_dequeue,
342342 .dgram_enqueue = virtio_transport_dgram_enqueue,
343343 .dgram_allow = virtio_transport_dgram_allow,
344344+ .dgram_get_cid = virtio_transport_dgram_get_cid,
345345+ .dgram_get_port = virtio_transport_dgram_get_port,
346346+ .dgram_get_length = virtio_transport_dgram_get_length,
347-
347+
348348 .stream_dequeue = virtio_transport_stream_dequeue,
349349 .stream_enqueue = virtio_transport_stream_enqueue,
350- - -
350+ - -
3513512.50.0
352352
0 commit comments