linux/net/vmw_vsock/vsock_addr.c
<<
>>
Prefs
   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
  14void 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}
  21EXPORT_SYMBOL_GPL(vsock_addr_init);
  22
  23int 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}
  36EXPORT_SYMBOL_GPL(vsock_addr_validate);
  37
  38bool vsock_addr_bound(const struct sockaddr_vm *addr)
  39{
  40        return addr->svm_port != VMADDR_PORT_ANY;
  41}
  42EXPORT_SYMBOL_GPL(vsock_addr_bound);
  43
  44void vsock_addr_unbind(struct sockaddr_vm *addr)
  45{
  46        vsock_addr_init(addr, VMADDR_CID_ANY, VMADDR_PORT_ANY);
  47}
  48EXPORT_SYMBOL_GPL(vsock_addr_unbind);
  49
  50bool 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}
  56EXPORT_SYMBOL_GPL(vsock_addr_equals_addr);
  57
  58int 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}
  67EXPORT_SYMBOL_GPL(vsock_addr_cast);
  68