1  // SPDX-License-Identifier: GPL-2.0-only
2  /*
3   * VMware vSockets Driver
4   *
5   * Copyright (C) 2007-2012 VMware, Inc. All rights reserved.
6   */
7  
8  #include <linux/types.h>
9  #include <linux/socket.h>
10  #include <linux/stddef.h>
11  #include <net/sock.h>
12  #include <net/vsock_addr.h>
13  
vsock_addr_init(struct sockaddr_vm * addr,u32 cid,u32 port)14  void vsock_addr_init(struct sockaddr_vm *addr, u32 cid, u32 port)
15  {
16  	memset(addr, 0, sizeof(*addr));
17  	addr->svm_family = AF_VSOCK;
18  	addr->svm_cid = cid;
19  	addr->svm_port = port;
20  }
21  EXPORT_SYMBOL_GPL(vsock_addr_init);
22  
vsock_addr_validate(const struct sockaddr_vm * addr)23  int vsock_addr_validate(const struct sockaddr_vm *addr)
24  {
25  	__u8 svm_valid_flags = VMADDR_FLAG_TO_HOST;
26  
27  	if (!addr)
28  		return -EFAULT;
29  
30  	if (addr->svm_family != AF_VSOCK)
31  		return -EAFNOSUPPORT;
32  
33  	if (addr->svm_flags & ~svm_valid_flags)
34  		return -EINVAL;
35  
36  	return 0;
37  }
38  EXPORT_SYMBOL_GPL(vsock_addr_validate);
39  
vsock_addr_bound(const struct sockaddr_vm * addr)40  bool vsock_addr_bound(const struct sockaddr_vm *addr)
41  {
42  	return addr->svm_port != VMADDR_PORT_ANY;
43  }
44  EXPORT_SYMBOL_GPL(vsock_addr_bound);
45  
vsock_addr_unbind(struct sockaddr_vm * addr)46  void vsock_addr_unbind(struct sockaddr_vm *addr)
47  {
48  	vsock_addr_init(addr, VMADDR_CID_ANY, VMADDR_PORT_ANY);
49  }
50  EXPORT_SYMBOL_GPL(vsock_addr_unbind);
51  
vsock_addr_equals_addr(const struct sockaddr_vm * addr,const struct sockaddr_vm * other)52  bool vsock_addr_equals_addr(const struct sockaddr_vm *addr,
53  			    const struct sockaddr_vm *other)
54  {
55  	return addr->svm_cid == other->svm_cid &&
56  		addr->svm_port == other->svm_port;
57  }
58  EXPORT_SYMBOL_GPL(vsock_addr_equals_addr);
59  
vsock_addr_cast(const struct sockaddr * addr,size_t len,struct sockaddr_vm ** out_addr)60  int vsock_addr_cast(const struct sockaddr *addr,
61  		    size_t len, struct sockaddr_vm **out_addr)
62  {
63  	if (len < sizeof(**out_addr))
64  		return -EFAULT;
65  
66  	*out_addr = (struct sockaddr_vm *)addr;
67  	return vsock_addr_validate(*out_addr);
68  }
69  EXPORT_SYMBOL_GPL(vsock_addr_cast);
70