aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-gfp.c
diff options
context:
space:
mode:
authorMichael Mann <mmann78@netscape.net>2016-07-10 23:47:28 -0400
committerMichael Mann <mmann78@netscape.net>2016-07-21 12:35:22 +0000
commitad6fc87d64de30cdcdca18168a117d2ec24591da (patch)
treeb5df109654ae6806db7544933f8bf1a848a02ae7 /epan/dissectors/packet-gfp.c
parent1e19f55f0c44b850bc6304be28d5b272a3553204 (diff)
Add proto_tree_add_checksum.
This is an attempt to standardize display/handling of checksum fields for all dissectors. The main target is for dissectors that do validation, but dissectors that just report the checksum were also included just to make them easier to find in the future. Bug: 10620 Bug: 12058 Ping-Bug: 8859 Change-Id: Ia8abd86e42eaf8ed50de6b173409e914b17993bf Reviewed-on: https://code.wireshark.org/review/16380 Petri-Dish: Michael Mann <mmann78@netscape.net> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Jeff Morriss <jeff.morriss.ws@gmail.com> Reviewed-by: Michael Mann <mmann78@netscape.net>
Diffstat (limited to 'epan/dissectors/packet-gfp.c')
-rw-r--r--epan/dissectors/packet-gfp.c76
1 files changed, 18 insertions, 58 deletions
diff --git a/epan/dissectors/packet-gfp.c b/epan/dissectors/packet-gfp.c
index dd8282921a..df96244d71 100644
--- a/epan/dissectors/packet-gfp.c
+++ b/epan/dissectors/packet-gfp.c
@@ -53,8 +53,7 @@ void proto_register_gfp(void);
static int proto_gfp = -1;
static int hf_gfp_pli = -1;
static int hf_gfp_chec = -1;
-static int hf_gfp_chec_good = -1;
-static int hf_gfp_chec_bad = -1;
+static int hf_gfp_chec_status = -1;
static int hf_gfp_type = -1;
static int hf_gfp_pti = -1;
static int hf_gfp_pfi = -1;
@@ -62,12 +61,10 @@ static int hf_gfp_exi = -1;
static int hf_gfp_upi_data = -1;
static int hf_gfp_upi_management = -1;
static int hf_gfp_thec = -1;
-static int hf_gfp_thec_good = -1;
-static int hf_gfp_thec_bad = -1;
+static int hf_gfp_thec_status = -1;
static int hf_gfp_cid = -1;
static int hf_gfp_ehec = -1;
-static int hf_gfp_ehec_good = -1;
-static int hf_gfp_ehec_bad = -1;
+static int hf_gfp_ehec_status = -1;
static int hf_gfp_fcs = -1;
static int hf_gfp_fcs_good = -1;
static int hf_gfp_fcs_bad = -1;
@@ -93,10 +90,7 @@ static expert_field ei_gfp_fcs_bad = EI_INIT;
/* Initialize the subtree pointers */
static gint ett_gfp = -1;
-static gint ett_gfp_chec = -1;
static gint ett_gfp_type = -1;
-static gint ett_gfp_thec = -1;
-static gint ett_gfp_ehec = -1;
static gint ett_gfp_fcs = -1;
static dissector_table_t gfp_dissector_table;
@@ -205,34 +199,15 @@ static gpointer gfp_value(packet_info *pinfo)
/* GFP has several identical 16 bit CRCs in its header (HECs). Note that
* this function increases the offset. */
static void
-gfp_add_hec_tree(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint *offset, const guint len, const int field, const int field_good, const int field_bad, const gint ett, expert_field *ei_bad)
+gfp_add_hec_tree(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint *offset, const guint len, const int field, const int field_status, expert_field *ei_bad)
{
- proto_item* ti = NULL;
- proto_tree* hec_tree = NULL;
- guint hec, hec_calc;
+ guint hec_calc;
hec_calc = crc16_r3_ccitt_tvb(tvb, *offset, len);
*offset += len;
- hec = tvb_get_ntohs(tvb, *offset);
-
- if ( hec == hec_calc ) {
- ti = proto_tree_add_uint_format_value(tree, field, tvb, *offset, 2, hec, "0x%04x [correct]", hec);
- hec_tree = proto_item_add_subtree(ti, ett);
- ti = proto_tree_add_boolean(hec_tree, field_good, tvb, *offset, 2, TRUE);
- PROTO_ITEM_SET_GENERATED(ti);
- ti = proto_tree_add_boolean(hec_tree, field_bad, tvb, *offset, 2, FALSE);
- PROTO_ITEM_SET_GENERATED(ti);
- } else {
- ti = proto_tree_add_uint_format_value(tree, field, tvb, *offset, 2, hec, "0x%04x [incorrect, should be 0x%04x]", hec, hec_calc);
- hec_tree = proto_item_add_subtree(ti, ett);
- ti = proto_tree_add_boolean(hec_tree, field_good, tvb, *offset, 2, FALSE);
- PROTO_ITEM_SET_GENERATED(ti);
- ti = proto_tree_add_boolean(hec_tree, field_bad, tvb, *offset, 2, TRUE);
- PROTO_ITEM_SET_GENERATED(ti);
- expert_add_info(pinfo, ti, ei_bad);
- }
+ proto_tree_add_checksum(tree, tvb, *offset, field, field_status, ei_bad, pinfo, hec_calc, ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY);
*offset += 2;
}
@@ -283,7 +258,7 @@ dissect_gfp_payload(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_t
}
/* G.7041 6.1.2.1.2 Type HEC (tHEC) - mandatory 2 bytes */
- gfp_add_hec_tree(tvb, pinfo, gfp_tree, offset, 2, hf_gfp_thec, hf_gfp_thec_good, hf_gfp_thec_bad, ett_gfp_thec, &ei_gfp_thec_bad);
+ gfp_add_hec_tree(tvb, pinfo, gfp_tree, offset, 2, hf_gfp_thec, hf_gfp_thec_status, &ei_gfp_thec_bad);
switch (exi) {
case GFP_EXT_NULL:
@@ -303,7 +278,7 @@ dissect_gfp_payload(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_t
/* Next byte spare field, reserved */
/* 6.1.2.1.4 Extension HEC field */
- gfp_add_hec_tree(tvb, pinfo, gfp_tree, offset, 2, hf_gfp_ehec, hf_gfp_ehec_good, hf_gfp_ehec_bad, ett_gfp_ehec, &ei_gfp_ehec_bad);
+ gfp_add_hec_tree(tvb, pinfo, gfp_tree, offset, 2, hf_gfp_ehec, hf_gfp_ehec_status, &ei_gfp_ehec_bad);
break;
case GFP_EXT_RING:
/* 6.1.2.1.3.3 Extension header for a ring frame */
@@ -429,7 +404,7 @@ dissect_gfp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree,
col_set_str(pinfo->cinfo, COL_INFO, rval_to_str_const(pli, gfp_pli_rvals, "Unknown"));
/* 6.1.1.2 Core HEC field */
- gfp_add_hec_tree(tvb, pinfo, gfp_tree, &offset, len, hf_gfp_chec, hf_gfp_chec_good, hf_gfp_chec_bad, ett_gfp_chec, &ei_gfp_chec_bad);
+ gfp_add_hec_tree(tvb, pinfo, gfp_tree, &offset, len, hf_gfp_chec, hf_gfp_chec_status, &ei_gfp_chec_bad);
if (pli == 0) { /* 6.2.1 GFP idle frames */
if (tvb_reported_length_remaining(tvb, offset)) {
@@ -465,13 +440,9 @@ proto_register_gfp(void)
{ "Core HEC", "gfp.chec", FT_UINT16, BASE_HEX,
NULL, 0x0, NULL, HFILL }
},
- { &hf_gfp_chec_good,
- { "Good cHEC", "gfp.chec_good", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
- "True: cHEC matches core header; False: doesn't match", HFILL }
- },
- { &hf_gfp_chec_bad,
- { "Bad cHEC", "gfp.chec_bad", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
- "True: cHEC doesn't match core header; False: matches", HFILL }
+ { &hf_gfp_chec_status,
+ { "cHEC Status", "gfp.chec.status", FT_UINT8, BASE_NONE, VALS(proto_checksum_vals), 0x0,
+ NULL, HFILL }
},
{ &hf_gfp_type,
{ "Type Field", "gfp.type", FT_UINT16, BASE_HEX, NULL, 0x0,
@@ -503,13 +474,9 @@ proto_register_gfp(void)
{ "Type HEC", "gfp.thec", FT_UINT16, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
- { &hf_gfp_thec_good,
- { "Good tHEC", "gfp.thec_good", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
- "True: tHEC matches type header; False: doesn't match", HFILL }
- },
- { &hf_gfp_thec_bad,
- { "Bad tHEC", "gfp.thec_bad", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
- "True: tHEC doesn't match type header; False: matches", HFILL }
+ { &hf_gfp_thec_status,
+ { "tHEC Status", "gfp.thec.status", FT_UINT8, BASE_NONE, VALS(proto_checksum_vals), 0x0,
+ NULL, HFILL }
},
{ &hf_gfp_cid,
{ "Channel ID", "gfp.cid", FT_UINT8, BASE_HEX, NULL, 0x0,
@@ -519,13 +486,9 @@ proto_register_gfp(void)
{ "Extension HEC", "gfp.ehec", FT_UINT16, BASE_HEX, NULL, 0x0,
NULL, HFILL }
},
- { &hf_gfp_ehec_good,
- { "Good eHEC", "gfp.ehec_good", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
- "True: eHEC matches extension header; False: doesn't match", HFILL }
- },
- { &hf_gfp_ehec_bad,
- { "Bad eHEC", "gfp.ehec_bad", FT_BOOLEAN, BASE_NONE, NULL, 0x0,
- "True: eHEC doesn't match extension header; False: matches", HFILL }
+ { &hf_gfp_ehec_status,
+ { "eHEC Status", "gfp.ehec.status", FT_UINT8, BASE_NONE, VALS(proto_checksum_vals), 0x0,
+ NULL, HFILL }
},
{ &hf_gfp_fcs,
{ "Payload FCS", "gfp.fcs", FT_UINT32, BASE_HEX, NULL, 0x0,
@@ -544,10 +507,7 @@ proto_register_gfp(void)
/* Setup protocol subtree array */
static gint *ett[] = {
&ett_gfp,
- &ett_gfp_chec,
&ett_gfp_type,
- &ett_gfp_thec,
- &ett_gfp_ehec,
&ett_gfp_fcs
};