1255570Strasz/*-
2255570Strasz * Copyright (c) 2012 The FreeBSD Foundation
3255570Strasz * All rights reserved.
4255570Strasz *
5255570Strasz * This software was developed by Edward Tomasz Napierala under sponsorship
6255570Strasz * from the FreeBSD Foundation.
7255570Strasz *
8255570Strasz * Redistribution and use in source and binary forms, with or without
9255570Strasz * modification, are permitted provided that the following conditions
10255570Strasz * are met:
11255570Strasz * 1. Redistributions of source code must retain the above copyright
12255570Strasz *    notice, this list of conditions and the following disclaimer.
13255570Strasz * 2. Redistributions in binary form must reproduce the above copyright
14255570Strasz *    notice, this list of conditions and the following disclaimer in the
15255570Strasz *    documentation and/or other materials provided with the distribution.
16255570Strasz *
17255570Strasz * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
18255570Strasz * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19255570Strasz * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20255570Strasz * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
21255570Strasz * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22255570Strasz * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23255570Strasz * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24255570Strasz * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25255570Strasz * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26255570Strasz * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27255570Strasz * SUCH DAMAGE.
28255570Strasz *
29255570Strasz * $FreeBSD$
30255570Strasz */
31255570Strasz
32255570Strasz#ifndef CTLD_H
33255570Strasz#define	CTLD_H
34255570Strasz
35255570Strasz#include <sys/queue.h>
36265513Strasz#ifdef ICL_KERNEL_PROXY
37265513Strasz#include <sys/types.h>
38270137Smav#endif
39265513Strasz#include <sys/socket.h>
40255570Strasz#include <stdbool.h>
41255570Strasz#include <libutil.h>
42255570Strasz
43255570Strasz#define	DEFAULT_CONFIG_PATH		"/etc/ctl.conf"
44255570Strasz#define	DEFAULT_PIDFILE			"/var/run/ctld.pid"
45255570Strasz#define	DEFAULT_BLOCKSIZE		512
46255570Strasz
47255570Strasz#define	MAX_NAME_LEN			223
48255570Strasz#define	MAX_DATA_SEGMENT_LENGTH		(128 * 1024)
49255570Strasz#define	MAX_BURST_LENGTH		16776192
50255570Strasz
51255570Straszstruct auth {
52255570Strasz	TAILQ_ENTRY(auth)		a_next;
53255570Strasz	struct auth_group		*a_auth_group;
54255570Strasz	char				*a_user;
55255570Strasz	char				*a_secret;
56255570Strasz	char				*a_mutual_user;
57255570Strasz	char				*a_mutual_secret;
58255570Strasz};
59255570Strasz
60263720Straszstruct auth_name {
61263720Strasz	TAILQ_ENTRY(auth_name)		an_next;
62263720Strasz	struct auth_group		*an_auth_group;
63263720Strasz	char				*an_initator_name;
64263720Strasz};
65263720Strasz
66263720Straszstruct auth_portal {
67263720Strasz	TAILQ_ENTRY(auth_portal)	ap_next;
68263720Strasz	struct auth_group		*ap_auth_group;
69263720Strasz	char				*ap_initator_portal;
70270137Smav	struct sockaddr_storage		ap_sa;
71270137Smav	int				ap_mask;
72263720Strasz};
73263720Strasz
74255570Strasz#define	AG_TYPE_UNKNOWN			0
75263729Strasz#define	AG_TYPE_DENY			1
76263729Strasz#define	AG_TYPE_NO_AUTHENTICATION	2
77263729Strasz#define	AG_TYPE_CHAP			3
78263729Strasz#define	AG_TYPE_CHAP_MUTUAL		4
79255570Strasz
80255570Straszstruct auth_group {
81255570Strasz	TAILQ_ENTRY(auth_group)		ag_next;
82255570Strasz	struct conf			*ag_conf;
83255570Strasz	char				*ag_name;
84255570Strasz	struct target			*ag_target;
85255570Strasz	int				ag_type;
86255570Strasz	TAILQ_HEAD(, auth)		ag_auths;
87263720Strasz	TAILQ_HEAD(, auth_name)		ag_names;
88263720Strasz	TAILQ_HEAD(, auth_portal)	ag_portals;
89255570Strasz};
90255570Strasz
91255570Straszstruct portal {
92255570Strasz	TAILQ_ENTRY(portal)		p_next;
93255570Strasz	struct portal_group		*p_portal_group;
94255570Strasz	bool				p_iser;
95255570Strasz	char				*p_listen;
96255570Strasz	struct addrinfo			*p_ai;
97265509Strasz#ifdef ICL_KERNEL_PROXY
98265509Strasz	int				p_id;
99265509Strasz#endif
100255570Strasz
101255570Strasz	TAILQ_HEAD(, target)		p_targets;
102255570Strasz	int				p_socket;
103255570Strasz};
104255570Strasz
105255570Straszstruct portal_group {
106255570Strasz	TAILQ_ENTRY(portal_group)	pg_next;
107255570Strasz	struct conf			*pg_conf;
108255570Strasz	char				*pg_name;
109255570Strasz	struct auth_group		*pg_discovery_auth_group;
110255570Strasz	bool				pg_unassigned;
111255570Strasz	TAILQ_HEAD(, portal)		pg_portals;
112255570Strasz
113255570Strasz	uint16_t			pg_tag;
114255570Strasz};
115255570Strasz
116255570Straszstruct lun_option {
117255570Strasz	TAILQ_ENTRY(lun_option)		lo_next;
118255570Strasz	struct lun			*lo_lun;
119255570Strasz	char				*lo_name;
120255570Strasz	char				*lo_value;
121255570Strasz};
122255570Strasz
123255570Straszstruct lun {
124255570Strasz	TAILQ_ENTRY(lun)		l_next;
125255570Strasz	TAILQ_HEAD(, lun_option)	l_options;
126255570Strasz	struct target			*l_target;
127255570Strasz	int				l_lun;
128255570Strasz	char				*l_backend;
129255570Strasz	int				l_blocksize;
130255570Strasz	char				*l_device_id;
131255570Strasz	char				*l_path;
132255570Strasz	char				*l_serial;
133255570Strasz	int64_t				l_size;
134255570Strasz
135255570Strasz	int				l_ctl_lun;
136255570Strasz};
137255570Strasz
138255570Straszstruct target {
139255570Strasz	TAILQ_ENTRY(target)		t_next;
140255570Strasz	TAILQ_HEAD(, lun)		t_luns;
141255570Strasz	struct conf			*t_conf;
142255570Strasz	struct auth_group		*t_auth_group;
143255570Strasz	struct portal_group		*t_portal_group;
144263723Strasz	char				*t_name;
145255570Strasz	char				*t_alias;
146255570Strasz};
147255570Strasz
148255570Straszstruct conf {
149255570Strasz	char				*conf_pidfile_path;
150255570Strasz	TAILQ_HEAD(, target)		conf_targets;
151255570Strasz	TAILQ_HEAD(, auth_group)	conf_auth_groups;
152255570Strasz	TAILQ_HEAD(, portal_group)	conf_portal_groups;
153255570Strasz	int				conf_debug;
154255570Strasz	int				conf_timeout;
155255570Strasz	int				conf_maxproc;
156255570Strasz
157255570Strasz	uint16_t			conf_last_portal_group_tag;
158265509Strasz#ifdef ICL_KERNEL_PROXY
159265509Strasz	int				conf_portal_id;
160265509Strasz#endif
161255570Strasz	struct pidfh			*conf_pidfh;
162263725Strasz
163263725Strasz	bool				conf_default_pg_defined;
164263725Strasz	bool				conf_default_ag_defined;
165265511Strasz	bool				conf_kernel_port_on;
166255570Strasz};
167255570Strasz
168255570Strasz#define	CONN_SESSION_TYPE_NONE		0
169255570Strasz#define	CONN_SESSION_TYPE_DISCOVERY	1
170255570Strasz#define	CONN_SESSION_TYPE_NORMAL	2
171255570Strasz
172255570Strasz#define	CONN_DIGEST_NONE		0
173255570Strasz#define	CONN_DIGEST_CRC32C		1
174255570Strasz
175255570Straszstruct connection {
176255570Strasz	struct portal		*conn_portal;
177255570Strasz	struct target		*conn_target;
178255570Strasz	int			conn_socket;
179255570Strasz	int			conn_session_type;
180255570Strasz	char			*conn_initiator_name;
181255570Strasz	char			*conn_initiator_addr;
182255570Strasz	char			*conn_initiator_alias;
183268684Smav	uint8_t			conn_initiator_isid[6];
184270137Smav	struct sockaddr_storage	conn_initiator_sa;
185255570Strasz	uint32_t		conn_cmdsn;
186255570Strasz	uint32_t		conn_statsn;
187255570Strasz	size_t			conn_max_data_segment_length;
188255570Strasz	size_t			conn_max_burst_length;
189255570Strasz	int			conn_immediate_data;
190255570Strasz	int			conn_header_digest;
191255570Strasz	int			conn_data_digest;
192255570Strasz};
193255570Strasz
194255570Straszstruct pdu {
195255570Strasz	struct connection	*pdu_connection;
196255570Strasz	struct iscsi_bhs	*pdu_bhs;
197255570Strasz	char			*pdu_data;
198255570Strasz	size_t			pdu_data_len;
199255570Strasz};
200255570Strasz
201255570Strasz#define	KEYS_MAX	1024
202255570Strasz
203255570Straszstruct keys {
204255570Strasz	char		*keys_names[KEYS_MAX];
205255570Strasz	char		*keys_values[KEYS_MAX];
206255570Strasz	char		*keys_data;
207255570Strasz	size_t		keys_data_len;
208255570Strasz};
209255570Strasz
210255570Straszstruct conf		*conf_new(void);
211255570Straszstruct conf		*conf_new_from_file(const char *path);
212255570Straszstruct conf		*conf_new_from_kernel(void);
213255570Straszvoid			conf_delete(struct conf *conf);
214255570Straszint			conf_verify(struct conf *conf);
215255570Strasz
216255570Straszstruct auth_group	*auth_group_new(struct conf *conf, const char *name);
217255570Straszvoid			auth_group_delete(struct auth_group *ag);
218265514Straszstruct auth_group	*auth_group_find(const struct conf *conf,
219265514Strasz			    const char *name);
220263724Straszint			auth_group_set_type_str(struct auth_group *ag,
221263724Strasz			    const char *type);
222255570Strasz
223255570Straszconst struct auth	*auth_new_chap(struct auth_group *ag,
224255570Strasz			    const char *user, const char *secret);
225255570Straszconst struct auth	*auth_new_chap_mutual(struct auth_group *ag,
226255570Strasz			    const char *user, const char *secret,
227255570Strasz			    const char *user2, const char *secret2);
228265514Straszconst struct auth	*auth_find(const struct auth_group *ag,
229255570Strasz			    const char *user);
230255570Strasz
231263720Straszconst struct auth_name	*auth_name_new(struct auth_group *ag,
232263720Strasz			    const char *initiator_name);
233263720Straszbool			auth_name_defined(const struct auth_group *ag);
234263720Straszconst struct auth_name	*auth_name_find(const struct auth_group *ag,
235263720Strasz			    const char *initiator_name);
236263720Strasz
237263720Straszconst struct auth_portal	*auth_portal_new(struct auth_group *ag,
238263720Strasz				    const char *initiator_portal);
239263720Straszbool			auth_portal_defined(const struct auth_group *ag);
240263720Straszconst struct auth_portal	*auth_portal_find(const struct auth_group *ag,
241270137Smav				    const struct sockaddr_storage *sa);
242263720Strasz
243255570Straszstruct portal_group	*portal_group_new(struct conf *conf, const char *name);
244255570Straszvoid			portal_group_delete(struct portal_group *pg);
245265514Straszstruct portal_group	*portal_group_find(const struct conf *conf,
246265514Strasz			    const char *name);
247255570Straszint			portal_group_add_listen(struct portal_group *pg,
248255570Strasz			    const char *listen, bool iser);
249255570Strasz
250263723Straszstruct target		*target_new(struct conf *conf, const char *name);
251255570Straszvoid			target_delete(struct target *target);
252255570Straszstruct target		*target_find(struct conf *conf,
253263723Strasz			    const char *name);
254255570Strasz
255255570Straszstruct lun		*lun_new(struct target *target, int lun_id);
256255570Straszvoid			lun_delete(struct lun *lun);
257265514Straszstruct lun		*lun_find(const struct target *target, int lun_id);
258255570Straszvoid			lun_set_backend(struct lun *lun, const char *value);
259255570Straszvoid			lun_set_blocksize(struct lun *lun, size_t value);
260255570Straszvoid			lun_set_device_id(struct lun *lun, const char *value);
261255570Straszvoid			lun_set_path(struct lun *lun, const char *value);
262255570Straszvoid			lun_set_serial(struct lun *lun, const char *value);
263255570Straszvoid			lun_set_size(struct lun *lun, size_t value);
264255570Straszvoid			lun_set_ctl_lun(struct lun *lun, uint32_t value);
265255570Strasz
266255570Straszstruct lun_option	*lun_option_new(struct lun *lun,
267255570Strasz			    const char *name, const char *value);
268255570Straszvoid			lun_option_delete(struct lun_option *clo);
269265514Straszstruct lun_option	*lun_option_find(const struct lun *lun,
270265514Strasz			    const char *name);
271255570Straszvoid			lun_option_set(struct lun_option *clo,
272255570Strasz			    const char *value);
273255570Strasz
274255570Straszvoid			kernel_init(void);
275255570Straszint			kernel_lun_add(struct lun *lun);
276255570Straszint			kernel_lun_resize(struct lun *lun);
277255570Straszint			kernel_lun_remove(struct lun *lun);
278255570Straszvoid			kernel_handoff(struct connection *conn);
279268682Smavint			kernel_port_add(struct target *targ);
280268682Smavint			kernel_port_remove(struct target *targ);
281255570Straszvoid			kernel_capsicate(void);
282255570Strasz
283265513Strasz#ifdef ICL_KERNEL_PROXY
284265509Straszvoid			kernel_listen(struct addrinfo *ai, bool iser,
285265509Strasz			    int portal_id);
286265513Straszvoid			kernel_accept(int *connection_id, int *portal_id,
287265513Strasz			    struct sockaddr *client_sa,
288265513Strasz			    socklen_t *client_salen);
289255570Straszvoid			kernel_send(struct pdu *pdu);
290255570Straszvoid			kernel_receive(struct pdu *pdu);
291265513Strasz#endif
292255570Strasz
293255570Straszstruct keys		*keys_new(void);
294255570Straszvoid			keys_delete(struct keys *keys);
295255570Straszvoid			keys_load(struct keys *keys, const struct pdu *pdu);
296255570Straszvoid			keys_save(struct keys *keys, struct pdu *pdu);
297255570Straszconst char		*keys_find(struct keys *keys, const char *name);
298255570Straszint			keys_find_int(struct keys *keys, const char *name);
299255570Straszvoid			keys_add(struct keys *keys,
300255570Strasz			    const char *name, const char *value);
301255570Straszvoid			keys_add_int(struct keys *keys,
302255570Strasz			    const char *name, int value);
303255570Strasz
304255570Straszstruct pdu		*pdu_new(struct connection *conn);
305255570Straszstruct pdu		*pdu_new_response(struct pdu *request);
306255570Straszvoid			pdu_delete(struct pdu *pdu);
307255570Straszvoid			pdu_receive(struct pdu *request);
308255570Straszvoid			pdu_send(struct pdu *response);
309255570Strasz
310255570Straszvoid			login(struct connection *conn);
311255570Strasz
312255570Straszvoid			discovery(struct connection *conn);
313255570Strasz
314255570Straszvoid			log_init(int level);
315255570Straszvoid			log_set_peer_name(const char *name);
316255570Straszvoid			log_set_peer_addr(const char *addr);
317255570Straszvoid			log_err(int, const char *, ...)
318263732Strasz			    __dead2 __printflike(2, 3);
319255570Straszvoid			log_errx(int, const char *, ...)
320263732Strasz			    __dead2 __printflike(2, 3);
321263732Straszvoid			log_warn(const char *, ...) __printflike(1, 2);
322255570Straszvoid			log_warnx(const char *, ...) __printflike(1, 2);
323263732Straszvoid			log_debugx(const char *, ...) __printflike(1, 2);
324255570Strasz
325255570Straszchar			*checked_strdup(const char *);
326255570Straszbool			valid_iscsi_name(const char *name);
327255570Straszbool			timed_out(void);
328255570Strasz
329255570Strasz#endif /* !CTLD_H */
330