summaryrefslogtreecommitdiffstats
path: root/usr.sbin/ctld
diff options
context:
space:
mode:
authormav <mav@FreeBSD.org>2015-01-03 13:08:08 +0000
committermav <mav@FreeBSD.org>2015-01-03 13:08:08 +0000
commit2952feb3ad9cd929b2aeb20e2746b63042e042df (patch)
treea5b23d1902be7132085a8641947312f3920b7e1a /usr.sbin/ctld
parent5823747ac5f8823fb07d435374acaade6456d1ef (diff)
downloadFreeBSD-src-2952feb3ad9cd929b2aeb20e2746b63042e042df.zip
FreeBSD-src-2952feb3ad9cd929b2aeb20e2746b63042e042df.tar.gz
MFC r275864: Make sequence numbers checks more strict.
While we don't support MCS, hole in received sequence numbers may mean only PDU loss. While we don't support lost PDU recovery, terminate the connection to avoid stuck commands. While there, improve handling of sequence numbers wrap after 2^32 PDUs.
Diffstat (limited to 'usr.sbin/ctld')
-rw-r--r--usr.sbin/ctld/discovery.c12
-rw-r--r--usr.sbin/ctld/login.c6
2 files changed, 9 insertions, 9 deletions
diff --git a/usr.sbin/ctld/discovery.c b/usr.sbin/ctld/discovery.c
index 01c9913..b370e0b 100644
--- a/usr.sbin/ctld/discovery.c
+++ b/usr.sbin/ctld/discovery.c
@@ -65,13 +65,13 @@ text_receive(struct connection *conn)
*/
if ((bhstr->bhstr_flags & BHSTR_FLAGS_CONTINUE) != 0)
log_errx(1, "received Text PDU with unsupported \"C\" flag");
- if (ntohl(bhstr->bhstr_cmdsn) < conn->conn_cmdsn) {
+ if (ISCSI_SNLT(ntohl(bhstr->bhstr_cmdsn), conn->conn_cmdsn)) {
log_errx(1, "received Text PDU with decreasing CmdSN: "
- "was %d, is %d", conn->conn_cmdsn, ntohl(bhstr->bhstr_cmdsn));
+ "was %u, is %u", conn->conn_cmdsn, ntohl(bhstr->bhstr_cmdsn));
}
if (ntohl(bhstr->bhstr_expstatsn) != conn->conn_statsn) {
log_errx(1, "received Text PDU with wrong StatSN: "
- "is %d, should be %d", ntohl(bhstr->bhstr_expstatsn),
+ "is %u, should be %u", ntohl(bhstr->bhstr_expstatsn),
conn->conn_statsn);
}
conn->conn_cmdsn = ntohl(bhstr->bhstr_cmdsn);
@@ -120,14 +120,14 @@ logout_receive(struct connection *conn)
if ((bhslr->bhslr_reason & 0x7f) != BHSLR_REASON_CLOSE_SESSION)
log_debugx("received Logout PDU with invalid reason 0x%x; "
"continuing anyway", bhslr->bhslr_reason & 0x7f);
- if (ntohl(bhslr->bhslr_cmdsn) < conn->conn_cmdsn) {
+ if (ISCSI_SNLT(ntohl(bhslr->bhslr_cmdsn), conn->conn_cmdsn)) {
log_errx(1, "received Logout PDU with decreasing CmdSN: "
- "was %d, is %d", conn->conn_cmdsn,
+ "was %u, is %u", conn->conn_cmdsn,
ntohl(bhslr->bhslr_cmdsn));
}
if (ntohl(bhslr->bhslr_expstatsn) != conn->conn_statsn) {
log_errx(1, "received Logout PDU with wrong StatSN: "
- "is %d, should be %d", ntohl(bhslr->bhslr_expstatsn),
+ "is %u, should be %u", ntohl(bhslr->bhslr_expstatsn),
conn->conn_statsn);
}
conn->conn_cmdsn = ntohl(bhslr->bhslr_cmdsn);
diff --git a/usr.sbin/ctld/login.c b/usr.sbin/ctld/login.c
index ce6f54d..5358e4b 100644
--- a/usr.sbin/ctld/login.c
+++ b/usr.sbin/ctld/login.c
@@ -127,17 +127,17 @@ login_receive(struct connection *conn, bool initial)
log_errx(1, "received Login PDU with unsupported "
"Version-min 0x%x", bhslr->bhslr_version_min);
}
- if (ntohl(bhslr->bhslr_cmdsn) < conn->conn_cmdsn) {
+ if (ISCSI_SNLT(ntohl(bhslr->bhslr_cmdsn), conn->conn_cmdsn)) {
login_send_error(request, 0x02, 0x05);
log_errx(1, "received Login PDU with decreasing CmdSN: "
- "was %d, is %d", conn->conn_cmdsn,
+ "was %u, is %u", conn->conn_cmdsn,
ntohl(bhslr->bhslr_cmdsn));
}
if (initial == false &&
ntohl(bhslr->bhslr_expstatsn) != conn->conn_statsn) {
login_send_error(request, 0x02, 0x05);
log_errx(1, "received Login PDU with wrong ExpStatSN: "
- "is %d, should be %d", ntohl(bhslr->bhslr_expstatsn),
+ "is %u, should be %u", ntohl(bhslr->bhslr_expstatsn),
conn->conn_statsn);
}
conn->conn_cmdsn = ntohl(bhslr->bhslr_cmdsn);
OpenPOWER on IntegriCloud