1 /*
2  * Copyright (c) 2016 Mellanox Technologies Ltd. All rights reserved.
3  * Copyright (c) 2015 System Fabric Works, Inc. All rights reserved.
4  *
5  * This software is available to you under a choice of one of two
6  * licenses.  You may choose to be licensed under the terms of the GNU
7  * General Public License (GPL) Version 2, available from the file
8  * COPYING in the main directory of this source tree, or the
9  * OpenIB.org BSD license below:
10  *
11  *     Redistribution and use in source and binary forms, with or
12  *     without modification, are permitted provided that the following
13  *     conditions are met:
14  *
15  *	- Redistributions of source code must retain the above
16  *	  copyright notice, this list of conditions and the following
17  *	  disclaimer.
18  *
19  *	- Redistributions in binary form must reproduce the above
20  *	  copyright notice, this list of conditions and the following
21  *	  disclaimer in the documentation and/or other materials
22  *	  provided with the distribution.
23  *
24  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
25  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
26  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
27  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
28  * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
29  * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
30  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
31  * SOFTWARE.
32  */
33 
34 #include <rdma/ib_pack.h>
35 #include "rxe_opcode.h"
36 #include "rxe_hdr.h"
37 
38 /* useful information about work request opcodes and pkt opcodes in
39  * table form
40  */
41 struct rxe_wr_opcode_info rxe_wr_opcode_info[] = {
42 	[IB_WR_RDMA_WRITE]				= {
43 		.name	= "IB_WR_RDMA_WRITE",
44 		.mask	= {
45 			[IB_QPT_RC]	= WR_INLINE_MASK | WR_WRITE_MASK,
46 			[IB_QPT_UC]	= WR_INLINE_MASK | WR_WRITE_MASK,
47 		},
48 	},
49 	[IB_WR_RDMA_WRITE_WITH_IMM]			= {
50 		.name	= "IB_WR_RDMA_WRITE_WITH_IMM",
51 		.mask	= {
52 			[IB_QPT_RC]	= WR_INLINE_MASK | WR_WRITE_MASK,
53 			[IB_QPT_UC]	= WR_INLINE_MASK | WR_WRITE_MASK,
54 		},
55 	},
56 	[IB_WR_SEND]					= {
57 		.name	= "IB_WR_SEND",
58 		.mask	= {
59 			[IB_QPT_SMI]	= WR_INLINE_MASK | WR_SEND_MASK,
60 			[IB_QPT_GSI]	= WR_INLINE_MASK | WR_SEND_MASK,
61 			[IB_QPT_RC]	= WR_INLINE_MASK | WR_SEND_MASK,
62 			[IB_QPT_UC]	= WR_INLINE_MASK | WR_SEND_MASK,
63 			[IB_QPT_UD]	= WR_INLINE_MASK | WR_SEND_MASK,
64 		},
65 	},
66 	[IB_WR_SEND_WITH_IMM]				= {
67 		.name	= "IB_WR_SEND_WITH_IMM",
68 		.mask	= {
69 			[IB_QPT_SMI]	= WR_INLINE_MASK | WR_SEND_MASK,
70 			[IB_QPT_GSI]	= WR_INLINE_MASK | WR_SEND_MASK,
71 			[IB_QPT_RC]	= WR_INLINE_MASK | WR_SEND_MASK,
72 			[IB_QPT_UC]	= WR_INLINE_MASK | WR_SEND_MASK,
73 			[IB_QPT_UD]	= WR_INLINE_MASK | WR_SEND_MASK,
74 		},
75 	},
76 	[IB_WR_RDMA_READ]				= {
77 		.name	= "IB_WR_RDMA_READ",
78 		.mask	= {
79 			[IB_QPT_RC]	= WR_READ_MASK,
80 		},
81 	},
82 	[IB_WR_ATOMIC_CMP_AND_SWP]			= {
83 		.name	= "IB_WR_ATOMIC_CMP_AND_SWP",
84 		.mask	= {
85 			[IB_QPT_RC]	= WR_ATOMIC_MASK,
86 		},
87 	},
88 	[IB_WR_ATOMIC_FETCH_AND_ADD]			= {
89 		.name	= "IB_WR_ATOMIC_FETCH_AND_ADD",
90 		.mask	= {
91 			[IB_QPT_RC]	= WR_ATOMIC_MASK,
92 		},
93 	},
94 	[IB_WR_LSO]					= {
95 		.name	= "IB_WR_LSO",
96 		.mask	= {
97 			/* not supported */
98 		},
99 	},
100 	[IB_WR_SEND_WITH_INV]				= {
101 		.name	= "IB_WR_SEND_WITH_INV",
102 		.mask	= {
103 			[IB_QPT_RC]	= WR_INLINE_MASK | WR_SEND_MASK,
104 			[IB_QPT_UC]	= WR_INLINE_MASK | WR_SEND_MASK,
105 			[IB_QPT_UD]	= WR_INLINE_MASK | WR_SEND_MASK,
106 		},
107 	},
108 	[IB_WR_RDMA_READ_WITH_INV]			= {
109 		.name	= "IB_WR_RDMA_READ_WITH_INV",
110 		.mask	= {
111 			[IB_QPT_RC]	= WR_READ_MASK,
112 		},
113 	},
114 	[IB_WR_LOCAL_INV]				= {
115 		.name	= "IB_WR_LOCAL_INV",
116 		.mask	= {
117 			[IB_QPT_RC]	= WR_REG_MASK,
118 		},
119 	},
120 	[IB_WR_REG_MR]					= {
121 		.name	= "IB_WR_REG_MR",
122 		.mask	= {
123 			[IB_QPT_RC]	= WR_REG_MASK,
124 		},
125 	},
126 };
127 
128 struct rxe_opcode_info rxe_opcode[RXE_NUM_OPCODE] = {
129 	[IB_OPCODE_RC_SEND_FIRST]			= {
130 		.name	= "IB_OPCODE_RC_SEND_FIRST",
131 		.mask	= RXE_PAYLOAD_MASK | RXE_REQ_MASK | RXE_RWR_MASK
132 				| RXE_SEND_MASK | RXE_START_MASK,
133 		.length = RXE_BTH_BYTES,
134 		.offset = {
135 			[RXE_BTH]	= 0,
136 			[RXE_PAYLOAD]	= RXE_BTH_BYTES,
137 		}
138 	},
139 	[IB_OPCODE_RC_SEND_MIDDLE]		= {
140 		.name	= "IB_OPCODE_RC_SEND_MIDDLE]",
141 		.mask	= RXE_PAYLOAD_MASK | RXE_REQ_MASK | RXE_SEND_MASK
142 				| RXE_MIDDLE_MASK,
143 		.length = RXE_BTH_BYTES,
144 		.offset = {
145 			[RXE_BTH]	= 0,
146 			[RXE_PAYLOAD]	= RXE_BTH_BYTES,
147 		}
148 	},
149 	[IB_OPCODE_RC_SEND_LAST]			= {
150 		.name	= "IB_OPCODE_RC_SEND_LAST",
151 		.mask	= RXE_PAYLOAD_MASK | RXE_REQ_MASK | RXE_COMP_MASK
152 				| RXE_SEND_MASK | RXE_END_MASK,
153 		.length = RXE_BTH_BYTES,
154 		.offset = {
155 			[RXE_BTH]	= 0,
156 			[RXE_PAYLOAD]	= RXE_BTH_BYTES,
157 		}
158 	},
159 	[IB_OPCODE_RC_SEND_LAST_WITH_IMMEDIATE]		= {
160 		.name	= "IB_OPCODE_RC_SEND_LAST_WITH_IMMEDIATE",
161 		.mask	= RXE_IMMDT_MASK | RXE_PAYLOAD_MASK | RXE_REQ_MASK
162 				| RXE_COMP_MASK | RXE_SEND_MASK | RXE_END_MASK,
163 		.length = RXE_BTH_BYTES + RXE_IMMDT_BYTES,
164 		.offset = {
165 			[RXE_BTH]	= 0,
166 			[RXE_IMMDT]	= RXE_BTH_BYTES,
167 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
168 						+ RXE_IMMDT_BYTES,
169 		}
170 	},
171 	[IB_OPCODE_RC_SEND_ONLY]			= {
172 		.name	= "IB_OPCODE_RC_SEND_ONLY",
173 		.mask	= RXE_PAYLOAD_MASK | RXE_REQ_MASK | RXE_COMP_MASK
174 				| RXE_RWR_MASK | RXE_SEND_MASK
175 				| RXE_START_MASK | RXE_END_MASK,
176 		.length = RXE_BTH_BYTES,
177 		.offset = {
178 			[RXE_BTH]	= 0,
179 			[RXE_PAYLOAD]	= RXE_BTH_BYTES,
180 		}
181 	},
182 	[IB_OPCODE_RC_SEND_ONLY_WITH_IMMEDIATE]		= {
183 		.name	= "IB_OPCODE_RC_SEND_ONLY_WITH_IMMEDIATE",
184 		.mask	= RXE_IMMDT_MASK | RXE_PAYLOAD_MASK | RXE_REQ_MASK
185 				| RXE_COMP_MASK | RXE_RWR_MASK | RXE_SEND_MASK
186 				| RXE_START_MASK | RXE_END_MASK,
187 		.length = RXE_BTH_BYTES + RXE_IMMDT_BYTES,
188 		.offset = {
189 			[RXE_BTH]	= 0,
190 			[RXE_IMMDT]	= RXE_BTH_BYTES,
191 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
192 						+ RXE_IMMDT_BYTES,
193 		}
194 	},
195 	[IB_OPCODE_RC_RDMA_WRITE_FIRST]		= {
196 		.name	= "IB_OPCODE_RC_RDMA_WRITE_FIRST",
197 		.mask	= RXE_RETH_MASK | RXE_PAYLOAD_MASK | RXE_REQ_MASK
198 				| RXE_WRITE_MASK | RXE_START_MASK,
199 		.length = RXE_BTH_BYTES + RXE_RETH_BYTES,
200 		.offset = {
201 			[RXE_BTH]	= 0,
202 			[RXE_RETH]	= RXE_BTH_BYTES,
203 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
204 						+ RXE_RETH_BYTES,
205 		}
206 	},
207 	[IB_OPCODE_RC_RDMA_WRITE_MIDDLE]		= {
208 		.name	= "IB_OPCODE_RC_RDMA_WRITE_MIDDLE",
209 		.mask	= RXE_PAYLOAD_MASK | RXE_REQ_MASK | RXE_WRITE_MASK
210 				| RXE_MIDDLE_MASK,
211 		.length = RXE_BTH_BYTES,
212 		.offset = {
213 			[RXE_BTH]	= 0,
214 			[RXE_PAYLOAD]	= RXE_BTH_BYTES,
215 		}
216 	},
217 	[IB_OPCODE_RC_RDMA_WRITE_LAST]			= {
218 		.name	= "IB_OPCODE_RC_RDMA_WRITE_LAST",
219 		.mask	= RXE_PAYLOAD_MASK | RXE_REQ_MASK | RXE_WRITE_MASK
220 				| RXE_END_MASK,
221 		.length = RXE_BTH_BYTES,
222 		.offset = {
223 			[RXE_BTH]	= 0,
224 			[RXE_PAYLOAD]	= RXE_BTH_BYTES,
225 		}
226 	},
227 	[IB_OPCODE_RC_RDMA_WRITE_LAST_WITH_IMMEDIATE]		= {
228 		.name	= "IB_OPCODE_RC_RDMA_WRITE_LAST_WITH_IMMEDIATE",
229 		.mask	= RXE_IMMDT_MASK | RXE_PAYLOAD_MASK | RXE_REQ_MASK
230 				| RXE_WRITE_MASK | RXE_COMP_MASK | RXE_RWR_MASK
231 				| RXE_END_MASK,
232 		.length = RXE_BTH_BYTES + RXE_IMMDT_BYTES,
233 		.offset = {
234 			[RXE_BTH]	= 0,
235 			[RXE_IMMDT]	= RXE_BTH_BYTES,
236 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
237 						+ RXE_IMMDT_BYTES,
238 		}
239 	},
240 	[IB_OPCODE_RC_RDMA_WRITE_ONLY]			= {
241 		.name	= "IB_OPCODE_RC_RDMA_WRITE_ONLY",
242 		.mask	= RXE_RETH_MASK | RXE_PAYLOAD_MASK | RXE_REQ_MASK
243 				| RXE_WRITE_MASK | RXE_START_MASK
244 				| RXE_END_MASK,
245 		.length = RXE_BTH_BYTES + RXE_RETH_BYTES,
246 		.offset = {
247 			[RXE_BTH]	= 0,
248 			[RXE_RETH]	= RXE_BTH_BYTES,
249 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
250 						+ RXE_RETH_BYTES,
251 		}
252 	},
253 	[IB_OPCODE_RC_RDMA_WRITE_ONLY_WITH_IMMEDIATE]		= {
254 		.name	= "IB_OPCODE_RC_RDMA_WRITE_ONLY_WITH_IMMEDIATE",
255 		.mask	= RXE_RETH_MASK | RXE_IMMDT_MASK | RXE_PAYLOAD_MASK
256 				| RXE_REQ_MASK | RXE_WRITE_MASK
257 				| RXE_COMP_MASK | RXE_RWR_MASK
258 				| RXE_START_MASK | RXE_END_MASK,
259 		.length = RXE_BTH_BYTES + RXE_IMMDT_BYTES + RXE_RETH_BYTES,
260 		.offset = {
261 			[RXE_BTH]	= 0,
262 			[RXE_RETH]	= RXE_BTH_BYTES,
263 			[RXE_IMMDT]	= RXE_BTH_BYTES
264 						+ RXE_RETH_BYTES,
265 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
266 						+ RXE_RETH_BYTES
267 						+ RXE_IMMDT_BYTES,
268 		}
269 	},
270 	[IB_OPCODE_RC_RDMA_READ_REQUEST]			= {
271 		.name	= "IB_OPCODE_RC_RDMA_READ_REQUEST",
272 		.mask	= RXE_RETH_MASK | RXE_REQ_MASK | RXE_READ_MASK
273 				| RXE_START_MASK | RXE_END_MASK,
274 		.length = RXE_BTH_BYTES + RXE_RETH_BYTES,
275 		.offset = {
276 			[RXE_BTH]	= 0,
277 			[RXE_RETH]	= RXE_BTH_BYTES,
278 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
279 						+ RXE_RETH_BYTES,
280 		}
281 	},
282 	[IB_OPCODE_RC_RDMA_READ_RESPONSE_FIRST]		= {
283 		.name	= "IB_OPCODE_RC_RDMA_READ_RESPONSE_FIRST",
284 		.mask	= RXE_AETH_MASK | RXE_PAYLOAD_MASK | RXE_ACK_MASK
285 				| RXE_START_MASK,
286 		.length = RXE_BTH_BYTES + RXE_AETH_BYTES,
287 		.offset = {
288 			[RXE_BTH]	= 0,
289 			[RXE_AETH]	= RXE_BTH_BYTES,
290 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
291 						+ RXE_AETH_BYTES,
292 		}
293 	},
294 	[IB_OPCODE_RC_RDMA_READ_RESPONSE_MIDDLE]		= {
295 		.name	= "IB_OPCODE_RC_RDMA_READ_RESPONSE_MIDDLE",
296 		.mask	= RXE_PAYLOAD_MASK | RXE_ACK_MASK | RXE_MIDDLE_MASK,
297 		.length = RXE_BTH_BYTES,
298 		.offset = {
299 			[RXE_BTH]	= 0,
300 			[RXE_PAYLOAD]	= RXE_BTH_BYTES,
301 		}
302 	},
303 	[IB_OPCODE_RC_RDMA_READ_RESPONSE_LAST]		= {
304 		.name	= "IB_OPCODE_RC_RDMA_READ_RESPONSE_LAST",
305 		.mask	= RXE_AETH_MASK | RXE_PAYLOAD_MASK | RXE_ACK_MASK
306 				| RXE_END_MASK,
307 		.length = RXE_BTH_BYTES + RXE_AETH_BYTES,
308 		.offset = {
309 			[RXE_BTH]	= 0,
310 			[RXE_AETH]	= RXE_BTH_BYTES,
311 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
312 						+ RXE_AETH_BYTES,
313 		}
314 	},
315 	[IB_OPCODE_RC_RDMA_READ_RESPONSE_ONLY]		= {
316 		.name	= "IB_OPCODE_RC_RDMA_READ_RESPONSE_ONLY",
317 		.mask	= RXE_AETH_MASK | RXE_PAYLOAD_MASK | RXE_ACK_MASK
318 				| RXE_START_MASK | RXE_END_MASK,
319 		.length = RXE_BTH_BYTES + RXE_AETH_BYTES,
320 		.offset = {
321 			[RXE_BTH]	= 0,
322 			[RXE_AETH]	= RXE_BTH_BYTES,
323 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
324 						+ RXE_AETH_BYTES,
325 		}
326 	},
327 	[IB_OPCODE_RC_ACKNOWLEDGE]			= {
328 		.name	= "IB_OPCODE_RC_ACKNOWLEDGE",
329 		.mask	= RXE_AETH_MASK | RXE_ACK_MASK | RXE_START_MASK
330 				| RXE_END_MASK,
331 		.length = RXE_BTH_BYTES + RXE_AETH_BYTES,
332 		.offset = {
333 			[RXE_BTH]	= 0,
334 			[RXE_AETH]	= RXE_BTH_BYTES,
335 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
336 						+ RXE_AETH_BYTES,
337 		}
338 	},
339 	[IB_OPCODE_RC_ATOMIC_ACKNOWLEDGE]			= {
340 		.name	= "IB_OPCODE_RC_ATOMIC_ACKNOWLEDGE",
341 		.mask	= RXE_AETH_MASK | RXE_ATMACK_MASK | RXE_ACK_MASK
342 				| RXE_START_MASK | RXE_END_MASK,
343 		.length = RXE_BTH_BYTES + RXE_ATMACK_BYTES + RXE_AETH_BYTES,
344 		.offset = {
345 			[RXE_BTH]	= 0,
346 			[RXE_AETH]	= RXE_BTH_BYTES,
347 			[RXE_ATMACK]	= RXE_BTH_BYTES
348 						+ RXE_AETH_BYTES,
349 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
350 					+ RXE_ATMACK_BYTES + RXE_AETH_BYTES,
351 		}
352 	},
353 	[IB_OPCODE_RC_COMPARE_SWAP]			= {
354 		.name	= "IB_OPCODE_RC_COMPARE_SWAP",
355 		.mask	= RXE_ATMETH_MASK | RXE_REQ_MASK | RXE_ATOMIC_MASK
356 				| RXE_START_MASK | RXE_END_MASK,
357 		.length = RXE_BTH_BYTES + RXE_ATMETH_BYTES,
358 		.offset = {
359 			[RXE_BTH]	= 0,
360 			[RXE_ATMETH]	= RXE_BTH_BYTES,
361 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
362 						+ RXE_ATMETH_BYTES,
363 		}
364 	},
365 	[IB_OPCODE_RC_FETCH_ADD]			= {
366 		.name	= "IB_OPCODE_RC_FETCH_ADD",
367 		.mask	= RXE_ATMETH_MASK | RXE_REQ_MASK | RXE_ATOMIC_MASK
368 				| RXE_START_MASK | RXE_END_MASK,
369 		.length = RXE_BTH_BYTES + RXE_ATMETH_BYTES,
370 		.offset = {
371 			[RXE_BTH]	= 0,
372 			[RXE_ATMETH]	= RXE_BTH_BYTES,
373 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
374 						+ RXE_ATMETH_BYTES,
375 		}
376 	},
377 	[IB_OPCODE_RC_SEND_LAST_WITH_INVALIDATE]		= {
378 		.name	= "IB_OPCODE_RC_SEND_LAST_WITH_INVALIDATE",
379 		.mask	= RXE_IETH_MASK | RXE_PAYLOAD_MASK | RXE_REQ_MASK
380 				| RXE_COMP_MASK | RXE_SEND_MASK | RXE_END_MASK,
381 		.length = RXE_BTH_BYTES + RXE_IETH_BYTES,
382 		.offset = {
383 			[RXE_BTH]	= 0,
384 			[RXE_IETH]	= RXE_BTH_BYTES,
385 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
386 						+ RXE_IETH_BYTES,
387 		}
388 	},
389 	[IB_OPCODE_RC_SEND_ONLY_WITH_INVALIDATE]		= {
390 		.name	= "IB_OPCODE_RC_SEND_ONLY_INV",
391 		.mask	= RXE_IETH_MASK | RXE_PAYLOAD_MASK | RXE_REQ_MASK
392 				| RXE_COMP_MASK | RXE_RWR_MASK | RXE_SEND_MASK
393 				| RXE_END_MASK  | RXE_START_MASK,
394 		.length = RXE_BTH_BYTES + RXE_IETH_BYTES,
395 		.offset = {
396 			[RXE_BTH]	= 0,
397 			[RXE_IETH]	= RXE_BTH_BYTES,
398 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
399 						+ RXE_IETH_BYTES,
400 		}
401 	},
402 
403 	/* UC */
404 	[IB_OPCODE_UC_SEND_FIRST]			= {
405 		.name	= "IB_OPCODE_UC_SEND_FIRST",
406 		.mask	= RXE_PAYLOAD_MASK | RXE_REQ_MASK | RXE_RWR_MASK
407 				| RXE_SEND_MASK | RXE_START_MASK,
408 		.length = RXE_BTH_BYTES,
409 		.offset = {
410 			[RXE_BTH]	= 0,
411 			[RXE_PAYLOAD]	= RXE_BTH_BYTES,
412 		}
413 	},
414 	[IB_OPCODE_UC_SEND_MIDDLE]		= {
415 		.name	= "IB_OPCODE_UC_SEND_MIDDLE",
416 		.mask	= RXE_PAYLOAD_MASK | RXE_REQ_MASK | RXE_SEND_MASK
417 				| RXE_MIDDLE_MASK,
418 		.length = RXE_BTH_BYTES,
419 		.offset = {
420 			[RXE_BTH]	= 0,
421 			[RXE_PAYLOAD]	= RXE_BTH_BYTES,
422 		}
423 	},
424 	[IB_OPCODE_UC_SEND_LAST]			= {
425 		.name	= "IB_OPCODE_UC_SEND_LAST",
426 		.mask	= RXE_PAYLOAD_MASK | RXE_REQ_MASK | RXE_COMP_MASK
427 				| RXE_SEND_MASK | RXE_END_MASK,
428 		.length = RXE_BTH_BYTES,
429 		.offset = {
430 			[RXE_BTH]	= 0,
431 			[RXE_PAYLOAD]	= RXE_BTH_BYTES,
432 		}
433 	},
434 	[IB_OPCODE_UC_SEND_LAST_WITH_IMMEDIATE]		= {
435 		.name	= "IB_OPCODE_UC_SEND_LAST_WITH_IMMEDIATE",
436 		.mask	= RXE_IMMDT_MASK | RXE_PAYLOAD_MASK | RXE_REQ_MASK
437 				| RXE_COMP_MASK | RXE_SEND_MASK | RXE_END_MASK,
438 		.length = RXE_BTH_BYTES + RXE_IMMDT_BYTES,
439 		.offset = {
440 			[RXE_BTH]	= 0,
441 			[RXE_IMMDT]	= RXE_BTH_BYTES,
442 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
443 						+ RXE_IMMDT_BYTES,
444 		}
445 	},
446 	[IB_OPCODE_UC_SEND_ONLY]			= {
447 		.name	= "IB_OPCODE_UC_SEND_ONLY",
448 		.mask	= RXE_PAYLOAD_MASK | RXE_REQ_MASK | RXE_COMP_MASK
449 				| RXE_RWR_MASK | RXE_SEND_MASK
450 				| RXE_START_MASK | RXE_END_MASK,
451 		.length = RXE_BTH_BYTES,
452 		.offset = {
453 			[RXE_BTH]	= 0,
454 			[RXE_PAYLOAD]	= RXE_BTH_BYTES,
455 		}
456 	},
457 	[IB_OPCODE_UC_SEND_ONLY_WITH_IMMEDIATE]		= {
458 		.name	= "IB_OPCODE_UC_SEND_ONLY_WITH_IMMEDIATE",
459 		.mask	= RXE_IMMDT_MASK | RXE_PAYLOAD_MASK | RXE_REQ_MASK
460 				| RXE_COMP_MASK | RXE_RWR_MASK | RXE_SEND_MASK
461 				| RXE_START_MASK | RXE_END_MASK,
462 		.length = RXE_BTH_BYTES + RXE_IMMDT_BYTES,
463 		.offset = {
464 			[RXE_BTH]	= 0,
465 			[RXE_IMMDT]	= RXE_BTH_BYTES,
466 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
467 						+ RXE_IMMDT_BYTES,
468 		}
469 	},
470 	[IB_OPCODE_UC_RDMA_WRITE_FIRST]		= {
471 		.name	= "IB_OPCODE_UC_RDMA_WRITE_FIRST",
472 		.mask	= RXE_RETH_MASK | RXE_PAYLOAD_MASK | RXE_REQ_MASK
473 				| RXE_WRITE_MASK | RXE_START_MASK,
474 		.length = RXE_BTH_BYTES + RXE_RETH_BYTES,
475 		.offset = {
476 			[RXE_BTH]	= 0,
477 			[RXE_RETH]	= RXE_BTH_BYTES,
478 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
479 						+ RXE_RETH_BYTES,
480 		}
481 	},
482 	[IB_OPCODE_UC_RDMA_WRITE_MIDDLE]		= {
483 		.name	= "IB_OPCODE_UC_RDMA_WRITE_MIDDLE",
484 		.mask	= RXE_PAYLOAD_MASK | RXE_REQ_MASK | RXE_WRITE_MASK
485 				| RXE_MIDDLE_MASK,
486 		.length = RXE_BTH_BYTES,
487 		.offset = {
488 			[RXE_BTH]	= 0,
489 			[RXE_PAYLOAD]	= RXE_BTH_BYTES,
490 		}
491 	},
492 	[IB_OPCODE_UC_RDMA_WRITE_LAST]			= {
493 		.name	= "IB_OPCODE_UC_RDMA_WRITE_LAST",
494 		.mask	= RXE_PAYLOAD_MASK | RXE_REQ_MASK | RXE_WRITE_MASK
495 				| RXE_END_MASK,
496 		.length = RXE_BTH_BYTES,
497 		.offset = {
498 			[RXE_BTH]	= 0,
499 			[RXE_PAYLOAD]	= RXE_BTH_BYTES,
500 		}
501 	},
502 	[IB_OPCODE_UC_RDMA_WRITE_LAST_WITH_IMMEDIATE]		= {
503 		.name	= "IB_OPCODE_UC_RDMA_WRITE_LAST_WITH_IMMEDIATE",
504 		.mask	= RXE_IMMDT_MASK | RXE_PAYLOAD_MASK | RXE_REQ_MASK
505 				| RXE_WRITE_MASK | RXE_COMP_MASK | RXE_RWR_MASK
506 				| RXE_END_MASK,
507 		.length = RXE_BTH_BYTES + RXE_IMMDT_BYTES,
508 		.offset = {
509 			[RXE_BTH]	= 0,
510 			[RXE_IMMDT]	= RXE_BTH_BYTES,
511 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
512 						+ RXE_IMMDT_BYTES,
513 		}
514 	},
515 	[IB_OPCODE_UC_RDMA_WRITE_ONLY]			= {
516 		.name	= "IB_OPCODE_UC_RDMA_WRITE_ONLY",
517 		.mask	= RXE_RETH_MASK | RXE_PAYLOAD_MASK | RXE_REQ_MASK
518 				| RXE_WRITE_MASK | RXE_START_MASK
519 				| RXE_END_MASK,
520 		.length = RXE_BTH_BYTES + RXE_RETH_BYTES,
521 		.offset = {
522 			[RXE_BTH]	= 0,
523 			[RXE_RETH]	= RXE_BTH_BYTES,
524 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
525 						+ RXE_RETH_BYTES,
526 		}
527 	},
528 	[IB_OPCODE_UC_RDMA_WRITE_ONLY_WITH_IMMEDIATE]		= {
529 		.name	= "IB_OPCODE_UC_RDMA_WRITE_ONLY_WITH_IMMEDIATE",
530 		.mask	= RXE_RETH_MASK | RXE_IMMDT_MASK | RXE_PAYLOAD_MASK
531 				| RXE_REQ_MASK | RXE_WRITE_MASK
532 				| RXE_COMP_MASK | RXE_RWR_MASK
533 				| RXE_START_MASK | RXE_END_MASK,
534 		.length = RXE_BTH_BYTES + RXE_IMMDT_BYTES + RXE_RETH_BYTES,
535 		.offset = {
536 			[RXE_BTH]	= 0,
537 			[RXE_RETH]	= RXE_BTH_BYTES,
538 			[RXE_IMMDT]	= RXE_BTH_BYTES
539 						+ RXE_RETH_BYTES,
540 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
541 						+ RXE_RETH_BYTES
542 						+ RXE_IMMDT_BYTES,
543 		}
544 	},
545 
546 	/* RD */
547 	[IB_OPCODE_RD_SEND_FIRST]			= {
548 		.name	= "IB_OPCODE_RD_SEND_FIRST",
549 		.mask	= RXE_RDETH_MASK | RXE_DETH_MASK | RXE_PAYLOAD_MASK
550 				| RXE_REQ_MASK | RXE_RWR_MASK | RXE_SEND_MASK
551 				| RXE_START_MASK,
552 		.length = RXE_BTH_BYTES + RXE_DETH_BYTES + RXE_RDETH_BYTES,
553 		.offset = {
554 			[RXE_BTH]	= 0,
555 			[RXE_RDETH]	= RXE_BTH_BYTES,
556 			[RXE_DETH]	= RXE_BTH_BYTES
557 						+ RXE_RDETH_BYTES,
558 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
559 						+ RXE_RDETH_BYTES
560 						+ RXE_DETH_BYTES,
561 		}
562 	},
563 	[IB_OPCODE_RD_SEND_MIDDLE]		= {
564 		.name	= "IB_OPCODE_RD_SEND_MIDDLE",
565 		.mask	= RXE_RDETH_MASK | RXE_DETH_MASK | RXE_PAYLOAD_MASK
566 				| RXE_REQ_MASK | RXE_SEND_MASK
567 				| RXE_MIDDLE_MASK,
568 		.length = RXE_BTH_BYTES + RXE_DETH_BYTES + RXE_RDETH_BYTES,
569 		.offset = {
570 			[RXE_BTH]	= 0,
571 			[RXE_RDETH]	= RXE_BTH_BYTES,
572 			[RXE_DETH]	= RXE_BTH_BYTES
573 						+ RXE_RDETH_BYTES,
574 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
575 						+ RXE_RDETH_BYTES
576 						+ RXE_DETH_BYTES,
577 		}
578 	},
579 	[IB_OPCODE_RD_SEND_LAST]			= {
580 		.name	= "IB_OPCODE_RD_SEND_LAST",
581 		.mask	= RXE_RDETH_MASK | RXE_DETH_MASK | RXE_PAYLOAD_MASK
582 				| RXE_REQ_MASK | RXE_COMP_MASK | RXE_SEND_MASK
583 				| RXE_END_MASK,
584 		.length = RXE_BTH_BYTES + RXE_DETH_BYTES + RXE_RDETH_BYTES,
585 		.offset = {
586 			[RXE_BTH]	= 0,
587 			[RXE_RDETH]	= RXE_BTH_BYTES,
588 			[RXE_DETH]	= RXE_BTH_BYTES
589 						+ RXE_RDETH_BYTES,
590 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
591 						+ RXE_RDETH_BYTES
592 						+ RXE_DETH_BYTES,
593 		}
594 	},
595 	[IB_OPCODE_RD_SEND_LAST_WITH_IMMEDIATE]		= {
596 		.name	= "IB_OPCODE_RD_SEND_LAST_WITH_IMMEDIATE",
597 		.mask	= RXE_RDETH_MASK | RXE_DETH_MASK | RXE_IMMDT_MASK
598 				| RXE_PAYLOAD_MASK | RXE_REQ_MASK
599 				| RXE_COMP_MASK | RXE_SEND_MASK
600 				| RXE_END_MASK,
601 		.length = RXE_BTH_BYTES + RXE_IMMDT_BYTES + RXE_DETH_BYTES
602 				+ RXE_RDETH_BYTES,
603 		.offset = {
604 			[RXE_BTH]	= 0,
605 			[RXE_RDETH]	= RXE_BTH_BYTES,
606 			[RXE_DETH]	= RXE_BTH_BYTES
607 						+ RXE_RDETH_BYTES,
608 			[RXE_IMMDT]	= RXE_BTH_BYTES
609 						+ RXE_RDETH_BYTES
610 						+ RXE_DETH_BYTES,
611 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
612 						+ RXE_RDETH_BYTES
613 						+ RXE_DETH_BYTES
614 						+ RXE_IMMDT_BYTES,
615 		}
616 	},
617 	[IB_OPCODE_RD_SEND_ONLY]			= {
618 		.name	= "IB_OPCODE_RD_SEND_ONLY",
619 		.mask	= RXE_RDETH_MASK | RXE_DETH_MASK | RXE_PAYLOAD_MASK
620 				| RXE_REQ_MASK | RXE_COMP_MASK | RXE_RWR_MASK
621 				| RXE_SEND_MASK | RXE_START_MASK | RXE_END_MASK,
622 		.length = RXE_BTH_BYTES + RXE_DETH_BYTES + RXE_RDETH_BYTES,
623 		.offset = {
624 			[RXE_BTH]	= 0,
625 			[RXE_RDETH]	= RXE_BTH_BYTES,
626 			[RXE_DETH]	= RXE_BTH_BYTES
627 						+ RXE_RDETH_BYTES,
628 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
629 						+ RXE_RDETH_BYTES
630 						+ RXE_DETH_BYTES,
631 		}
632 	},
633 	[IB_OPCODE_RD_SEND_ONLY_WITH_IMMEDIATE]		= {
634 		.name	= "IB_OPCODE_RD_SEND_ONLY_WITH_IMMEDIATE",
635 		.mask	= RXE_RDETH_MASK | RXE_DETH_MASK | RXE_IMMDT_MASK
636 				| RXE_PAYLOAD_MASK | RXE_REQ_MASK
637 				| RXE_COMP_MASK | RXE_RWR_MASK | RXE_SEND_MASK
638 				| RXE_START_MASK | RXE_END_MASK,
639 		.length = RXE_BTH_BYTES + RXE_IMMDT_BYTES + RXE_DETH_BYTES
640 				+ RXE_RDETH_BYTES,
641 		.offset = {
642 			[RXE_BTH]	= 0,
643 			[RXE_RDETH]	= RXE_BTH_BYTES,
644 			[RXE_DETH]	= RXE_BTH_BYTES
645 						+ RXE_RDETH_BYTES,
646 			[RXE_IMMDT]	= RXE_BTH_BYTES
647 						+ RXE_RDETH_BYTES
648 						+ RXE_DETH_BYTES,
649 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
650 						+ RXE_RDETH_BYTES
651 						+ RXE_DETH_BYTES
652 						+ RXE_IMMDT_BYTES,
653 		}
654 	},
655 	[IB_OPCODE_RD_RDMA_WRITE_FIRST]		= {
656 		.name	= "IB_OPCODE_RD_RDMA_WRITE_FIRST",
657 		.mask	= RXE_RDETH_MASK | RXE_DETH_MASK | RXE_RETH_MASK
658 				| RXE_PAYLOAD_MASK | RXE_REQ_MASK
659 				| RXE_WRITE_MASK | RXE_START_MASK,
660 		.length = RXE_BTH_BYTES + RXE_RETH_BYTES + RXE_DETH_BYTES
661 				+ RXE_RDETH_BYTES,
662 		.offset = {
663 			[RXE_BTH]	= 0,
664 			[RXE_RDETH]	= RXE_BTH_BYTES,
665 			[RXE_DETH]	= RXE_BTH_BYTES
666 						+ RXE_RDETH_BYTES,
667 			[RXE_RETH]	= RXE_BTH_BYTES
668 						+ RXE_RDETH_BYTES
669 						+ RXE_DETH_BYTES,
670 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
671 						+ RXE_RDETH_BYTES
672 						+ RXE_DETH_BYTES
673 						+ RXE_RETH_BYTES,
674 		}
675 	},
676 	[IB_OPCODE_RD_RDMA_WRITE_MIDDLE]		= {
677 		.name	= "IB_OPCODE_RD_RDMA_WRITE_MIDDLE",
678 		.mask	= RXE_RDETH_MASK | RXE_DETH_MASK | RXE_PAYLOAD_MASK
679 				| RXE_REQ_MASK | RXE_WRITE_MASK
680 				| RXE_MIDDLE_MASK,
681 		.length = RXE_BTH_BYTES + RXE_DETH_BYTES + RXE_RDETH_BYTES,
682 		.offset = {
683 			[RXE_BTH]	= 0,
684 			[RXE_RDETH]	= RXE_BTH_BYTES,
685 			[RXE_DETH]	= RXE_BTH_BYTES
686 						+ RXE_RDETH_BYTES,
687 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
688 						+ RXE_RDETH_BYTES
689 						+ RXE_DETH_BYTES,
690 		}
691 	},
692 	[IB_OPCODE_RD_RDMA_WRITE_LAST]			= {
693 		.name	= "IB_OPCODE_RD_RDMA_WRITE_LAST",
694 		.mask	= RXE_RDETH_MASK | RXE_DETH_MASK | RXE_PAYLOAD_MASK
695 				| RXE_REQ_MASK | RXE_WRITE_MASK
696 				| RXE_END_MASK,
697 		.length = RXE_BTH_BYTES + RXE_DETH_BYTES + RXE_RDETH_BYTES,
698 		.offset = {
699 			[RXE_BTH]	= 0,
700 			[RXE_RDETH]	= RXE_BTH_BYTES,
701 			[RXE_DETH]	= RXE_BTH_BYTES
702 						+ RXE_RDETH_BYTES,
703 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
704 						+ RXE_RDETH_BYTES
705 						+ RXE_DETH_BYTES,
706 		}
707 	},
708 	[IB_OPCODE_RD_RDMA_WRITE_LAST_WITH_IMMEDIATE]		= {
709 		.name	= "IB_OPCODE_RD_RDMA_WRITE_LAST_WITH_IMMEDIATE",
710 		.mask	= RXE_RDETH_MASK | RXE_DETH_MASK | RXE_IMMDT_MASK
711 				| RXE_PAYLOAD_MASK | RXE_REQ_MASK
712 				| RXE_WRITE_MASK | RXE_COMP_MASK | RXE_RWR_MASK
713 				| RXE_END_MASK,
714 		.length = RXE_BTH_BYTES + RXE_IMMDT_BYTES + RXE_DETH_BYTES
715 				+ RXE_RDETH_BYTES,
716 		.offset = {
717 			[RXE_BTH]	= 0,
718 			[RXE_RDETH]	= RXE_BTH_BYTES,
719 			[RXE_DETH]	= RXE_BTH_BYTES
720 						+ RXE_RDETH_BYTES,
721 			[RXE_IMMDT]	= RXE_BTH_BYTES
722 						+ RXE_RDETH_BYTES
723 						+ RXE_DETH_BYTES,
724 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
725 						+ RXE_RDETH_BYTES
726 						+ RXE_DETH_BYTES
727 						+ RXE_IMMDT_BYTES,
728 		}
729 	},
730 	[IB_OPCODE_RD_RDMA_WRITE_ONLY]			= {
731 		.name	= "IB_OPCODE_RD_RDMA_WRITE_ONLY",
732 		.mask	= RXE_RDETH_MASK | RXE_DETH_MASK | RXE_RETH_MASK
733 				| RXE_PAYLOAD_MASK | RXE_REQ_MASK
734 				| RXE_WRITE_MASK | RXE_START_MASK
735 				| RXE_END_MASK,
736 		.length = RXE_BTH_BYTES + RXE_RETH_BYTES + RXE_DETH_BYTES
737 				+ RXE_RDETH_BYTES,
738 		.offset = {
739 			[RXE_BTH]	= 0,
740 			[RXE_RDETH]	= RXE_BTH_BYTES,
741 			[RXE_DETH]	= RXE_BTH_BYTES
742 						+ RXE_RDETH_BYTES,
743 			[RXE_RETH]	= RXE_BTH_BYTES
744 						+ RXE_RDETH_BYTES
745 						+ RXE_DETH_BYTES,
746 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
747 						+ RXE_RDETH_BYTES
748 						+ RXE_DETH_BYTES
749 						+ RXE_RETH_BYTES,
750 		}
751 	},
752 	[IB_OPCODE_RD_RDMA_WRITE_ONLY_WITH_IMMEDIATE]		= {
753 		.name	= "IB_OPCODE_RD_RDMA_WRITE_ONLY_WITH_IMMEDIATE",
754 		.mask	= RXE_RDETH_MASK | RXE_DETH_MASK | RXE_RETH_MASK
755 				| RXE_IMMDT_MASK | RXE_PAYLOAD_MASK
756 				| RXE_REQ_MASK | RXE_WRITE_MASK
757 				| RXE_COMP_MASK | RXE_RWR_MASK
758 				| RXE_START_MASK | RXE_END_MASK,
759 		.length = RXE_BTH_BYTES + RXE_IMMDT_BYTES + RXE_RETH_BYTES
760 				+ RXE_DETH_BYTES + RXE_RDETH_BYTES,
761 		.offset = {
762 			[RXE_BTH]	= 0,
763 			[RXE_RDETH]	= RXE_BTH_BYTES,
764 			[RXE_DETH]	= RXE_BTH_BYTES
765 						+ RXE_RDETH_BYTES,
766 			[RXE_RETH]	= RXE_BTH_BYTES
767 						+ RXE_RDETH_BYTES
768 						+ RXE_DETH_BYTES,
769 			[RXE_IMMDT]	= RXE_BTH_BYTES
770 						+ RXE_RDETH_BYTES
771 						+ RXE_DETH_BYTES
772 						+ RXE_RETH_BYTES,
773 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
774 						+ RXE_RDETH_BYTES
775 						+ RXE_DETH_BYTES
776 						+ RXE_RETH_BYTES
777 						+ RXE_IMMDT_BYTES,
778 		}
779 	},
780 	[IB_OPCODE_RD_RDMA_READ_REQUEST]			= {
781 		.name	= "IB_OPCODE_RD_RDMA_READ_REQUEST",
782 		.mask	= RXE_RDETH_MASK | RXE_DETH_MASK | RXE_RETH_MASK
783 				| RXE_REQ_MASK | RXE_READ_MASK
784 				| RXE_START_MASK | RXE_END_MASK,
785 		.length = RXE_BTH_BYTES + RXE_RETH_BYTES + RXE_DETH_BYTES
786 				+ RXE_RDETH_BYTES,
787 		.offset = {
788 			[RXE_BTH]	= 0,
789 			[RXE_RDETH]	= RXE_BTH_BYTES,
790 			[RXE_DETH]	= RXE_BTH_BYTES
791 						+ RXE_RDETH_BYTES,
792 			[RXE_RETH]	= RXE_BTH_BYTES
793 						+ RXE_RDETH_BYTES
794 						+ RXE_DETH_BYTES,
795 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
796 						+ RXE_RETH_BYTES
797 						+ RXE_DETH_BYTES
798 						+ RXE_RDETH_BYTES,
799 		}
800 	},
801 	[IB_OPCODE_RD_RDMA_READ_RESPONSE_FIRST]		= {
802 		.name	= "IB_OPCODE_RD_RDMA_READ_RESPONSE_FIRST",
803 		.mask	= RXE_RDETH_MASK | RXE_AETH_MASK
804 				| RXE_PAYLOAD_MASK | RXE_ACK_MASK
805 				| RXE_START_MASK,
806 		.length = RXE_BTH_BYTES + RXE_AETH_BYTES + RXE_RDETH_BYTES,
807 		.offset = {
808 			[RXE_BTH]	= 0,
809 			[RXE_RDETH]	= RXE_BTH_BYTES,
810 			[RXE_AETH]	= RXE_BTH_BYTES
811 						+ RXE_RDETH_BYTES,
812 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
813 						+ RXE_RDETH_BYTES
814 						+ RXE_AETH_BYTES,
815 		}
816 	},
817 	[IB_OPCODE_RD_RDMA_READ_RESPONSE_MIDDLE]		= {
818 		.name	= "IB_OPCODE_RD_RDMA_READ_RESPONSE_MIDDLE",
819 		.mask	= RXE_RDETH_MASK | RXE_PAYLOAD_MASK | RXE_ACK_MASK
820 				| RXE_MIDDLE_MASK,
821 		.length = RXE_BTH_BYTES + RXE_RDETH_BYTES,
822 		.offset = {
823 			[RXE_BTH]	= 0,
824 			[RXE_RDETH]	= RXE_BTH_BYTES,
825 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
826 						+ RXE_RDETH_BYTES,
827 		}
828 	},
829 	[IB_OPCODE_RD_RDMA_READ_RESPONSE_LAST]		= {
830 		.name	= "IB_OPCODE_RD_RDMA_READ_RESPONSE_LAST",
831 		.mask	= RXE_RDETH_MASK | RXE_AETH_MASK | RXE_PAYLOAD_MASK
832 				| RXE_ACK_MASK | RXE_END_MASK,
833 		.length = RXE_BTH_BYTES + RXE_AETH_BYTES + RXE_RDETH_BYTES,
834 		.offset = {
835 			[RXE_BTH]	= 0,
836 			[RXE_RDETH]	= RXE_BTH_BYTES,
837 			[RXE_AETH]	= RXE_BTH_BYTES
838 						+ RXE_RDETH_BYTES,
839 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
840 						+ RXE_RDETH_BYTES
841 						+ RXE_AETH_BYTES,
842 		}
843 	},
844 	[IB_OPCODE_RD_RDMA_READ_RESPONSE_ONLY]		= {
845 		.name	= "IB_OPCODE_RD_RDMA_READ_RESPONSE_ONLY",
846 		.mask	= RXE_RDETH_MASK | RXE_AETH_MASK | RXE_PAYLOAD_MASK
847 				| RXE_ACK_MASK | RXE_START_MASK | RXE_END_MASK,
848 		.length = RXE_BTH_BYTES + RXE_AETH_BYTES + RXE_RDETH_BYTES,
849 		.offset = {
850 			[RXE_BTH]	= 0,
851 			[RXE_RDETH]	= RXE_BTH_BYTES,
852 			[RXE_AETH]	= RXE_BTH_BYTES
853 						+ RXE_RDETH_BYTES,
854 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
855 						+ RXE_RDETH_BYTES
856 						+ RXE_AETH_BYTES,
857 		}
858 	},
859 	[IB_OPCODE_RD_ACKNOWLEDGE]			= {
860 		.name	= "IB_OPCODE_RD_ACKNOWLEDGE",
861 		.mask	= RXE_RDETH_MASK | RXE_AETH_MASK | RXE_ACK_MASK
862 				| RXE_START_MASK | RXE_END_MASK,
863 		.length = RXE_BTH_BYTES + RXE_AETH_BYTES + RXE_RDETH_BYTES,
864 		.offset = {
865 			[RXE_BTH]	= 0,
866 			[RXE_RDETH]	= RXE_BTH_BYTES,
867 			[RXE_AETH]	= RXE_BTH_BYTES
868 						+ RXE_RDETH_BYTES,
869 		}
870 	},
871 	[IB_OPCODE_RD_ATOMIC_ACKNOWLEDGE]			= {
872 		.name	= "IB_OPCODE_RD_ATOMIC_ACKNOWLEDGE",
873 		.mask	= RXE_RDETH_MASK | RXE_AETH_MASK | RXE_ATMACK_MASK
874 				| RXE_ACK_MASK | RXE_START_MASK | RXE_END_MASK,
875 		.length = RXE_BTH_BYTES + RXE_ATMACK_BYTES + RXE_AETH_BYTES
876 				+ RXE_RDETH_BYTES,
877 		.offset = {
878 			[RXE_BTH]	= 0,
879 			[RXE_RDETH]	= RXE_BTH_BYTES,
880 			[RXE_AETH]	= RXE_BTH_BYTES
881 						+ RXE_RDETH_BYTES,
882 			[RXE_ATMACK]	= RXE_BTH_BYTES
883 						+ RXE_RDETH_BYTES
884 						+ RXE_AETH_BYTES,
885 		}
886 	},
887 	[IB_OPCODE_RD_COMPARE_SWAP]			= {
888 		.name	= "RD_COMPARE_SWAP",
889 		.mask	= RXE_RDETH_MASK | RXE_DETH_MASK | RXE_ATMETH_MASK
890 				| RXE_REQ_MASK | RXE_ATOMIC_MASK
891 				| RXE_START_MASK | RXE_END_MASK,
892 		.length = RXE_BTH_BYTES + RXE_ATMETH_BYTES + RXE_DETH_BYTES
893 				+ RXE_RDETH_BYTES,
894 		.offset = {
895 			[RXE_BTH]	= 0,
896 			[RXE_RDETH]	= RXE_BTH_BYTES,
897 			[RXE_DETH]	= RXE_BTH_BYTES
898 						+ RXE_RDETH_BYTES,
899 			[RXE_ATMETH]	= RXE_BTH_BYTES
900 						+ RXE_RDETH_BYTES
901 						+ RXE_DETH_BYTES,
902 			[RXE_PAYLOAD]	= RXE_BTH_BYTES +
903 						+ RXE_ATMETH_BYTES
904 						+ RXE_DETH_BYTES +
905 						+ RXE_RDETH_BYTES,
906 		}
907 	},
908 	[IB_OPCODE_RD_FETCH_ADD]			= {
909 		.name	= "IB_OPCODE_RD_FETCH_ADD",
910 		.mask	= RXE_RDETH_MASK | RXE_DETH_MASK | RXE_ATMETH_MASK
911 				| RXE_REQ_MASK | RXE_ATOMIC_MASK
912 				| RXE_START_MASK | RXE_END_MASK,
913 		.length = RXE_BTH_BYTES + RXE_ATMETH_BYTES + RXE_DETH_BYTES
914 				+ RXE_RDETH_BYTES,
915 		.offset = {
916 			[RXE_BTH]	= 0,
917 			[RXE_RDETH]	= RXE_BTH_BYTES,
918 			[RXE_DETH]	= RXE_BTH_BYTES
919 						+ RXE_RDETH_BYTES,
920 			[RXE_ATMETH]	= RXE_BTH_BYTES
921 						+ RXE_RDETH_BYTES
922 						+ RXE_DETH_BYTES,
923 			[RXE_PAYLOAD]	= RXE_BTH_BYTES +
924 						+ RXE_ATMETH_BYTES
925 						+ RXE_DETH_BYTES +
926 						+ RXE_RDETH_BYTES,
927 		}
928 	},
929 
930 	/* UD */
931 	[IB_OPCODE_UD_SEND_ONLY]			= {
932 		.name	= "IB_OPCODE_UD_SEND_ONLY",
933 		.mask	= RXE_DETH_MASK | RXE_PAYLOAD_MASK | RXE_REQ_MASK
934 				| RXE_COMP_MASK | RXE_RWR_MASK | RXE_SEND_MASK
935 				| RXE_START_MASK | RXE_END_MASK,
936 		.length = RXE_BTH_BYTES + RXE_DETH_BYTES,
937 		.offset = {
938 			[RXE_BTH]	= 0,
939 			[RXE_DETH]	= RXE_BTH_BYTES,
940 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
941 						+ RXE_DETH_BYTES,
942 		}
943 	},
944 	[IB_OPCODE_UD_SEND_ONLY_WITH_IMMEDIATE]		= {
945 		.name	= "IB_OPCODE_UD_SEND_ONLY_WITH_IMMEDIATE",
946 		.mask	= RXE_DETH_MASK | RXE_IMMDT_MASK | RXE_PAYLOAD_MASK
947 				| RXE_REQ_MASK | RXE_COMP_MASK | RXE_RWR_MASK
948 				| RXE_SEND_MASK | RXE_START_MASK | RXE_END_MASK,
949 		.length = RXE_BTH_BYTES + RXE_IMMDT_BYTES + RXE_DETH_BYTES,
950 		.offset = {
951 			[RXE_BTH]	= 0,
952 			[RXE_DETH]	= RXE_BTH_BYTES,
953 			[RXE_IMMDT]	= RXE_BTH_BYTES
954 						+ RXE_DETH_BYTES,
955 			[RXE_PAYLOAD]	= RXE_BTH_BYTES
956 						+ RXE_DETH_BYTES
957 						+ RXE_IMMDT_BYTES,
958 		}
959 	},
960 
961 };
962