diff --git a/include/iscsi.h b/include/iscsi.h
index 70b6dd6..a890fc2 100644
--- a/include/iscsi.h
+++ b/include/iscsi.h
@@ -15,12 +15,13 @@
along with this program; if not, see .
*/
+#include
+
+
struct iscsi_context;
struct sockaddr;
-
-
/*
* The following three functions are used to integrate libiscsi in an event
* system.
@@ -147,8 +148,8 @@ enum iscsi_session_type {
};
/*
* Set the session type for a scsi context.
- * Session type can only be set/changed while the iscsi context is not
- * logged in to a target.
+ * Session type can only be set/changed before the context
+ * is logged in to the target.
*
* Returns:
* 0: success
@@ -170,8 +171,8 @@ enum iscsi_header_digest {
/*
* Set the desired header digest for a scsi context.
- * Header digest can only be set/changed while the iscsi context is not
- * logged in to a target.
+ * Header digest can only be set/changed before the context
+ * is logged in to the target.
*
* Returns:
* 0: success
@@ -429,6 +430,24 @@ struct iscsi_data {
unsigned char *data;
};
+
+/*
+ * These functions will set the ISID type and value.
+ * By default, contexts will automatically be assigned a 'random'
+ * type and value on creation, but this can be overridden
+ * by an appplication using these functions.
+ *
+ * Setting the ISID can only be done before loggin in to the target.
+ */
+int
+iscsi_set_isid_oui(struct iscsi_context *iscsi, uint32_t oui, uint32_t qualifier);
+int
+iscsi_set_isid_en(struct iscsi_context *iscsi, uint32_t en, uint32_t qualifier);
+int
+iscsi_set_isid_random(struct iscsi_context *iscsi, uint32_t rnd, uint32_t qualifier);
+int
+iscsi_set_isid_reserved(struct iscsi_context *iscsi);
+
/*
* Async commands for SCSI
*/
@@ -494,5 +513,3 @@ struct scsi_task *
iscsi_synchronizecache10_sync(struct iscsi_context *iscsi, int lun, int lba,
int num_blocks, int syncnv, int immed);
-int
-iscsi_set_isid_random(struct iscsi_context *iscsi, int rnd);
diff --git a/lib/init.c b/lib/init.c
index d0fb16c..e030fea 100644
--- a/lib/init.c
+++ b/lib/init.c
@@ -55,7 +55,7 @@ iscsi_create_context(const char *initiator_name)
iscsi->fd = -1;
/* initialize to a "random" isid */
- iscsi_set_isid_random(iscsi, getpid() ^ time(NULL));
+ iscsi_set_isid_random(iscsi, getpid() ^ time(NULL), 0);
/* assume we start in security negotiation phase */
iscsi->current_phase = ISCSI_PDU_LOGIN_CSG_SECNEG;
@@ -76,14 +76,60 @@ iscsi_create_context(const char *initiator_name)
}
int
-iscsi_set_isid_random(struct iscsi_context *iscsi, int rnd)
+iscsi_set_isid_oui(struct iscsi_context *iscsi, uint32_t oui, uint32_t qualifier)
+{
+ iscsi->isid[0] = (oui >> 16) & 0x3f;
+ iscsi->isid[1] = (oui >> 8) & 0xff;
+ iscsi->isid[2] = (oui ) & 0xff;
+
+ iscsi->isid[3] = (qualifier >> 16) & 0xff;
+ iscsi->isid[4] = (qualifier >> 8) & 0xff;
+ iscsi->isid[5] = (qualifier ) & 0xff;
+
+ return 0;
+}
+
+int
+iscsi_set_isid_en(struct iscsi_context *iscsi, uint32_t en, uint32_t qualifier)
+{
+ iscsi->isid[0] = 0x40;
+
+ iscsi->isid[1] = (en >> 16) & 0xff;
+ iscsi->isid[2] = (en >> 8) & 0xff;
+ iscsi->isid[3] = (en ) & 0xff;
+
+ iscsi->isid[4] = (qualifier >> 8) & 0xff;
+ iscsi->isid[5] = (qualifier ) & 0xff;
+
+ return 0;
+}
+
+int
+iscsi_set_isid_random(struct iscsi_context *iscsi, uint32_t rnd, uint32_t qualifier)
{
iscsi->isid[0] = 0x80;
- iscsi->isid[1] = rnd&0xff;
- iscsi->isid[2] = rnd&0xff;
- iscsi->isid[3] = rnd&0xff;
- iscsi->isid[4] = 0;
- iscsi->isid[5] = 0;
+
+ iscsi->isid[1] = (rnd >> 16) & 0xff;
+ iscsi->isid[2] = (rnd >> 8) & 0xff;
+ iscsi->isid[3] = (rnd ) & 0xff;
+
+ iscsi->isid[4] = (qualifier >> 8) & 0xff;
+ iscsi->isid[5] = (qualifier ) & 0xff;
+
+ return 0;
+}
+
+
+int
+iscsi_set_isid_reserved(struct iscsi_context *iscsi)
+{
+ iscsi->isid[0] = 0xc0;
+
+ iscsi->isid[1] = 0x00;
+ iscsi->isid[2] = 0x00;
+ iscsi->isid[3] = 0x00;
+ iscsi->isid[4] = 0x00;
+ iscsi->isid[5] = 0x00;
return 0;
}