Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/include/rdma/ib_pack.h
26282 views
1
/* SPDX-License-Identifier: GPL-2.0 OR Linux-OpenIB */
2
/*
3
* Copyright (c) 2004 Topspin Corporation. All rights reserved.
4
*/
5
6
#ifndef IB_PACK_H
7
#define IB_PACK_H
8
9
#include <rdma/ib_verbs.h>
10
#include <uapi/linux/if_ether.h>
11
12
enum {
13
IB_LRH_BYTES = 8,
14
IB_ETH_BYTES = 14,
15
IB_VLAN_BYTES = 4,
16
IB_GRH_BYTES = 40,
17
IB_IP4_BYTES = 20,
18
IB_UDP_BYTES = 8,
19
IB_BTH_BYTES = 12,
20
IB_DETH_BYTES = 8,
21
IB_EXT_ATOMICETH_BYTES = 28,
22
IB_EXT_XRC_BYTES = 4,
23
IB_ICRC_BYTES = 4
24
};
25
26
struct ib_field {
27
size_t struct_offset_bytes;
28
size_t struct_size_bytes;
29
int offset_words;
30
int offset_bits;
31
int size_bits;
32
char *field_name;
33
};
34
35
#define RESERVED \
36
.field_name = "reserved"
37
38
/*
39
* This macro cleans up the definitions of constants for BTH opcodes.
40
* It is used to define constants such as IB_OPCODE_UD_SEND_ONLY,
41
* which becomes IB_OPCODE_UD + IB_OPCODE_SEND_ONLY, and this gives
42
* the correct value.
43
*
44
* In short, user code should use the constants defined using the
45
* macro rather than worrying about adding together other constants.
46
*/
47
#define IB_OPCODE(transport, op) \
48
IB_OPCODE_ ## transport ## _ ## op = \
49
IB_OPCODE_ ## transport + IB_OPCODE_ ## op
50
51
enum {
52
/* transport types -- just used to define real constants */
53
IB_OPCODE_RC = 0x00,
54
IB_OPCODE_UC = 0x20,
55
IB_OPCODE_RD = 0x40,
56
IB_OPCODE_UD = 0x60,
57
/* per IBTA 1.3 vol 1 Table 38, A10.3.2 */
58
IB_OPCODE_CNP = 0x80,
59
/* Manufacturer specific */
60
IB_OPCODE_MSP = 0xe0,
61
62
/* operations -- just used to define real constants */
63
IB_OPCODE_SEND_FIRST = 0x00,
64
IB_OPCODE_SEND_MIDDLE = 0x01,
65
IB_OPCODE_SEND_LAST = 0x02,
66
IB_OPCODE_SEND_LAST_WITH_IMMEDIATE = 0x03,
67
IB_OPCODE_SEND_ONLY = 0x04,
68
IB_OPCODE_SEND_ONLY_WITH_IMMEDIATE = 0x05,
69
IB_OPCODE_RDMA_WRITE_FIRST = 0x06,
70
IB_OPCODE_RDMA_WRITE_MIDDLE = 0x07,
71
IB_OPCODE_RDMA_WRITE_LAST = 0x08,
72
IB_OPCODE_RDMA_WRITE_LAST_WITH_IMMEDIATE = 0x09,
73
IB_OPCODE_RDMA_WRITE_ONLY = 0x0a,
74
IB_OPCODE_RDMA_WRITE_ONLY_WITH_IMMEDIATE = 0x0b,
75
IB_OPCODE_RDMA_READ_REQUEST = 0x0c,
76
IB_OPCODE_RDMA_READ_RESPONSE_FIRST = 0x0d,
77
IB_OPCODE_RDMA_READ_RESPONSE_MIDDLE = 0x0e,
78
IB_OPCODE_RDMA_READ_RESPONSE_LAST = 0x0f,
79
IB_OPCODE_RDMA_READ_RESPONSE_ONLY = 0x10,
80
IB_OPCODE_ACKNOWLEDGE = 0x11,
81
IB_OPCODE_ATOMIC_ACKNOWLEDGE = 0x12,
82
IB_OPCODE_COMPARE_SWAP = 0x13,
83
IB_OPCODE_FETCH_ADD = 0x14,
84
/* opcode 0x15 is reserved */
85
IB_OPCODE_SEND_LAST_WITH_INVALIDATE = 0x16,
86
IB_OPCODE_SEND_ONLY_WITH_INVALIDATE = 0x17,
87
IB_OPCODE_FLUSH = 0x1C,
88
IB_OPCODE_ATOMIC_WRITE = 0x1D,
89
90
/* real constants follow -- see comment about above IB_OPCODE()
91
macro for more details */
92
93
/* RC */
94
IB_OPCODE(RC, SEND_FIRST),
95
IB_OPCODE(RC, SEND_MIDDLE),
96
IB_OPCODE(RC, SEND_LAST),
97
IB_OPCODE(RC, SEND_LAST_WITH_IMMEDIATE),
98
IB_OPCODE(RC, SEND_ONLY),
99
IB_OPCODE(RC, SEND_ONLY_WITH_IMMEDIATE),
100
IB_OPCODE(RC, RDMA_WRITE_FIRST),
101
IB_OPCODE(RC, RDMA_WRITE_MIDDLE),
102
IB_OPCODE(RC, RDMA_WRITE_LAST),
103
IB_OPCODE(RC, RDMA_WRITE_LAST_WITH_IMMEDIATE),
104
IB_OPCODE(RC, RDMA_WRITE_ONLY),
105
IB_OPCODE(RC, RDMA_WRITE_ONLY_WITH_IMMEDIATE),
106
IB_OPCODE(RC, RDMA_READ_REQUEST),
107
IB_OPCODE(RC, RDMA_READ_RESPONSE_FIRST),
108
IB_OPCODE(RC, RDMA_READ_RESPONSE_MIDDLE),
109
IB_OPCODE(RC, RDMA_READ_RESPONSE_LAST),
110
IB_OPCODE(RC, RDMA_READ_RESPONSE_ONLY),
111
IB_OPCODE(RC, ACKNOWLEDGE),
112
IB_OPCODE(RC, ATOMIC_ACKNOWLEDGE),
113
IB_OPCODE(RC, COMPARE_SWAP),
114
IB_OPCODE(RC, FETCH_ADD),
115
IB_OPCODE(RC, SEND_LAST_WITH_INVALIDATE),
116
IB_OPCODE(RC, SEND_ONLY_WITH_INVALIDATE),
117
IB_OPCODE(RC, FLUSH),
118
IB_OPCODE(RC, ATOMIC_WRITE),
119
120
/* UC */
121
IB_OPCODE(UC, SEND_FIRST),
122
IB_OPCODE(UC, SEND_MIDDLE),
123
IB_OPCODE(UC, SEND_LAST),
124
IB_OPCODE(UC, SEND_LAST_WITH_IMMEDIATE),
125
IB_OPCODE(UC, SEND_ONLY),
126
IB_OPCODE(UC, SEND_ONLY_WITH_IMMEDIATE),
127
IB_OPCODE(UC, RDMA_WRITE_FIRST),
128
IB_OPCODE(UC, RDMA_WRITE_MIDDLE),
129
IB_OPCODE(UC, RDMA_WRITE_LAST),
130
IB_OPCODE(UC, RDMA_WRITE_LAST_WITH_IMMEDIATE),
131
IB_OPCODE(UC, RDMA_WRITE_ONLY),
132
IB_OPCODE(UC, RDMA_WRITE_ONLY_WITH_IMMEDIATE),
133
134
/* RD */
135
IB_OPCODE(RD, SEND_FIRST),
136
IB_OPCODE(RD, SEND_MIDDLE),
137
IB_OPCODE(RD, SEND_LAST),
138
IB_OPCODE(RD, SEND_LAST_WITH_IMMEDIATE),
139
IB_OPCODE(RD, SEND_ONLY),
140
IB_OPCODE(RD, SEND_ONLY_WITH_IMMEDIATE),
141
IB_OPCODE(RD, RDMA_WRITE_FIRST),
142
IB_OPCODE(RD, RDMA_WRITE_MIDDLE),
143
IB_OPCODE(RD, RDMA_WRITE_LAST),
144
IB_OPCODE(RD, RDMA_WRITE_LAST_WITH_IMMEDIATE),
145
IB_OPCODE(RD, RDMA_WRITE_ONLY),
146
IB_OPCODE(RD, RDMA_WRITE_ONLY_WITH_IMMEDIATE),
147
IB_OPCODE(RD, RDMA_READ_REQUEST),
148
IB_OPCODE(RD, RDMA_READ_RESPONSE_FIRST),
149
IB_OPCODE(RD, RDMA_READ_RESPONSE_MIDDLE),
150
IB_OPCODE(RD, RDMA_READ_RESPONSE_LAST),
151
IB_OPCODE(RD, RDMA_READ_RESPONSE_ONLY),
152
IB_OPCODE(RD, ACKNOWLEDGE),
153
IB_OPCODE(RD, ATOMIC_ACKNOWLEDGE),
154
IB_OPCODE(RD, COMPARE_SWAP),
155
IB_OPCODE(RD, FETCH_ADD),
156
IB_OPCODE(RD, FLUSH),
157
158
/* UD */
159
IB_OPCODE(UD, SEND_ONLY),
160
IB_OPCODE(UD, SEND_ONLY_WITH_IMMEDIATE)
161
};
162
163
enum {
164
IB_LNH_RAW = 0,
165
IB_LNH_IP = 1,
166
IB_LNH_IBA_LOCAL = 2,
167
IB_LNH_IBA_GLOBAL = 3
168
};
169
170
struct ib_unpacked_lrh {
171
u8 virtual_lane;
172
u8 link_version;
173
u8 service_level;
174
u8 link_next_header;
175
__be16 destination_lid;
176
__be16 packet_length;
177
__be16 source_lid;
178
};
179
180
struct ib_unpacked_grh {
181
u8 ip_version;
182
u8 traffic_class;
183
__be32 flow_label;
184
__be16 payload_length;
185
u8 next_header;
186
u8 hop_limit;
187
union ib_gid source_gid;
188
union ib_gid destination_gid;
189
};
190
191
struct ib_unpacked_bth {
192
u8 opcode;
193
u8 solicited_event;
194
u8 mig_req;
195
u8 pad_count;
196
u8 transport_header_version;
197
__be16 pkey;
198
__be32 destination_qpn;
199
u8 ack_req;
200
__be32 psn;
201
};
202
203
struct ib_unpacked_deth {
204
__be32 qkey;
205
__be32 source_qpn;
206
};
207
208
struct ib_unpacked_eth {
209
u8 dmac_h[4];
210
u8 dmac_l[2];
211
u8 smac_h[2];
212
u8 smac_l[4];
213
__be16 type;
214
};
215
216
struct ib_unpacked_ip4 {
217
u8 ver;
218
u8 hdr_len;
219
u8 tos;
220
__be16 tot_len;
221
__be16 id;
222
__be16 frag_off;
223
u8 ttl;
224
u8 protocol;
225
__sum16 check;
226
__be32 saddr;
227
__be32 daddr;
228
};
229
230
struct ib_unpacked_udp {
231
__be16 sport;
232
__be16 dport;
233
__be16 length;
234
__be16 csum;
235
};
236
237
struct ib_unpacked_vlan {
238
__be16 tag;
239
__be16 type;
240
};
241
242
struct ib_ud_header {
243
int lrh_present;
244
struct ib_unpacked_lrh lrh;
245
int eth_present;
246
struct ib_unpacked_eth eth;
247
int vlan_present;
248
struct ib_unpacked_vlan vlan;
249
int grh_present;
250
struct ib_unpacked_grh grh;
251
int ipv4_present;
252
struct ib_unpacked_ip4 ip4;
253
int udp_present;
254
struct ib_unpacked_udp udp;
255
struct ib_unpacked_bth bth;
256
struct ib_unpacked_deth deth;
257
int immediate_present;
258
__be32 immediate_data;
259
};
260
261
void ib_pack(const struct ib_field *desc,
262
int desc_len,
263
void *structure,
264
void *buf);
265
266
void ib_unpack(const struct ib_field *desc,
267
int desc_len,
268
void *buf,
269
void *structure);
270
271
__sum16 ib_ud_ip4_csum(struct ib_ud_header *header);
272
273
int ib_ud_header_init(int payload_bytes,
274
int lrh_present,
275
int eth_present,
276
int vlan_present,
277
int grh_present,
278
int ip_version,
279
int udp_present,
280
int immediate_present,
281
struct ib_ud_header *header);
282
283
int ib_ud_header_pack(struct ib_ud_header *header,
284
void *buf);
285
286
#endif /* IB_PACK_H */
287
288