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