Hello,
Iâm having issues getting iscsid to work with my Synology NAS.
The first issue was that the NAS was returning an error code. Turns out
it didnât like not missing the default SessionType=Normal.
The second issue was that the login sequence never comleted. It seems we
keep hardcoding MaxConnections and MaxRecvDataSegmentLength in
connection.c:conn_gen_kvp() instead of negotiating to the lowest value.
So I just bypassed that function entirely and hardcoded all the default
settings in initiator.c.
This makes the login step complete, but then nothing else happens after
that. I would expect a new scsi device to be attached so I could use it.
I did notice that MaxConnection shows as 0, but the NAS does show the
connection as established.
b1# iscsictl show Â
Initiator: ISID base 80d3cf6f qalifier 6e7d
Session 'disk2':
  SessionType: normal MaxConnections: 0
  TargetName: iqn.2000-01.com.synology:Target.02
  TargetAddr: 192.168.0.4:iscsi
  InitiatorName: iqn.1995-11.org.openbsd.iscsid:b1
  InitiatorAddr: 192.168.0.9
command successful
b1$ cat /etc/iscsi.conf                  Â
     Â
                     Â
target disk2 {
    initiatoraddr 192.168.0.9
    targetaddr 192.168.0.4
    targetname "iqn.2000-01.com.synology:Target.02"
}
Any suggestions on where to go from here?
Thanks,
-David
b1$ doas /usr/sbin/iscsid -dvÂ
startup
session_fsm[disk2]: INIT ev start timeout 0
sess_fsm[disk2]: INIT ev start
new connection to 192.168.0.4:3260
conn_fsm[disk2]: FREE ev connect
conn_fsm[disk2]: new state XPT_WAIT
sess_fsm[disk2]: new state FREE
sess_fsm: done
conn_fsm[disk2]: XPT_WAIT ev connected
conn_fsm[disk2]: new state IN_LOGIN
conn_parse_kvp: AuthMethod = None
conn_parse_kvp: TargetAlias = Synology Target
conn_parse_kvp: TargetPortalGroupTag = 1
SET_NUM: TargetPortalGroupTag = 1
conn_parse_kvp: HeaderDigest = None
conn_parse_kvp: DataDigest = None
conn_parse_kvp: MaxConnections = 1
SET_NUM: MaxConnections = 1
conn_parse_kvp: ImmediateData = Yes
SET_BOOL: ImmediateData = 1
conn_parse_kvp: MaxRecvDataSegmentLength = 262144
SET_NUM: MaxRecvDataSegmentLength = 262144
conn_parse_kvp: MaxBurstLength = 262144
SET_NUM: MaxBurstLength = 262144
conn_parse_kvp: FirstBurstLength = 65536
SET_NUM: FirstBurstLength = 65536
conn_parse_kvp: DefaultTime2Wait = 2
SET_NUM: DefaultTime2Wait = 2
conn_parse_kvp: DefaultTime2Retain = 20
SET_NUM: DefaultTime2Retain = 20
conn_parse_kvp: MaxOutstandingR2T = 1
SET_NUM: MaxOutstandingR2T = 1
conn_parse_kvp: DataPDUInOrder = Yes
SET_BOOL: DataPDUInOrder = 1
conn_parse_kvp: DataSequenceInOrder = Yes
SET_BOOL: DataSequenceInOrder = 1
conn_parse_kvp: ErrorRecoveryLevel = 0
SET_NUM: ErrorRecoveryLevel = 0
conn_fsm[disk2]: IN_LOGIN ev logged in
session_fsm[disk2]: FREE ev connection logged in timeout 0
conn_fsm[disk2]: new state LOGGED_IN
sess_fsm[disk2]: FREE ev connection logged in
sess_fsm[disk2]: new state LOGGED_IN
sess_fsm: done
Index: initiator.c
===================================================================
RCS file: /cvs/src/usr.sbin/iscsid/initiator.c,v
retrieving revision 1.15
diff -u -p -u -p -r1.15 initiator.c
--- initiator.c 16 Jan 2015 15:57:06 -0000Â Â Â 1.15
+++ initiator.c 31 Mar 2021 03:24:44 -0000
@@ -254,11 +254,10 @@ struct kvp *
 initiator_login_kvp(struct connection *c, u_int8_t stage)
 {
    struct kvp *kvp;
-Â Â Â Â size_t nkvp;
Â
    switch (stage) {
    case ISCSI_LOGIN_STG_SECNEG:
-Â Â Â Â Â Â Â Â if (!(kvp = calloc(4, sizeof(*kvp))))
+Â Â Â Â Â Â Â Â if (!(kvp = calloc(5, sizeof(*kvp))))
            return NULL;
        kvp[0].key = "AuthMethod";
        kvp[0].value = "None";
@@ -269,20 +268,39 @@ initiator_login_kvp(struct connection *c
            kvp[2].key = "SessionType";
            kvp[2].value = "Discovery";
        } else {
-Â Â Â Â Â Â Â Â Â Â Â Â kvp[2].key = "TargetName";
-Â Â Â Â Â Â Â Â Â Â Â Â kvp[2].value =
c->session->config.TargetName;
+Â Â Â Â Â Â Â Â Â Â Â Â kvp[2].key = "SessionType";
+Â Â Â Â Â Â Â Â Â Â Â Â kvp[2].value = "Normal";
+Â Â Â Â Â Â Â Â Â Â Â Â kvp[3].key = "TargetName";
+Â Â Â Â Â Â Â Â Â Â Â Â kvp[3].value =
c->session->config.TargetName;
        }
        break;
    case ISCSI_LOGIN_STG_OPNEG:
-Â Â Â Â Â Â Â Â if (conn_gen_kvp(c, NULL, &nkvp) == -1)
-Â Â Â Â Â Â Â Â Â Â Â Â return NULL;
-Â Â Â Â Â Â Â Â nkvp += 1; /* add slot for terminator */
-Â Â Â Â Â Â Â Â if (!(kvp = calloc(nkvp, sizeof(*kvp))))
-Â Â Â Â Â Â Â Â Â Â Â Â return NULL;
-Â Â Â Â Â Â Â Â if (conn_gen_kvp(c, kvp, &nkvp) == -1) {
-Â Â Â Â Â Â Â Â Â Â Â Â free(kvp);
+Â Â Â Â Â Â Â Â if (!(kvp = calloc(13, sizeof(*kvp))))
            return NULL;
-Â Â Â Â Â Â Â Â }
+Â Â Â Â Â Â Â Â kvp[0].key = "HeaderDigest";
+Â Â Â Â Â Â Â Â kvp[0].value = "None";
+Â Â Â Â Â Â Â Â kvp[1].key = "DataDigest";
+Â Â Â Â Â Â Â Â kvp[1].value = "None";
+Â Â Â Â Â Â Â Â kvp[2].key = "ImmediateData";
+Â Â Â Â Â Â Â Â kvp[2].value = "Yes";
+Â Â Â Â Â Â Â Â kvp[3].key = "MaxBurstLength";
+Â Â Â Â Â Â Â Â kvp[3].value = "262144";
+Â Â Â Â Â Â Â Â kvp[4].key = "FirstBurstLength";
+Â Â Â Â Â Â Â Â kvp[4].value = "65536";
+Â Â Â Â Â Â Â Â kvp[5].key = "InitialR2T";
+Â Â Â Â Â Â Â Â kvp[5].value = "Yes";
+Â Â Â Â Â Â Â Â kvp[6].key = "MaxOutstandingR2T";
+Â Â Â Â Â Â Â Â kvp[6].value = "1";
+Â Â Â Â Â Â Â Â kvp[7].key = "MaxRecvDataSegmentLength";
+Â Â Â Â Â Â Â Â kvp[7].value = "65536";
+Â Â Â Â Â Â Â Â kvp[8].key = "DefaultTime2Wait";
+Â Â Â Â Â Â Â Â kvp[8].value = "2";
+Â Â Â Â Â Â Â Â kvp[9].key = "DefaultTime2Retain";
+Â Â Â Â Â Â Â Â kvp[9].value = "20";
+Â Â Â Â Â Â Â Â kvp[10].key = "ErrorRecoveryLevel";
+Â Â Â Â Â Â Â Â kvp[10].value = "0";
+Â Â Â Â Â Â Â Â kvp[11].key = "MaxConnections";
+Â Â Â Â Â Â Â Â kvp[11].value = "1";
        break;
    default:
        log_warnx("initiator_login_kvp: exit stage left");
Index: iscsid.c
===================================================================
RCS file: /cvs/src/usr.sbin/iscsid/iscsid.c,v
retrieving revision 1.20
diff -u -p -u -p -r1.20 iscsid.c
--- iscsid.c  23 Jan 2017 08:40:07 -0000   1.20
+++ iscsid.c  31 Mar 2021 03:24:44 -0000
@@ -38,7 +38,7 @@ void     main_sig_handler(int, short, voidÂ
 __dead void  usage(void);
 void      shutdown_cb(int, short, void *);
Â
-struct initiator *initiator;
+extern struct initiator *initiator;
 struct event exit_ev;
 int exit_rounds;
 #define ISCSI_EXIT_WAIT 5