1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 28 #ifndef _ISNS_SERVER_H 29 #define _ISNS_SERVER_H 30 31 #ifdef __cplusplus 32 extern "C" { 33 #endif 34 35 #include <assert.h> 36 #include <sys/param.h> 37 #include <isns_protocol.h> 38 39 #ifdef DEBUG 40 #define ASSERT(EXP) assert(EXP) 41 #else 42 #define ASSERT(EXP) 43 #endif 44 45 #define ISNS_RSP_MASK (0x8000) 46 47 /* 48 * definitions for SMF. 49 */ 50 #define ISNS_SERVER_SVC_NAME "network/isns_server" 51 #define ISNS_SERVER_CONFIG "config" 52 #define CONFIG_DATA_STORE "data_store_location" 53 #define CONFIG_ESI_THRESHOLD "ESI_retry_threshold_count" 54 #define CONFIG_MGMT_SCN "Management_SCN_Enabled" 55 #define CONFIG_CONTROL_NODES "Authorized_Control_Nodes" 56 #ifdef DEBUG 57 #define OPT_DAEMONLIZE "daemonlize" 58 #endif 59 60 #define ISNS_DAEMON_SYSLOG_PP "isns" 61 62 #define FIRST_TAG_ENTITY ISNS_EID_ATTR_ID 63 #define FIRST_TAG_ISCSI ISNS_ISCSI_NAME_ATTR_ID 64 #define FIRST_TAG_PORTAL ISNS_PORTAL_IP_ADDR_ATTR_ID 65 #define FIRST_TAG_PG ISNS_PG_ISCSI_NAME_ATTR_ID 66 #define FIRST_TAG_DD ISNS_DD_ID_ATTR_ID 67 #define FIRST_TAG_DDS ISNS_DD_SET_ID_ATTR_ID 68 #define FIRST_TAG_ASSOC_ISCSI ISNS_DD_ISCSI_INDEX_ATTR_ID 69 #define FIRST_TAG_ASSOC_DD ISNS_DD_ID_ATTR_ID 70 71 #define LAST_TAG_ENTITY ISNS_ENTITY_INDEX_ATTR_ID 72 #define LAST_TAG_ISCSI ISNS_ISCSI_AUTH_METHOD_ATTR_ID 73 #define LAST_TAG_PORTAL ISNS_SCN_PORT_ATTR_ID 74 #define LAST_TAG_PG ISNS_PG_INDEX_ATTR_ID 75 #define LAST_TAG_DD ISNS_DD_FEATURES_ATTR_ID 76 #define LAST_TAG_DDS ISNS_DD_SET_STATUS_ATTR_ID 77 #define LAST_TAG_ASSOC_ISCSI ISNS_DD_ISCSI_NAME_ATTR_ID 78 #define LAST_TAG_ASSOC_DD ISNS_DD_ID_ATTR_ID 79 80 #define NUM_OF_ENTITY_ATTRS \ 81 (LAST_TAG_ENTITY - FIRST_TAG_ENTITY + 1) 82 #define NUM_OF_ISCSI_ATTRS \ 83 (LAST_TAG_ISCSI - FIRST_TAG_ISCSI + 1) 84 #define NUM_OF_PORTAL_ATTRS \ 85 (LAST_TAG_PORTAL - FIRST_TAG_PORTAL + 1) 86 #define NUM_OF_PG_ATTRS \ 87 (LAST_TAG_PG - FIRST_TAG_PG + 1) 88 #define NUM_OF_DD_ATTRS \ 89 (LAST_TAG_DD - FIRST_TAG_DD + 1) 90 #define NUM_OF_DDS_ATTRS \ 91 (LAST_TAG_DDS - FIRST_TAG_DDS + 1) 92 #define NUM_OF_ASSOC_ISCSI_ATTRS \ 93 (LAST_TAG_ASSOC_ISCSI - FIRST_TAG_ASSOC_ISCSI + 1) 94 #define NUM_OF_ASSOC_DD_ATTRS \ 95 (LAST_TAG_ASSOC_DD - FIRST_TAG_ASSOC_DD + 1) 96 97 #define ATTR_INDEX_ENTITY(TAG) ((TAG) - FIRST_TAG_ENTITY) 98 #define ATTR_INDEX_ISCSI(TAG) ((TAG) - FIRST_TAG_ISCSI) 99 #define ATTR_INDEX_PORTAL(TAG) ((TAG) - FIRST_TAG_PORTAL) 100 #define ATTR_INDEX_PG(TAG) ((TAG) - FIRST_TAG_PG) 101 #define ATTR_INDEX_DD(TAG) ((TAG) - FIRST_TAG_DD) 102 #define ATTR_INDEX_DDS(TAG) ((TAG) - FIRST_TAG_DDS) 103 #define ATTR_INDEX_ASSOC_ISCSI(TAG) ((TAG) - FIRST_TAG_ASSOC_ISCSI) 104 #define ATTR_INDEX_ASSOC_DD(TAG) ((TAG) - FIRST_TAG_ASSOC_DD) 105 #define ATTR_INDEX(TAG, TYPE) ((TAG) - TAG_RANGE[TYPE][0]) 106 107 #define ISCSI_ATTR(ISCSI, TAG) ((ISCSI)->attrs[ATTR_INDEX_ISCSI(TAG)].value) 108 109 /* 110 * isns object type. 111 */ 112 typedef enum isns_otype { 113 /* 114 * iSNS objects as they are defined in RFC 4171. 115 */ 116 OBJ_ENTITY = 0x1, 117 OBJ_ISCSI, 118 OBJ_PORTAL, 119 OBJ_PG, 120 OBJ_DD, 121 OBJ_DDS, 122 MAX_OBJ_TYPE, 123 /* 124 * dummy object types for future extension. 125 */ 126 OBJ_DUMMY1, 127 OBJ_DUMMY2, 128 OBJ_DUMMY3, 129 OBJ_DUMMY4, 130 /* 131 * madeup object for internal implementation. 132 */ 133 OBJ_ASSOC_ISCSI, 134 OBJ_ASSOC_DD, 135 MAX_OBJ_TYPE_FOR_SIZE 136 } isns_type_t; 137 138 #define MAX_LOOKUP_CTRL (3) 139 /* 140 * lookup operation. 141 */ 142 typedef enum { 143 OP_STRING = 1, 144 OP_INTEGER, 145 OP_MEMORY_IP6 146 } lookup_method_t; 147 148 /* 149 * lookup control data. 150 */ 151 typedef struct lookup_ctrl { 152 isns_type_t type; 153 uint32_t curr_uid; 154 uint16_t id[MAX_LOOKUP_CTRL]; 155 uint8_t op[MAX_LOOKUP_CTRL]; 156 union { 157 uchar_t *ptr; 158 uint32_t ui; 159 in6_addr_t *ip; 160 } data[MAX_LOOKUP_CTRL]; 161 } lookup_ctrl_t; 162 163 #define SET_UID_LCP(LCP, TYPE, UID) {\ 164 (LCP)->type = TYPE;\ 165 (LCP)->curr_uid = 0;\ 166 (LCP)->id[0] = UID_ATTR_INDEX[TYPE];\ 167 (LCP)->op[0] = OP_INTEGER;\ 168 (LCP)->data[0].ui = UID;\ 169 (LCP)->op[1] = 0;\ 170 } 171 172 #define UPDATE_LCP_UID(LCP, UID) {\ 173 (LCP)->curr_uid = 0;\ 174 (LCP)->id[0] = UID_ATTR_INDEX[(LCP)->type];\ 175 (LCP)->op[0] = OP_INTEGER;\ 176 (LCP)->data[0].ui = UID;\ 177 (LCP)->op[1] = 0;\ 178 } 179 180 /* 181 * isns object attribute 182 */ 183 typedef struct isns_attr { 184 uint32_t tag; 185 uint32_t len; 186 union { 187 int32_t i; 188 uint32_t ui; 189 in6_addr_t *ip; 190 uchar_t *ptr; 191 time_t timestamp; 192 } value; 193 } isns_attr_t; 194 195 #define MAX_KEY_ATTRS (3) 196 197 /* 198 * isns generic object. 199 */ 200 typedef struct isns_obj { 201 isns_type_t type; 202 isns_attr_t attrs[1]; 203 } isns_obj_t; 204 205 #define ISCSI_PARENT_TYPE (OBJ_ENTITY) 206 #define PORTAL_PARENT_TYPE (OBJ_ENTITY) 207 #define PG_PARENT_TYPE (OBJ_ENTITY) 208 #define ASSOC_ISCSI_PARENT_TYPE (OBJ_DD) 209 #define ASSOC_DD_PARENT_TYPE (OBJ_DDS) 210 211 /* 212 * iSNS objects. 213 */ 214 typedef struct isns_dds { 215 isns_type_t type; 216 isns_attr_t attrs[NUM_OF_DDS_ATTRS]; 217 } isns_dds_t; 218 219 typedef struct isns_assoc_dd { 220 isns_type_t type; 221 isns_attr_t attrs[NUM_OF_ASSOC_DD_ATTRS]; 222 223 /* parent object uid */ 224 #ifdef ASSOC_DD_PARENT_TYPE 225 uint32_t puid; 226 #endif 227 } isns_assoc_dd_t; 228 229 #define DDS_ENABLED(UI) ((UI) & (ISNS_DDS_STATUS)) 230 #define ENABLE_DDS(DDS) (((DDS)->status) |= (ISNS_DDS_STATUS)) 231 #define DISABLE_DDS(DDS) (((DDS)->status) &= ~(ISNS_DDS_STATUS)) 232 233 #define DD_BOOTLIST_ENABLED(UI) ((UI) & (ISNS_DD_BOOTLIST)) 234 235 typedef struct isns_dd { 236 isns_type_t type; 237 isns_attr_t attrs[NUM_OF_DD_ATTRS]; 238 } isns_dd_t; 239 240 typedef struct isns_assoc_iscsi { 241 isns_type_t type; 242 isns_attr_t attrs[NUM_OF_ASSOC_ISCSI_ATTRS]; 243 244 /* parent object uid */ 245 #ifdef ASSOC_ISCSI_PARENT_TYPE 246 uint32_t puid; 247 #endif 248 } isns_assoc_iscsi_t; 249 250 #define MAX_ISCSI_CHILD (0) 251 #define MAX_PORTAL_CHILD (0) 252 #define MAX_PG_CHILD (0) 253 #define MAX_ENTITY_CHILD (2) 254 #define MAX_CHILD_TYPE (2) 255 256 #define PG_REF_COUNT (2) 257 258 #define MAX_REF_COUNT (2) 259 260 typedef struct isns_iscsi { 261 isns_type_t type; 262 isns_attr_t attrs[NUM_OF_ISCSI_ATTRS]; 263 264 /* parent object uid */ 265 #ifdef ISCSI_PARENT_TYPE 266 uint32_t puid; 267 #endif 268 /* subordinate object uid(s) */ 269 #if defined(MAX_ISCSI_CHILD) && (MAX_ISCSI_CHILD > 0) 270 uint32_t *cuid[MAX_ISCSI_CHILD]; 271 #endif 272 } isns_iscsi_t; 273 274 #define IS_ISCSI_TARGET(NODE) (((NODE)->type) & ISNS_TARGET_NODE_TYPE) 275 #define IS_ISCSI_INITIATOR(NODE) (((NODE)->type) & ISNS_INITIATOR_NODE_TYPE) 276 #define IS_ISCSI_CONTROL(NODE) (((NODE)->type) & ISNS_CONTROL_NODE_TYPE) 277 278 #define IS_TYPE_TARGET(TYPE) ((TYPE) & ISNS_TARGET_NODE_TYPE) 279 #define IS_TYPE_INITIATOR(TYPE) ((TYPE) & ISNS_INITIATOR_NODE_TYPE) 280 #define IS_TYPE_CONTROL(TYPE) ((TYPE) & ISNS_CONTROL_NODE_TYPE) 281 #define IS_TYPE_UNKNOWN(TYPE) (!IS_TYPE_TARGET(TYPE) && \ 282 !IS_TYPE_INITIATOR(TYPE) && \ 283 !IS_TYPE_CONTROL(TYPE)) 284 285 #define IS_SCN_INIT_SELF_INFO_ONLY(UI) ((UI) & ISNS_INIT_SELF_INFO_ONLY) 286 #define IS_SCN_TARGET_SELF_INFO_ONLY(UI) ((UI) & ISNS_TARGET_SELF_INFO_ONLY) 287 #define IS_SCN_MGMT_REG(UI) ((UI) & ISNS_MGMT_REG) 288 #define IS_SCN_OBJ_REMOVED(UI) ((UI) & ISNS_OBJECT_REMOVED) 289 #define IS_SCN_OBJ_ADDED(UI) ((UI) & ISNS_OBJECT_ADDED) 290 #define IS_SCN_OBJ_UPDATED(UI) ((UI) & ISNS_OBJECT_UPDATED) 291 #define IS_SCN_MEMBER_REMOVED(UI) ((UI) & ISNS_MEMBER_REMOVED) 292 #define IS_SCN_MEMBER_ADDED(UI) ((UI) & ISNS_MEMBER_ADDED) 293 294 typedef struct isns_portal { 295 isns_type_t type; 296 isns_attr_t attrs[NUM_OF_PORTAL_ATTRS]; 297 298 /* parent object uid */ 299 #ifdef PORTAL_PARENT_TYPE 300 uint32_t puid; 301 #endif 302 /* subordinate object uid(s) */ 303 #if defined(MAX_PORTAL_CHILD) && (MAX_PORTAL_CHILD > 0) 304 uint32_t *cuid[MAX_PORTAL_CHILD]; 305 #endif 306 } isns_portal_t; 307 308 #define PORTAL_PORT(UI) ((UI) & ISNS_PORT_BITS) 309 #define ESI_PORT(UI) ((UI) & ISNS_PORT_BITS) 310 #define IS_ESI_UDP(UI) ((UI) & ISNS_PORT_TYPE) 311 #define SCN_PORT(UI) ((UI) & ISNS_PORT_BITS) 312 #define IS_SCN_UDP(UI) ((UI) & ISNS_PORT_TYPE) 313 314 #define PORT_NUMBER(UI) ((UI) & ISNS_PORT_BITS) 315 #define IS_PORT_UDP(UI) ((UI) & ISNS_PORT_TYPE) 316 317 typedef struct isns_pg { 318 isns_type_t type; 319 isns_attr_t attrs[NUM_OF_PG_ATTRS]; 320 321 /* parent object uid */ 322 #ifdef PG_PARENT_TYPE 323 uint32_t puid; 324 #endif 325 /* subordinate object uid(s) */ 326 #if defined(MAX_PG_CHILD) && (MAX_PG_CHILD > 0) 327 uint32_t *cuid[MAX_PG_CHILD]; 328 #endif 329 /* ref count */ 330 #if defined(PG_REF_COUNT) && (PG_REF_COUNT > 0) 331 uint32_t ref[PG_REF_COUNT]; 332 #endif 333 } isns_pg_t; 334 335 #define PG_TAG(PGT) (((PGT)->tag) & ISNS_PG_TAG) 336 337 typedef struct isns_entity { 338 isns_type_t type; 339 isns_attr_t attrs[NUM_OF_ENTITY_ATTRS]; 340 341 /* parent object uid */ 342 #ifdef ENTITY_PARENT_TYPE 343 uint32_t puid; 344 #endif 345 /* subordinate object uid(s) */ 346 #if defined(MAX_ENTITY_CHILD) && (MAX_ENTITY_CHILD > 0) 347 uint32_t *cuid[MAX_ENTITY_CHILD]; 348 #endif 349 } isns_entity_t; 350 351 #define PROTOCOL_MAX_VER(ENTITY) ((((ENTITY)->versions) >> \ 352 ISNS_VER_SHIFT) && \ 353 ISNS_VERSION) 354 #define PROTOCOL_MIN_VER(ENTITY) (((ENTITY)->versions) & ISNS_VERSION) 355 356 #define DEFAULT_EID_LEN 20 357 #define DEFAULT_EID_PATTERN "isns: %.6d" 358 359 #define DEFAULT_DD_NAME "Default" 360 #define DEFAULT_DD_SET_NAME "Default" 361 362 #define DEFAULT_DD_FEATURES 0 363 #define DEFAULT_DD_SET_STATUS 0 364 365 #define MIN_ESI_INTVAL (20) /* 20 seconds */ 366 #define DEFAULT_ESI_INTVAL (3 * 60) /* 3 mintues */ 367 368 #define ONE_DAY (86400) 369 #define INFINITY (4294967295UL) /* >136 years, max # of uint32_t */ 370 371 /* 372 * function prototype. 373 */ 374 void * 375 isns_port_watcher( 376 void * 377 ); 378 379 uint16_t get_server_xid(void); 380 381 void inc_thr_count(void); 382 void dec_thr_count(void); 383 void shutdown_server(void); 384 385 #ifdef __cplusplus 386 } 387 #endif 388 389 #endif /* _ISNS_SERVER_H */ 390