netif.h 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. /******************************************************************************
  2. * netif.h
  3. *
  4. * Unified network-device I/O interface for Xen guest OSes.
  5. *
  6. * Copyright (c) 2003-2004, Keir Fraser
  7. */
  8. #ifndef __XEN_PUBLIC_IO_NETIF_H__
  9. #define __XEN_PUBLIC_IO_NETIF_H__
  10. #include "ring.h"
  11. #include "../grant_table.h"
  12. /*
  13. * Older implementation of Xen network frontend / backend has an
  14. * implicit dependency on the MAX_SKB_FRAGS as the maximum number of
  15. * ring slots a skb can use. Netfront / netback may not work as
  16. * expected when frontend and backend have different MAX_SKB_FRAGS.
  17. *
  18. * A better approach is to add mechanism for netfront / netback to
  19. * negotiate this value. However we cannot fix all possible
  20. * frontends, so we need to define a value which states the minimum
  21. * slots backend must support.
  22. *
  23. * The minimum value derives from older Linux kernel's MAX_SKB_FRAGS
  24. * (18), which is proved to work with most frontends. Any new backend
  25. * which doesn't negotiate with frontend should expect frontend to
  26. * send a valid packet using slots up to this value.
  27. */
  28. #define XEN_NETIF_NR_SLOTS_MIN 18
  29. /*
  30. * Notifications after enqueuing any type of message should be conditional on
  31. * the appropriate req_event or rsp_event field in the shared ring.
  32. * If the client sends notification for rx requests then it should specify
  33. * feature 'feature-rx-notify' via xenbus. Otherwise the backend will assume
  34. * that it cannot safely queue packets (as it may not be kicked to send them).
  35. */
  36. /*
  37. * This is the 'wire' format for packets:
  38. * Request 1: xen_netif_tx_request -- XEN_NETTXF_* (any flags)
  39. * [Request 2: xen_netif_extra_info] (only if request 1 has XEN_NETTXF_extra_info)
  40. * [Request 3: xen_netif_extra_info] (only if request 2 has XEN_NETIF_EXTRA_MORE)
  41. * Request 4: xen_netif_tx_request -- XEN_NETTXF_more_data
  42. * Request 5: xen_netif_tx_request -- XEN_NETTXF_more_data
  43. * ...
  44. * Request N: xen_netif_tx_request -- 0
  45. */
  46. /* Protocol checksum field is blank in the packet (hardware offload)? */
  47. #define _XEN_NETTXF_csum_blank (0)
  48. #define XEN_NETTXF_csum_blank (1U<<_XEN_NETTXF_csum_blank)
  49. /* Packet data has been validated against protocol checksum. */
  50. #define _XEN_NETTXF_data_validated (1)
  51. #define XEN_NETTXF_data_validated (1U<<_XEN_NETTXF_data_validated)
  52. /* Packet continues in the next request descriptor. */
  53. #define _XEN_NETTXF_more_data (2)
  54. #define XEN_NETTXF_more_data (1U<<_XEN_NETTXF_more_data)
  55. /* Packet to be followed by extra descriptor(s). */
  56. #define _XEN_NETTXF_extra_info (3)
  57. #define XEN_NETTXF_extra_info (1U<<_XEN_NETTXF_extra_info)
  58. #define XEN_NETIF_MAX_TX_SIZE 0xFFFF
  59. struct xen_netif_tx_request {
  60. grant_ref_t gref; /* Reference to buffer page */
  61. uint16_t offset; /* Offset within buffer page */
  62. uint16_t flags; /* XEN_NETTXF_* */
  63. uint16_t id; /* Echoed in response message. */
  64. uint16_t size; /* Packet size in bytes. */
  65. };
  66. /* Types of xen_netif_extra_info descriptors. */
  67. #define XEN_NETIF_EXTRA_TYPE_NONE (0) /* Never used - invalid */
  68. #define XEN_NETIF_EXTRA_TYPE_GSO (1) /* u.gso */
  69. #define XEN_NETIF_EXTRA_TYPE_MAX (2)
  70. /* xen_netif_extra_info flags. */
  71. #define _XEN_NETIF_EXTRA_FLAG_MORE (0)
  72. #define XEN_NETIF_EXTRA_FLAG_MORE (1U<<_XEN_NETIF_EXTRA_FLAG_MORE)
  73. /* GSO types - only TCPv4 currently supported. */
  74. #define XEN_NETIF_GSO_TYPE_TCPV4 (1)
  75. /*
  76. * This structure needs to fit within both netif_tx_request and
  77. * netif_rx_response for compatibility.
  78. */
  79. struct xen_netif_extra_info {
  80. uint8_t type; /* XEN_NETIF_EXTRA_TYPE_* */
  81. uint8_t flags; /* XEN_NETIF_EXTRA_FLAG_* */
  82. union {
  83. struct {
  84. /*
  85. * Maximum payload size of each segment. For
  86. * example, for TCP this is just the path MSS.
  87. */
  88. uint16_t size;
  89. /*
  90. * GSO type. This determines the protocol of
  91. * the packet and any extra features required
  92. * to segment the packet properly.
  93. */
  94. uint8_t type; /* XEN_NETIF_GSO_TYPE_* */
  95. /* Future expansion. */
  96. uint8_t pad;
  97. /*
  98. * GSO features. This specifies any extra GSO
  99. * features required to process this packet,
  100. * such as ECN support for TCPv4.
  101. */
  102. uint16_t features; /* XEN_NETIF_GSO_FEAT_* */
  103. } gso;
  104. uint16_t pad[3];
  105. } u;
  106. };
  107. struct xen_netif_tx_response {
  108. uint16_t id;
  109. int16_t status; /* XEN_NETIF_RSP_* */
  110. };
  111. struct xen_netif_rx_request {
  112. uint16_t id; /* Echoed in response message. */
  113. grant_ref_t gref; /* Reference to incoming granted frame */
  114. };
  115. /* Packet data has been validated against protocol checksum. */
  116. #define _XEN_NETRXF_data_validated (0)
  117. #define XEN_NETRXF_data_validated (1U<<_XEN_NETRXF_data_validated)
  118. /* Protocol checksum field is blank in the packet (hardware offload)? */
  119. #define _XEN_NETRXF_csum_blank (1)
  120. #define XEN_NETRXF_csum_blank (1U<<_XEN_NETRXF_csum_blank)
  121. /* Packet continues in the next request descriptor. */
  122. #define _XEN_NETRXF_more_data (2)
  123. #define XEN_NETRXF_more_data (1U<<_XEN_NETRXF_more_data)
  124. /* Packet to be followed by extra descriptor(s). */
  125. #define _XEN_NETRXF_extra_info (3)
  126. #define XEN_NETRXF_extra_info (1U<<_XEN_NETRXF_extra_info)
  127. /* GSO Prefix descriptor. */
  128. #define _XEN_NETRXF_gso_prefix (4)
  129. #define XEN_NETRXF_gso_prefix (1U<<_XEN_NETRXF_gso_prefix)
  130. struct xen_netif_rx_response {
  131. uint16_t id;
  132. uint16_t offset; /* Offset in page of start of received packet */
  133. uint16_t flags; /* XEN_NETRXF_* */
  134. int16_t status; /* -ve: BLKIF_RSP_* ; +ve: Rx'ed pkt size. */
  135. };
  136. /*
  137. * Generate netif ring structures and types.
  138. */
  139. DEFINE_RING_TYPES(xen_netif_tx,
  140. struct xen_netif_tx_request,
  141. struct xen_netif_tx_response);
  142. DEFINE_RING_TYPES(xen_netif_rx,
  143. struct xen_netif_rx_request,
  144. struct xen_netif_rx_response);
  145. #define XEN_NETIF_RSP_DROPPED -2
  146. #define XEN_NETIF_RSP_ERROR -1
  147. #define XEN_NETIF_RSP_OKAY 0
  148. /* No response: used for auxiliary requests (e.g., xen_netif_extra_info). */
  149. #define XEN_NETIF_RSP_NULL 1
  150. #endif