vsock_addr.c 1.5 KB

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