Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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: Arseny Krasnov <arseny.krasnov@kaspersky.com>
Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Arseny Krasnov and committed by
David S. Miller
fbe70c48 9942c192

+17 -5
+2
include/net/af_vsock.h
··· 138 138 /* SEQ_PACKET. */ 139 139 ssize_t (*seqpacket_dequeue)(struct vsock_sock *vsk, struct msghdr *msg, 140 140 int flags); 141 + int (*seqpacket_enqueue)(struct vsock_sock *vsk, struct msghdr *msg, 142 + size_t len); 141 143 142 144 /* Notification. */ 143 145 int (*notify_poll_in)(struct vsock_sock *, size_t, bool *);
+15 -5
net/vmw_vsock/af_vsock.c
··· 1808 1808 * responsibility to check how many bytes we were able to send. 1809 1809 */ 1810 1810 1811 - written = transport->stream_enqueue( 1812 - vsk, msg, 1813 - len - total_written); 1811 + if (sk->sk_type == SOCK_SEQPACKET) { 1812 + written = transport->seqpacket_enqueue(vsk, 1813 + msg, len - total_written); 1814 + } else { 1815 + written = transport->stream_enqueue(vsk, 1816 + msg, len - total_written); 1817 + } 1814 1818 if (written < 0) { 1815 1819 err = -ENOMEM; 1816 1820 goto out_err; ··· 1830 1826 } 1831 1827 1832 1828 out_err: 1833 - if (total_written > 0) 1834 - err = total_written; 1829 + if (total_written > 0) { 1830 + /* Return number of written bytes only if: 1831 + * 1) SOCK_STREAM socket. 1832 + * 2) SOCK_SEQPACKET socket when whole buffer is sent. 1833 + */ 1834 + if (sk->sk_type == SOCK_STREAM || total_written == len) 1835 + err = total_written; 1836 + } 1835 1837 out: 1836 1838 release_sock(sk); 1837 1839 return err;