Re: [RFC PATCH v4 07/17] af_vsock: rest of SEQPACKET support

From: Arseny Krasnov
Date: Mon Feb 15 2021 - 04:13:24 EST



On 11.02.2021 15:27, Stefano Garzarella wrote:
> On Sun, Feb 07, 2021 at 06:16:12PM +0300, Arseny Krasnov wrote:
>> 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@xxxxxxxxxxxxx>
>> ---
>> net/vmw_vsock/af_vsock.c | 37 ++++++++++++++++++++++++++++++++++++-
>> 1 file changed, 36 insertions(+), 1 deletion(-)
>>
>> diff --git a/net/vmw_vsock/af_vsock.c b/net/vmw_vsock/af_vsock.c
>> index a033d3340ac4..c77998a14018 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 ||
>> @@ -459,6 +460,15 @@ int vsock_assign_transport(struct vsock_sock *vsk, struct vsock_sock *psk)
>> new_transport = transport_g2h;
>> else
>> new_transport = transport_h2g;
>> +
>> + if (sk->sk_type == SOCK_SEQPACKET) {
>> + if (!new_transport ||
>> + !new_transport->seqpacket_seq_send_len ||
>> + !new_transport->seqpacket_seq_send_eor ||
>> + !new_transport->seqpacket_seq_get_len ||
>> + !new_transport->seqpacket_dequeue)
>> + return -ESOCKTNOSUPPORT;
>> + }
> Maybe we should move this check after the try_module_get() call, since
> the memory pointed by 'new_transport' pointer can be deallocated in the
> meantime.
>
> Also, if the socket had a transport before, we should deassign it before
> returning an error.

I think previous transport is deassigned immediately after this

'switch()' on sk->sk_type:

if (vsk->transport) {

    ...

    vsock_deassign_transport(vsk);

}


Ok, check will be moved after 'try_module_get()'.

>
>> break;
>> default:
>> return -ESOCKTNOSUPPORT;
>> @@ -684,6 +694,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 +780,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)
>> @@ -2199,6 +2210,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)
>> {
>> @@ -2219,6 +2251,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
>>
>