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

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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
>>
>



[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]

  Powered by Linux