Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0-or-later
0002 /*******************************************************************************
0003  * This file contains the main functions related to Initiator Node Attributes.
0004  *
0005  * (c) Copyright 2007-2013 Datera, Inc.
0006  *
0007  * Author: Nicholas A. Bellinger <nab@linux-iscsi.org>
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      * Reenable disabled nopin_timeout timer for all iSCSI connections.
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 }