NOP count in flight of client generated NOP-Outs

This patch adds the abilitiy to libiscsi to count the number
of consecutive outstanding NOPs.

With this ability its fairly easy to implement a keepalive
check with NOPs in your application.

Periodically (e.g. every 5 secs) create a NOP-Out with:

iscsi_nop_out_async(iscsi, NULL, NULL, 0, NULL);

At that time check the number of consecutive missing NOP-Ins
with

iscsi_get_nops_in_flight(iscsi) > N.

Where N is the number of missing NOP-Ins you will allow.
Please note that it is legitime for the Target to ignore
a NOP if the load is very high as those packet are mark
as IMMEDIATE.

Signed-off-by: Peter Lieven <pl@kamp.de>
This commit is contained in:
Peter Lieven
2012-12-06 10:03:01 +01:00
parent d1344a666b
commit 237729545a
5 changed files with 26 additions and 1 deletions

View File

@@ -14,6 +14,7 @@ iscsi_get_fd
iscsi_get_lba_status_sync
iscsi_get_lba_status_task
iscsi_get_target_address
iscsi_get_nops_in_flight
iscsi_inquiry_sync
iscsi_inquiry_task
iscsi_is_logged_in

View File

@@ -12,6 +12,7 @@ iscsi_get_fd
iscsi_get_lba_status_sync
iscsi_get_lba_status_task
iscsi_get_target_address
iscsi_get_nops_in_flight
iscsi_inquiry_sync
iscsi_inquiry_task
iscsi_is_logged_in

View File

@@ -81,6 +81,8 @@ iscsi_nop_out_async(struct iscsi_context *iscsi, iscsi_command_cb cb,
return -1;
}
iscsi->nops_in_flight++;
return 0;
}
@@ -130,6 +132,12 @@ iscsi_process_nop_out_reply(struct iscsi_context *iscsi, struct iscsi_pdu *pdu,
{
struct iscsi_data data;
iscsi->nops_in_flight = 0;
if (pdu->callback == NULL) {
return 0;
}
data.data = NULL;
data.size = 0;
@@ -137,7 +145,13 @@ iscsi_process_nop_out_reply(struct iscsi_context *iscsi, struct iscsi_pdu *pdu,
data.data = in->data;
data.size = in->data_pos;
}
pdu->callback(iscsi, SCSI_STATUS_GOOD, &data, pdu->private_data);
return 0;
}
int iscsi_get_nops_in_flight(struct iscsi_context *iscsi)
{
return iscsi->nops_in_flight;
}