diff --git a/include/iscsi-private.h b/include/iscsi-private.h index 9d50d6a..d1d8d5e 100644 --- a/include/iscsi-private.h +++ b/include/iscsi-private.h @@ -360,8 +360,6 @@ void iscsi_add_to_outqueue(struct iscsi_context *iscsi, struct iscsi_pdu *pdu); int iscsi_serial32_compare(uint32_t s1, uint32_t s2); -void iscsi_adjust_statsn(struct iscsi_context *iscsi, struct iscsi_in_pdu *in); -void iscsi_adjust_maxexpcmdsn(struct iscsi_context *iscsi, struct iscsi_in_pdu *in); uint32_t iscsi_itt_post_increment(struct iscsi_context *iscsi); diff --git a/lib/iscsi-command.c b/lib/iscsi-command.c index 66f442b..81ed4f8 100644 --- a/lib/iscsi-command.c +++ b/lib/iscsi-command.c @@ -348,9 +348,6 @@ iscsi_process_scsi_reply(struct iscsi_context *iscsi, struct iscsi_pdu *pdu, struct iscsi_scsi_cbdata *scsi_cbdata = &pdu->scsi_cbdata; struct scsi_task *task = scsi_cbdata->task; - iscsi_adjust_statsn(iscsi, in); - iscsi_adjust_maxexpcmdsn(iscsi, in); - flags = in->hdr[1]; if ((flags&ISCSI_PDU_DATA_FINAL) == 0) { iscsi_set_error(iscsi, "scsi response pdu but Final bit is " @@ -487,9 +484,6 @@ iscsi_process_scsi_data_in(struct iscsi_context *iscsi, struct iscsi_pdu *pdu, struct scsi_task *task = scsi_cbdata->task; int dsl; - iscsi_adjust_statsn(iscsi, in); - iscsi_adjust_maxexpcmdsn(iscsi, in); - flags = in->hdr[1]; if ((flags&ISCSI_PDU_DATA_ACK_REQUESTED) != 0) { iscsi_set_error(iscsi, "scsi response asked for ACK " @@ -567,8 +561,6 @@ iscsi_process_r2t(struct iscsi_context *iscsi, struct iscsi_pdu *pdu, offset = scsi_get_uint32(&in->hdr[40]); len = scsi_get_uint32(&in->hdr[44]); - iscsi_adjust_maxexpcmdsn(iscsi, in); - pdu->datasn = 0; iscsi_send_data_out(iscsi, pdu, ttt, offset, len); return 0; diff --git a/lib/login.c b/lib/login.c index 7a2ed89..9b813d7 100644 --- a/lib/login.c +++ b/lib/login.c @@ -1049,9 +1049,7 @@ iscsi_process_login_reply(struct iscsi_context *iscsi, struct iscsi_pdu *pdu, if (!iscsi->current_phase && !iscsi->secneg_phase) { iscsi->statsn = scsi_get_uint32(&in->hdr[24]); } - iscsi_adjust_statsn(iscsi, in); } - iscsi_adjust_maxexpcmdsn(iscsi, in); /* Using bidirectional CHAP? Then we must see a chap_n and chap_r * field in this PDU @@ -1299,10 +1297,8 @@ iscsi_logout_async(struct iscsi_context *iscsi, iscsi_command_cb cb, int iscsi_process_logout_reply(struct iscsi_context *iscsi, struct iscsi_pdu *pdu, -struct iscsi_in_pdu *in) +struct iscsi_in_pdu *in _U_) { - iscsi_adjust_maxexpcmdsn(iscsi, in); - iscsi->is_loggedin = 0; ISCSI_LOG(iscsi, 2, "logout successful"); pdu->callback(iscsi, SCSI_STATUS_GOOD, NULL, pdu->private_data); diff --git a/lib/nop.c b/lib/nop.c index 80ac12f..548e73e 100644 --- a/lib/nop.c +++ b/lib/nop.c @@ -139,9 +139,6 @@ iscsi_process_nop_out_reply(struct iscsi_context *iscsi, struct iscsi_pdu *pdu, { struct iscsi_data data; - iscsi_adjust_maxexpcmdsn(iscsi, in); - iscsi_adjust_statsn(iscsi, in); - ISCSI_LOG(iscsi, (iscsi->nops_in_flight > 1) ? 1 : 6, "NOP-In received (pdu->itt %08x, pdu->ttt %08x, iscsi->maxcmdsn %08x, iscsi->expcmdsn %08x, iscsi->statsn %08x)", pdu->itt, 0xffffffff, iscsi->maxcmdsn, iscsi->expcmdsn, iscsi->statsn); diff --git a/lib/pdu.c b/lib/pdu.c index 775587f..5e9e67d 100644 --- a/lib/pdu.c +++ b/lib/pdu.c @@ -69,31 +69,6 @@ iscsi_itt_post_increment(struct iscsi_context *iscsi) { return old_itt; } -void iscsi_adjust_statsn(struct iscsi_context *iscsi, struct iscsi_in_pdu *in) { - uint32_t statsn = scsi_get_uint32(&in->hdr[24]); - uint32_t itt = scsi_get_uint32(&in->hdr[16]); - - if (itt == 0xffffffff) { - /* target will not increase statsn if itt == 0xffffffff */ - statsn--; - } - - if (iscsi_serial32_compare(statsn, iscsi->statsn) > 0) { - iscsi->statsn = statsn; - } -} - -void iscsi_adjust_maxexpcmdsn(struct iscsi_context *iscsi, struct iscsi_in_pdu *in) { - uint32_t maxcmdsn = scsi_get_uint32(&in->hdr[32]); - if (iscsi_serial32_compare(maxcmdsn, iscsi->maxcmdsn) > 0) { - iscsi->maxcmdsn = maxcmdsn; - } - uint32_t expcmdsn = scsi_get_uint32(&in->hdr[28]); - if (iscsi_serial32_compare(expcmdsn, iscsi->expcmdsn) > 0) { - iscsi->expcmdsn = expcmdsn; - } -} - void iscsi_dump_pdu_header(struct iscsi_context *iscsi, unsigned char *data) { char dump[ISCSI_RAW_HEADER_SIZE*3+1]={0}; int i; @@ -323,9 +298,6 @@ int iscsi_process_target_nop_in(struct iscsi_context *iscsi, uint32_t itt = scsi_get_uint32(&in->hdr[16]); uint32_t lun = scsi_get_uint16(&in->hdr[8]); - iscsi_adjust_statsn(iscsi, in); - iscsi_adjust_maxexpcmdsn(iscsi, in); - ISCSI_LOG(iscsi, (iscsi->nops_in_flight > 1) ? 1 : 6, "NOP-In received (pdu->itt %08x, pdu->ttt %08x, pdu->lun %8x, iscsi->maxcmdsn %08x, iscsi->expcmdsn %08x, iscsi->statsn %08x)", itt, ttt, lun, iscsi->maxcmdsn, iscsi->expcmdsn, iscsi->statsn); @@ -407,20 +379,35 @@ int iscsi_process_reject(struct iscsi_context *iscsi, int iscsi_process_pdu(struct iscsi_context *iscsi, struct iscsi_in_pdu *in) { - uint32_t itt; - enum iscsi_opcode opcode; + uint32_t itt = scsi_get_uint32(&in->hdr[16]); + uint32_t statsn = scsi_get_uint32(&in->hdr[24]); + uint32_t maxcmdsn = scsi_get_uint32(&in->hdr[32]); + uint32_t expcmdsn = scsi_get_uint32(&in->hdr[28]); + enum iscsi_opcode opcode = in->hdr[0] & 0x3f; + uint8_t ahslen = in->hdr[4]; struct iscsi_pdu *pdu; - uint8_t ahslen; - - opcode = in->hdr[0] & 0x3f; - ahslen = in->hdr[4]; - itt = scsi_get_uint32(&in->hdr[16]); if (ahslen != 0) { iscsi_set_error(iscsi, "cant handle expanded headers yet"); return -1; } + /* All target PDUs expect update the serials */ + if (itt == 0xffffffff) { + /* target will not increase statsn if itt == 0xffffffff */ + statsn--; + } + if (iscsi_serial32_compare(statsn, iscsi->statsn) > 0) { + iscsi->statsn = statsn; + } + + if (iscsi_serial32_compare(maxcmdsn, iscsi->maxcmdsn) > 0) { + iscsi->maxcmdsn = maxcmdsn; + } + if (iscsi_serial32_compare(expcmdsn, iscsi->expcmdsn) > 0) { + iscsi->expcmdsn = expcmdsn; + } + if (opcode == ISCSI_PDU_ASYNC_MSG) { uint8_t event = in->hdr[36]; uint16_t param1 = scsi_get_uint16(&in->hdr[38]); diff --git a/lib/task_mgmt.c b/lib/task_mgmt.c index 237ccad..a09da62 100644 --- a/lib/task_mgmt.c +++ b/lib/task_mgmt.c @@ -94,14 +94,9 @@ int iscsi_process_task_mgmt_reply(struct iscsi_context *iscsi, struct iscsi_pdu *pdu, struct iscsi_in_pdu *in) { - uint32_t response; - - response = in->hdr[2]; - - iscsi_adjust_maxexpcmdsn(iscsi, in); + uint32_t response = in->hdr[2]; pdu->callback(iscsi, SCSI_STATUS_GOOD, &response, pdu->private_data); - return 0; }