Skip to content

Commit

Permalink
vsock: make vsock bind reusable
Browse files Browse the repository at this point in the history
This commit makes the bind table management functions in vsock usable
for different bind tables. For use by datagrams in a future patch.

Signed-off-by: Bobby Eshleman <bobby.eshleman@bytedance.com>
  • Loading branch information
Bobby Eshleman authored and intel-lab-lkp committed May 31, 2023
1 parent 0b3dde4 commit f69c7f6
Showing 1 changed file with 39 additions and 7 deletions.
46 changes: 39 additions & 7 deletions net/vmw_vsock/af_vsock.c
Original file line number Diff line number Diff line change
Expand Up @@ -230,11 +230,12 @@ static void __vsock_remove_connected(struct vsock_sock *vsk)
sock_put(&vsk->sk);
}

static struct sock *__vsock_find_bound_socket(struct sockaddr_vm *addr)
struct sock *vsock_find_bound_socket_common(struct sockaddr_vm *addr,
struct list_head *bind_table)
{
struct vsock_sock *vsk;

list_for_each_entry(vsk, vsock_bound_sockets(addr), bound_table) {
list_for_each_entry(vsk, bind_table, bound_table) {
if (vsock_addr_equals_addr(addr, &vsk->local_addr))
return sk_vsock(vsk);

Expand All @@ -247,6 +248,11 @@ static struct sock *__vsock_find_bound_socket(struct sockaddr_vm *addr)
return NULL;
}

static struct sock *__vsock_find_bound_socket(struct sockaddr_vm *addr)
{
return vsock_find_bound_socket_common(addr, vsock_bound_sockets(addr));
}

static struct sock *__vsock_find_connected_socket(struct sockaddr_vm *src,
struct sockaddr_vm *dst)
{
Expand Down Expand Up @@ -643,12 +649,17 @@ static void vsock_pending_work(struct work_struct *work)

/**** SOCKET OPERATIONS ****/

static int __vsock_bind_connectible(struct vsock_sock *vsk,
struct sockaddr_vm *addr)
int vsock_bind_common(struct vsock_sock *vsk,
struct sockaddr_vm *addr,
struct list_head *bind_table,
size_t table_size)
{
static u32 port;
struct sockaddr_vm new_addr;

if (table_size < VSOCK_HASH_SIZE)
return -1;

if (!port)
port = get_random_u32_above(LAST_RESERVED_PORT);

Expand All @@ -664,7 +675,8 @@ static int __vsock_bind_connectible(struct vsock_sock *vsk,

new_addr.svm_port = port++;

if (!__vsock_find_bound_socket(&new_addr)) {
if (!vsock_find_bound_socket_common(&new_addr,
&bind_table[VSOCK_HASH(addr)])) {
found = true;
break;
}
Expand All @@ -681,7 +693,8 @@ static int __vsock_bind_connectible(struct vsock_sock *vsk,
return -EACCES;
}

if (__vsock_find_bound_socket(&new_addr))
if (vsock_find_bound_socket_common(&new_addr,
&bind_table[VSOCK_HASH(addr)]))
return -EADDRINUSE;
}

Expand All @@ -693,11 +706,30 @@ static int __vsock_bind_connectible(struct vsock_sock *vsk,
* by AF_UNIX.
*/
__vsock_remove_bound(vsk);
__vsock_insert_bound(vsock_bound_sockets(&vsk->local_addr), vsk);
__vsock_insert_bound(&bind_table[VSOCK_HASH(&vsk->local_addr)], vsk);

return 0;
}

static int __vsock_bind_connectible(struct vsock_sock *vsk,
struct sockaddr_vm *addr)
{
return vsock_bind_common(vsk, addr, vsock_bind_table, VSOCK_HASH_SIZE + 1);
}

int vsock_bind_stream(struct vsock_sock *vsk,
struct sockaddr_vm *addr)
{
int retval;

spin_lock_bh(&vsock_table_lock);
retval = __vsock_bind_connectible(vsk, addr);
spin_unlock_bh(&vsock_table_lock);

return retval;
}
EXPORT_SYMBOL(vsock_bind_stream);

static int __vsock_bind_dgram(struct vsock_sock *vsk,
struct sockaddr_vm *addr)
{
Expand Down

0 comments on commit f69c7f6

Please sign in to comment.