pvcalls.h 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. /* SPDX-License-Identifier: MIT */
  2. #ifndef __XEN_PUBLIC_IO_XEN_PVCALLS_H__
  3. #define __XEN_PUBLIC_IO_XEN_PVCALLS_H__
  4. #include <linux/net.h>
  5. #include <xen/interface/io/ring.h>
  6. #include <xen/interface/grant_table.h>
  7. /* "1" means socket, connect, release, bind, listen, accept and poll */
  8. #define XENBUS_FUNCTIONS_CALLS "1"
  9. /*
  10. * See docs/misc/pvcalls.markdown in xen.git for the full specification:
  11. * https://xenbits.xen.org/docs/unstable/misc/pvcalls.html
  12. */
  13. struct pvcalls_data_intf {
  14. RING_IDX in_cons, in_prod, in_error;
  15. uint8_t pad1[52];
  16. RING_IDX out_cons, out_prod, out_error;
  17. uint8_t pad2[52];
  18. RING_IDX ring_order;
  19. grant_ref_t ref[];
  20. };
  21. DEFINE_XEN_FLEX_RING(pvcalls);
  22. #define PVCALLS_SOCKET 0
  23. #define PVCALLS_CONNECT 1
  24. #define PVCALLS_RELEASE 2
  25. #define PVCALLS_BIND 3
  26. #define PVCALLS_LISTEN 4
  27. #define PVCALLS_ACCEPT 5
  28. #define PVCALLS_POLL 6
  29. struct xen_pvcalls_request {
  30. uint32_t req_id; /* private to guest, echoed in response */
  31. uint32_t cmd; /* command to execute */
  32. union {
  33. struct xen_pvcalls_socket {
  34. uint64_t id;
  35. uint32_t domain;
  36. uint32_t type;
  37. uint32_t protocol;
  38. } socket;
  39. struct xen_pvcalls_connect {
  40. uint64_t id;
  41. uint8_t addr[28];
  42. uint32_t len;
  43. uint32_t flags;
  44. grant_ref_t ref;
  45. uint32_t evtchn;
  46. } connect;
  47. struct xen_pvcalls_release {
  48. uint64_t id;
  49. uint8_t reuse;
  50. } release;
  51. struct xen_pvcalls_bind {
  52. uint64_t id;
  53. uint8_t addr[28];
  54. uint32_t len;
  55. } bind;
  56. struct xen_pvcalls_listen {
  57. uint64_t id;
  58. uint32_t backlog;
  59. } listen;
  60. struct xen_pvcalls_accept {
  61. uint64_t id;
  62. uint64_t id_new;
  63. grant_ref_t ref;
  64. uint32_t evtchn;
  65. } accept;
  66. struct xen_pvcalls_poll {
  67. uint64_t id;
  68. } poll;
  69. /* dummy member to force sizeof(struct xen_pvcalls_request)
  70. * to match across archs */
  71. struct xen_pvcalls_dummy {
  72. uint8_t dummy[56];
  73. } dummy;
  74. } u;
  75. };
  76. struct xen_pvcalls_response {
  77. uint32_t req_id;
  78. uint32_t cmd;
  79. int32_t ret;
  80. uint32_t pad;
  81. union {
  82. struct _xen_pvcalls_socket {
  83. uint64_t id;
  84. } socket;
  85. struct _xen_pvcalls_connect {
  86. uint64_t id;
  87. } connect;
  88. struct _xen_pvcalls_release {
  89. uint64_t id;
  90. } release;
  91. struct _xen_pvcalls_bind {
  92. uint64_t id;
  93. } bind;
  94. struct _xen_pvcalls_listen {
  95. uint64_t id;
  96. } listen;
  97. struct _xen_pvcalls_accept {
  98. uint64_t id;
  99. } accept;
  100. struct _xen_pvcalls_poll {
  101. uint64_t id;
  102. } poll;
  103. struct _xen_pvcalls_dummy {
  104. uint8_t dummy[8];
  105. } dummy;
  106. } u;
  107. };
  108. DEFINE_RING_TYPES(xen_pvcalls, struct xen_pvcalls_request,
  109. struct xen_pvcalls_response);
  110. #endif