0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #include <target/target_core_base.h>
0012
0013 #include <target/iscsi/iscsi_target_core.h>
0014 #include "iscsi_target_device.h"
0015 #include "iscsi_target_tpg.h"
0016 #include "iscsi_target_util.h"
0017 #include "iscsi_target_nodeattrib.h"
0018
0019 static inline char *iscsit_na_get_initiatorname(
0020 struct iscsi_node_acl *nacl)
0021 {
0022 struct se_node_acl *se_nacl = &nacl->se_node_acl;
0023
0024 return &se_nacl->initiatorname[0];
0025 }
0026
0027 void iscsit_set_default_node_attribues(
0028 struct iscsi_node_acl *acl,
0029 struct iscsi_portal_group *tpg)
0030 {
0031 struct iscsi_node_attrib *a = &acl->node_attrib;
0032
0033 a->authentication = NA_AUTHENTICATION_INHERITED;
0034 a->dataout_timeout = NA_DATAOUT_TIMEOUT;
0035 a->dataout_timeout_retries = NA_DATAOUT_TIMEOUT_RETRIES;
0036 a->nopin_timeout = NA_NOPIN_TIMEOUT;
0037 a->nopin_response_timeout = NA_NOPIN_RESPONSE_TIMEOUT;
0038 a->random_datain_pdu_offsets = NA_RANDOM_DATAIN_PDU_OFFSETS;
0039 a->random_datain_seq_offsets = NA_RANDOM_DATAIN_SEQ_OFFSETS;
0040 a->random_r2t_offsets = NA_RANDOM_R2T_OFFSETS;
0041 a->default_erl = tpg->tpg_attrib.default_erl;
0042 }
0043
0044 int iscsit_na_dataout_timeout(
0045 struct iscsi_node_acl *acl,
0046 u32 dataout_timeout)
0047 {
0048 struct iscsi_node_attrib *a = &acl->node_attrib;
0049
0050 if (dataout_timeout > NA_DATAOUT_TIMEOUT_MAX) {
0051 pr_err("Requested DataOut Timeout %u larger than"
0052 " maximum %u\n", dataout_timeout,
0053 NA_DATAOUT_TIMEOUT_MAX);
0054 return -EINVAL;
0055 } else if (dataout_timeout < NA_DATAOUT_TIMEOUT_MIX) {
0056 pr_err("Requested DataOut Timeout %u smaller than"
0057 " minimum %u\n", dataout_timeout,
0058 NA_DATAOUT_TIMEOUT_MIX);
0059 return -EINVAL;
0060 }
0061
0062 a->dataout_timeout = dataout_timeout;
0063 pr_debug("Set DataOut Timeout to %u for Initiator Node"
0064 " %s\n", a->dataout_timeout, iscsit_na_get_initiatorname(acl));
0065
0066 return 0;
0067 }
0068
0069 int iscsit_na_dataout_timeout_retries(
0070 struct iscsi_node_acl *acl,
0071 u32 dataout_timeout_retries)
0072 {
0073 struct iscsi_node_attrib *a = &acl->node_attrib;
0074
0075 if (dataout_timeout_retries > NA_DATAOUT_TIMEOUT_RETRIES_MAX) {
0076 pr_err("Requested DataOut Timeout Retries %u larger"
0077 " than maximum %u", dataout_timeout_retries,
0078 NA_DATAOUT_TIMEOUT_RETRIES_MAX);
0079 return -EINVAL;
0080 } else if (dataout_timeout_retries < NA_DATAOUT_TIMEOUT_RETRIES_MIN) {
0081 pr_err("Requested DataOut Timeout Retries %u smaller"
0082 " than minimum %u", dataout_timeout_retries,
0083 NA_DATAOUT_TIMEOUT_RETRIES_MIN);
0084 return -EINVAL;
0085 }
0086
0087 a->dataout_timeout_retries = dataout_timeout_retries;
0088 pr_debug("Set DataOut Timeout Retries to %u for"
0089 " Initiator Node %s\n", a->dataout_timeout_retries,
0090 iscsit_na_get_initiatorname(acl));
0091
0092 return 0;
0093 }
0094
0095 int iscsit_na_nopin_timeout(
0096 struct iscsi_node_acl *acl,
0097 u32 nopin_timeout)
0098 {
0099 struct iscsi_node_attrib *a = &acl->node_attrib;
0100 struct iscsit_session *sess;
0101 struct iscsit_conn *conn;
0102 struct se_node_acl *se_nacl = &a->nacl->se_node_acl;
0103 struct se_session *se_sess;
0104 u32 orig_nopin_timeout = a->nopin_timeout;
0105
0106 if (nopin_timeout > NA_NOPIN_TIMEOUT_MAX) {
0107 pr_err("Requested NopIn Timeout %u larger than maximum"
0108 " %u\n", nopin_timeout, NA_NOPIN_TIMEOUT_MAX);
0109 return -EINVAL;
0110 } else if ((nopin_timeout < NA_NOPIN_TIMEOUT_MIN) &&
0111 (nopin_timeout != 0)) {
0112 pr_err("Requested NopIn Timeout %u smaller than"
0113 " minimum %u and not 0\n", nopin_timeout,
0114 NA_NOPIN_TIMEOUT_MIN);
0115 return -EINVAL;
0116 }
0117
0118 a->nopin_timeout = nopin_timeout;
0119 pr_debug("Set NopIn Timeout to %u for Initiator"
0120 " Node %s\n", a->nopin_timeout,
0121 iscsit_na_get_initiatorname(acl));
0122
0123
0124
0125 if (!orig_nopin_timeout) {
0126 spin_lock_bh(&se_nacl->nacl_sess_lock);
0127 se_sess = se_nacl->nacl_sess;
0128 if (se_sess) {
0129 sess = se_sess->fabric_sess_ptr;
0130
0131 spin_lock(&sess->conn_lock);
0132 list_for_each_entry(conn, &sess->sess_conn_list,
0133 conn_list) {
0134 if (conn->conn_state !=
0135 TARG_CONN_STATE_LOGGED_IN)
0136 continue;
0137
0138 spin_lock(&conn->nopin_timer_lock);
0139 __iscsit_start_nopin_timer(conn);
0140 spin_unlock(&conn->nopin_timer_lock);
0141 }
0142 spin_unlock(&sess->conn_lock);
0143 }
0144 spin_unlock_bh(&se_nacl->nacl_sess_lock);
0145 }
0146
0147 return 0;
0148 }
0149
0150 int iscsit_na_nopin_response_timeout(
0151 struct iscsi_node_acl *acl,
0152 u32 nopin_response_timeout)
0153 {
0154 struct iscsi_node_attrib *a = &acl->node_attrib;
0155
0156 if (nopin_response_timeout > NA_NOPIN_RESPONSE_TIMEOUT_MAX) {
0157 pr_err("Requested NopIn Response Timeout %u larger"
0158 " than maximum %u\n", nopin_response_timeout,
0159 NA_NOPIN_RESPONSE_TIMEOUT_MAX);
0160 return -EINVAL;
0161 } else if (nopin_response_timeout < NA_NOPIN_RESPONSE_TIMEOUT_MIN) {
0162 pr_err("Requested NopIn Response Timeout %u smaller"
0163 " than minimum %u\n", nopin_response_timeout,
0164 NA_NOPIN_RESPONSE_TIMEOUT_MIN);
0165 return -EINVAL;
0166 }
0167
0168 a->nopin_response_timeout = nopin_response_timeout;
0169 pr_debug("Set NopIn Response Timeout to %u for"
0170 " Initiator Node %s\n", a->nopin_timeout,
0171 iscsit_na_get_initiatorname(acl));
0172
0173 return 0;
0174 }
0175
0176 int iscsit_na_random_datain_pdu_offsets(
0177 struct iscsi_node_acl *acl,
0178 u32 random_datain_pdu_offsets)
0179 {
0180 struct iscsi_node_attrib *a = &acl->node_attrib;
0181
0182 if (random_datain_pdu_offsets != 0 && random_datain_pdu_offsets != 1) {
0183 pr_err("Requested Random DataIN PDU Offsets: %u not"
0184 " 0 or 1\n", random_datain_pdu_offsets);
0185 return -EINVAL;
0186 }
0187
0188 a->random_datain_pdu_offsets = random_datain_pdu_offsets;
0189 pr_debug("Set Random DataIN PDU Offsets to %u for"
0190 " Initiator Node %s\n", a->random_datain_pdu_offsets,
0191 iscsit_na_get_initiatorname(acl));
0192
0193 return 0;
0194 }
0195
0196 int iscsit_na_random_datain_seq_offsets(
0197 struct iscsi_node_acl *acl,
0198 u32 random_datain_seq_offsets)
0199 {
0200 struct iscsi_node_attrib *a = &acl->node_attrib;
0201
0202 if (random_datain_seq_offsets != 0 && random_datain_seq_offsets != 1) {
0203 pr_err("Requested Random DataIN Sequence Offsets: %u"
0204 " not 0 or 1\n", random_datain_seq_offsets);
0205 return -EINVAL;
0206 }
0207
0208 a->random_datain_seq_offsets = random_datain_seq_offsets;
0209 pr_debug("Set Random DataIN Sequence Offsets to %u for"
0210 " Initiator Node %s\n", a->random_datain_seq_offsets,
0211 iscsit_na_get_initiatorname(acl));
0212
0213 return 0;
0214 }
0215
0216 int iscsit_na_random_r2t_offsets(
0217 struct iscsi_node_acl *acl,
0218 u32 random_r2t_offsets)
0219 {
0220 struct iscsi_node_attrib *a = &acl->node_attrib;
0221
0222 if (random_r2t_offsets != 0 && random_r2t_offsets != 1) {
0223 pr_err("Requested Random R2T Offsets: %u not"
0224 " 0 or 1\n", random_r2t_offsets);
0225 return -EINVAL;
0226 }
0227
0228 a->random_r2t_offsets = random_r2t_offsets;
0229 pr_debug("Set Random R2T Offsets to %u for"
0230 " Initiator Node %s\n", a->random_r2t_offsets,
0231 iscsit_na_get_initiatorname(acl));
0232
0233 return 0;
0234 }
0235
0236 int iscsit_na_default_erl(
0237 struct iscsi_node_acl *acl,
0238 u32 default_erl)
0239 {
0240 struct iscsi_node_attrib *a = &acl->node_attrib;
0241
0242 if (default_erl != 0 && default_erl != 1 && default_erl != 2) {
0243 pr_err("Requested default ERL: %u not 0, 1, or 2\n",
0244 default_erl);
0245 return -EINVAL;
0246 }
0247
0248 a->default_erl = default_erl;
0249 pr_debug("Set use ERL0 flag to %u for Initiator"
0250 " Node %s\n", a->default_erl,
0251 iscsit_na_get_initiatorname(acl));
0252
0253 return 0;
0254 }