Target initiated NOP:

Initial support to try to respond to target initiated NOPs.
This commit is contained in:
Ronnie Sahlberg
2011-04-10 15:32:47 +10:00
parent cfe19486ee
commit ef846b0f30
3 changed files with 79 additions and 2 deletions

View File

@@ -178,7 +178,7 @@ iscsi_get_pdu_data_size(const unsigned char *hdr)
return size;
}
static enum iscsi_reject_reason {
enum iscsi_reject_reason {
ISCSI_REJECT_RESERVED = 0x01,
ISCSI_REJECT_DATA_DIGEST_ERROR = 0x02,
ISCSI_REJECT_SNACK_REJECT = 0x03,
@@ -225,6 +225,32 @@ static const char *iscsi_reject_reason_str(enum iscsi_reject_reason reason)
return "Unknown";
}
int iscsi_process_target_nop_in(struct iscsi_context *iscsi,
struct iscsi_in_pdu *in)
{
uint32_t itt, ttt;
uint32_t statsn;
itt = ntohl(*(uint32_t *)&in->hdr[16]);
ttt = ntohl(*(uint32_t *)&in->hdr[20]);
statsn = ntohl(*(uint32_t *)&in->hdr[24]);
if (statsn > iscsi->statsn) {
iscsi->statsn = statsn;
}
/* if the server does not want a response */
if (ttt == 0xffffffff) {
return 0;
}
iscsi_send_target_nop_out(iscsi, ttt);
return 0;
}
int iscsi_process_reject(struct iscsi_context *iscsi,
struct iscsi_in_pdu *in)
{
@@ -289,6 +315,13 @@ iscsi_process_pdu(struct iscsi_context *iscsi, struct iscsi_in_pdu *in)
return 0;
}
if (opcode == ISCSI_PDU_NOP_IN && itt == 0xffffffff) {
if (iscsi_process_target_nop_in(iscsi, in) != 0) {
return -1;
}
return 0;
}
for (pdu = iscsi->waitpdu; pdu; pdu = pdu->next) {
enum iscsi_opcode expected_response = pdu->response_opcode;
int is_finished = 1;