aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-scsi-sbc.c
diff options
context:
space:
mode:
authorRonnie Sahlberg <ronnie_sahlberg@ozemail.com.au>2012-07-14 02:19:32 +0000
committerRonnie Sahlberg <ronnie_sahlberg@ozemail.com.au>2012-07-14 02:19:32 +0000
commit285ee0f9b556293847f946237a3edd9d16c1b911 (patch)
tree4981369751dcb6c824395b0c4b0e7d8430bdbd20 /epan/dissectors/packet-scsi-sbc.c
parent33b0d13dec74240c3c4ec8245a554dbfe020a306 (diff)
Add support for SCSI SBC COMPARE_AND_WRITE opcode
svn path=/trunk/; revision=43709
Diffstat (limited to 'epan/dissectors/packet-scsi-sbc.c')
-rw-r--r--epan/dissectors/packet-scsi-sbc.c33
1 files changed, 32 insertions, 1 deletions
diff --git a/epan/dissectors/packet-scsi-sbc.c b/epan/dissectors/packet-scsi-sbc.c
index f0a30a84d3..249c1aae15 100644
--- a/epan/dissectors/packet-scsi-sbc.c
+++ b/epan/dissectors/packet-scsi-sbc.c
@@ -683,6 +683,36 @@ dissect_sbc_write16 (tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
}
}
+static void
+dissect_sbc_comparenwrite (tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree,
+ guint offset, gboolean isreq, gboolean iscdb,
+ guint payload_len _U_, scsi_task_data_t *cdata _U_)
+{
+ static const int *rdwr16_fields[] = {
+ &hf_scsi_sbc_wrprotect,
+ &hf_scsi_sbc_dpo,
+ &hf_scsi_sbc_fua,
+ &hf_scsi_sbc_fua_nv,
+ NULL
+ };
+
+ if (isreq && iscdb) {
+ if (check_col (pinfo->cinfo, COL_INFO))
+ col_append_fstr (pinfo->cinfo, COL_INFO, "(LBA: %" G_GINT64_MODIFIER "u, Len: %u)",
+ tvb_get_ntoh64 (tvb, offset+1),
+ tvb_get_ntohl (tvb, offset+9));
+ }
+
+ if (tree && isreq && iscdb) {
+ proto_tree_add_bitmask(tree, tvb, offset, hf_scsi_sbc_read_flags,
+ ett_scsi_rdwr, rdwr16_fields, ENC_BIG_ENDIAN);
+ proto_tree_add_item (tree, hf_scsi_sbc_rdwr16_lba, tvb, offset+1, 8, ENC_NA);
+ proto_tree_add_item (tree, hf_scsi_sbc_rdwr12_xferlen, tvb, offset+12, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_item (tree, hf_scsi_sbc_group, tvb, offset+13, 1, ENC_BIG_ENDIAN);
+ proto_tree_add_bitmask(tree, tvb, offset+14, hf_scsi_control,
+ ett_scsi_control, cdb_control_fields, ENC_BIG_ENDIAN);
+ }
+}
static const value_string scsi_ssu_pwrcnd_val[] = {
{0x0, "No Change"},
@@ -1444,6 +1474,7 @@ const value_string scsi_sbc_vals[] = {
{SCSI_SBC_WRITE12 , "Write(12)"},
{SCSI_SBC_WRITE16 , "Write(16)"},
{SCSI_SPC_WRITEBUFFER , "Write Buffer"},
+ {SCSI_SBC_COMPARENWRITE , "Compare & Write(16)"},
{SCSI_SBC_WRITENVERIFY10 , "Write & Verify(10)"},
{SCSI_SBC_WRITENVERIFY12 , "Write & Verify(12)"},
{SCSI_SBC_WRITENVERIFY16 , "Write & Verify(16)"},
@@ -1601,7 +1632,7 @@ scsi_cdb_table_t scsi_sbc_table[256] = {
/*SBC 0x86*/{NULL},
/*SBC 0x87*/{NULL},
/*SBC 0x88*/{dissect_sbc_read16},
-/*SBC 0x89*/{NULL},
+/*SBC 0x89*/{dissect_sbc_comparenwrite},
/*SBC 0x8a*/{dissect_sbc_write16},
/*SBC 0x8b*/{NULL},
/*SBC 0x8c*/{NULL},