diff options
author | Ronnie Sahlberg <ronnie_sahlberg@ozemail.com.au> | 2004-02-18 09:10:02 +0000 |
---|---|---|
committer | Ronnie Sahlberg <ronnie_sahlberg@ozemail.com.au> | 2004-02-18 09:10:02 +0000 |
commit | 17124d9f1fcea7be42a0fb1bed88a70e249c18b8 (patch) | |
tree | 53605a2c1f6d4235dfedafe2e0a50aa0ec38a22e /packet-iscsi.c | |
parent | 4e8ec37ad896ec7eed6d8ad267358eddaf93470b (diff) |
update iscsi so that we can also measure the time between request and response for
those transactions where we have phase collaps (no explicit response PDU, status embedded inside the last DataIn PDU)
svn path=/trunk/; revision=10092
Diffstat (limited to 'packet-iscsi.c')
-rw-r--r-- | packet-iscsi.c | 129 |
1 files changed, 80 insertions, 49 deletions
diff --git a/packet-iscsi.c b/packet-iscsi.c index bc3d083f89..07ee1e44c2 100644 --- a/packet-iscsi.c +++ b/packet-iscsi.c @@ -1,8 +1,9 @@ /* packet-iscsi.c * Routines for iSCSI dissection * Copyright 2001, Eurologic and Mark Burton <markb@ordern.com> + * 2004 Request/Response matching and Service Response Time: ronnie sahlberg * - * $Id: packet-iscsi.c,v 1.48 2003/11/16 23:17:19 guy Exp $ + * $Id: packet-iscsi.c,v 1.49 2004/02/18 09:10:02 sahlberg Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@ethereal.com> @@ -804,6 +805,7 @@ dissect_iscsi_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint off guint original_offset = offset; proto_tree *ti = NULL; guint8 scsi_status = 0; + gboolean S_bit=FALSE; guint cdb_offset = offset + 32; /* offset of CDB from start of PDU */ guint end_offset = offset + tvb_length_remaining(tvb, offset); conversation_t *conversation = NULL; @@ -846,6 +848,10 @@ dissect_iscsi_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint off cdata->response_frame=pinfo->fd->num; break; case ISCSI_OPCODE_SCSI_DATA_IN: + /* a bit ugly but we need to check the S bit here */ + if(tvb_get_guint8(tvb, offset+1)&ISCSI_SCSI_DATA_FLAG_S){ + cdata->response_frame=pinfo->fd->num; + } cdata->data_in_frame=pinfo->fd->num; break; case ISCSI_OPCODE_SCSI_DATA_OUT: @@ -911,7 +917,7 @@ dissect_iscsi_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint off g_hash_table_remove(iscsi_req_unmatched, &ckey); } - /* add this new transaction to teh unmatched table */ + /* add this new transaction to the unmatched table */ cdata = g_mem_chunk_alloc (iscsi_req_vals); cdata->conv_idx = conversation->index; cdata->itt = tvb_get_ntohl (tvb, offset+16); @@ -1031,53 +1037,6 @@ dissect_iscsi_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint off proto_tree_add_boolean(ti, hf_iscsi_I, tvb, offset + 0, 1, b); } - /* handle request/response matching */ - if (cdata){ - switch(opcode){ - case ISCSI_OPCODE_SCSI_RESPONSE: - if (cdata->request_frame){ - nstime_t delta_time; - proto_tree_add_uint(ti, hf_iscsi_request_frame, tvb, 0, 0, cdata->request_frame); - delta_time.secs = pinfo->fd->abs_secs - cdata->req_time.secs; - delta_time.nsecs = pinfo->fd->abs_usecs*1000 - cdata->req_time.nsecs; - if (delta_time.nsecs<0){ - delta_time.nsecs+=1000000000; - delta_time.secs--; - } - proto_tree_add_time(ti, hf_iscsi_time, tvb, 0, 0, &delta_time); - - } - if (cdata->data_in_frame) - proto_tree_add_uint(ti, hf_iscsi_data_in_frame, tvb, 0, 0, cdata->data_in_frame); - if (cdata->data_out_frame) - proto_tree_add_uint(ti, hf_iscsi_data_out_frame, tvb, 0, 0, cdata->data_out_frame); - break; - case ISCSI_OPCODE_SCSI_DATA_IN: - if (cdata->request_frame) - proto_tree_add_uint(ti, hf_iscsi_request_frame, tvb, 0, 0, cdata->request_frame); - if (cdata->data_out_frame) - proto_tree_add_uint(ti, hf_iscsi_data_out_frame, tvb, 0, 0, cdata->data_out_frame); - if (cdata->response_frame) - proto_tree_add_uint(ti, hf_iscsi_response_frame, tvb, 0, 0, cdata->response_frame); - break; - case ISCSI_OPCODE_SCSI_DATA_OUT: - if (cdata->request_frame) - proto_tree_add_uint(ti, hf_iscsi_request_frame, tvb, 0, 0, cdata->request_frame); - if (cdata->data_in_frame) - proto_tree_add_uint(ti, hf_iscsi_data_in_frame, tvb, 0, 0, cdata->data_in_frame); - if (cdata->response_frame) - proto_tree_add_uint(ti, hf_iscsi_response_frame, tvb, 0, 0, cdata->response_frame); - break; - case ISCSI_OPCODE_SCSI_COMMAND: - if (cdata->data_in_frame) - proto_tree_add_uint(ti, hf_iscsi_data_in_frame, tvb, 0, 0, cdata->data_in_frame); - if (cdata->data_out_frame) - proto_tree_add_uint(ti, hf_iscsi_data_out_frame, tvb, 0, 0, cdata->data_out_frame); - if (cdata->response_frame) - proto_tree_add_uint(ti, hf_iscsi_response_frame, tvb, 0, 0, cdata->response_frame); - break; - } - } if(opcode == ISCSI_OPCODE_NOP_OUT) { /* NOP Out */ @@ -1421,6 +1380,9 @@ dissect_iscsi_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint off proto_item *tf = proto_tree_add_uint(ti, hf_iscsi_Flags, tvb, offset + 1, 1, b); proto_tree *tt = proto_item_add_subtree(tf, ett_iscsi_Flags); + if(b&ISCSI_SCSI_DATA_FLAG_S){ + S_bit=TRUE; + } proto_tree_add_boolean(tt, hf_iscsi_SCSIData_F, tvb, offset + 1, 1, b); if(iscsi_protocol_version > ISCSI_PROTOCOL_DRAFT08) { proto_tree_add_boolean(tt, hf_iscsi_SCSIData_A, tvb, offset + 1, 1, b); @@ -1584,6 +1546,75 @@ dissect_iscsi_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint off offset = handleDataSegment(ti, tvb, offset, data_segment_len, end_offset, hf_iscsi_vendor_specific_data); } + + + /* handle request/response matching */ + if (cdata){ + switch(opcode){ + case ISCSI_OPCODE_SCSI_RESPONSE: + if (cdata->request_frame){ + nstime_t delta_time; + proto_tree_add_uint(ti, hf_iscsi_request_frame, tvb, 0, 0, cdata->request_frame); + delta_time.secs = pinfo->fd->abs_secs - cdata->req_time.secs; + delta_time.nsecs = pinfo->fd->abs_usecs*1000 - cdata->req_time.nsecs; + if (delta_time.nsecs<0){ + delta_time.nsecs+=1000000000; + delta_time.secs--; + } + proto_tree_add_time(ti, hf_iscsi_time, tvb, 0, 0, &delta_time); + + } + if (cdata->data_in_frame) + proto_tree_add_uint(ti, hf_iscsi_data_in_frame, tvb, 0, 0, cdata->data_in_frame); + if (cdata->data_out_frame) + proto_tree_add_uint(ti, hf_iscsi_data_out_frame, tvb, 0, 0, cdata->data_out_frame); + break; + case ISCSI_OPCODE_SCSI_DATA_IN: + /* if we have phase collaps then we might have the + response embedded in the last DataIn segment */ + if(!S_bit){ + if (cdata->request_frame) + proto_tree_add_uint(ti, hf_iscsi_request_frame, tvb, 0, 0, cdata->request_frame); + if (cdata->response_frame) + proto_tree_add_uint(ti, hf_iscsi_response_frame, tvb, 0, 0, cdata->response_frame); + } else { + if (cdata->request_frame){ + nstime_t delta_time; + proto_tree_add_uint(ti, hf_iscsi_request_frame, tvb, 0, 0, cdata->request_frame); + delta_time.secs = pinfo->fd->abs_secs - cdata->req_time.secs; + delta_time.nsecs = pinfo->fd->abs_usecs*1000 - cdata->req_time.nsecs; + if (delta_time.nsecs<0){ + delta_time.nsecs+=1000000000; + delta_time.secs--; + } + proto_tree_add_time(ti, hf_iscsi_time, tvb, 0, 0, &delta_time); + + } + } + if (cdata->data_out_frame) + proto_tree_add_uint(ti, hf_iscsi_data_out_frame, tvb, 0, 0, cdata->data_out_frame); + break; + case ISCSI_OPCODE_SCSI_DATA_OUT: + if (cdata->request_frame) + proto_tree_add_uint(ti, hf_iscsi_request_frame, tvb, 0, 0, cdata->request_frame); + if (cdata->data_in_frame) + proto_tree_add_uint(ti, hf_iscsi_data_in_frame, tvb, 0, 0, cdata->data_in_frame); + if (cdata->response_frame) + proto_tree_add_uint(ti, hf_iscsi_response_frame, tvb, 0, 0, cdata->response_frame); + break; + case ISCSI_OPCODE_SCSI_COMMAND: + if (cdata->data_in_frame) + proto_tree_add_uint(ti, hf_iscsi_data_in_frame, tvb, 0, 0, cdata->data_in_frame); + if (cdata->data_out_frame) + proto_tree_add_uint(ti, hf_iscsi_data_out_frame, tvb, 0, 0, cdata->data_out_frame); + if (cdata->response_frame) + proto_tree_add_uint(ti, hf_iscsi_response_frame, tvb, 0, 0, cdata->response_frame); + break; + } + } + + + proto_item_set_len(ti, offset - original_offset); if((opcode & ((iscsi_protocol_version == ISCSI_PROTOCOL_DRAFT08)? |