lkml.org 
[lkml]   [2021]   [Mar]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC PATCH v6 07/22] af_vsock: rest of SEQPACKET support
    Date
    This does rest of SOCK_SEQPACKET support:
    1) Adds socket ops for SEQPACKET type.
    2) Allows to create socket with SEQPACKET type.

    Signed-off-by: Arseny Krasnov <arseny.krasnov@kaspersky.com>
    ---
    include/net/af_vsock.h | 1 +
    net/vmw_vsock/af_vsock.c | 36 +++++++++++++++++++++++++++++++++++-
    2 files changed, 36 insertions(+), 1 deletion(-)

    diff --git a/include/net/af_vsock.h b/include/net/af_vsock.h
    index aed306292ab3..ee16744ed4a8 100644
    --- a/include/net/af_vsock.h
    +++ b/include/net/af_vsock.h
    @@ -141,6 +141,7 @@ struct vsock_transport {
    int flags, bool *msg_ready);
    int (*seqpacket_enqueue)(struct vsock_sock *vsk, struct msghdr *msg,
    int flags, size_t len);
    + bool (*seqpacket_allow)(void);

    /* Notification. */
    int (*notify_poll_in)(struct vsock_sock *, size_t, bool *);
    diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c
    index a031f165494d..673eb0de79fe 100644
    --- a/net/vmw_vsock/af_vsock.c
    +++ b/net/vmw_vsock/af_vsock.c
    @@ -452,6 +452,7 @@ int vsock_assign_transport(struct vsock_sock *vsk, struct vsock_sock *psk)
    new_transport = transport_dgram;
    break;
    case SOCK_STREAM:
    + case SOCK_SEQPACKET:
    if (vsock_use_local_transport(remote_cid))
    new_transport = transport_local;
    else if (remote_cid <= VMADDR_CID_HOST || !transport_h2g ||
    @@ -484,6 +485,14 @@ int vsock_assign_transport(struct vsock_sock *vsk, struct vsock_sock *psk)
    if (!new_transport || !try_module_get(new_transport->module))
    return -ENODEV;

    + if (sk->sk_type == SOCK_SEQPACKET) {
    + if (!new_transport->seqpacket_allow ||
    + !new_transport->seqpacket_allow()) {
    + module_put(new_transport->module);
    + return -ESOCKTNOSUPPORT;
    + }
    + }
    +
    ret = new_transport->init(vsk, psk);
    if (ret) {
    module_put(new_transport->module);
    @@ -684,6 +693,7 @@ static int __vsock_bind(struct sock *sk, struct sockaddr_vm *addr)

    switch (sk->sk_socket->type) {
    case SOCK_STREAM:
    + case SOCK_SEQPACKET:
    spin_lock_bh(&vsock_table_lock);
    retval = __vsock_bind_connectible(vsk, addr);
    spin_unlock_bh(&vsock_table_lock);
    @@ -769,7 +779,7 @@ static struct sock *__vsock_create(struct net *net,

    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)
    @@ -2182,6 +2192,27 @@ static const struct proto_ops vsock_stream_ops = {
    .sendpage = sock_no_sendpage,
    };

    +static const struct proto_ops vsock_seqpacket_ops = {
    + .family = PF_VSOCK,
    + .owner = THIS_MODULE,
    + .release = vsock_release,
    + .bind = vsock_bind,
    + .connect = vsock_connect,
    + .socketpair = sock_no_socketpair,
    + .accept = vsock_accept,
    + .getname = vsock_getname,
    + .poll = vsock_poll,
    + .ioctl = sock_no_ioctl,
    + .listen = vsock_listen,
    + .shutdown = vsock_shutdown,
    + .setsockopt = vsock_connectible_setsockopt,
    + .getsockopt = vsock_connectible_getsockopt,
    + .sendmsg = vsock_connectible_sendmsg,
    + .recvmsg = vsock_connectible_recvmsg,
    + .mmap = sock_no_mmap,
    + .sendpage = sock_no_sendpage,
    +};
    +
    static int vsock_create(struct net *net, struct socket *sock,
    int protocol, int kern)
    {
    @@ -2202,6 +2233,9 @@ static int vsock_create(struct net *net, struct socket *sock,
    case SOCK_STREAM:
    sock->ops = &vsock_stream_ops;
    break;
    + case SOCK_SEQPACKET:
    + sock->ops = &vsock_seqpacket_ops;
    + break;
    default:
    return -ESOCKTNOSUPPORT;
    }
    --
    2.25.1
    \
     
     \ /
      Last update: 2021-03-07 19:02    [W:2.530 / U:0.048 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site