162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * VMware vSockets Driver 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * Copyright (C) 2007-2012 VMware, Inc. All rights reserved. 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#include <linux/types.h> 962306a36Sopenharmony_ci#include <linux/socket.h> 1062306a36Sopenharmony_ci#include <linux/stddef.h> 1162306a36Sopenharmony_ci#include <net/sock.h> 1262306a36Sopenharmony_ci#include <net/vsock_addr.h> 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_civoid vsock_addr_init(struct sockaddr_vm *addr, u32 cid, u32 port) 1562306a36Sopenharmony_ci{ 1662306a36Sopenharmony_ci memset(addr, 0, sizeof(*addr)); 1762306a36Sopenharmony_ci addr->svm_family = AF_VSOCK; 1862306a36Sopenharmony_ci addr->svm_cid = cid; 1962306a36Sopenharmony_ci addr->svm_port = port; 2062306a36Sopenharmony_ci} 2162306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(vsock_addr_init); 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ciint vsock_addr_validate(const struct sockaddr_vm *addr) 2462306a36Sopenharmony_ci{ 2562306a36Sopenharmony_ci __u8 svm_valid_flags = VMADDR_FLAG_TO_HOST; 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci if (!addr) 2862306a36Sopenharmony_ci return -EFAULT; 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci if (addr->svm_family != AF_VSOCK) 3162306a36Sopenharmony_ci return -EAFNOSUPPORT; 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_ci if (addr->svm_flags & ~svm_valid_flags) 3462306a36Sopenharmony_ci return -EINVAL; 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci return 0; 3762306a36Sopenharmony_ci} 3862306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(vsock_addr_validate); 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_cibool vsock_addr_bound(const struct sockaddr_vm *addr) 4162306a36Sopenharmony_ci{ 4262306a36Sopenharmony_ci return addr->svm_port != VMADDR_PORT_ANY; 4362306a36Sopenharmony_ci} 4462306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(vsock_addr_bound); 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_civoid vsock_addr_unbind(struct sockaddr_vm *addr) 4762306a36Sopenharmony_ci{ 4862306a36Sopenharmony_ci vsock_addr_init(addr, VMADDR_CID_ANY, VMADDR_PORT_ANY); 4962306a36Sopenharmony_ci} 5062306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(vsock_addr_unbind); 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_cibool vsock_addr_equals_addr(const struct sockaddr_vm *addr, 5362306a36Sopenharmony_ci const struct sockaddr_vm *other) 5462306a36Sopenharmony_ci{ 5562306a36Sopenharmony_ci return addr->svm_cid == other->svm_cid && 5662306a36Sopenharmony_ci addr->svm_port == other->svm_port; 5762306a36Sopenharmony_ci} 5862306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(vsock_addr_equals_addr); 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_ciint vsock_addr_cast(const struct sockaddr *addr, 6162306a36Sopenharmony_ci size_t len, struct sockaddr_vm **out_addr) 6262306a36Sopenharmony_ci{ 6362306a36Sopenharmony_ci if (len < sizeof(**out_addr)) 6462306a36Sopenharmony_ci return -EFAULT; 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_ci *out_addr = (struct sockaddr_vm *)addr; 6762306a36Sopenharmony_ci return vsock_addr_validate(*out_addr); 6862306a36Sopenharmony_ci} 6962306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(vsock_addr_cast); 70