aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--epan/dissectors/packet-iscsi.c58
-rw-r--r--epan/dissectors/packet-scsi-osd.c86
2 files changed, 139 insertions, 5 deletions
diff --git a/epan/dissectors/packet-iscsi.c b/epan/dissectors/packet-iscsi.c
index 24b5ca6d57..9e7bc0dbde 100644
--- a/epan/dissectors/packet-iscsi.c
+++ b/epan/dissectors/packet-iscsi.c
@@ -67,6 +67,12 @@ static enum_val_t iscsi_protocol_versions[] = {
{ NULL, NULL, 0 }
};
+static const value_string ahs_type_vals[] = {
+ {1, "Extended CDB"},
+ {2, "Expected Bidirection Read Data Length"},
+ {0, NULL}
+};
+
static dissector_handle_t iscsi_handle=NULL;
static gint iscsi_protocol_version = ISCSI_PROTOCOL_DRAFT13;
@@ -93,6 +99,9 @@ static int hf_iscsi_data_in_frame = -1;
static int hf_iscsi_data_out_frame = -1;
static int hf_iscsi_response_frame = -1;
static int hf_iscsi_AHS = -1;
+static int hf_iscsi_AHS_length = -1;
+static int hf_iscsi_AHS_type = -1;
+static int hf_iscsi_AHS_specific = -1;
static int hf_iscsi_Padding = -1;
static int hf_iscsi_ping_data = -1;
static int hf_iscsi_immediate_data = -1;
@@ -744,6 +753,8 @@ dissect_iscsi_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint off
guint immediate_data_length=0;
guint immediate_data_offset=0;
itl_nexus_t *itl=NULL;
+ guint16 ahs_length=0;
+ guint8 ahs_type=0;
if(paddedDataSegmentLength & 3)
paddedDataSegmentLength += 4 - (paddedDataSegmentLength & 3);
@@ -966,8 +977,12 @@ dissect_iscsi_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint off
proto_tree_add_item(ti, hf_iscsi_ExpStatSN, tvb, offset + 28, 4, FALSE);
{
if(ahsLen > 0) {
- /* FIXME - disssect AHS? */
- proto_tree_add_item(ti, hf_iscsi_AHS, tvb, offset + 48, ahsLen, FALSE);
+ ahs_length=tvb_get_ntohs(tvb, offset+48);
+ proto_tree_add_item(ti, hf_iscsi_AHS_length, tvb, offset + 48, 2, FALSE);
+ ahs_type=tvb_get_guint8(tvb, offset+50);
+ proto_tree_add_item(ti, hf_iscsi_AHS_type, tvb, offset + 50, 1, FALSE);
+ proto_tree_add_item(ti, hf_iscsi_AHS_specific, tvb, offset + 51, 1, FALSE);
+ proto_tree_add_item(ti, hf_iscsi_AHS, tvb, offset + 52, ahsLen-4, FALSE);
}
offset = handleHeaderDigest(iscsi_session, ti, tvb, offset, 48 + ahsLen);
}
@@ -1496,16 +1511,34 @@ dissect_iscsi_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint off
tvb_len=tvb_length_remaining(tvb, cdb_offset);
tvb_rlen=tvb_reported_length_remaining(tvb, cdb_offset);
scsi_opcode=tvb_get_guint8(tvb, cdb_offset);
- /* cdb 0x7f is variable length so dont clamp the cdb tvb */
- if(scsi_opcode!=0x7f){
+ if(ahs_type==1 && ahs_length && ahs_length<1024){
+ char *cdb_buf;
+
+ /* We have a variable length CDB where bytes >16 is transported
+ * in the AHS.
+ */
+ cdb_buf=ep_alloc(16+ahs_length);
+ /* the 16 first bytes of the cdb */
+ tvb_memcpy(tvb, cdb_buf, cdb_offset, 16);
+ /* hte remainder of the cdb from the ahs */
+ tvb_memcpy(tvb, cdb_buf+16, cdb_offset+20, ahs_length);
+
+ cdb_tvb = tvb_new_real_data(cdb_buf,
+ ahs_length+16,
+ ahs_length+16);
+
+ tvb_set_child_real_data_tvbuff(tvb, cdb_tvb);
+
+ add_new_data_source(pinfo, cdb_tvb, "CDB+AHS");
+ } else {
if(tvb_len>16){
tvb_len=16;
}
if(tvb_rlen>16){
tvb_rlen=16;
}
+ cdb_tvb=tvb_new_subset(tvb, cdb_offset, tvb_len, tvb_rlen);
}
- cdb_tvb=tvb_new_subset(tvb, cdb_offset, tvb_len, tvb_rlen);
dissect_scsi_cdb(cdb_tvb, pinfo, tree, SCSI_DEV_UNKNOWN, &cdata->itlq, itl);
/* we dont want the immediata below to overwrite our CDB info */
if (check_col(pinfo->cinfo, COL_INFO)) {
@@ -2379,6 +2412,21 @@ proto_register_iscsi(void)
FT_BYTES, BASE_HEX, NULL, 0,
"Additional header segment", HFILL }
},
+ { &hf_iscsi_AHS_length,
+ { "AHS Length", "iscsi.ahs.length",
+ FT_UINT16, BASE_DEC, NULL, 0,
+ "Length of Additional header segment", HFILL }
+ },
+ { &hf_iscsi_AHS_type,
+ { "AHS Type", "iscsi.ahs.type",
+ FT_UINT8, BASE_DEC, VALS(ahs_type_vals), 0,
+ "Type of Additional header segment", HFILL }
+ },
+ { &hf_iscsi_AHS_specific,
+ { "AHS Specific", "iscsi.ahs",
+ FT_UINT8, BASE_HEX, NULL, 0,
+ "Specific qualifier of Additional header segment", HFILL }
+ },
{ &hf_iscsi_Padding,
{ "Padding", "iscsi.padding",
FT_BYTES, BASE_HEX, NULL, 0,
diff --git a/epan/dissectors/packet-scsi-osd.c b/epan/dissectors/packet-scsi-osd.c
index 106b39d22b..e3dea683a9 100644
--- a/epan/dissectors/packet-scsi-osd.c
+++ b/epan/dissectors/packet-scsi-osd.c
@@ -56,6 +56,15 @@ static int hf_scsi_osd_set_attributes_page = -1;
static int hf_scsi_osd_set_attribute_length = -1;
static int hf_scsi_osd_set_attribute_number = -1;
static int hf_scsi_osd_set_attributes_offset = -1;
+static int hf_scsi_osd_capability_format = -1;
+static int hf_scsi_osd_key_version = -1;
+static int hf_scsi_osd_icva = -1;
+static int hf_scsi_osd_security_method = -1;
+static int hf_scsi_osd_capability_expiration_time= -1;
+static int hf_scsi_osd_audit= -1;
+static int hf_scsi_osd_capability_discriminator = -1;
+static int hf_scsi_osd_object_created_time= -1;
+static int hf_scsi_osd_object_type = -1;
static gint ett_osd_option = -1;
@@ -175,10 +184,60 @@ dissect_osd_attribute_parameters(tvbuff_t *tvb, int offset, proto_tree *tree, sc
}
}
+
+static const value_string scsi_osd_capability_format_vals[] = {
+ {0x00, "No Capability"},
+ {0x01, "SCSI OSD2 Capabilities"},
+ {0, NULL},
+};
+static const value_string scsi_osd_object_type_vals[] = {
+ {0x01, "ROOT"},
+ {0x02, "PARTITION"},
+ {0x40, "COLLECTION"},
+ {0x80, "USER"},
+ {0, NULL},
+};
+
/* 4.9.2.2 */
static void
dissect_osd_capability(tvbuff_t *tvb, int offset, proto_tree *tree)
{
+ /* capability format */
+ proto_tree_add_item(tree, hf_scsi_osd_capability_format, tvb, offset, 1, 0);
+ offset++;
+
+ /* key version and icva */
+ proto_tree_add_item(tree, hf_scsi_osd_key_version, tvb, offset, 1, 0);
+ proto_tree_add_item(tree, hf_scsi_osd_icva, tvb, offset, 1, 0);
+ offset++;
+
+ /* security method */
+ proto_tree_add_item(tree, hf_scsi_osd_security_method, tvb, offset, 1, 0);
+ offset++;
+
+ /* a reserved byte */
+ offset++;
+
+ /* capability expiration time */
+ proto_tree_add_item(tree, hf_scsi_osd_capability_expiration_time, tvb, offset, 6, 0);
+ offset+=6;
+
+ /* audit */
+ proto_tree_add_item(tree, hf_scsi_osd_audit, tvb, offset, 20, 0);
+ offset+=20;
+
+ /* capability discriminator */
+ proto_tree_add_item(tree, hf_scsi_osd_capability_discriminator, tvb, offset, 12, 0);
+ offset+=12;
+
+ /* object created time */
+ proto_tree_add_item(tree, hf_scsi_osd_object_created_time, tvb, offset, 6, 0);
+ offset+=6;
+
+ /* object type */
+ proto_tree_add_item(tree, hf_scsi_osd_object_type, tvb, offset, 1, 0);
+ offset++;
+
/*qqq*/
}
@@ -680,6 +739,33 @@ proto_register_scsi_osd(void)
{ &hf_scsi_osd_set_attributes_offset,
{"Set Attributes Offset", "scsi.osd.set_attributes_offset", FT_UINT32, BASE_HEX,
NULL, 0x0, "", HFILL}},
+ { &hf_scsi_osd_capability_format,
+ {"Capability Format", "scsi.osd.capability_format", FT_UINT8, BASE_HEX,
+ VALS(scsi_osd_capability_format_vals), 0x0f, "", HFILL}},
+ { &hf_scsi_osd_key_version,
+ {"Key Version", "scsi.osd.key_version", FT_UINT8, BASE_HEX,
+ NULL, 0xf0, "", HFILL}},
+ { &hf_scsi_osd_icva,
+ {"Integrity Check Value Algorithm", "scsi.osd.icva", FT_UINT8, BASE_HEX,
+ NULL, 0x0f, "", HFILL}},
+ { &hf_scsi_osd_security_method,
+ {"Security Method", "scsi.osd.security_method", FT_UINT8, BASE_HEX,
+ NULL, 0x0f, "", HFILL}},
+ { &hf_scsi_osd_capability_expiration_time,
+ {"Capability Expiration Time", "scsi.osd.capability_expiration_time", FT_BYTES, BASE_HEX,
+ NULL, 0, "", HFILL}},
+ { &hf_scsi_osd_audit,
+ {"Audit", "scsi.osd.audit", FT_BYTES, BASE_HEX,
+ NULL, 0, "", HFILL}},
+ { &hf_scsi_osd_capability_discriminator,
+ {"Capability Discriminator", "scsi.osd.capability_descriminator", FT_BYTES, BASE_HEX,
+ NULL, 0, "", HFILL}},
+ { &hf_scsi_osd_object_created_time,
+ {"Object Created Time", "scsi.osd.object_created_time", FT_BYTES, BASE_HEX,
+ NULL, 0, "", HFILL}},
+ { &hf_scsi_osd_object_type,
+ {"Object Type", "scsi.osd.object_type", FT_UINT8, BASE_HEX,
+ VALS(scsi_osd_object_type_vals), 0, "", HFILL}},
};
/* Setup protocol subtree array */