start dissecting serviceactionin16

svn path=/trunk/; revision=13523
This commit is contained in:
Ronnie Sahlberg 2005-02-25 23:03:24 +00:00
parent 8802528974
commit 9087bf8e45
1 changed files with 102 additions and 20 deletions

View File

@ -265,7 +265,8 @@ static const value_string scsi_spc2_val[] = {
#define SCSI_SBC2_READ10 0x28
#define SCSI_SBC2_READ12 0xA8
#define SCSI_SBC2_READ16 0x88
#define SCSI_SBC2_READCAPACITY 0x25
#define SCSI_SBC2_READCAPACITY10 0x25
#define SCSI_SBC2_SERVICEACTIONIN16 0x9E
#define SCSI_SBC2_READDEFDATA10 0x37
#define SCSI_SBC2_READDEFDATA12 0xB7
#define SCSI_SBC2_READLONG 0x3E
@ -315,7 +316,8 @@ static const value_string scsi_sbc2_val[] = {
{SCSI_SBC2_READ10 , "Read(10)"},
{SCSI_SBC2_READ12 , "Read(12)"},
{SCSI_SBC2_READ16 , "Read(16)"},
{SCSI_SBC2_READCAPACITY , "Read Capacity"},
{SCSI_SBC2_READCAPACITY10, "Read Capacity(10)"},
{SCSI_SBC2_SERVICEACTIONIN16, "Service Action In(16)"},
{SCSI_SBC2_READDEFDATA10 , "Read Defect Data(10)"},
{SCSI_SBC2_READDEFDATA12 , "Read Defect Data(12)"},
{SCSI_SBC2_READLONG, "Read Long"},
@ -3321,7 +3323,7 @@ dissect_scsi_rdwr16 (tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
}
static void
dissect_scsi_readcapacity (tvbuff_t *tvb, packet_info *pinfo _U_,
dissect_scsi_readcapacity10 (tvbuff_t *tvb, packet_info *pinfo _U_,
proto_tree *tree, guint offset, gboolean isreq,
gboolean iscdb)
{
@ -3366,6 +3368,89 @@ dissect_scsi_readcapacity (tvbuff_t *tvb, packet_info *pinfo _U_,
}
}
#define SHORT_FORM_BLOCK_ID 0x00
#define SHORT_FORM_VENDOR_SPECIFIC 0x01
#define LONG_FORM 0x06
#define EXTENDED_FORM 0x08
#define SERVICE_READ_CAPACITY16 0x10
#define SERVICE_READ_LONG16 0x11
static const value_string service_action_vals[] = {
{SHORT_FORM_BLOCK_ID, "Short Form - Block ID"},
{SHORT_FORM_VENDOR_SPECIFIC, "Short Form - Vendor-Specific"},
{LONG_FORM, "Long Form"},
{EXTENDED_FORM, "Extended Form"},
{SERVICE_READ_CAPACITY16, "Read Capacity(16)"},
{SERVICE_READ_LONG16, "Read Long(16)"},
{0, NULL}
};
/* this is either readcapacity16 or readlong16 depending of what service
action is set to. for now we only implement readcapacity16
*/
static void
dissect_scsi_serviceactionin16 (tvbuff_t *tvb, packet_info *pinfo _U_,
proto_tree *tree, guint offset, gboolean isreq,
gboolean iscdb)
{
guint8 service_action, flags;
guint32 block_len;
guint64 len, tot_len;
char *un;
if (!tree)
return;
if (isreq && iscdb) {
service_action = tvb_get_guint8 (tvb, offset) & 0x1F;
/* we should store this one for later so the data in can be decoded */
switch(service_action){
case SERVICE_READ_CAPACITY16:
proto_tree_add_text (tree, tvb, offset, 1,
"Service Action: %s",
val_to_str (service_action,
service_action_vals,
"Unknown (0x%02x)"));
offset++;
proto_tree_add_text (tree, tvb, offset, 8,
"Logical Block Address: %" PRIu64,
tvb_get_ntoh64 (tvb, offset));
offset += 8;
proto_tree_add_item (tree, hf_scsi_alloclen32, tvb, offset, 4, 0);
offset += 4;
proto_tree_add_item (tree, hf_scsi_readcapacity_pmi, tvb, offset, 1, 0);
offset++;
flags = tvb_get_guint8 (tvb, offset);
proto_tree_add_uint_format (tree, hf_scsi_control, tvb, offset, 1,
flags,
"Vendor Unique = %u, NACA = %u, Link = %u",
flags & 0xC0, flags & 0x4, flags & 0x1);
offset++;
break;
};
} else if (!iscdb) {
/* assuming for now that all such data in PDUs are read capacity16 */
len = tvb_get_ntoh64 (tvb, offset);
block_len = tvb_get_ntohl (tvb, offset+8);
tot_len=((len/1024)*block_len)/1024; /*MB*/
un="MB";
if(tot_len>20000){
tot_len/=1024;
un="GB";
}
proto_tree_add_text (tree, tvb, offset, 8, "LBA: %" PRIu64 " (%" PRIu64 " %s)",
len, tot_len, un);
proto_tree_add_text (tree, tvb, offset+8, 4, "Block Length: %u bytes",
block_len);
}
}
static void
dissect_scsi_readdefdata10 (tvbuff_t *tvb, packet_info *pinfo _U_,
proto_tree *tree, guint offset, gboolean isreq,
@ -3638,19 +3723,6 @@ dissect_scsi_ssc2_readblocklimits (tvbuff_t *tvb, packet_info *pinfo _U_, proto_
}
}
#define SHORT_FORM_BLOCK_ID 0x00
#define SHORT_FORM_VENDOR_SPECIFIC 0x01
#define LONG_FORM 0x06
#define EXTENDED_FORM 0x08
static const value_string service_action_vals[] = {
{SHORT_FORM_BLOCK_ID, "Short Form - Block ID"},
{SHORT_FORM_VENDOR_SPECIFIC, "Short Form - Vendor-Specific"},
{LONG_FORM, "Long Form"},
{EXTENDED_FORM, "Extended Form"},
{0, NULL}
};
#define BCU 0x20
#define BYCU 0x10
#define MPU 0x08
@ -4618,8 +4690,13 @@ dissect_scsi_cdb (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
TRUE);
break;
case SCSI_SBC2_READCAPACITY:
dissect_scsi_readcapacity (tvb, pinfo, scsi_tree, offset+1,
case SCSI_SBC2_READCAPACITY10:
dissect_scsi_readcapacity10 (tvb, pinfo, scsi_tree, offset+1,
TRUE, TRUE);
break;
case SCSI_SBC2_SERVICEACTIONIN16:
dissect_scsi_serviceactionin16 (tvb, pinfo, scsi_tree, offset+1,
TRUE, TRUE);
break;
@ -4996,8 +5073,13 @@ dissect_scsi_payload (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
FALSE);
break;
case SCSI_SBC2_READCAPACITY:
dissect_scsi_readcapacity (tvb, pinfo, scsi_tree, offset,
case SCSI_SBC2_READCAPACITY10:
dissect_scsi_readcapacity10 (tvb, pinfo, scsi_tree, offset,
isreq, FALSE);
break;
case SCSI_SBC2_SERVICEACTIONIN16:
dissect_scsi_serviceactionin16 (tvb, pinfo, scsi_tree, offset,
isreq, FALSE);
break;