xref: /openbsd-src/usr.sbin/iscsid/iscsid.h (revision 2224f3a16d1f18cce3c29a4d93c68c31af83a07e)
1*2224f3a1Sclaudio /*	$OpenBSD: iscsid.h,v 1.24 2025/01/28 20:41:44 claudio Exp $ */
2bde1ae23Sclaudio 
3bde1ae23Sclaudio /*
4bde1ae23Sclaudio  * Copyright (c) 2009 Claudio Jeker <claudio@openbsd.org>
5bde1ae23Sclaudio  *
6bde1ae23Sclaudio  * Permission to use, copy, modify, and distribute this software for any
7bde1ae23Sclaudio  * purpose with or without fee is hereby granted, provided that the above
8bde1ae23Sclaudio  * copyright notice and this permission notice appear in all copies.
9bde1ae23Sclaudio  *
10bde1ae23Sclaudio  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11bde1ae23Sclaudio  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12bde1ae23Sclaudio  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13bde1ae23Sclaudio  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14bde1ae23Sclaudio  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15bde1ae23Sclaudio  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16bde1ae23Sclaudio  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17bde1ae23Sclaudio  */
18bde1ae23Sclaudio 
19bde1ae23Sclaudio #define ISCSID_DEVICE	"/dev/vscsi0"
20bde1ae23Sclaudio #define ISCSID_CONTROL	"/var/run/iscsid.sock"
21bde1ae23Sclaudio #define ISCSID_CONFIG	"/etc/iscsi.conf"
22bde1ae23Sclaudio #define ISCSID_USER	"_iscsid"
23bde1ae23Sclaudio 
24bde1ae23Sclaudio #define ISCSID_BASE_NAME	"iqn.1995-11.org.openbsd.iscsid"
254125a3c4Sclaudio #define ISCSID_DEF_CONNS	8
26daed3c83Sclaudio #define ISCSID_HOLD_TIME_MAX	128
27bde1ae23Sclaudio 
28bde1ae23Sclaudio #define PDU_READ_SIZE		(256 * 1024)
29bde1ae23Sclaudio #define CONTROL_READ_SIZE	8192
30bde1ae23Sclaudio #define PDU_MAXIOV		5
31bde1ae23Sclaudio #define PDU_WRIOV		(PDU_MAXIOV * 8)
32bde1ae23Sclaudio 
33bde1ae23Sclaudio #define PDU_HEADER	0
34bde1ae23Sclaudio #define PDU_AHS		1
35bde1ae23Sclaudio #define PDU_HDIGEST	2
36bde1ae23Sclaudio #define PDU_DATA	3
37bde1ae23Sclaudio #define PDU_DDIGEST	4
38bde1ae23Sclaudio 
39bde1ae23Sclaudio #define PDU_LEN(x)	((((x) + 3) / 4) * 4)
40bde1ae23Sclaudio 
41f75ac035Stedu #ifndef nitems
42f75ac035Stedu #define nitems(_a) (sizeof((_a)) / sizeof((_a)[0]))
43f75ac035Stedu #endif
44f75ac035Stedu 
45bde1ae23Sclaudio /*
46bde1ae23Sclaudio  * Common control message header.
47bde1ae23Sclaudio  * A message can consist of up to 3 parts with specified length.
48bde1ae23Sclaudio  */
49bde1ae23Sclaudio struct ctrlmsghdr {
50bde1ae23Sclaudio 	u_int16_t	type;
51bde1ae23Sclaudio 	u_int16_t	len[3];
52bde1ae23Sclaudio };
53bde1ae23Sclaudio 
54f73922b8Sclaudio struct ctrldata {
55f73922b8Sclaudio 	void		*buf;
56f73922b8Sclaudio 	size_t		 len;
57f73922b8Sclaudio };
58f73922b8Sclaudio 
59f73922b8Sclaudio #define CTRLARGV(x...)	((struct ctrldata []){ x })
60f73922b8Sclaudio 
61bde1ae23Sclaudio /* Control message types */
62bde1ae23Sclaudio #define CTRL_SUCCESS		1
63bde1ae23Sclaudio #define CTRL_FAILURE		2
646727bd69Sclaudio #define CTRL_INPROGRESS		3
656727bd69Sclaudio #define CTRL_INITIATOR_CONFIG	4
666727bd69Sclaudio #define CTRL_SESSION_CONFIG	5
676727bd69Sclaudio #define CTRL_LOG_VERBOSE	6
68234d8810Sclaudio #define CTRL_VSCSI_STATS	7
699683d5fdSclaudio #define CTRL_SHOW_SUM		8
70ea99aae6Sclaudio #define CTRL_SESS_POLL		9
71bde1ae23Sclaudio 
72bde1ae23Sclaudio TAILQ_HEAD(session_head, session);
73bde1ae23Sclaudio TAILQ_HEAD(connection_head, connection);
74bde1ae23Sclaudio TAILQ_HEAD(pduq, pdu);
75bde1ae23Sclaudio TAILQ_HEAD(taskq, task);
76bde1ae23Sclaudio 
77bde1ae23Sclaudio /* as in tcp_seq.h */
78bde1ae23Sclaudio #define SEQ_LT(a,b)	((int)((a)-(b)) < 0)
79bde1ae23Sclaudio #define SEQ_LEQ(a,b)	((int)((a)-(b)) <= 0)
80bde1ae23Sclaudio #define SEQ_GT(a,b)	((int)((a)-(b)) > 0)
81bde1ae23Sclaudio #define SEQ_GEQ(a,b)	((int)((a)-(b)) >= 0)
82bde1ae23Sclaudio 
83cb408c6cSclaudio #define SESS_INIT		0x0001
84cb408c6cSclaudio #define SESS_FREE		0x0002
8512bd4d7fSclaudio #define SESS_LOGGED_IN		0x0004
8612bd4d7fSclaudio #define SESS_FAILED		0x0008
87cb408c6cSclaudio #define SESS_ANYSTATE		0xffff
8812bd4d7fSclaudio #define SESS_RUNNING		(SESS_FREE | SESS_LOGGED_IN | SESS_FAILED)
89bde1ae23Sclaudio 
90daed3c83Sclaudio #define CONN_FREE		0x0001	/* S1 = R3 */
91daed3c83Sclaudio #define CONN_XPT_WAIT		0x0002	/* S2 */
92daed3c83Sclaudio #define CONN_XPT_UP		0x0004	/* S3 */
93daed3c83Sclaudio #define CONN_IN_LOGIN		0x0008	/* S4 */
94daed3c83Sclaudio #define CONN_LOGGED_IN		0x0010	/* S5 */
95daed3c83Sclaudio #define CONN_IN_LOGOUT		0x0020	/* S6 */
96daed3c83Sclaudio #define CONN_LOGOUT_REQ		0x0040	/* S7 */
97daed3c83Sclaudio #define CONN_CLEANUP_WAIT	0x0080	/* S8 = R1 */
98daed3c83Sclaudio #define CONN_IN_CLEANUP		0x0100	/* R2 */
99bde1ae23Sclaudio #define CONN_ANYSTATE		0xffff
10012bd4d7fSclaudio #define CONN_RUNNING		(CONN_LOGGED_IN | CONN_LOGOUT_REQ)
10112bd4d7fSclaudio #define CONN_FAILED		(CONN_CLEANUP_WAIT | CONN_IN_CLEANUP)
1024125a3c4Sclaudio #define CONN_NEVER_LOGGED_IN	(CONN_FREE | CONN_XPT_WAIT | CONN_XPT_UP | \
1034125a3c4Sclaudio 				    CONN_IN_LOGIN)
104bde1ae23Sclaudio 
105bde1ae23Sclaudio enum c_event {
106bde1ae23Sclaudio 	CONN_EV_FAIL,
10712bd4d7fSclaudio 	CONN_EV_FREE,
108bde1ae23Sclaudio 	CONN_EV_CONNECT,
109bde1ae23Sclaudio 	CONN_EV_CONNECTED,
110bde1ae23Sclaudio 	CONN_EV_LOGGED_IN,
111daed3c83Sclaudio 	CONN_EV_REQ_LOGOUT,
112cb408c6cSclaudio 	CONN_EV_LOGOUT,
113cb408c6cSclaudio 	CONN_EV_LOGGED_OUT,
114daed3c83Sclaudio 	CONN_EV_CLOSED,
115daed3c83Sclaudio 	CONN_EV_CLEANING_UP
116cb408c6cSclaudio };
117cb408c6cSclaudio 
118cb408c6cSclaudio enum s_event {
119cb408c6cSclaudio 	SESS_EV_START,
120daed3c83Sclaudio 	SESS_EV_STOP,
12112bd4d7fSclaudio 	SESS_EV_CONN_LOGGED_IN,
122cb408c6cSclaudio 	SESS_EV_CONN_FAIL,
123cb408c6cSclaudio 	SESS_EV_CONN_CLOSED,
124daed3c83Sclaudio 	SESS_EV_REINSTATEMENT,
125daed3c83Sclaudio 	SESS_EV_TIMEOUT,
12612bd4d7fSclaudio 	SESS_EV_CLOSED,
127daed3c83Sclaudio 	SESS_EV_FAIL,
128daed3c83Sclaudio 	SESS_EV_FREE
129bde1ae23Sclaudio };
130bde1ae23Sclaudio 
13112bd4d7fSclaudio #define SESS_ACT_UP		0
13212bd4d7fSclaudio #define SESS_ACT_DOWN		1
13312bd4d7fSclaudio 
134bde1ae23Sclaudio struct pdu {
135bde1ae23Sclaudio 	TAILQ_ENTRY(pdu)	 entry;
136bde1ae23Sclaudio 	struct iovec		 iov[PDU_MAXIOV];
137bde1ae23Sclaudio 	size_t			 resid;
138bde1ae23Sclaudio };
139bde1ae23Sclaudio 
140bde1ae23Sclaudio struct pdu_readbuf {
141bde1ae23Sclaudio 	char		*buf;
142bde1ae23Sclaudio 	size_t		 size;
143bde1ae23Sclaudio 	size_t		 rpos;
144bde1ae23Sclaudio 	size_t		 wpos;
145bde1ae23Sclaudio 	struct pdu	*wip;
146bde1ae23Sclaudio };
147bde1ae23Sclaudio 
148bde1ae23Sclaudio struct connection_config {
149bde1ae23Sclaudio 	/* values inherited from session_config */
150bde1ae23Sclaudio 	struct sockaddr_storage	 TargetAddr;	/* IP:port of target */
151bde1ae23Sclaudio 	struct sockaddr_storage	 LocalAddr;	/* IP:port of target */
152bde1ae23Sclaudio };
153bde1ae23Sclaudio 
154bde1ae23Sclaudio struct initiator_config {
155bde1ae23Sclaudio 	u_int32_t		isid_base;	/* only 24 bits */
156bde1ae23Sclaudio 	u_int16_t		isid_qual;
157bde1ae23Sclaudio 	u_int16_t		pad;
158bde1ae23Sclaudio };
159bde1ae23Sclaudio 
160bde1ae23Sclaudio struct session_config {
161bde1ae23Sclaudio 	/* unique session ID */
162bde1ae23Sclaudio 	char			SessionName[32];
163bde1ae23Sclaudio 	/*
164bde1ae23Sclaudio 	 * I = initialize only, L = leading only
165bde1ae23Sclaudio 	 * S = session wide, C = connection only
166bde1ae23Sclaudio 	 */
167bde1ae23Sclaudio 	struct connection_config connection;
168bde1ae23Sclaudio 
169bde1ae23Sclaudio 	char			*TargetName;	/* String: IS */
170bde1ae23Sclaudio 
171bde1ae23Sclaudio 	char			*InitiatorName;	/* String: IS */
172bde1ae23Sclaudio 
173bde1ae23Sclaudio 	u_int16_t		 MaxConnections;
174bde1ae23Sclaudio 				 /* 1, 1-65535 (min()): LS */
175bde1ae23Sclaudio 	u_int8_t		 HeaderDigest;
176bde1ae23Sclaudio 				 /* None , (None|CRC32): IC */
177bde1ae23Sclaudio 	u_int8_t		 DataDigest;
178bde1ae23Sclaudio 				 /* None , (None|CRC32): IC */
179bde1ae23Sclaudio 	u_int8_t		 SessionType;
180bde1ae23Sclaudio 				 /* Normal, (Discovery|Normal): LS */
181bde1ae23Sclaudio 	u_int8_t		 disabled;
182bde1ae23Sclaudio };
183bde1ae23Sclaudio 
184aeec9c16Sclaudio #define DIGEST_NONE		0x1
185aeec9c16Sclaudio #define DIGEST_CRC32C		0x2
186aeec9c16Sclaudio 
187bde1ae23Sclaudio #define SESSION_TYPE_NORMAL	0
188bde1ae23Sclaudio #define SESSION_TYPE_DISCOVERY	1
189bde1ae23Sclaudio 
190bde1ae23Sclaudio struct session_params {
191bde1ae23Sclaudio 	u_int32_t		 MaxBurstLength;
192bde1ae23Sclaudio 				 /* 262144, 512-to-(2**24-1) (min()): LS */
193bde1ae23Sclaudio 	u_int32_t		 FirstBurstLength;
194bde1ae23Sclaudio 				 /* 65536, 512-to-(2**24-1) (min()): LS */
195bde1ae23Sclaudio 	u_int16_t		 DefaultTime2Wait;
196bde1ae23Sclaudio 				 /* 2, 0-to-3600 (max()): LS */
197bde1ae23Sclaudio 	u_int16_t		 DefaultTime2Retain;
198bde1ae23Sclaudio 				 /* 20, 0-to-3600 (min()): LS */
199bde1ae23Sclaudio 	u_int16_t		 MaxOutstandingR2T;
200bde1ae23Sclaudio 				 /* 1, 1-to-65535 (min()): LS */
201bde1ae23Sclaudio 	u_int16_t		 TargetPortalGroupTag;
202bde1ae23Sclaudio 				 /* 1- 65535: IS */
203310dec26Sclaudio 	u_int16_t		 MaxConnections;
2044125a3c4Sclaudio 				 /* 1, 1-65535 (min()): LS */
205bde1ae23Sclaudio 	u_int8_t		 InitialR2T;
206bde1ae23Sclaudio 				 /* yes, bool (||): LS  */
207bde1ae23Sclaudio 	u_int8_t		 ImmediateData;
208bde1ae23Sclaudio 				 /* yes, bool (&&): LS */
209bde1ae23Sclaudio 	u_int8_t		 DataPDUInOrder;
210bde1ae23Sclaudio 				 /* yes, bool (||): LS */
211bde1ae23Sclaudio 	u_int8_t		 DataSequenceInOrder;
212bde1ae23Sclaudio 				 /* yes, bool (||): LS */
213bde1ae23Sclaudio 	u_int8_t		 ErrorRecoveryLevel;
214bde1ae23Sclaudio 				 /* 0, 0 - 2 (min()): LS */
215bde1ae23Sclaudio };
216bde1ae23Sclaudio 
217bde1ae23Sclaudio struct connection_params {
218bde1ae23Sclaudio 	u_int32_t		 MaxRecvDataSegmentLength;
219bde1ae23Sclaudio 				 /* 8192, 512-to-(2**24-1): C */
220bde1ae23Sclaudio 				 /* inherited from session_config */
221bde1ae23Sclaudio 	u_int8_t		 HeaderDigest;
222bde1ae23Sclaudio 	u_int8_t		 DataDigest;
223bde1ae23Sclaudio };
224bde1ae23Sclaudio 
225bde1ae23Sclaudio struct initiator {
226bde1ae23Sclaudio 	struct session_head	sessions;
227bde1ae23Sclaudio 	struct initiator_config	config;
228bde1ae23Sclaudio 	u_int			target;
229bde1ae23Sclaudio };
230bde1ae23Sclaudio 
231cb408c6cSclaudio struct sessev {
2320908bd10Sclaudio 	struct event		 ev;
233daed3c83Sclaudio 	struct session		*sess;
234cb408c6cSclaudio 	struct connection	*conn;
235cb408c6cSclaudio 	enum s_event		 event;
236cb408c6cSclaudio };
237cb408c6cSclaudio 
238bde1ae23Sclaudio struct session {
239bde1ae23Sclaudio 	TAILQ_ENTRY(session)	 entry;
2400908bd10Sclaudio 	struct sessev		 sev;
241bde1ae23Sclaudio 	struct connection_head	 connections;
242bde1ae23Sclaudio 	struct taskq		 tasks;
243bde1ae23Sclaudio 	struct session_config	 config;
244bde1ae23Sclaudio 	struct session_params	 mine;
245bde1ae23Sclaudio 	struct session_params	 his;
246bde1ae23Sclaudio 	struct session_params	 active;
247bde1ae23Sclaudio 	u_int32_t		 cmdseqnum;
248bde1ae23Sclaudio 	u_int32_t		 itt;
249bde1ae23Sclaudio 	u_int32_t		 isid_base;	/* only 24 bits */
250bde1ae23Sclaudio 	u_int16_t		 isid_qual;	/* inherited from initiator */
251bde1ae23Sclaudio 	u_int16_t		 tsih;		/* target session id handle */
252bde1ae23Sclaudio 	u_int			 target;
253daed3c83Sclaudio 	int			 holdTimer;	/* internal hold timer */
254bde1ae23Sclaudio 	int			 state;
25512bd4d7fSclaudio 	int			 action;
256bde1ae23Sclaudio };
257bde1ae23Sclaudio 
258ea99aae6Sclaudio struct session_poll {
259ea99aae6Sclaudio 	int session_count;
260ea99aae6Sclaudio 	int session_init_count;
261ea99aae6Sclaudio 	int session_running_count;
262ea99aae6Sclaudio 	int conn_logged_in_count;
263ea99aae6Sclaudio 	int conn_failed_count;
264ea99aae6Sclaudio 	int conn_waiting_count;
265ea99aae6Sclaudio 	int sess_conn_status;
266ea99aae6Sclaudio };
267ea99aae6Sclaudio 
268bde1ae23Sclaudio struct connection {
269bde1ae23Sclaudio 	struct event		 ev;
270bde1ae23Sclaudio 	struct event		 wev;
2710908bd10Sclaudio 	struct sessev		 sev;
272bde1ae23Sclaudio 	TAILQ_ENTRY(connection)	 entry;
273bde1ae23Sclaudio 	struct connection_params mine;
274bde1ae23Sclaudio 	struct connection_params his;
275bde1ae23Sclaudio 	struct connection_params active;
276bde1ae23Sclaudio 	struct connection_config config;
277bde1ae23Sclaudio 	struct pdu_readbuf	 prbuf;
278bde1ae23Sclaudio 	struct pduq		 pdu_w;
279bde1ae23Sclaudio 	struct taskq		 tasks;
280bde1ae23Sclaudio 	struct session		*session;
281bde1ae23Sclaudio 	u_int32_t		 expstatsn;
282bde1ae23Sclaudio 	int			 state;
283bde1ae23Sclaudio 	int			 fd;
2843a50f0a9Sjmc 	u_int16_t		 cid;	/* connection id */
285bde1ae23Sclaudio };
286bde1ae23Sclaudio 
287bde1ae23Sclaudio struct task {
288bde1ae23Sclaudio 	TAILQ_ENTRY(task)	 entry;
289bde1ae23Sclaudio 	struct pduq		 sendq;
290bde1ae23Sclaudio 	struct pduq		 recvq;
291bde1ae23Sclaudio 	void			*callarg;
292bde1ae23Sclaudio 	void	(*callback)(struct connection *, void *, struct pdu *);
293cb408c6cSclaudio 	void	(*failback)(void *);
294bde1ae23Sclaudio 	u_int32_t		 cmdseqnum;
295bde1ae23Sclaudio 	u_int32_t		 itt;
296cb408c6cSclaudio 	u_int8_t		 pending;
297bde1ae23Sclaudio };
298bde1ae23Sclaudio 
299bde1ae23Sclaudio struct kvp {
300bde1ae23Sclaudio 	char	*key;
301bde1ae23Sclaudio 	char	*value;
302bde1ae23Sclaudio 	long	 flags;
303bde1ae23Sclaudio };
304bde1ae23Sclaudio #define KVP_KEY_ALLOCED		0x01
305bde1ae23Sclaudio #define KVP_VALUE_ALLOCED	0x02
306bde1ae23Sclaudio 
307234d8810Sclaudio struct vscsi_stats {
308234d8810Sclaudio 	u_int64_t	bytes_rd;
309234d8810Sclaudio 	u_int64_t	bytes_wr;
310234d8810Sclaudio 	u_int64_t	cnt_read;
311234d8810Sclaudio 	u_int64_t	cnt_write;
312234d8810Sclaudio 	u_int64_t	cnt_i2t;
313234d8810Sclaudio 	u_int64_t	cnt_i2t_dir[3];
314234d8810Sclaudio 	u_int64_t	cnt_t2i;
315234d8810Sclaudio 	u_int64_t	cnt_t2i_status[3];
316234d8810Sclaudio 	u_int32_t	cnt_probe;
317234d8810Sclaudio 	u_int32_t	cnt_detach;
318234d8810Sclaudio };
319234d8810Sclaudio 
3204125a3c4Sclaudio extern const struct session_params iscsi_sess_defaults;
3214125a3c4Sclaudio extern const struct connection_params iscsi_conn_defaults;
3224125a3c4Sclaudio extern struct session_params initiator_sess_defaults;
3234125a3c4Sclaudio extern struct connection_params initiator_conn_defaults;
3244125a3c4Sclaudio 
325bde1ae23Sclaudio void	iscsid_ctrl_dispatch(void *, struct pdu *);
3264125a3c4Sclaudio void	iscsi_merge_sess_params(struct session_params *,
3274125a3c4Sclaudio 	    struct session_params *, struct session_params *);
3284125a3c4Sclaudio void	iscsi_merge_conn_params(struct connection_params *,
3294125a3c4Sclaudio 	    struct connection_params *, struct connection_params *);
330bde1ae23Sclaudio 
3317b833938Sclaudio void	initiator_init(void);
3327b833938Sclaudio void	initiator_cleanup(void);
3337b833938Sclaudio void	initiator_set_config(struct initiator_config *);
3347b833938Sclaudio struct initiator_config *initiator_get_config(void);
3357b833938Sclaudio void	initiator_shutdown(void);
3367b833938Sclaudio int	initiator_isdown(void);
3377b833938Sclaudio struct session	*initiator_new_session(u_int8_t);
3387b833938Sclaudio struct session	*initiator_find_session(char *);
339bde1ae23Sclaudio struct session	*initiator_t2s(u_int);
3407b833938Sclaudio struct session_head	*initiator_get_sessions(void);
34117fa8594Sclaudio void	initiator_login(struct connection *);
34217fa8594Sclaudio void	initiator_discovery(struct session *);
34312bd4d7fSclaudio void	initiator_logout(struct session *, struct connection *, u_int8_t);
34417fa8594Sclaudio void	initiator_nop_in_imm(struct connection *, struct pdu *);
34536af5452Sclaudio char	*default_initiator_name(void);
346bde1ae23Sclaudio 
347bde1ae23Sclaudio int	control_init(char *);
348bde1ae23Sclaudio void	control_cleanup(char *);
34977822a85Sclaudio void	control_event_init(void);
350f73922b8Sclaudio void	control_queue(void *, struct pdu *);
351bde1ae23Sclaudio int	control_compose(void *, u_int16_t, void *, size_t);
352f73922b8Sclaudio int	control_build(void *, u_int16_t, int, struct ctrldata *);
353bde1ae23Sclaudio 
354cb408c6cSclaudio void	session_cleanup(struct session *);
35512bd4d7fSclaudio int	session_shutdown(struct session *);
356bde1ae23Sclaudio void	session_config(struct session *, struct session_config *);
357bde1ae23Sclaudio void	session_task_issue(struct session *, struct task *);
35812bd4d7fSclaudio void	session_logout_issue(struct session *, struct task *);
359bde1ae23Sclaudio void	session_schedule(struct session *);
3600908bd10Sclaudio void	session_fsm(struct sessev *, enum s_event, unsigned int);
3610908bd10Sclaudio void	session_fsm_callback(int, short, void *);
362bde1ae23Sclaudio 
363bde1ae23Sclaudio void	conn_new(struct session *, struct connection_config *);
364bde1ae23Sclaudio void	conn_free(struct connection *);
365cb408c6cSclaudio int	conn_task_ready(struct connection *);
366cb408c6cSclaudio void	conn_task_issue(struct connection *, struct task *);
367bde1ae23Sclaudio void	conn_task_schedule(struct connection *);
3684125a3c4Sclaudio void	conn_task_cleanup(struct connection *, struct task *);
3694125a3c4Sclaudio int	conn_parse_kvp(struct connection *, struct kvp *);
370*2224f3a1Sclaudio int	kvp_set_from_mine(struct kvp *, const char *, struct connection *);
371bde1ae23Sclaudio void	conn_pdu_write(struct connection *, struct pdu *);
372bde1ae23Sclaudio void	conn_fail(struct connection *);
373cb408c6cSclaudio void	conn_fsm(struct connection *, enum c_event);
374bde1ae23Sclaudio 
375bde1ae23Sclaudio void	*pdu_gethdr(struct pdu *);
376bde1ae23Sclaudio int	text_to_pdu(struct kvp *, struct pdu *);
377bde1ae23Sclaudio struct kvp *pdu_to_text(char *, size_t);
3784125a3c4Sclaudio u_int64_t	text_to_num(const char *, u_int64_t, u_int64_t, const char **);
3794125a3c4Sclaudio int		text_to_bool(const char *, const char **);
380aeec9c16Sclaudio int		text_to_digest(const char *, const char **);
381bde1ae23Sclaudio void	pdu_free_queue(struct pduq *);
382bde1ae23Sclaudio ssize_t	pdu_read(struct connection *);
383bde1ae23Sclaudio ssize_t	pdu_write(struct connection *);
384bde1ae23Sclaudio int	pdu_pending(struct connection *);
385bde1ae23Sclaudio void	pdu_parse(struct connection *);
386bde1ae23Sclaudio int	pdu_readbuf_set(struct pdu_readbuf *, size_t);
387bde1ae23Sclaudio void	pdu_readbuf_free(struct pdu_readbuf *);
388bde1ae23Sclaudio 
389bde1ae23Sclaudio struct pdu *pdu_new(void);
390bde1ae23Sclaudio void	*pdu_alloc(size_t);
391bde1ae23Sclaudio void	*pdu_dup(void *, size_t);
392bde1ae23Sclaudio int	pdu_addbuf(struct pdu *, void *, size_t, unsigned int);
393bde1ae23Sclaudio void	*pdu_getbuf(struct pdu *, size_t *, unsigned int);
394bde1ae23Sclaudio void	pdu_free(struct pdu *);
395bde1ae23Sclaudio int	socket_setblockmode(int, int);
396bde1ae23Sclaudio const char *log_sockaddr(void *);
397dda190faSclaudio void	kvp_free(struct kvp *);
398bde1ae23Sclaudio 
399bde1ae23Sclaudio void	task_init(struct task *, struct session *, int, void *,
400cb408c6cSclaudio 	    void (*)(struct connection *, void *, struct pdu *),
401cb408c6cSclaudio 	    void (*)(void *));
402cb408c6cSclaudio void	taskq_cleanup(struct taskq *);
403bde1ae23Sclaudio void	task_pdu_add(struct task *, struct pdu *);
404bde1ae23Sclaudio void	task_pdu_cb(struct connection *, struct pdu *);
405bde1ae23Sclaudio 
406bde1ae23Sclaudio void	vscsi_open(char *);
407bde1ae23Sclaudio void	vscsi_dispatch(int, short, void *);
408bde1ae23Sclaudio void	vscsi_data(unsigned long, int, void *, size_t);
409bde1ae23Sclaudio void	vscsi_status(int, int, void *, size_t);
410bde1ae23Sclaudio void	vscsi_event(unsigned long, u_int, u_int);
411234d8810Sclaudio struct vscsi_stats *vscsi_stats(void);
412e86986b3Sbenno 
413ea99aae6Sclaudio /* Session polling */
414ea99aae6Sclaudio void    poll_session(struct session_poll *, struct session *);
415ea99aae6Sclaudio void    poll_finalize(struct session_poll *);
416ea99aae6Sclaudio 
417e86986b3Sbenno /* logmsg.c */
418e86986b3Sbenno void	log_hexdump(void *, size_t);
419e86986b3Sbenno void	log_pdu(struct pdu *, int);
420