diff --git a/include/iscsi-private.h b/include/iscsi-private.h index 3307250..07b8ee5 100644 --- a/include/iscsi-private.h +++ b/include/iscsi-private.h @@ -95,6 +95,7 @@ struct iscsi_context { int is_loggedin; int is_reconnecting; int bind_interfaces_cnt; + int nops_in_flight; int chap_a; int chap_i; @@ -122,7 +123,7 @@ struct iscsi_context { int no_auto_reconnect; int reconnect_deferred; int reconnect_max_retries; - + int log_level; iscsi_log_fn log_fn; diff --git a/include/iscsi.h b/include/iscsi.h index 162756d..971393f 100644 --- a/include/iscsi.h +++ b/include/iscsi.h @@ -35,6 +35,7 @@ struct sockaddr; /* FEATURES */ #define LIBISCSI_FEATURE_IOVECTOR (1) +#define LIBISCSI_FEATURE_NOP_COUNTER (1) #define MAX_STRING_SIZE (255) @@ -474,10 +475,17 @@ struct iscsi_discovery_address { * structure containing the data returned from * the server. * ISCSI_STATUS_CANCELLED: Discovery was aborted. Command_data is NULL. + * + * The callback may be NULL if you only want to let libiscsi count the in-flight + * NOPs. */ EXTERN int iscsi_nop_out_async(struct iscsi_context *iscsi, iscsi_command_cb cb, unsigned char *data, int len, void *private_data); + +/* read out the number of consecutive nop outs that did not receive an answer */ +EXTERN int iscsi_get_nops_in_flight(struct iscsi_context *iscsi); + struct scsi_task; enum iscsi_task_mgmt_funcs { diff --git a/lib/libiscsi.def b/lib/libiscsi.def index b7220da..5e8bedf 100644 --- a/lib/libiscsi.def +++ b/lib/libiscsi.def @@ -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 diff --git a/lib/libiscsi.syms b/lib/libiscsi.syms index 5e410c4..8c1f0a8 100644 --- a/lib/libiscsi.syms +++ b/lib/libiscsi.syms @@ -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 diff --git a/lib/nop.c b/lib/nop.c index 102df7c..597fe7c 100644 --- a/lib/nop.c +++ b/lib/nop.c @@ -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; +}