Treat the Peripheral Qualifier field the same way we treat the

Peripheral Device Type field, i.e. as a registered field that's a
bitfield with a value_string table.  Give it the correct bitmask.

Fix up some device type names, and add some additional ones from the 25
July 2002 SPC-3 draft.

Correctly adjust the length of the LUN list in the Report LUNs response
(subtract 8 from the payload length before comparing, don't subtract 8
from the resulting length after comparing and adjusting), and rename the
variable to reflect the fact that it's a length in bytes, not a number
of LUNs.

svn path=/trunk/; revision=7322
This commit is contained in:
Guy Harris 2003-03-08 08:02:20 +00:00
parent 0b1702c359
commit c6f038a787
2 changed files with 32 additions and 20 deletions

View File

@ -2,7 +2,7 @@
* Routines for decoding SCSI CDBs and responses
* Author: Dinesh G Dutt (ddutt@cisco.com)
*
* $Id: packet-scsi.c,v 1.25 2003/03/05 20:25:59 guy Exp $
* $Id: packet-scsi.c,v 1.26 2003/03/08 08:02:19 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -134,6 +134,7 @@ static int hf_scsi_rdwr10_xferlen = -1;
static int hf_scsi_readdefdata_flags = -1;
static int hf_scsi_cdb_defectfmt = -1;
static int hf_scsi_reassignblks_flags = -1;
static int hf_scsi_inq_qualifier = -1;
static int hf_scsi_inq_devtype = -1;
static int hf_scsi_inq_version = -1;
static int hf_scsi_rluns_lun = -1;
@ -593,13 +594,19 @@ static const value_string scsi_persresv_type_val[] = {
{0, NULL},
};
static const value_string scsi_qualifier_val[] = {
{0x0, "Device type is connected to logical unit"},
{0x1, "Device type is supported by server but is not connected to logical unit"},
{0x3, "Device type is not supported by server"},
};
static const value_string scsi_devtype_val[] = {
{SCSI_DEV_SBC , "Direct Access Device"},
{SCSI_DEV_SSC , "Sequential Access Device"},
{SCSI_DEV_PRNT , "Printer"},
{SCSI_DEV_PROC , "Processor"},
{SCSI_DEV_WORM , "WORM"},
{SCSI_DEV_CDROM , "CD ROM"},
{SCSI_DEV_CDROM , "CD-ROM"},
{SCSI_DEV_SCAN , "Scanner"},
{SCSI_DEV_OPTMEM, "Optical Memory"},
{SCSI_DEV_SMC , "Medium Changer"},
@ -607,8 +614,11 @@ static const value_string scsi_devtype_val[] = {
{SCSI_DEV_RAID , "Storage Array"},
{SCSI_DEV_SES , "Enclosure Services"},
{SCSI_DEV_RBC , "Simplified Block Device"},
{SCSI_DEV_OCRW , "OCRW"},
{SCSI_DEV_OSD , "OSD"},
{SCSI_DEV_OCRW , "Optical Card Reader/Writer"},
{SCSI_DEV_OSD , "Object-based Storage Device"},
{SCSI_DEV_ADC , "Automation/Drive Interface"},
{0x1E , "Well known logical unit"},
{SCSI_DEV_NOLUN , "Unknown or no device type"},
{0, NULL},
};
@ -1389,9 +1399,8 @@ dissect_scsi_evpd (tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
"Unknown (0x%08x)"));
evpd_tree = proto_item_add_subtree (ti, ett_scsi_page);
proto_tree_add_text (evpd_tree, tvb, offset, 1,
"Peripheral Qualifier: 0x%x",
(tvb_get_guint8 (tvb, offset) & 0xF0)>>4);
proto_tree_add_item (evpd_tree, hf_scsi_inq_qualifier, tvb, offset,
1, 0);
proto_tree_add_item (evpd_tree, hf_scsi_inq_devtype, tvb, offset,
1, 0);
proto_tree_add_text (evpd_tree, tvb, offset+1, 1,
@ -1472,9 +1481,8 @@ dissect_scsi_cmddt (tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
ti = proto_tree_add_text (tree, tvb, offset, plen, "Command Data");
cmdt_tree = proto_item_add_subtree (ti, ett_scsi_page);
proto_tree_add_text (cmdt_tree, tvb, offset, 1,
"Peripheral Qualifier: 0x%x",
(tvb_get_guint8 (tvb, offset) & 0xF0)>>4);
proto_tree_add_item (cmdt_tree, hf_scsi_inq_qualifier, tvb, offset,
1, 0);
proto_tree_add_item (cmdt_tree, hf_scsi_inq_devtype, tvb, offset,
1, 0);
proto_tree_add_text (cmdt_tree, tvb, offset+1, 1, "Support: %s",
@ -1573,8 +1581,8 @@ dissect_scsi_inquiry (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
return;
}
proto_tree_add_text (tree, tvb, offset, 1, "Peripheral Qualifier: 0x%x",
(tvb_get_guint8 (tvb, offset) & 0xF0)>>4);
proto_tree_add_item (tree, hf_scsi_inq_qualifier, tvb, offset,
1, 0);
proto_tree_add_item (tree, hf_scsi_inq_devtype, tvb, offset, 1, 0);
proto_tree_add_item (tree, hf_scsi_inq_version, tvb, offset+2, 1, 0);
@ -2892,7 +2900,7 @@ dissect_scsi_reportluns (tvbuff_t *tvb, packet_info *pinfo _U_,
gboolean iscdb, guint payload_len)
{
guint8 flags;
guint numelem, i;
guint listlen, i;
if (!tree)
return;
@ -2907,16 +2915,16 @@ dissect_scsi_reportluns (tvbuff_t *tvb, packet_info *pinfo _U_,
flags & 0xC0, flags & 0x4, flags & 0x1);
}
else if (!isreq) {
numelem = tvb_get_ntohl (tvb, offset);
listlen = tvb_get_ntohl (tvb, offset);
proto_tree_add_text (tree, tvb, offset, 4, "LUN List Length: %u",
numelem);
listlen);
offset += 8;
payload_len -= 8;
if (payload_len != 0) {
numelem = (numelem < payload_len) ? numelem : payload_len;
listlen = (listlen < payload_len) ? listlen : payload_len;
}
numelem -= 8;
for (i = 0; i < numelem/8; i++) {
for (i = 0; i < listlen/8; i++) {
if (!tvb_get_guint8 (tvb, offset))
proto_tree_add_item (tree, hf_scsi_rluns_lun, tvb, offset+1, 1,
0);
@ -4950,8 +4958,11 @@ proto_register_scsi (void)
{ &hf_scsi_reassignblks_flags,
{"Flags", "scsi.reassignblks.flags", FT_UINT8, BASE_HEX, NULL, 0x0, "",
HFILL}},
{ &hf_scsi_inq_qualifier,
{"Peripheral Qualifier", "scsi.inquiry.qualifier", FT_UINT8, BASE_HEX,
VALS (scsi_qualifier_val), 0xE0, "", HFILL}},
{ &hf_scsi_inq_devtype,
{"Device Type", "scsi.inquiry.devtype", FT_UINT8, BASE_HEX,
{"Peripheral Device Type", "scsi.inquiry.devtype", FT_UINT8, BASE_HEX,
VALS (scsi_devtype_val), 0x1F, "", HFILL}},
{ & hf_scsi_inq_version,
{"Version", "scsi.inquiry.version", FT_UINT8, BASE_HEX,

View File

@ -1,7 +1,7 @@
/* packet-scsi.h
* Author: Dinesh G Dutt (ddutt@cisco.com)
*
* $Id: packet-scsi.h,v 1.6 2003/03/05 07:41:24 guy Exp $
* $Id: packet-scsi.h,v 1.7 2003/03/08 08:02:20 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -53,6 +53,7 @@ extern const value_string scsi_status_val[];
#define SCSI_DEV_RBC 0xE
#define SCSI_DEV_OCRW 0xF
#define SCSI_DEV_OSD 0x11
#define SCSI_DEV_ADC 0x12
#define SCSI_DEV_NOLUN 0x1F
#define SCSI_DEV_BITS 0x1F /* the lower 5 bits indicate device type */