xref: /OK3568_Linux_fs/kernel/include/scsi/iscsi_if.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-or-later */
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * iSCSI User/Kernel Shares (Defines, Constants, Protocol definitions, etc)
4*4882a593Smuzhiyun  *
5*4882a593Smuzhiyun  * Copyright (C) 2005 Dmitry Yusupov
6*4882a593Smuzhiyun  * Copyright (C) 2005 Alex Aizman
7*4882a593Smuzhiyun  * maintained by open-iscsi@googlegroups.com
8*4882a593Smuzhiyun  */
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun #ifndef ISCSI_IF_H
11*4882a593Smuzhiyun #define ISCSI_IF_H
12*4882a593Smuzhiyun 
13*4882a593Smuzhiyun #include <scsi/iscsi_proto.h>
14*4882a593Smuzhiyun #include <linux/in.h>
15*4882a593Smuzhiyun #include <linux/in6.h>
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #define ISCSI_NL_GRP_ISCSID	1
18*4882a593Smuzhiyun #define ISCSI_NL_GRP_UIP	2
19*4882a593Smuzhiyun 
20*4882a593Smuzhiyun #define UEVENT_BASE			10
21*4882a593Smuzhiyun #define KEVENT_BASE			100
22*4882a593Smuzhiyun #define ISCSI_ERR_BASE			1000
23*4882a593Smuzhiyun 
24*4882a593Smuzhiyun enum iscsi_uevent_e {
25*4882a593Smuzhiyun 	ISCSI_UEVENT_UNKNOWN		= 0,
26*4882a593Smuzhiyun 
27*4882a593Smuzhiyun 	/* down events */
28*4882a593Smuzhiyun 	ISCSI_UEVENT_CREATE_SESSION	= UEVENT_BASE + 1,
29*4882a593Smuzhiyun 	ISCSI_UEVENT_DESTROY_SESSION	= UEVENT_BASE + 2,
30*4882a593Smuzhiyun 	ISCSI_UEVENT_CREATE_CONN	= UEVENT_BASE + 3,
31*4882a593Smuzhiyun 	ISCSI_UEVENT_DESTROY_CONN	= UEVENT_BASE + 4,
32*4882a593Smuzhiyun 	ISCSI_UEVENT_BIND_CONN		= UEVENT_BASE + 5,
33*4882a593Smuzhiyun 	ISCSI_UEVENT_SET_PARAM		= UEVENT_BASE + 6,
34*4882a593Smuzhiyun 	ISCSI_UEVENT_START_CONN		= UEVENT_BASE + 7,
35*4882a593Smuzhiyun 	ISCSI_UEVENT_STOP_CONN		= UEVENT_BASE + 8,
36*4882a593Smuzhiyun 	ISCSI_UEVENT_SEND_PDU		= UEVENT_BASE + 9,
37*4882a593Smuzhiyun 	ISCSI_UEVENT_GET_STATS		= UEVENT_BASE + 10,
38*4882a593Smuzhiyun 	ISCSI_UEVENT_GET_PARAM		= UEVENT_BASE + 11,
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun 	ISCSI_UEVENT_TRANSPORT_EP_CONNECT	= UEVENT_BASE + 12,
41*4882a593Smuzhiyun 	ISCSI_UEVENT_TRANSPORT_EP_POLL		= UEVENT_BASE + 13,
42*4882a593Smuzhiyun 	ISCSI_UEVENT_TRANSPORT_EP_DISCONNECT	= UEVENT_BASE + 14,
43*4882a593Smuzhiyun 
44*4882a593Smuzhiyun 	ISCSI_UEVENT_TGT_DSCVR		= UEVENT_BASE + 15,
45*4882a593Smuzhiyun 	ISCSI_UEVENT_SET_HOST_PARAM	= UEVENT_BASE + 16,
46*4882a593Smuzhiyun 	ISCSI_UEVENT_UNBIND_SESSION	= UEVENT_BASE + 17,
47*4882a593Smuzhiyun 	ISCSI_UEVENT_CREATE_BOUND_SESSION		= UEVENT_BASE + 18,
48*4882a593Smuzhiyun 	ISCSI_UEVENT_TRANSPORT_EP_CONNECT_THROUGH_HOST	= UEVENT_BASE + 19,
49*4882a593Smuzhiyun 
50*4882a593Smuzhiyun 	ISCSI_UEVENT_PATH_UPDATE	= UEVENT_BASE + 20,
51*4882a593Smuzhiyun 	ISCSI_UEVENT_SET_IFACE_PARAMS	= UEVENT_BASE + 21,
52*4882a593Smuzhiyun 	ISCSI_UEVENT_PING		= UEVENT_BASE + 22,
53*4882a593Smuzhiyun 	ISCSI_UEVENT_GET_CHAP		= UEVENT_BASE + 23,
54*4882a593Smuzhiyun 	ISCSI_UEVENT_DELETE_CHAP	= UEVENT_BASE + 24,
55*4882a593Smuzhiyun 	ISCSI_UEVENT_SET_FLASHNODE_PARAMS	= UEVENT_BASE + 25,
56*4882a593Smuzhiyun 	ISCSI_UEVENT_NEW_FLASHNODE	= UEVENT_BASE + 26,
57*4882a593Smuzhiyun 	ISCSI_UEVENT_DEL_FLASHNODE	= UEVENT_BASE + 27,
58*4882a593Smuzhiyun 	ISCSI_UEVENT_LOGIN_FLASHNODE	= UEVENT_BASE + 28,
59*4882a593Smuzhiyun 	ISCSI_UEVENT_LOGOUT_FLASHNODE	= UEVENT_BASE + 29,
60*4882a593Smuzhiyun 	ISCSI_UEVENT_LOGOUT_FLASHNODE_SID	= UEVENT_BASE + 30,
61*4882a593Smuzhiyun 	ISCSI_UEVENT_SET_CHAP		= UEVENT_BASE + 31,
62*4882a593Smuzhiyun 	ISCSI_UEVENT_GET_HOST_STATS	= UEVENT_BASE + 32,
63*4882a593Smuzhiyun 	ISCSI_UEVENT_DESTROY_SESSION_ASYNC	= UEVENT_BASE + 33,
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun 	/* up events */
66*4882a593Smuzhiyun 	ISCSI_KEVENT_RECV_PDU		= KEVENT_BASE + 1,
67*4882a593Smuzhiyun 	ISCSI_KEVENT_CONN_ERROR		= KEVENT_BASE + 2,
68*4882a593Smuzhiyun 	ISCSI_KEVENT_IF_ERROR		= KEVENT_BASE + 3,
69*4882a593Smuzhiyun 	ISCSI_KEVENT_DESTROY_SESSION	= KEVENT_BASE + 4,
70*4882a593Smuzhiyun 	ISCSI_KEVENT_UNBIND_SESSION	= KEVENT_BASE + 5,
71*4882a593Smuzhiyun 	ISCSI_KEVENT_CREATE_SESSION	= KEVENT_BASE + 6,
72*4882a593Smuzhiyun 
73*4882a593Smuzhiyun 	ISCSI_KEVENT_PATH_REQ		= KEVENT_BASE + 7,
74*4882a593Smuzhiyun 	ISCSI_KEVENT_IF_DOWN		= KEVENT_BASE + 8,
75*4882a593Smuzhiyun 	ISCSI_KEVENT_CONN_LOGIN_STATE   = KEVENT_BASE + 9,
76*4882a593Smuzhiyun 	ISCSI_KEVENT_HOST_EVENT		= KEVENT_BASE + 10,
77*4882a593Smuzhiyun 	ISCSI_KEVENT_PING_COMP		= KEVENT_BASE + 11,
78*4882a593Smuzhiyun };
79*4882a593Smuzhiyun 
80*4882a593Smuzhiyun enum iscsi_tgt_dscvr {
81*4882a593Smuzhiyun 	ISCSI_TGT_DSCVR_SEND_TARGETS	= 1,
82*4882a593Smuzhiyun 	ISCSI_TGT_DSCVR_ISNS		= 2,
83*4882a593Smuzhiyun 	ISCSI_TGT_DSCVR_SLP		= 3,
84*4882a593Smuzhiyun };
85*4882a593Smuzhiyun 
86*4882a593Smuzhiyun enum iscsi_host_event_code {
87*4882a593Smuzhiyun 	ISCSI_EVENT_LINKUP		= 1,
88*4882a593Smuzhiyun 	ISCSI_EVENT_LINKDOWN,
89*4882a593Smuzhiyun 	/* must always be last */
90*4882a593Smuzhiyun 	ISCSI_EVENT_MAX,
91*4882a593Smuzhiyun };
92*4882a593Smuzhiyun 
93*4882a593Smuzhiyun struct iscsi_uevent {
94*4882a593Smuzhiyun 	uint32_t type; /* k/u events type */
95*4882a593Smuzhiyun 	uint32_t iferror; /* carries interface or resource errors */
96*4882a593Smuzhiyun 	uint64_t transport_handle;
97*4882a593Smuzhiyun 
98*4882a593Smuzhiyun 	union {
99*4882a593Smuzhiyun 		/* messages u -> k */
100*4882a593Smuzhiyun 		struct msg_create_session {
101*4882a593Smuzhiyun 			uint32_t	initial_cmdsn;
102*4882a593Smuzhiyun 			uint16_t	cmds_max;
103*4882a593Smuzhiyun 			uint16_t	queue_depth;
104*4882a593Smuzhiyun 		} c_session;
105*4882a593Smuzhiyun 		struct msg_create_bound_session {
106*4882a593Smuzhiyun 			uint64_t	ep_handle;
107*4882a593Smuzhiyun 			uint32_t	initial_cmdsn;
108*4882a593Smuzhiyun 			uint16_t	cmds_max;
109*4882a593Smuzhiyun 			uint16_t	queue_depth;
110*4882a593Smuzhiyun 		} c_bound_session;
111*4882a593Smuzhiyun 		struct msg_destroy_session {
112*4882a593Smuzhiyun 			uint32_t	sid;
113*4882a593Smuzhiyun 		} d_session;
114*4882a593Smuzhiyun 		struct msg_create_conn {
115*4882a593Smuzhiyun 			uint32_t	sid;
116*4882a593Smuzhiyun 			uint32_t	cid;
117*4882a593Smuzhiyun 		} c_conn;
118*4882a593Smuzhiyun 		struct msg_bind_conn {
119*4882a593Smuzhiyun 			uint32_t	sid;
120*4882a593Smuzhiyun 			uint32_t	cid;
121*4882a593Smuzhiyun 			uint64_t	transport_eph;
122*4882a593Smuzhiyun 			uint32_t	is_leading;
123*4882a593Smuzhiyun 		} b_conn;
124*4882a593Smuzhiyun 		struct msg_destroy_conn {
125*4882a593Smuzhiyun 			uint32_t	sid;
126*4882a593Smuzhiyun 			uint32_t	cid;
127*4882a593Smuzhiyun 		} d_conn;
128*4882a593Smuzhiyun 		struct msg_send_pdu {
129*4882a593Smuzhiyun 			uint32_t	sid;
130*4882a593Smuzhiyun 			uint32_t	cid;
131*4882a593Smuzhiyun 			uint32_t	hdr_size;
132*4882a593Smuzhiyun 			uint32_t	data_size;
133*4882a593Smuzhiyun 		} send_pdu;
134*4882a593Smuzhiyun 		struct msg_set_param {
135*4882a593Smuzhiyun 			uint32_t	sid;
136*4882a593Smuzhiyun 			uint32_t	cid;
137*4882a593Smuzhiyun 			uint32_t	param; /* enum iscsi_param */
138*4882a593Smuzhiyun 			uint32_t	len;
139*4882a593Smuzhiyun 		} set_param;
140*4882a593Smuzhiyun 		struct msg_start_conn {
141*4882a593Smuzhiyun 			uint32_t	sid;
142*4882a593Smuzhiyun 			uint32_t	cid;
143*4882a593Smuzhiyun 		} start_conn;
144*4882a593Smuzhiyun 		struct msg_stop_conn {
145*4882a593Smuzhiyun 			uint32_t	sid;
146*4882a593Smuzhiyun 			uint32_t	cid;
147*4882a593Smuzhiyun 			uint64_t	conn_handle;
148*4882a593Smuzhiyun 			uint32_t	flag;
149*4882a593Smuzhiyun 		} stop_conn;
150*4882a593Smuzhiyun 		struct msg_get_stats {
151*4882a593Smuzhiyun 			uint32_t	sid;
152*4882a593Smuzhiyun 			uint32_t	cid;
153*4882a593Smuzhiyun 		} get_stats;
154*4882a593Smuzhiyun 		struct msg_transport_connect {
155*4882a593Smuzhiyun 			uint32_t	non_blocking;
156*4882a593Smuzhiyun 		} ep_connect;
157*4882a593Smuzhiyun 		struct msg_transport_connect_through_host {
158*4882a593Smuzhiyun 			uint32_t	host_no;
159*4882a593Smuzhiyun 			uint32_t	non_blocking;
160*4882a593Smuzhiyun 		} ep_connect_through_host;
161*4882a593Smuzhiyun 		struct msg_transport_poll {
162*4882a593Smuzhiyun 			uint64_t	ep_handle;
163*4882a593Smuzhiyun 			uint32_t	timeout_ms;
164*4882a593Smuzhiyun 		} ep_poll;
165*4882a593Smuzhiyun 		struct msg_transport_disconnect {
166*4882a593Smuzhiyun 			uint64_t	ep_handle;
167*4882a593Smuzhiyun 		} ep_disconnect;
168*4882a593Smuzhiyun 		struct msg_tgt_dscvr {
169*4882a593Smuzhiyun 			enum iscsi_tgt_dscvr	type;
170*4882a593Smuzhiyun 			uint32_t	host_no;
171*4882a593Smuzhiyun 			/*
172*4882a593Smuzhiyun  			 * enable = 1 to establish a new connection
173*4882a593Smuzhiyun 			 * with the server. enable = 0 to disconnect
174*4882a593Smuzhiyun 			 * from the server. Used primarily to switch
175*4882a593Smuzhiyun 			 * from one iSNS server to another.
176*4882a593Smuzhiyun 			 */
177*4882a593Smuzhiyun 			uint32_t	enable;
178*4882a593Smuzhiyun 		} tgt_dscvr;
179*4882a593Smuzhiyun 		struct msg_set_host_param {
180*4882a593Smuzhiyun 			uint32_t	host_no;
181*4882a593Smuzhiyun 			uint32_t	param; /* enum iscsi_host_param */
182*4882a593Smuzhiyun 			uint32_t	len;
183*4882a593Smuzhiyun 		} set_host_param;
184*4882a593Smuzhiyun 		struct msg_set_path {
185*4882a593Smuzhiyun 			uint32_t	host_no;
186*4882a593Smuzhiyun 		} set_path;
187*4882a593Smuzhiyun 		struct msg_set_iface_params {
188*4882a593Smuzhiyun 			uint32_t	host_no;
189*4882a593Smuzhiyun 			uint32_t	count;
190*4882a593Smuzhiyun 		} set_iface_params;
191*4882a593Smuzhiyun 		struct msg_iscsi_ping {
192*4882a593Smuzhiyun 			uint32_t        host_no;
193*4882a593Smuzhiyun 			uint32_t        iface_num;
194*4882a593Smuzhiyun 			uint32_t        iface_type;
195*4882a593Smuzhiyun 			uint32_t        payload_size;
196*4882a593Smuzhiyun 			uint32_t	pid;	/* unique ping id associated
197*4882a593Smuzhiyun 						   with each ping request */
198*4882a593Smuzhiyun 		} iscsi_ping;
199*4882a593Smuzhiyun 		struct msg_get_chap {
200*4882a593Smuzhiyun 			uint32_t	host_no;
201*4882a593Smuzhiyun 			uint32_t	num_entries; /* number of CHAP entries
202*4882a593Smuzhiyun 						      * on request, number of
203*4882a593Smuzhiyun 						      * valid CHAP entries on
204*4882a593Smuzhiyun 						      * response */
205*4882a593Smuzhiyun 			uint16_t	chap_tbl_idx;
206*4882a593Smuzhiyun 		} get_chap;
207*4882a593Smuzhiyun 		struct msg_delete_chap {
208*4882a593Smuzhiyun 		       uint32_t        host_no;
209*4882a593Smuzhiyun 		       uint16_t        chap_tbl_idx;
210*4882a593Smuzhiyun 		} delete_chap;
211*4882a593Smuzhiyun 		struct msg_set_flashnode_param {
212*4882a593Smuzhiyun 			uint32_t	host_no;
213*4882a593Smuzhiyun 			uint32_t	flashnode_idx;
214*4882a593Smuzhiyun 			uint32_t	count;
215*4882a593Smuzhiyun 		} set_flashnode;
216*4882a593Smuzhiyun 		struct msg_new_flashnode {
217*4882a593Smuzhiyun 			uint32_t	host_no;
218*4882a593Smuzhiyun 			uint32_t	len;
219*4882a593Smuzhiyun 		} new_flashnode;
220*4882a593Smuzhiyun 		struct msg_del_flashnode {
221*4882a593Smuzhiyun 			uint32_t	host_no;
222*4882a593Smuzhiyun 			uint32_t	flashnode_idx;
223*4882a593Smuzhiyun 		} del_flashnode;
224*4882a593Smuzhiyun 		struct msg_login_flashnode {
225*4882a593Smuzhiyun 			uint32_t	host_no;
226*4882a593Smuzhiyun 			uint32_t	flashnode_idx;
227*4882a593Smuzhiyun 		} login_flashnode;
228*4882a593Smuzhiyun 		struct msg_logout_flashnode {
229*4882a593Smuzhiyun 			uint32_t	host_no;
230*4882a593Smuzhiyun 			uint32_t	flashnode_idx;
231*4882a593Smuzhiyun 		} logout_flashnode;
232*4882a593Smuzhiyun 		struct msg_logout_flashnode_sid {
233*4882a593Smuzhiyun 			uint32_t	host_no;
234*4882a593Smuzhiyun 			uint32_t	sid;
235*4882a593Smuzhiyun 		} logout_flashnode_sid;
236*4882a593Smuzhiyun 		struct msg_get_host_stats {
237*4882a593Smuzhiyun 			uint32_t host_no;
238*4882a593Smuzhiyun 		} get_host_stats;
239*4882a593Smuzhiyun 	} u;
240*4882a593Smuzhiyun 	union {
241*4882a593Smuzhiyun 		/* messages k -> u */
242*4882a593Smuzhiyun 		int			retcode;
243*4882a593Smuzhiyun 		struct msg_create_session_ret {
244*4882a593Smuzhiyun 			uint32_t	sid;
245*4882a593Smuzhiyun 			uint32_t	host_no;
246*4882a593Smuzhiyun 		} c_session_ret;
247*4882a593Smuzhiyun 		struct msg_create_conn_ret {
248*4882a593Smuzhiyun 			uint32_t	sid;
249*4882a593Smuzhiyun 			uint32_t	cid;
250*4882a593Smuzhiyun 		} c_conn_ret;
251*4882a593Smuzhiyun 		struct msg_unbind_session {
252*4882a593Smuzhiyun 			uint32_t	sid;
253*4882a593Smuzhiyun 			uint32_t	host_no;
254*4882a593Smuzhiyun 		} unbind_session;
255*4882a593Smuzhiyun 		struct msg_recv_req {
256*4882a593Smuzhiyun 			uint32_t	sid;
257*4882a593Smuzhiyun 			uint32_t	cid;
258*4882a593Smuzhiyun 			uint64_t	recv_handle;
259*4882a593Smuzhiyun 		} recv_req;
260*4882a593Smuzhiyun 		struct msg_conn_login {
261*4882a593Smuzhiyun 			uint32_t        sid;
262*4882a593Smuzhiyun 			uint32_t        cid;
263*4882a593Smuzhiyun 			uint32_t        state; /* enum iscsi_conn_state */
264*4882a593Smuzhiyun 		} conn_login;
265*4882a593Smuzhiyun 		struct msg_conn_error {
266*4882a593Smuzhiyun 			uint32_t	sid;
267*4882a593Smuzhiyun 			uint32_t	cid;
268*4882a593Smuzhiyun 			uint32_t	error; /* enum iscsi_err */
269*4882a593Smuzhiyun 		} connerror;
270*4882a593Smuzhiyun 		struct msg_session_destroyed {
271*4882a593Smuzhiyun 			uint32_t	host_no;
272*4882a593Smuzhiyun 			uint32_t	sid;
273*4882a593Smuzhiyun 		} d_session;
274*4882a593Smuzhiyun 		struct msg_transport_connect_ret {
275*4882a593Smuzhiyun 			uint64_t	handle;
276*4882a593Smuzhiyun 		} ep_connect_ret;
277*4882a593Smuzhiyun 		struct msg_req_path {
278*4882a593Smuzhiyun 			uint32_t	host_no;
279*4882a593Smuzhiyun 		} req_path;
280*4882a593Smuzhiyun 		struct msg_notify_if_down {
281*4882a593Smuzhiyun 			uint32_t	host_no;
282*4882a593Smuzhiyun 		} notify_if_down;
283*4882a593Smuzhiyun 		struct msg_host_event {
284*4882a593Smuzhiyun 			uint32_t	host_no;
285*4882a593Smuzhiyun 			uint32_t	data_size;
286*4882a593Smuzhiyun 			enum iscsi_host_event_code code;
287*4882a593Smuzhiyun 		} host_event;
288*4882a593Smuzhiyun 		struct msg_ping_comp {
289*4882a593Smuzhiyun 			uint32_t        host_no;
290*4882a593Smuzhiyun 			uint32_t        status; /* enum
291*4882a593Smuzhiyun 						 * iscsi_ping_status_code */
292*4882a593Smuzhiyun 			uint32_t	pid;	/* unique ping id associated
293*4882a593Smuzhiyun 						   with each ping request */
294*4882a593Smuzhiyun 			uint32_t        data_size;
295*4882a593Smuzhiyun 		} ping_comp;
296*4882a593Smuzhiyun 		struct msg_new_flashnode_ret {
297*4882a593Smuzhiyun 			uint32_t	flashnode_idx;
298*4882a593Smuzhiyun 		} new_flashnode_ret;
299*4882a593Smuzhiyun 	} r;
300*4882a593Smuzhiyun } __attribute__ ((aligned (sizeof(uint64_t))));
301*4882a593Smuzhiyun 
302*4882a593Smuzhiyun enum iscsi_param_type {
303*4882a593Smuzhiyun 	ISCSI_PARAM,		/* iscsi_param (session, conn, target, LU) */
304*4882a593Smuzhiyun 	ISCSI_HOST_PARAM,	/* iscsi_host_param */
305*4882a593Smuzhiyun 	ISCSI_NET_PARAM,	/* iscsi_net_param */
306*4882a593Smuzhiyun 	ISCSI_FLASHNODE_PARAM,	/* iscsi_flashnode_param */
307*4882a593Smuzhiyun 	ISCSI_CHAP_PARAM,	/* iscsi_chap_param */
308*4882a593Smuzhiyun 	ISCSI_IFACE_PARAM,	/* iscsi_iface_param */
309*4882a593Smuzhiyun };
310*4882a593Smuzhiyun 
311*4882a593Smuzhiyun /* structure for minimalist usecase */
312*4882a593Smuzhiyun struct iscsi_param_info {
313*4882a593Smuzhiyun 	uint32_t len;		/* Actual length of the param value */
314*4882a593Smuzhiyun 	uint16_t param;		/* iscsi param */
315*4882a593Smuzhiyun 	uint8_t value[];	/* length sized value follows */
316*4882a593Smuzhiyun } __packed;
317*4882a593Smuzhiyun 
318*4882a593Smuzhiyun struct iscsi_iface_param_info {
319*4882a593Smuzhiyun 	uint32_t iface_num;	/* iface number, 0 - n */
320*4882a593Smuzhiyun 	uint32_t len;		/* Actual length of the param */
321*4882a593Smuzhiyun 	uint16_t param;		/* iscsi param value */
322*4882a593Smuzhiyun 	uint8_t iface_type;	/* IPv4 or IPv6 */
323*4882a593Smuzhiyun 	uint8_t param_type;	/* iscsi_param_type */
324*4882a593Smuzhiyun 	uint8_t value[];	/* length sized value follows */
325*4882a593Smuzhiyun } __packed;
326*4882a593Smuzhiyun 
327*4882a593Smuzhiyun /*
328*4882a593Smuzhiyun  * To keep the struct iscsi_uevent size the same for userspace code
329*4882a593Smuzhiyun  * compatibility, the main structure for ISCSI_UEVENT_PATH_UPDATE and
330*4882a593Smuzhiyun  * ISCSI_KEVENT_PATH_REQ is defined separately and comes after the
331*4882a593Smuzhiyun  * struct iscsi_uevent in the NETLINK_ISCSI message.
332*4882a593Smuzhiyun  */
333*4882a593Smuzhiyun struct iscsi_path {
334*4882a593Smuzhiyun 	uint64_t	handle;
335*4882a593Smuzhiyun 	uint8_t		mac_addr[6];
336*4882a593Smuzhiyun 	uint8_t		mac_addr_old[6];
337*4882a593Smuzhiyun 	uint32_t	ip_addr_len;	/* 4 or 16 */
338*4882a593Smuzhiyun 	union {
339*4882a593Smuzhiyun 		struct in_addr	v4_addr;
340*4882a593Smuzhiyun 		struct in6_addr	v6_addr;
341*4882a593Smuzhiyun 	} src;
342*4882a593Smuzhiyun 	union {
343*4882a593Smuzhiyun 		struct in_addr	v4_addr;
344*4882a593Smuzhiyun 		struct in6_addr	v6_addr;
345*4882a593Smuzhiyun 	} dst;
346*4882a593Smuzhiyun 	uint16_t	vlan_id;
347*4882a593Smuzhiyun 	uint16_t	pmtu;
348*4882a593Smuzhiyun } __attribute__ ((aligned (sizeof(uint64_t))));
349*4882a593Smuzhiyun 
350*4882a593Smuzhiyun /* iscsi iface enabled/disabled setting */
351*4882a593Smuzhiyun #define ISCSI_IFACE_DISABLE	0x01
352*4882a593Smuzhiyun #define ISCSI_IFACE_ENABLE	0x02
353*4882a593Smuzhiyun 
354*4882a593Smuzhiyun /* ipv4 bootproto */
355*4882a593Smuzhiyun #define ISCSI_BOOTPROTO_STATIC		0x01
356*4882a593Smuzhiyun #define ISCSI_BOOTPROTO_DHCP		0x02
357*4882a593Smuzhiyun 
358*4882a593Smuzhiyun /* ipv6 addr autoconfig type */
359*4882a593Smuzhiyun #define ISCSI_IPV6_AUTOCFG_DISABLE		0x01
360*4882a593Smuzhiyun #define ISCSI_IPV6_AUTOCFG_ND_ENABLE		0x02
361*4882a593Smuzhiyun #define ISCSI_IPV6_AUTOCFG_DHCPV6_ENABLE	0x03
362*4882a593Smuzhiyun 
363*4882a593Smuzhiyun /* ipv6 link local addr type */
364*4882a593Smuzhiyun #define ISCSI_IPV6_LINKLOCAL_AUTOCFG_ENABLE	0x01
365*4882a593Smuzhiyun #define ISCSI_IPV6_LINKLOCAL_AUTOCFG_DISABLE	0x02
366*4882a593Smuzhiyun 
367*4882a593Smuzhiyun /* ipv6 router addr type */
368*4882a593Smuzhiyun #define ISCSI_IPV6_ROUTER_AUTOCFG_ENABLE	0x01
369*4882a593Smuzhiyun #define ISCSI_IPV6_ROUTER_AUTOCFG_DISABLE	0x02
370*4882a593Smuzhiyun 
371*4882a593Smuzhiyun #define ISCSI_IFACE_TYPE_IPV4		0x01
372*4882a593Smuzhiyun #define ISCSI_IFACE_TYPE_IPV6		0x02
373*4882a593Smuzhiyun 
374*4882a593Smuzhiyun #define ISCSI_MAX_VLAN_ID		4095
375*4882a593Smuzhiyun #define ISCSI_MAX_VLAN_PRIORITY		7
376*4882a593Smuzhiyun 
377*4882a593Smuzhiyun /* iscsi vlan enable/disabled setting */
378*4882a593Smuzhiyun #define ISCSI_VLAN_DISABLE	0x01
379*4882a593Smuzhiyun #define ISCSI_VLAN_ENABLE	0x02
380*4882a593Smuzhiyun 
381*4882a593Smuzhiyun /* iscsi generic enable/disabled setting for various features */
382*4882a593Smuzhiyun #define ISCSI_NET_PARAM_DISABLE		0x01
383*4882a593Smuzhiyun #define ISCSI_NET_PARAM_ENABLE		0x02
384*4882a593Smuzhiyun 
385*4882a593Smuzhiyun /* iSCSI network params */
386*4882a593Smuzhiyun enum iscsi_net_param {
387*4882a593Smuzhiyun 	ISCSI_NET_PARAM_IPV4_ADDR		= 1,
388*4882a593Smuzhiyun 	ISCSI_NET_PARAM_IPV4_SUBNET,
389*4882a593Smuzhiyun 	ISCSI_NET_PARAM_IPV4_GW,
390*4882a593Smuzhiyun 	ISCSI_NET_PARAM_IPV4_BOOTPROTO,
391*4882a593Smuzhiyun 	ISCSI_NET_PARAM_MAC,
392*4882a593Smuzhiyun 	ISCSI_NET_PARAM_IPV6_LINKLOCAL,
393*4882a593Smuzhiyun 	ISCSI_NET_PARAM_IPV6_ADDR,
394*4882a593Smuzhiyun 	ISCSI_NET_PARAM_IPV6_ROUTER,
395*4882a593Smuzhiyun 	ISCSI_NET_PARAM_IPV6_ADDR_AUTOCFG,
396*4882a593Smuzhiyun 	ISCSI_NET_PARAM_IPV6_LINKLOCAL_AUTOCFG,
397*4882a593Smuzhiyun 	ISCSI_NET_PARAM_IPV6_ROUTER_AUTOCFG,
398*4882a593Smuzhiyun 	ISCSI_NET_PARAM_IFACE_ENABLE,
399*4882a593Smuzhiyun 	ISCSI_NET_PARAM_VLAN_ID,
400*4882a593Smuzhiyun 	ISCSI_NET_PARAM_VLAN_PRIORITY,
401*4882a593Smuzhiyun 	ISCSI_NET_PARAM_VLAN_ENABLED,
402*4882a593Smuzhiyun 	ISCSI_NET_PARAM_VLAN_TAG,
403*4882a593Smuzhiyun 	ISCSI_NET_PARAM_IFACE_TYPE,
404*4882a593Smuzhiyun 	ISCSI_NET_PARAM_IFACE_NAME,
405*4882a593Smuzhiyun 	ISCSI_NET_PARAM_MTU,
406*4882a593Smuzhiyun 	ISCSI_NET_PARAM_PORT,
407*4882a593Smuzhiyun 	ISCSI_NET_PARAM_IPADDR_STATE,
408*4882a593Smuzhiyun 	ISCSI_NET_PARAM_IPV6_LINKLOCAL_STATE,
409*4882a593Smuzhiyun 	ISCSI_NET_PARAM_IPV6_ROUTER_STATE,
410*4882a593Smuzhiyun 	ISCSI_NET_PARAM_DELAYED_ACK_EN,
411*4882a593Smuzhiyun 	ISCSI_NET_PARAM_TCP_NAGLE_DISABLE,
412*4882a593Smuzhiyun 	ISCSI_NET_PARAM_TCP_WSF_DISABLE,
413*4882a593Smuzhiyun 	ISCSI_NET_PARAM_TCP_WSF,
414*4882a593Smuzhiyun 	ISCSI_NET_PARAM_TCP_TIMER_SCALE,
415*4882a593Smuzhiyun 	ISCSI_NET_PARAM_TCP_TIMESTAMP_EN,
416*4882a593Smuzhiyun 	ISCSI_NET_PARAM_CACHE_ID,
417*4882a593Smuzhiyun 	ISCSI_NET_PARAM_IPV4_DHCP_DNS_ADDR_EN,
418*4882a593Smuzhiyun 	ISCSI_NET_PARAM_IPV4_DHCP_SLP_DA_EN,
419*4882a593Smuzhiyun 	ISCSI_NET_PARAM_IPV4_TOS_EN,
420*4882a593Smuzhiyun 	ISCSI_NET_PARAM_IPV4_TOS,
421*4882a593Smuzhiyun 	ISCSI_NET_PARAM_IPV4_GRAT_ARP_EN,
422*4882a593Smuzhiyun 	ISCSI_NET_PARAM_IPV4_DHCP_ALT_CLIENT_ID_EN,
423*4882a593Smuzhiyun 	ISCSI_NET_PARAM_IPV4_DHCP_ALT_CLIENT_ID,
424*4882a593Smuzhiyun 	ISCSI_NET_PARAM_IPV4_DHCP_REQ_VENDOR_ID_EN,
425*4882a593Smuzhiyun 	ISCSI_NET_PARAM_IPV4_DHCP_USE_VENDOR_ID_EN,
426*4882a593Smuzhiyun 	ISCSI_NET_PARAM_IPV4_DHCP_VENDOR_ID,
427*4882a593Smuzhiyun 	ISCSI_NET_PARAM_IPV4_DHCP_LEARN_IQN_EN,
428*4882a593Smuzhiyun 	ISCSI_NET_PARAM_IPV4_FRAGMENT_DISABLE,
429*4882a593Smuzhiyun 	ISCSI_NET_PARAM_IPV4_IN_FORWARD_EN,
430*4882a593Smuzhiyun 	ISCSI_NET_PARAM_IPV4_TTL,
431*4882a593Smuzhiyun 	ISCSI_NET_PARAM_IPV6_GRAT_NEIGHBOR_ADV_EN,
432*4882a593Smuzhiyun 	ISCSI_NET_PARAM_IPV6_MLD_EN,
433*4882a593Smuzhiyun 	ISCSI_NET_PARAM_IPV6_FLOW_LABEL,
434*4882a593Smuzhiyun 	ISCSI_NET_PARAM_IPV6_TRAFFIC_CLASS,
435*4882a593Smuzhiyun 	ISCSI_NET_PARAM_IPV6_HOP_LIMIT,
436*4882a593Smuzhiyun 	ISCSI_NET_PARAM_IPV6_ND_REACHABLE_TMO,
437*4882a593Smuzhiyun 	ISCSI_NET_PARAM_IPV6_ND_REXMIT_TIME,
438*4882a593Smuzhiyun 	ISCSI_NET_PARAM_IPV6_ND_STALE_TMO,
439*4882a593Smuzhiyun 	ISCSI_NET_PARAM_IPV6_DUP_ADDR_DETECT_CNT,
440*4882a593Smuzhiyun 	ISCSI_NET_PARAM_IPV6_RTR_ADV_LINK_MTU,
441*4882a593Smuzhiyun 	ISCSI_NET_PARAM_REDIRECT_EN,
442*4882a593Smuzhiyun };
443*4882a593Smuzhiyun 
444*4882a593Smuzhiyun enum iscsi_ipaddress_state {
445*4882a593Smuzhiyun 	ISCSI_IPDDRESS_STATE_UNCONFIGURED,
446*4882a593Smuzhiyun 	ISCSI_IPDDRESS_STATE_ACQUIRING,
447*4882a593Smuzhiyun 	ISCSI_IPDDRESS_STATE_TENTATIVE,
448*4882a593Smuzhiyun 	ISCSI_IPDDRESS_STATE_VALID,
449*4882a593Smuzhiyun 	ISCSI_IPDDRESS_STATE_DISABLING,
450*4882a593Smuzhiyun 	ISCSI_IPDDRESS_STATE_INVALID,
451*4882a593Smuzhiyun 	ISCSI_IPDDRESS_STATE_DEPRECATED,
452*4882a593Smuzhiyun };
453*4882a593Smuzhiyun 
454*4882a593Smuzhiyun enum iscsi_router_state {
455*4882a593Smuzhiyun 	ISCSI_ROUTER_STATE_UNKNOWN,
456*4882a593Smuzhiyun 	ISCSI_ROUTER_STATE_ADVERTISED,
457*4882a593Smuzhiyun 	ISCSI_ROUTER_STATE_MANUAL,
458*4882a593Smuzhiyun 	ISCSI_ROUTER_STATE_STALE,
459*4882a593Smuzhiyun };
460*4882a593Smuzhiyun 
461*4882a593Smuzhiyun /* iSCSI specific settings params for iface */
462*4882a593Smuzhiyun enum iscsi_iface_param {
463*4882a593Smuzhiyun 	ISCSI_IFACE_PARAM_DEF_TASKMGMT_TMO,
464*4882a593Smuzhiyun 	ISCSI_IFACE_PARAM_HDRDGST_EN,
465*4882a593Smuzhiyun 	ISCSI_IFACE_PARAM_DATADGST_EN,
466*4882a593Smuzhiyun 	ISCSI_IFACE_PARAM_IMM_DATA_EN,
467*4882a593Smuzhiyun 	ISCSI_IFACE_PARAM_INITIAL_R2T_EN,
468*4882a593Smuzhiyun 	ISCSI_IFACE_PARAM_DATASEQ_INORDER_EN,
469*4882a593Smuzhiyun 	ISCSI_IFACE_PARAM_PDU_INORDER_EN,
470*4882a593Smuzhiyun 	ISCSI_IFACE_PARAM_ERL,
471*4882a593Smuzhiyun 	ISCSI_IFACE_PARAM_MAX_RECV_DLENGTH,
472*4882a593Smuzhiyun 	ISCSI_IFACE_PARAM_FIRST_BURST,
473*4882a593Smuzhiyun 	ISCSI_IFACE_PARAM_MAX_R2T,
474*4882a593Smuzhiyun 	ISCSI_IFACE_PARAM_MAX_BURST,
475*4882a593Smuzhiyun 	ISCSI_IFACE_PARAM_CHAP_AUTH_EN,
476*4882a593Smuzhiyun 	ISCSI_IFACE_PARAM_BIDI_CHAP_EN,
477*4882a593Smuzhiyun 	ISCSI_IFACE_PARAM_DISCOVERY_AUTH_OPTIONAL,
478*4882a593Smuzhiyun 	ISCSI_IFACE_PARAM_DISCOVERY_LOGOUT_EN,
479*4882a593Smuzhiyun 	ISCSI_IFACE_PARAM_STRICT_LOGIN_COMP_EN,
480*4882a593Smuzhiyun 	ISCSI_IFACE_PARAM_INITIATOR_NAME,
481*4882a593Smuzhiyun };
482*4882a593Smuzhiyun 
483*4882a593Smuzhiyun enum iscsi_conn_state {
484*4882a593Smuzhiyun 	ISCSI_CONN_STATE_FREE,
485*4882a593Smuzhiyun 	ISCSI_CONN_STATE_XPT_WAIT,
486*4882a593Smuzhiyun 	ISCSI_CONN_STATE_IN_LOGIN,
487*4882a593Smuzhiyun 	ISCSI_CONN_STATE_LOGGED_IN,
488*4882a593Smuzhiyun 	ISCSI_CONN_STATE_IN_LOGOUT,
489*4882a593Smuzhiyun 	ISCSI_CONN_STATE_LOGOUT_REQUESTED,
490*4882a593Smuzhiyun 	ISCSI_CONN_STATE_CLEANUP_WAIT,
491*4882a593Smuzhiyun };
492*4882a593Smuzhiyun 
493*4882a593Smuzhiyun /*
494*4882a593Smuzhiyun  * Common error codes
495*4882a593Smuzhiyun  */
496*4882a593Smuzhiyun enum iscsi_err {
497*4882a593Smuzhiyun 	ISCSI_OK			= 0,
498*4882a593Smuzhiyun 
499*4882a593Smuzhiyun 	ISCSI_ERR_DATASN		= ISCSI_ERR_BASE + 1,
500*4882a593Smuzhiyun 	ISCSI_ERR_DATA_OFFSET		= ISCSI_ERR_BASE + 2,
501*4882a593Smuzhiyun 	ISCSI_ERR_MAX_CMDSN		= ISCSI_ERR_BASE + 3,
502*4882a593Smuzhiyun 	ISCSI_ERR_EXP_CMDSN		= ISCSI_ERR_BASE + 4,
503*4882a593Smuzhiyun 	ISCSI_ERR_BAD_OPCODE		= ISCSI_ERR_BASE + 5,
504*4882a593Smuzhiyun 	ISCSI_ERR_DATALEN		= ISCSI_ERR_BASE + 6,
505*4882a593Smuzhiyun 	ISCSI_ERR_AHSLEN		= ISCSI_ERR_BASE + 7,
506*4882a593Smuzhiyun 	ISCSI_ERR_PROTO			= ISCSI_ERR_BASE + 8,
507*4882a593Smuzhiyun 	ISCSI_ERR_LUN			= ISCSI_ERR_BASE + 9,
508*4882a593Smuzhiyun 	ISCSI_ERR_BAD_ITT		= ISCSI_ERR_BASE + 10,
509*4882a593Smuzhiyun 	ISCSI_ERR_CONN_FAILED		= ISCSI_ERR_BASE + 11,
510*4882a593Smuzhiyun 	ISCSI_ERR_R2TSN			= ISCSI_ERR_BASE + 12,
511*4882a593Smuzhiyun 	ISCSI_ERR_SESSION_FAILED	= ISCSI_ERR_BASE + 13,
512*4882a593Smuzhiyun 	ISCSI_ERR_HDR_DGST		= ISCSI_ERR_BASE + 14,
513*4882a593Smuzhiyun 	ISCSI_ERR_DATA_DGST		= ISCSI_ERR_BASE + 15,
514*4882a593Smuzhiyun 	ISCSI_ERR_PARAM_NOT_FOUND	= ISCSI_ERR_BASE + 16,
515*4882a593Smuzhiyun 	ISCSI_ERR_NO_SCSI_CMD		= ISCSI_ERR_BASE + 17,
516*4882a593Smuzhiyun 	ISCSI_ERR_INVALID_HOST		= ISCSI_ERR_BASE + 18,
517*4882a593Smuzhiyun 	ISCSI_ERR_XMIT_FAILED		= ISCSI_ERR_BASE + 19,
518*4882a593Smuzhiyun 	ISCSI_ERR_TCP_CONN_CLOSE	= ISCSI_ERR_BASE + 20,
519*4882a593Smuzhiyun 	ISCSI_ERR_SCSI_EH_SESSION_RST	= ISCSI_ERR_BASE + 21,
520*4882a593Smuzhiyun 	ISCSI_ERR_NOP_TIMEDOUT		= ISCSI_ERR_BASE + 22,
521*4882a593Smuzhiyun };
522*4882a593Smuzhiyun 
523*4882a593Smuzhiyun /*
524*4882a593Smuzhiyun  * iSCSI Parameters (RFC3720)
525*4882a593Smuzhiyun  */
526*4882a593Smuzhiyun enum iscsi_param {
527*4882a593Smuzhiyun 	/* passed in using netlink set param */
528*4882a593Smuzhiyun 	ISCSI_PARAM_MAX_RECV_DLENGTH,
529*4882a593Smuzhiyun 	ISCSI_PARAM_MAX_XMIT_DLENGTH,
530*4882a593Smuzhiyun 	ISCSI_PARAM_HDRDGST_EN,
531*4882a593Smuzhiyun 	ISCSI_PARAM_DATADGST_EN,
532*4882a593Smuzhiyun 	ISCSI_PARAM_INITIAL_R2T_EN,
533*4882a593Smuzhiyun 	ISCSI_PARAM_MAX_R2T,
534*4882a593Smuzhiyun 	ISCSI_PARAM_IMM_DATA_EN,
535*4882a593Smuzhiyun 	ISCSI_PARAM_FIRST_BURST,
536*4882a593Smuzhiyun 	ISCSI_PARAM_MAX_BURST,
537*4882a593Smuzhiyun 	ISCSI_PARAM_PDU_INORDER_EN,
538*4882a593Smuzhiyun 	ISCSI_PARAM_DATASEQ_INORDER_EN,
539*4882a593Smuzhiyun 	ISCSI_PARAM_ERL,
540*4882a593Smuzhiyun 	ISCSI_PARAM_IFMARKER_EN,
541*4882a593Smuzhiyun 	ISCSI_PARAM_OFMARKER_EN,
542*4882a593Smuzhiyun 	ISCSI_PARAM_EXP_STATSN,
543*4882a593Smuzhiyun 	ISCSI_PARAM_TARGET_NAME,
544*4882a593Smuzhiyun 	ISCSI_PARAM_TPGT,
545*4882a593Smuzhiyun 	ISCSI_PARAM_PERSISTENT_ADDRESS,
546*4882a593Smuzhiyun 	ISCSI_PARAM_PERSISTENT_PORT,
547*4882a593Smuzhiyun 	ISCSI_PARAM_SESS_RECOVERY_TMO,
548*4882a593Smuzhiyun 
549*4882a593Smuzhiyun 	/* passed in through bind conn using transport_fd */
550*4882a593Smuzhiyun 	ISCSI_PARAM_CONN_PORT,
551*4882a593Smuzhiyun 	ISCSI_PARAM_CONN_ADDRESS,
552*4882a593Smuzhiyun 
553*4882a593Smuzhiyun 	ISCSI_PARAM_USERNAME,
554*4882a593Smuzhiyun 	ISCSI_PARAM_USERNAME_IN,
555*4882a593Smuzhiyun 	ISCSI_PARAM_PASSWORD,
556*4882a593Smuzhiyun 	ISCSI_PARAM_PASSWORD_IN,
557*4882a593Smuzhiyun 
558*4882a593Smuzhiyun 	ISCSI_PARAM_FAST_ABORT,
559*4882a593Smuzhiyun 	ISCSI_PARAM_ABORT_TMO,
560*4882a593Smuzhiyun 	ISCSI_PARAM_LU_RESET_TMO,
561*4882a593Smuzhiyun 	ISCSI_PARAM_HOST_RESET_TMO,
562*4882a593Smuzhiyun 
563*4882a593Smuzhiyun 	ISCSI_PARAM_PING_TMO,
564*4882a593Smuzhiyun 	ISCSI_PARAM_RECV_TMO,
565*4882a593Smuzhiyun 
566*4882a593Smuzhiyun 	ISCSI_PARAM_IFACE_NAME,
567*4882a593Smuzhiyun 	ISCSI_PARAM_ISID,
568*4882a593Smuzhiyun 	ISCSI_PARAM_INITIATOR_NAME,
569*4882a593Smuzhiyun 
570*4882a593Smuzhiyun 	ISCSI_PARAM_TGT_RESET_TMO,
571*4882a593Smuzhiyun 	ISCSI_PARAM_TARGET_ALIAS,
572*4882a593Smuzhiyun 
573*4882a593Smuzhiyun 	ISCSI_PARAM_CHAP_IN_IDX,
574*4882a593Smuzhiyun 	ISCSI_PARAM_CHAP_OUT_IDX,
575*4882a593Smuzhiyun 
576*4882a593Smuzhiyun 	ISCSI_PARAM_BOOT_ROOT,
577*4882a593Smuzhiyun 	ISCSI_PARAM_BOOT_NIC,
578*4882a593Smuzhiyun 	ISCSI_PARAM_BOOT_TARGET,
579*4882a593Smuzhiyun 
580*4882a593Smuzhiyun 	ISCSI_PARAM_AUTO_SND_TGT_DISABLE,
581*4882a593Smuzhiyun 	ISCSI_PARAM_DISCOVERY_SESS,
582*4882a593Smuzhiyun 	ISCSI_PARAM_PORTAL_TYPE,
583*4882a593Smuzhiyun 	ISCSI_PARAM_CHAP_AUTH_EN,
584*4882a593Smuzhiyun 	ISCSI_PARAM_DISCOVERY_LOGOUT_EN,
585*4882a593Smuzhiyun 	ISCSI_PARAM_BIDI_CHAP_EN,
586*4882a593Smuzhiyun 	ISCSI_PARAM_DISCOVERY_AUTH_OPTIONAL,
587*4882a593Smuzhiyun 
588*4882a593Smuzhiyun 	ISCSI_PARAM_DEF_TIME2WAIT,
589*4882a593Smuzhiyun 	ISCSI_PARAM_DEF_TIME2RETAIN,
590*4882a593Smuzhiyun 	ISCSI_PARAM_MAX_SEGMENT_SIZE,
591*4882a593Smuzhiyun 	ISCSI_PARAM_STATSN,
592*4882a593Smuzhiyun 	ISCSI_PARAM_KEEPALIVE_TMO,
593*4882a593Smuzhiyun 	ISCSI_PARAM_LOCAL_PORT,
594*4882a593Smuzhiyun 	ISCSI_PARAM_TSID,
595*4882a593Smuzhiyun 	ISCSI_PARAM_DEF_TASKMGMT_TMO,
596*4882a593Smuzhiyun 
597*4882a593Smuzhiyun 	ISCSI_PARAM_TCP_TIMESTAMP_STAT,
598*4882a593Smuzhiyun 	ISCSI_PARAM_TCP_WSF_DISABLE,
599*4882a593Smuzhiyun 	ISCSI_PARAM_TCP_NAGLE_DISABLE,
600*4882a593Smuzhiyun 	ISCSI_PARAM_TCP_TIMER_SCALE,
601*4882a593Smuzhiyun 	ISCSI_PARAM_TCP_TIMESTAMP_EN,
602*4882a593Smuzhiyun 	ISCSI_PARAM_TCP_XMIT_WSF,
603*4882a593Smuzhiyun 	ISCSI_PARAM_TCP_RECV_WSF,
604*4882a593Smuzhiyun 	ISCSI_PARAM_IP_FRAGMENT_DISABLE,
605*4882a593Smuzhiyun 	ISCSI_PARAM_IPV4_TOS,
606*4882a593Smuzhiyun 	ISCSI_PARAM_IPV6_TC,
607*4882a593Smuzhiyun 	ISCSI_PARAM_IPV6_FLOW_LABEL,
608*4882a593Smuzhiyun 	ISCSI_PARAM_IS_FW_ASSIGNED_IPV6,
609*4882a593Smuzhiyun 
610*4882a593Smuzhiyun 	ISCSI_PARAM_DISCOVERY_PARENT_IDX,
611*4882a593Smuzhiyun 	ISCSI_PARAM_DISCOVERY_PARENT_TYPE,
612*4882a593Smuzhiyun 	ISCSI_PARAM_LOCAL_IPADDR,
613*4882a593Smuzhiyun 	/* must always be last */
614*4882a593Smuzhiyun 	ISCSI_PARAM_MAX,
615*4882a593Smuzhiyun };
616*4882a593Smuzhiyun 
617*4882a593Smuzhiyun /* iSCSI HBA params */
618*4882a593Smuzhiyun enum iscsi_host_param {
619*4882a593Smuzhiyun 	ISCSI_HOST_PARAM_HWADDRESS,
620*4882a593Smuzhiyun 	ISCSI_HOST_PARAM_INITIATOR_NAME,
621*4882a593Smuzhiyun 	ISCSI_HOST_PARAM_NETDEV_NAME,
622*4882a593Smuzhiyun 	ISCSI_HOST_PARAM_IPADDRESS,
623*4882a593Smuzhiyun 	ISCSI_HOST_PARAM_PORT_STATE,
624*4882a593Smuzhiyun 	ISCSI_HOST_PARAM_PORT_SPEED,
625*4882a593Smuzhiyun 	ISCSI_HOST_PARAM_MAX,
626*4882a593Smuzhiyun };
627*4882a593Smuzhiyun 
628*4882a593Smuzhiyun /* portal type */
629*4882a593Smuzhiyun #define PORTAL_TYPE_IPV4	"ipv4"
630*4882a593Smuzhiyun #define PORTAL_TYPE_IPV6	"ipv6"
631*4882a593Smuzhiyun 
632*4882a593Smuzhiyun /* iSCSI Flash Target params */
633*4882a593Smuzhiyun enum iscsi_flashnode_param {
634*4882a593Smuzhiyun 	ISCSI_FLASHNODE_IS_FW_ASSIGNED_IPV6,
635*4882a593Smuzhiyun 	ISCSI_FLASHNODE_PORTAL_TYPE,
636*4882a593Smuzhiyun 	ISCSI_FLASHNODE_AUTO_SND_TGT_DISABLE,
637*4882a593Smuzhiyun 	ISCSI_FLASHNODE_DISCOVERY_SESS,
638*4882a593Smuzhiyun 	ISCSI_FLASHNODE_ENTRY_EN,
639*4882a593Smuzhiyun 	ISCSI_FLASHNODE_HDR_DGST_EN,
640*4882a593Smuzhiyun 	ISCSI_FLASHNODE_DATA_DGST_EN,
641*4882a593Smuzhiyun 	ISCSI_FLASHNODE_IMM_DATA_EN,
642*4882a593Smuzhiyun 	ISCSI_FLASHNODE_INITIAL_R2T_EN,
643*4882a593Smuzhiyun 	ISCSI_FLASHNODE_DATASEQ_INORDER,
644*4882a593Smuzhiyun 	ISCSI_FLASHNODE_PDU_INORDER,
645*4882a593Smuzhiyun 	ISCSI_FLASHNODE_CHAP_AUTH_EN,
646*4882a593Smuzhiyun 	ISCSI_FLASHNODE_SNACK_REQ_EN,
647*4882a593Smuzhiyun 	ISCSI_FLASHNODE_DISCOVERY_LOGOUT_EN,
648*4882a593Smuzhiyun 	ISCSI_FLASHNODE_BIDI_CHAP_EN,
649*4882a593Smuzhiyun 	/* make authentication for discovery sessions optional */
650*4882a593Smuzhiyun 	ISCSI_FLASHNODE_DISCOVERY_AUTH_OPTIONAL,
651*4882a593Smuzhiyun 	ISCSI_FLASHNODE_ERL,
652*4882a593Smuzhiyun 	ISCSI_FLASHNODE_TCP_TIMESTAMP_STAT,
653*4882a593Smuzhiyun 	ISCSI_FLASHNODE_TCP_NAGLE_DISABLE,
654*4882a593Smuzhiyun 	ISCSI_FLASHNODE_TCP_WSF_DISABLE,
655*4882a593Smuzhiyun 	ISCSI_FLASHNODE_TCP_TIMER_SCALE,
656*4882a593Smuzhiyun 	ISCSI_FLASHNODE_TCP_TIMESTAMP_EN,
657*4882a593Smuzhiyun 	ISCSI_FLASHNODE_IP_FRAG_DISABLE,
658*4882a593Smuzhiyun 	ISCSI_FLASHNODE_MAX_RECV_DLENGTH,
659*4882a593Smuzhiyun 	ISCSI_FLASHNODE_MAX_XMIT_DLENGTH,
660*4882a593Smuzhiyun 	ISCSI_FLASHNODE_FIRST_BURST,
661*4882a593Smuzhiyun 	ISCSI_FLASHNODE_DEF_TIME2WAIT,
662*4882a593Smuzhiyun 	ISCSI_FLASHNODE_DEF_TIME2RETAIN,
663*4882a593Smuzhiyun 	ISCSI_FLASHNODE_MAX_R2T,
664*4882a593Smuzhiyun 	ISCSI_FLASHNODE_KEEPALIVE_TMO,
665*4882a593Smuzhiyun 	ISCSI_FLASHNODE_ISID,
666*4882a593Smuzhiyun 	ISCSI_FLASHNODE_TSID,
667*4882a593Smuzhiyun 	ISCSI_FLASHNODE_PORT,
668*4882a593Smuzhiyun 	ISCSI_FLASHNODE_MAX_BURST,
669*4882a593Smuzhiyun 	ISCSI_FLASHNODE_DEF_TASKMGMT_TMO,
670*4882a593Smuzhiyun 	ISCSI_FLASHNODE_IPADDR,
671*4882a593Smuzhiyun 	ISCSI_FLASHNODE_ALIAS,
672*4882a593Smuzhiyun 	ISCSI_FLASHNODE_REDIRECT_IPADDR,
673*4882a593Smuzhiyun 	ISCSI_FLASHNODE_MAX_SEGMENT_SIZE,
674*4882a593Smuzhiyun 	ISCSI_FLASHNODE_LOCAL_PORT,
675*4882a593Smuzhiyun 	ISCSI_FLASHNODE_IPV4_TOS,
676*4882a593Smuzhiyun 	ISCSI_FLASHNODE_IPV6_TC,
677*4882a593Smuzhiyun 	ISCSI_FLASHNODE_IPV6_FLOW_LABEL,
678*4882a593Smuzhiyun 	ISCSI_FLASHNODE_NAME,
679*4882a593Smuzhiyun 	ISCSI_FLASHNODE_TPGT,
680*4882a593Smuzhiyun 	ISCSI_FLASHNODE_LINK_LOCAL_IPV6,
681*4882a593Smuzhiyun 	ISCSI_FLASHNODE_DISCOVERY_PARENT_IDX,
682*4882a593Smuzhiyun 	ISCSI_FLASHNODE_DISCOVERY_PARENT_TYPE,
683*4882a593Smuzhiyun 	ISCSI_FLASHNODE_TCP_XMIT_WSF,
684*4882a593Smuzhiyun 	ISCSI_FLASHNODE_TCP_RECV_WSF,
685*4882a593Smuzhiyun 	ISCSI_FLASHNODE_CHAP_IN_IDX,
686*4882a593Smuzhiyun 	ISCSI_FLASHNODE_CHAP_OUT_IDX,
687*4882a593Smuzhiyun 	ISCSI_FLASHNODE_USERNAME,
688*4882a593Smuzhiyun 	ISCSI_FLASHNODE_USERNAME_IN,
689*4882a593Smuzhiyun 	ISCSI_FLASHNODE_PASSWORD,
690*4882a593Smuzhiyun 	ISCSI_FLASHNODE_PASSWORD_IN,
691*4882a593Smuzhiyun 	ISCSI_FLASHNODE_STATSN,
692*4882a593Smuzhiyun 	ISCSI_FLASHNODE_EXP_STATSN,
693*4882a593Smuzhiyun 	ISCSI_FLASHNODE_IS_BOOT_TGT,
694*4882a593Smuzhiyun 
695*4882a593Smuzhiyun 	ISCSI_FLASHNODE_MAX,
696*4882a593Smuzhiyun };
697*4882a593Smuzhiyun 
698*4882a593Smuzhiyun struct iscsi_flashnode_param_info {
699*4882a593Smuzhiyun 	uint32_t len;		/* Actual length of the param */
700*4882a593Smuzhiyun 	uint16_t param;		/* iscsi param value */
701*4882a593Smuzhiyun 	uint8_t value[];	/* length sized value follows */
702*4882a593Smuzhiyun } __packed;
703*4882a593Smuzhiyun 
704*4882a593Smuzhiyun enum iscsi_discovery_parent_type {
705*4882a593Smuzhiyun 	ISCSI_DISC_PARENT_UNKNOWN	= 0x1,
706*4882a593Smuzhiyun 	ISCSI_DISC_PARENT_SENDTGT	= 0x2,
707*4882a593Smuzhiyun 	ISCSI_DISC_PARENT_ISNS		= 0x3,
708*4882a593Smuzhiyun };
709*4882a593Smuzhiyun 
710*4882a593Smuzhiyun /* iSCSI port Speed */
711*4882a593Smuzhiyun enum iscsi_port_speed {
712*4882a593Smuzhiyun 	ISCSI_PORT_SPEED_UNKNOWN	= 0x1,
713*4882a593Smuzhiyun 	ISCSI_PORT_SPEED_10MBPS		= 0x2,
714*4882a593Smuzhiyun 	ISCSI_PORT_SPEED_100MBPS	= 0x4,
715*4882a593Smuzhiyun 	ISCSI_PORT_SPEED_1GBPS		= 0x8,
716*4882a593Smuzhiyun 	ISCSI_PORT_SPEED_10GBPS		= 0x10,
717*4882a593Smuzhiyun 	ISCSI_PORT_SPEED_25GBPS         = 0x20,
718*4882a593Smuzhiyun 	ISCSI_PORT_SPEED_40GBPS         = 0x40,
719*4882a593Smuzhiyun };
720*4882a593Smuzhiyun 
721*4882a593Smuzhiyun /* iSCSI port state */
722*4882a593Smuzhiyun enum iscsi_port_state {
723*4882a593Smuzhiyun 	ISCSI_PORT_STATE_DOWN		= 0x1,
724*4882a593Smuzhiyun 	ISCSI_PORT_STATE_UP		= 0x2,
725*4882a593Smuzhiyun };
726*4882a593Smuzhiyun 
727*4882a593Smuzhiyun /* iSCSI PING status/error code */
728*4882a593Smuzhiyun enum iscsi_ping_status_code {
729*4882a593Smuzhiyun 	ISCSI_PING_SUCCESS			= 0,
730*4882a593Smuzhiyun 	ISCSI_PING_FW_DISABLED			= 0x1,
731*4882a593Smuzhiyun 	ISCSI_PING_IPADDR_INVALID		= 0x2,
732*4882a593Smuzhiyun 	ISCSI_PING_LINKLOCAL_IPV6_ADDR_INVALID	= 0x3,
733*4882a593Smuzhiyun 	ISCSI_PING_TIMEOUT			= 0x4,
734*4882a593Smuzhiyun 	ISCSI_PING_INVALID_DEST_ADDR		= 0x5,
735*4882a593Smuzhiyun 	ISCSI_PING_OVERSIZE_PACKET		= 0x6,
736*4882a593Smuzhiyun 	ISCSI_PING_ICMP_ERROR			= 0x7,
737*4882a593Smuzhiyun 	ISCSI_PING_MAX_REQ_EXCEEDED		= 0x8,
738*4882a593Smuzhiyun 	ISCSI_PING_NO_ARP_RECEIVED		= 0x9,
739*4882a593Smuzhiyun };
740*4882a593Smuzhiyun 
741*4882a593Smuzhiyun #define iscsi_ptr(_handle) ((void*)(unsigned long)_handle)
742*4882a593Smuzhiyun #define iscsi_handle(_ptr) ((uint64_t)(unsigned long)_ptr)
743*4882a593Smuzhiyun 
744*4882a593Smuzhiyun /*
745*4882a593Smuzhiyun  * These flags presents iSCSI Data-Path capabilities.
746*4882a593Smuzhiyun  */
747*4882a593Smuzhiyun #define CAP_RECOVERY_L0		0x1
748*4882a593Smuzhiyun #define CAP_RECOVERY_L1		0x2
749*4882a593Smuzhiyun #define CAP_RECOVERY_L2		0x4
750*4882a593Smuzhiyun #define CAP_MULTI_R2T		0x8
751*4882a593Smuzhiyun #define CAP_HDRDGST		0x10
752*4882a593Smuzhiyun #define CAP_DATADGST		0x20
753*4882a593Smuzhiyun #define CAP_MULTI_CONN		0x40
754*4882a593Smuzhiyun #define CAP_TEXT_NEGO		0x80
755*4882a593Smuzhiyun #define CAP_MARKERS		0x100
756*4882a593Smuzhiyun #define CAP_FW_DB		0x200
757*4882a593Smuzhiyun #define CAP_SENDTARGETS_OFFLOAD	0x400	/* offload discovery process */
758*4882a593Smuzhiyun #define CAP_DATA_PATH_OFFLOAD	0x800	/* offload entire IO path */
759*4882a593Smuzhiyun #define CAP_DIGEST_OFFLOAD	0x1000	/* offload hdr and data digests */
760*4882a593Smuzhiyun #define CAP_PADDING_OFFLOAD	0x2000	/* offload padding insertion, removal,
761*4882a593Smuzhiyun 					 and verification */
762*4882a593Smuzhiyun #define CAP_LOGIN_OFFLOAD	0x4000  /* offload session login */
763*4882a593Smuzhiyun 
764*4882a593Smuzhiyun /*
765*4882a593Smuzhiyun  * These flags describes reason of stop_conn() call
766*4882a593Smuzhiyun  */
767*4882a593Smuzhiyun #define STOP_CONN_TERM		0x1
768*4882a593Smuzhiyun #define STOP_CONN_SUSPEND	0x2
769*4882a593Smuzhiyun #define STOP_CONN_RECOVER	0x3
770*4882a593Smuzhiyun 
771*4882a593Smuzhiyun #define ISCSI_STATS_CUSTOM_MAX		32
772*4882a593Smuzhiyun #define ISCSI_STATS_CUSTOM_DESC_MAX	64
773*4882a593Smuzhiyun struct iscsi_stats_custom {
774*4882a593Smuzhiyun 	char desc[ISCSI_STATS_CUSTOM_DESC_MAX];
775*4882a593Smuzhiyun 	uint64_t value;
776*4882a593Smuzhiyun };
777*4882a593Smuzhiyun 
778*4882a593Smuzhiyun /*
779*4882a593Smuzhiyun  * struct iscsi_stats - iSCSI Statistics (iSCSI MIB)
780*4882a593Smuzhiyun  *
781*4882a593Smuzhiyun  * Note: this structure contains counters collected on per-connection basis.
782*4882a593Smuzhiyun  */
783*4882a593Smuzhiyun struct iscsi_stats {
784*4882a593Smuzhiyun 	/* octets */
785*4882a593Smuzhiyun 	uint64_t txdata_octets;
786*4882a593Smuzhiyun 	uint64_t rxdata_octets;
787*4882a593Smuzhiyun 
788*4882a593Smuzhiyun 	/* xmit pdus */
789*4882a593Smuzhiyun 	uint32_t noptx_pdus;
790*4882a593Smuzhiyun 	uint32_t scsicmd_pdus;
791*4882a593Smuzhiyun 	uint32_t tmfcmd_pdus;
792*4882a593Smuzhiyun 	uint32_t login_pdus;
793*4882a593Smuzhiyun 	uint32_t text_pdus;
794*4882a593Smuzhiyun 	uint32_t dataout_pdus;
795*4882a593Smuzhiyun 	uint32_t logout_pdus;
796*4882a593Smuzhiyun 	uint32_t snack_pdus;
797*4882a593Smuzhiyun 
798*4882a593Smuzhiyun 	/* recv pdus */
799*4882a593Smuzhiyun 	uint32_t noprx_pdus;
800*4882a593Smuzhiyun 	uint32_t scsirsp_pdus;
801*4882a593Smuzhiyun 	uint32_t tmfrsp_pdus;
802*4882a593Smuzhiyun 	uint32_t textrsp_pdus;
803*4882a593Smuzhiyun 	uint32_t datain_pdus;
804*4882a593Smuzhiyun 	uint32_t logoutrsp_pdus;
805*4882a593Smuzhiyun 	uint32_t r2t_pdus;
806*4882a593Smuzhiyun 	uint32_t async_pdus;
807*4882a593Smuzhiyun 	uint32_t rjt_pdus;
808*4882a593Smuzhiyun 
809*4882a593Smuzhiyun 	/* errors */
810*4882a593Smuzhiyun 	uint32_t digest_err;
811*4882a593Smuzhiyun 	uint32_t timeout_err;
812*4882a593Smuzhiyun 
813*4882a593Smuzhiyun 	/*
814*4882a593Smuzhiyun 	 * iSCSI Custom Statistics support, i.e. Transport could
815*4882a593Smuzhiyun 	 * extend existing MIB statistics with its own specific statistics
816*4882a593Smuzhiyun 	 * up to ISCSI_STATS_CUSTOM_MAX
817*4882a593Smuzhiyun 	 */
818*4882a593Smuzhiyun 	uint32_t custom_length;
819*4882a593Smuzhiyun 	struct iscsi_stats_custom custom[]
820*4882a593Smuzhiyun 		__attribute__ ((aligned (sizeof(uint64_t))));
821*4882a593Smuzhiyun };
822*4882a593Smuzhiyun 
823*4882a593Smuzhiyun enum chap_type_e {
824*4882a593Smuzhiyun 	CHAP_TYPE_OUT,
825*4882a593Smuzhiyun 	CHAP_TYPE_IN,
826*4882a593Smuzhiyun };
827*4882a593Smuzhiyun 
828*4882a593Smuzhiyun enum iscsi_chap_param {
829*4882a593Smuzhiyun 	ISCSI_CHAP_PARAM_INDEX,
830*4882a593Smuzhiyun 	ISCSI_CHAP_PARAM_CHAP_TYPE,
831*4882a593Smuzhiyun 	ISCSI_CHAP_PARAM_USERNAME,
832*4882a593Smuzhiyun 	ISCSI_CHAP_PARAM_PASSWORD,
833*4882a593Smuzhiyun 	ISCSI_CHAP_PARAM_PASSWORD_LEN
834*4882a593Smuzhiyun };
835*4882a593Smuzhiyun 
836*4882a593Smuzhiyun #define ISCSI_CHAP_AUTH_NAME_MAX_LEN	256
837*4882a593Smuzhiyun #define ISCSI_CHAP_AUTH_SECRET_MAX_LEN	256
838*4882a593Smuzhiyun struct iscsi_chap_rec {
839*4882a593Smuzhiyun 	uint16_t chap_tbl_idx;
840*4882a593Smuzhiyun 	enum chap_type_e chap_type;
841*4882a593Smuzhiyun 	char username[ISCSI_CHAP_AUTH_NAME_MAX_LEN];
842*4882a593Smuzhiyun 	uint8_t password[ISCSI_CHAP_AUTH_SECRET_MAX_LEN];
843*4882a593Smuzhiyun 	uint8_t password_length;
844*4882a593Smuzhiyun };
845*4882a593Smuzhiyun 
846*4882a593Smuzhiyun #define ISCSI_HOST_STATS_CUSTOM_MAX             32
847*4882a593Smuzhiyun #define ISCSI_HOST_STATS_CUSTOM_DESC_MAX        64
848*4882a593Smuzhiyun struct iscsi_host_stats_custom {
849*4882a593Smuzhiyun 	char desc[ISCSI_HOST_STATS_CUSTOM_DESC_MAX];
850*4882a593Smuzhiyun 	uint64_t value;
851*4882a593Smuzhiyun };
852*4882a593Smuzhiyun 
853*4882a593Smuzhiyun /* struct iscsi_offload_host_stats: Host statistics,
854*4882a593Smuzhiyun  * Include statistics for MAC, IP, TCP & iSCSI.
855*4882a593Smuzhiyun  */
856*4882a593Smuzhiyun struct iscsi_offload_host_stats {
857*4882a593Smuzhiyun 	/* MAC */
858*4882a593Smuzhiyun 	uint64_t mactx_frames;
859*4882a593Smuzhiyun 	uint64_t mactx_bytes;
860*4882a593Smuzhiyun 	uint64_t mactx_multicast_frames;
861*4882a593Smuzhiyun 	uint64_t mactx_broadcast_frames;
862*4882a593Smuzhiyun 	uint64_t mactx_pause_frames;
863*4882a593Smuzhiyun 	uint64_t mactx_control_frames;
864*4882a593Smuzhiyun 	uint64_t mactx_deferral;
865*4882a593Smuzhiyun 	uint64_t mactx_excess_deferral;
866*4882a593Smuzhiyun 	uint64_t mactx_late_collision;
867*4882a593Smuzhiyun 	uint64_t mactx_abort;
868*4882a593Smuzhiyun 	uint64_t mactx_single_collision;
869*4882a593Smuzhiyun 	uint64_t mactx_multiple_collision;
870*4882a593Smuzhiyun 	uint64_t mactx_collision;
871*4882a593Smuzhiyun 	uint64_t mactx_frames_dropped;
872*4882a593Smuzhiyun 	uint64_t mactx_jumbo_frames;
873*4882a593Smuzhiyun 	uint64_t macrx_frames;
874*4882a593Smuzhiyun 	uint64_t macrx_bytes;
875*4882a593Smuzhiyun 	uint64_t macrx_unknown_control_frames;
876*4882a593Smuzhiyun 	uint64_t macrx_pause_frames;
877*4882a593Smuzhiyun 	uint64_t macrx_control_frames;
878*4882a593Smuzhiyun 	uint64_t macrx_dribble;
879*4882a593Smuzhiyun 	uint64_t macrx_frame_length_error;
880*4882a593Smuzhiyun 	uint64_t macrx_jabber;
881*4882a593Smuzhiyun 	uint64_t macrx_carrier_sense_error;
882*4882a593Smuzhiyun 	uint64_t macrx_frame_discarded;
883*4882a593Smuzhiyun 	uint64_t macrx_frames_dropped;
884*4882a593Smuzhiyun 	uint64_t mac_crc_error;
885*4882a593Smuzhiyun 	uint64_t mac_encoding_error;
886*4882a593Smuzhiyun 	uint64_t macrx_length_error_large;
887*4882a593Smuzhiyun 	uint64_t macrx_length_error_small;
888*4882a593Smuzhiyun 	uint64_t macrx_multicast_frames;
889*4882a593Smuzhiyun 	uint64_t macrx_broadcast_frames;
890*4882a593Smuzhiyun 	/* IP */
891*4882a593Smuzhiyun 	uint64_t iptx_packets;
892*4882a593Smuzhiyun 	uint64_t iptx_bytes;
893*4882a593Smuzhiyun 	uint64_t iptx_fragments;
894*4882a593Smuzhiyun 	uint64_t iprx_packets;
895*4882a593Smuzhiyun 	uint64_t iprx_bytes;
896*4882a593Smuzhiyun 	uint64_t iprx_fragments;
897*4882a593Smuzhiyun 	uint64_t ip_datagram_reassembly;
898*4882a593Smuzhiyun 	uint64_t ip_invalid_address_error;
899*4882a593Smuzhiyun 	uint64_t ip_error_packets;
900*4882a593Smuzhiyun 	uint64_t ip_fragrx_overlap;
901*4882a593Smuzhiyun 	uint64_t ip_fragrx_outoforder;
902*4882a593Smuzhiyun 	uint64_t ip_datagram_reassembly_timeout;
903*4882a593Smuzhiyun 	uint64_t ipv6tx_packets;
904*4882a593Smuzhiyun 	uint64_t ipv6tx_bytes;
905*4882a593Smuzhiyun 	uint64_t ipv6tx_fragments;
906*4882a593Smuzhiyun 	uint64_t ipv6rx_packets;
907*4882a593Smuzhiyun 	uint64_t ipv6rx_bytes;
908*4882a593Smuzhiyun 	uint64_t ipv6rx_fragments;
909*4882a593Smuzhiyun 	uint64_t ipv6_datagram_reassembly;
910*4882a593Smuzhiyun 	uint64_t ipv6_invalid_address_error;
911*4882a593Smuzhiyun 	uint64_t ipv6_error_packets;
912*4882a593Smuzhiyun 	uint64_t ipv6_fragrx_overlap;
913*4882a593Smuzhiyun 	uint64_t ipv6_fragrx_outoforder;
914*4882a593Smuzhiyun 	uint64_t ipv6_datagram_reassembly_timeout;
915*4882a593Smuzhiyun 	/* TCP */
916*4882a593Smuzhiyun 	uint64_t tcptx_segments;
917*4882a593Smuzhiyun 	uint64_t tcptx_bytes;
918*4882a593Smuzhiyun 	uint64_t tcprx_segments;
919*4882a593Smuzhiyun 	uint64_t tcprx_byte;
920*4882a593Smuzhiyun 	uint64_t tcp_duplicate_ack_retx;
921*4882a593Smuzhiyun 	uint64_t tcp_retx_timer_expired;
922*4882a593Smuzhiyun 	uint64_t tcprx_duplicate_ack;
923*4882a593Smuzhiyun 	uint64_t tcprx_pure_ackr;
924*4882a593Smuzhiyun 	uint64_t tcptx_delayed_ack;
925*4882a593Smuzhiyun 	uint64_t tcptx_pure_ack;
926*4882a593Smuzhiyun 	uint64_t tcprx_segment_error;
927*4882a593Smuzhiyun 	uint64_t tcprx_segment_outoforder;
928*4882a593Smuzhiyun 	uint64_t tcprx_window_probe;
929*4882a593Smuzhiyun 	uint64_t tcprx_window_update;
930*4882a593Smuzhiyun 	uint64_t tcptx_window_probe_persist;
931*4882a593Smuzhiyun 	/* ECC */
932*4882a593Smuzhiyun 	uint64_t ecc_error_correction;
933*4882a593Smuzhiyun 	/* iSCSI */
934*4882a593Smuzhiyun 	uint64_t iscsi_pdu_tx;
935*4882a593Smuzhiyun 	uint64_t iscsi_data_bytes_tx;
936*4882a593Smuzhiyun 	uint64_t iscsi_pdu_rx;
937*4882a593Smuzhiyun 	uint64_t iscsi_data_bytes_rx;
938*4882a593Smuzhiyun 	uint64_t iscsi_io_completed;
939*4882a593Smuzhiyun 	uint64_t iscsi_unexpected_io_rx;
940*4882a593Smuzhiyun 	uint64_t iscsi_format_error;
941*4882a593Smuzhiyun 	uint64_t iscsi_hdr_digest_error;
942*4882a593Smuzhiyun 	uint64_t iscsi_data_digest_error;
943*4882a593Smuzhiyun 	uint64_t iscsi_sequence_error;
944*4882a593Smuzhiyun 	/*
945*4882a593Smuzhiyun 	 * iSCSI Custom Host Statistics support, i.e. Transport could
946*4882a593Smuzhiyun 	 * extend existing host statistics with its own specific statistics
947*4882a593Smuzhiyun 	 * up to ISCSI_HOST_STATS_CUSTOM_MAX
948*4882a593Smuzhiyun 	 */
949*4882a593Smuzhiyun 	uint32_t custom_length;
950*4882a593Smuzhiyun 	struct iscsi_host_stats_custom custom[]
951*4882a593Smuzhiyun 		__aligned(sizeof(uint64_t));
952*4882a593Smuzhiyun };
953*4882a593Smuzhiyun 
954*4882a593Smuzhiyun #endif
955