Various sysfs related fixes
[mirror/scst/.git] / iscsi-scst / usr / iscsid.h
1 /*
2  *  Copyright (C) 2002 - 2003 Ardis Technolgies <roman@ardistech.com>
3  *  Copyright (C) 2007 - 2009 Vladislav Bolkhovitin
4  *  Copyright (C) 2007 - 2009 ID7 Ltd.
5  *
6  *  This program is free software; you can redistribute it and/or
7  *  modify it under the terms of the GNU General Public License
8  *  as published by the Free Software Foundation, version 2
9  *  of the License.
10  *
11  *  This program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  *  GNU General Public License for more details.
15  */
16
17 #ifndef ISCSID_H
18 #define ISCSID_H
19
20 #include <search.h>
21 #include <sys/types.h>
22 #include <assert.h>
23
24 #include "types.h"
25 #include "iscsi_hdr.h"
26 #include "iscsi_scst.h"
27 #include "param.h"
28 #include "misc.h"
29
30 #define sBUG() assert(0)
31 #define sBUG_ON(p) assert(!(p))
32
33 struct buf_segment {
34         struct __qelem entry;
35
36         unsigned int len;
37         char data[0];
38 };
39
40 struct PDU {
41         struct iscsi_hdr bhs;
42         void *ahs;
43         unsigned int ahssize;
44         void *data;
45         unsigned int datasize;
46 };
47
48 #define KEY_STATE_START         0
49 #define KEY_STATE_REQUEST       1
50 #define KEY_STATE_DONE_ADDED    2
51 #define KEY_STATE_DONE          3
52
53 struct session {
54         struct __qelem slist;
55
56         char *initiator;
57         struct target *target;
58         union iscsi_sid sid;
59
60         struct __qelem conn_list;
61 };
62
63 struct connection {
64         int state;
65         int iostate;
66         int fd;
67
68         struct session *sess;
69
70         u32 tid;
71         struct iscsi_param session_param[session_key_last];
72
73         char *initiator;
74         char *user;
75         union iscsi_sid sid;
76         u16 cid;
77
78         int session_type;
79         int auth_method;
80
81         u32 stat_sn;
82         u32 exp_stat_sn;
83
84         u32 cmd_sn;
85         u32 exp_cmd_sn;
86         u32 ttt;
87
88         struct PDU req;
89         void *req_buffer;
90         struct PDU rsp;
91         struct __qelem rsp_buf_list;
92         unsigned char *buffer;
93         int rwsize;
94
95         int auth_state;
96         union {
97                 struct {
98                         int digest_alg;
99                         int id;
100                         int challenge_size;
101                         unsigned char *challenge;
102                 } chap;
103         } auth;
104
105         struct __qelem clist;
106 };
107
108 #define IOSTATE_FREE            0
109 #define IOSTATE_READ_BHS        1
110 #define IOSTATE_READ_AHS_DATA   2
111 #define IOSTATE_WRITE_BHS       3
112 #define IOSTATE_WRITE_AHS       4
113 #define IOSTATE_WRITE_DATA      5
114
115 #define STATE_FREE              0
116 #define STATE_SECURITY          1
117 #define STATE_SECURITY_AUTH     2
118 #define STATE_SECURITY_DONE     3
119 #define STATE_SECURITY_LOGIN    4
120 #define STATE_SECURITY_FULL     5
121 #define STATE_LOGIN             6
122 #define STATE_LOGIN_FULL        7
123 #define STATE_FULL              8
124 #define STATE_KERNEL            9
125 #define STATE_CLOSE             10
126 #define STATE_EXIT              11
127
128 #define AUTH_STATE_START        0
129 #define AUTH_STATE_CHALLENGE    1
130
131 /* don't touch these */
132 #define AUTH_DIR_INCOMING       0
133 #define AUTH_DIR_OUTGOING       1
134
135 #define SESSION_NORMAL          0
136 #define SESSION_DISCOVERY       1
137 #define AUTH_UNKNOWN            -1
138 #define AUTH_NONE               0
139 #define AUTH_CHAP               1
140 #define DIGEST_UNKNOWN          -1
141
142 #define BHS_SIZE                48
143
144 /*
145  * Must be 8192, since it used as MaxRecvDataSegmentLength during Login phase,
146  * because iSCSI RFC requires: "The default MaxRecvDataSegmentLength is used
147  * during Login".
148  */
149 #define INCOMING_BUFSIZE        8192
150
151 struct target {
152         struct __qelem tlist;
153
154         struct __qelem sessions_list;
155
156         u32 tid;
157         char name[ISCSI_NAME_LEN];
158         char *alias;
159
160         struct __qelem isns_head;
161 };
162
163 extern int ctrl_fd;
164 extern int conn_blocked;
165
166 /* chap.c */
167 extern int cmnd_exec_auth_chap(struct connection *conn);
168
169 /* conn.c */
170 extern struct connection *conn_alloc(void);
171 extern void conn_free(struct connection *conn);
172 extern void conn_pass_to_kern(struct connection *conn, int fd);
173 extern void conn_read_pdu(struct connection *conn);
174 extern void conn_write_pdu(struct connection *conn);
175 extern void conn_free_pdu(struct connection *conn);
176 extern void conn_free_rsp_buf_list(struct connection *conn);
177
178 /* iscsi_scstd.c */
179 extern uint16_t server_port;
180 extern void isns_set_fd(int isns, int scn_listen, int scn);
181 extern void wait_4_iscsi_event(int timeout);
182
183 /* iscsid.c */
184 extern int iscsi_debug;
185
186 extern int cmnd_execute(struct connection *conn);
187 extern void cmnd_finish(struct connection *conn);
188 extern char *text_key_find(struct connection *conn, char *searchKey);
189 extern void text_key_add(struct connection *conn, char *key, char *value);
190
191 /* log.c */
192 extern int log_daemon;
193 extern int log_level;
194
195 extern void log_init(void);
196 extern void __log_info(const char *func, int line, const char *fmt, ...)
197         __attribute__ ((format (printf, 3, 4)));
198 extern void __log_warning(const char *func, int line, const char *fmt, ...)
199         __attribute__ ((format (printf, 3, 4)));
200 extern void __log_error(const char *func, int line, const char *fmt, ...)
201         __attribute__ ((format (printf, 3, 4)));
202 extern void __log_debug(const char *func, int line, int level, const char *fmt, ...)
203         __attribute__ ((format (printf, 4, 5)));
204 extern void __log_pdu(const char *func, int line, int level, struct PDU *pdu);
205
206 #define log_info(args...)       __log_info(__func__, __LINE__, ## args)
207 #define log_warning(args...)    __log_warning(__func__, __LINE__, ## args)
208 #define log_error(args...)      __log_error(__func__, __LINE__, ## args)
209 #define log_debug(args...)      __log_debug(__func__, __LINE__, ## args)
210 #define log_pdu(args...)        __log_pdu(__func__, __LINE__, ## args)
211
212 /* session.c */
213 extern struct session *session_find_name(u32 tid, const char *iname, union iscsi_sid sid);
214 extern struct session *session_find_id(u32 tid, u64 sid);
215 extern int session_create(struct connection *conn);
216 extern void session_free(struct session *session);
217 extern struct connection *conn_find(struct session *session, u16 cid);
218
219 /* target.c */
220 extern struct __qelem targets_list;
221 extern int target_add(u32 *, char *);
222 extern int target_del(u32);
223 extern u32 target_find_id_by_name(const char *name);
224 extern struct target *target_find_by_name(const char *name);
225 struct target *target_find_by_id(u32);
226 extern void target_list_build(struct connection *, char *, char *);
227
228 /* message.c */
229 extern int iscsi_adm_request_listen(void);
230 extern int iscsi_adm_request_handle(int accept_fd);
231
232 /* ctldev.c */
233 extern int kernel_open(int *max_data_seg_len);
234 extern int kernel_param_get(u32 tid, u64 sid, int type, struct iscsi_param *param);
235 extern int kernel_param_set(u32 tid, u64 sid, int type, u32 partial,
236         struct iscsi_param *param);
237 extern int kernel_target_create(u32 *tid, char *name);
238 extern int kernel_target_destroy(u32 tid);
239 extern int kernel_session_create(u32 tid, u64 sid, u32 exp_cmd_sn,
240         char *name, char *user);
241 extern int kernel_session_destroy(u32 tid, u64 sid);
242 extern int kernel_conn_create(u32 tid, u64 sid, u32 cid, u32 stat_sn, u32 exp_stat_sn,
243         int fd);
244 extern int kernel_conn_destroy(u32 tid, u64 sid, u32 cid);      
245
246 /* event.c */
247 extern void handle_iscsi_events(int fd);
248 extern int nl_open(void);
249
250 /* param.c */
251 extern int param_index_by_name(char *name, struct iscsi_key *keys);
252
253 /* config.c */
254 extern int config_isns_load(char *params, char **isns, int *isns_ac);
255 extern int config_load(char *params);
256 extern int config_target_create(u32 *tid, char *name);
257 extern int config_target_destroy(u32 tid);
258 int config_account_add(u32 tid, int dir, char *name, char *pass);
259 extern int config_account_query(u32 tid, int dir, char *name, char *pass);
260 extern int config_account_list(u32 tid, int dir, u32 *cnt, u32 *overflow,
261         char *buf, size_t buf_sz);
262 extern int config_account_del(u32 tid, int dir, char *name);
263 extern int config_param_set(u32 tid, u64 sid, int type, u32 partial,
264         struct iscsi_param *param);
265 extern int config_initiator_access(u32 tid, int fd);
266
267 /* isns.c */
268 extern int isns_init(char *addr, int isns_ac);
269 extern int isns_handle(int is_timeout, int *timeout);
270 extern int isns_scn_handle(int accept);
271 extern int isns_scn_access(u32 tid, int fd, char *name);
272 extern int isns_target_register(char *name);
273 extern int isns_target_deregister(char *name);
274 extern void isns_exit(void);
275
276 #endif  /* ISCSID_H */