pvcalls.h 3.0 KB

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