diff options
author | Ronnie Sahlberg <ronnie_sahlberg@ozemail.com.au> | 2006-11-27 14:50:23 +0000 |
---|---|---|
committer | Ronnie Sahlberg <ronnie_sahlberg@ozemail.com.au> | 2006-11-27 14:50:23 +0000 |
commit | 41c258daf35ef35ef34204827df1dc9cdd769f39 (patch) | |
tree | 0f2db6acaaac92b1e7a119847f0c63d05752ff66 /epan/dissectors/packet-scsi.c | |
parent | cc3567fabfd1cbdb61eb55779b571e5b1c293ba3 (diff) |
create a nice helper to dissect bitmasks and implement some test useage of it in the scsi dissector
svn path=/trunk/; revision=20002
Diffstat (limited to 'epan/dissectors/packet-scsi.c')
-rw-r--r-- | epan/dissectors/packet-scsi.c | 93 |
1 files changed, 35 insertions, 58 deletions
diff --git a/epan/dissectors/packet-scsi.c b/epan/dissectors/packet-scsi.c index f2e5a5737a..c3bf1ebe35 100644 --- a/epan/dissectors/packet-scsi.c +++ b/epan/dissectors/packet-scsi.c @@ -138,6 +138,7 @@ static int hf_scsi_release_flags = -1; static int hf_scsi_release_thirdpartyid = -1; static int hf_scsi_select_report = -1; static int hf_scsi_inq_add_len = -1; +static int hf_scsi_inq_peripheral = -1; static int hf_scsi_inq_qualifier = -1; static int hf_scsi_inq_vendor_id = -1; static int hf_scsi_inq_product_id = -1; @@ -181,6 +182,7 @@ static int hf_scsi_inq_tpc = -1; static int hf_scsi_inq_protect = -1; static int hf_scsi_inq_tpgs = -1; static int hf_scsi_inq_acaflags = -1; +static int hf_scsi_inq_rmbflags = -1; static int hf_scsi_inq_normaca = -1; static int hf_scsi_inq_hisup = -1; static int hf_scsi_inq_aerc = -1; @@ -210,7 +212,9 @@ static int hf_scsi_reassembled_in = -1; static gint ett_scsi = -1; static gint ett_scsi_page = -1; +static gint ett_scsi_inq_peripheral = -1; static gint ett_scsi_inq_acaflags = -1; +static gint ett_scsi_inq_rmbflags = -1; static gint ett_scsi_inq_sccsflags = -1; static gint ett_scsi_inq_bqueflags = -1; static gint ett_scsi_inq_reladrflags = -1; @@ -247,7 +251,6 @@ static const fragment_items scsi_frag_items = { }; - typedef guint32 scsi_cmnd_type; typedef guint32 scsi_device_type; @@ -1360,56 +1363,6 @@ static const value_string inq_rdf_vals[] = { { 0, NULL } }; -/* This dissects byte 3 of the SPC-3 standard INQ data (SPC-3 6.4.2) */ -static int -dissect_spc3_inq_acaflags(tvbuff_t *tvb, int offset, proto_tree *parent_tree) -{ - guint8 flags; - proto_item *item=NULL; - proto_tree *tree=NULL; - - if(parent_tree){ - item=proto_tree_add_item(parent_tree, hf_scsi_inq_acaflags, tvb, offset, 1, 0); - tree = proto_item_add_subtree (item, ett_scsi_inq_acaflags); - } - - flags=tvb_get_guint8 (tvb, offset); - - /* AERC (obsolete in spc3 and forward) */ - proto_tree_add_boolean(tree, hf_scsi_inq_aerc, tvb, offset, 1, flags); - if(flags&SCSI_INQ_ACAFLAGS_AERC){ - proto_item_append_text(item, " AERC"); - } - flags&=(~SCSI_INQ_ACAFLAGS_AERC); - - /* TRMTSK (obsolete in spc2 and forward) */ - proto_tree_add_boolean(tree, hf_scsi_inq_trmtsk, tvb, offset, 1, flags); - if(flags&SCSI_INQ_ACAFLAGS_TRMTSK){ - proto_item_append_text(item, " TrmTsk"); - } - flags&=(~SCSI_INQ_ACAFLAGS_TRMTSK); - - /* NormACA */ - proto_tree_add_boolean(tree, hf_scsi_inq_normaca, tvb, offset, 1, flags); - if(flags&SCSI_INQ_ACAFLAGS_NORMACA){ - proto_item_append_text(item, " NormACA"); - } - flags&=(~SCSI_INQ_ACAFLAGS_NORMACA); - - /* HiSup */ - proto_tree_add_boolean(tree, hf_scsi_inq_hisup, tvb, offset, 1, flags); - if(flags&SCSI_INQ_ACAFLAGS_HISUP){ - proto_item_append_text(item, " HiSup"); - } - flags&=(~SCSI_INQ_ACAFLAGS_HISUP); - - /* Response Data Format */ - proto_tree_add_item (tree, hf_scsi_inq_rdf, tvb, offset, 1, 0); - proto_item_append_text(item, " RDF:%s", val_to_str(flags&0x0f, inq_rdf_vals, "Unknown:%d")); - - offset+=1; - return offset; -} #define SCSI_INQ_SCCSFLAGS_SCCS 0x80 #define SCSI_INQ_SCCSFLAGS_ACC 0x40 @@ -1589,6 +1542,23 @@ dissect_spc3_inquiry (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 payload_len, scsi_task_data_t *cdata) { guint8 flags, i; + static const int *peripheal_fields[] = { + &hf_scsi_inq_qualifier, + &hf_scsi_inq_devtype, + NULL + }; + static const int *aca_fields[] = { + &hf_scsi_inq_aerc, /* obsolete in spc3 and forward */ + &hf_scsi_inq_trmtsk, /* obsolete in spc2 and forward */ + &hf_scsi_inq_normaca, + &hf_scsi_inq_hisup, + &hf_scsi_inq_rdf, + NULL + }; + static const int *rmb_fields[] = { + &hf_scsi_inq_rmb, + NULL + }; if (!isreq && (cdata == NULL || !(cdata->itlq->flags & 0x3)) && (tvb_length_remaining(tvb, offset)>=1) ) { @@ -1651,13 +1621,11 @@ dissect_spc3_inquiry (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, TRY_SCSI_CDB_ALLOC_LEN(pinfo, tvb, offset, cdata->itlq->alloc_len); /* Qualifier and DeviceType */ - 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_bitmask(tree, tvb, offset, hf_scsi_inq_peripheral, ett_scsi_inq_peripheral, peripheal_fields, FALSE); offset+=1; /* RMB */ - proto_tree_add_item(tree, hf_scsi_inq_rmb, tvb, offset, 1, 0); + proto_tree_add_bitmask(tree, tvb, offset, hf_scsi_inq_rmbflags, ett_scsi_inq_rmbflags, rmb_fields, FALSE); offset+=1; /* Version */ @@ -1665,7 +1633,8 @@ dissect_spc3_inquiry (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, offset+=1; /* aca flags */ - offset=dissect_spc3_inq_acaflags(tvb, offset, tree); + proto_tree_add_bitmask(tree, tvb, offset, hf_scsi_inq_acaflags, ett_scsi_inq_acaflags, aca_fields, FALSE); + offset+=1; /* Additional Length */ SET_SCSI_DATA_END(tvb_get_guint8(tvb, offset)+offset); @@ -4275,8 +4244,11 @@ proto_register_scsi (void) {"Additional Length", "scsi.inquiry.add_len", FT_UINT8, BASE_DEC, NULL, 0, "", HFILL}}, { &hf_scsi_inq_qualifier, - {"Peripheral Qualifier", "scsi.inquiry.qualifier", FT_UINT8, BASE_HEX, + {"Qualifier", "scsi.inquiry.qualifier", FT_UINT8, BASE_HEX, VALS (scsi_qualifier_val), 0xE0, "", HFILL}}, + { &hf_scsi_inq_peripheral, + {"Peripheral", "scsi.inquiry.preipheral", FT_UINT8, BASE_HEX, + NULL, 0, "", HFILL}}, { &hf_scsi_inq_vendor_id, {"Vendor Id", "scsi.inquiry.vendor_id", FT_STRING, BASE_NONE, NULL, 0, "", HFILL}}, @@ -4290,7 +4262,7 @@ proto_register_scsi (void) {"Version Description", "scsi.inquiry.version_desc", FT_UINT16, BASE_HEX, VALS(scsi_verdesc_val), 0, "", HFILL}}, { &hf_scsi_inq_devtype, - {"Peripheral Device Type", "scsi.inquiry.devtype", FT_UINT8, BASE_HEX, + {"Device Type", "scsi.inquiry.devtype", FT_UINT8, BASE_HEX, VALS (scsi_devtype_val), SCSI_DEV_BITS, "", HFILL}}, { &hf_scsi_inq_rmb, {"Removable", "scsi.inquiry.removable", FT_BOOLEAN, 8, @@ -4349,6 +4321,9 @@ proto_register_scsi (void) { &hf_scsi_inq_acaflags, {"Flags", "scsi.inquiry.acaflags", FT_UINT8, BASE_HEX, NULL, 0, "", HFILL}}, + { &hf_scsi_inq_rmbflags, + {"Flags", "scsi.inquiry.rmbflags", FT_UINT8, BASE_HEX, NULL, 0, + "", HFILL}}, { &hf_scsi_inq_normaca, {"NormACA", "scsi.inquiry.normaca", FT_BOOLEAN, 8, TFS(&normaca_tfs), SCSI_INQ_ACAFLAGS_NORMACA, "", HFILL}}, @@ -4509,7 +4484,9 @@ proto_register_scsi (void) static gint *ett[] = { &ett_scsi, &ett_scsi_page, + &ett_scsi_inq_peripheral, &ett_scsi_inq_acaflags, + &ett_scsi_inq_rmbflags, &ett_scsi_inq_sccsflags, &ett_scsi_inq_bqueflags, &ett_scsi_inq_reladrflags, |