Module Name: src
Committed By: mlelstv
Date: Sun Jun 5 05:11:57 UTC 2016
Modified Files:
src/sys/dev/iscsi: iscsi_rcv.c
Log Message:
Handle ExpCmdSN and MaxCmdSN updates as specified. Don't compare
serial numbers as integers.
To generate a diff of this commit:
cvs rdiff -u -r1.15 -r1.16 src/sys/dev/iscsi/iscsi_rcv.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/dev/iscsi/iscsi_rcv.c
diff -u src/sys/dev/iscsi/iscsi_rcv.c:1.15 src/sys/dev/iscsi/iscsi_rcv.c:1.16
--- src/sys/dev/iscsi/iscsi_rcv.c:1.15 Sun Jun 5 05:07:23 2016
+++ src/sys/dev/iscsi/iscsi_rcv.c Sun Jun 5 05:11:57 2016
@@ -1,4 +1,4 @@
-/* $NetBSD: iscsi_rcv.c,v 1.15 2016/06/05 05:07:23 mlelstv Exp $ */
+/* $NetBSD: iscsi_rcv.c,v 1.16 2016/06/05 05:11:57 mlelstv Exp $ */
/*-
* Copyright (c) 2004,2005,2006,2011 The NetBSD Foundation, Inc.
@@ -1014,7 +1014,7 @@ receive_pdu(connection_t *conn, pdu_t *p
ccb_t *req_ccb;
ccb_list_t waiting;
int rc;
- uint32_t MaxCmdSN, digest;
+ uint32_t MaxCmdSN, ExpCmdSN, digest;
session_t *sess = conn->session;
if (conn->HeaderDigest) {
@@ -1112,7 +1112,7 @@ receive_pdu(connection_t *conn, pdu_t *p
return rc;
/* MaxCmdSN and ExpCmdSN are in the same place in all received PDUs */
- sess->ExpCmdSN = max(sess->ExpCmdSN, ntohl(pdu->pdu.p.nop_in.ExpCmdSN));
+ ExpCmdSN = ntohl(pdu->pdu.p.nop_in.ExpCmdSN);
MaxCmdSN = ntohl(pdu->pdu.p.nop_in.MaxCmdSN);
/* received a valid frame, reset timeout */
@@ -1128,7 +1128,17 @@ receive_pdu(connection_t *conn, pdu_t *p
* We have to handle wait/nowait CCBs a bit differently.
*/
mutex_enter(&sess->lock);
- if (MaxCmdSN != sess->MaxCmdSN) {
+
+ if (sn_a_lt_b(MaxCmdSN, ExpCmdSN-1)) {
+ /* both are ignored */
+ mutex_exit(&sess->lock);
+ return 0;
+ }
+
+ if (sn_a_lt_b(sess->ExpCmdSN, ExpCmdSN))
+ sess->ExpCmdSN = ExpCmdSN;
+
+ if (sn_a_lt_b(sess->MaxCmdSN, MaxCmdSN)) {
sess->MaxCmdSN = MaxCmdSN;
if (TAILQ_FIRST(&sess->ccbs_throttled) == NULL) {
mutex_exit(&sess->lock);