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