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 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 23 int vsock_addr_validate(const struct sockaddr_vm *addr) 24 { 25 if (!addr) 26 return -EFAULT; 27 28 if (addr->svm_family != AF_VSOCK) 29 return -EAFNOSUPPORT; 30 31 if (addr->svm_zero[0] != 0) 32 return -EINVAL; 33 34 return 0; 35 } 36 EXPORT_SYMBOL_GPL(vsock_addr_validate); 37 38 bool vsock_addr_bound(const struct sockaddr_vm *addr) 39 { 40 return addr->svm_port != VMADDR_PORT_ANY; 41 } 42 EXPORT_SYMBOL_GPL(vsock_addr_bound); 43 44 void vsock_addr_unbind(struct sockaddr_vm *addr) 45 { 46 vsock_addr_init(addr, VMADDR_CID_ANY, VMADDR_PORT_ANY); 47 } 48 EXPORT_SYMBOL_GPL(vsock_addr_unbind); 49 50 bool vsock_addr_equals_addr(const struct sockaddr_vm *addr, 51 const struct sockaddr_vm *other) 52 { 53 return addr->svm_cid == other->svm_cid && 54 addr->svm_port == other->svm_port; 55 } 56 EXPORT_SYMBOL_GPL(vsock_addr_equals_addr); 57 58 int vsock_addr_cast(const struct sockaddr *addr, 59 size_t len, struct sockaddr_vm **out_addr) 60 { 61 if (len < sizeof(**out_addr)) 62 return -EFAULT; 63 64 *out_addr = (struct sockaddr_vm *)addr; 65 return vsock_addr_validate(*out_addr); 66 } 67 EXPORT_SYMBOL_GPL(vsock_addr_cast); 68