pdu: fix statsn and factor out sn comparision
Signed-off-by: Peter Lieven <pl@kamp.de>
This commit is contained in:
@@ -349,11 +349,11 @@ iscsi_log_message(struct iscsi_context *iscsi, int level, const char *format, ..
|
|||||||
void
|
void
|
||||||
iscsi_add_to_outqueue(struct iscsi_context *iscsi, struct iscsi_pdu *pdu);
|
iscsi_add_to_outqueue(struct iscsi_context *iscsi, struct iscsi_pdu *pdu);
|
||||||
|
|
||||||
int
|
int iscsi_serial32_compare(uint32_t s1, uint32_t s2);
|
||||||
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
|
uint32_t iscsi_itt_post_increment(struct iscsi_context *iscsi);
|
||||||
iscsi_itt_post_increment(struct iscsi_context *iscsi);
|
|
||||||
|
|
||||||
void iscsi_timeout_scan(struct iscsi_context *iscsi);
|
void iscsi_timeout_scan(struct iscsi_context *iscsi);
|
||||||
|
|
||||||
|
|||||||
@@ -347,23 +347,12 @@ int
|
|||||||
iscsi_process_scsi_reply(struct iscsi_context *iscsi, struct iscsi_pdu *pdu,
|
iscsi_process_scsi_reply(struct iscsi_context *iscsi, struct iscsi_pdu *pdu,
|
||||||
struct iscsi_in_pdu *in)
|
struct iscsi_in_pdu *in)
|
||||||
{
|
{
|
||||||
uint32_t statsn, maxcmdsn, expcmdsn, flags, status;
|
uint32_t flags, status;
|
||||||
struct iscsi_scsi_cbdata *scsi_cbdata = &pdu->scsi_cbdata;
|
struct iscsi_scsi_cbdata *scsi_cbdata = &pdu->scsi_cbdata;
|
||||||
struct scsi_task *task = scsi_cbdata->task;
|
struct scsi_task *task = scsi_cbdata->task;
|
||||||
|
|
||||||
statsn = scsi_get_uint32(&in->hdr[24]);
|
iscsi_adjust_statsn(iscsi, in);
|
||||||
if (statsn > iscsi->statsn) {
|
iscsi_adjust_maxexpcmdsn(iscsi, in);
|
||||||
iscsi->statsn = statsn;
|
|
||||||
}
|
|
||||||
|
|
||||||
maxcmdsn = scsi_get_uint32(&in->hdr[32]);
|
|
||||||
if (iscsi_serial32_compare(maxcmdsn, iscsi->maxcmdsn) > 0) {
|
|
||||||
iscsi->maxcmdsn = maxcmdsn;
|
|
||||||
}
|
|
||||||
expcmdsn = scsi_get_uint32(&in->hdr[28]);
|
|
||||||
if (iscsi_serial32_compare(expcmdsn, iscsi->expcmdsn) > 0) {
|
|
||||||
iscsi->expcmdsn = expcmdsn;
|
|
||||||
}
|
|
||||||
|
|
||||||
flags = in->hdr[1];
|
flags = in->hdr[1];
|
||||||
if ((flags&ISCSI_PDU_DATA_FINAL) == 0) {
|
if ((flags&ISCSI_PDU_DATA_FINAL) == 0) {
|
||||||
@@ -489,24 +478,13 @@ int
|
|||||||
iscsi_process_scsi_data_in(struct iscsi_context *iscsi, struct iscsi_pdu *pdu,
|
iscsi_process_scsi_data_in(struct iscsi_context *iscsi, struct iscsi_pdu *pdu,
|
||||||
struct iscsi_in_pdu *in, int *is_finished)
|
struct iscsi_in_pdu *in, int *is_finished)
|
||||||
{
|
{
|
||||||
uint32_t statsn, maxcmdsn, expcmdsn, flags, status;
|
uint32_t flags, status;
|
||||||
struct iscsi_scsi_cbdata *scsi_cbdata = &pdu->scsi_cbdata;
|
struct iscsi_scsi_cbdata *scsi_cbdata = &pdu->scsi_cbdata;
|
||||||
struct scsi_task *task = scsi_cbdata->task;
|
struct scsi_task *task = scsi_cbdata->task;
|
||||||
int dsl;
|
int dsl;
|
||||||
|
|
||||||
statsn = scsi_get_uint32(&in->hdr[24]);
|
iscsi_adjust_statsn(iscsi, in);
|
||||||
if (statsn > iscsi->statsn) {
|
iscsi_adjust_maxexpcmdsn(iscsi, in);
|
||||||
iscsi->statsn = statsn;
|
|
||||||
}
|
|
||||||
|
|
||||||
maxcmdsn = scsi_get_uint32(&in->hdr[32]);
|
|
||||||
if (iscsi_serial32_compare(maxcmdsn, iscsi->maxcmdsn) > 0) {
|
|
||||||
iscsi->maxcmdsn = maxcmdsn;
|
|
||||||
}
|
|
||||||
expcmdsn = scsi_get_uint32(&in->hdr[28]);
|
|
||||||
if (iscsi_serial32_compare(expcmdsn, iscsi->expcmdsn) > 0) {
|
|
||||||
iscsi->expcmdsn = expcmdsn;
|
|
||||||
}
|
|
||||||
|
|
||||||
flags = in->hdr[1];
|
flags = in->hdr[1];
|
||||||
if ((flags&ISCSI_PDU_DATA_ACK_REQUESTED) != 0) {
|
if ((flags&ISCSI_PDU_DATA_ACK_REQUESTED) != 0) {
|
||||||
@@ -579,20 +557,13 @@ int
|
|||||||
iscsi_process_r2t(struct iscsi_context *iscsi, struct iscsi_pdu *pdu,
|
iscsi_process_r2t(struct iscsi_context *iscsi, struct iscsi_pdu *pdu,
|
||||||
struct iscsi_in_pdu *in)
|
struct iscsi_in_pdu *in)
|
||||||
{
|
{
|
||||||
uint32_t ttt, offset, len, maxcmdsn, expcmdsn;
|
uint32_t ttt, offset, len;
|
||||||
|
|
||||||
ttt = scsi_get_uint32(&in->hdr[20]);
|
ttt = scsi_get_uint32(&in->hdr[20]);
|
||||||
offset = scsi_get_uint32(&in->hdr[40]);
|
offset = scsi_get_uint32(&in->hdr[40]);
|
||||||
len = scsi_get_uint32(&in->hdr[44]);
|
len = scsi_get_uint32(&in->hdr[44]);
|
||||||
|
|
||||||
maxcmdsn = scsi_get_uint32(&in->hdr[32]);
|
iscsi_adjust_maxexpcmdsn(iscsi, in);
|
||||||
if (iscsi_serial32_compare(maxcmdsn, iscsi->maxcmdsn) > 0) {
|
|
||||||
iscsi->maxcmdsn = maxcmdsn;
|
|
||||||
}
|
|
||||||
expcmdsn = scsi_get_uint32(&in->hdr[28]);
|
|
||||||
if (iscsi_serial32_compare(expcmdsn, iscsi->expcmdsn) > 0) {
|
|
||||||
iscsi->expcmdsn = expcmdsn;
|
|
||||||
}
|
|
||||||
|
|
||||||
pdu->datasn = 0;
|
pdu->datasn = 0;
|
||||||
iscsi_send_data_out(iscsi, pdu, ttt, offset, len);
|
iscsi_send_data_out(iscsi, pdu, ttt, offset, len);
|
||||||
|
|||||||
25
lib/login.c
25
lib/login.c
@@ -965,22 +965,14 @@ int
|
|||||||
iscsi_process_login_reply(struct iscsi_context *iscsi, struct iscsi_pdu *pdu,
|
iscsi_process_login_reply(struct iscsi_context *iscsi, struct iscsi_pdu *pdu,
|
||||||
struct iscsi_in_pdu *in)
|
struct iscsi_in_pdu *in)
|
||||||
{
|
{
|
||||||
uint32_t status, maxcmdsn, expcmdsn;
|
uint32_t status;
|
||||||
char *ptr = (char *)in->data;
|
char *ptr = (char *)in->data;
|
||||||
int size = in->data_pos;
|
int size = in->data_pos;
|
||||||
|
|
||||||
status = scsi_get_uint16(&in->hdr[36]);
|
status = scsi_get_uint16(&in->hdr[36]);
|
||||||
|
|
||||||
iscsi->statsn = scsi_get_uint16(&in->hdr[24]);
|
iscsi_adjust_statsn(iscsi, in);
|
||||||
|
iscsi_adjust_maxexpcmdsn(iscsi, in);
|
||||||
maxcmdsn = scsi_get_uint32(&in->hdr[32]);
|
|
||||||
if (iscsi_serial32_compare(maxcmdsn, iscsi->maxcmdsn) > 0) {
|
|
||||||
iscsi->maxcmdsn = maxcmdsn;
|
|
||||||
}
|
|
||||||
expcmdsn = scsi_get_uint32(&in->hdr[28]);
|
|
||||||
if (iscsi_serial32_compare(expcmdsn, iscsi->expcmdsn) > 0) {
|
|
||||||
iscsi->expcmdsn = expcmdsn;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* XXX here we should parse the data returned in case the target
|
/* XXX here we should parse the data returned in case the target
|
||||||
* renegotiated some some parameters.
|
* renegotiated some some parameters.
|
||||||
@@ -1176,16 +1168,7 @@ int
|
|||||||
iscsi_process_logout_reply(struct iscsi_context *iscsi, struct iscsi_pdu *pdu,
|
iscsi_process_logout_reply(struct iscsi_context *iscsi, struct iscsi_pdu *pdu,
|
||||||
struct iscsi_in_pdu *in)
|
struct iscsi_in_pdu *in)
|
||||||
{
|
{
|
||||||
uint32_t maxcmdsn, expcmdsn;
|
iscsi_adjust_maxexpcmdsn(iscsi, in);
|
||||||
|
|
||||||
maxcmdsn = scsi_get_uint32(&in->hdr[32]);
|
|
||||||
if (iscsi_serial32_compare(maxcmdsn, iscsi->maxcmdsn) > 0) {
|
|
||||||
iscsi->maxcmdsn = maxcmdsn;
|
|
||||||
}
|
|
||||||
expcmdsn = scsi_get_uint32(&in->hdr[28]);
|
|
||||||
if (iscsi_serial32_compare(expcmdsn, iscsi->expcmdsn) > 0) {
|
|
||||||
iscsi->expcmdsn = expcmdsn;
|
|
||||||
}
|
|
||||||
|
|
||||||
iscsi->is_loggedin = 0;
|
iscsi->is_loggedin = 0;
|
||||||
pdu->callback(iscsi, SCSI_STATUS_GOOD, NULL, pdu->private_data);
|
pdu->callback(iscsi, SCSI_STATUS_GOOD, NULL, pdu->private_data);
|
||||||
|
|||||||
31
lib/pdu.c
31
lib/pdu.c
@@ -69,6 +69,31 @@ iscsi_itt_post_increment(struct iscsi_context *iscsi) {
|
|||||||
return old_itt;
|
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) {
|
void iscsi_dump_pdu_header(struct iscsi_context *iscsi, unsigned char *data) {
|
||||||
char dump[ISCSI_RAW_HEADER_SIZE*3+1]={0};
|
char dump[ISCSI_RAW_HEADER_SIZE*3+1]={0};
|
||||||
int i;
|
int i;
|
||||||
@@ -297,14 +322,10 @@ int iscsi_process_target_nop_in(struct iscsi_context *iscsi,
|
|||||||
struct iscsi_in_pdu *in)
|
struct iscsi_in_pdu *in)
|
||||||
{
|
{
|
||||||
uint32_t ttt;
|
uint32_t ttt;
|
||||||
uint32_t statsn;
|
|
||||||
|
|
||||||
ttt = scsi_get_uint32(&in->hdr[20]);
|
ttt = scsi_get_uint32(&in->hdr[20]);
|
||||||
|
|
||||||
statsn = scsi_get_uint32(&in->hdr[24]);
|
iscsi_adjust_statsn(iscsi, in);
|
||||||
if (statsn > iscsi->statsn) {
|
|
||||||
iscsi->statsn = statsn;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* if the server does not want a response */
|
/* if the server does not want a response */
|
||||||
if (ttt == 0xffffffff) {
|
if (ttt == 0xffffffff) {
|
||||||
|
|||||||
@@ -92,18 +92,11 @@ int
|
|||||||
iscsi_process_task_mgmt_reply(struct iscsi_context *iscsi, struct iscsi_pdu *pdu,
|
iscsi_process_task_mgmt_reply(struct iscsi_context *iscsi, struct iscsi_pdu *pdu,
|
||||||
struct iscsi_in_pdu *in)
|
struct iscsi_in_pdu *in)
|
||||||
{
|
{
|
||||||
uint32_t response, maxcmdsn, expcmdsn;
|
uint32_t response;
|
||||||
|
|
||||||
response = in->hdr[2];
|
response = in->hdr[2];
|
||||||
|
|
||||||
maxcmdsn = scsi_get_uint32(&in->hdr[32]);
|
iscsi_adjust_maxexpcmdsn(iscsi, in);
|
||||||
if (iscsi_serial32_compare(maxcmdsn, iscsi->maxcmdsn) > 0) {
|
|
||||||
iscsi->maxcmdsn = maxcmdsn;
|
|
||||||
}
|
|
||||||
expcmdsn = scsi_get_uint32(&in->hdr[28]);
|
|
||||||
if (iscsi_serial32_compare(expcmdsn, iscsi->expcmdsn) > 0) {
|
|
||||||
iscsi->expcmdsn = expcmdsn;
|
|
||||||
}
|
|
||||||
|
|
||||||
pdu->callback(iscsi, SCSI_STATUS_GOOD, &response, pdu->private_data);
|
pdu->callback(iscsi, SCSI_STATUS_GOOD, &response, pdu->private_data);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user