[infiniband] Add raw packet parser and constructor
[people/sha0/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 struct ib_device;
11 struct ib_queue_pair;
12 struct ib_address_vector;
13 struct io_buffer;
14
15 /** Half of an Infiniband Global Identifier */
16 struct ib_gid_half {
17         uint8_t bytes[8];
18 };
19
20 /** An Infiniband Global Identifier */
21 struct ib_gid {
22         union {
23                 uint8_t bytes[16];
24                 uint16_t words[8];
25                 uint32_t dwords[4];
26                 struct ib_gid_half half[2];
27         } u;
28 };
29
30 /** An Infiniband Local Route Header */
31 struct ib_local_route_header {
32         /** Virtual lane and link version */
33         uint8_t vl__lver;
34         /** Service level and next link header */
35         uint8_t sl__lnh;
36         /** Destination LID */
37         uint16_t dlid;
38         /** Packet length */
39         uint16_t length;
40         /** Source LID */
41         uint16_t slid;
42 } __attribute__ (( packed ));
43
44 /** Infiniband virtual lanes */
45 enum ib_vl {
46         IB_VL_DEFAULT = 0,
47         IB_VL_SMP = 15,
48 };
49
50 /** An Infiniband Link Next Header value */
51 enum ib_lnh {
52         IB_LNH_RAW = 0,
53         IB_LNH_IPv6 = 1,
54         IB_LNH_BTH = 2,
55         IB_LNH_GRH = 3
56 };
57
58 /** Default Infiniband LID */
59 #define IB_LID_NONE 0xffff
60
61 /** Test for multicast LID */
62 #define IB_LID_MULTICAST( lid ) ( ( (lid) >= 0xc000 ) && ( (lid) <= 0xfffe ) )
63
64 /** An Infiniband Global Route Header */
65 struct ib_global_route_header {
66         /** IP version, traffic class, and flow label
67          *
68          *  4 bits : Version of the GRH
69          *  8 bits : Traffic class
70          * 20 bits : Flow label
71          */
72         uint32_t ipver__tclass__flowlabel;
73         /** Payload length */
74         uint16_t paylen;
75         /** Next header */
76         uint8_t nxthdr;
77         /** Hop limit */
78         uint8_t hoplmt;
79         /** Source GID */
80         struct ib_gid sgid;
81         /** Destiniation GID */
82         struct ib_gid dgid;
83 } __attribute__ (( packed ));
84
85 #define IB_GRH_IPVER_IPv6 0x06
86 #define IB_GRH_NXTHDR_IBA 0x1b
87
88 /** An Infiniband Base Transport Header */
89 struct ib_base_transport_header {
90         /** Opcode */
91         uint8_t opcode;
92         /** Transport header version, pad count, migration and solicitation */
93         uint8_t se__m__padcnt__tver;
94         /** Partition key */
95         uint16_t pkey;
96         /** Destination queue pair */
97         uint32_t dest_qp;
98         /** Packet sequence number and acknowledge request */
99         uint32_t ack__psn;
100 } __attribute__ (( packed ));
101
102 /** An Infiniband BTH opcode */
103 enum ib_bth_opcode {
104         BTH_OPCODE_UD_SEND = 0x64,
105 };
106
107 /** Default Infiniband partition key */
108 #define IB_PKEY_NONE 0xffff
109
110 /** Subnet management queue pair number */
111 #define IB_QPN_SMP 0
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 */