0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/types.h>
0009 #include <linux/socket.h>
0010 #include <linux/stddef.h>
0011 #include <net/sock.h>
0012 #include <net/vsock_addr.h>
0013
0014 void vsock_addr_init(struct sockaddr_vm *addr, u32 cid, u32 port)
0015 {
0016 memset(addr, 0, sizeof(*addr));
0017 addr->svm_family = AF_VSOCK;
0018 addr->svm_cid = cid;
0019 addr->svm_port = port;
0020 }
0021 EXPORT_SYMBOL_GPL(vsock_addr_init);
0022
0023 int vsock_addr_validate(const struct sockaddr_vm *addr)
0024 {
0025 __u8 svm_valid_flags = VMADDR_FLAG_TO_HOST;
0026
0027 if (!addr)
0028 return -EFAULT;
0029
0030 if (addr->svm_family != AF_VSOCK)
0031 return -EAFNOSUPPORT;
0032
0033 if (addr->svm_flags & ~svm_valid_flags)
0034 return -EINVAL;
0035
0036 return 0;
0037 }
0038 EXPORT_SYMBOL_GPL(vsock_addr_validate);
0039
0040 bool vsock_addr_bound(const struct sockaddr_vm *addr)
0041 {
0042 return addr->svm_port != VMADDR_PORT_ANY;
0043 }
0044 EXPORT_SYMBOL_GPL(vsock_addr_bound);
0045
0046 void vsock_addr_unbind(struct sockaddr_vm *addr)
0047 {
0048 vsock_addr_init(addr, VMADDR_CID_ANY, VMADDR_PORT_ANY);
0049 }
0050 EXPORT_SYMBOL_GPL(vsock_addr_unbind);
0051
0052 bool vsock_addr_equals_addr(const struct sockaddr_vm *addr,
0053 const struct sockaddr_vm *other)
0054 {
0055 return addr->svm_cid == other->svm_cid &&
0056 addr->svm_port == other->svm_port;
0057 }
0058 EXPORT_SYMBOL_GPL(vsock_addr_equals_addr);
0059
0060 int vsock_addr_cast(const struct sockaddr *addr,
0061 size_t len, struct sockaddr_vm **out_addr)
0062 {
0063 if (len < sizeof(**out_addr))
0064 return -EFAULT;
0065
0066 *out_addr = (struct sockaddr_vm *)addr;
0067 return vsock_addr_validate(*out_addr);
0068 }
0069 EXPORT_SYMBOL_GPL(vsock_addr_cast);