Blame view

net/vmw_vsock/vsock_addr.c 1.48 KB
685a6bf84   Thomas Gleixner   treewide: Replace...
1
  // SPDX-License-Identifier: GPL-2.0-only
d021c3440   Andy King   VSOCK: Introduce ...
2
3
4
5
  /*
   * VMware vSockets Driver
   *
   * Copyright (C) 2007-2012 VMware, Inc. All rights reserved.
d021c3440   Andy King   VSOCK: Introduce ...
6
7
8
9
10
11
   */
  
  #include <linux/types.h>
  #include <linux/socket.h>
  #include <linux/stddef.h>
  #include <net/sock.h>
82a54d0eb   Asias He   VSOCK: Move af_vs...
12
  #include <net/vsock_addr.h>
d021c3440   Andy King   VSOCK: Introduce ...
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
  
  void vsock_addr_init(struct sockaddr_vm *addr, u32 cid, u32 port)
  {
  	memset(addr, 0, sizeof(*addr));
  	addr->svm_family = AF_VSOCK;
  	addr->svm_cid = cid;
  	addr->svm_port = port;
  }
  EXPORT_SYMBOL_GPL(vsock_addr_init);
  
  int vsock_addr_validate(const struct sockaddr_vm *addr)
  {
  	if (!addr)
  		return -EFAULT;
  
  	if (addr->svm_family != AF_VSOCK)
  		return -EAFNOSUPPORT;
  
  	if (addr->svm_zero[0] != 0)
  		return -EINVAL;
  
  	return 0;
  }
  EXPORT_SYMBOL_GPL(vsock_addr_validate);
  
  bool vsock_addr_bound(const struct sockaddr_vm *addr)
  {
  	return addr->svm_port != VMADDR_PORT_ANY;
  }
  EXPORT_SYMBOL_GPL(vsock_addr_bound);
  
  void vsock_addr_unbind(struct sockaddr_vm *addr)
  {
  	vsock_addr_init(addr, VMADDR_CID_ANY, VMADDR_PORT_ANY);
  }
  EXPORT_SYMBOL_GPL(vsock_addr_unbind);
  
  bool vsock_addr_equals_addr(const struct sockaddr_vm *addr,
  			    const struct sockaddr_vm *other)
  {
  	return addr->svm_cid == other->svm_cid &&
  		addr->svm_port == other->svm_port;
  }
  EXPORT_SYMBOL_GPL(vsock_addr_equals_addr);
d021c3440   Andy King   VSOCK: Introduce ...
57
58
59
60
61
62
63
64
65
66
  int vsock_addr_cast(const struct sockaddr *addr,
  		    size_t len, struct sockaddr_vm **out_addr)
  {
  	if (len < sizeof(**out_addr))
  		return -EFAULT;
  
  	*out_addr = (struct sockaddr_vm *)addr;
  	return vsock_addr_validate(*out_addr);
  }
  EXPORT_SYMBOL_GPL(vsock_addr_cast);