34 #include <linux/errno.h>
35 #include <linux/string.h>
36 #include <linux/export.h>
37 #include <linux/if_ether.h>
41 #define STRUCT_FIELD(header, field) \
42 .struct_offset_bytes = offsetof(struct ib_unpacked_ ## header, field), \
43 .struct_size_bytes = sizeof ((struct ib_unpacked_ ## header *) 0)->field, \
44 .field_name = #header ":" #field
46 static const struct ib_field lrh_table[] = {
85 static const struct ib_field eth_table[] = {
108 static const struct ib_field vlan_table[] = {
119 static const struct ib_field grh_table[] = {
154 static const struct ib_field bth_table[] = {
201 static const struct ib_field deth_table[] = {
231 int immediate_present,
234 memset(header, 0,
sizeof *header);
239 header->
lrh.link_version = 0;
240 header->
lrh.link_next_header =
256 header->
grh.ip_version = 6;
257 header->
grh.payload_length =
263 header->
grh.next_header = 0x1b;
266 if (immediate_present)
267 header->
bth.opcode = IB_OPCODE_UD_SEND_ONLY_WITH_IMMEDIATE;
269 header->
bth.opcode = IB_OPCODE_UD_SEND_ONLY;
270 header->
bth.pad_count = (4 - payload_bytes) & 3;
271 header->
bth.transport_header_version = 0;
296 &header->
lrh, buf + len);
301 &header->
eth, buf + len);
306 &header->
vlan, buf + len);
311 &header->
grh, buf + len);
316 &header->
bth, buf + len);
320 &header->
deth, buf + len);
347 if (header->
lrh.link_version != 0) {
349 header->
lrh.link_version);
353 switch (header->
lrh.link_next_header) {
364 if (header->
grh.ip_version != 6) {
366 header->
grh.ip_version);
369 if (header->
grh.next_header != 0x1b) {
371 header->
grh.next_header);
378 header->
lrh.link_next_header);
386 switch (header->
bth.opcode) {
387 case IB_OPCODE_UD_SEND_ONLY:
390 case IB_OPCODE_UD_SEND_ONLY_WITH_IMMEDIATE:
399 if (header->
bth.transport_header_version != 0) {
401 header->
bth.transport_header_version);