/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _ISNS_SERVER_H
#define _ISNS_SERVER_H
#ifdef __cplusplus
extern "C" {
#endif
#include <assert.h>
#include <sys/param.h>
#include <isns_protocol.h>
#ifdef DEBUG
#define ASSERT(EXP) assert(EXP)
#else
#define ASSERT(EXP)
#endif
#define ISNS_RSP_MASK (0x8000)
/*
* definitions for SMF.
*/
#define ISNS_SERVER_SVC_NAME "network/isns_server"
#define ISNS_SERVER_CONFIG "config"
#define CONFIG_DATA_STORE "data_store_location"
#define CONFIG_ESI_THRESHOLD "ESI_retry_threshold_count"
#define CONFIG_MGMT_SCN "Management_SCN_Enabled"
#define CONFIG_CONTROL_NODES "Authorized_Control_Nodes"
#ifdef DEBUG
#define OPT_DAEMONLIZE "daemonlize"
#endif
#define ISNS_DAEMON_SYSLOG_PP "isns"
#define FIRST_TAG_ENTITY ISNS_EID_ATTR_ID
#define FIRST_TAG_ISCSI ISNS_ISCSI_NAME_ATTR_ID
#define FIRST_TAG_PORTAL ISNS_PORTAL_IP_ADDR_ATTR_ID
#define FIRST_TAG_PG ISNS_PG_ISCSI_NAME_ATTR_ID
#define FIRST_TAG_DD ISNS_DD_ID_ATTR_ID
#define FIRST_TAG_DDS ISNS_DD_SET_ID_ATTR_ID
#define FIRST_TAG_ASSOC_ISCSI ISNS_DD_ISCSI_INDEX_ATTR_ID
#define FIRST_TAG_ASSOC_DD ISNS_DD_ID_ATTR_ID
#define LAST_TAG_ENTITY ISNS_ENTITY_INDEX_ATTR_ID
#define LAST_TAG_ISCSI ISNS_ISCSI_AUTH_METHOD_ATTR_ID
#define LAST_TAG_PORTAL ISNS_SCN_PORT_ATTR_ID
#define LAST_TAG_PG ISNS_PG_INDEX_ATTR_ID
#define LAST_TAG_DD ISNS_DD_FEATURES_ATTR_ID
#define LAST_TAG_DDS ISNS_DD_SET_STATUS_ATTR_ID
#define LAST_TAG_ASSOC_ISCSI ISNS_DD_ISCSI_NAME_ATTR_ID
#define LAST_TAG_ASSOC_DD ISNS_DD_ID_ATTR_ID
#define NUM_OF_ENTITY_ATTRS \
(LAST_TAG_ENTITY - FIRST_TAG_ENTITY + 1)
#define NUM_OF_ISCSI_ATTRS \
(LAST_TAG_ISCSI - FIRST_TAG_ISCSI + 1)
#define NUM_OF_PORTAL_ATTRS \
(LAST_TAG_PORTAL - FIRST_TAG_PORTAL + 1)
#define NUM_OF_PG_ATTRS \
(LAST_TAG_PG - FIRST_TAG_PG + 1)
#define NUM_OF_DD_ATTRS \
(LAST_TAG_DD - FIRST_TAG_DD + 1)
#define NUM_OF_DDS_ATTRS \
(LAST_TAG_DDS - FIRST_TAG_DDS + 1)
#define NUM_OF_ASSOC_ISCSI_ATTRS \
(LAST_TAG_ASSOC_ISCSI - FIRST_TAG_ASSOC_ISCSI + 1)
#define NUM_OF_ASSOC_DD_ATTRS \
(LAST_TAG_ASSOC_DD - FIRST_TAG_ASSOC_DD + 1)
#define ATTR_INDEX_ENTITY(TAG) ((TAG) - FIRST_TAG_ENTITY)
#define ATTR_INDEX_ISCSI(TAG) ((TAG) - FIRST_TAG_ISCSI)
#define ATTR_INDEX_PORTAL(TAG) ((TAG) - FIRST_TAG_PORTAL)
#define ATTR_INDEX_PG(TAG) ((TAG) - FIRST_TAG_PG)
#define ATTR_INDEX_DD(TAG) ((TAG) - FIRST_TAG_DD)
#define ATTR_INDEX_DDS(TAG) ((TAG) - FIRST_TAG_DDS)
#define ATTR_INDEX_ASSOC_ISCSI(TAG) ((TAG) - FIRST_TAG_ASSOC_ISCSI)
#define ATTR_INDEX_ASSOC_DD(TAG) ((TAG) - FIRST_TAG_ASSOC_DD)
#define ATTR_INDEX(TAG, TYPE) ((TAG) - TAG_RANGE[TYPE][0])
#define ISCSI_ATTR(ISCSI, TAG) ((ISCSI)->attrs[ATTR_INDEX_ISCSI(TAG)].value)
/*
* isns object type.
*/
typedef enum isns_otype {
/*
* iSNS objects as they are defined in RFC 4171.
*/
OBJ_ENTITY = 0x1,
OBJ_ISCSI,
OBJ_PORTAL,
OBJ_PG,
OBJ_DD,
OBJ_DDS,
MAX_OBJ_TYPE,
/*
* dummy object types for future extension.
*/
OBJ_DUMMY1,
OBJ_DUMMY2,
OBJ_DUMMY3,
OBJ_DUMMY4,
/*
* madeup object for internal implementation.
*/
OBJ_ASSOC_ISCSI,
OBJ_ASSOC_DD,
MAX_OBJ_TYPE_FOR_SIZE
} isns_type_t;
#define MAX_LOOKUP_CTRL (3)
/*
* lookup operation.
*/
typedef enum {
OP_STRING = 1,
OP_INTEGER,
OP_MEMORY_IP6
} lookup_method_t;
/*
* lookup control data.
*/
typedef struct lookup_ctrl {
isns_type_t type;
uint32_t curr_uid;
uint16_t id[MAX_LOOKUP_CTRL];
uint8_t op[MAX_LOOKUP_CTRL];
union {
uchar_t *ptr;
uint32_t ui;
in6_addr_t *ip;
} data[MAX_LOOKUP_CTRL];
} lookup_ctrl_t;
#define SET_UID_LCP(LCP, TYPE, UID) {\
(LCP)->type = TYPE;\
(LCP)->curr_uid = 0;\
(LCP)->id[0] = UID_ATTR_INDEX[TYPE];\
(LCP)->op[0] = OP_INTEGER;\
(LCP)->data[0].ui = UID;\
(LCP)->op[1] = 0;\
}
#define UPDATE_LCP_UID(LCP, UID) {\
(LCP)->curr_uid = 0;\
(LCP)->id[0] = UID_ATTR_INDEX[(LCP)->type];\
(LCP)->op[0] = OP_INTEGER;\
(LCP)->data[0].ui = UID;\
(LCP)->op[1] = 0;\
}
/*
* isns object attribute
*/
typedef struct isns_attr {
uint32_t tag;
uint32_t len;
union {
int32_t i;
uint32_t ui;
in6_addr_t *ip;
uchar_t *ptr;
time_t timestamp;
} value;
} isns_attr_t;
#define MAX_KEY_ATTRS (3)
/*
* isns generic object.
*/
typedef struct isns_obj {
isns_type_t type;
isns_attr_t attrs[1];
} isns_obj_t;
#define ISCSI_PARENT_TYPE (OBJ_ENTITY)
#define PORTAL_PARENT_TYPE (OBJ_ENTITY)
#define PG_PARENT_TYPE (OBJ_ENTITY)
#define ASSOC_ISCSI_PARENT_TYPE (OBJ_DD)
#define ASSOC_DD_PARENT_TYPE (OBJ_DDS)
/*
* iSNS objects.
*/
typedef struct isns_dds {
isns_type_t type;
isns_attr_t attrs[NUM_OF_DDS_ATTRS];
} isns_dds_t;
typedef struct isns_assoc_dd {
isns_type_t type;
isns_attr_t attrs[NUM_OF_ASSOC_DD_ATTRS];
/* parent object uid */
#ifdef ASSOC_DD_PARENT_TYPE
uint32_t puid;
#endif
} isns_assoc_dd_t;
#define DDS_ENABLED(UI) ((UI) & (ISNS_DDS_STATUS))
#define ENABLE_DDS(DDS) (((DDS)->status) |= (ISNS_DDS_STATUS))
#define DISABLE_DDS(DDS) (((DDS)->status) &= ~(ISNS_DDS_STATUS))
#define DD_BOOTLIST_ENABLED(UI) ((UI) & (ISNS_DD_BOOTLIST))
typedef struct isns_dd {
isns_type_t type;
isns_attr_t attrs[NUM_OF_DD_ATTRS];
} isns_dd_t;
typedef struct isns_assoc_iscsi {
isns_type_t type;
isns_attr_t attrs[NUM_OF_ASSOC_ISCSI_ATTRS];
/* parent object uid */
#ifdef ASSOC_ISCSI_PARENT_TYPE
uint32_t puid;
#endif
} isns_assoc_iscsi_t;
#define MAX_ISCSI_CHILD (0)
#define MAX_PORTAL_CHILD (0)
#define MAX_PG_CHILD (0)
#define MAX_ENTITY_CHILD (2)
#define MAX_CHILD_TYPE (2)
#define PG_REF_COUNT (2)
#define MAX_REF_COUNT (2)
typedef struct isns_iscsi {
isns_type_t type;
isns_attr_t attrs[NUM_OF_ISCSI_ATTRS];
/* parent object uid */
#ifdef ISCSI_PARENT_TYPE
uint32_t puid;
#endif
/* subordinate object uid(s) */
#if defined(MAX_ISCSI_CHILD) && (MAX_ISCSI_CHILD > 0)
uint32_t *cuid[MAX_ISCSI_CHILD];
#endif
} isns_iscsi_t;
#define IS_ISCSI_TARGET(NODE) (((NODE)->type) & ISNS_TARGET_NODE_TYPE)
#define IS_ISCSI_INITIATOR(NODE) (((NODE)->type) & ISNS_INITIATOR_NODE_TYPE)
#define IS_ISCSI_CONTROL(NODE) (((NODE)->type) & ISNS_CONTROL_NODE_TYPE)
#define IS_TYPE_TARGET(TYPE) ((TYPE) & ISNS_TARGET_NODE_TYPE)
#define IS_TYPE_INITIATOR(TYPE) ((TYPE) & ISNS_INITIATOR_NODE_TYPE)
#define IS_TYPE_CONTROL(TYPE) ((TYPE) & ISNS_CONTROL_NODE_TYPE)
#define IS_TYPE_UNKNOWN(TYPE) (!IS_TYPE_TARGET(TYPE) && \
!IS_TYPE_INITIATOR(TYPE) && \
!IS_TYPE_CONTROL(TYPE))
#define IS_SCN_INIT_SELF_INFO_ONLY(UI) ((UI) & ISNS_INIT_SELF_INFO_ONLY)
#define IS_SCN_TARGET_SELF_INFO_ONLY(UI) ((UI) & ISNS_TARGET_SELF_INFO_ONLY)
#define IS_SCN_MGMT_REG(UI) ((UI) & ISNS_MGMT_REG)
#define IS_SCN_OBJ_REMOVED(UI) ((UI) & ISNS_OBJECT_REMOVED)
#define IS_SCN_OBJ_ADDED(UI) ((UI) & ISNS_OBJECT_ADDED)
#define IS_SCN_OBJ_UPDATED(UI) ((UI) & ISNS_OBJECT_UPDATED)
#define IS_SCN_MEMBER_REMOVED(UI) ((UI) & ISNS_MEMBER_REMOVED)
#define IS_SCN_MEMBER_ADDED(UI) ((UI) & ISNS_MEMBER_ADDED)
typedef struct isns_portal {
isns_type_t type;
isns_attr_t attrs[NUM_OF_PORTAL_ATTRS];
/* parent object uid */
#ifdef PORTAL_PARENT_TYPE
uint32_t puid;
#endif
/* subordinate object uid(s) */
#if defined(MAX_PORTAL_CHILD) && (MAX_PORTAL_CHILD > 0)
uint32_t *cuid[MAX_PORTAL_CHILD];
#endif
} isns_portal_t;
#define PORTAL_PORT(UI) ((UI) & ISNS_PORT_BITS)
#define ESI_PORT(UI) ((UI) & ISNS_PORT_BITS)
#define IS_ESI_UDP(UI) ((UI) & ISNS_PORT_TYPE)
#define SCN_PORT(UI) ((UI) & ISNS_PORT_BITS)
#define IS_SCN_UDP(UI) ((UI) & ISNS_PORT_TYPE)
#define PORT_NUMBER(UI) ((UI) & ISNS_PORT_BITS)
#define IS_PORT_UDP(UI) ((UI) & ISNS_PORT_TYPE)
typedef struct isns_pg {
isns_type_t type;
isns_attr_t attrs[NUM_OF_PG_ATTRS];
/* parent object uid */
#ifdef PG_PARENT_TYPE
uint32_t puid;
#endif
/* subordinate object uid(s) */
#if defined(MAX_PG_CHILD) && (MAX_PG_CHILD > 0)
uint32_t *cuid[MAX_PG_CHILD];
#endif
/* ref count */
#if defined(PG_REF_COUNT) && (PG_REF_COUNT > 0)
uint32_t ref[PG_REF_COUNT];
#endif
} isns_pg_t;
#define PG_TAG(PGT) (((PGT)->tag) & ISNS_PG_TAG)
typedef struct isns_entity {
isns_type_t type;
isns_attr_t attrs[NUM_OF_ENTITY_ATTRS];
/* parent object uid */
#ifdef ENTITY_PARENT_TYPE
uint32_t puid;
#endif
/* subordinate object uid(s) */
#if defined(MAX_ENTITY_CHILD) && (MAX_ENTITY_CHILD > 0)
uint32_t *cuid[MAX_ENTITY_CHILD];
#endif
} isns_entity_t;
#define PROTOCOL_MAX_VER(ENTITY) ((((ENTITY)->versions) >> \
ISNS_VER_SHIFT) && \
ISNS_VERSION)
#define PROTOCOL_MIN_VER(ENTITY) (((ENTITY)->versions) & ISNS_VERSION)
#define DEFAULT_EID_LEN 20
#define DEFAULT_EID_PATTERN "isns: %.6d"
#define DEFAULT_DD_NAME "Default"
#define DEFAULT_DD_SET_NAME "Default"
#define DEFAULT_DD_FEATURES 0
#define DEFAULT_DD_SET_STATUS 0
#define MIN_ESI_INTVAL (20) /* 20 seconds */
#define DEFAULT_ESI_INTVAL (3 * 60) /* 3 mintues */
#define ONE_DAY (86400)
#define INFINITY (4294967295UL) /* >136 years, max # of uint32_t */
/*
* function prototype.
*/
void *
isns_port_watcher(
void *
);
uint16_t get_server_xid(void);
void inc_thr_count(void);
void dec_thr_count(void);
void shutdown_server(void);
#ifdef __cplusplus
}
#endif
#endif /* _ISNS_SERVER_H */