Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

ib_packet.h 3.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. #ifndef _GPXE_IB_PACKET_H
  2. #define _GPXE_IB_PACKET_H
  3. /** @file
  4. *
  5. * Infiniband packet format
  6. *
  7. */
  8. struct ib_device;
  9. struct ib_queue_pair;
  10. struct ib_address_vector;
  11. struct io_buffer;
  12. /** Half of an Infiniband Global Identifier */
  13. struct ib_gid_half {
  14. uint8_t bytes[8];
  15. };
  16. /** An Infiniband Global Identifier */
  17. struct ib_gid {
  18. union {
  19. uint8_t bytes[16];
  20. uint16_t words[8];
  21. uint32_t dwords[4];
  22. struct ib_gid_half half[2];
  23. } u;
  24. };
  25. /** An Infiniband Local Route Header */
  26. struct ib_local_route_header {
  27. /** Virtual lane and link version */
  28. uint8_t vl__lver;
  29. /** Service level and next link header */
  30. uint8_t sl__lnh;
  31. /** Destination LID */
  32. uint16_t dlid;
  33. /** Packet length */
  34. uint16_t length;
  35. /** Source LID */
  36. uint16_t slid;
  37. } __attribute__ (( packed ));
  38. /** Infiniband virtual lanes */
  39. enum ib_vl {
  40. IB_VL_DEFAULT = 0,
  41. IB_VL_SMP = 15,
  42. };
  43. /** An Infiniband Link Next Header value */
  44. enum ib_lnh {
  45. IB_LNH_RAW = 0,
  46. IB_LNH_IPv6 = 1,
  47. IB_LNH_BTH = 2,
  48. IB_LNH_GRH = 3
  49. };
  50. /** Default Infiniband LID */
  51. #define IB_LID_NONE 0xffff
  52. /** Test for multicast LID */
  53. #define IB_LID_MULTICAST( lid ) ( ( (lid) >= 0xc000 ) && ( (lid) <= 0xfffe ) )
  54. /** An Infiniband Global Route Header */
  55. struct ib_global_route_header {
  56. /** IP version, traffic class, and flow label
  57. *
  58. * 4 bits : Version of the GRH
  59. * 8 bits : Traffic class
  60. * 20 bits : Flow label
  61. */
  62. uint32_t ipver__tclass__flowlabel;
  63. /** Payload length */
  64. uint16_t paylen;
  65. /** Next header */
  66. uint8_t nxthdr;
  67. /** Hop limit */
  68. uint8_t hoplmt;
  69. /** Source GID */
  70. struct ib_gid sgid;
  71. /** Destiniation GID */
  72. struct ib_gid dgid;
  73. } __attribute__ (( packed ));
  74. #define IB_GRH_IPVER_IPv6 0x06
  75. #define IB_GRH_NXTHDR_IBA 0x1b
  76. /** An Infiniband Base Transport Header */
  77. struct ib_base_transport_header {
  78. /** Opcode */
  79. uint8_t opcode;
  80. /** Transport header version, pad count, migration and solicitation */
  81. uint8_t se__m__padcnt__tver;
  82. /** Partition key */
  83. uint16_t pkey;
  84. /** Destination queue pair */
  85. uint32_t dest_qp;
  86. /** Packet sequence number and acknowledge request */
  87. uint32_t ack__psn;
  88. } __attribute__ (( packed ));
  89. /** An Infiniband BTH opcode */
  90. enum ib_bth_opcode {
  91. BTH_OPCODE_UD_SEND = 0x64,
  92. };
  93. /** Default Infiniband partition key */
  94. #define IB_PKEY_NONE 0xffff
  95. /** Subnet management queue pair number */
  96. #define IB_QPN_SMP 0
  97. /** An Infiniband Datagram Extended Transport Header */
  98. struct ib_datagram_extended_transport_header {
  99. /** Queue key */
  100. uint32_t qkey;
  101. /** Source queue pair */
  102. uint32_t src_qp;
  103. } __attribute__ (( packed ));
  104. /** All known IB header formats */
  105. union ib_headers {
  106. struct ib_local_route_header lrh;
  107. struct {
  108. struct ib_local_route_header lrh;
  109. struct ib_global_route_header grh;
  110. struct ib_base_transport_header bth;
  111. struct ib_datagram_extended_transport_header deth;
  112. } __attribute__ (( packed )) lrh__grh__bth__deth;
  113. struct {
  114. struct ib_local_route_header lrh;
  115. struct ib_base_transport_header bth;
  116. struct ib_datagram_extended_transport_header deth;
  117. } __attribute__ (( packed )) lrh__bth__deth;
  118. } __attribute__ (( packed ));
  119. /** Maximum size required for IB headers */
  120. #define IB_MAX_HEADER_SIZE sizeof ( union ib_headers )
  121. extern int ib_push ( struct ib_device *ibdev, struct io_buffer *iobuf,
  122. struct ib_queue_pair *qp, size_t payload_len,
  123. const struct ib_address_vector *av );
  124. extern int ib_pull ( struct ib_device *ibdev, struct io_buffer *iobuf,
  125. struct ib_queue_pair **qp, size_t *payload_len,
  126. struct ib_address_vector *av );
  127. #endif /* _GPXE_IB_PACKET_H */