Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-only
0002 /*
0003  * VMware vSockets Driver
0004  *
0005  * Copyright (C) 2007-2012 VMware, Inc. All rights reserved.
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);