vsock_addr.c 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  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. #include <linux/types.h>
  8. #include <linux/socket.h>
  9. #include <linux/stddef.h>
  10. #include <net/sock.h>
  11. #include <net/vsock_addr.h>
  12. void vsock_addr_init(struct sockaddr_vm *addr, u32 cid, u32 port)
  13. {
  14. memset(addr, 0, sizeof(*addr));
  15. addr->svm_family = AF_VSOCK;
  16. addr->svm_cid = cid;
  17. addr->svm_port = port;
  18. }
  19. EXPORT_SYMBOL_GPL(vsock_addr_init);
  20. int vsock_addr_validate(const struct sockaddr_vm *addr)
  21. {
  22. if (!addr)
  23. return -EFAULT;
  24. if (addr->svm_family != AF_VSOCK)
  25. return -EAFNOSUPPORT;
  26. if (addr->svm_zero[0] != 0)
  27. return -EINVAL;
  28. return 0;
  29. }
  30. EXPORT_SYMBOL_GPL(vsock_addr_validate);
  31. bool vsock_addr_bound(const struct sockaddr_vm *addr)
  32. {
  33. return addr->svm_port != VMADDR_PORT_ANY;
  34. }
  35. EXPORT_SYMBOL_GPL(vsock_addr_bound);
  36. void vsock_addr_unbind(struct sockaddr_vm *addr)
  37. {
  38. vsock_addr_init(addr, VMADDR_CID_ANY, VMADDR_PORT_ANY);
  39. }
  40. EXPORT_SYMBOL_GPL(vsock_addr_unbind);
  41. bool vsock_addr_equals_addr(const struct sockaddr_vm *addr,
  42. const struct sockaddr_vm *other)
  43. {
  44. return addr->svm_cid == other->svm_cid &&
  45. addr->svm_port == other->svm_port;
  46. }
  47. EXPORT_SYMBOL_GPL(vsock_addr_equals_addr);
  48. int vsock_addr_cast(const struct sockaddr *addr,
  49. size_t len, struct sockaddr_vm **out_addr)
  50. {
  51. if (len < sizeof(**out_addr))
  52. return -EFAULT;
  53. *out_addr = (struct sockaddr_vm *)addr;
  54. return vsock_addr_validate(*out_addr);
  55. }
  56. EXPORT_SYMBOL_GPL(vsock_addr_cast);