aboutsummaryrefslogtreecommitdiffstats
path: root/epan
diff options
context:
space:
mode:
authorBill Meier <wmeier@newsguy.com>2012-04-01 21:31:51 +0000
committerBill Meier <wmeier@newsguy.com>2012-04-01 21:31:51 +0000
commitb27ca5bf7ee307b1d9fea684beafadd71282f8bf (patch)
tree225b4ddd9ed58fcee9ff36203d604857212b734a /epan
parent16421a31cc61ec865fe921796095097cc3e87941 (diff)
Fix some bugs related to the use of proto_tree_add_bits_item();
Improve details pane display of a few TN3270 fields. svn path=/trunk/; revision=41889
Diffstat (limited to 'epan')
-rw-r--r--epan/dissectors/packet-tn3270.c150
1 files changed, 112 insertions, 38 deletions
diff --git a/epan/dissectors/packet-tn3270.c b/epan/dissectors/packet-tn3270.c
index 934f83734b..8cd438a783 100644
--- a/epan/dissectors/packet-tn3270.c
+++ b/epan/dissectors/packet-tn3270.c
@@ -4,13 +4,23 @@
* References:
* 3270 Information Display System: Data Stream Programmer's Reference
* GA23-0059-07
- * (http://publib.boulder.ibm.com/cgi-bin/bookmgr_OS390/BOOKS/CN7P4000)
- *
- * (Paragraph references in the comments in this file (e.g., 6.15) are to the above document)
+ * http://publib.boulder.ibm.com/cgi-bin/bookmgr_OS390/BOOKS/CN7P4000
+ * (Paragraph references in the comments in this file (e.g., 6.15) are to the above document)
*
* 3174 Establishment Controller Functional Description
* GA23-0218-11
- * (http://publib.boulder.ibm.com/cgi-bin/bookmgr/BOOKS/cn7a7003)
+ * http://publib.boulder.ibm.com/cgi-bin/bookmgr/BOOKS/cn7a7003
+ *
+ *
+ * RFC 1041: Telnet 3270 Regime Option
+ * http://tools.ietf.org/html/rfc1041
+ *
+ * RFC 1576: TN3270 Current Practices
+ * http://tools.ietf.org/html/rfc1576
+ *
+ * RFC 2355: TN3270 Enhancements
+ * http://tools.ietf.org/html/rfc2355
+ *
*
* Copyright 2009, Robert Hogan <robert@roberthogan.net>
*
@@ -55,8 +65,8 @@
* document, the references to bit numbers in the text and tables
* are based upon the "MSB 0" bit numbering scheme.
* That is: bits are numbered in a byte from left-to-right:
- * "Bit 0": MSB
- * "Bit 7": LSB
+ * "Bit 0" is the MSB of the byte
+ * "Bit 7" is the LSB of the byte
*/
/*
@@ -587,6 +597,37 @@ static const value_string vals_read_partition_reqtype[] = {
{ 0x00, NULL }
};
+/*--- 5.34 Data Chain ----- */
+#define DATA_CHAIN_GROUP_MASK 0x60
+#define DATA_CHAIN_INBOUND_CONTROL_MASK 0x18
+
+static const value_string vals_data_chain_group[] = {
+ { 0x00, "Continue" },
+ { 0x01, "End" },
+ { 0x02, "Begin" },
+ { 0x03, "Only" },
+ { 0x00, NULL }
+};
+
+static const value_string vals_data_chain_inbound_control[] = {
+ { 0x00, "No Change" },
+ { 0x01, "Enable Inbound Data Chaining" },
+ { 0x02, "Disable Inbound Data Chaining" },
+ { 0x03, "Reserved" },
+ { 0x00, NULL }
+};
+
+/*--- 5.35 Destination or Origin ----- */
+#define DESTINATION_OR_ORIGIN_FLAGS_INPUT_CONTROL_MASK 0xC0
+
+static const value_string vals_destination_or_origin_flags_input_control[] = {
+ { 0x00, "Enable input" },
+ { 0x01, "No Change" },
+ { 0x02, "Disable Input" },
+ { 0x03, "Reserved" },
+ { 0x00, NULL }
+};
+
/* INBOUND DATA STREAM (DISPLAY -> MAINFRAME PROGRAM) */
@@ -1256,8 +1297,10 @@ static int hf_tn3270_c_seqoff = -1;
static int hf_tn3270_c_sequence = -1;
static int hf_tn3270_cursor_address = -1;
static int hf_tn3270_cw = -1;
-static int hf_tn3270_data_chain_bitmask = -1;
-static int hf_tn3270_destination_or_origin_bitmask = -1;
+static int hf_tn3270_data_chain_fields = -1;
+static int hf_tn3270_data_chain_group = -1;
+static int hf_tn3270_data_chain_inbound_control = -1;
+static int hf_tn3270_destination_or_origin_flags_input_control = -1;
static int hf_tn3270_destination_or_origin_doid = -1;
static int hf_tn3270_erase_flags = -1;
static int hf_tn3270_exception_or_status_flags = -1;
@@ -1583,6 +1626,7 @@ static gint ett_tn3270_cs_descriptor_flags = -1;
static gint ett_tn3270_color_flags = -1;
static gint ett_tn3270_ccc = -1;
static gint ett_tn3270_msr_state_mask = -1;
+static gint ett_tn3270_data_chain_fields = -1;
static gint ett_tn3270_query_list = -1;
static gint dissect_orders_and_data(proto_tree *tn3270_tree, tvbuff_t *tvb, gint offset, tn3270_conv_info_t *tn3270_info);
@@ -2056,6 +2100,7 @@ dissect_outbound_3270ds(proto_tree *tn3270_tree, tvbuff_t *tvb, gint offset,
case CC_SNA_EW:
case CC_SNA_EWA:
case CC_SNA_EAU:
+ /* Note: EW/EWA
/* WCC */
if ((offset - start) < sf_body_length)
offset += dissect_wcc(tn3270_tree, tvb, offset);
@@ -2487,7 +2532,33 @@ dissect_type_1_text(proto_tree *tn3270_tree, tvbuff_t *tvb, gint offset,
return (offset - start);
}
-/* 5.34 Data Chain - Search for DATA_CHAIN*/
+/* 5.34 Data Chain */
+static guint
+dissect_data_chain(proto_tree *tn3270_tree, tvbuff_t *tvb, gint offset,
+ gint sf_body_length)
+{
+ gint start = offset;
+
+ static const gint *byte[] = {
+ &hf_tn3270_data_chain_group,
+ &hf_tn3270_data_chain_inbound_control,
+ NULL
+ };
+
+ static const hf_items data_chain_fields[] = {
+ { &hf_tn3270_data_chain_fields, &ett_tn3270_data_chain_fields, 1, byte, 0 },
+ { &hf_tn3270_resbyte, NULL, 1, NULL, ENC_BIG_ENDIAN },
+ { NULL, NULL, 0, NULL, 0 }
+ };
+
+ offset += tn3270_add_hf_items(tn3270_tree, tvb, offset,
+ data_chain_fields);
+
+ offset += dissect_unknown_data(tn3270_tree, tvb, offset, start, sf_body_length);
+
+ return (offset - start);
+}
+
/* 5.35 Destination/Origin - Search for DESTINATION_OR_ORIGIN*/
/* 5.36 Object Control */
@@ -4337,9 +4408,10 @@ process_outbound_structured_field(proto_tree *sf_tree, tvbuff_t *tvb, gint offse
offset += dissect_create_partition(sf_tree, tvb, offset, sf_body_length);
break;
case SF_OB_ERASE_OR_RESET:
+ /* Bit 0: 0= Use default size; 1= use alternate size */
proto_tree_add_bits_item(sf_tree,
hf_tn3270_erase_flags,
- tvb, offset,
+ tvb, offset<<3,
1,
ENC_BIG_ENDIAN);
offset += 1;
@@ -4417,15 +4489,15 @@ process_outbound_structured_field(proto_tree *sf_tree, tvbuff_t *tvb, gint offse
/*TODO: use bits_text */
proto_tree_add_bits_item(sf_tree,
hf_tn3270_begin_end_flags1,
- tvb, offset,
- 1,
+ tvb, offset<<3,
+ 2,
ENC_BIG_ENDIAN);
offset += 1;
- proto_tree_add_bits_item(sf_tree,
- hf_tn3270_begin_end_flags2,
- tvb, offset,
- 1,
- ENC_BIG_ENDIAN);
+ proto_tree_add_item(sf_tree,
+ hf_tn3270_begin_end_flags2,
+ tvb, offset,
+ 1,
+ ENC_BIG_ENDIAN);
offset += 1;
break;
case SF_OB_LOAD_COLOR_TABLE:
@@ -4518,22 +4590,11 @@ process_outbound_inbound_structured_field(proto_tree *tn3270_tree, tvbuff_t *tvb
switch (sf_id) {
case SF_OB_IB_DATA_CHAIN:
- proto_tree_add_bits_item(tn3270_tree,
- hf_tn3270_data_chain_bitmask,
- tvb, offset,
- 1,
- ENC_BIG_ENDIAN);
- offset += 1;
- proto_tree_add_item(tn3270_tree,
- hf_tn3270_resbyte,
- tvb, offset,
- 1,
- ENC_BIG_ENDIAN);
- offset += 1;
+ offset += dissect_data_chain(tn3270_tree, tvb, offset, sf_body_length);
break;
case SF_OB_IB_DESTINATION_OR_ORIGIN:
- proto_tree_add_bits_item(tn3270_tree,
- hf_tn3270_destination_or_origin_bitmask,
+ proto_tree_add_item(tn3270_tree,
+ hf_tn3270_destination_or_origin_flags_input_control,
tvb, offset,
1,
ENC_BIG_ENDIAN);
@@ -6075,19 +6136,31 @@ proto_register_tn3270(void)
/* END - 5.30 - Set Reply Mode */
/* 5.34 - Data Chain */
- { &hf_tn3270_data_chain_bitmask,
- { "Mask",
- "tn3270.data_chain_bitmask",
+ { &hf_tn3270_data_chain_fields,
+ { "Data Chain Fields",
+ "tn3270.data_chain_fields",
FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
+ { &hf_tn3270_data_chain_group,
+ { "Data Chain Group",
+ "tn3270.data_chain_group",
+ FT_UINT8, BASE_HEX, VALS(vals_data_chain_group), DATA_CHAIN_GROUP_MASK,
+ NULL, HFILL }
+ },
+ { &hf_tn3270_data_chain_inbound_control,
+ { "Data Chain Inbound Control",
+ "tn3270.data_chain_inbound_control",
+ FT_UINT8, BASE_HEX, VALS(vals_data_chain_inbound_control), DATA_CHAIN_INBOUND_CONTROL_MASK,
+ NULL, HFILL }
+ },
/* END - 5.34 - Data Chain */
/* 5.35 - Destination/Origin */
- { &hf_tn3270_destination_or_origin_bitmask,
- { "Mask",
- "tn3270.destination_or_origin_bitmask",
- FT_UINT8, BASE_HEX, NULL, 0x0,
+ { &hf_tn3270_destination_or_origin_flags_input_control,
+ { "Input Control",
+ "tn3270.destination_or_origin_flags_input_control",
+ FT_UINT8, BASE_HEX, VALS(vals_destination_or_origin_flags_input_control), DESTINATION_OR_ORIGIN_FLAGS_INPUT_CONTROL_MASK,
NULL, HFILL }
},
{ &hf_tn3270_destination_or_origin_doid,
@@ -7564,6 +7637,7 @@ proto_register_tn3270(void)
&ett_tn3270_wcc,
&ett_tn3270_ccc,
&ett_tn3270_msr_state_mask,
+ &ett_tn3270_data_chain_fields,
&ett_tn3270_query_list
};