Commit fbe70c48 authored by Arseny Krasnov's avatar Arseny Krasnov Committed by David S. Miller

af_vsock: implement send logic for SEQPACKET

Update current stream enqueue function for SEQPACKET
support:
1) Call transport's seqpacket enqueue callback.
2) Return value from enqueue function is whole record length or error
   for SOCK_SEQPACKET.
Signed-off-by: default avatarArseny Krasnov <arseny.krasnov@kaspersky.com>
Reviewed-by: default avatarStefano Garzarella <sgarzare@redhat.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 9942c192
...@@ -138,6 +138,8 @@ struct vsock_transport { ...@@ -138,6 +138,8 @@ struct vsock_transport {
/* SEQ_PACKET. */ /* SEQ_PACKET. */
ssize_t (*seqpacket_dequeue)(struct vsock_sock *vsk, struct msghdr *msg, ssize_t (*seqpacket_dequeue)(struct vsock_sock *vsk, struct msghdr *msg,
int flags); int flags);
int (*seqpacket_enqueue)(struct vsock_sock *vsk, struct msghdr *msg,
size_t len);
/* Notification. */ /* Notification. */
int (*notify_poll_in)(struct vsock_sock *, size_t, bool *); int (*notify_poll_in)(struct vsock_sock *, size_t, bool *);
......
...@@ -1808,9 +1808,13 @@ static int vsock_connectible_sendmsg(struct socket *sock, struct msghdr *msg, ...@@ -1808,9 +1808,13 @@ static int vsock_connectible_sendmsg(struct socket *sock, struct msghdr *msg,
* responsibility to check how many bytes we were able to send. * responsibility to check how many bytes we were able to send.
*/ */
written = transport->stream_enqueue( if (sk->sk_type == SOCK_SEQPACKET) {
vsk, msg, written = transport->seqpacket_enqueue(vsk,
len - total_written); msg, len - total_written);
} else {
written = transport->stream_enqueue(vsk,
msg, len - total_written);
}
if (written < 0) { if (written < 0) {
err = -ENOMEM; err = -ENOMEM;
goto out_err; goto out_err;
...@@ -1826,8 +1830,14 @@ static int vsock_connectible_sendmsg(struct socket *sock, struct msghdr *msg, ...@@ -1826,8 +1830,14 @@ static int vsock_connectible_sendmsg(struct socket *sock, struct msghdr *msg,
} }
out_err: out_err:
if (total_written > 0) if (total_written > 0) {
err = total_written; /* Return number of written bytes only if:
* 1) SOCK_STREAM socket.
* 2) SOCK_SEQPACKET socket when whole buffer is sent.
*/
if (sk->sk_type == SOCK_STREAM || total_written == len)
err = total_written;
}
out: out:
release_sock(sk); release_sock(sk);
return err; return err;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment