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