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 * Copyright (c) 2008, 2010, Oracle and/or its affiliates. All rights reserved. 23 */ 24 #ifndef _ISNS_CLIENT_H_ 25 #define _ISNS_CLIENT_H_ 26 27 #include "iscsit.h" 28 29 /* 30 * List of iSNS servers with which we register. 31 */ 32 33 typedef struct { 34 int svr_retry_count; 35 struct sockaddr_storage svr_sa; 36 clock_t svr_last_msg; 37 list_node_t svr_ln; 38 uint32_t svr_registered:1, 39 svr_reset_needed:1, 40 svr_delete_needed:1, 41 svr_targets_changed:1, 42 svr_monitor_hold:1; 43 uint32_t svr_last_target_index; 44 uint32_t svr_esi_interval; 45 avl_tree_t svr_target_list; 46 } iscsit_isns_svr_t; 47 48 /* 49 * Type of registration to perform (deregister, register, update) 50 */ 51 typedef enum { 52 ISNS_DEREGISTER_TARGET = 0, 53 ISNS_DEREGISTER_ALL, 54 ISNS_REGISTER_TARGET, 55 ISNS_REGISTER_ALL, 56 ISNS_MODIFY_TARGET 57 } isns_reg_type_t; 58 59 /* 60 * This structure is used to keep state with regard to the RX threads used 61 * for ESI. 62 */ 63 64 65 typedef struct { 66 kthread_t *esi_thread; 67 kt_did_t esi_thread_did; 68 ksocket_t esi_so; 69 kmutex_t esi_mutex; 70 kcondvar_t esi_cv; 71 uint16_t esi_port; 72 boolean_t esi_enabled; 73 boolean_t esi_valid; 74 boolean_t esi_thread_running; 75 } isns_esi_tinfo_t; 76 77 78 /* 79 * Portal list - both default portals from idm_get_ipaddr and portals 80 * defined in target port groups. 81 */ 82 83 typedef struct isns_portal_s { 84 struct sockaddr_storage portal_addr; 85 avl_node_t portal_node; 86 timespec_t portal_esi_timestamp; 87 iscsit_portal_t *portal_iscsit; /* if in TPG */ 88 boolean_t portal_default; /* if in default */ 89 } isns_portal_t; 90 91 92 typedef struct isns_tpgt_addr_s { 93 list_node_t portal_ln; 94 struct sockaddr_storage portal_addr; 95 } isns_tpgt_addr_t; 96 97 typedef struct isns_tpgt_s { 98 list_node_t ti_tpgt_ln; 99 uint16_t ti_tpgt_tag; 100 list_t ti_portal_list; 101 } isns_tpgt_t; 102 103 typedef struct isns_target_info_s { 104 idm_refcnt_t ti_refcnt; 105 char ti_tgt_name[MAX_ISCSI_NODENAMELEN]; 106 char ti_tgt_alias[MAX_ISCSI_NODENAMELEN]; 107 list_t ti_tpgt_list; 108 } isns_target_info_t; 109 110 /* Contents of isns_target_list and svr->svr_target_list */ 111 typedef struct isns_target_s { 112 iscsit_tgt_t *target; 113 avl_node_t target_node; 114 boolean_t target_registered; 115 boolean_t target_update_needed; 116 boolean_t target_delete_needed; 117 isns_target_info_t *target_info; 118 } isns_target_t; 119 120 /* 121 * If no ESI request is received within this number of intervals, we'll 122 * try to re-register with the server. 123 */ 124 #define MAX_ESI_INTERVALS 3 125 126 /* 127 * Interval to ask the server to send us ESI probes, in seconds. 128 */ 129 #define ISNS_DEFAULT_ESI_INTERVAL 20 130 131 /* 132 * Registration Period (when not using ESI), in seconds. (15 min) 133 */ 134 #define ISNS_DEFAULT_REGISTRATION_PERIOD 900 135 136 /* 137 * Initial delay before sending first DevAttrReg message. 138 */ 139 #define ISNS_INITIAL_DELAY 5 140 141 it_cfg_status_t 142 isnst_config_merge(it_config_t *cfg); 143 144 int iscsit_isns_init(iscsit_hostinfo_t *hostinfo); 145 void iscsit_isns_fini(); 146 int iscsit_isns_register(iscsit_tgt_t *target); 147 int iscsit_isns_deregister(iscsit_tgt_t *target); 148 void iscsit_isns_target_update(iscsit_tgt_t *target); 149 void iscsit_isns_portal_online(iscsit_portal_t *portal); 150 void iscsit_isns_portal_offline(iscsit_portal_t *portal); 151 152 #endif /* _ISNS_CLIENT_H_ */ 153