summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Brown2009-08-09 16:30:07 +0200
committerMichael Brown2009-08-10 20:30:41 +0200
commitd94479468010ba2f64bc8664585e9c3491129303 (patch)
treefb48575d8470301f17e2a6ecd997fba2f40cef0f
parent[scsi] Generalise iscsi_detached_command() to scsi_detached_command() (diff)
downloadipxe-d94479468010ba2f64bc8664585e9c3491129303.tar.gz
ipxe-d94479468010ba2f64bc8664585e9c3491129303.tar.xz
ipxe-d94479468010ba2f64bc8664585e9c3491129303.zip
[scsi] Generalise iscsi_parse_lun() to scsi_parse_lun()
-rw-r--r--src/drivers/block/scsi.c30
-rw-r--r--src/include/gpxe/iscsi.h10
-rw-r--r--src/include/gpxe/scsi.h18
-rw-r--r--src/net/tcp/iscsi.c38
4 files changed, 48 insertions, 48 deletions
diff --git a/src/drivers/block/scsi.c b/src/drivers/block/scsi.c
index 19f99f82..a51b3af6 100644
--- a/src/drivers/block/scsi.c
+++ b/src/drivers/block/scsi.c
@@ -19,6 +19,7 @@
FILE_LICENCE ( GPL2_OR_LATER );
#include <stddef.h>
+#include <stdlib.h>
#include <string.h>
#include <byteswap.h>
#include <errno.h>
@@ -334,3 +335,32 @@ int init_scsidev ( struct scsi_device *scsi ) {
return 0;
}
+
+/**
+ * Parse SCSI LUN
+ *
+ * @v lun_string LUN string representation
+ * @v lun LUN to fill in
+ * @ret rc Return status code
+ */
+int scsi_parse_lun ( const char *lun_string, struct scsi_lun *lun ) {
+ char *p;
+ int i;
+
+ memset ( lun, 0, sizeof ( *lun ) );
+ if ( lun_string ) {
+ p = ( char * ) lun_string;
+ for ( i = 0 ; i < 4 ; i++ ) {
+ lun->u16[i] = htons ( strtoul ( p, &p, 16 ) );
+ if ( *p == '\0' )
+ break;
+ if ( *p != '-' )
+ return -EINVAL;
+ p++;
+ }
+ if ( *p )
+ return -EINVAL;
+ }
+
+ return 0;
+}
diff --git a/src/include/gpxe/iscsi.h b/src/include/gpxe/iscsi.h
index 469911df..00717d2b 100644
--- a/src/include/gpxe/iscsi.h
+++ b/src/include/gpxe/iscsi.h
@@ -249,7 +249,7 @@ struct iscsi_bhs_scsi_command {
/** Segment lengths */
union iscsi_segment_lengths lengths;
/** SCSI Logical Unit Number */
- uint64_t lun;
+ struct scsi_lun lun;
/** Initiator Task Tag */
uint32_t itt;
/** Expected data transfer length */
@@ -344,7 +344,7 @@ struct iscsi_bhs_data_in {
/** Segment lengths */
union iscsi_segment_lengths lengths;
/** Logical Unit Number */
- uint64_t lun;
+ struct scsi_lun lun;
/** Initiator Task Tag */
uint32_t itt;
/** Target Transfer Tag */
@@ -392,7 +392,7 @@ struct iscsi_bhs_data_out {
/** Segment lengths */
union iscsi_segment_lengths lengths;
/** Logical Unit Number */
- uint64_t lun;
+ struct scsi_lun lun;
/** Initiator Task Tag */
uint32_t itt;
/** Target Transfer Tag */
@@ -428,7 +428,7 @@ struct iscsi_bhs_r2t {
/** Segment lengths */
union iscsi_segment_lengths lengths;
/** Logical Unit Number */
- uint64_t lun;
+ struct scsi_lun lun;
/** Initiator Task Tag */
uint32_t itt;
/** Target Transfer Tag */
@@ -507,7 +507,7 @@ struct iscsi_session {
/** Target IQN */
char *target_iqn;
/** Logical Unit Number (LUN) */
- uint64_t lun;
+ struct scsi_lun lun;
/** Target socket address (recorded only for iBFT) */
struct sockaddr target_sockaddr;
diff --git a/src/include/gpxe/scsi.h b/src/include/gpxe/scsi.h
index b8866234..9131a29a 100644
--- a/src/include/gpxe/scsi.h
+++ b/src/include/gpxe/scsi.h
@@ -240,16 +240,21 @@ struct scsi_command {
int rc;
};
+/** A SCSI LUN
+ *
+ * This is a four-level LUN as specified by SAM-2, in big-endian
+ * order.
+ */
+struct scsi_lun {
+ uint16_t u16[4];
+} __attribute__ (( packed ));
+
/** A SCSI device */
struct scsi_device {
/** Block device interface */
struct block_device blockdev;
- /** Logical unit number (LUN)
- *
- * This is a four-level LUN as specified by SAM-2, in
- * big-endian order.
- */
- uint64_t lun;
+ /** Logical unit number (LUN) */
+ struct scsi_lun lun;
/**
* Issue SCSI command
*
@@ -273,5 +278,6 @@ struct scsi_device {
extern int scsi_detached_command ( struct scsi_device *scsi,
struct scsi_command *command );
extern int init_scsidev ( struct scsi_device *scsi );
+extern int scsi_parse_lun ( const char *lun_string, struct scsi_lun *lun );
#endif /* _GPXE_SCSI_H */
diff --git a/src/net/tcp/iscsi.c b/src/net/tcp/iscsi.c
index 973718e0..74da05d6 100644
--- a/src/net/tcp/iscsi.c
+++ b/src/net/tcp/iscsi.c
@@ -1606,42 +1606,6 @@ enum iscsi_root_path_component {
};
/**
- * Parse iSCSI LUN
- *
- * @v iscsi iSCSI session
- * @v lun_string LUN string representation (as per RFC4173)
- * @ret rc Return status code
- */
-static int iscsi_parse_lun ( struct iscsi_session *iscsi,
- const char *lun_string ) {
- union {
- uint64_t u64;
- uint16_t u16[4];
- } lun;
- char *p;
- int i;
-
- memset ( &lun, 0, sizeof ( lun ) );
- if ( lun_string ) {
- p = ( char * ) lun_string;
-
- for ( i = 0 ; i < 4 ; i++ ) {
- lun.u16[i] = htons ( strtoul ( p, &p, 16 ) );
- if ( *p == '\0' )
- break;
- if ( *p != '-' )
- return -EINVAL;
- p++;
- }
- if ( *p )
- return -EINVAL;
- }
-
- iscsi->lun = lun.u64;
- return 0;
-}
-
-/**
* Parse iSCSI root path
*
* @v iscsi iSCSI session
@@ -1679,7 +1643,7 @@ static int iscsi_parse_root_path ( struct iscsi_session *iscsi,
iscsi->target_port = strtoul ( rp_comp[RP_PORT], NULL, 10 );
if ( ! iscsi->target_port )
iscsi->target_port = ISCSI_PORT;
- if ( ( rc = iscsi_parse_lun ( iscsi, rp_comp[RP_LUN] ) ) != 0 ) {
+ if ( ( rc = scsi_parse_lun ( rp_comp[RP_LUN], &iscsi->lun ) ) != 0 ) {
DBGC ( iscsi, "iSCSI %p invalid LUN \"%s\"\n",
iscsi, rp_comp[RP_LUN] );
return rc;