Ethereal-dev: [Ethereal-dev] packet-iscsi.c improvements
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Mark Burton <markb@xxxxxxxxxx>
Date: Thu, 31 May 2001 12:18:45 +0100
Hi, Here's another patch to the current CVS version of packet-iscsi.c that adds a sub-tree for the flags byte and provides a bit more information in the Info field. Cheers, Mark Index: packet-iscsi.c =================================================================== RCS file: /cvsroot/ethereal/packet-iscsi.c,v retrieving revision 1.2 diff -u -3 -p -c -r1.2 packet-iscsi.c *** packet-iscsi.c 2001/05/31 08:54:17 1.2 --- packet-iscsi.c 2001/05/31 11:17:50 *************** static int proto_iscsi = -1; *** 61,66 **** --- 61,67 ---- static int hf_iscsi_Payload = -1; static int hf_iscsi_Opcode = -1; static int hf_iscsi_Opcode_03 = -1; + static int hf_iscsi_Flags = -1; #if 0 static int hf_iscsi_X = -1; static int hf_iscsi_I = -1; *************** static int hf_iscsi_AdditionalRuns = -1; *** 152,157 **** --- 153,159 ---- /* Initialize the subtree pointers */ static gint ett_iscsi_KeyValues = -1; static gint ett_iscsi_CDB = -1; + static gint ett_iscsi_Flags = -1; static const value_string iscsi_opcodes[] = { {0x00, "NOP Out"}, *************** dissect_iscsi(tvbuff_t *tvb, packet_info *** 520,536 **** guint32 data_segment_len; guint8 opcode; const char *opcode_str; ! guint32 pdu_len; ! /* Make sure we have enough of the packet to check whether it's ! iSCSI */ ! if (tvb_length_remaining(tvb, offset) < 8) { ! /* We don't */ return FALSE; } opcode = tvb_get_guint8(tvb, offset + 0); ! pdu_len = tvb_length_remaining(tvb, 0); if(enable_03_mode) { opcode_str = match_strval(opcode, iscsi_opcodes_03); data_segment_len = tvb_get_ntohl(tvb, offset + 4); --- 522,538 ---- guint32 data_segment_len; guint8 opcode; const char *opcode_str; ! guint32 packet_len = tvb_length_remaining(tvb, offset); ! /* quick check to see if the packet is long enough to contain a ! * whole iSCSI header segment */ ! if (packet_len < 48) { ! /* no, so give up */ return FALSE; } opcode = tvb_get_guint8(tvb, offset + 0); ! if(enable_03_mode) { opcode_str = match_strval(opcode, iscsi_opcodes_03); data_segment_len = tvb_get_ntohl(tvb, offset + 4); *************** dissect_iscsi(tvbuff_t *tvb, packet_info *** 544,551 **** if(opcode_str == NULL || (enable_bogosity_filter && (data_segment_len > bogus_pdu_data_length_threshold || ! pdu_len < 48 || ! pdu_len > (data_segment_len + 48 + bogus_pdu_max_digest_padding)))) { return FALSE; } --- 546,552 ---- if(opcode_str == NULL || (enable_bogosity_filter && (data_segment_len > bogus_pdu_data_length_threshold || ! packet_len > (data_segment_len + 48 + bogus_pdu_max_digest_padding)))) { return FALSE; } *************** dissect_iscsi(tvbuff_t *tvb, packet_info *** 555,569 **** if (check_col(pinfo->fd, COL_INFO)) { - const char *scsiCommandName = 0; col_add_str(pinfo->fd, COL_INFO, (char *)opcode_str); ! if((opcode & 0xbf) == 0x01 && pdu_len > 32) ! scsiCommandName = match_strval(tvb_get_guint8(tvb, offset + 32), ! iscsi_scsi_cdb0); ! if(scsiCommandName != NULL) ! col_append_fstr(pinfo->fd, COL_INFO, " (%s)", scsiCommandName); } /* In the interest of speed, if "tree" is NULL, don't do any --- 556,584 ---- if (check_col(pinfo->fd, COL_INFO)) { col_add_str(pinfo->fd, COL_INFO, (char *)opcode_str); ! if((opcode & 0xbf) == 0x01) { ! const char *scsiCommandName = match_strval(tvb_get_guint8(tvb, offset + 32), ! iscsi_scsi_cdb0); ! if(scsiCommandName != NULL) ! col_append_fstr(pinfo->fd, COL_INFO, " (%s)", scsiCommandName); ! } ! else if(enable_03_mode && opcode == 0x81) { ! const char *blurb = match_strval(tvb_get_guint8(tvb, offset + 36), iscsi_scsi_statuses); ! if(blurb != NULL) ! col_append_fstr(pinfo->fd, COL_INFO, " (%s)", blurb); ! } ! else if(!enable_03_mode && opcode == 0xc1) { ! const char *blurb = NULL; ! if(tvb_get_guint8(tvb, offset + 1) & 0x01) ! blurb = match_strval(tvb_get_guint8(tvb, offset + 3), iscsi_scsi_statuses); ! else ! blurb = match_strval(tvb_get_guint8(tvb, offset + 3), iscsi_scsi_responses); ! if(blurb != NULL) ! col_append_fstr(pinfo->fd, COL_INFO, " (%s)", blurb); ! } } /* In the interest of speed, if "tree" is NULL, don't do any *************** dissect_iscsi(tvbuff_t *tvb, packet_info *** 571,585 **** if (tree) { /* create display subtree for the protocol */ ! ti = proto_tree_add_item(tree, proto_iscsi, tvb, offset, ! pdu_len, FALSE); if((enable_03_mode && opcode == 0x00) || (!enable_03_mode && (opcode == 0x00 || opcode == 0x40 || opcode == 0x80))) { /* NOP Out */ - gint b = tvb_get_guint8(tvb, offset + 1); if(enable_03_mode) { proto_tree_add_uint(ti, hf_iscsi_Opcode_03, tvb, offset + 0, 1, opcode); --- 586,599 ---- if (tree) { /* create display subtree for the protocol */ ! ti = proto_tree_add_protocol_format(tree, proto_iscsi, tvb, offset, ! packet_len, "iSCSI (%s)", (char *)opcode_str); if((enable_03_mode && opcode == 0x00) || (!enable_03_mode && (opcode == 0x00 || opcode == 0x40 || opcode == 0x80))) { /* NOP Out */ if(enable_03_mode) { proto_tree_add_uint(ti, hf_iscsi_Opcode_03, tvb, offset + 0, 1, opcode); *************** dissect_iscsi(tvbuff_t *tvb, packet_info *** 587,594 **** else { proto_tree_add_uint(ti, hf_iscsi_Opcode, tvb, offset + 0, 1, opcode); } - proto_tree_add_boolean(ti, hf_iscsi_NOP_P, tvb, offset + 1, 1, b); if(enable_03_mode) { proto_tree_add_uint(ti, hf_iscsi_Length03, tvb, offset + 4, 4, data_segment_len); } --- 601,613 ---- else { proto_tree_add_uint(ti, hf_iscsi_Opcode, tvb, offset + 0, 1, opcode); + } + { + gint b = tvb_get_guint8(tvb, offset + 1); + 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); + proto_tree_add_boolean(tt, hf_iscsi_NOP_P, tvb, offset + 1, 1, b); } if(enable_03_mode) { proto_tree_add_uint(ti, hf_iscsi_Length03, tvb, offset + 4, 4, data_segment_len); } *************** dissect_iscsi(tvbuff_t *tvb, packet_info *** 609,615 **** else if((enable_03_mode && opcode == 0x80) || (!enable_03_mode && opcode == 0xc0)) { /* NOP In */ - gint b = tvb_get_guint8(tvb, offset + 1); if(enable_03_mode) { proto_tree_add_uint(ti, hf_iscsi_Opcode_03, tvb, offset + 0, 1, opcode); --- 628,633 ---- *************** dissect_iscsi(tvbuff_t *tvb, packet_info *** 617,624 **** else { proto_tree_add_uint(ti, hf_iscsi_Opcode, tvb, offset + 0, 1, opcode); } - proto_tree_add_boolean(ti, hf_iscsi_NOP_P, tvb, offset + 1, 1, b); if(enable_03_mode) { proto_tree_add_uint(ti, hf_iscsi_Length03, tvb, offset + 4, 4, data_segment_len); } --- 635,647 ---- else { proto_tree_add_uint(ti, hf_iscsi_Opcode, tvb, offset + 0, 1, opcode); + } + { + gint b = tvb_get_guint8(tvb, offset + 1); + 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); + proto_tree_add_boolean(tt, hf_iscsi_NOP_P, tvb, offset + 1, 1, b); } if(enable_03_mode) { proto_tree_add_uint(ti, hf_iscsi_Length03, tvb, offset + 4, 4, data_segment_len); } *************** dissect_iscsi(tvbuff_t *tvb, packet_info *** 637,660 **** opcode == 0x41 || opcode == 0x81))) { /* SCSI Command */ - gint b = tvb_get_guint8(tvb, offset + 1); if(enable_03_mode) { proto_tree_add_uint(ti, hf_iscsi_Opcode_03, tvb, offset + 0, 1, opcode); ! proto_tree_add_boolean(ti, hf_iscsi_SCSICommand_X03, tvb, offset + 1, 1, b); ! proto_tree_add_boolean(ti, hf_iscsi_SCSICommand_R, tvb, offset + 1, 1, b); ! proto_tree_add_boolean(ti, hf_iscsi_SCSICommand_W, tvb, offset + 1, 1, b); ! proto_tree_add_uint(ti, hf_iscsi_SCSICommand_Attr, tvb, offset + 1, 1, b); proto_tree_add_uint(ti, hf_iscsi_SCSICommand_AddCDB, tvb, offset + 3, 1, tvb_get_guint8(tvb, offset + 3)); proto_tree_add_uint(ti, hf_iscsi_Length03, tvb, offset + 4, 4, data_segment_len); } else { proto_tree_add_uint(ti, hf_iscsi_Opcode, tvb, offset + 0, 1, opcode); ! proto_tree_add_boolean(ti, hf_iscsi_SCSICommand_F, tvb, offset + 1, 1, b); ! proto_tree_add_boolean(ti, hf_iscsi_SCSICommand_R, tvb, offset + 1, 1, b); ! proto_tree_add_boolean(ti, hf_iscsi_SCSICommand_W, tvb, offset + 1, 1, b); ! proto_tree_add_uint(ti, hf_iscsi_SCSICommand_Attr, tvb, offset + 1, 1, b); proto_tree_add_uint(ti, hf_iscsi_SCSICommand_CRN, tvb, offset + 3, 1, tvb_get_guint8(tvb, offset + 3)); proto_tree_add_uint(ti, hf_iscsi_TotalAHSLength, tvb, offset + 4, 1, tvb_get_guint8(tvb, offset + 4)); proto_tree_add_uint(ti, hf_iscsi_DataSegmentLength, tvb, offset + 5, 3, data_segment_len); --- 660,694 ---- opcode == 0x41 || opcode == 0x81))) { /* SCSI Command */ if(enable_03_mode) { proto_tree_add_uint(ti, hf_iscsi_Opcode_03, tvb, offset + 0, 1, opcode); ! { ! gint b = tvb_get_guint8(tvb, offset + 1); ! 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); ! ! proto_tree_add_boolean(tt, hf_iscsi_SCSICommand_X03, tvb, offset + 1, 1, b); ! proto_tree_add_boolean(tt, hf_iscsi_SCSICommand_R, tvb, offset + 1, 1, b); ! proto_tree_add_boolean(tt, hf_iscsi_SCSICommand_W, tvb, offset + 1, 1, b); ! proto_tree_add_uint(tt, hf_iscsi_SCSICommand_Attr, tvb, offset + 1, 1, b); ! } proto_tree_add_uint(ti, hf_iscsi_SCSICommand_AddCDB, tvb, offset + 3, 1, tvb_get_guint8(tvb, offset + 3)); proto_tree_add_uint(ti, hf_iscsi_Length03, tvb, offset + 4, 4, data_segment_len); } else { proto_tree_add_uint(ti, hf_iscsi_Opcode, tvb, offset + 0, 1, opcode); ! { ! gint b = tvb_get_guint8(tvb, offset + 1); ! 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); ! ! proto_tree_add_boolean(tt, hf_iscsi_SCSICommand_F, tvb, offset + 1, 1, b); ! proto_tree_add_boolean(tt, hf_iscsi_SCSICommand_R, tvb, offset + 1, 1, b); ! proto_tree_add_boolean(tt, hf_iscsi_SCSICommand_W, tvb, offset + 1, 1, b); ! proto_tree_add_uint(tt, hf_iscsi_SCSICommand_Attr, tvb, offset + 1, 1, b); ! } proto_tree_add_uint(ti, hf_iscsi_SCSICommand_CRN, tvb, offset + 3, 1, tvb_get_guint8(tvb, offset + 3)); proto_tree_add_uint(ti, hf_iscsi_TotalAHSLength, tvb, offset + 4, 1, tvb_get_guint8(tvb, offset + 4)); proto_tree_add_uint(ti, hf_iscsi_DataSegmentLength, tvb, offset + 5, 3, data_segment_len); *************** dissect_iscsi(tvbuff_t *tvb, packet_info *** 675,702 **** else if((enable_03_mode && opcode == 0x81) || (!enable_03_mode && opcode == 0xc1)) { /* SCSI Response */ - gint b = tvb_get_guint8(tvb, offset + 1); if(enable_03_mode) { proto_tree_add_uint(ti, hf_iscsi_Opcode_03, tvb, offset + 0, 1, opcode); ! proto_tree_add_boolean(ti, hf_iscsi_SCSIResponse_o03, tvb, offset + 1, 1, b); ! proto_tree_add_boolean(ti, hf_iscsi_SCSIResponse_u03, tvb, offset + 1, 1, b); ! proto_tree_add_boolean(ti, hf_iscsi_SCSIResponse_O03, tvb, offset + 1, 1, b); ! proto_tree_add_boolean(ti, hf_iscsi_SCSIResponse_U03, tvb, offset + 1, 1, b); proto_tree_add_uint(ti, hf_iscsi_Length03, tvb, offset + 4, 4, data_segment_len); } else { proto_tree_add_uint(ti, hf_iscsi_Opcode, tvb, offset + 0, 1, opcode); ! proto_tree_add_boolean(ti, hf_iscsi_SCSIResponse_o, tvb, offset + 1, 1, b); ! proto_tree_add_boolean(ti, hf_iscsi_SCSIResponse_u, tvb, offset + 1, 1, b); ! proto_tree_add_boolean(ti, hf_iscsi_SCSIResponse_O, tvb, offset + 1, 1, b); ! proto_tree_add_boolean(ti, hf_iscsi_SCSIResponse_U, tvb, offset + 1, 1, b); ! proto_tree_add_boolean(ti, hf_iscsi_SCSIResponse_S, tvb, offset + 1, 1, b); ! if(b & 0x01) ! proto_tree_add_uint(ti, hf_iscsi_StatusResponse_is_status, tvb, offset + 3, 1, tvb_get_guint8(tvb, offset + 3)); ! else ! proto_tree_add_uint(ti, hf_iscsi_StatusResponse_is_response, tvb, offset + 3, 1, tvb_get_guint8(tvb, offset + 3)); proto_tree_add_uint(ti, hf_iscsi_DataSegmentLength, tvb, offset + 5, 3, data_segment_len); } proto_tree_add_uint(ti, hf_iscsi_InitiatorTaskTag, tvb, offset + 16, 4, tvb_get_ntohl(tvb, offset + 16)); --- 709,747 ---- else if((enable_03_mode && opcode == 0x81) || (!enable_03_mode && opcode == 0xc1)) { /* SCSI Response */ if(enable_03_mode) { proto_tree_add_uint(ti, hf_iscsi_Opcode_03, tvb, offset + 0, 1, opcode); ! { ! gint b = tvb_get_guint8(tvb, offset + 1); ! 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); ! ! proto_tree_add_boolean(tt, hf_iscsi_SCSIResponse_o03, tvb, offset + 1, 1, b); ! proto_tree_add_boolean(tt, hf_iscsi_SCSIResponse_u03, tvb, offset + 1, 1, b); ! proto_tree_add_boolean(tt, hf_iscsi_SCSIResponse_O03, tvb, offset + 1, 1, b); ! proto_tree_add_boolean(tt, hf_iscsi_SCSIResponse_U03, tvb, offset + 1, 1, b); ! } proto_tree_add_uint(ti, hf_iscsi_Length03, tvb, offset + 4, 4, data_segment_len); } else { proto_tree_add_uint(ti, hf_iscsi_Opcode, tvb, offset + 0, 1, opcode); ! { ! gint b = tvb_get_guint8(tvb, offset + 1); ! 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); ! ! proto_tree_add_boolean(tt, hf_iscsi_SCSIResponse_o, tvb, offset + 1, 1, b); ! proto_tree_add_boolean(tt, hf_iscsi_SCSIResponse_u, tvb, offset + 1, 1, b); ! proto_tree_add_boolean(tt, hf_iscsi_SCSIResponse_O, tvb, offset + 1, 1, b); ! proto_tree_add_boolean(tt, hf_iscsi_SCSIResponse_U, tvb, offset + 1, 1, b); ! proto_tree_add_boolean(tt, hf_iscsi_SCSIResponse_S, tvb, offset + 1, 1, b); ! if(b & 0x01) ! proto_tree_add_uint(ti, hf_iscsi_StatusResponse_is_status, tvb, offset + 3, 1, tvb_get_guint8(tvb, offset + 3)); ! else ! proto_tree_add_uint(ti, hf_iscsi_StatusResponse_is_response, tvb, offset + 3, 1, tvb_get_guint8(tvb, offset + 3)); ! } proto_tree_add_uint(ti, hf_iscsi_DataSegmentLength, tvb, offset + 5, 3, data_segment_len); } proto_tree_add_uint(ti, hf_iscsi_InitiatorTaskTag, tvb, offset + 16, 4, tvb_get_ntohl(tvb, offset + 16)); *************** dissect_iscsi(tvbuff_t *tvb, packet_info *** 720,726 **** opcode == 0x42 || opcode == 0x82))) { /* SCSI Task Command */ - gint b = tvb_get_guint8(tvb, offset + 1); if(enable_03_mode) { proto_tree_add_uint(ti, hf_iscsi_Opcode_03, tvb, offset + 0, 1, opcode); --- 765,770 ---- *************** dissect_iscsi(tvbuff_t *tvb, packet_info *** 729,735 **** proto_tree_add_uint(ti, hf_iscsi_Opcode, tvb, offset + 0, 1, opcode); } ! proto_tree_add_uint(ti, hf_iscsi_SCSITask_Function, tvb, offset + 1, 1, b); if(enable_03_mode) { proto_tree_add_uint(ti, hf_iscsi_Length03, tvb, offset + 4, 4, data_segment_len); } --- 773,779 ---- proto_tree_add_uint(ti, hf_iscsi_Opcode, tvb, offset + 0, 1, opcode); } ! proto_tree_add_uint(ti, hf_iscsi_SCSITask_Function, tvb, offset + 1, 1, tvb_get_guint8(tvb, offset + 1)); if(enable_03_mode) { proto_tree_add_uint(ti, hf_iscsi_Length03, tvb, offset + 4, 4, data_segment_len); } *************** dissect_iscsi(tvbuff_t *tvb, packet_info *** 772,778 **** else { proto_tree_add_uint(ti, hf_iscsi_Opcode, tvb, offset + 0, 1, opcode); ! proto_tree_add_boolean(ti, hf_iscsi_Login_F, tvb, offset + 1, 1, tvb_get_guint8(tvb, offset + 1)); } proto_tree_add_uint(ti, hf_iscsi_VersionMax, tvb, offset + 2, 1, tvb_get_guint8(tvb, offset + 2)); proto_tree_add_uint(ti, hf_iscsi_VersionMin, tvb, offset + 3, 1, tvb_get_guint8(tvb, offset + 3)); --- 816,828 ---- else { proto_tree_add_uint(ti, hf_iscsi_Opcode, tvb, offset + 0, 1, opcode); ! { ! gint b = tvb_get_guint8(tvb, offset + 1); ! 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); ! ! proto_tree_add_boolean(tt, hf_iscsi_Login_F, tvb, offset + 1, 1, b); ! } } proto_tree_add_uint(ti, hf_iscsi_VersionMax, tvb, offset + 2, 1, tvb_get_guint8(tvb, offset + 2)); proto_tree_add_uint(ti, hf_iscsi_VersionMin, tvb, offset + 3, 1, tvb_get_guint8(tvb, offset + 3)); *************** dissect_iscsi(tvbuff_t *tvb, packet_info *** 794,801 **** proto_tree_add_uint(ti, hf_iscsi_ExpStatSN, tvb, offset + 28, 4, tvb_get_ntohl(tvb, offset + 28)); } offset += 48; ! if(pdu_len > 48) { ! int text_len = min(data_segment_len, pdu_len - 48); proto_item *tf = proto_tree_add_text(ti, tvb, 48, text_len, "Key/Value Pairs"); proto_tree *tt = proto_item_add_subtree(tf, ett_iscsi_KeyValues); offset = addTextKeys(tt, tvb, 48, text_len); --- 844,851 ---- proto_tree_add_uint(ti, hf_iscsi_ExpStatSN, tvb, offset + 28, 4, tvb_get_ntohl(tvb, offset + 28)); } offset += 48; ! if(packet_len > 48) { ! int text_len = min(data_segment_len, packet_len - 48); proto_item *tf = proto_tree_add_text(ti, tvb, 48, text_len, "Key/Value Pairs"); proto_tree *tt = proto_item_add_subtree(tf, ett_iscsi_KeyValues); offset = addTextKeys(tt, tvb, 48, text_len); *************** dissect_iscsi(tvbuff_t *tvb, packet_info *** 804,810 **** else if((enable_03_mode && opcode == 0x83) || (!enable_03_mode && opcode == 0xc3)) { /* Login Response */ - gint b = tvb_get_guint8(tvb, offset + 1); if(enable_03_mode) { proto_tree_add_uint(ti, hf_iscsi_Opcode_03, tvb, offset + 0, 1, opcode); --- 854,859 ---- *************** dissect_iscsi(tvbuff_t *tvb, packet_info *** 813,819 **** proto_tree_add_uint(ti, hf_iscsi_Opcode, tvb, offset + 0, 1, opcode); } ! proto_tree_add_boolean(ti, hf_iscsi_Login_F, tvb, offset + 1, 1, b); proto_tree_add_uint(ti, hf_iscsi_VersionMax, tvb, offset + 2, 1, tvb_get_guint8(tvb, offset + 2)); proto_tree_add_uint(ti, hf_iscsi_VersionMin, tvb, offset + 3, 1, tvb_get_guint8(tvb, offset + 3)); if(enable_03_mode) { --- 862,874 ---- proto_tree_add_uint(ti, hf_iscsi_Opcode, tvb, offset + 0, 1, opcode); } ! { ! gint b = tvb_get_guint8(tvb, offset + 1); ! 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); ! ! proto_tree_add_boolean(tt, hf_iscsi_Login_F, tvb, offset + 1, 1, b); ! } proto_tree_add_uint(ti, hf_iscsi_VersionMax, tvb, offset + 2, 1, tvb_get_guint8(tvb, offset + 2)); proto_tree_add_uint(ti, hf_iscsi_VersionMin, tvb, offset + 3, 1, tvb_get_guint8(tvb, offset + 3)); if(enable_03_mode) { *************** dissect_iscsi(tvbuff_t *tvb, packet_info *** 835,842 **** proto_tree_add_uint(ti, hf_iscsi_Login_Status, tvb, offset + 36, 1, tvb_get_ntohs(tvb, offset + 36)); } offset += 48; ! if(pdu_len > 48) { ! int text_len = min(data_segment_len, pdu_len - 48); proto_item *tf = proto_tree_add_text(ti, tvb, 48, text_len, "Key/Value Pairs"); proto_tree *tt = proto_item_add_subtree(tf, ett_iscsi_KeyValues); offset = addTextKeys(tt, tvb, 48, text_len); --- 890,897 ---- proto_tree_add_uint(ti, hf_iscsi_Login_Status, tvb, offset + 36, 1, tvb_get_ntohs(tvb, offset + 36)); } offset += 48; ! if(packet_len > 48) { ! int text_len = min(data_segment_len, packet_len - 48); proto_item *tf = proto_tree_add_text(ti, tvb, 48, text_len, "Key/Value Pairs"); proto_tree *tt = proto_item_add_subtree(tf, ett_iscsi_KeyValues); offset = addTextKeys(tt, tvb, 48, text_len); *************** dissect_iscsi(tvbuff_t *tvb, packet_info *** 855,869 **** else { proto_tree_add_uint(ti, hf_iscsi_Opcode, tvb, offset + 0, 1, opcode); ! proto_tree_add_boolean(ti, hf_iscsi_Text_F, tvb, offset + 1, 1, tvb_get_guint8(tvb, offset + 1)); proto_tree_add_uint(ti, hf_iscsi_DataSegmentLength, tvb, offset + 5, 3, data_segment_len); } proto_tree_add_uint(ti, hf_iscsi_InitiatorTaskTag, tvb, offset + 16, 4, tvb_get_ntohl(tvb, offset + 16)); proto_tree_add_uint(ti, hf_iscsi_CmdSN, tvb, offset + 24, 4, tvb_get_ntohl(tvb, offset + 24)); proto_tree_add_uint(ti, hf_iscsi_ExpStatSN, tvb, offset + 28, 4, tvb_get_ntohl(tvb, offset + 28)); offset += 48; ! if(pdu_len > 48) { ! int text_len = min(data_segment_len, pdu_len - 48); proto_item *tf = proto_tree_add_text(ti, tvb, 48, text_len, "Key/Value Pairs"); proto_tree *tt = proto_item_add_subtree(tf, ett_iscsi_KeyValues); offset = addTextKeys(tt, tvb, 48, text_len); --- 910,930 ---- else { proto_tree_add_uint(ti, hf_iscsi_Opcode, tvb, offset + 0, 1, opcode); ! { ! gint b = tvb_get_guint8(tvb, offset + 1); ! 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); ! ! proto_tree_add_boolean(tt, hf_iscsi_Text_F, tvb, offset + 1, 1, b); ! } proto_tree_add_uint(ti, hf_iscsi_DataSegmentLength, tvb, offset + 5, 3, data_segment_len); } proto_tree_add_uint(ti, hf_iscsi_InitiatorTaskTag, tvb, offset + 16, 4, tvb_get_ntohl(tvb, offset + 16)); proto_tree_add_uint(ti, hf_iscsi_CmdSN, tvb, offset + 24, 4, tvb_get_ntohl(tvb, offset + 24)); proto_tree_add_uint(ti, hf_iscsi_ExpStatSN, tvb, offset + 28, 4, tvb_get_ntohl(tvb, offset + 28)); offset += 48; ! if(packet_len > 48) { ! int text_len = min(data_segment_len, packet_len - 48); proto_item *tf = proto_tree_add_text(ti, tvb, 48, text_len, "Key/Value Pairs"); proto_tree *tt = proto_item_add_subtree(tf, ett_iscsi_KeyValues); offset = addTextKeys(tt, tvb, 48, text_len); *************** dissect_iscsi(tvbuff_t *tvb, packet_info *** 880,886 **** else { proto_tree_add_uint(ti, hf_iscsi_Opcode, tvb, offset + 0, 1, opcode); ! proto_tree_add_boolean(ti, hf_iscsi_Text_F, tvb, offset + 1, 1, tvb_get_guint8(tvb, offset + 1)); proto_tree_add_uint(ti, hf_iscsi_DataSegmentLength, tvb, offset + 5, 3, data_segment_len); } proto_tree_add_uint(ti, hf_iscsi_InitiatorTaskTag, tvb, offset + 16, 4, tvb_get_ntohl(tvb, offset + 16)); --- 941,953 ---- else { proto_tree_add_uint(ti, hf_iscsi_Opcode, tvb, offset + 0, 1, opcode); ! { ! gint b = tvb_get_guint8(tvb, offset + 1); ! 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); ! ! proto_tree_add_boolean(tt, hf_iscsi_Text_F, tvb, offset + 1, 1, b); ! } proto_tree_add_uint(ti, hf_iscsi_DataSegmentLength, tvb, offset + 5, 3, data_segment_len); } proto_tree_add_uint(ti, hf_iscsi_InitiatorTaskTag, tvb, offset + 16, 4, tvb_get_ntohl(tvb, offset + 16)); *************** dissect_iscsi(tvbuff_t *tvb, packet_info *** 888,895 **** proto_tree_add_uint(ti, hf_iscsi_ExpCmdSN, tvb, offset + 28, 4, tvb_get_ntohl(tvb, offset + 28)); proto_tree_add_uint(ti, hf_iscsi_MaxCmdSN, tvb, offset + 32, 4, tvb_get_ntohl(tvb, offset + 32)); offset += 48; ! if(pdu_len > 48) { ! int text_len = min(data_segment_len, pdu_len - 48); proto_item *tf = proto_tree_add_text(ti, tvb, 48, text_len, "Key/Value Pairs"); proto_tree *tt = proto_item_add_subtree(tf, ett_iscsi_KeyValues); offset = addTextKeys(tt, tvb, 48, text_len); --- 955,962 ---- proto_tree_add_uint(ti, hf_iscsi_ExpCmdSN, tvb, offset + 28, 4, tvb_get_ntohl(tvb, offset + 28)); proto_tree_add_uint(ti, hf_iscsi_MaxCmdSN, tvb, offset + 32, 4, tvb_get_ntohl(tvb, offset + 32)); offset += 48; ! if(packet_len > 48) { ! int text_len = min(data_segment_len, packet_len - 48); proto_item *tf = proto_tree_add_text(ti, tvb, 48, text_len, "Key/Value Pairs"); proto_tree *tt = proto_item_add_subtree(tf, ett_iscsi_KeyValues); offset = addTextKeys(tt, tvb, 48, text_len); *************** dissect_iscsi(tvbuff_t *tvb, packet_info *** 897,903 **** } else if(opcode == 0x05) { /* SCSI Data (write) */ - gint b = tvb_get_guint8(tvb, offset + 1); if(enable_03_mode) { proto_tree_add_uint(ti, hf_iscsi_Opcode_03, tvb, offset + 0, 1, opcode); --- 964,969 ---- *************** dissect_iscsi(tvbuff_t *tvb, packet_info *** 905,912 **** else { proto_tree_add_uint(ti, hf_iscsi_Opcode, tvb, offset + 0, 1, opcode); } - proto_tree_add_boolean(ti, hf_iscsi_SCSIData_F, tvb, offset + 1, 1, b); if(enable_03_mode) { proto_tree_add_uint(ti, hf_iscsi_Length03, tvb, offset + 4, 4, data_segment_len); } --- 971,984 ---- else { proto_tree_add_uint(ti, hf_iscsi_Opcode, tvb, offset + 0, 1, opcode); + } + { + gint b = tvb_get_guint8(tvb, offset + 1); + 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); + + proto_tree_add_boolean(tt, hf_iscsi_SCSIData_F, tvb, offset + 1, 1, b); } if(enable_03_mode) { proto_tree_add_uint(ti, hf_iscsi_Length03, tvb, offset + 4, 4, data_segment_len); } *************** dissect_iscsi(tvbuff_t *tvb, packet_info *** 925,947 **** else if((enable_03_mode && opcode == 0x85) || (!enable_03_mode && opcode == 0xc5)) { /* SCSI Data (read) */ - gint b = tvb_get_guint8(tvb, offset + 1); if(enable_03_mode) { proto_tree_add_uint(ti, hf_iscsi_Opcode_03, tvb, offset + 0, 1, opcode); ! proto_tree_add_boolean(ti, hf_iscsi_SCSIData_P03, tvb, offset + 1, 1, b); ! proto_tree_add_boolean(ti, hf_iscsi_SCSIData_S03, tvb, offset + 1, 1, b); ! proto_tree_add_boolean(ti, hf_iscsi_SCSIData_O03, tvb, offset + 1, 1, b); ! proto_tree_add_boolean(ti, hf_iscsi_SCSIData_U03, tvb, offset + 1, 1, b); proto_tree_add_uint(ti, hf_iscsi_Length03, tvb, offset + 4, 4, data_segment_len); } else { proto_tree_add_uint(ti, hf_iscsi_Opcode, tvb, offset + 0, 1, opcode); ! proto_tree_add_boolean(ti, hf_iscsi_SCSIData_F, tvb, offset + 1, 1, b); ! proto_tree_add_boolean(ti, hf_iscsi_SCSIData_O, tvb, offset + 1, 1, b); ! proto_tree_add_boolean(ti, hf_iscsi_SCSIData_U, tvb, offset + 1, 1, b); ! proto_tree_add_boolean(ti, hf_iscsi_SCSIData_S, tvb, offset + 1, 1, b); proto_tree_add_uint(ti, hf_iscsi_StatusResponse_is_status, tvb, offset + 3, 1, tvb_get_guint8(tvb, offset + 3)); proto_tree_add_uint(ti, hf_iscsi_DataSegmentLength, tvb, offset + 5, 3, data_segment_len); } --- 997,1030 ---- else if((enable_03_mode && opcode == 0x85) || (!enable_03_mode && opcode == 0xc5)) { /* SCSI Data (read) */ if(enable_03_mode) { proto_tree_add_uint(ti, hf_iscsi_Opcode_03, tvb, offset + 0, 1, opcode); ! { ! gint b = tvb_get_guint8(tvb, offset + 1); ! 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); ! ! proto_tree_add_boolean(tt, hf_iscsi_SCSIData_P03, tvb, offset + 1, 1, b); ! proto_tree_add_boolean(tt, hf_iscsi_SCSIData_S03, tvb, offset + 1, 1, b); ! proto_tree_add_boolean(tt, hf_iscsi_SCSIData_O03, tvb, offset + 1, 1, b); ! proto_tree_add_boolean(tt, hf_iscsi_SCSIData_U03, tvb, offset + 1, 1, b); ! } proto_tree_add_uint(ti, hf_iscsi_Length03, tvb, offset + 4, 4, data_segment_len); } else { proto_tree_add_uint(ti, hf_iscsi_Opcode, tvb, offset + 0, 1, opcode); ! { ! gint b = tvb_get_guint8(tvb, offset + 1); ! 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); ! ! proto_tree_add_boolean(tt, hf_iscsi_SCSIData_F, tvb, offset + 1, 1, b); ! proto_tree_add_boolean(tt, hf_iscsi_SCSIData_O, tvb, offset + 1, 1, b); ! proto_tree_add_boolean(tt, hf_iscsi_SCSIData_U, tvb, offset + 1, 1, b); ! proto_tree_add_boolean(tt, hf_iscsi_SCSIData_S, tvb, offset + 1, 1, b); ! } proto_tree_add_uint(ti, hf_iscsi_StatusResponse_is_status, tvb, offset + 3, 1, tvb_get_guint8(tvb, offset + 3)); proto_tree_add_uint(ti, hf_iscsi_DataSegmentLength, tvb, offset + 5, 3, data_segment_len); } *************** dissect_iscsi(tvbuff_t *tvb, packet_info *** 1005,1020 **** offset += 48; } else if((!enable_03_mode && (opcode == 0x10 || opcode == 0x50))) { /* SNACK Request */ - gint b = tvb_get_guint8(tvb, offset + 1); proto_tree_add_uint(ti, hf_iscsi_Opcode, tvb, offset + 0, 1, opcode); ! proto_tree_add_boolean(ti, hf_iscsi_SNACK_S, tvb, offset + 1, 1, b); proto_tree_add_boolean(ti, hf_iscsi_AddRuns, tvb, offset + 3, 1, tvb_get_guint8(tvb, offset + 3)); proto_tree_add_uint(ti, hf_iscsi_InitiatorTaskTag, tvb, offset + 16, 4, tvb_get_ntohl(tvb, offset + 16)); proto_tree_add_uint(ti, hf_iscsi_BegRun, tvb, offset + 20, 4, tvb_get_ntohl(tvb, offset + 20)); proto_tree_add_uint(ti, hf_iscsi_RunLength, tvb, offset + 24, 4, tvb_get_ntohl(tvb, offset + 24)); ! if(b & 0x01) { proto_tree_add_uint(ti, hf_iscsi_ExpStatSN, tvb, offset + 28, 4, tvb_get_ntohl(tvb, offset + 28)); } else { --- 1088,1110 ---- offset += 48; } else if((!enable_03_mode && (opcode == 0x10 || opcode == 0x50))) { + int S = 0; /* SNACK Request */ proto_tree_add_uint(ti, hf_iscsi_Opcode, tvb, offset + 0, 1, opcode); ! { ! gint b = tvb_get_guint8(tvb, offset + 1); ! 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); ! ! proto_tree_add_boolean(tt, hf_iscsi_SNACK_S, tvb, offset + 1, 1, b); ! S = b & 0x01; ! } proto_tree_add_boolean(ti, hf_iscsi_AddRuns, tvb, offset + 3, 1, tvb_get_guint8(tvb, offset + 3)); proto_tree_add_uint(ti, hf_iscsi_InitiatorTaskTag, tvb, offset + 16, 4, tvb_get_ntohl(tvb, offset + 16)); proto_tree_add_uint(ti, hf_iscsi_BegRun, tvb, offset + 20, 4, tvb_get_ntohl(tvb, offset + 20)); proto_tree_add_uint(ti, hf_iscsi_RunLength, tvb, offset + 24, 4, tvb_get_ntohl(tvb, offset + 24)); ! if(S) { proto_tree_add_uint(ti, hf_iscsi_ExpStatSN, tvb, offset + 28, 4, tvb_get_ntohl(tvb, offset + 28)); } else { *************** dissect_iscsi(tvbuff_t *tvb, packet_info *** 1094,1101 **** offset += 48; } ! if(pdu_len > offset) ! proto_tree_add_bytes(ti, hf_iscsi_Payload, tvb, offset, pdu_len - offset, tvb_get_ptr(tvb, offset, pdu_len - offset)); } return TRUE; --- 1184,1191 ---- offset += 48; } ! if(packet_len > offset) ! proto_tree_add_bytes(ti, hf_iscsi_Payload, tvb, offset, packet_len - offset, tvb_get_ptr(tvb, offset, packet_len - offset)); } return TRUE; *************** proto_register_iscsi(void) *** 1116,1122 **** { &hf_iscsi_Payload, { "Payload", "iscsi.payload", FT_BYTES, BASE_HEX, NULL, 0, ! "Payload" } }, { &hf_iscsi_Opcode, { "Opcode", "iscsi.opcode", --- 1206,1212 ---- { &hf_iscsi_Payload, { "Payload", "iscsi.payload", FT_BYTES, BASE_HEX, NULL, 0, ! "Payload (includes any header digest)" } }, { &hf_iscsi_Opcode, { "Opcode", "iscsi.opcode", *************** proto_register_iscsi(void) *** 1140,1145 **** --- 1230,1240 ---- "Immediate delivery" } }, #endif + { &hf_iscsi_Flags, + { "Flags", "iscsi.flags", + FT_UINT8, BASE_HEX, NULL, 0, + "Opcode specific flags" } + }, { &hf_iscsi_SCSICommand_X03, { "X", "iscsi.scsicommand.x", FT_BOOLEAN, 8, TFS(&iscsi_meaning_X), 0x80, *************** proto_register_iscsi(void) *** 1551,1556 **** --- 1646,1652 ---- static gint *ett[] = { &ett_iscsi_KeyValues, &ett_iscsi_CDB, + &ett_iscsi_Flags, }; /* Register the protocol name and description */
- Follow-Ups:
- Re: [Ethereal-dev] packet-iscsi.c improvements
- From: Guy Harris
- Re: [Ethereal-dev] packet-iscsi.c improvements
- Prev by Date: Re: [Ethereal-dev] glib library
- Next by Date: [Ethereal-dev] 802.11
- Previous by thread: [Ethereal-dev] Dynamically loading libxml2
- Next by thread: Re: [Ethereal-dev] packet-iscsi.c improvements
- Index(es):