Blame view

include/scsi/iscsi_if.h 10.1 KB
39e84790d   Alex Aizman   [SCSI] open-iscsi...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
  /*
   * iSCSI User/Kernel Shares (Defines, Constants, Protocol definitions, etc)
   *
   * Copyright (C) 2005 Dmitry Yusupov
   * Copyright (C) 2005 Alex Aizman
   * maintained by open-iscsi@googlegroups.com
   *
   * This program is free software; you can redistribute it and/or modify
   * it under the terms of the GNU General Public License as published
   * by the Free Software Foundation; either version 2 of the License, or
   * (at your option) any later version.
   *
   * This program is distributed in the hope that it will be useful, but
   * WITHOUT ANY WARRANTY; without even the implied warranty of
   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
   * General Public License for more details.
   *
   * See the file COPYING included with this distribution for more details.
   */
  
  #ifndef ISCSI_IF_H
  #define ISCSI_IF_H
  
  #include <scsi/iscsi_proto.h>
  
  #define UEVENT_BASE			10
  #define KEVENT_BASE			100
  #define ISCSI_ERR_BASE			1000
  
  enum iscsi_uevent_e {
  	ISCSI_UEVENT_UNKNOWN		= 0,
  
  	/* down events */
  	ISCSI_UEVENT_CREATE_SESSION	= UEVENT_BASE + 1,
  	ISCSI_UEVENT_DESTROY_SESSION	= UEVENT_BASE + 2,
  	ISCSI_UEVENT_CREATE_CONN	= UEVENT_BASE + 3,
  	ISCSI_UEVENT_DESTROY_CONN	= UEVENT_BASE + 4,
  	ISCSI_UEVENT_BIND_CONN		= UEVENT_BASE + 5,
  	ISCSI_UEVENT_SET_PARAM		= UEVENT_BASE + 6,
  	ISCSI_UEVENT_START_CONN		= UEVENT_BASE + 7,
  	ISCSI_UEVENT_STOP_CONN		= UEVENT_BASE + 8,
  	ISCSI_UEVENT_SEND_PDU		= UEVENT_BASE + 9,
  	ISCSI_UEVENT_GET_STATS		= UEVENT_BASE + 10,
  	ISCSI_UEVENT_GET_PARAM		= UEVENT_BASE + 11,
264faaaa1   Or Gerlitz   [SCSI] iscsi: add...
45
46
47
  	ISCSI_UEVENT_TRANSPORT_EP_CONNECT	= UEVENT_BASE + 12,
  	ISCSI_UEVENT_TRANSPORT_EP_POLL		= UEVENT_BASE + 13,
  	ISCSI_UEVENT_TRANSPORT_EP_DISCONNECT	= UEVENT_BASE + 14,
01cb225da   Mike Christie   [SCSI] iscsi: add...
48
  	ISCSI_UEVENT_TGT_DSCVR		= UEVENT_BASE + 15,
1d9bf13a9   Mike Christie   [SCSI] iscsi clas...
49
  	ISCSI_UEVENT_SET_HOST_PARAM	= UEVENT_BASE + 16,
01cb225da   Mike Christie   [SCSI] iscsi: add...
50

39e84790d   Alex Aizman   [SCSI] open-iscsi...
51
52
53
54
  	/* up events */
  	ISCSI_KEVENT_RECV_PDU		= KEVENT_BASE + 1,
  	ISCSI_KEVENT_CONN_ERROR		= KEVENT_BASE + 2,
  	ISCSI_KEVENT_IF_ERROR		= KEVENT_BASE + 3,
53cb8a1f4   Mike Christie   [SCSI] iscsi: add...
55
  	ISCSI_KEVENT_DESTROY_SESSION	= KEVENT_BASE + 4,
39e84790d   Alex Aizman   [SCSI] open-iscsi...
56
  };
01cb225da   Mike Christie   [SCSI] iscsi: add...
57
58
59
60
61
  enum iscsi_tgt_dscvr {
  	ISCSI_TGT_DSCVR_SEND_TARGETS	= 1,
  	ISCSI_TGT_DSCVR_ISNS		= 2,
  	ISCSI_TGT_DSCVR_SLP		= 3,
  };
39e84790d   Alex Aizman   [SCSI] open-iscsi...
62
63
64
65
66
67
68
69
70
  struct iscsi_uevent {
  	uint32_t type; /* k/u events type */
  	uint32_t iferror; /* carries interface or resource errors */
  	uint64_t transport_handle;
  
  	union {
  		/* messages u -> k */
  		struct msg_create_session {
  			uint32_t	initial_cmdsn;
1548271ec   Mike Christie   [SCSI] libiscsi: ...
71
72
  			uint16_t	cmds_max;
  			uint16_t	queue_depth;
39e84790d   Alex Aizman   [SCSI] open-iscsi...
73
74
  		} c_session;
  		struct msg_destroy_session {
39e84790d   Alex Aizman   [SCSI] open-iscsi...
75
76
77
  			uint32_t	sid;
  		} d_session;
  		struct msg_create_conn {
39e84790d   Alex Aizman   [SCSI] open-iscsi...
78
  			uint32_t	sid;
b5c7a12dc   Mike Christie   [SCSI] iscsi: rm ...
79
  			uint32_t	cid;
39e84790d   Alex Aizman   [SCSI] open-iscsi...
80
81
  		} c_conn;
  		struct msg_bind_conn {
b5c7a12dc   Mike Christie   [SCSI] iscsi: rm ...
82
83
  			uint32_t	sid;
  			uint32_t	cid;
264faaaa1   Or Gerlitz   [SCSI] iscsi: add...
84
  			uint64_t	transport_eph;
39e84790d   Alex Aizman   [SCSI] open-iscsi...
85
86
87
  			uint32_t	is_leading;
  		} b_conn;
  		struct msg_destroy_conn {
b5c7a12dc   Mike Christie   [SCSI] iscsi: rm ...
88
  			uint32_t	sid;
39e84790d   Alex Aizman   [SCSI] open-iscsi...
89
90
91
  			uint32_t	cid;
  		} d_conn;
  		struct msg_send_pdu {
b5c7a12dc   Mike Christie   [SCSI] iscsi: rm ...
92
93
  			uint32_t	sid;
  			uint32_t	cid;
39e84790d   Alex Aizman   [SCSI] open-iscsi...
94
95
  			uint32_t	hdr_size;
  			uint32_t	data_size;
39e84790d   Alex Aizman   [SCSI] open-iscsi...
96
97
  		} send_pdu;
  		struct msg_set_param {
b5c7a12dc   Mike Christie   [SCSI] iscsi: rm ...
98
99
  			uint32_t	sid;
  			uint32_t	cid;
39e84790d   Alex Aizman   [SCSI] open-iscsi...
100
  			uint32_t	param; /* enum iscsi_param */
fd7255f51   Mike Christie   [SCSI] iscsi: add...
101
  			uint32_t	len;
39e84790d   Alex Aizman   [SCSI] open-iscsi...
102
103
  		} set_param;
  		struct msg_start_conn {
b5c7a12dc   Mike Christie   [SCSI] iscsi: rm ...
104
105
  			uint32_t	sid;
  			uint32_t	cid;
39e84790d   Alex Aizman   [SCSI] open-iscsi...
106
107
  		} start_conn;
  		struct msg_stop_conn {
b5c7a12dc   Mike Christie   [SCSI] iscsi: rm ...
108
109
  			uint32_t	sid;
  			uint32_t	cid;
39e84790d   Alex Aizman   [SCSI] open-iscsi...
110
111
112
113
  			uint64_t	conn_handle;
  			uint32_t	flag;
  		} stop_conn;
  		struct msg_get_stats {
b5c7a12dc   Mike Christie   [SCSI] iscsi: rm ...
114
115
  			uint32_t	sid;
  			uint32_t	cid;
39e84790d   Alex Aizman   [SCSI] open-iscsi...
116
  		} get_stats;
264faaaa1   Or Gerlitz   [SCSI] iscsi: add...
117
118
119
120
121
122
123
124
125
126
  		struct msg_transport_connect {
  			uint32_t	non_blocking;
  		} ep_connect;
  		struct msg_transport_poll {
  			uint64_t	ep_handle;
  			uint32_t	timeout_ms;
  		} ep_poll;
  		struct msg_transport_disconnect {
  			uint64_t	ep_handle;
  		} ep_disconnect;
01cb225da   Mike Christie   [SCSI] iscsi: add...
127
128
129
130
131
132
133
134
135
136
137
  		struct msg_tgt_dscvr {
  			enum iscsi_tgt_dscvr	type;
  			uint32_t	host_no;
  			/*
   			 * enable = 1 to establish a new connection
  			 * with the server. enable = 0 to disconnect
  			 * from the server. Used primarily to switch
  			 * from one iSNS server to another.
  			 */
  			uint32_t	enable;
  		} tgt_dscvr;
1d9bf13a9   Mike Christie   [SCSI] iscsi clas...
138
139
140
141
142
  		struct msg_set_host_param {
  			uint32_t	host_no;
  			uint32_t	param; /* enum iscsi_host_param */
  			uint32_t	len;
  		} set_host_param;
39e84790d   Alex Aizman   [SCSI] open-iscsi...
143
144
145
  	} u;
  	union {
  		/* messages k -> u */
39e84790d   Alex Aizman   [SCSI] open-iscsi...
146
147
  		int			retcode;
  		struct msg_create_session_ret {
39e84790d   Alex Aizman   [SCSI] open-iscsi...
148
  			uint32_t	sid;
b5c7a12dc   Mike Christie   [SCSI] iscsi: rm ...
149
  			uint32_t	host_no;
39e84790d   Alex Aizman   [SCSI] open-iscsi...
150
  		} c_session_ret;
b5c7a12dc   Mike Christie   [SCSI] iscsi: rm ...
151
152
153
154
  		struct msg_create_conn_ret {
  			uint32_t	sid;
  			uint32_t	cid;
  		} c_conn_ret;
39e84790d   Alex Aizman   [SCSI] open-iscsi...
155
  		struct msg_recv_req {
b5c7a12dc   Mike Christie   [SCSI] iscsi: rm ...
156
157
  			uint32_t	sid;
  			uint32_t	cid;
39e84790d   Alex Aizman   [SCSI] open-iscsi...
158
  			uint64_t	recv_handle;
39e84790d   Alex Aizman   [SCSI] open-iscsi...
159
160
  		} recv_req;
  		struct msg_conn_error {
b5c7a12dc   Mike Christie   [SCSI] iscsi: rm ...
161
162
  			uint32_t	sid;
  			uint32_t	cid;
39e84790d   Alex Aizman   [SCSI] open-iscsi...
163
164
  			uint32_t	error; /* enum iscsi_err */
  		} connerror;
53cb8a1f4   Mike Christie   [SCSI] iscsi: add...
165
166
167
168
  		struct msg_session_destroyed {
  			uint32_t	host_no;
  			uint32_t	sid;
  		} d_session;
264faaaa1   Or Gerlitz   [SCSI] iscsi: add...
169
170
171
  		struct msg_transport_connect_ret {
  			uint64_t	handle;
  		} ep_connect_ret;
39e84790d   Alex Aizman   [SCSI] open-iscsi...
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
  	} r;
  } __attribute__ ((aligned (sizeof(uint64_t))));
  
  /*
   * Common error codes
   */
  enum iscsi_err {
  	ISCSI_OK			= 0,
  
  	ISCSI_ERR_DATASN		= ISCSI_ERR_BASE + 1,
  	ISCSI_ERR_DATA_OFFSET		= ISCSI_ERR_BASE + 2,
  	ISCSI_ERR_MAX_CMDSN		= ISCSI_ERR_BASE + 3,
  	ISCSI_ERR_EXP_CMDSN		= ISCSI_ERR_BASE + 4,
  	ISCSI_ERR_BAD_OPCODE		= ISCSI_ERR_BASE + 5,
  	ISCSI_ERR_DATALEN		= ISCSI_ERR_BASE + 6,
  	ISCSI_ERR_AHSLEN		= ISCSI_ERR_BASE + 7,
  	ISCSI_ERR_PROTO			= ISCSI_ERR_BASE + 8,
  	ISCSI_ERR_LUN			= ISCSI_ERR_BASE + 9,
  	ISCSI_ERR_BAD_ITT		= ISCSI_ERR_BASE + 10,
  	ISCSI_ERR_CONN_FAILED		= ISCSI_ERR_BASE + 11,
  	ISCSI_ERR_R2TSN			= ISCSI_ERR_BASE + 12,
  	ISCSI_ERR_SESSION_FAILED	= ISCSI_ERR_BASE + 13,
  	ISCSI_ERR_HDR_DGST		= ISCSI_ERR_BASE + 14,
  	ISCSI_ERR_DATA_DGST		= ISCSI_ERR_BASE + 15,
7996a778f   Mike Christie   [SCSI] iscsi: add...
196
197
  	ISCSI_ERR_PARAM_NOT_FOUND	= ISCSI_ERR_BASE + 16,
  	ISCSI_ERR_NO_SCSI_CMD		= ISCSI_ERR_BASE + 17,
39e84790d   Alex Aizman   [SCSI] open-iscsi...
198
199
200
201
202
203
  };
  
  /*
   * iSCSI Parameters (RFC3720)
   */
  enum iscsi_param {
fd7255f51   Mike Christie   [SCSI] iscsi: add...
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
  	/* passed in using netlink set param */
  	ISCSI_PARAM_MAX_RECV_DLENGTH,
  	ISCSI_PARAM_MAX_XMIT_DLENGTH,
  	ISCSI_PARAM_HDRDGST_EN,
  	ISCSI_PARAM_DATADGST_EN,
  	ISCSI_PARAM_INITIAL_R2T_EN,
  	ISCSI_PARAM_MAX_R2T,
  	ISCSI_PARAM_IMM_DATA_EN,
  	ISCSI_PARAM_FIRST_BURST,
  	ISCSI_PARAM_MAX_BURST,
  	ISCSI_PARAM_PDU_INORDER_EN,
  	ISCSI_PARAM_DATASEQ_INORDER_EN,
  	ISCSI_PARAM_ERL,
  	ISCSI_PARAM_IFMARKER_EN,
  	ISCSI_PARAM_OFMARKER_EN,
8d2860b3c   Mike Christie   [SCSI] iscsi: inc...
219
  	ISCSI_PARAM_EXP_STATSN,
fd7255f51   Mike Christie   [SCSI] iscsi: add...
220
221
222
223
  	ISCSI_PARAM_TARGET_NAME,
  	ISCSI_PARAM_TPGT,
  	ISCSI_PARAM_PERSISTENT_ADDRESS,
  	ISCSI_PARAM_PERSISTENT_PORT,
30a6c6523   Mike Christie   [SCSI] iscsi: fix...
224
  	ISCSI_PARAM_SESS_RECOVERY_TMO,
fd7255f51   Mike Christie   [SCSI] iscsi: add...
225
226
227
228
  
  	/* pased in through bind conn using transport_fd */
  	ISCSI_PARAM_CONN_PORT,
  	ISCSI_PARAM_CONN_ADDRESS,
b2c641673   Mike Christie   [SCSI] iscsi clas...
229
230
231
232
  	ISCSI_PARAM_USERNAME,
  	ISCSI_PARAM_USERNAME_IN,
  	ISCSI_PARAM_PASSWORD,
  	ISCSI_PARAM_PASSWORD_IN,
fd7255f51   Mike Christie   [SCSI] iscsi: add...
233
234
  	/* must always be last */
  	ISCSI_PARAM_MAX,
39e84790d   Alex Aizman   [SCSI] open-iscsi...
235
  };
fd7255f51   Mike Christie   [SCSI] iscsi: add...
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
  
  #define ISCSI_MAX_RECV_DLENGTH		(1 << ISCSI_PARAM_MAX_RECV_DLENGTH)
  #define ISCSI_MAX_XMIT_DLENGTH		(1 << ISCSI_PARAM_MAX_XMIT_DLENGTH)
  #define ISCSI_HDRDGST_EN		(1 << ISCSI_PARAM_HDRDGST_EN)
  #define ISCSI_DATADGST_EN		(1 << ISCSI_PARAM_DATADGST_EN)
  #define ISCSI_INITIAL_R2T_EN		(1 << ISCSI_PARAM_INITIAL_R2T_EN)
  #define ISCSI_MAX_R2T			(1 << ISCSI_PARAM_MAX_R2T)
  #define ISCSI_IMM_DATA_EN		(1 << ISCSI_PARAM_IMM_DATA_EN)
  #define ISCSI_FIRST_BURST		(1 << ISCSI_PARAM_FIRST_BURST)
  #define ISCSI_MAX_BURST			(1 << ISCSI_PARAM_MAX_BURST)
  #define ISCSI_PDU_INORDER_EN		(1 << ISCSI_PARAM_PDU_INORDER_EN)
  #define ISCSI_DATASEQ_INORDER_EN	(1 << ISCSI_PARAM_DATASEQ_INORDER_EN)
  #define ISCSI_ERL			(1 << ISCSI_PARAM_ERL)
  #define ISCSI_IFMARKER_EN		(1 << ISCSI_PARAM_IFMARKER_EN)
  #define ISCSI_OFMARKER_EN		(1 << ISCSI_PARAM_OFMARKER_EN)
8d2860b3c   Mike Christie   [SCSI] iscsi: inc...
251
  #define ISCSI_EXP_STATSN		(1 << ISCSI_PARAM_EXP_STATSN)
fd7255f51   Mike Christie   [SCSI] iscsi: add...
252
253
254
255
  #define ISCSI_TARGET_NAME		(1 << ISCSI_PARAM_TARGET_NAME)
  #define ISCSI_TPGT			(1 << ISCSI_PARAM_TPGT)
  #define ISCSI_PERSISTENT_ADDRESS	(1 << ISCSI_PARAM_PERSISTENT_ADDRESS)
  #define ISCSI_PERSISTENT_PORT		(1 << ISCSI_PARAM_PERSISTENT_PORT)
30a6c6523   Mike Christie   [SCSI] iscsi: fix...
256
  #define ISCSI_SESS_RECOVERY_TMO		(1 << ISCSI_PARAM_SESS_RECOVERY_TMO)
fd7255f51   Mike Christie   [SCSI] iscsi: add...
257
258
  #define ISCSI_CONN_PORT			(1 << ISCSI_PARAM_CONN_PORT)
  #define ISCSI_CONN_ADDRESS		(1 << ISCSI_PARAM_CONN_ADDRESS)
b2c641673   Mike Christie   [SCSI] iscsi clas...
259
260
261
262
  #define ISCSI_USERNAME			(1 << ISCSI_PARAM_USERNAME)
  #define ISCSI_USERNAME_IN		(1 << ISCSI_PARAM_USERNAME_IN)
  #define ISCSI_PASSWORD			(1 << ISCSI_PARAM_PASSWORD)
  #define ISCSI_PASSWORD_IN		(1 << ISCSI_PARAM_PASSWORD_IN)
39e84790d   Alex Aizman   [SCSI] open-iscsi...
263

1819dc814   Mike Christie   [SCSI] iscsi_tran...
264
265
266
  /* iSCSI HBA params */
  enum iscsi_host_param {
  	ISCSI_HOST_PARAM_HWADDRESS,
8ad5781ae   Mike Christie   [SCSI] iscsi clas...
267
  	ISCSI_HOST_PARAM_INITIATOR_NAME,
d8196ed21   Mike Christie   [SCSI] iscsi clas...
268
  	ISCSI_HOST_PARAM_NETDEV_NAME,
222369619   Mike Christie   [SCSI] iscsi clas...
269
  	ISCSI_HOST_PARAM_IPADDRESS,
1819dc814   Mike Christie   [SCSI] iscsi_tran...
270
271
272
273
  	ISCSI_HOST_PARAM_MAX,
  };
  
  #define ISCSI_HOST_HWADDRESS		(1 << ISCSI_HOST_PARAM_HWADDRESS)
8ad5781ae   Mike Christie   [SCSI] iscsi clas...
274
  #define ISCSI_HOST_INITIATOR_NAME	(1 << ISCSI_HOST_PARAM_INITIATOR_NAME)
d8196ed21   Mike Christie   [SCSI] iscsi clas...
275
  #define ISCSI_HOST_NETDEV_NAME		(1 << ISCSI_HOST_PARAM_NETDEV_NAME)
222369619   Mike Christie   [SCSI] iscsi clas...
276
  #define ISCSI_HOST_IPADDRESS		(1 << ISCSI_HOST_PARAM_IPADDRESS)
1819dc814   Mike Christie   [SCSI] iscsi_tran...
277

39e84790d   Alex Aizman   [SCSI] open-iscsi...
278
279
  #define iscsi_ptr(_handle) ((void*)(unsigned long)_handle)
  #define iscsi_handle(_ptr) ((uint64_t)(unsigned long)_ptr)
7b8631b53   Mike Christie   [SCSI] iscsi: sep...
280
281
282
283
284
285
  #define hostdata_session(_hostdata) (iscsi_ptr(*(unsigned long *)_hostdata))
  
  /**
   * iscsi_hostdata - get LLD hostdata from scsi_host
   * @_hostdata: pointer to scsi host's hostdata
   **/
39e84790d   Alex Aizman   [SCSI] open-iscsi...
286
287
288
289
290
291
292
293
294
295
296
297
298
299
  #define iscsi_hostdata(_hostdata) ((void*)_hostdata + sizeof(unsigned long))
  
  /*
   * These flags presents iSCSI Data-Path capabilities.
   */
  #define CAP_RECOVERY_L0		0x1
  #define CAP_RECOVERY_L1		0x2
  #define CAP_RECOVERY_L2		0x4
  #define CAP_MULTI_R2T		0x8
  #define CAP_HDRDGST		0x10
  #define CAP_DATADGST		0x20
  #define CAP_MULTI_CONN		0x40
  #define CAP_TEXT_NEGO		0x80
  #define CAP_MARKERS		0x100
0ab823db8   Mike Christie   [SCSI] qla4xxx: a...
300
301
  #define CAP_FW_DB		0x200
  #define CAP_SENDTARGETS_OFFLOAD	0x400
d8196ed21   Mike Christie   [SCSI] iscsi clas...
302
  #define CAP_DATA_PATH_OFFLOAD	0x800
39e84790d   Alex Aizman   [SCSI] open-iscsi...
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
  
  /*
   * These flags describes reason of stop_conn() call
   */
  #define STOP_CONN_TERM		0x1
  #define STOP_CONN_SUSPEND	0x2
  #define STOP_CONN_RECOVER	0x3
  
  #define ISCSI_STATS_CUSTOM_MAX		32
  #define ISCSI_STATS_CUSTOM_DESC_MAX	64
  struct iscsi_stats_custom {
  	char desc[ISCSI_STATS_CUSTOM_DESC_MAX];
  	uint64_t value;
  };
  
  /*
   * struct iscsi_stats - iSCSI Statistics (iSCSI MIB)
   *
   * Note: this structure contains counters collected on per-connection basis.
   */
  struct iscsi_stats {
  	/* octets */
  	uint64_t txdata_octets;
  	uint64_t rxdata_octets;
  
  	/* xmit pdus */
  	uint32_t noptx_pdus;
  	uint32_t scsicmd_pdus;
  	uint32_t tmfcmd_pdus;
  	uint32_t login_pdus;
  	uint32_t text_pdus;
  	uint32_t dataout_pdus;
  	uint32_t logout_pdus;
  	uint32_t snack_pdus;
  
  	/* recv pdus */
  	uint32_t noprx_pdus;
  	uint32_t scsirsp_pdus;
  	uint32_t tmfrsp_pdus;
  	uint32_t textrsp_pdus;
  	uint32_t datain_pdus;
  	uint32_t logoutrsp_pdus;
  	uint32_t r2t_pdus;
  	uint32_t async_pdus;
  	uint32_t rjt_pdus;
  
  	/* errors */
  	uint32_t digest_err;
  	uint32_t timeout_err;
  
  	/*
  	 * iSCSI Custom Statistics support, i.e. Transport could
  	 * extend existing MIB statistics with its own specific statistics
  	 * up to ISCSI_STATS_CUSTOM_MAX
  	 */
  	uint32_t custom_length;
  	struct iscsi_stats_custom custom[0]
  		__attribute__ ((aligned (sizeof(uint64_t))));
  };
  
  #endif