Second try....
Hello,
I’m having issues getting iscsid to work with my Synology NAS on
amd64/6.9-beta.
The first issue was that the NAS was returning an error code. Turns out
it didn’t like missing the default SessionType=Normal.
The second issue was that the login sequence never completed. 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