Annotation of embedaddon/istgt/src/istgt.h, revision 1.1.1.1
1.1 misho 1: /*
2: * Copyright (C) 2008-2011 Daisuke Aoyama <aoyama@peach.ne.jp>.
3: * All rights reserved.
4: *
5: * Redistribution and use in source and binary forms, with or without
6: * modification, are permitted provided that the following conditions
7: * are met:
8: * 1. Redistributions of source code must retain the above copyright
9: * notice, this list of conditions and the following disclaimer.
10: * 2. Redistributions in binary form must reproduce the above copyright
11: * notice, this list of conditions and the following disclaimer in the
12: * documentation and/or other materials provided with the distribution.
13: *
14: * THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17: * ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
18: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24: * SUCH DAMAGE.
25: *
26: */
27:
28: #ifndef ISTGT_H
29: #define ISTGT_H
30:
31: #ifdef HAVE_CONFIG_H
32: #include "config.h"
33: #endif
34:
35: #ifdef USE_ATOMIC
36: #ifdef HAVE_SYS_TYPES_H
37: #include <sys/types.h>
38: #endif
39: #ifdef HAVE_MACHINE_ATOMIC_H
40: #include <machine/atomic.h>
41: #endif
42: #ifdef HAVE_SYS_ATOMIC_H
43: #include <sys/atomic.h>
44: #endif
45: #endif /* USE_ATOMIC */
46:
47: #include "build.h"
48:
49: #include <pthread.h>
50: #include <signal.h>
51: #include "istgt_log.h"
52: #include "istgt_conf.h"
53:
54: #define MAX_TMPBUF 1024
55: #define MAX_ADDRBUF 64
56: #define MAX_INITIATOR_ADDR (MAX_ADDRBUF)
57: #define MAX_INITIATOR_NAME 256
58: #define MAX_TARGET_ADDR (MAX_ADDRBUF)
59: #define MAX_TARGET_NAME 256
60: #define MAX_ISCSI_NAME 256
61:
62: #define MAX_UCPORTAL 16
63: #define MAX_PORTAL 1024
64: #define MAX_INITIATOR 256
65: #define MAX_NETMASK 256
66: #define MAX_INITIATOR_GROUP 4096
67: #define MAX_LOGICAL_UNIT 4096
68: #define MAX_R2T 256
69:
70: #define DEFAULT_CONFIG BUILD_ETC_ISTGT "/istgt.conf"
71: #define DEFAULT_PIDFILE "/var/run/istgt.pid"
72: #define DEFAULT_AUTHFILE BUILD_ETC_ISTGT "/auth.conf"
73: #if 0
74: #define DEFAULT_MEDIAFILE BUILD_ETC_ISTGT "/media.conf"
75: #define DEFAULT_LIVEFILE BUILD_ETC_ISTGT "/istgt.live"
76: #endif
77: #define DEFAULT_MEDIADIRECTORY BUILD_VAR_ISTGT
78: #define DEFAULT_NODEBASE "iqn.2007-09.jp.ne.peach.istgt"
79: #define DEFAULT_PORT 3260
80: #define DEFAULT_MAX_SESSIONS 16
81: #define DEFAULT_MAX_CONNECTIONS 4
82: #define DEFAULT_MAXOUTSTANDINGR2T 16
83: #define DEFAULT_DEFAULTTIME2WAIT 2
84: #define DEFAULT_DEFAULTTIME2RETAIN 20
85: #define DEFAULT_FIRSTBURSTLENGTH 65536
86: #define DEFAULT_MAXBURSTLENGTH 262144
87: #define DEFAULT_MAXRECVDATASEGMENTLENGTH 8192
88: #define DEFAULT_INITIALR2T 1
89: #define DEFAULT_IMMEDIATEDATA 1
90: #define DEFAULT_DATAPDUINORDER 1
91: #define DEFAULT_DATASEQUENCEINORDER 1
92: #define DEFAULT_ERRORRECOVERYLEVEL 0
93: #define DEFAULT_TIMEOUT 30
94: #define DEFAULT_NOPININTERVAL 20
95: #define DEFAULT_MAXR2T 16
96:
97: #define ISTGT_PG_TAG_MAX 0x0000ffffU
98: #define ISTGT_LU_TAG_MAX 0x0000ffffU
99: #define ISTGT_UC_TAG 0x00010000U
100: #define ISTGT_IOBUFSIZE (2 * 1024 * 1024)
101: #define ISTGT_SNSBUFSIZE 4096
102: #define ISTGT_SHORTDATASIZE 8192
103: #define ISTGT_SHORTPDUSIZE (48+4+ISTGT_SHORTDATASIZE+4)
104: #define ISTGT_CONDWAIT (50 * 1000) /* ms */
105: #define ISTGT_CONDWAIT_MIN (5 * 1000) /* ms */
106: #define ISTGT_STACKSIZE (2 * 1024 * 1024)
107:
108: #if defined (SIGRTMIN)
109: #define ISTGT_SIGWAKEUP (SIGRTMIN + 1)
110: #define ISTGT_USE_SIGRT
111: #elif defined (SIGIO)
112: #define ISTGT_SIGWAKEUP (SIGIO)
113: #else
114: #error "no signal for internal"
115: #endif
116: #if defined (__FreeBSD__) || defined (__NetBSD__) || defined (__OpenBSD__)
117: #define ISTGT_USE_KQUEUE
118: #endif
119:
120: #define MTX_LOCK(MTX) \
121: do { \
122: if (pthread_mutex_lock((MTX)) != 0) { \
123: ISTGT_ERRLOG("lock error\n"); \
124: pthread_exit(NULL); \
125: } \
126: } while (0)
127: #define MTX_UNLOCK(MTX) \
128: do { \
129: if (pthread_mutex_unlock((MTX)) != 0) { \
130: ISTGT_ERRLOG("unlock error\n"); \
131: pthread_exit(NULL); \
132: } \
133: } while (0)
134: #define SPIN_LOCK(SPIN) \
135: do { \
136: if (pthread_spin_lock((SPIN)) != 0) { \
137: ISTGT_ERRLOG("lock error\n"); \
138: pthread_exit(NULL); \
139: } \
140: } while (0)
141: #define SPIN_UNLOCK(SPIN) \
142: do { \
143: if (pthread_spin_unlock((SPIN)) != 0) { \
144: ISTGT_ERRLOG("unlock error\n"); \
145: pthread_exit(NULL); \
146: } \
147: } while (0)
148:
149: typedef struct istgt_portal_t {
150: char *label;
151: char *host;
152: char *port;
153: int idx;
154: int tag;
155: int sock;
156: } PORTAL;
157: typedef PORTAL *PORTAL_Ptr;
158:
159: typedef struct istgt_initiator_group_t {
160: int ninitiators;
161: char **initiators;
162: int nnetmasks;
163: char **netmasks;
164: int idx;
165: int tag;
166: } INITIATOR_GROUP;
167: typedef INITIATOR_GROUP *INITIATOR_GROUP_Ptr;
168:
169: typedef enum {
170: ISTGT_STATE_INVALID = 0,
171: ISTGT_STATE_INITIALIZED = 1,
172: ISTGT_STATE_RUNNING = 2,
173: ISTGT_STATE_EXITING = 3,
174: ISTGT_STATE_SHUTDOWN = 4,
175: } ISTGT_STATE;
176:
177: #define DEFAULT_ISTGT_SWMODE ISTGT_SWMODE_NORMAL
178: typedef enum {
179: ISTGT_SWMODE_TRADITIONAL = 0,
180: ISTGT_SWMODE_NORMAL = 1,
181: ISTGT_SWMODE_EXPERIMENTAL = 2,
182: } ISTGT_SWMODE;
183:
184: typedef struct istgt_t {
185: CONFIG *config;
186: char *pidfile;
187: char *authfile;
188: #if 0
189: char *mediafile;
190: char *livefile;
191: #endif
192: char *mediadirectory;
193: char *nodebase;
194:
195: pthread_attr_t attr;
196: pthread_mutex_t mutex;
197:
198: ISTGT_STATE state;
199: ISTGT_SWMODE swmode;
200:
201: int nuctl_portal;
202: PORTAL uctl_portal[MAX_UCPORTAL];
203: int nuctl_netmasks;
204: char **uctl_netmasks;
205:
206: int nportal;
207: PORTAL portal[MAX_PORTAL];
208: int ninitiator_group;
209: INITIATOR_GROUP initiator_group[MAX_INITIATOR_GROUP];
210: int nlogical_unit;
211: struct istgt_lu_t *logical_unit[MAX_LOGICAL_UNIT];
212:
213: int timeout;
214: int nopininterval;
215: int maxr2t;
216: int no_discovery_auth;
217: int req_discovery_auth;
218: int req_discovery_auth_mutual;
219: int discovery_auth_group;
220: int no_uctl_auth;
221: int req_uctl_auth;
222: int req_uctl_auth_mutual;
223: int uctl_auth_group;
224:
225: int MaxSessions;
226: int MaxConnections;
227: int MaxOutstandingR2T;
228: int DefaultTime2Wait;
229: int DefaultTime2Retain;
230: int FirstBurstLength;
231: int MaxBurstLength;
232: int MaxRecvDataSegmentLength;
233: int InitialR2T;
234: int ImmediateData;
235: int DataPDUInOrder;
236: int DataSequenceInOrder;
237: int ErrorRecoveryLevel;
238: } ISTGT;
239: typedef ISTGT *ISTGT_Ptr;
240:
241: char *istgt_get_nmval(CF_SECTION *sp, const char *key, int idx1, int idx2);
242: char *istgt_get_nval(CF_SECTION *sp, const char *key, int idx);
243: char *istgt_get_val(CF_SECTION *sp, const char *key);
244: int istgt_get_nintval(CF_SECTION *sp, const char *key, int idx);
245: int istgt_get_intval(CF_SECTION *sp, const char *key);
246:
247: #ifdef USE_ATOMIC
248: static inline int
249: istgt_get_state(ISTGT_Ptr istgt)
250: {
251: ISTGT_STATE state;
252: #if defined HAVE_ATOMIC_LOAD_ACQ_INT
253: state = atomic_load_acq_int((unsigned int *)&istgt->state);
254: #elif defined HAVE_ATOMIC_OR_UINT_NV
255: state = (int)atomic_or_uint_nv((unsigned int *)&istgt->state, 0);
256: #else
257: #error "no atomic operation"
258: #endif
259: return state;
260: }
261: static inline void
262: istgt_set_state(ISTGT_Ptr istgt, ISTGT_STATE state)
263: {
264: #if defined HAVE_ATOMIC_STORE_REL_INT
265: atomic_store_rel_int((unsigned int *)&istgt->state, state);
266: #elif defined HAVE_ATOMIC_SWAP_UINT
267: (void)atomic_swap_uint((unsigned int *)&istgt->state, state);
268: #if defined HAVE_MEMBAR_PRODUCER
269: membar_producer();
270: #endif
271: #else
272: #error "no atomic operation"
273: #endif
274: }
275: #else
276: static inline int
277: istgt_get_state(ISTGT_Ptr istgt)
278: {
279: ISTGT_STATE state;
280: MTX_LOCK(&istgt->mutex);
281: state = istgt->state;
282: MTX_UNLOCK(&istgt->mutex);
283: return state;
284: }
285:
286: static inline void
287: istgt_set_state(ISTGT_Ptr istgt, ISTGT_STATE state)
288: {
289: MTX_LOCK(&istgt->mutex);
290: istgt->state = state;
291: MTX_UNLOCK(&istgt->mutex);
292: }
293: #endif /* USE_ATOMIC */
294:
295: #endif /* ISTGT_H */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>