aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-ndmp.c
diff options
context:
space:
mode:
authorsahlberg <sahlberg@f5534014-38df-0310-8fa8-9805f1628bb7>2006-06-17 08:22:03 +0000
committersahlberg <sahlberg@f5534014-38df-0310-8fa8-9805f1628bb7>2006-06-17 08:22:03 +0000
commitc508326c20146aff55b6ab142a9c5a5097661d46 (patch)
treeffe7ca0d763fda2027715af3d62fe2d5d9bb35e6 /epan/dissectors/packet-ndmp.c
parent39597b429950047a5529ba9ea43a75dd95e6337d (diff)
make ndmp track itl structures
everytime a ndmp_[scsi|tape]_open is seen create a new itl we need an itl structure to be able to know what commandset a certain device is using. git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@18490 f5534014-38df-0310-8fa8-9805f1628bb7
Diffstat (limited to 'epan/dissectors/packet-ndmp.c')
-rw-r--r--epan/dissectors/packet-ndmp.c38
1 files changed, 32 insertions, 6 deletions
diff --git a/epan/dissectors/packet-ndmp.c b/epan/dissectors/packet-ndmp.c
index 57eb9c4c4e..250bcf0e4c 100644
--- a/epan/dissectors/packet-ndmp.c
+++ b/epan/dissectors/packet-ndmp.c
@@ -271,11 +271,25 @@ typedef struct _ndmp_task_data_t {
typedef struct _ndmp_conv_data_t {
guint8 version;
se_tree_t *tasks; /* indexed by Sequence# */
+ se_tree_t *itl; /* indexed by packet# */
ndmp_task_data_t *task;
} ndmp_conv_data_t;
ndmp_conv_data_t *ndmp_conv_data=NULL;
static proto_tree *top_tree;
+static itl_nexus_t *
+get_itl_nexus(ndmp_conv_data_t *ndmp_conv_data, packet_info *pinfo, gboolean create_new)
+{
+ itl_nexus_t *itl;
+
+ if(create_new || !(itl=se_tree_lookup32_le(ndmp_conv_data->itl, pinfo->fd->num))){
+ itl=se_alloc(sizeof(itl_nexus_t));
+ itl->cmdset=0xff;
+ se_tree_insert32(ndmp_conv_data->itl, pinfo->fd->num, itl);
+ }
+ return itl;
+}
+
static guint8
get_ndmp_protocol_version(ndmp_conv_data_t *ndmp_conv_data)
{
@@ -1036,13 +1050,19 @@ dissect_get_server_info_reply(tvbuff_t *tvb, int offset, packet_info *pinfo,
}
static int
-dissect_scsi_open_request(tvbuff_t *tvb, int offset, packet_info *pinfo _U_,
+dissect_scsi_open_request(tvbuff_t *tvb, int offset, packet_info *pinfo,
proto_tree *tree, guint32 seq _U_)
{
/* device */
offset = dissect_rpc_string(tvb, tree,
hf_ndmp_scsi_device, offset, NULL);
+
+ if(!pinfo->fd->flags.visited){
+ /* new scsi device addressed, create a new itl structure */
+ get_itl_nexus(ndmp_conv_data, pinfo, TRUE);
+ }
+
return offset;
}
@@ -1159,7 +1179,7 @@ dissect_execute_cdb_cdb(tvbuff_t *tvb, int offset, packet_info *pinfo,
ndmp_conv_data->task->itlq->fc_time=pinfo->fd->abs_ts;
}
if(ndmp_conv_data->task->itlq){
- dissect_scsi_cdb(cdb_tvb, pinfo, top_tree, devtype, ndmp_conv_data->task->itlq, NULL);
+ dissect_scsi_cdb(cdb_tvb, pinfo, top_tree, devtype, ndmp_conv_data->task->itlq, get_itl_nexus(ndmp_conv_data, pinfo, FALSE));
}
offset += cdb_len_full;
}
@@ -1204,7 +1224,7 @@ dissect_execute_cdb_payload(tvbuff_t *tvb, int offset, packet_info *pinfo, proto
if(ndmp_conv_data->task->itlq){
dissect_scsi_payload(data_tvb, pinfo, top_tree, isreq,
- ndmp_conv_data->task->itlq, NULL);
+ ndmp_conv_data->task->itlq, get_itl_nexus(ndmp_conv_data, pinfo, FALSE));
}
offset += payload_len_full;
}
@@ -1291,7 +1311,7 @@ dissect_execute_cdb_sns(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tre
if (sns_len != 0) {
if(ndmp_conv_data->task->itlq){
- dissect_scsi_snsinfo(tvb, pinfo, top_tree, offset, sns_len, ndmp_conv_data->task->itlq, NULL);
+ dissect_scsi_snsinfo(tvb, pinfo, top_tree, offset, sns_len, ndmp_conv_data->task->itlq, get_itl_nexus(ndmp_conv_data, pinfo, FALSE));
}
offset += sns_len_full;
}
@@ -1312,7 +1332,7 @@ dissect_execute_cdb_reply(tvbuff_t *tvb, int offset, packet_info *pinfo,
proto_tree_add_item(tree, hf_ndmp_execute_cdb_status, tvb, offset, 4, FALSE);
status=tvb_get_ntohl(tvb, offset);
if(ndmp_conv_data->task->itlq){
- dissect_scsi_rsp(tvb, pinfo, top_tree, ndmp_conv_data->task->itlq, NULL, status);
+ dissect_scsi_rsp(tvb, pinfo, top_tree, ndmp_conv_data->task->itlq, get_itl_nexus(ndmp_conv_data, pinfo, FALSE), status);
}
offset += 4;
@@ -1340,7 +1360,7 @@ static const value_string tape_open_mode_vals[] = {
};
static int
-dissect_tape_open_request(tvbuff_t *tvb, int offset, packet_info *pinfo _U_,
+dissect_tape_open_request(tvbuff_t *tvb, int offset, packet_info *pinfo,
proto_tree *tree, guint32 seq _U_)
{
/* device */
@@ -1351,6 +1371,11 @@ dissect_tape_open_request(tvbuff_t *tvb, int offset, packet_info *pinfo _U_,
proto_tree_add_item(tree, hf_ndmp_tape_open_mode, tvb, offset, 4, FALSE);
offset += 4;
+ if(!pinfo->fd->flags.visited){
+ /* new scsi device addressed, create a new itl structure */
+ get_itl_nexus(ndmp_conv_data, pinfo, TRUE);
+ }
+
return offset;
}
@@ -2840,6 +2865,7 @@ dissect_ndmp_message(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
ndmp_conv_data=se_alloc(sizeof(ndmp_conv_data_t));
ndmp_conv_data->version=NDMP_PROTOCOL_UNKNOWN;
ndmp_conv_data->tasks=se_tree_create_non_persistent(SE_TREE_TYPE_RED_BLACK, "NDMP tasks");
+ ndmp_conv_data->itl=se_tree_create_non_persistent(SE_TREE_TYPE_RED_BLACK, "NDMP itl");
conversation_add_proto_data(conversation, proto_ndmp, ndmp_conv_data);
}