Annotation of embedaddon/istgt/src/istgt.h, revision 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>