--- v8
+++ v3
@@ -1,16 +1,19 @@
-This prepares af_vsock.c for SEQPACKET support: some functions such
-as setsockopt(), getsockopt(), connect(), recvmsg(), sendmsg() are
-shared between both types of sockets, so rename them in general
-manner.
+This prepares af_vsock.c for SEQPACKET support:
+1) As both stream and seqpacket sockets are connection oriented, add
+ check for SOCK_SEQPACKET to conditions where SOCK_STREAM is checked.
+2) Some functions such as setsockopt(), getsockopt(), connect(),
+ recvmsg(), sendmsg() are shared between both types of sockets, so
+ rename them in general manner and create entry points for each type
+ of socket to call these functions(for stream in this patch, for
+ seqpacket in further patches).
Signed-off-by: Arseny Krasnov <arseny.krasnov@kaspersky.com>
-Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
---
- net/vmw_vsock/af_vsock.c | 64 +++++++++++++++++++++-------------------
- 1 file changed, 34 insertions(+), 30 deletions(-)
+ net/vmw_vsock/af_vsock.c | 91 +++++++++++++++++++++++++++++-----------
+ 1 file changed, 67 insertions(+), 24 deletions(-)
diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c
-index bc7fb9bf3351..35fcab370885 100644
+index b12d3a322242..c9ce57db9554 100644
--- a/net/vmw_vsock/af_vsock.c
+++ b/net/vmw_vsock/af_vsock.c
@@ -604,8 +604,8 @@ static void vsock_pending_work(struct work_struct *work)
@@ -33,19 +36,19 @@
spin_unlock_bh(&vsock_table_lock);
break;
-@@ -768,6 +768,11 @@ static struct sock *__vsock_create(struct net *net,
+@@ -767,6 +767,11 @@ static struct sock *__vsock_create(struct net *net,
return sk;
}
+static bool sock_type_connectible(u16 type)
+{
-+ return type == SOCK_STREAM;
++ return (type == SOCK_STREAM || type == SOCK_SEQPACKET);
+}
+
static void __vsock_release(struct sock *sk, int level)
{
if (sk) {
-@@ -786,7 +791,7 @@ static void __vsock_release(struct sock *sk, int level)
+@@ -785,7 +790,7 @@ static void __vsock_release(struct sock *sk, int level)
if (vsk->transport)
vsk->transport->release(vsk);
@@ -54,34 +57,34 @@
vsock_remove_sock(vsk);
sock_orphan(sk);
-@@ -948,7 +953,7 @@ static int vsock_shutdown(struct socket *sock, int mode)
- lock_sock(sk);
+@@ -945,7 +950,7 @@ static int vsock_shutdown(struct socket *sock, int mode)
+ sk = sock->sk;
if (sock->state == SS_UNCONNECTED) {
err = -ENOTCONN;
- if (sk->sk_type == SOCK_STREAM)
+ if (sock_type_connectible(sk->sk_type))
- goto out;
+ return err;
} else {
sock->state = SS_DISCONNECTING;
-@@ -961,7 +966,7 @@ static int vsock_shutdown(struct socket *sock, int mode)
- sk->sk_shutdown |= mode;
+@@ -960,7 +965,7 @@ static int vsock_shutdown(struct socket *sock, int mode)
sk->sk_state_change(sk);
+ release_sock(sk);
- if (sk->sk_type == SOCK_STREAM) {
+ if (sock_type_connectible(sk->sk_type)) {
sock_reset_flag(sk, SOCK_DONE);
vsock_send_shutdown(sk, mode);
}
-@@ -1016,7 +1021,7 @@ static __poll_t vsock_poll(struct file *file, struct socket *sock,
+@@ -1013,7 +1018,7 @@ static __poll_t vsock_poll(struct file *file, struct socket *sock,
if (!(sk->sk_shutdown & SEND_SHUTDOWN))
mask |= EPOLLOUT | EPOLLWRNORM | EPOLLWRBAND;
- } else if (sock->type == SOCK_STREAM) {
+ } else if (sock_type_connectible(sk->sk_type)) {
- const struct vsock_transport *transport;
-
+ const struct vsock_transport *transport = vsk->transport;
lock_sock(sk);
-@@ -1263,8 +1268,8 @@ static void vsock_connect_timeout(struct work_struct *work)
+
+@@ -1259,8 +1264,8 @@ static void vsock_connect_timeout(struct work_struct *work)
sock_put(sk);
}
@@ -92,7 +95,20 @@
{
int err;
struct sock *sk;
-@@ -1414,7 +1419,7 @@ static int vsock_accept(struct socket *sock, struct socket *newsock, int flags,
+@@ -1395,6 +1400,12 @@ static int vsock_stream_connect(struct socket *sock, struct sockaddr *addr,
+ return err;
+ }
+
++static int vsock_stream_connect(struct socket *sock, struct sockaddr *addr,
++ int addr_len, int flags)
++{
++ return vsock_connect(sock, addr, addr_len, flags);
++}
++
+ static int vsock_accept(struct socket *sock, struct socket *newsock, int flags,
+ bool kern)
+ {
+@@ -1410,7 +1421,7 @@ static int vsock_accept(struct socket *sock, struct socket *newsock, int flags,
lock_sock(listener);
@@ -101,7 +117,7 @@
err = -EOPNOTSUPP;
goto out;
}
-@@ -1491,7 +1496,7 @@ static int vsock_listen(struct socket *sock, int backlog)
+@@ -1487,7 +1498,7 @@ static int vsock_listen(struct socket *sock, int backlog)
lock_sock(sk);
@@ -110,7 +126,7 @@
err = -EOPNOTSUPP;
goto out;
}
-@@ -1535,11 +1540,11 @@ static void vsock_update_buffer_size(struct vsock_sock *vsk,
+@@ -1531,11 +1542,11 @@ static void vsock_update_buffer_size(struct vsock_sock *vsk,
vsk->buffer_size = val;
}
@@ -127,7 +143,7 @@
{
int err;
struct sock *sk;
-@@ -1617,10 +1622,10 @@ static int vsock_stream_setsockopt(struct socket *sock,
+@@ -1612,10 +1623,20 @@ static int vsock_stream_setsockopt(struct socket *sock,
return err;
}
@@ -135,6 +151,16 @@
- int level, int optname,
- char __user *optval,
- int __user *optlen)
++static int vsock_stream_setsockopt(struct socket *sock,
++ int level,
++ int optname,
++ sockptr_t optval,
++ unsigned int optlen)
++{
++ return vsock_connectible_setsockopt(sock, level, optname, optval,
++ optlen);
++}
++
+static int vsock_connectible_getsockopt(struct socket *sock,
+ int level, int optname,
+ char __user *optval,
@@ -142,22 +168,37 @@
{
int err;
int len;
-@@ -1688,8 +1693,8 @@ static int vsock_stream_getsockopt(struct socket *sock,
+@@ -1683,8 +1704,17 @@ static int vsock_stream_getsockopt(struct socket *sock,
return 0;
}
-static int vsock_stream_sendmsg(struct socket *sock, struct msghdr *msg,
- size_t len)
++static int vsock_stream_getsockopt(struct socket *sock,
++ int level, int optname,
++ char __user *optval,
++ int __user *optlen)
++{
++ return vsock_connectible_getsockopt(sock, level, optname, optval,
++ optlen);
++}
++
+static int vsock_connectible_sendmsg(struct socket *sock, struct msghdr *msg,
+ size_t len)
{
struct sock *sk;
struct vsock_sock *vsk;
-@@ -1828,10 +1833,9 @@ static int vsock_stream_sendmsg(struct socket *sock, struct msghdr *msg,
- return err;
- }
-
--
+@@ -1822,10 +1852,16 @@ static int vsock_stream_sendmsg(struct socket *sock, struct msghdr *msg,
+ return err;
+ }
+
++static int vsock_stream_sendmsg(struct socket *sock, struct msghdr *msg,
++ size_t len)
++{
++ return vsock_connectible_sendmsg(sock, msg, len);
++}
++
+
static int
-vsock_stream_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
- int flags)
@@ -166,30 +207,20 @@
{
struct sock *sk;
struct vsock_sock *vsk;
-@@ -2007,7 +2011,7 @@ static const struct proto_ops vsock_stream_ops = {
+@@ -1995,6 +2031,13 @@ vsock_stream_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
+ return err;
+ }
+
++static int
++vsock_stream_recvmsg(struct socket *sock, struct msghdr *msg, size_t len,
++ int flags)
++{
++ return vsock_connectible_recvmsg(sock, msg, len, flags);
++}
++
+ static const struct proto_ops vsock_stream_ops = {
+ .family = PF_VSOCK,
.owner = THIS_MODULE,
- .release = vsock_release,
- .bind = vsock_bind,
-- .connect = vsock_stream_connect,
-+ .connect = vsock_connect,
- .socketpair = sock_no_socketpair,
- .accept = vsock_accept,
- .getname = vsock_getname,
-@@ -2015,10 +2019,10 @@ static const struct proto_ops vsock_stream_ops = {
- .ioctl = sock_no_ioctl,
- .listen = vsock_listen,
- .shutdown = vsock_shutdown,
-- .setsockopt = vsock_stream_setsockopt,
-- .getsockopt = vsock_stream_getsockopt,
-- .sendmsg = vsock_stream_sendmsg,
-- .recvmsg = vsock_stream_recvmsg,
-+ .setsockopt = vsock_connectible_setsockopt,
-+ .getsockopt = vsock_connectible_getsockopt,
-+ .sendmsg = vsock_connectible_sendmsg,
-+ .recvmsg = vsock_connectible_recvmsg,
- .mmap = sock_no_mmap,
- .sendpage = sock_no_sendpage,
- };
--
2.25.1