Ethereal-dev: [Ethereal-dev] Update on packet-scsi

Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.

From: Ming Zhang <mingz@xxxxxxxxxxx>
Date: Mon, 06 Mar 2006 14:55:16 -0500
Update on dissector packet-scsi

* modepage processing for MMC
* support cmd Get Event Status Notification
* support cmd start stop unit for mmc

 packet-scsi.c |   71 ++++++++++++++++++++++++++++++++++++--
 1 files changed, 69 insertions(+), 2 deletions(-)


pls apply. thanks.

Ming

Index: epan/dissectors/packet-scsi.c
===================================================================
--- epan/dissectors/packet-scsi.c	(revision 17482)
+++ epan/dissectors/packet-scsi.c	(working copy)
@@ -115,6 +115,7 @@ static int hf_scsi_spcpagecode          
 static int hf_scsi_sbcpagecode           = -1;
 static int hf_scsi_sscpagecode           = -1;
 static int hf_scsi_smcpagecode           = -1;
+static int hf_scsi_mmcpagecode           = -1;
 static int hf_scsi_modesns_flags         = -1;
 static int hf_scsi_persresvin_svcaction  = -1;
 static int hf_scsi_persresvout_svcaction = -1;
@@ -503,6 +504,7 @@ static const value_string scsi_sbc2_val[
 #define SCSI_MMC_SYNCHRONIZECACHE       0x35
 #define SCSI_MMC_READTOCPMAATIP         0x43
 #define SCSI_MMC_GETCONFIGURATION       0x46
+#define SCSI_MMC_GETEVENTSTATUSNOTIFY   0x4a
 #define SCSI_MMC_READDISCINFORMATION    0x51
 #define SCSI_MMC_READTRACKINFORMATION   0x52
 #define SCSI_MMC_RESERVETRACK           0x53
@@ -512,12 +514,14 @@ static const value_string scsi_sbc2_val[
 #define SCSI_MMC_WRITE12                0xaa
 #define SCSI_MMC_SETSTREAMING           0xb6
 static const value_string scsi_mmc_val[] = {
+    {SCSI_SBC2_STARTSTOPUNIT, "Start Stop Unit"},
     {SCSI_MMC_READCAPACITY10,	"Read Capacity(10)"},
     {SCSI_MMC_READ10,		"Read(10)"},
     {SCSI_MMC_WRITE10,		"Write(10)"},
     {SCSI_MMC_SYNCHRONIZECACHE,	"Synchronize Cache"},
     {SCSI_MMC_READTOCPMAATIP,	"Read TOC/PMA/ATIP"},
     {SCSI_MMC_GETCONFIGURATION,	"Get Configuraion"},
+    {SCSI_MMC_GETEVENTSTATUSNOTIFY, "Get Event Status Notification"},
     {SCSI_MMC_READDISCINFORMATION, "Read Disc Information"},
     {SCSI_MMC_READTRACKINFORMATION, "Read Track Information"},
     {SCSI_MMC_RESERVETRACK,	"Reserve Track"},
@@ -772,6 +776,14 @@ static const value_string scsi_smc2_mode
     {0, NULL},
 };
 
+#define SCSI_MMC3_MODEPAGE_MMCAP   0x2A  /* device capabilities */
+
+static const value_string scsi_mmc5_modepage_val[] = {
+    {SCSI_MMC3_MODEPAGE_MMCAP,   "MM Capabilities and Mechanical Status"},
+    {0x3F,                        "Return All Mode Pages"},
+    {0, NULL},
+};
+
 #define SCSI_SPC2_RESVIN_SVCA_RDKEYS 0
 #define SCSI_SPC2_RESVIN_SVCA_RDRESV 1
 
@@ -2490,6 +2502,19 @@ dissect_scsi_ssc2_modepage (tvbuff_t *tv
 }
 
 static gboolean
+dissect_scsi_mmc5_modepage (tvbuff_t *tvb, packet_info *pinfo _U_,
+		            proto_tree *tree, guint offset, guint8 pcode)
+{
+    switch (pcode) {
+    case SCSI_MMC3_MODEPAGE_MMCAP:
+        break;
+    default:
+        return FALSE;
+    }
+    return TRUE;
+}
+
+static gboolean
 dissect_scsi_smc2_modepage (tvbuff_t *tvb, packet_info *pinfo _U_,
 		            proto_tree *tree, guint offset, guint8 pcode)
 {
@@ -2638,6 +2663,12 @@ dissect_scsi_modepage (tvbuff_t *tvb, pa
             dissect_modepage = dissect_scsi_smc2_modepage;
             break;
 
+        case SCSI_DEV_CDROM:
+            modepage_val = scsi_mmc5_modepage_val;
+            hf_pagecode = hf_scsi_mmcpagecode;
+            dissect_modepage = dissect_scsi_mmc5_modepage;
+            break;
+
         default:
             /*
              * The "val_to_str()" lookup will fail in this table
@@ -2909,6 +2940,10 @@ dissect_scsi_pagecode (tvbuff_t *tvb, pa
             hf_pagecode = hf_scsi_smcpagecode;
             break;
 
+        case SCSI_DEV_CDROM:
+            hf_pagecode = hf_scsi_mmcpagecode;
+            break;
+
         default:
             hf_pagecode = hf_scsi_spcpagecode;
             break;
@@ -4113,6 +4148,35 @@ dissect_mmc4_getconfiguration (tvbuff_t 
     }
 }
 
+static void
+dissect_mmc4_geteventstatusnotification (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_)
+
+{
+    guint8 flags;
+
+    if (tree && isreq && iscdb) {
+        flags = tvb_get_guint8 (tvb, offset);
+        proto_tree_add_text (tree, tvb, offset, 1,
+                             "Polled: %u",
+                             flags & 0x01);
+
+        flags = tvb_get_guint8 (tvb, offset+3);
+        proto_tree_add_text (tree, tvb, offset+3, 1,
+                             "Notification Class Request: %u",
+                             flags);
+
+        proto_tree_add_item (tree, hf_scsi_alloclen16, tvb, offset+6, 2, 0);
+
+        flags = tvb_get_guint8 (tvb, offset+8);
+        proto_tree_add_uint_format (tree, hf_scsi_control, tvb, offset+8, 1,
+                                    flags,
+                                    "Vendor Unique = %u, NACA = %u, Link = %u",
+                                    flags & 0xC0, flags & 0x4, flags & 0x1);
+    }
+}
+
 static const value_string scsi_q_subchannel_adr_val[] = {
     {0x0,	"Q-Subchannel mode info not supplied"},
     {0x1,	"Q-Subchannel encodes current position data"},
@@ -6803,7 +6867,7 @@ static scsi_cdb_table_t mmc[256] = {
 /*MMC 0x18*/{NULL},
 /*MMC 0x19*/{NULL},
 /*MMC 0x1a*/{NULL},
-/*MMC 0x1b*/{NULL},
+/*MMC 0x1b*/{dissect_sbc2_startstopunit},
 /*MMC 0x1c*/{NULL},
 /*MMC 0x1d*/{NULL},
 /*MMC 0x1e*/{NULL},
@@ -6850,7 +6914,7 @@ static scsi_cdb_table_t mmc[256] = {
 /*MMC 0x47*/{NULL},
 /*MMC 0x48*/{NULL},
 /*MMC 0x49*/{NULL},
-/*MMC 0x4a*/{NULL},
+/*MMC 0x4a*/{dissect_mmc4_geteventstatusnotification},
 /*MMC 0x4b*/{NULL},
 /*MMC 0x4c*/{NULL},
 /*MMC 0x4d*/{NULL},
@@ -7354,6 +7418,9 @@ proto_register_scsi (void)
         { &hf_scsi_sscpagecode,
           {"SSC-2 Page Code", "scsi.mode.ssc.pagecode", FT_UINT8, BASE_HEX,
            VALS (scsi_ssc2_modepage_val), 0x3F, "", HFILL}},
+        { &hf_scsi_mmcpagecode,
+          {"MMC-5 Page Code", "scsi.mode.mmc.pagecode", FT_UINT8, BASE_HEX,
+           VALS (scsi_mmc5_modepage_val), 0x3F, "", HFILL}},
         { &hf_scsi_smcpagecode,
           {"SMC-2 Page Code", "scsi.mode.smc.pagecode", FT_UINT8, BASE_HEX,
            VALS (scsi_smc2_modepage_val), 0x3F, "", HFILL}},