• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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