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