From ad6fc87d64de30cdcdca18168a117d2ec24591da Mon Sep 17 00:00:00 2001 From: Michael Mann Date: Sun, 10 Jul 2016 23:47:28 -0400 Subject: [PATCH] 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 Tested-by: Petri Dish Buildbot Reviewed-by: Jeff Morriss Reviewed-by: Michael Mann --- colorfilters | 2 +- debian/libwireshark0.symbols | 1 + doc/README.dissector | 3 +- docbook/release-notes.asciidoc | 7 + .../asn1/c1222/packet-c1222-template.c | 24 ++-- epan/dissectors/packet-6lowpan.c | 3 +- epan/dissectors/packet-aol.c | 2 +- epan/dissectors/packet-artnet.c | 3 +- epan/dissectors/packet-asap.c | 5 +- epan/dissectors/packet-atalk.c | 106 +++++---------- epan/dissectors/packet-ax25-kiss.c | 12 +- epan/dissectors/packet-bitcoin.c | 2 +- epan/dissectors/packet-btatt.c | 2 +- epan/dissectors/packet-c1222.c | 28 ++-- epan/dissectors/packet-carp.c | 14 +- epan/dissectors/packet-cattp.c | 29 ++-- epan/dissectors/packet-cdp.c | 70 +++------- epan/dissectors/packet-cfdp.c | 2 +- epan/dissectors/packet-clnp.c | 48 ++----- epan/dissectors/packet-dccp.c | 36 ++--- epan/dissectors/packet-dec-dnart.c | 20 +-- epan/dissectors/packet-dji-uav.c | 3 +- epan/dissectors/packet-dmp.c | 54 ++------ epan/dissectors/packet-dmx.c | 48 +------ epan/dissectors/packet-dvb-s2-bb.c | 12 +- epan/dissectors/packet-dvmrp.c | 12 +- epan/dissectors/packet-eigrp.c | 17 +-- epan/dissectors/packet-epon.c | 12 +- epan/dissectors/packet-esis.c | 35 ++--- epan/dissectors/packet-eth.c | 57 ++------ epan/dissectors/packet-extreme.c | 49 ++----- epan/dissectors/packet-fc.c | 46 ++----- epan/dissectors/packet-fcoe.c | 42 +----- epan/dissectors/packet-fcoib.c | 42 +----- epan/dissectors/packet-fcswils.c | 2 +- epan/dissectors/packet-fefd.c | 39 +++--- epan/dissectors/packet-foundry.c | 2 +- epan/dissectors/packet-gdb.c | 3 +- epan/dissectors/packet-gfp.c | 76 +++-------- epan/dissectors/packet-gre.c | 18 +-- epan/dissectors/packet-h223.c | 16 +-- epan/dissectors/packet-hartip.c | 2 +- epan/dissectors/packet-hip.c | 32 ++--- epan/dissectors/packet-homeplug-av.c | 8 +- epan/dissectors/packet-icmp.c | 68 ++-------- epan/dissectors/packet-icmpv6.c | 71 ++++------ epan/dissectors/packet-idp.c | 2 +- epan/dissectors/packet-ieee80211.c | 57 ++------ epan/dissectors/packet-igap.c | 10 +- epan/dissectors/packet-igmp.c | 43 ++---- epan/dissectors/packet-igmp.h | 2 +- epan/dissectors/packet-igrp.c | 2 +- epan/dissectors/packet-ip.c | 88 +++--------- epan/dissectors/packet-ipv6.c | 4 +- epan/dissectors/packet-ipx.c | 2 +- epan/dissectors/packet-isis-hello.c | 31 ++--- epan/dissectors/packet-isis-lsp.c | 70 +++------- epan/dissectors/packet-isis-snp.c | 27 ++-- epan/dissectors/packet-itdm.c | 4 +- epan/dissectors/packet-kingfisher.c | 8 +- epan/dissectors/packet-lapd.c | 39 ++---- epan/dissectors/packet-lmp.c | 19 +-- epan/dissectors/packet-manolito.c | 4 +- epan/dissectors/packet-mbtcp.c | 13 +- epan/dissectors/packet-mip6.c | 4 +- epan/dissectors/packet-mpeg-dsmcc.c | 4 +- epan/dissectors/packet-mpeg-sect.c | 35 ++--- epan/dissectors/packet-mrdisc.c | 12 +- epan/dissectors/packet-msnip.c | 14 +- epan/dissectors/packet-mstp.c | 97 +++---------- epan/dissectors/packet-mswsp.c | 3 +- epan/dissectors/packet-mtp2.c | 16 +-- epan/dissectors/packet-netsync.c | 4 +- epan/dissectors/packet-nhrp.c | 27 +--- epan/dissectors/packet-nlsp.c | 8 +- epan/dissectors/packet-nsrp.c | 4 +- epan/dissectors/packet-osi.c | 71 ++++------ epan/dissectors/packet-osi.h | 15 +- epan/dissectors/packet-ositp.c | 61 ++++----- epan/dissectors/packet-ospf.c | 2 +- epan/dissectors/packet-pgm.c | 28 ++-- epan/dissectors/packet-pim.c | 37 ++--- epan/dissectors/packet-ppp.c | 29 +--- epan/dissectors/packet-quake2.c | 5 +- epan/dissectors/packet-rdm.c | 48 ++----- epan/dissectors/packet-rfid-pn532-hci.c | 6 +- epan/dissectors/packet-rgmp.c | 10 +- epan/dissectors/packet-rohc.c | 4 +- epan/dissectors/packet-roofnet.c | 4 +- epan/dissectors/packet-rtp-midi.c | 12 +- epan/dissectors/packet-rtps.c | 4 +- epan/dissectors/packet-rudp.c | 2 +- epan/dissectors/packet-s7comm.c | 2 +- epan/dissectors/packet-sbus.c | 31 ++--- epan/dissectors/packet-sctp.c | 68 ++++------ epan/dissectors/packet-selfm.c | 14 +- epan/dissectors/packet-shim6.c | 49 ++----- epan/dissectors/packet-simple.c | 23 +--- epan/dissectors/packet-sml.c | 48 +++---- epan/dissectors/packet-stt.c | 75 ++-------- epan/dissectors/packet-synphasor.c | 4 +- epan/dissectors/packet-sysex.c | 12 +- epan/dissectors/packet-tcp.c | 101 ++++---------- epan/dissectors/packet-teamspeak2.c | 33 ++--- epan/dissectors/packet-tnef.c | 2 +- epan/dissectors/packet-tns.c | 12 +- epan/dissectors/packet-ua3g.c | 2 +- epan/dissectors/packet-udld.c | 2 +- epan/dissectors/packet-udp.c | 111 ++++----------- epan/dissectors/packet-v5dl.c | 34 +---- epan/dissectors/packet-vines.c | 2 +- epan/dissectors/packet-vrrp.c | 37 ++--- epan/dissectors/packet-wcp.c | 3 +- epan/dissectors/packet-xip-serval.c | 25 +--- epan/dissectors/packet-xtp.c | 17 +-- epan/dissectors/packet-zrtp.c | 46 ++----- epan/proto.c | 128 ++++++++++++++++++ epan/proto.h | 43 ++++++ plugins/irda/packet-sir.c | 42 +++--- plugins/profinet/packet-pn-rt.c | 51 +++---- plugins/wimax/mac_hd_generic_decoder.c | 12 +- plugins/wimax/msg_dlmap.c | 96 +++---------- plugins/wimax/msg_ulmap.c | 109 ++++++--------- plugins/wimax/wimax_harq_map_decoder.c | 12 +- profiles/Bluetooth/colorfilters | 2 +- profiles/Classic/colorfilters | 2 +- tools/checkAPIs.pl | 2 +- 127 files changed, 1114 insertions(+), 2314 deletions(-) diff --git a/colorfilters b/colorfilters index ca0e03f9c6..5dd37ce09e 100644 --- a/colorfilters +++ b/colorfilters @@ -9,7 +9,7 @@ @TCP RST@tcp.flags.reset eq 1@[42148,0,0][65535,64764,40092] @SCTP ABORT@sctp.chunk_type eq ABORT@[42148,0,0][65535,64764,40092] @TTL low or unexpected@( ! ip.dst == 224.0.0.0/4 && ip.ttl < 5 && !pim && !ospf) || (ip.dst == 224.0.0.0/24 && ip.dst != 224.0.0.251 && ip.ttl != 1 && !(vrrp || carp))@[42148,0,0][60652,61680,60395] -@Checksum Errors@eth.fcs_bad==1 || ip.checksum_bad==1 || tcp.checksum_bad==1 || udp.checksum_bad==1 || sctp.checksum_bad==1 || mstp.checksum_bad==1 || cdp.checksum_bad==1 || edp.checksum_bad==1 || wlan.fcs_bad==1 || stt.checksum.bad==1@[4718,10030,11796][63479,34695,34695] +@Checksum Errors@eth.fcs.status=="Bad" || ip.checksum.status=="Bad" || tcp.checksum.status=="Bad" || udp.checksum.status=="Bad" || sctp.checksum.status=="Bad" || mstp.checksum.status=="Bad" || cdp.checksum.status=="Bad" || edp.checksum.status=="Bad" || wlan.fcs.status=="Bad" || stt.checksum.status=="Bad"@[4718,10030,11796][63479,34695,34695] @SMB@smb || nbss || nbns || nbipx || ipxsap || netbios@[65278,65535,53456][4718,10030,11796] @HTTP@http || tcp.port == 80 || http2@[58596,65535,51143][4718,10030,11796] @IPX@ipx || spx@[65534,58325,58808][4718,10030,11796] diff --git a/debian/libwireshark0.symbols b/debian/libwireshark0.symbols index af7736636c..23ed83067c 100644 --- a/debian/libwireshark0.symbols +++ b/debian/libwireshark0.symbols @@ -1053,6 +1053,7 @@ libwireshark.so.0 libwireshark0 #MINVER# proto_tree_add_bytes_format_value@Base 1.9.1 proto_tree_add_bytes_item@Base 1.12.0~rc1 proto_tree_add_bytes_with_length@Base 1.99.3 + proto_tree_add_checksum@Base 2.1.1 proto_tree_add_debug_text@Base 1.9.1 proto_tree_add_double@Base 1.9.1 proto_tree_add_double_format@Base 1.9.1 diff --git a/doc/README.dissector b/doc/README.dissector index 17b3273336..74409bd390 100644 --- a/doc/README.dissector +++ b/doc/README.dissector @@ -1996,8 +1996,7 @@ presented as a subtree, where the result is enclosed in square brackets indicating a generated field. Header checksum: 0x3d42 [correct] - [Good: True] - [Bad: False] + [Checksum Status: Good (1)] PROTO_ITEM_SET_HIDDEN() ----------------------- diff --git a/docbook/release-notes.asciidoc b/docbook/release-notes.asciidoc index 9dc5aa45e7..897b7e15c9 100644 --- a/docbook/release-notes.asciidoc +++ b/docbook/release-notes.asciidoc @@ -41,6 +41,13 @@ since version 2.1.0: * The RTP player now allows up to 30 minutes of silence frames. * Packet bytes can now be displayed as EBCDIC. * The Qt UI loads captures faster on Windows. +* proto_tree_add_checksum was added as an API. This attempts to + standardize how checksums are reported and filtered for within + *Shark. There are no more individual "good" and "bad" filter + fields, protocols now have a "checksum.status" field that records + "Good", "Bad" and "Unverified" (neither good or bad). Color filters + provided with Wireshark have been adjusted to the new display filter + names, but custom ones may need to be updated. The following features are new (or have been significantly updated) since version 2.0.0: diff --git a/epan/dissectors/asn1/c1222/packet-c1222-template.c b/epan/dissectors/asn1/c1222/packet-c1222-template.c index c01a342ea0..bf4269dc5f 100644 --- a/epan/dissectors/asn1/c1222/packet-c1222-template.c +++ b/epan/dissectors/asn1/c1222/packet-c1222-template.c @@ -123,6 +123,7 @@ static int hf_c1222_write_size = -1; static int hf_c1222_write_data = -1; static int hf_c1222_procedure_num = -1; static int hf_c1222_write_chksum = -1; +static int hf_c1222_write_chksum_status = -1; static int hf_c1222_wait_secs = -1; static int hf_c1222_neg_pkt_size = -1; static int hf_c1222_neg_nbr_pkts = -1; @@ -380,7 +381,6 @@ parse_c1222_detailed(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int cm gchar *auth_req = NULL; guint16 table = 0; guint16 tblsize = 0; - guint8 chksum = 0; guint16 calcsum = 0; guint8 wait_seconds = 0; int numrates = 0; @@ -392,7 +392,6 @@ parse_c1222_detailed(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int cm guint8 inter_char; guint8 resp_to; guint8 nbr_retries; - proto_item *item = NULL; /* special case to simplify handling of Negotiate service */ if ((cmd & 0xF0) == C1222_CMD_NEGOTIATE) { @@ -509,16 +508,14 @@ parse_c1222_detailed(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int cm proto_tree_add_item(tree, hf_c1222_write_data, tvb, *offset, tblsize, ENC_NA); *offset += tblsize; *length -= tblsize; - chksum = tvb_get_guint8(tvb, *offset); - item = proto_tree_add_uint(tree, hf_c1222_write_chksum, tvb, *offset, 1, chksum); if (table == 7) {/* is it a procedure call? */ calcsum = c1222_cksum(tvb, (*offset)-tblsize-2, tblsize+2); } else { calcsum = c1222_cksum(tvb, (*offset)-tblsize, tblsize); } - if (chksum != calcsum) { - expert_add_info_format(pinfo, item, &ei_c1222_bad_checksum, "Bad checksum [should be 0x%02x]", calcsum); - } + proto_tree_add_checksum(tree, tvb, *offset, hf_c1222_write_chksum, hf_c1222_write_chksum_status, + &ei_c1222_bad_checksum, pinfo, calcsum, ENC_NA, PROTO_CHECKSUM_VERIFY); + if (table == 7) {/* is it a procedure call? */ proto_item_set_text(tree, "C12.22 EPSEM: %s (%s-%d, %s-%d)", val_to_str(cmd,commandnames,"Unknown (0x%02x)"), @@ -555,12 +552,9 @@ parse_c1222_detailed(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int cm proto_tree_add_item(tree, hf_c1222_write_data, tvb, *offset, tblsize, ENC_NA); *offset += tblsize; *length -= tblsize; - chksum = tvb_get_guint8(tvb, *offset); - item = proto_tree_add_uint(tree, hf_c1222_write_chksum, tvb, *offset, 1, chksum); calcsum = c1222_cksum(tvb, (*offset)-tblsize, tblsize); - if (chksum != calcsum) { - expert_add_info_format(pinfo, item, &ei_c1222_bad_checksum, "Bad checksum [should be 0x%02x]", calcsum); - } + proto_tree_add_checksum(tree, tvb, *offset, hf_c1222_write_chksum, hf_c1222_write_chksum_status, + &ei_c1222_bad_checksum, pinfo, calcsum, ENC_NA, PROTO_CHECKSUM_VERIFY); proto_item_set_text(tree, "C12.22 EPSEM: %s (%s-%d)", val_to_str(cmd,commandnames,"Unknown (0x%02x)"), val_to_str((table >> 8) & 0xF8, tableflags,"Unknown (0x%04x)"), table & 0x7FF); @@ -1259,6 +1253,12 @@ void proto_register_c1222(void) { NULL, 0x0, NULL, HFILL } }, + { &hf_c1222_write_chksum_status, + { "C12.22 Table Data Checksum Status", "c1222.write.chksum.status", + FT_UINT8, BASE_NONE, + VALS(proto_checksum_vals), 0x0, + NULL, HFILL } + }, { &hf_c1222_procedure_num, { "C12.22 Procedure Number", "c1222.procedure.num", FT_UINT16, BASE_DEC, diff --git a/epan/dissectors/packet-6lowpan.c b/epan/dissectors/packet-6lowpan.c index 52483e6fcd..9dd6620644 100644 --- a/epan/dissectors/packet-6lowpan.c +++ b/epan/dissectors/packet-6lowpan.c @@ -2088,9 +2088,8 @@ dissect_6lowpan_iphc_nhc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gi if (!(udp_flags & LOWPAN_NHC_UDP_CHECKSUM)) { /* Parse the checksum. */ udp.checksum = tvb_get_ntohs(tvb, offset); - proto_tree_add_uint(tree, hf_6lowpan_udp_checksum, tvb, offset, 2, udp.checksum); + proto_tree_add_checksum(tree, tvb, offset, hf_6lowpan_udp_checksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); offset += 2; - udp.checksum = g_ntohs(udp.checksum); } else { udp.checksum = 0; diff --git a/epan/dissectors/packet-aol.c b/epan/dissectors/packet-aol.c index eaccc991b7..c5f3072181 100644 --- a/epan/dissectors/packet-aol.c +++ b/epan/dissectors/packet-aol.c @@ -226,7 +226,7 @@ static int dissect_aol_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, /* Add the first few P3 fields */ proto_tree_add_item(aol_tree,hf_aol_start,tvb,offset,1,ENC_NA); offset += 1; - proto_tree_add_item(aol_tree,hf_aol_crc, tvb,offset,2,ENC_BIG_ENDIAN); offset += 2; + proto_tree_add_checksum(aol_tree, tvb, offset, hf_aol_crc, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); offset += 2; proto_tree_add_item(aol_tree,hf_aol_len, tvb,offset,2,ENC_BIG_ENDIAN); offset += 2; /* Add sequence fields */ diff --git a/epan/dissectors/packet-artnet.c b/epan/dissectors/packet-artnet.c index 90b29c2e6e..3f4f3f01e6 100644 --- a/epan/dissectors/packet-artnet.c +++ b/epan/dissectors/packet-artnet.c @@ -3141,8 +3141,7 @@ dissect_artnet_file_tn_master(tvbuff_t *tvb, guint offset, proto_tree *tree) offset, 14, ENC_ASCII|ENC_NA); offset += 14; - proto_tree_add_item(tree, hf_artnet_file_tn_master_checksum, tvb, - offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_checksum(tree, tvb, offset, hf_artnet_file_tn_master_checksum, -1, NULL, NULL, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); offset += 2; proto_tree_add_item(tree, hf_artnet_file_tn_master_spare, tvb, diff --git a/epan/dissectors/packet-asap.c b/epan/dissectors/packet-asap.c index 579e15ebb4..fa860996a1 100644 --- a/epan/dissectors/packet-asap.c +++ b/epan/dissectors/packet-asap.c @@ -567,13 +567,12 @@ dissect_pe_identifier_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_t proto_item_append_text(parameter_item, " (0x%x)", tvb_get_ntohl(parameter_tvb, PE_IDENTIFIER_OFFSET)); } -#define PE_CHECKSUM_LENGTH 2 #define PE_CHECKSUM_OFFSET PARAMETER_VALUE_OFFSET static void dissect_pe_checksum_parameter(tvbuff_t *parameter_tvb, proto_tree *parameter_tree, proto_item *parameter_item) { - proto_tree_add_item(parameter_tree, hf_pe_checksum, parameter_tvb, PE_CHECKSUM_OFFSET, PE_CHECKSUM_LENGTH, ENC_BIG_ENDIAN); + proto_tree_add_checksum(parameter_tree, parameter_tvb, PE_CHECKSUM_OFFSET, hf_pe_checksum, -1, NULL, NULL, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); proto_item_append_text(parameter_item, " (0x%x)", tvb_get_ntohs(parameter_tvb, PE_CHECKSUM_OFFSET)); } @@ -893,7 +892,7 @@ proto_register_asap(void) { &hf_reg_life, { "Registration Life", "asap.pool_element_registration_life", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_cookie, { "Cookie", "asap.cookie", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, { &hf_pe_identifier, { "PE Identifier", "asap.pe_identifier", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } }, - { &hf_pe_checksum, { "PE Checksum", "asap.pe_checksum", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } }, + { &hf_pe_checksum, { "PE Checksum", "asap.pe_checksum", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } }, { &hf_hropt_items, { "Items", "asap.hropt_items", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_server_identifier, { "Server Identifier", "asap.server_identifier", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } }, { &hf_home_enrp_server_bit, { "H Bit", "asap.h_bit", FT_BOOLEAN, 8, TFS(&home_enrp_server_bit_value), HOME_ENRP_SERVER_BIT_MASK, NULL, HFILL } }, diff --git a/epan/dissectors/packet-atalk.c b/epan/dissectors/packet-atalk.c index f7b9a23e21..4b0d8e616d 100644 --- a/epan/dissectors/packet-atalk.c +++ b/epan/dissectors/packet-atalk.c @@ -367,23 +367,6 @@ static dissector_table_t ddp_dissector_table; #define DDP_SHORT_HEADER_SIZE 5 -/* - * P = Padding, H = Hops, L = Len - * - * PPHHHHLL LLLLLLLL - * - * Assumes the argument is in host byte order. - */ -#define ddp_hops(x) ( ( x >> 10) & 0x3C ) -#define ddp_len(x) ( x & 0x03ff ) -typedef struct _e_ddp { - guint16 hops_len; /* combines pad, hops, and len */ - guint16 sum,dnet,snet; - guint8 dnode,snode; - guint8 dport,sport; - guint8 type; -} e_ddp; - #define DDP_HEADER_SIZE 13 @@ -1484,76 +1467,55 @@ dissect_ddp_short(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* dat static int dissect_ddp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) { - e_ddp ddp; proto_tree *ddp_tree; proto_item *ti, *hidden_item; struct atalk_ddp_addr *src = wmem_new0(pinfo->pool, struct atalk_ddp_addr), *dst = wmem_new0(pinfo->pool, struct atalk_ddp_addr); tvbuff_t *new_tvb; + guint type; col_set_str(pinfo->cinfo, COL_PROTOCOL, "DDP"); col_clear(pinfo->cinfo, COL_INFO); - tvb_memcpy(tvb, (guint8 *)&ddp, 0, sizeof(e_ddp)); - ddp.dnet=g_ntohs(ddp.dnet); - ddp.snet=g_ntohs(ddp.snet); - ddp.sum=g_ntohs(ddp.sum); - ddp.hops_len=g_ntohs(ddp.hops_len); + pinfo->ptype = PT_DDP; + + ti = proto_tree_add_item(tree, proto_ddp, tvb, 0, DDP_HEADER_SIZE, ENC_NA); + ddp_tree = proto_item_add_subtree(ti, ett_ddp); + + hidden_item = proto_tree_add_string(ddp_tree, hf_ddp_src, tvb, + 4, 3, address_to_str(wmem_packet_scope(), &pinfo->src)); + PROTO_ITEM_SET_HIDDEN(hidden_item); + + hidden_item = proto_tree_add_string(ddp_tree, hf_ddp_dst, tvb, + 6, 3, address_to_str(wmem_packet_scope(), &pinfo->dst)); + PROTO_ITEM_SET_HIDDEN(hidden_item); + + proto_tree_add_item(ddp_tree, hf_ddp_hopcount, tvb, 0, 2, ENC_BIG_ENDIAN); + proto_tree_add_item(ddp_tree, hf_ddp_len, tvb, 0, 2, ENC_BIG_ENDIAN); + proto_tree_add_checksum(ddp_tree, tvb, 0, hf_ddp_checksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); + dst->net = tvb_get_ntohs(tvb, 4); + proto_tree_add_uint(ddp_tree, hf_ddp_dst_net, tvb, 4, 2, dst->net); + src->net = tvb_get_ntohs(tvb, 6); + proto_tree_add_uint(ddp_tree, hf_ddp_src_net, tvb, 6, 2, src->net); + dst->node = tvb_get_guint8(tvb, 8); + proto_tree_add_uint(ddp_tree, hf_ddp_dst_node, tvb, 8, 1, dst->node); + src->node = tvb_get_guint8(tvb, 9); + proto_tree_add_uint(ddp_tree, hf_ddp_src_node, tvb, 9, 1, src->node); + proto_tree_add_item_ret_uint(ddp_tree, hf_ddp_dst_socket, tvb, 10, 1, ENC_NA, &pinfo->destport); + proto_tree_add_item_ret_uint(ddp_tree, hf_ddp_src_socket, tvb, 11, 1, ENC_NA, &pinfo->srcport); + proto_tree_add_item_ret_uint(ddp_tree, hf_ddp_type, tvb, 12, 1, ENC_NA, &type); + + col_add_str(pinfo->cinfo, COL_INFO, + val_to_str_ext(type, &op_vals_ext, "Unknown DDP protocol (%02x)")); - src->net = ddp.snet; - src->node = ddp.snode; - dst->net = ddp.dnet; - dst->node = ddp.dnode; set_address(&pinfo->net_src, atalk_address_type, sizeof(struct atalk_ddp_addr), src); copy_address_shallow(&pinfo->src, &pinfo->net_src); set_address(&pinfo->net_dst, atalk_address_type, sizeof(struct atalk_ddp_addr), dst); copy_address_shallow(&pinfo->dst, &pinfo->net_dst); - pinfo->ptype = PT_DDP; - pinfo->destport = ddp.dport; - pinfo->srcport = ddp.sport; - - col_add_str(pinfo->cinfo, COL_INFO, - val_to_str_ext(ddp.type, &op_vals_ext, "Unknown DDP protocol (%02x)")); - - if (tree) { - ti = proto_tree_add_item(tree, proto_ddp, tvb, 0, DDP_HEADER_SIZE, - ENC_NA); - ddp_tree = proto_item_add_subtree(ti, ett_ddp); - - hidden_item = proto_tree_add_string(ddp_tree, hf_ddp_src, tvb, - 4, 3, address_to_str(wmem_packet_scope(), &pinfo->src)); - PROTO_ITEM_SET_HIDDEN(hidden_item); - - hidden_item = proto_tree_add_string(ddp_tree, hf_ddp_dst, tvb, - 6, 3, address_to_str(wmem_packet_scope(), &pinfo->dst)); - PROTO_ITEM_SET_HIDDEN(hidden_item); - - proto_tree_add_uint(ddp_tree, hf_ddp_hopcount, tvb, 0, 1, - ddp_hops(ddp.hops_len)); - proto_tree_add_uint(ddp_tree, hf_ddp_len, tvb, 0, 2, - ddp_len(ddp.hops_len)); - proto_tree_add_uint(ddp_tree, hf_ddp_checksum, tvb, 2, 2, - ddp.sum); - proto_tree_add_uint(ddp_tree, hf_ddp_dst_net, tvb, 4, 2, - ddp.dnet); - proto_tree_add_uint(ddp_tree, hf_ddp_src_net, tvb, 6, 2, - ddp.snet); - proto_tree_add_uint(ddp_tree, hf_ddp_dst_node, tvb, 8, 1, - ddp.dnode); - proto_tree_add_uint(ddp_tree, hf_ddp_src_node, tvb, 9, 1, - ddp.snode); - proto_tree_add_uint(ddp_tree, hf_ddp_dst_socket, tvb, 10, 1, - ddp.dport); - proto_tree_add_uint(ddp_tree, hf_ddp_src_socket, tvb, 11, 1, - ddp.sport); - proto_tree_add_uint(ddp_tree, hf_ddp_type, tvb, 12, 1, - ddp.type); - } - new_tvb = tvb_new_subset_remaining(tvb, DDP_HEADER_SIZE); - if (!dissector_try_uint(ddp_dissector_table, ddp.type, new_tvb, pinfo, tree)) + if (!dissector_try_uint(ddp_dissector_table, type, new_tvb, pinfo, tree)) { call_data_dissector(new_tvb, pinfo, tree); } @@ -1666,11 +1628,11 @@ proto_register_atalk(void) static hf_register_info hf_ddp[] = { { &hf_ddp_hopcount, - { "Hop count", "ddp.hopcount", FT_UINT8, BASE_DEC, NULL, 0x0, + { "Hop count", "ddp.hopcount", FT_UINT16, BASE_DEC, NULL, 0x3C00, NULL, HFILL }}, { &hf_ddp_len, - { "Datagram length", "ddp.len", FT_UINT16, BASE_DEC, NULL, 0x0, + { "Datagram length", "ddp.len", FT_UINT16, BASE_DEC, NULL, 0x0300, NULL, HFILL }}, { &hf_ddp_checksum, diff --git a/epan/dissectors/packet-ax25-kiss.c b/epan/dissectors/packet-ax25-kiss.c index d007d4e456..56a308b21c 100644 --- a/epan/dissectors/packet-ax25-kiss.c +++ b/epan/dissectors/packet-ax25-kiss.c @@ -335,17 +335,17 @@ dissect_ax25_kiss( tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, v } if ( gPREF_CKSUM_MODE ) - { + { kiss_cksum = 0; - kiss_tvb_length = tvb_captured_length_remaining( tvb, 0 ) - 1; + kiss_tvb_length = tvb_captured_length(tvb) - 1; if ( kiss_tvb_length > 0 ) - { + { for ( kiss_cksum_index = 0; kiss_cksum_index < kiss_tvb_length; kiss_cksum_index++ ) kiss_cksum ^= (tvb_get_guint8( tvb, kiss_cksum_index ) & 0xff); - proto_tree_add_uint( kiss_tree, hf_ax25_kiss_cksum, - tvb, kiss_cksum_index, 1, kiss_cksum ); - } + + proto_tree_add_checksum(kiss_tree, tvb, 0, hf_ax25_kiss_cksum, -1, NULL, pinfo, kiss_cksum, ENC_NA, PROTO_CHECKSUM_GENERATED); } + } } /* Call sub-dissectors here */ diff --git a/epan/dissectors/packet-bitcoin.c b/epan/dissectors/packet-bitcoin.c index 56c8259aa6..cc3cbbd02c 100644 --- a/epan/dissectors/packet-bitcoin.c +++ b/epan/dissectors/packet-bitcoin.c @@ -1554,7 +1554,7 @@ static int dissect_bitcoin_tcp_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree proto_tree_add_item(tree, &hfi_bitcoin_magic, tvb, 0, 4, ENC_BIG_ENDIAN); proto_tree_add_item_ret_string(tree, hfi_bitcoin_command.id, tvb, 4, 12, ENC_ASCII|ENC_NA, wmem_packet_scope(), &command); proto_tree_add_item(tree, &hfi_bitcoin_length, tvb, 16, 4, ENC_LITTLE_ENDIAN); - proto_tree_add_item(tree, &hfi_bitcoin_checksum, tvb, 20, 4, ENC_BIG_ENDIAN); + proto_tree_add_checksum(tree, tvb, 20, hfi_bitcoin_checksum.id, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); offset = 24; diff --git a/epan/dissectors/packet-btatt.c b/epan/dissectors/packet-btatt.c index 785b9b981e..00e8aae35f 100644 --- a/epan/dissectors/packet-btatt.c +++ b/epan/dissectors/packet-btatt.c @@ -8960,7 +8960,7 @@ dissect_attribute_value(proto_tree *tree, proto_item *patron_item, packet_info * break; case 0x03: /* Calculate Checksum */ - proto_tree_add_item(tree, hf_btatt_ots_checksum, tvb, offset, 4, ENC_LITTLE_ENDIAN); + proto_tree_add_checksum(tree, tvb, offset, hf_btatt_ots_checksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); offset += 4; break; diff --git a/epan/dissectors/packet-c1222.c b/epan/dissectors/packet-c1222.c index b83fcd7541..a1873c07e3 100644 --- a/epan/dissectors/packet-c1222.c +++ b/epan/dissectors/packet-c1222.c @@ -161,6 +161,7 @@ static int hf_c1222_write_size = -1; static int hf_c1222_write_data = -1; static int hf_c1222_procedure_num = -1; static int hf_c1222_write_chksum = -1; +static int hf_c1222_write_chksum_status = -1; static int hf_c1222_wait_secs = -1; static int hf_c1222_neg_pkt_size = -1; static int hf_c1222_neg_nbr_pkts = -1; @@ -224,7 +225,7 @@ static gint ett_c1222_Calling_authentication_value_c1222_U = -1; static gint ett_c1222_Calling_authentication_value_c1221_U = -1; /*--- End of included file: packet-c1222-ett.c ---*/ -#line 177 "./asn1/c1222/packet-c1222-template.c" +#line 178 "./asn1/c1222/packet-c1222-template.c" static expert_field ei_c1222_command_truncated = EI_INIT; static expert_field ei_c1222_bad_checksum = EI_INIT; @@ -431,7 +432,6 @@ parse_c1222_detailed(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int cm gchar *auth_req = NULL; guint16 table = 0; guint16 tblsize = 0; - guint8 chksum = 0; guint16 calcsum = 0; guint8 wait_seconds = 0; int numrates = 0; @@ -443,7 +443,6 @@ parse_c1222_detailed(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int cm guint8 inter_char; guint8 resp_to; guint8 nbr_retries; - proto_item *item = NULL; /* special case to simplify handling of Negotiate service */ if ((cmd & 0xF0) == C1222_CMD_NEGOTIATE) { @@ -560,16 +559,14 @@ parse_c1222_detailed(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int cm proto_tree_add_item(tree, hf_c1222_write_data, tvb, *offset, tblsize, ENC_NA); *offset += tblsize; *length -= tblsize; - chksum = tvb_get_guint8(tvb, *offset); - item = proto_tree_add_uint(tree, hf_c1222_write_chksum, tvb, *offset, 1, chksum); if (table == 7) {/* is it a procedure call? */ calcsum = c1222_cksum(tvb, (*offset)-tblsize-2, tblsize+2); } else { calcsum = c1222_cksum(tvb, (*offset)-tblsize, tblsize); } - if (chksum != calcsum) { - expert_add_info_format(pinfo, item, &ei_c1222_bad_checksum, "Bad checksum [should be 0x%02x]", calcsum); - } + proto_tree_add_checksum(tree, tvb, *offset, hf_c1222_write_chksum, hf_c1222_write_chksum_status, + &ei_c1222_bad_checksum, pinfo, calcsum, ENC_NA, PROTO_CHECKSUM_VERIFY); + if (table == 7) {/* is it a procedure call? */ proto_item_set_text(tree, "C12.22 EPSEM: %s (%s-%d, %s-%d)", val_to_str(cmd,commandnames,"Unknown (0x%02x)"), @@ -606,12 +603,9 @@ parse_c1222_detailed(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int cm proto_tree_add_item(tree, hf_c1222_write_data, tvb, *offset, tblsize, ENC_NA); *offset += tblsize; *length -= tblsize; - chksum = tvb_get_guint8(tvb, *offset); - item = proto_tree_add_uint(tree, hf_c1222_write_chksum, tvb, *offset, 1, chksum); calcsum = c1222_cksum(tvb, (*offset)-tblsize, tblsize); - if (chksum != calcsum) { - expert_add_info_format(pinfo, item, &ei_c1222_bad_checksum, "Bad checksum [should be 0x%02x]", calcsum); - } + proto_tree_add_checksum(tree, tvb, *offset, hf_c1222_write_chksum, hf_c1222_write_chksum_status, + &ei_c1222_bad_checksum, pinfo, calcsum, ENC_NA, PROTO_CHECKSUM_VERIFY); proto_item_set_text(tree, "C12.22 EPSEM: %s (%s-%d)", val_to_str(cmd,commandnames,"Unknown (0x%02x)"), val_to_str((table >> 8) & 0xF8, tableflags,"Unknown (0x%04x)"), table & 0x7FF); @@ -1566,7 +1560,7 @@ static int dissect_MESSAGE_PDU(tvbuff_t *tvb _U_, packet_info *pinfo _U_, proto_ /*--- End of included file: packet-c1222-fn.c ---*/ -#line 1048 "./asn1/c1222/packet-c1222-template.c" +#line 1042 "./asn1/c1222/packet-c1222-template.c" /** * Dissects a a full (reassembled) C12.22 message. @@ -1781,6 +1775,12 @@ void proto_register_c1222(void) { NULL, 0x0, NULL, HFILL } }, + { &hf_c1222_write_chksum_status, + { "C12.22 Table Data Checksum Status", "c1222.write.chksum.status", + FT_UINT8, BASE_NONE, + VALS(proto_checksum_vals), 0x0, + NULL, HFILL } + }, { &hf_c1222_procedure_num, { "C12.22 Procedure Number", "c1222.procedure.num", FT_UINT16, BASE_DEC, diff --git a/epan/dissectors/packet-carp.c b/epan/dissectors/packet-carp.c index cbb21725e5..a5a276d529 100644 --- a/epan/dissectors/packet-carp.c +++ b/epan/dissectors/packet-carp.c @@ -90,7 +90,6 @@ dissect_carp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) proto_item *ti, *tv; proto_tree *carp_tree, *ver_type_tree; guint8 ver_type; - guint16 cksum, computed_cksum; /* Make sure it's a CARP packet */ if (!test_carp_packet(tvb, pinfo, tree, data)) @@ -133,20 +132,15 @@ dissect_carp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) proto_tree_add_item(carp_tree, hf_carp_advbase, tvb, offset, 1, ENC_BIG_ENDIAN); offset++; - cksum = tvb_get_ntohs(tvb, offset); - ti = proto_tree_add_item(carp_tree, hf_carp_checksum, tvb, offset, 2, ENC_BIG_ENDIAN); carp_len = tvb_reported_length(tvb); if (!pinfo->fragmented && tvb_captured_length(tvb) >= carp_len) { /* The packet isn't part of a fragmented datagram and isn't truncated, so we can checksum it. */ SET_CKSUM_VEC_TVB(cksum_vec[0], tvb, 0, carp_len); - computed_cksum = in_cksum(&cksum_vec[0], 1); - if (computed_cksum == 0) { - proto_item_append_text(ti, " [correct]"); - } else { - proto_item_append_text(ti, " [incorrect, should be 0x%04x]", - in_cksum_shouldbe(cksum, computed_cksum)); - } + proto_tree_add_checksum(carp_tree, tvb, offset, hf_carp_checksum, -1, NULL, pinfo, in_cksum(&cksum_vec[0], 1), + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY|PROTO_CHECKSUM_IN_CKSUM); + } else { + proto_tree_add_checksum(carp_tree, tvb, offset, hf_carp_checksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); } offset+=2; diff --git a/epan/dissectors/packet-cattp.c b/epan/dissectors/packet-cattp.c index 277a1e1376..10e489c536 100644 --- a/epan/dissectors/packet-cattp.c +++ b/epan/dissectors/packet-cattp.c @@ -87,6 +87,7 @@ static int hf_cattp_seq = -1; static int hf_cattp_ack = -1; static int hf_cattp_windowsize = -1; static int hf_cattp_checksum = -1; +static int hf_cattp_checksum_status = -1; static int hf_cattp_identification = -1; static int hf_cattp_iccid = -1; static int hf_cattp_idlen = -1; @@ -218,12 +219,11 @@ dissect_cattp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U const char *pdutype = "[Unknown PDU]"; proto_item *ti, *cattp_tree; guint32 offset; - gushort computed_chksum; vec_t cksum_vec[1]; int header_offset; guint cksum_data_len; guint8 flags, first_byte, hlen, ver; - guint16 plen, chksum, ackno, seqno, wsize, sport, dport; + guint16 plen, ackno, seqno, wsize, sport, dport; col_set_str(pinfo->cinfo, COL_PROTOCOL, CATTP_SHORTNAME); @@ -294,28 +294,16 @@ dissect_cattp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U /* Parse and verify checksum */ header_offset = 0; cksum_data_len = hlen + plen; - chksum = tvb_get_ntohs(tvb, offset); if (!cattp_check_checksum) { /* We have turned checksum checking off; we do NOT checksum it. */ - proto_tree_add_uint_format_value(cattp_tree, hf_cattp_checksum, tvb, offset, 2, - chksum, "0x%X [validation disabled]", chksum); + proto_tree_add_checksum(cattp_tree, tvb, offset, hf_cattp_checksum, hf_cattp_checksum_status, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); } else { /* We haven't turned checksum checking off; checksum it. */ /* Unlike TCP, CATTP does not make use of a pseudo-header for checksum */ SET_CKSUM_VEC_TVB(cksum_vec[0], tvb, header_offset, cksum_data_len); - computed_chksum = in_cksum(cksum_vec, 1); - - if (computed_chksum == 0) { - /* Checksum is valid */ - proto_tree_add_uint_format_value(cattp_tree, hf_cattp_checksum, tvb, offset, 2, - chksum, "0x%X [validated]", chksum); - } else { - /* Checksum is invalid. Let's compute the expected checksum, based on the data we have */ - proto_tree_add_uint_format_value(cattp_tree, hf_cattp_checksum, tvb, offset, 2, chksum, - "0x%X [incorrect, correct: 0x%X]", chksum, - in_cksum_shouldbe(chksum, computed_chksum)); - } + proto_tree_add_checksum(cattp_tree, tvb, offset, hf_cattp_checksum, hf_cattp_checksum_status, NULL, pinfo, in_cksum(cksum_vec, 1), + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY|PROTO_CHECKSUM_IN_CKSUM); } /* End of checksum code */ offset += 2; @@ -477,6 +465,13 @@ proto_register_cattp(void) NULL, HFILL } }, + { + &hf_cattp_checksum_status, + { + "Checksum Status", "cattp.checksum.status", FT_UINT8, BASE_NONE, VALS(proto_checksum_vals), 0x0, + NULL, HFILL + } + }, { &hf_cattp_identification, { diff --git a/epan/dissectors/packet-cdp.c b/epan/dissectors/packet-cdp.c index fb975fa89a..b61a7097cc 100644 --- a/epan/dissectors/packet-cdp.c +++ b/epan/dissectors/packet-cdp.c @@ -53,8 +53,7 @@ void proto_reg_handoff_cdp(void); static int proto_cdp = -1; static int hf_cdp_version = -1; static int hf_cdp_checksum = -1; -static int hf_cdp_checksum_good = -1; -static int hf_cdp_checksum_bad = -1; +static int hf_cdp_checksum_status = -1; static int hf_cdp_ttl = -1; static int hf_cdp_tlvtype = -1; static int hf_cdp_tlvlength = -1; @@ -271,12 +270,11 @@ static const value_string type_nrgyz_vals[] = { static int dissect_cdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) { - proto_item *ti, *checksum_item; - proto_tree *cdp_tree = NULL, *checksum_tree; + proto_item *ti; + proto_tree *cdp_tree; int offset = 0; guint16 type; - guint16 length, packet_checksum, computed_checksum, data_length; - gboolean checksum_good, checksum_bad; + guint16 length, data_length; proto_item *tlvi = NULL; proto_tree *tlv_tree = NULL; int real_length; @@ -289,25 +287,20 @@ dissect_cdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) col_set_str(pinfo->cinfo, COL_PROTOCOL, "CDP"); col_clear(pinfo->cinfo, COL_INFO); - if (tree) { - ti = proto_tree_add_item(tree, proto_cdp, tvb, offset, -1, ENC_NA); - cdp_tree = proto_item_add_subtree(ti, ett_cdp); + ti = proto_tree_add_item(tree, proto_cdp, tvb, offset, -1, ENC_NA); + cdp_tree = proto_item_add_subtree(ti, ett_cdp); - /* CDP header */ - proto_tree_add_item(cdp_tree, hf_cdp_version, tvb, offset, 1, ENC_BIG_ENDIAN); - offset += 1; + /* CDP header */ + proto_tree_add_item(cdp_tree, hf_cdp_version, tvb, offset, 1, ENC_BIG_ENDIAN); + offset += 1; - proto_tree_add_uint_format_value(cdp_tree, hf_cdp_ttl, tvb, offset, 1, - tvb_get_guint8(tvb, offset), - "%u seconds", - tvb_get_guint8(tvb, offset)); - offset += 1; - } else { - offset += 2; /* The version/ttl fields from above */ - } + proto_tree_add_uint_format_value(cdp_tree, hf_cdp_ttl, tvb, offset, 1, + tvb_get_guint8(tvb, offset), + "%u seconds", + tvb_get_guint8(tvb, offset)); + offset += 1; /* Checksum display & verification code */ - packet_checksum = tvb_get_ntohs(tvb, offset); data_length = tvb_reported_length(tvb); @@ -343,29 +336,8 @@ dissect_cdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) SET_CKSUM_VEC_TVB(cksum_vec[0], tvb, 0, data_length); } - computed_checksum = in_cksum(cksum_vec, 1); - checksum_good = (computed_checksum == 0); - checksum_bad = !checksum_good; - if (checksum_good) { - checksum_item = proto_tree_add_uint_format_value(cdp_tree, - hf_cdp_checksum, tvb, offset, 2, packet_checksum, - "0x%04x [correct]", packet_checksum); - } else { - checksum_item = proto_tree_add_uint_format_value(cdp_tree, - hf_cdp_checksum, tvb, offset, 2, packet_checksum, - "0x%04x [incorrect, should be 0x%04x]", - packet_checksum, - in_cksum_shouldbe(packet_checksum, computed_checksum)); - } - - checksum_tree = proto_item_add_subtree(checksum_item, ett_cdp_checksum); - checksum_item = proto_tree_add_boolean(checksum_tree, hf_cdp_checksum_good, - tvb, offset, 2, checksum_good); - PROTO_ITEM_SET_GENERATED(checksum_item); - checksum_item = proto_tree_add_boolean(checksum_tree, hf_cdp_checksum_bad, - tvb, offset, 2, checksum_bad); - PROTO_ITEM_SET_GENERATED(checksum_item); - + proto_tree_add_checksum(cdp_tree, tvb, offset, hf_cdp_checksum, hf_cdp_checksum_status, NULL, pinfo, in_cksum(cksum_vec, 1), + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY|PROTO_CHECKSUM_IN_CKSUM); offset += 2; while (tvb_reported_length_remaining(tvb, offset) != 0) { @@ -1290,13 +1262,9 @@ proto_register_cdp(void) { "Checksum", "cdp.checksum", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }}, - { &hf_cdp_checksum_good, - { "Good", "cdp.checksum_good", FT_BOOLEAN, BASE_NONE, NULL, 0x0, - "True: checksum matches packet content; False: doesn't match content or not checked", HFILL }}, - - { &hf_cdp_checksum_bad, - { "Bad", "cdp.checksum_bad", FT_BOOLEAN, BASE_NONE, NULL, 0x0, - "True: checksum doesn't match packet content; False: matches content or not checked", HFILL }}, + { &hf_cdp_checksum_status, + { "Checksum Status", "cdp.checksum.status", FT_UINT8, BASE_NONE, VALS(proto_checksum_vals), 0x0, + NULL, HFILL }}, { &hf_cdp_tlvtype, { "Type", "cdp.tlv.type", FT_UINT16, BASE_HEX, VALS(type_vals), 0x0, diff --git a/epan/dissectors/packet-cfdp.c b/epan/dissectors/packet-cfdp.c index af727f003b..82ee1512fd 100644 --- a/epan/dissectors/packet-cfdp.c +++ b/epan/dissectors/packet-cfdp.c @@ -927,7 +927,7 @@ static guint32 dissect_cfdp_eof_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tre col_add_fstr(pinfo->cinfo, COL_INFO, "EOF (%s)", val_to_str_const((aux_byte & 0xF0) >> 4, cfdp_condition_codes, "Reserved Code")); - proto_tree_add_item(tree, hf_cfdp_file_checksum, tvb, offset, 4, ENC_BIG_ENDIAN); + proto_tree_add_checksum(tree, tvb, offset, hf_cfdp_file_checksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); offset += 4; proto_tree_add_item(tree, hf_cfdp_file_size, tvb, offset, 4, ENC_BIG_ENDIAN); diff --git a/epan/dissectors/packet-clnp.c b/epan/dissectors/packet-clnp.c index 99997180ad..94b95cb54c 100644 --- a/epan/dissectors/packet-clnp.c +++ b/epan/dissectors/packet-clnp.c @@ -221,7 +221,7 @@ dissect_clnp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_ guint16 segment_offset = 0; guint16 total_length; guint16 cnf_cksum; - cksum_status_t cksum_status; + gboolean cksum_valid = TRUE; int offset; guchar src_len, dst_len, nsel, opt_len = 0; guint next_length; @@ -320,39 +320,19 @@ dissect_clnp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_ return 7; } cnf_cksum = tvb_get_ntohs(tvb, P_CLNP_CKSUM); - cksum_status = calc_checksum(tvb, 0, cnf_hdr_len, cnf_cksum); - switch (cksum_status) { - default: - /* - * No checksum present, or not enough of the header present to - * checksum it. - */ - proto_tree_add_uint(clnp_tree, hf_clnp_checksum, tvb, - P_CLNP_CKSUM, 2, - cnf_cksum); - break; + if (cnf_cksum == 0) { + /* No checksum present */ + proto_tree_add_checksum(clnp_tree, tvb, P_CLNP_CKSUM, hf_clnp_checksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NOT_PRESENT); + } else { + guint32 c0 = 0, c1 = 0; - case CKSUM_OK: - /* - * Checksum is correct. - */ - proto_tree_add_uint_format_value(clnp_tree, hf_clnp_checksum, tvb, - P_CLNP_CKSUM, 2, - cnf_cksum, - "0x%04x (correct)", - cnf_cksum); - break; - - case CKSUM_NOT_OK: - /* - * Checksum is not correct. - */ - proto_tree_add_uint_format_value(clnp_tree, hf_clnp_checksum, tvb, - P_CLNP_CKSUM, 2, - cnf_cksum, - "0x%04x (incorrect)", - cnf_cksum); - break; + if (osi_calc_checksum(tvb, 0, cnf_hdr_len, &c0, &c1)) { + /* Successfully processed checksum, verify it */ + proto_tree_add_checksum(clnp_tree, tvb, P_CLNP_CKSUM, hf_clnp_checksum, -1, NULL, pinfo, c0 | c1, ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY|PROTO_CHECKSUM_ZERO); + cksum_valid = (c0 | c1) ? FALSE : TRUE; + } else { + proto_tree_add_checksum(clnp_tree, tvb, P_CLNP_CKSUM, hf_clnp_checksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); + } } opt_len = cnf_hdr_len; @@ -475,7 +455,7 @@ dissect_clnp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_ ((cnf_type & CNF_MORE_SEGS) || segment_offset != 0) && tvb_bytes_exist(tvb, offset, segment_length - cnf_hdr_len) && segment_length > cnf_hdr_len && - cksum_status != CKSUM_NOT_OK) { + cksum_valid != FALSE) { fd_head = fragment_add_check(&clnp_reassembly_table, tvb, offset, pinfo, du_id, NULL, segment_offset, segment_length - cnf_hdr_len, diff --git a/epan/dissectors/packet-dccp.c b/epan/dissectors/packet-dccp.c index 0ff2021087..779845d001 100644 --- a/epan/dissectors/packet-dccp.c +++ b/epan/dissectors/packet-dccp.c @@ -175,7 +175,7 @@ static int hf_dccp_data_offset = -1; static int hf_dccp_ccval = -1; static int hf_dccp_cscov = -1; static int hf_dccp_checksum = -1; -static int hf_dccp_checksum_bad = -1; +static int hf_dccp_checksum_status = -1; static int hf_dccp_res1 = -1; static int hf_dccp_type = -1; static int hf_dccp_x = -1; @@ -600,7 +600,6 @@ dissect_dccp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_ proto_item *hidden_item, *offset_item; vec_t cksum_vec[4]; guint32 phdr[2]; - guint16 computed_cksum; guint offset = 0; guint len = 0; guint reported_len = 0; @@ -695,30 +694,11 @@ dissect_dccp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_ break; } SET_CKSUM_VEC_TVB(cksum_vec[3], tvb, 0, csum_coverage_len); - computed_cksum = in_cksum(&cksum_vec[0], 4); - if (computed_cksum == 0) { - proto_tree_add_uint_format_value(dccp_tree, - hf_dccp_checksum, tvb, - offset, 2, - dccph->checksum, - "0x%04x [correct]", - dccph->checksum); - } else { - hidden_item = - proto_tree_add_boolean(dccp_tree, hf_dccp_checksum_bad, - tvb, offset, 2, TRUE); - PROTO_ITEM_SET_HIDDEN(hidden_item); - proto_tree_add_uint_format_value( - dccp_tree, hf_dccp_checksum, tvb, offset, 2, - dccph->checksum, - "0x%04x [incorrect, should be 0x%04x]", - dccph->checksum, - in_cksum_shouldbe(dccph->checksum, computed_cksum)); - } + proto_tree_add_checksum(dccp_tree, tvb, offset, hf_dccp_checksum, hf_dccp_checksum_status, NULL, pinfo, in_cksum(&cksum_vec[0], 4), + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY|PROTO_CHECKSUM_IN_CKSUM); } else { - proto_tree_add_uint_format_value(dccp_tree, hf_dccp_checksum, tvb, - offset, 2, dccph->checksum, - "0x%04x", dccph->checksum); + proto_tree_add_checksum(dccp_tree, tvb, offset, hf_dccp_checksum, hf_dccp_checksum_status, NULL, pinfo, 0, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); } offset += 2; @@ -1078,10 +1058,10 @@ proto_register_dccp(void) } }, { - &hf_dccp_checksum_bad, + &hf_dccp_checksum_status, { - "Bad Checksum", "dccp.checksum_bad", - FT_BOOLEAN, BASE_NONE, NULL, 0x0, + "Checksum Status", "dccp.checksum.status", + FT_UINT8, BASE_NONE, VALS(proto_checksum_vals), 0x0, NULL, HFILL } }, diff --git a/epan/dissectors/packet-dec-dnart.c b/epan/dissectors/packet-dec-dnart.c index 1738f7e70e..6c476f94ad 100644 --- a/epan/dissectors/packet-dec-dnart.c +++ b/epan/dissectors/packet-dec-dnart.c @@ -123,6 +123,7 @@ static int hf_dec_rt_reserved = -1; static int hf_dec_rt_fcnval = -1; static int hf_dec_rt_test_data = -1; static int hf_dec_rt_segment = -1; +static int hf_dec_rt_checksum = -1; static int hf_dec_rt_id = -1; static int hf_dec_rt_iinfo = -1; static int hf_dec_rt_iinfo_node_type = -1; @@ -632,7 +633,6 @@ do_routing_msg( { guint my_offset = offset; guint32 my_checksum = 1; - guint16 checksum; guint16 count, startid, rtginfo; guint remainder_count; @@ -667,18 +667,8 @@ do_routing_msg( /* fold 32 bit sum into 16 bits */ while (my_checksum>>16) my_checksum = (my_checksum & 0xffff) + (my_checksum >> 16); - checksum = tvb_get_letohs(tvb, my_offset); - if (checksum != my_checksum) { - proto_tree_add_none_format(tree, hf_dec_rt_segment, tvb, - my_offset, 2, - "Checksum mismatch(computed 0x%x <> received 0x%x)", - my_checksum, checksum); - } else { - proto_tree_add_none_format(tree, hf_dec_rt_segment, tvb, - my_offset, 2, - "Checksum: match (computed 0x%x = received 0x%x)", - my_checksum, checksum); - } + + proto_tree_add_checksum(tree, tvb, my_offset, hf_dec_rt_checksum, -1, NULL, pinfo, my_checksum, ENC_LITTLE_ENDIAN, PROTO_CHECKSUM_VERIFY); my_offset += 2; return (my_offset); } @@ -1343,6 +1333,10 @@ proto_register_dec_rt(void) { "Segment", "dec_dna.ctl.segment", FT_NONE, BASE_NONE, NULL, 0x0, "Routing Segment", HFILL }}, + { &hf_dec_rt_checksum, + { "Checksum", "dec_dna.ctl.checksum", + FT_UINT16, BASE_HEX, NULL, 0x0, + NULL, HFILL }}, { &hf_dec_rt_id, { "Transmitting system ID", "dec_dna.ctl.id", FT_ETHER, BASE_NONE, NULL, 0x0, diff --git a/epan/dissectors/packet-dji-uav.c b/epan/dissectors/packet-dji-uav.c index 75030abeb1..dc7b81e6a5 100644 --- a/epan/dissectors/packet-dji-uav.c +++ b/epan/dissectors/packet-dji-uav.c @@ -245,8 +245,7 @@ dissect_djiuav_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *da offset += pdu_length - 1 - offset; } /* FIXME: calculate XOR and validate transmitted value */ - proto_tree_add_item(djiuav_tree, hf_djiuav_checksum, tvb, offset, 1, - ENC_BIG_ENDIAN); + proto_tree_add_checksum(djiuav_tree, tvb, offset, hf_djiuav_checksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); offset += 1; } diff --git a/epan/dissectors/packet-dmp.c b/epan/dissectors/packet-dmp.c index aa19f85d36..bdad234635 100644 --- a/epan/dissectors/packet-dmp.c +++ b/epan/dissectors/packet-dmp.c @@ -358,8 +358,7 @@ static int hf_ack_diagnostic = -1; static int hf_ack_recips = -1; static int hf_checksum = -1; -static int hf_checksum_good = -1; -static int hf_checksum_bad = -1; +static int hf_checksum_status = -1; static int hf_analysis_ack_time = -1; static int hf_analysis_total_time = -1; @@ -371,10 +370,10 @@ static int hf_analysis_retrans_no = -1; static int hf_analysis_ack_num = -1; static int hf_analysis_ack_missing = -1; static int hf_analysis_ack_dup_no = -1; -static int hf_analysis_rep_num = -1; +/* static int hf_analysis_rep_num = -1; */ static int hf_analysis_acks_rep_num = -1; static int hf_analysis_rep_time = -1; -static int hf_analysis_not_num = -1; +/* static int hf_analysis_not_num = -1; */ static int hf_analysis_acks_not_num = -1; static int hf_analysis_not_time = -1; static int hf_analysis_msg_resend_from = -1; @@ -475,8 +474,6 @@ static gint ett_notif_acp127recip = -1; static gint ett_ack = -1; static gint ett_ack_recips = -1; -static gint ett_checksum = -1; - static gint ett_analysis = -1; static expert_field ei_reserved_value = EI_INIT; @@ -3968,8 +3965,8 @@ static gint dissect_dmp_extensions (tvbuff_t *tvb, packet_info *pinfo _U_, static int dissect_dmp (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) { - proto_tree *dmp_tree = NULL, *checksum_tree = NULL; - proto_item *ti = NULL, *en = NULL; + proto_tree *dmp_tree; + proto_item *ti; guint16 checksum1 = 0, checksum2 = 1; gint length, offset = 0; gboolean retrans_or_dup_ack = FALSE; @@ -4006,29 +4003,8 @@ static int dissect_dmp (tvbuff_t *tvb, packet_info *pinfo, if (dmp.checksum) { length = tvb_captured_length (tvb); checksum1 = crc16_x25_ccitt_tvb (tvb, length - 2); - checksum2 = tvb_get_ntohs (tvb, offset); - en = proto_tree_add_item (dmp_tree, hf_checksum, tvb, offset, 2, ENC_BIG_ENDIAN); - checksum_tree = proto_item_add_subtree (en, ett_checksum); - if (checksum1 == checksum2) { - proto_item_append_text (en, " (correct)"); - en = proto_tree_add_boolean (checksum_tree, hf_checksum_good, tvb, - offset, 2, TRUE); - PROTO_ITEM_SET_GENERATED (en); - en = proto_tree_add_boolean (checksum_tree, hf_checksum_bad, tvb, - offset, 2, FALSE); - PROTO_ITEM_SET_GENERATED (en); - } else { - proto_item_append_text (en, " (incorrect, should be 0x%04x)", - checksum1); - expert_add_info(pinfo, en, &ei_checksum_bad); - en = proto_tree_add_boolean (checksum_tree, hf_checksum_good, tvb, - offset, 2, FALSE); - PROTO_ITEM_SET_GENERATED (en); - en = proto_tree_add_boolean (checksum_tree, hf_checksum_bad, tvb, - offset, 2, TRUE); - PROTO_ITEM_SET_GENERATED (en); - } + proto_tree_add_checksum(dmp_tree, tvb, offset, hf_checksum, hf_checksum_status, &ei_checksum_bad, pinfo, checksum1, ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); offset += 2; } @@ -4773,12 +4749,9 @@ void proto_register_dmp (void) { &hf_checksum, { "Checksum", "dmp.checksum", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL } }, - { &hf_checksum_good, - { "Good", "dmp.checksum_good", FT_BOOLEAN, BASE_NONE, - NULL, 0x0, "True: checksum matches packet content; False: doesn't match content or not checked", HFILL } }, - { &hf_checksum_bad, - { "Bad", "dmp.checksum_bad", FT_BOOLEAN, BASE_NONE, - NULL, 0x0, "True: checksum doesn't match packet content; False: matches content or not checked", HFILL } }, + { &hf_checksum_status, + { "Checksum Status", "dmp.checksum.status", FT_UINT8, BASE_NONE, + VALS(proto_checksum_vals), 0x0, NULL, HFILL } }, /* ** Ack matching / Resend @@ -4810,15 +4783,17 @@ void proto_register_dmp (void) { &hf_analysis_ack_num, { "Acknowledgement in", "dmp.analysis.ack_in", FT_FRAMENUM, BASE_NONE, NULL, 0x0, "This packet has an Acknowledgement in this frame", HFILL } }, - { &hf_analysis_rep_num, - { "Report in", "dmp.analysis.report_in", FT_FRAMENUM, BASE_NONE, - NULL, 0x0, "This packet has a Report in this frame", HFILL } }, { &hf_analysis_acks_rep_num, { "This is an Ack to the Report in", "dmp.analysis.acks_report_in", FT_FRAMENUM, BASE_NONE, FRAMENUM_TYPE(FT_FRAMENUM_ACK), 0x0, "This packet ACKs a Report in this frame", HFILL } }, +#if 0 + { &hf_analysis_rep_num, + { "Report in", "dmp.analysis.report_in", FT_FRAMENUM, BASE_NONE, + NULL, 0x0, "This packet has a Report in this frame", HFILL } }, { &hf_analysis_not_num, { "Notification in", "dmp.analysis.notif_in", FT_FRAMENUM, BASE_NONE, NULL, 0x0, "This packet has a Notification in this frame", HFILL } }, +#endif { &hf_analysis_acks_not_num, { "This is an Ack to the Notification in", "dmp.analysis.acks_notif_in", FT_FRAMENUM, BASE_NONE, FRAMENUM_TYPE(FT_FRAMENUM_ACK), 0x0, "This packet ACKs a Notification in this frame", HFILL } }, @@ -4962,7 +4937,6 @@ void proto_register_dmp (void) &ett_notif_acp127recip, &ett_ack, &ett_ack_recips, - &ett_checksum, &ett_analysis }; diff --git a/epan/dissectors/packet-dmx.c b/epan/dissectors/packet-dmx.c index 0e6900a86f..7b3fe46414 100644 --- a/epan/dissectors/packet-dmx.c +++ b/epan/dissectors/packet-dmx.c @@ -92,8 +92,7 @@ static int hf_dmx_sip_fourth_dev_id = -1; static int hf_dmx_sip_fifth_dev_id = -1; static int hf_dmx_sip_reserved = -1; static int hf_dmx_sip_checksum = -1; -static int hf_dmx_sip_checksum_good = -1; -static int hf_dmx_sip_checksum_bad = -1; +static int hf_dmx_sip_checksum_status = -1; static int hf_dmx_sip_trailer = -1; static int hf_dmx_test_data = -1; @@ -201,9 +200,6 @@ dissect_dmx_sip(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data if (tree != NULL) { guint offset = 0; guint byte_count; - guint checksum, checksum_shouldbe; - proto_item *item; - proto_tree *checksum_tree; proto_tree *ti = proto_tree_add_item(tree, proto_dmx_sip, tvb, offset, -1, ENC_NA); @@ -273,34 +269,7 @@ dissect_dmx_sip(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data offset += (byte_count - offset); } - dmx_sip_checksum(tvb, offset); - - checksum_shouldbe = dmx_sip_checksum(tvb, offset); - checksum = tvb_get_guint8(tvb, offset); - item = proto_tree_add_item(dmx_sip_tree, hf_dmx_sip_checksum, tvb, - offset, 1, ENC_BIG_ENDIAN); - if (checksum == checksum_shouldbe) { - proto_item_append_text(item, " [correct]"); - - checksum_tree = proto_item_add_subtree(item, ett_dmx_sip); - item = proto_tree_add_boolean(checksum_tree, hf_dmx_sip_checksum_good, tvb, - offset, 1, TRUE); - PROTO_ITEM_SET_GENERATED(item); - item = proto_tree_add_boolean(checksum_tree, hf_dmx_sip_checksum_bad, tvb, - offset, 1, FALSE); - PROTO_ITEM_SET_GENERATED(item); - } else { - proto_item_append_text(item, " [incorrect, should be 0x%02x]", checksum_shouldbe); - - checksum_tree = proto_item_add_subtree(item, ett_dmx_sip); - item = proto_tree_add_boolean(checksum_tree, hf_dmx_sip_checksum_good, tvb, - offset, 1, FALSE); - PROTO_ITEM_SET_GENERATED(item); - item = proto_tree_add_boolean(checksum_tree, hf_dmx_sip_checksum_bad, tvb, - offset, 1, TRUE); - PROTO_ITEM_SET_GENERATED(item); - } - + proto_tree_add_checksum(dmx_sip_tree, tvb, offset, hf_dmx_sip_checksum, hf_dmx_sip_checksum_status, NULL, pinfo, dmx_sip_checksum(tvb, offset), ENC_NA, PROTO_CHECKSUM_VERIFY); offset += 1; if (offset < tvb_reported_length(tvb)) @@ -600,15 +569,10 @@ proto_register_dmx_sip(void) FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }}, - { &hf_dmx_sip_checksum_good, - { "Good Checksum", "dmx_sip.checksum_good", - FT_BOOLEAN, BASE_NONE, NULL, 0x0, - "True: checksum matches packet content; False: doesn't match content", HFILL }}, - - { &hf_dmx_sip_checksum_bad, - { "Bad Checksum", "dmx_sip.checksum_bad", - FT_BOOLEAN, BASE_NONE, NULL, 0x0, - "True: checksum doesn't match packet content; False: matches content", HFILL }}, + { &hf_dmx_sip_checksum_status, + { "Checksum Status", "dmx_sip.checksum.status", + FT_UINT8, BASE_NONE, VALS(proto_checksum_vals), 0x0, + NULL, HFILL }}, { &hf_dmx_sip_trailer, { "Trailer", "dmx_sip.trailer", diff --git a/epan/dissectors/packet-dvb-s2-bb.c b/epan/dissectors/packet-dvb-s2-bb.c index 1dc0f2fb09..71d4c1dbd1 100644 --- a/epan/dissectors/packet-dvb-s2-bb.c +++ b/epan/dissectors/packet-dvb-s2-bb.c @@ -784,13 +784,9 @@ static int dissect_dvb_s2_bb(tvbuff_t *tvb, int cur_off, proto_tree *tree, packe input8 = tvb_get_guint8(tvb, cur_off + DVB_S2_BB_OFFS_CRC); new_off += 1; - if (check_crc8(tvb, DVB_S2_BB_HEADER_LEN - 1, cur_off, input8)) { - proto_tree_add_uint_format(dvb_s2_bb_tree, hf_dvb_s2_bb_crc, tvb, - cur_off + DVB_S2_BB_OFFS_CRC, 1, 1, "Checksum: correct (0x%2.2x)", input8); - } else { - proto_tree_add_uint_format(dvb_s2_bb_tree, hf_dvb_s2_bb_crc, tvb, - cur_off + DVB_S2_BB_OFFS_CRC, 1, -1, "Checksum: incorrect! (0x%2.2x)", input8); - } + + proto_tree_add_checksum(dvb_s2_bb_tree, tvb, cur_off + DVB_S2_BB_OFFS_CRC, hf_dvb_s2_bb_crc, -1, NULL, pinfo, + check_crc8(tvb, DVB_S2_BB_HEADER_LEN - 1, cur_off, input8), ENC_NA, PROTO_CHECKSUM_VERIFY); while (bb_data_len) { /* start DVB-GSE dissector */ @@ -987,7 +983,7 @@ void proto_register_dvb_s2_modeadapt(void) "Distance to first user packet", HFILL} }, {&hf_dvb_s2_bb_crc, { - "CRC", "dvb-s2_bb.crc", + "Checksum", "dvb-s2_bb.crc", FT_UINT8, BASE_HEX, NULL, 0x0, "CRC-8", HFILL} } diff --git a/epan/dissectors/packet-dvmrp.c b/epan/dissectors/packet-dvmrp.c index e115339922..fead40077f 100644 --- a/epan/dissectors/packet-dvmrp.c +++ b/epan/dissectors/packet-dvmrp.c @@ -63,7 +63,7 @@ static int hf_version = -1; static int hf_type = -1; static int hf_code_v1 = -1; static int hf_checksum = -1; -static int hf_checksum_bad = -1; +static int hf_checksum_status = -1; static int hf_reserved = -1; static int hf_commands = -1; static int hf_command = -1; @@ -336,7 +336,7 @@ dissect_dvmrp_v3(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, int "Unknown Type:0x%02x")); /* checksum */ - igmp_checksum(parent_tree, tvb, hf_checksum, hf_checksum_bad, pinfo, 0); + igmp_checksum(parent_tree, tvb, hf_checksum, hf_checksum_status, pinfo, 0); offset += 2; /* skip unused byte */ @@ -525,7 +525,7 @@ dissect_dvmrp_v1(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, int "Unknown Type:0x%02x")); /* checksum */ - igmp_checksum(parent_tree, tvb, hf_checksum, hf_checksum_bad, pinfo, 0); + igmp_checksum(parent_tree, tvb, hf_checksum, hf_checksum_status, pinfo, 0); offset += 2; /* decode all the v1 commands */ @@ -720,9 +720,9 @@ proto_register_dvmrp(void) { "Checksum", "dvmrp.checksum", FT_UINT16, BASE_HEX, NULL, 0, "DVMRP Checksum", HFILL }}, - { &hf_checksum_bad, - { "Bad Checksum", "dvmrp.checksum_bad", FT_BOOLEAN, BASE_NONE, - NULL, 0x0, "Bad DVMRP Checksum", HFILL }}, + { &hf_checksum_status, + { "Checksum Status", "dvmrp.checksum.status", FT_UINT8, BASE_NONE, + VALS(proto_checksum_vals), 0x0, NULL, HFILL }}, { &hf_reserved, { "Reserved", "dvmrp.reserved", FT_UINT16, BASE_HEX, diff --git a/epan/dissectors/packet-eigrp.c b/epan/dissectors/packet-eigrp.c index b42d23d1e3..a925930b6e 100644 --- a/epan/dissectors/packet-eigrp.c +++ b/epan/dissectors/packet-eigrp.c @@ -2416,9 +2416,9 @@ static int dissect_eigrp (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) { proto_item *ti; - proto_tree *eigrp_tree = NULL, *tlv_tree; + proto_tree *eigrp_tree, *tlv_tree; guint opcode, vrid; - guint16 tlv, checksum, cacl_checksum; + guint16 tlv; guint32 ack, size, offset = EIGRP_HEADER_LENGTH; /* Make entries in Protocol column and Info column on summary display */ @@ -2463,18 +2463,7 @@ dissect_eigrp (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _ ENC_BIG_ENDIAN); size = tvb_captured_length(tvb); - checksum = tvb_get_ntohs(tvb, 2); - cacl_checksum = ip_checksum_tvb(tvb, 0, size); - - if (cacl_checksum == checksum) { - proto_tree_add_uint_format_value(eigrp_tree, hf_eigrp_checksum, tvb, 2, 2, - checksum, "0x%02x [incorrect]", - checksum); - expert_add_info(pinfo, ti, &ei_eigrp_checksum_bad); - } else { - proto_tree_add_uint_format_value(eigrp_tree, hf_eigrp_checksum, tvb, 2, 2, - checksum, "0x%02x [correct]", checksum); - } + proto_tree_add_checksum(eigrp_tree, tvb, 2, hf_eigrp_checksum, -1, &ei_eigrp_checksum_bad, pinfo, ip_checksum_tvb(tvb, 0, size), ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); /* Decode the EIGRP Flags Field */ proto_tree_add_bitmask(eigrp_tree, tvb, 4, hf_eigrp_flags, ett_eigrp_flags, diff --git a/epan/dissectors/packet-epon.c b/epan/dissectors/packet-epon.c index 5bc4046dca..be29d7ba18 100644 --- a/epan/dissectors/packet-epon.c +++ b/epan/dissectors/packet-epon.c @@ -172,16 +172,8 @@ dissect_epon(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, sent_checksum = tvb_get_guint8(tvb, 5+offset); checksum = get_crc8_ieee8023_epon(tvb, 5, 0+offset); - if (sent_checksum == checksum) { - proto_tree_add_uint_format_value(epon_tree, hf_epon_checksum, tvb, - 5+offset, 1, sent_checksum, - "0x%01x [correct]", sent_checksum); - } else { - item = proto_tree_add_uint_format_value(epon_tree, hf_epon_checksum, tvb, - 5+offset, 1, sent_checksum, - "0x%01x [incorrect, should be 0x%01x]", - sent_checksum, checksum); - expert_add_info(pinfo, item, &ei_epon_checksum_bad); + proto_tree_add_checksum(epon_tree, tvb, 5+offset, hf_epon_checksum, -1, &ei_epon_checksum_bad, pinfo, checksum, ENC_NA, PROTO_CHECKSUM_VERIFY); + if (sent_checksum != checksum) { col_append_str(pinfo->cinfo, COL_INFO, " [EPON PREAMBLE CHECKSUM INCORRECT]"); } diff --git a/epan/dissectors/packet-esis.c b/epan/dissectors/packet-esis.c index 759c1dcef5..67e7ea4d41 100644 --- a/epan/dissectors/packet-esis.c +++ b/epan/dissectors/packet-esis.c @@ -250,7 +250,6 @@ dissect_esis(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_ proto_tree *esis_tree = NULL; guint8 variable_len, type; guint16 holdtime, checksum; - const char *cksum_status; col_set_str(pinfo->cinfo, COL_PROTOCOL, "ESIS"); col_clear(pinfo->cinfo, COL_INFO); @@ -285,31 +284,19 @@ dissect_esis(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_ holdtime, "%u seconds", holdtime); checksum = tvb_get_ntohs(tvb, 7); - switch (calc_checksum( tvb, 0, length, checksum)) { + if (checksum == 0) { + /* No checksum present */ + proto_tree_add_checksum(esis_tree, tvb, 7, hf_esis_checksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NOT_PRESENT); + } else { + guint32 c0 = 0, c1 = 0; - case NO_CKSUM: - cksum_status = "Not Used"; - break; - - case DATA_MISSING: - cksum_status = "Not checkable - not all of packet was captured"; - break; - - case CKSUM_OK: - cksum_status = "Is good"; - break; - - case CKSUM_NOT_OK: - cksum_status = "Is wrong"; - break; - - default: - cksum_status = NULL; - DISSECTOR_ASSERT_NOT_REACHED(); + if (osi_calc_checksum(tvb, 0, length, &c0, &c1)) { + /* Successfully processed checksum, verify it */ + proto_tree_add_checksum(esis_tree, tvb, 7, hf_esis_checksum, -1, NULL, pinfo, c0 | c1, ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY|PROTO_CHECKSUM_ZERO); + } else { + proto_tree_add_checksum(esis_tree, tvb, 7, hf_esis_checksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); + } } - proto_tree_add_uint_format_value( esis_tree, hf_esis_checksum, tvb, 7, 2, - checksum, "0x%x ( %s )", checksum, cksum_status ); - /* * Let us make sure we use the same names for all our decodes diff --git a/epan/dissectors/packet-eth.c b/epan/dissectors/packet-eth.c index bfb6cc5270..4d82e8f448 100644 --- a/epan/dissectors/packet-eth.c +++ b/epan/dissectors/packet-eth.c @@ -78,14 +78,12 @@ static int hf_eth_ig = -1; static int hf_eth_padding = -1; static int hf_eth_trailer = -1; static int hf_eth_fcs = -1; -static int hf_eth_fcs_good = -1; -static int hf_eth_fcs_bad = -1; +static int hf_eth_fcs_status = -1; static gint ett_ieee8023 = -1; static gint ett_ether2 = -1; static gint ett_ether = -1; static gint ett_addr = -1; -static gint ett_eth_fcs = -1; static expert_field ei_eth_invalid_lentype = EI_INIT; static expert_field ei_eth_src_not_group = EI_INIT; @@ -647,8 +645,6 @@ add_ethernet_trailer(packet_info *pinfo, proto_tree *tree, proto_tree *fh_tree, have had 64 or more bytes - i.e., it was at least an FCS worth of data longer than the minimum payload size - we could assume the last 4 bytes of the trailer are an FCS. */ - proto_item *item; - proto_tree *checksum_tree; heur_dtbl_entry_t *hdtbl_entry; if (trailer_tvb) { @@ -749,43 +745,13 @@ add_ethernet_trailer(packet_info *pinfo, proto_tree *tree, proto_tree *fh_tree, guint32 sent_fcs = tvb_get_ntohl(trailer_tvb, padding_length+trailer_length); if(eth_check_fcs){ guint32 fcs = crc32_802_tvb(tvb, tvb_captured_length(tvb) - 4); - if (fcs == sent_fcs) { - item = proto_tree_add_uint_format_value(fh_tree, hf_eth_fcs, trailer_tvb, - padding_length+trailer_length, 4, sent_fcs, - "0x%08x [correct]", sent_fcs); - checksum_tree = proto_item_add_subtree(item, ett_eth_fcs); - item = proto_tree_add_boolean(checksum_tree, hf_eth_fcs_good, trailer_tvb, - padding_length+trailer_length, 4, TRUE); - PROTO_ITEM_SET_GENERATED(item); - item = proto_tree_add_boolean(checksum_tree, hf_eth_fcs_bad, trailer_tvb, - padding_length+trailer_length, 4, FALSE); - PROTO_ITEM_SET_GENERATED(item); - } else { - item = proto_tree_add_uint_format_value(fh_tree, hf_eth_fcs, trailer_tvb, - padding_length+trailer_length, 4, sent_fcs, - "0x%08x [incorrect, should be 0x%08x]", - sent_fcs, fcs); - checksum_tree = proto_item_add_subtree(item, ett_eth_fcs); - item = proto_tree_add_boolean(checksum_tree, hf_eth_fcs_good, trailer_tvb, - padding_length+trailer_length, 4, FALSE); - PROTO_ITEM_SET_GENERATED(item); - item = proto_tree_add_boolean(checksum_tree, hf_eth_fcs_bad, trailer_tvb, - padding_length+trailer_length, 4, TRUE); - PROTO_ITEM_SET_GENERATED(item); - expert_add_info(pinfo, item, &ei_eth_fcs_bad); + proto_tree_add_checksum(fh_tree, trailer_tvb, padding_length+trailer_length, hf_eth_fcs, hf_eth_fcs_status, &ei_eth_fcs_bad, pinfo, fcs, ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); + + if (fcs != sent_fcs) { col_append_str(pinfo->cinfo, COL_INFO, " [ETHERNET FRAME CHECK SEQUENCE INCORRECT]"); } }else{ - item = proto_tree_add_uint_format_value(fh_tree, hf_eth_fcs, trailer_tvb, - padding_length+trailer_length, 4, sent_fcs, - "0x%08x [validation disabled]", sent_fcs); - checksum_tree = proto_item_add_subtree(item, ett_eth_fcs); - item = proto_tree_add_boolean(checksum_tree, hf_eth_fcs_good, trailer_tvb, - padding_length+trailer_length, 4, FALSE); - PROTO_ITEM_SET_GENERATED(item); - item = proto_tree_add_boolean(checksum_tree, hf_eth_fcs_bad, trailer_tvb, - padding_length+trailer_length, 4, FALSE); - PROTO_ITEM_SET_GENERATED(item); + proto_tree_add_checksum(fh_tree, trailer_tvb, padding_length+trailer_length, hf_eth_fcs, hf_eth_fcs_status, &ei_eth_fcs_bad, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); } trailer_length += 4; } @@ -919,13 +885,9 @@ proto_register_eth(void) { "Frame check sequence", "eth.fcs", FT_UINT32, BASE_HEX, NULL, 0x0, "Ethernet checksum", HFILL }}, - { &hf_eth_fcs_good, - { "FCS Good", "eth.fcs_good", FT_BOOLEAN, BASE_NONE, NULL, 0x0, - "True: checksum matches packet content; False: doesn't match content or not checked", HFILL }}, - - { &hf_eth_fcs_bad, - { "FCS Bad", "eth.fcs_bad", FT_BOOLEAN, BASE_NONE, NULL, 0x0, - "True: checksum doesn't match packet content; False: does match content or not checked", HFILL }}, + { &hf_eth_fcs_status, + { "FCS Status", "eth.fcs.status", FT_UINT8, BASE_NONE, VALS(proto_checksum_vals), 0x0, + NULL, HFILL }}, { &hf_eth_lg, { "LG bit", "eth.lg", FT_BOOLEAN, 24, @@ -942,13 +904,12 @@ proto_register_eth(void) &ett_ether2, &ett_ether, &ett_addr, - &ett_eth_fcs }; static ei_register_info ei[] = { { &ei_eth_invalid_lentype, { "eth.invalid_lentype.expert", PI_PROTOCOL, PI_WARN, "Invalid length/type", EXPFILL }}, { &ei_eth_src_not_group, { "eth.src_not_group", PI_PROTOCOL, PI_WARN, "Source MAC must not be a group address: IEEE 802.3-2002, Section 3.2.3(b)", EXPFILL }}, - { &ei_eth_fcs_bad, { "eth.fcs_bad.expert", PI_CHECKSUM, PI_ERROR, "Bad checksum", EXPFILL }}, + { &ei_eth_fcs_bad, { "eth.fcs_bad", PI_CHECKSUM, PI_ERROR, "Bad checksum", EXPFILL }}, { &ei_eth_len, { "eth.len.past_end", PI_MALFORMED, PI_ERROR, "Length field value goes past the end of the payload", EXPFILL }}, }; diff --git a/epan/dissectors/packet-extreme.c b/epan/dissectors/packet-extreme.c index 92693063fa..17a39e52e5 100644 --- a/epan/dissectors/packet-extreme.c +++ b/epan/dissectors/packet-extreme.c @@ -159,8 +159,7 @@ static int hf_edp_version = -1; static int hf_edp_reserved = -1; static int hf_edp_length = -1; static int hf_edp_checksum = -1; -static int hf_edp_checksum_good = -1; -static int hf_edp_checksum_bad = -1; +static int hf_edp_checksum_status = -1; static int hf_edp_seqno = -1; static int hf_edp_midtype = -1; @@ -255,7 +254,6 @@ static int hf_edp_null = -1; static expert_field ei_edp_short_tlv = EI_INIT; static gint ett_edp = -1; -static gint ett_edp_checksum = -1; static gint ett_edp_tlv_header = -1; static gint ett_edp_display = -1; static gint ett_edp_info = -1; @@ -950,11 +948,7 @@ dissect_edp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) { proto_item *ti; proto_tree *edp_tree; - proto_item *checksum_item; - proto_tree *checksum_tree; guint32 offset = 0; - guint16 packet_checksum, computed_checksum; - gboolean checksum_good, checksum_bad; gboolean last = FALSE; guint8 tlv_type; guint16 tlv_length; @@ -982,40 +976,18 @@ dissect_edp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) data_length); offset += 2; - packet_checksum = tvb_get_ntohs(tvb, offset); /* * If we have the entire ESP packet available, check the checksum. */ if (tvb_captured_length(tvb) >= data_length) { /* Checksum from version to null tlv */ SET_CKSUM_VEC_TVB(cksum_vec[0], tvb, 0, data_length); - computed_checksum = in_cksum(&cksum_vec[0], 1); - checksum_good = (computed_checksum == 0); - checksum_bad = !checksum_good; - if (checksum_good) { - checksum_item = proto_tree_add_uint_format(edp_tree, - hf_edp_checksum, tvb, offset, 2, packet_checksum, - "Checksum: 0x%04x [correct]", - packet_checksum); - } else { - checksum_item = proto_tree_add_uint_format(edp_tree, - hf_edp_checksum, tvb, offset, 2, packet_checksum, - "Checksum: 0x%04x [incorrect, should be 0x%04x]", - packet_checksum, - in_cksum_shouldbe(packet_checksum, computed_checksum)); - } + + proto_tree_add_checksum(edp_tree, tvb, offset, hf_edp_checksum, hf_edp_checksum_status, NULL, pinfo, in_cksum(&cksum_vec[0], 1), + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY|PROTO_CHECKSUM_IN_CKSUM); } else { - checksum_good = checksum_bad = FALSE; - checksum_item = proto_tree_add_uint(edp_tree, hf_edp_checksum, - tvb, offset, 2, packet_checksum); + proto_tree_add_checksum(edp_tree, tvb, offset, hf_edp_checksum, hf_edp_checksum_status, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); } - checksum_tree = proto_item_add_subtree(checksum_item, ett_edp_checksum); - checksum_item = proto_tree_add_boolean(checksum_tree, hf_edp_checksum_good, - tvb, offset, 2, checksum_good); - PROTO_ITEM_SET_GENERATED(checksum_item); - checksum_item = proto_tree_add_boolean(checksum_tree, hf_edp_checksum_bad, - tvb, offset, 2, checksum_bad); - PROTO_ITEM_SET_GENERATED(checksum_item); offset += 2; seqno = tvb_get_ntohs(tvb, offset); @@ -1114,13 +1086,9 @@ proto_register_edp(void) { "EDP checksum", "edp.checksum", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }}, - { &hf_edp_checksum_good, - { "Good", "edp.checksum_good", FT_BOOLEAN, BASE_NONE, NULL, 0x0, - "True: checksum matches packet content; False: doesn't match content or not checked", HFILL }}, - - { &hf_edp_checksum_bad, - { "Bad", "edp.checksum_bad", FT_BOOLEAN, BASE_NONE, NULL, 0x0, - "True: checksum doesn't match packet content; False: matches content or not checked", HFILL }}, + { &hf_edp_checksum_status, + { "EDP checksum status", "edp.checksum.status", FT_UINT8, BASE_NONE, VALS(proto_checksum_vals), 0x0, + NULL, HFILL }}, { &hf_edp_seqno, { "Sequence number", "edp.seqno", FT_UINT16, BASE_DEC, NULL, @@ -1455,7 +1423,6 @@ proto_register_edp(void) static gint *ett[] = { &ett_edp, - &ett_edp_checksum, &ett_edp_tlv_header, &ett_edp_vlan_flags, &ett_edp_display, diff --git a/epan/dissectors/packet-fc.c b/epan/dissectors/packet-fc.c index 839b667e3b..7bfb35d79a 100644 --- a/epan/dissectors/packet-fc.c +++ b/epan/dissectors/packet-fc.c @@ -1270,37 +1270,28 @@ dissect_fc_ifcp (tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data static int dissect_fcsof(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) { - proto_item *it = NULL; - proto_tree *fcsof_tree = NULL; - tvbuff_t *next_tvb, *checksum_tvb; - guint32 sof = 0; - guint32 crc = 0; - guint32 crc_computed = 0; - guint32 eof = 0; - gint crc_offset = 0; - gint eof_offset = 0; - gint sof_offset = 0; + proto_item *it; + proto_tree *fcsof_tree; + tvbuff_t *next_tvb; + guint32 sof; + guint32 crc_computed; + guint32 eof; const gint FCSOF_TRAILER_LEN = 8; const gint FCSOF_HEADER_LEN = 4; - gint frame_len_for_checksum = 0; + gint crc_offset = tvb_reported_length(tvb) - FCSOF_TRAILER_LEN; + gint eof_offset = crc_offset + 4; + gint sof_offset = 0; + gint frame_len_for_checksum; fc_data_t fc_data; col_set_str(pinfo->cinfo, COL_PROTOCOL, "FC"); - crc_offset = tvb_reported_length(tvb) - FCSOF_TRAILER_LEN; - eof_offset = crc_offset + 4; - sof_offset = 0; - /* Get SOF */ sof = tvb_get_ntohl(tvb, 0); - /* GET CRC */ - crc = tvb_get_ntohl(tvb, crc_offset); - /* GET Computed CRC */ frame_len_for_checksum = crc_offset - FCSOF_HEADER_LEN; - checksum_tvb = tvb_new_subset_length(tvb, 4, frame_len_for_checksum); - crc_computed = crc32_802_tvb(checksum_tvb, frame_len_for_checksum); + crc_computed = crc32_802_tvb(tvb_new_subset_length(tvb, 4, frame_len_for_checksum), frame_len_for_checksum); /* Get EOF */ eof = tvb_get_ntohl(tvb, eof_offset); @@ -1314,20 +1305,7 @@ dissect_fcsof(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U proto_tree_add_uint(fcsof_tree, hf_fcsof, tvb, sof_offset, 4, sof); - if (crc == crc_computed) { - proto_tree_add_uint_format_value(fcsof_tree, hf_fccrc, tvb, - crc_offset, 4, crc, - "%8.8x [valid]", crc); - } else { - it = proto_tree_add_uint_format_value(fcsof_tree, hf_fccrc, tvb, - crc_offset, 4, crc, - "%8.8x [error: should be %8.8x]", - crc, crc_computed); - - expert_add_info_format(pinfo, it, &ei_fccrc, - "Bad FC CRC %8.8x %8.x", - crc, crc_computed); - } + proto_tree_add_checksum(fcsof_tree, tvb, crc_offset, hf_fccrc, -1, &ei_fccrc, pinfo, crc_computed, ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); proto_tree_add_uint(fcsof_tree, hf_fceof, tvb, eof_offset, 4, eof); diff --git a/epan/dissectors/packet-fcoe.c b/epan/dissectors/packet-fcoe.c index 08bb769d21..fee88470e4 100644 --- a/epan/dissectors/packet-fcoe.c +++ b/epan/dissectors/packet-fcoe.c @@ -95,11 +95,9 @@ static int hf_fcoe_len = -1; static int hf_fcoe_sof = -1; static int hf_fcoe_eof = -1; static int hf_fcoe_crc = -1; -static int hf_fcoe_crc_bad = -1; -static int hf_fcoe_crc_good = -1; +static int hf_fcoe_crc_status = -1; static int ett_fcoe = -1; -static int ett_fcoe_crc = -1; static expert_field ei_fcoe_crc = EI_INIT; @@ -122,9 +120,7 @@ dissect_fcoe(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_ const char *crc_msg; const char *len_msg; proto_item *ti; - proto_item *item; proto_tree *fcoe_tree; - proto_tree *crc_tree; tvbuff_t *next_tvb; gboolean crc_exists; guint32 crc_computed = 0; @@ -213,34 +209,12 @@ dissect_fcoe(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_ * Create the CRC information. */ if (crc_exists) { - if (crc == crc_computed) { - item = proto_tree_add_uint_format_value(fcoe_tree, hf_fcoe_crc, tvb, - crc_offset, 4, crc, - "%8.8x [valid]", crc); - } else { - item = proto_tree_add_uint_format_value(fcoe_tree, hf_fcoe_crc, tvb, - crc_offset, 4, crc, - "%8.8x [error: should be %8.8x]", - crc, crc_computed); - expert_add_info_format(pinfo, item, &ei_fcoe_crc, - "Bad FC CRC %8.8x %8.x", - crc, crc_computed); - } + proto_tree_add_checksum(fcoe_tree, tvb, crc_offset, hf_fcoe_crc, hf_fcoe_crc_status, &ei_fcoe_crc, pinfo, crc_computed, ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); proto_tree_set_appendix(fcoe_tree, tvb, crc_offset, tvb_captured_length_remaining (tvb, crc_offset)); } else { - item = proto_tree_add_uint_format_value(fcoe_tree, hf_fcoe_crc, tvb, crc_offset, 0, - 0, "CRC: [missing]"); + proto_tree_add_checksum(fcoe_tree, tvb, crc_offset, hf_fcoe_crc, hf_fcoe_crc_status, &ei_fcoe_crc, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NOT_PRESENT); } - crc_tree = proto_item_add_subtree(item, ett_fcoe_crc); - ti = proto_tree_add_boolean(crc_tree, hf_fcoe_crc_bad, tvb, - crc_offset, 4, - crc_exists && crc != crc_computed); - PROTO_ITEM_SET_GENERATED(ti); - ti = proto_tree_add_boolean(crc_tree, hf_fcoe_crc_good, tvb, - crc_offset, 4, - crc_exists && crc == crc_computed); - PROTO_ITEM_SET_GENERATED(ti); /* * Interpret the EOF. @@ -294,16 +268,12 @@ proto_register_fcoe(void) BASE_DEC, NULL, 0, NULL, HFILL}}, { &hf_fcoe_crc, {"CRC", "fcoe.crc", FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}}, - { &hf_fcoe_crc_good, - {"CRC good", "fcoe.crc_good", FT_BOOLEAN, BASE_NONE, NULL, 0x0, - "True: CRC matches packet content; False: doesn't match or not checked.", HFILL }}, - { &hf_fcoe_crc_bad, - {"CRC bad", "fcoe.crc_bad", FT_BOOLEAN, BASE_NONE, NULL, 0x0, - "True: CRC doesn't match packet content; False: matches or not checked.", HFILL }} + { &hf_fcoe_crc_status, + {"CRC Status", "fcoe.crc.status", FT_UINT8, BASE_NONE, VALS(proto_checksum_vals), 0x0, + NULL, HFILL }} }; static gint *ett[] = { &ett_fcoe, - &ett_fcoe_crc }; static ei_register_info ei[] = { diff --git a/epan/dissectors/packet-fcoib.c b/epan/dissectors/packet-fcoib.c index de50bd3373..0278fc4b14 100644 --- a/epan/dissectors/packet-fcoib.c +++ b/epan/dissectors/packet-fcoib.c @@ -96,11 +96,9 @@ static int hf_fcoib_sig = -1; static int hf_fcoib_sof = -1; static int hf_fcoib_eof = -1; static int hf_fcoib_crc = -1; -static int hf_fcoib_crc_bad = -1; -static int hf_fcoib_crc_good = -1; +static int hf_fcoib_crc_status = -1; static int ett_fcoib = -1; -static int ett_fcoib_crc = -1; static expert_field ei_fcoib_crc = EI_INIT; @@ -161,9 +159,7 @@ dissect_fcoib(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U const char *crc_msg; const char *len_msg; proto_item *ti; - proto_item *item; proto_tree *fcoib_tree; - proto_tree *crc_tree; tvbuff_t *next_tvb; gboolean crc_exists; guint32 crc_computed = 0; @@ -268,34 +264,12 @@ dissect_fcoib(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U * Create the CRC information. */ if (crc_exists) { - if (crc == crc_computed) { - item = proto_tree_add_uint_format_value(fcoib_tree, hf_fcoib_crc, tvb, - crc_offset, 4, crc, - "%8.8x [valid]", crc); - } else { - item = proto_tree_add_uint_format_value(fcoib_tree, hf_fcoib_crc, tvb, - crc_offset, 4, crc, - "%8.8x [error: should be %8.8x]", - crc, crc_computed); - expert_add_info_format(pinfo, item, &ei_fcoib_crc, - "Bad FC CRC %8.8x %8.x", - crc, crc_computed); - } + proto_tree_add_checksum(fcoib_tree, tvb, crc_offset, hf_fcoib_crc, hf_fcoib_crc_status, &ei_fcoib_crc, pinfo, crc_computed, ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); proto_tree_set_appendix(fcoib_tree, tvb, crc_offset, tvb_captured_length_remaining (tvb, crc_offset)); } else { - item = proto_tree_add_uint_format_value(fcoib_tree, hf_fcoib_crc, tvb, crc_offset, 0, - 0, "CRC: [missing]"); + proto_tree_add_checksum(fcoib_tree, tvb, crc_offset, hf_fcoib_crc, hf_fcoib_crc_status, &ei_fcoib_crc, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NOT_PRESENT); } - crc_tree = proto_item_add_subtree(item, ett_fcoib_crc); - ti = proto_tree_add_boolean(crc_tree, hf_fcoib_crc_bad, tvb, - crc_offset, 4, - crc_exists && crc != crc_computed); - PROTO_ITEM_SET_GENERATED(ti); - ti = proto_tree_add_boolean(crc_tree, hf_fcoib_crc_good, tvb, - crc_offset, 4, - crc_exists && crc == crc_computed); - PROTO_ITEM_SET_GENERATED(ti); /* * Interpret the EOF. @@ -349,16 +323,12 @@ proto_register_fcoib(void) {"Version", "fcoib.ver", FT_UINT32, BASE_DEC, NULL, 0, NULL, HFILL}}, { &hf_fcoib_crc, {"CRC", "fcoib.crc", FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL}}, - { &hf_fcoib_crc_good, - {"CRC good", "fcoib.crc_good", FT_BOOLEAN, BASE_NONE, NULL, 0x0, - "True: CRC matches packet content; False: doesn't match or not checked.", HFILL }}, - { &hf_fcoib_crc_bad, - {"CRC bad", "fcoib.crc_bad", FT_BOOLEAN, BASE_NONE, NULL, 0x0, - "True: CRC doesn't match packet content; False: matches or not checked.", HFILL }} + { &hf_fcoib_crc_status, + {"CRC Status", "fcoib.crc.status", FT_UINT8, BASE_NONE, VALS(proto_checksum_vals), 0x0, + NULL, HFILL }}, }; static gint *ett[] = { &ett_fcoib, - &ett_fcoib_crc }; static ei_register_info ei[] = { diff --git a/epan/dissectors/packet-fcswils.c b/epan/dissectors/packet-fcswils.c index 0e4e43aa19..8befc40de5 100644 --- a/epan/dissectors/packet-fcswils.c +++ b/epan/dissectors/packet-fcswils.c @@ -1015,7 +1015,7 @@ dissect_swils_fspf_lsrechdr(tvbuff_t *tvb, proto_tree *tree, int offset) proto_tree_add_item(tree, hf_swils_lsrh_lsid, tvb, offset+11, 1, ENC_BIG_ENDIAN); proto_tree_add_item(tree, hf_swils_lsrh_adv_domid, tvb, offset+15, 1, ENC_BIG_ENDIAN); proto_tree_add_item(tree, hf_swils_lsrh_ls_incid, tvb, offset+16, 4, ENC_BIG_ENDIAN); - proto_tree_add_item(tree, hf_swils_lsrh_checksum, tvb, offset+20, 2, ENC_BIG_ENDIAN); + proto_tree_add_checksum(tree, tvb, offset+20, hf_swils_lsrh_checksum, -1, NULL, NULL, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); proto_tree_add_item(tree, hf_swils_lsrh_lsr_length, tvb, offset+22, 2, ENC_BIG_ENDIAN); } diff --git a/epan/dissectors/packet-fefd.c b/epan/dissectors/packet-fefd.c index 26982e63db..489315c070 100644 --- a/epan/dissectors/packet-fefd.c +++ b/epan/dissectors/packet-fefd.c @@ -94,31 +94,30 @@ dissect_fefd(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_ guint16 length; proto_tree *tlv_tree; int real_length; + static const int * flags[] = { + &hf_fefd_flags_rt, + &hf_fefd_flags_rsy, + NULL + }; + static const int * headers[] = { + &hf_fefd_version, + &hf_fefd_opcode, + NULL + }; col_set_str(pinfo->cinfo, COL_PROTOCOL, "FEFD"); col_clear(pinfo->cinfo, COL_INFO); - if (tree) { - proto_item *flags_ti; - proto_tree *flags_tree; + ti = proto_tree_add_item(tree, proto_fefd, tvb, offset, -1, ENC_NA); + fefd_tree = proto_item_add_subtree(ti, ett_fefd); - ti = proto_tree_add_item(tree, proto_fefd, tvb, offset, -1, ENC_NA); - fefd_tree = proto_item_add_subtree(ti, ett_fefd); - - /* FEFD header */ - proto_tree_add_item(fefd_tree, hf_fefd_version, tvb, offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(fefd_tree, hf_fefd_opcode, tvb, offset, 1, ENC_BIG_ENDIAN); - offset += 1; - flags_ti = proto_tree_add_item(fefd_tree, hf_fefd_flags, tvb, offset, 1, ENC_BIG_ENDIAN); - flags_tree = proto_item_add_subtree(flags_ti, ett_fefd_flags); - proto_tree_add_item(flags_tree, hf_fefd_flags_rt, tvb, offset, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(flags_tree, hf_fefd_flags_rsy, tvb, offset, 1, ENC_BIG_ENDIAN); - offset += 1; - proto_tree_add_item(fefd_tree, hf_fefd_checksum, tvb, offset, 2, ENC_BIG_ENDIAN); - offset += 2; - } else { - offset += 4; /* The version/opcode/flags/checksum fields from above */ - } + /* FEFD header */ + proto_tree_add_bitmask_list(fefd_tree, tvb, offset, 1, headers, ENC_BIG_ENDIAN); + offset += 1; + proto_tree_add_bitmask(fefd_tree, tvb, offset, hf_fefd_flags, ett_fefd_flags, flags, ENC_BIG_ENDIAN); + offset += 1; + proto_tree_add_checksum(fefd_tree, tvb, offset, hf_fefd_checksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); + offset += 2; while (tvb_reported_length_remaining(tvb, offset) != 0) { type = tvb_get_ntohs(tvb, offset + TLV_TYPE); diff --git a/epan/dissectors/packet-foundry.c b/epan/dissectors/packet-foundry.c index 5c046d8d84..9da0111684 100644 --- a/epan/dissectors/packet-foundry.c +++ b/epan/dissectors/packet-foundry.c @@ -284,7 +284,7 @@ dissect_fdp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) offset += 1; proto_tree_add_item(fdp_tree, hf_fdp_holdtime, tvb, offset, 1, ENC_BIG_ENDIAN); offset += 1; - proto_tree_add_item(fdp_tree, hf_fdp_checksum, tvb, offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_checksum(fdp_tree, tvb, offset, hf_fdp_checksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); offset += 2; /* Decode the individual TLVs */ diff --git a/epan/dissectors/packet-gdb.c b/epan/dissectors/packet-gdb.c index dd976a719f..e5c9187df9 100644 --- a/epan/dissectors/packet-gdb.c +++ b/epan/dissectors/packet-gdb.c @@ -104,8 +104,7 @@ dissect_gdb_token(void *tvbparse_data, const void *wanted_data, tvbparse_elem_t case GDB_TOK_CHKSUM: /* the spec is not really explicit but it seems that the checksum is big endian */ - proto_tree_add_item(tree, hf_gdb_chksum, - tok->tvb, tok->offset, tok->len, ENC_BIG_ENDIAN); + proto_tree_add_checksum(tree, tok->tvb, tok->offset, hf_gdb_chksum, -1, NULL, NULL, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); break; default: break; 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 }; diff --git a/epan/dissectors/packet-gre.c b/epan/dissectors/packet-gre.c index f81f42885a..4d60a57370 100644 --- a/epan/dissectors/packet-gre.c +++ b/epan/dissectors/packet-gre.c @@ -410,29 +410,21 @@ dissect_gre(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) if (flags_and_ver & GRE_CHECKSUM || flags_and_ver & GRE_ROUTING) { guint length, reported_length; - proto_item *it_checksum; vec_t cksum_vec[1]; - guint16 cksum, computed_cksum; - it_checksum = proto_tree_add_item(gre_tree, hf_gre_checksum, tvb, offset, 2, ENC_BIG_ENDIAN); /* Checksum check !... */ - cksum = tvb_get_ntohs(tvb, offset); length = tvb_captured_length(tvb); reported_length = tvb_reported_length(tvb); /* The Checksum Present bit is set, and the packet isn't part of a fragmented datagram and isn't truncated, so we can checksum it. */ if ((flags_and_ver & GRE_CHECKSUM) && !pinfo->fragmented && length >= reported_length) { SET_CKSUM_VEC_TVB(cksum_vec[0], tvb, 0, reported_length); - computed_cksum = in_cksum(cksum_vec, 1); - if (computed_cksum == 0) { - proto_item_append_text(it_checksum," [correct]"); - } else { - proto_item_append_text(it_checksum," [incorrect, should be 0x%04x]",in_cksum_shouldbe(cksum, computed_cksum)); - expert_add_info(pinfo, it_checksum, &ei_gre_checksum_incorrect); - } + proto_tree_add_checksum(gre_tree, tvb, offset, hf_gre_checksum, -1, &ei_gre_checksum_incorrect, pinfo, in_cksum(cksum_vec, 1), + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY|PROTO_CHECKSUM_IN_CKSUM); + } else { + proto_tree_add_checksum(gre_tree, tvb, offset, hf_gre_checksum, -1, &ei_gre_checksum_incorrect, pinfo, 0, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); } - - offset += 2; proto_tree_add_item(gre_tree, hf_gre_offset, tvb, offset, 2, ENC_BIG_ENDIAN); diff --git a/epan/dissectors/packet-h223.c b/epan/dissectors/packet-h223.c index 3a66b4bbd8..7d942f83df 100644 --- a/epan/dissectors/packet-h223.c +++ b/epan/dissectors/packet-h223.c @@ -95,7 +95,7 @@ static int hf_h223_al2_sequenced = -1; static int hf_h223_al2_unsequenced = -1; static int hf_h223_al2_seqno = -1; static int hf_h223_al2_crc = -1; -static int hf_h223_al2_crc_bad = -1; +static int hf_h223_al2_crc_status = -1; static int hf_h223_al_payload = -1; @@ -697,15 +697,9 @@ dissect_mux_al_pdu( tvbuff_t *tvb, packet_info *pinfo, proto_tree *vc_tree, calc_checksum = h223_al2_crc8bit(tvb); real_checksum = tvb_get_guint8(tvb, len - 1); - if( calc_checksum == real_checksum ) { - proto_tree_add_uint_format_value(al_tree, hf_h223_al2_crc, tvb, len - 1, 1, real_checksum, - "0x%02x (correct)", real_checksum ); - } else { - proto_tree_add_uint_format_value(al_tree, hf_h223_al2_crc, tvb, len - 1, 1, real_checksum, - "0x%02x (incorrect, should be 0x%02x)", real_checksum, calc_checksum ); - tmp_item = proto_tree_add_boolean( al_tree, hf_h223_al2_crc_bad, tvb, len - 1, 1, TRUE ); - PROTO_ITEM_SET_GENERATED(tmp_item); + proto_tree_add_checksum(al_tree, tvb, len - 1, hf_h223_al2_crc, hf_h223_al2_crc_status, NULL, pinfo, calc_checksum, ENC_NA, PROTO_CHECKSUM_VERIFY); + if( calc_checksum != real_checksum ) { /* don't pass pdus which fail checksums on to the subdissector */ subdissector = data_handle; } @@ -1610,8 +1604,8 @@ void proto_register_h223 (void) { "CRC", "h223.al2.crc", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }}, - { &hf_h223_al2_crc_bad, - { "Bad CRC","h223.al2.crc_bad", FT_BOOLEAN, BASE_NONE, NULL, 0x0, + { &hf_h223_al2_crc_status, + { "CRC Status","h223.al2.crc.status", FT_UINT8, BASE_NONE, VALS(proto_checksum_vals), 0x0, NULL, HFILL }}, { &hf_h223_al_payload, diff --git a/epan/dissectors/packet-hartip.c b/epan/dissectors/packet-hartip.c index 2c55544fe8..2f7e7f3ce8 100644 --- a/epan/dissectors/packet-hartip.c +++ b/epan/dissectors/packet-hartip.c @@ -788,7 +788,7 @@ dissect_pass_through(proto_tree *body_tree, tvbuff_t *tvb, gint offset, length = 1; } if (length > 0) { - proto_tree_add_item(body_tree, hf_hartip_pt_checksum, tvb, offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_checksum(body_tree, tvb, offset, hf_hartip_pt_checksum, -1, NULL, NULL, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); } return bodylen; diff --git a/epan/dissectors/packet-hip.c b/epan/dissectors/packet-hip.c index 928e446293..c98a52956b 100644 --- a/epan/dissectors/packet-hip.c +++ b/epan/dissectors/packet-hip.c @@ -421,7 +421,7 @@ dissect_hip_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gboolean proto_tree *hip_tree, *hip_tlv_tree=NULL; proto_item *ti, *ti_tlv; int length, offset = 0, newoffset = 0; - guint16 control_h, checksum_h, computed_checksum; + guint16 control_h, checksum_h; guint16 tlv_type_h, tlv_length_h; /* For storing in host order */ guint len; guint reported_len; @@ -510,32 +510,16 @@ dissect_hip_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gboolean } /* pointer to the HIP header (packet data) */ SET_CKSUM_VEC_TVB(cksum_vec[3], tvb, 0, reported_len); - computed_checksum = in_cksum(cksum_vec, 4); - if (computed_checksum == 0) { - proto_tree_add_uint_format_value(hip_tree, hf_hip_checksum, tvb, - offset+4, 2, checksum_h, - "0x%04x (correct)", - checksum_h); + if (checksum_h == 0 && udp) { + proto_tree_add_checksum(hip_tree, tvb, offset+4, hf_hip_checksum, -1, NULL, pinfo, 0, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); } else { - if (checksum_h == 0 && udp) { - proto_tree_add_uint_format_value(hip_tree, hf_hip_checksum, tvb, - offset+4, 2, checksum_h, - "0x%04x (correct)", - checksum_h); - } else { - proto_tree_add_uint_format_value(hip_tree, hf_hip_checksum, tvb, - offset+4, 2, checksum_h, - "0x%04x (incorrect, should be 0x%04x)", - checksum_h, - in_cksum_shouldbe(checksum_h, - computed_checksum)); - } + proto_tree_add_checksum(hip_tree, tvb, offset+4, hf_hip_checksum, -1, NULL, pinfo, in_cksum(cksum_vec, 4), + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY|PROTO_CHECKSUM_IN_CKSUM); } } else { - proto_tree_add_uint_format_value(hip_tree, hf_hip_checksum, tvb, - offset+4, 2, checksum_h, - "0x%04x (unverified)", - checksum_h); + proto_tree_add_checksum(hip_tree, tvb, offset+4, hf_hip_checksum, -1, NULL, pinfo, 0, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); } ti = proto_tree_add_item(hip_tree, hf_hip_controls, tvb, offset+6, 2, ENC_BIG_ENDIAN); diff --git a/epan/dissectors/packet-homeplug-av.c b/epan/dissectors/packet-homeplug-av.c index bff72d68b2..c983701179 100644 --- a/epan/dissectors/packet-homeplug-av.c +++ b/epan/dissectors/packet-homeplug-av.c @@ -3674,19 +3674,19 @@ proto_register_homeplug_av(void) }, { &hf_homeplug_av_st_mac_req_img_load, { "Image Load Starting Address", "homeplug_av.st_mac_req.img_load", - FT_UINT32, BASE_HEX, NULL, 0x00, "Unknown", HFILL } + FT_UINT32, BASE_HEX, NULL, 0x00, NULL, HFILL } }, { &hf_homeplug_av_st_mac_req_img_len, { "Image Length", "homeplug_av.st_mac_req.img_len", - FT_UINT32, BASE_HEX, NULL, 0x00, "Unknown", HFILL } + FT_UINT32, BASE_HEX, NULL, 0x00, NULL, HFILL } }, { &hf_homeplug_av_st_mac_req_img_chksum, { "Image Checksum", "homeplug_av.st_mac_req.img_chksum", - FT_UINT32, BASE_HEX, NULL, 0x00, "Unknown", HFILL } + FT_UINT32, BASE_HEX, NULL, 0x00, NULL, HFILL } }, { &hf_homeplug_av_st_mac_req_img_start, { "Image Starting Address", "homeplug_av.st_mac_req.img_start", - FT_UINT32, BASE_HEX, NULL, 0x00, "Unknown", HFILL } + FT_UINT32, BASE_HEX, NULL, 0x00, NULL, HFILL } }, /* Start MAC Confirmation */ { &hf_homeplug_av_st_mac_cnf, diff --git a/epan/dissectors/packet-icmp.c b/epan/dissectors/packet-icmp.c index 6e21bbead8..01afaa93fc 100644 --- a/epan/dissectors/packet-icmp.c +++ b/epan/dissectors/packet-icmp.c @@ -80,7 +80,7 @@ int proto_icmp = -1; static int hf_icmp_type = -1; static int hf_icmp_code = -1; static int hf_icmp_checksum = -1; -static int hf_icmp_checksum_bad = -1; +static int hf_icmp_checksum_status = -1; static int hf_icmp_unused = -1; static int hf_icmp_reserved = -1; static int hf_icmp_ident = -1; @@ -129,7 +129,7 @@ static int hf_icmp_ext = -1; static int hf_icmp_ext_version = -1; static int hf_icmp_ext_reserved = -1; static int hf_icmp_ext_checksum = -1; -static int hf_icmp_ext_checksum_bad = -1; +static int hf_icmp_ext_checksum_status = -1; static int hf_icmp_ext_length = -1; static int hf_icmp_ext_class = -1; static int hf_icmp_ext_c_type = -1; @@ -760,9 +760,8 @@ dissect_extensions(tvbuff_t * tvb, gint offset, proto_tree * tree) guint8 version; guint8 class_num; guint8 c_type; - guint16 cksum, computed_cksum; guint16 obj_length, obj_trunc_length; - proto_item *ti, *tf_object, *hidden_item; + proto_item *ti, *tf_object; proto_tree *ext_tree, *ext_object_tree; gint obj_end_offset; guint reported_length; @@ -798,31 +797,8 @@ dissect_extensions(tvbuff_t * tvb, gint offset, proto_tree * tree) tvb, offset, 2, ENC_BIG_ENDIAN); /* Checksum */ - cksum = tvb_get_ntohs(tvb, offset + 2); - - computed_cksum = ip_checksum_tvb(tvb, offset, reported_length); - - if (computed_cksum == 0) { - proto_tree_add_uint_format_value(ext_tree, hf_icmp_ext_checksum, - tvb, offset + 2, 2, cksum, - "0x%04x [correct]", - cksum); - hidden_item = - proto_tree_add_boolean(ext_tree, - hf_icmp_ext_checksum_bad, tvb, - offset + 2, 2, FALSE); - } else { - proto_tree_add_uint_format_value(ext_tree, hf_icmp_ext_checksum, - tvb, offset + 2, 2, cksum, - "0x%04x [incorrect, should be 0x%04x]", - cksum, in_cksum_shouldbe(cksum, - computed_cksum)); - hidden_item = - proto_tree_add_boolean(ext_tree, - hf_icmp_ext_checksum_bad, tvb, - offset + 2, 2, TRUE); - } - PROTO_ITEM_SET_HIDDEN(hidden_item); + proto_tree_add_checksum(ext_tree, tvb, offset + 2, hf_icmp_ext_checksum, hf_icmp_ext_checksum_status, NULL, NULL, ip_checksum_tvb(tvb, 0, reported_length), + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY|PROTO_CHECKSUM_IN_CKSUM); if (version != 1 && version != 2) { /* Unsupported version */ @@ -1194,14 +1170,12 @@ dissect_icmp(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data) guint8 icmp_code; guint8 icmp_original_dgram_length; guint captured_length, reported_length; - guint16 cksum, computed_cksum; const gchar *type_str, *code_str; guint32 num_addrs = 0; guint32 addr_entry_size = 0; guint32 i; gboolean save_in_error_pkt; tvbuff_t *next_tvb; - proto_item *item; guint32 conv_key[2]; icmp_transaction_t *trans = NULL; nstime_t ts, time_relative; @@ -1213,7 +1187,6 @@ dissect_icmp(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data) /* To do: check for runts, errs, etc. */ icmp_type = tvb_get_guint8(tvb, 0); icmp_code = tvb_get_guint8(tvb, 1); - cksum = tvb_get_ntohs(tvb, 2); /*length of original datagram carried in the ICMP payload. In terms of 32 bit * words.*/ icmp_original_dgram_length = tvb_get_guint8(tvb, 5); @@ -1291,27 +1264,16 @@ dissect_icmp(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void* data) proto_item_append_text(ti, " (%s)", code_str); } - checksum_item = proto_tree_add_item(icmp_tree, hf_icmp_checksum, tvb, 2, 2, ENC_BIG_ENDIAN); - if (!pinfo->fragmented && captured_length >= reported_length && !pinfo->flags.in_error_pkt) { /* The packet isn't part of a fragmented datagram, isn't truncated, and isn't the payload of an error packet, so we can checksum it. */ - - computed_cksum = ip_checksum_tvb(tvb, 0, reported_length); - if (computed_cksum == 0) { - item = proto_tree_add_boolean(icmp_tree, hf_icmp_checksum_bad, tvb, 2, 2, FALSE); - PROTO_ITEM_SET_HIDDEN(item); - proto_item_append_text(checksum_item, " [correct]"); - } else { - item = proto_tree_add_boolean(icmp_tree, hf_icmp_checksum_bad, tvb, 2, 2, TRUE); - PROTO_ITEM_SET_HIDDEN(item); - proto_item_append_text(checksum_item, " [incorrect, should be 0x%04x]", in_cksum_shouldbe(cksum, computed_cksum)); - expert_add_info_format(pinfo, checksum_item, &ei_icmp_checksum, - "ICMPv4 Checksum Incorrect, should be 0x%04x", in_cksum_shouldbe(cksum, computed_cksum)); - } + proto_tree_add_checksum(icmp_tree, tvb, 2, hf_icmp_checksum, hf_icmp_checksum_status, &ei_icmp_checksum, pinfo, ip_checksum_tvb(tvb, 0, reported_length), + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY|PROTO_CHECKSUM_IN_CKSUM); } else { + checksum_item = proto_tree_add_checksum(icmp_tree, tvb, 2, hf_icmp_checksum, hf_icmp_checksum_status, &ei_icmp_checksum, pinfo, 0, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); proto_item_append_text(checksum_item, " [%s]", pinfo->flags.in_error_pkt ? "in ICMP error packet" : "fragmented datagram"); } @@ -1631,9 +1593,9 @@ void proto_register_icmp(void) 0x0, NULL, HFILL}}, - {&hf_icmp_checksum_bad, - {"Bad Checksum", "icmp.checksum_bad", FT_BOOLEAN, - BASE_NONE, NULL, 0x0, + {&hf_icmp_checksum_status, + {"Checksum Status", "icmp.checksum.status", FT_UINT8, BASE_NONE, + VALS(proto_checksum_vals), 0x0, NULL, HFILL}}, {&hf_icmp_unused, @@ -1844,9 +1806,9 @@ void proto_register_icmp(void) NULL, 0x0, NULL, HFILL}}, - {&hf_icmp_ext_checksum_bad, - {"Bad Checksum", "icmp.ext.checksum_bad", FT_BOOLEAN, - BASE_NONE, NULL, + {&hf_icmp_ext_checksum_status, + {"Checksum Status", "icmp.ext.checksum.status", FT_UINT8, BASE_NONE, + VALS(proto_checksum_vals), 0x0, NULL, HFILL}}, diff --git a/epan/dissectors/packet-icmpv6.c b/epan/dissectors/packet-icmpv6.c index 642b7edf39..3d830c7248 100644 --- a/epan/dissectors/packet-icmpv6.c +++ b/epan/dissectors/packet-icmpv6.c @@ -97,7 +97,7 @@ static int proto_icmpv6 = -1; static int hf_icmpv6_type = -1; static int hf_icmpv6_code = -1; static int hf_icmpv6_checksum = -1; -static int hf_icmpv6_checksum_bad = -1; +static int hf_icmpv6_checksum_status = -1; static int hf_icmpv6_reserved = -1; static int hf_icmpv6_data = -1; static int hf_icmpv6_unknown_data = -1; @@ -3470,12 +3470,12 @@ static int dissect_icmpv6(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) { proto_tree *icmp6_tree = NULL, *flag_tree = NULL; - proto_item *ti = NULL, *hidden_item, *checksum_item = NULL, *code_item = NULL, *ti_flag = NULL; + proto_item *ti = NULL, *checksum_item = NULL, *code_item = NULL, *ti_flag = NULL; const char *code_name = NULL; guint length = 0, reported_length; vec_t cksum_vec[4]; guint32 phdr[2]; - guint16 cksum, computed_cksum; + guint16 cksum; int offset; tvbuff_t *next_tvb; guint8 icmp6_type, icmp6_code; @@ -3540,46 +3540,32 @@ dissect_icmpv6(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) col_set_str(pinfo->cinfo, COL_INFO, "Direct IPv6 Connectivity Test"); } - if (tree) { - if (code_name) - proto_item_append_text(code_item, " (%s)", code_name); - checksum_item = proto_tree_add_item(icmp6_tree, hf_icmpv6_checksum, tvb, offset, 2, ENC_BIG_ENDIAN); - } + if (code_name) + proto_item_append_text(code_item, " (%s)", code_name); cksum = tvb_get_ntohs(tvb, offset); + length = tvb_captured_length(tvb); + reported_length = tvb_reported_length(tvb); + if (!pinfo->fragmented && length >= reported_length && !pinfo->flags.in_error_pkt) { + /* The packet isn't part of a fragmented datagram, isn't truncated, + * and we aren't in an ICMP error packet, so we can checksum it. + */ - if (1) { /* There's an expert info in here so always execute */ - length = tvb_captured_length(tvb); - reported_length = tvb_reported_length(tvb); - if (!pinfo->fragmented && length >= reported_length && !pinfo->flags.in_error_pkt) { - /* The packet isn't part of a fragmented datagram, isn't truncated, - * and we aren't in an ICMP error packet, so we can checksum it. - */ + /* Set up the fields of the pseudo-header. */ + SET_CKSUM_VEC_PTR(cksum_vec[0], (const guint8 *)pinfo->src.data, pinfo->src.len); + SET_CKSUM_VEC_PTR(cksum_vec[1], (const guint8 *)pinfo->dst.data, pinfo->dst.len); + phdr[0] = g_htonl(reported_length); + phdr[1] = g_htonl(IP_PROTO_ICMPV6); + SET_CKSUM_VEC_PTR(cksum_vec[2], (const guint8 *)&phdr, 8); + SET_CKSUM_VEC_TVB(cksum_vec[3], tvb, 0, reported_length); - /* Set up the fields of the pseudo-header. */ - SET_CKSUM_VEC_PTR(cksum_vec[0], (const guint8 *)pinfo->src.data, pinfo->src.len); - SET_CKSUM_VEC_PTR(cksum_vec[1], (const guint8 *)pinfo->dst.data, pinfo->dst.len); - phdr[0] = g_htonl(reported_length); - phdr[1] = g_htonl(IP_PROTO_ICMPV6); - SET_CKSUM_VEC_PTR(cksum_vec[2], (const guint8 *)&phdr, 8); - SET_CKSUM_VEC_TVB(cksum_vec[3], tvb, 0, reported_length); - computed_cksum = in_cksum(cksum_vec, 4); - - if (computed_cksum == 0) { - hidden_item = proto_tree_add_boolean(icmp6_tree, hf_icmpv6_checksum_bad, tvb, offset, 2, FALSE); - PROTO_ITEM_SET_HIDDEN(hidden_item); - proto_item_append_text(checksum_item, " [correct]"); - } else { - hidden_item = proto_tree_add_boolean(icmp6_tree, hf_icmpv6_checksum_bad, tvb, offset, 2, TRUE); - PROTO_ITEM_SET_HIDDEN(hidden_item); - proto_item_append_text(checksum_item, " [incorrect, should be 0x%04x]", in_cksum_shouldbe(cksum, computed_cksum)); - expert_add_info_format(pinfo, checksum_item, &ei_icmpv6_checksum, - "ICMPv6 Checksum Incorrect, should be 0x%04x", in_cksum_shouldbe(cksum, computed_cksum)); - } - } else { - proto_item_append_text(checksum_item, " [%s]", - pinfo->flags.in_error_pkt ? "in ICMP error packet" : "fragmented datagram"); - } + proto_tree_add_checksum(icmp6_tree, tvb, 2, hf_icmpv6_checksum, hf_icmpv6_checksum_status, &ei_icmpv6_checksum, pinfo, in_cksum(cksum_vec, 4), + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY|PROTO_CHECKSUM_IN_CKSUM); + } else { + checksum_item = proto_tree_add_checksum(icmp6_tree, tvb, 2, hf_icmpv6_checksum, hf_icmpv6_checksum_status, &ei_icmpv6_checksum, pinfo, 0, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); + proto_item_append_text(checksum_item, " [%s]", + pinfo->flags.in_error_pkt ? "in ICMP error packet" : "fragmented datagram"); } offset += 2; @@ -3612,8 +3598,7 @@ dissect_icmpv6(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data) * Shouldn't the nonce be at least 8 then? Why not just use (-1), * as it could really be any length, couldn't it? */ - if (tree) - proto_tree_add_item(icmp6_tree, hf_icmpv6_nonce, tvb, offset, 4, ENC_NA); + proto_tree_add_item(icmp6_tree, hf_icmpv6_nonce, tvb, offset, 4, ENC_NA); offset += 4; } else { if (!pinfo->flags.in_error_pkt) { @@ -4158,8 +4143,8 @@ proto_register_icmpv6(void) { &hf_icmpv6_checksum, { "Checksum", "icmpv6.checksum", FT_UINT16, BASE_HEX, NULL, 0x0, "Used to detect data corruption in the ICMPv6 message and parts of the IPv6 header", HFILL }}, - { &hf_icmpv6_checksum_bad, - { "Bad Checksum", "icmpv6.checksum_bad", FT_BOOLEAN, BASE_NONE, NULL, 0x0, + { &hf_icmpv6_checksum_status, + { "Checksum Status", "icmpv6.checksum.status", FT_UINT8, BASE_NONE, VALS(proto_checksum_vals), 0x0, NULL, HFILL }}, { &hf_icmpv6_reserved, { "Reserved", "icmpv6.reserved", FT_BYTES, BASE_NONE, NULL, 0x0, diff --git a/epan/dissectors/packet-idp.c b/epan/dissectors/packet-idp.c index 18ecf46679..a83e813f23 100644 --- a/epan/dissectors/packet-idp.c +++ b/epan/dissectors/packet-idp.c @@ -88,7 +88,7 @@ dissect_idp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) ti = proto_tree_add_item(tree, proto_idp, tvb, 0, IDP_HEADER_LEN, ENC_NA); idp_tree = proto_item_add_subtree(ti, ett_idp); - proto_tree_add_item(idp_tree, hf_idp_checksum, tvb, 0, 2, ENC_BIG_ENDIAN); + proto_tree_add_checksum(idp_tree, tvb, 0, hf_idp_checksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); length = tvb_get_ntohs(tvb, 2); proto_tree_add_uint_format_value(idp_tree, hf_idp_len, tvb, 2, 2, length, "%u bytes", length); diff --git a/epan/dissectors/packet-ieee80211.c b/epan/dissectors/packet-ieee80211.c index 6c534e43ba..7e557654db 100644 --- a/epan/dissectors/packet-ieee80211.c +++ b/epan/dissectors/packet-ieee80211.c @@ -2978,8 +2978,7 @@ static int hf_ieee80211_seq_number = -1; /* Header values for Frame Check field */ /* ************************************************************************* */ static int hf_ieee80211_fcs = -1; -static int hf_ieee80211_fcs_good = -1; -static int hf_ieee80211_fcs_bad = -1; +static int hf_ieee80211_fcs_status = -1; /* ************************************************************************* */ /* Header values for reassembly */ @@ -16429,14 +16428,12 @@ dissect_ieee80211_common(tvbuff_t *tvb, packet_info *pinfo, guint32 seq_number, frag_number; gboolean more_frags; proto_item *ti = NULL; - proto_item *fcs_item = NULL; proto_item *cw_item = NULL; proto_item *hidden_item; - proto_tree *fcs_tree = NULL; proto_tree *cw_tree = NULL; guint16 hdr_len, ohdr_len; guint16 htc_len = 0; - gboolean has_fcs, fcs_good, fcs_bad; + gboolean has_fcs; gint len, reported_len, ivlen; gint sta_addr_offset = 0; const gchar *station_name; @@ -17527,7 +17524,7 @@ dissect_ieee80211_common(tvbuff_t *tvb, packet_info *pinfo, */ len -= 4; reported_len -= 4; - if (tree) + if (wlan_check_checksum) { guint32 sent_fcs = tvb_get_ntohl(tvb, hdr_len + len); guint32 fcs; @@ -17536,40 +17533,13 @@ dissect_ieee80211_common(tvbuff_t *tvb, packet_info *pinfo, fcs = crc32_802_tvb_padded(tvb, ohdr_len, hdr_len, len); else fcs = crc32_802_tvb(tvb, hdr_len + len); - if (fcs == sent_fcs) { - fcs_good = TRUE; - fcs_bad = FALSE; - } else { - fcs_good = FALSE; - fcs_bad = TRUE; - } - - fcs_item = proto_tree_add_item(hdr_tree, hf_ieee80211_fcs, tvb, - hdr_len + len, 4, ENC_LITTLE_ENDIAN); - if (fcs_good) { - proto_item_append_text(fcs_item, " [correct]"); - } else { - proto_item_append_text(fcs_item, " [incorrect, should be 0x%08x]", fcs); + if (fcs != sent_fcs) { flag_str[8] = '.'; } - proto_tree_set_appendix(hdr_tree, tvb, hdr_len + len, 4); - - if(wlan_check_checksum) { - fcs_tree = proto_item_add_subtree(fcs_item, ett_fcs); - - fcs_item = proto_tree_add_boolean(fcs_tree, - hf_ieee80211_fcs_good, tvb, - hdr_len + len, 4, - fcs_good); - PROTO_ITEM_SET_GENERATED(fcs_item); - - fcs_item = proto_tree_add_boolean(fcs_tree, - hf_ieee80211_fcs_bad, tvb, - hdr_len + len, 4, - fcs_bad); - PROTO_ITEM_SET_GENERATED(fcs_item); - } + proto_tree_add_checksum(hdr_tree, tvb, hdr_len + len, hf_ieee80211_fcs, hf_ieee80211_fcs_status, NULL, pinfo, fcs, ENC_LITTLE_ENDIAN, PROTO_CHECKSUM_VERIFY); + } else { + proto_tree_add_checksum(hdr_tree, tvb, hdr_len + len, hf_ieee80211_fcs, hf_ieee80211_fcs_status, NULL, pinfo, 0, ENC_LITTLE_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); } } } @@ -19154,15 +19124,10 @@ proto_register_ieee80211(void) FT_UINT32, BASE_HEX, NULL, 0, "Frame Check Sequence (FCS)", HFILL }}, - {&hf_ieee80211_fcs_good, - {"Good", "wlan.fcs_good", - FT_BOOLEAN, BASE_NONE, NULL, 0x0, - "True if the FCS is correct", HFILL }}, - - {&hf_ieee80211_fcs_bad, - {"Bad", "wlan.fcs_bad", - FT_BOOLEAN, BASE_NONE, NULL, 0x0, - "True if the FCS is incorrect", HFILL }}, + {&hf_ieee80211_fcs_status, + {"FCS Status", "wlan.fcs.status", + FT_UINT8, BASE_NONE, VALS(proto_checksum_vals), 0x0, + NULL, HFILL }}, {&hf_ieee80211_fragment_overlap, {"Fragment overlap", "wlan.fragment.overlap", diff --git a/epan/dissectors/packet-igap.c b/epan/dissectors/packet-igap.c index a85a1c60c5..6df6ff498f 100644 --- a/epan/dissectors/packet-igap.c +++ b/epan/dissectors/packet-igap.c @@ -52,7 +52,7 @@ static int proto_igap = -1; static int hf_type = -1; static int hf_max_resp = -1; static int hf_checksum = -1; -static int hf_checksum_bad = -1; +static int hf_checksum_status = -1; static int hf_maddr = -1; static int hf_version = -1; static int hf_subtype = -1; @@ -157,7 +157,7 @@ dissect_igap(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, void* d "%.1f sec (0x%02x)", tsecs * 0.1, tsecs); offset += 1; - igmp_checksum(tree, tvb, hf_checksum, hf_checksum_bad, pinfo, 0); + igmp_checksum(tree, tvb, hf_checksum, hf_checksum_status, pinfo, 0); offset += 2; proto_tree_add_item(tree, hf_maddr, tvb, offset, 4, ENC_BIG_ENDIAN); @@ -256,9 +256,9 @@ proto_register_igap(void) FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL } }, - { &hf_checksum_bad, - { "Bad Checksum", "igap.checksum_bad", - FT_BOOLEAN, BASE_NONE, NULL, 0x0, + { &hf_checksum_status, + { "Checksum Status", "igap.checksum.status", + FT_UINT8, BASE_NONE, VALS(proto_checksum_vals), 0x0, NULL, HFILL } }, { &hf_maddr, diff --git a/epan/dissectors/packet-igmp.c b/epan/dissectors/packet-igmp.c index 6e9d20da75..f976130c24 100644 --- a/epan/dissectors/packet-igmp.c +++ b/epan/dissectors/packet-igmp.c @@ -127,7 +127,7 @@ static int hf_group_type = -1; static int hf_reply_code = -1; static int hf_reply_pending = -1; static int hf_checksum = -1; -static int hf_checksum_bad = -1; +static int hf_checksum_status = -1; static int hf_identifier = -1; static int hf_access_key = -1; static int hf_max_resp = -1; @@ -282,11 +282,9 @@ static const value_string mtrace_fwd_code_vals[] = { }; void igmp_checksum(proto_tree *tree, tvbuff_t *tvb, int hf_index, - int hf_index_bad, packet_info *pinfo, guint len) + int hf_index_status, packet_info *pinfo, guint len) { - guint16 cksum, hdrcksum; vec_t cksum_vec[1]; - proto_item *hidden_item; if (len == 0) { /* @@ -295,29 +293,16 @@ void igmp_checksum(proto_tree *tree, tvbuff_t *tvb, int hf_index, len = tvb_reported_length(tvb); } - hdrcksum = tvb_get_ntohs(tvb, 2); if (!pinfo->fragmented && tvb_captured_length(tvb) >= len) { /* * The packet isn't part of a fragmented datagram and isn't * truncated, so we can checksum it. */ SET_CKSUM_VEC_TVB(cksum_vec[0], tvb, 0, len); - - cksum = in_cksum(&cksum_vec[0],1); - - if (cksum == 0) { - proto_tree_add_uint_format(tree, hf_index, tvb, 2, 2, hdrcksum, - "Header checksum: 0x%04x [correct]", hdrcksum); - } else { - hidden_item = proto_tree_add_boolean(tree, hf_index_bad, - tvb, 2, 2, TRUE); - PROTO_ITEM_SET_HIDDEN(hidden_item); - proto_tree_add_uint_format(tree, hf_index, tvb, 2, 2, hdrcksum, - "Header checksum: 0x%04x [incorrect, should be 0x%04x]", - hdrcksum, in_cksum_shouldbe(hdrcksum,cksum)); - } + proto_tree_add_checksum(tree, tvb, 2, hf_index, hf_index_status, NULL, pinfo, in_cksum(&cksum_vec[0], 1), + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY|PROTO_CHECKSUM_IN_CKSUM); } else - proto_tree_add_uint(tree, hf_index, tvb, 2, 2, hdrcksum); + proto_tree_add_checksum(tree, tvb, 2, hf_index, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); return; } @@ -563,7 +548,7 @@ dissect_igmp_v3_report(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tre offset += 1; /* checksum */ - igmp_checksum(tree, tvb, hf_checksum, hf_checksum_bad, pinfo, 0); + igmp_checksum(tree, tvb, hf_checksum, hf_checksum_status, pinfo, 0); offset += 2; proto_tree_add_item(tree, hf_reserved, tvb, offset, 2, ENC_NA); @@ -598,7 +583,7 @@ dissect_igmp_v3_query(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree offset = dissect_v3_max_resp(tvb, tree, offset); /* checksum */ - igmp_checksum(tree, tvb, hf_checksum, hf_checksum_bad, pinfo, 0); + igmp_checksum(tree, tvb, hf_checksum, hf_checksum_status, pinfo, 0); offset += 2; /* group address */ @@ -653,7 +638,7 @@ dissect_igmp_v2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, void offset += 1; /* checksum */ - igmp_checksum(tree, tvb, hf_checksum, hf_checksum_bad, pinfo, 8); + igmp_checksum(tree, tvb, hf_checksum, hf_checksum_status, pinfo, 8); offset += 2; /* group address */ @@ -695,7 +680,7 @@ dissect_igmp_v1(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, void offset += 1; /* checksum */ - igmp_checksum(tree, tvb, hf_checksum, hf_checksum_bad, pinfo, 8); + igmp_checksum(tree, tvb, hf_checksum, hf_checksum_status, pinfo, 8); offset += 2; /* group address */ @@ -730,7 +715,7 @@ dissect_igmp_v0(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, void offset += 1; /* checksum */ - igmp_checksum(tree, tvb, hf_checksum, hf_checksum_bad, pinfo, 20); + igmp_checksum(tree, tvb, hf_checksum, hf_checksum_status, pinfo, 20); offset += 2; /* identifier */ @@ -813,7 +798,7 @@ dissect_igmp_mtrace(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, offset += 1; /* checksum */ - igmp_checksum(tree, tvb, hf_checksum, hf_checksum_bad, pinfo, 0); + igmp_checksum(tree, tvb, hf_checksum, hf_checksum_status, pinfo, 0); offset += 2; /* group address to be traced */ @@ -952,9 +937,9 @@ proto_register_igmp(void) { "Checksum", "igmp.checksum", FT_UINT16, BASE_HEX, NULL, 0, "IGMP Checksum", HFILL }}, - { &hf_checksum_bad, - { "Bad Checksum", "igmp.checksum_bad", FT_BOOLEAN, BASE_NONE, - NULL, 0x0, "Bad IGMP Checksum", HFILL }}, + { &hf_checksum_status, + { "Checksum Status", "igmp.checksum.status", FT_UINT8, BASE_NONE, + VALS(proto_checksum_vals), 0x0, NULL, HFILL }}, { &hf_identifier, { "Identifier", "igmp.identifier", FT_UINT32, BASE_DEC, diff --git a/epan/dissectors/packet-igmp.h b/epan/dissectors/packet-igmp.h index b0abb74299..8709dd8013 100644 --- a/epan/dissectors/packet-igmp.h +++ b/epan/dissectors/packet-igmp.h @@ -55,7 +55,7 @@ #define IGMP_RGMP_HELLO 0xFF void igmp_checksum(proto_tree *tree, tvbuff_t *tvb, int hf_index, - int hf_index_bad, packet_info *pinfo, guint len); + int hf_index_status, packet_info *pinfo, guint len); #endif diff --git a/epan/dissectors/packet-igrp.c b/epan/dissectors/packet-igrp.c index 0b290ec329..0c2ab10f11 100644 --- a/epan/dissectors/packet-igrp.c +++ b/epan/dissectors/packet-igrp.c @@ -147,7 +147,7 @@ static int dissect_igrp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, voi offset+=IGRP_ENTRY_LENGTH; } - proto_tree_add_item(igrp_tree, hf_igrp_checksum, tvb, 10, 2, ENC_BIG_ENDIAN); + proto_tree_add_checksum(igrp_tree, tvb, 10, hf_igrp_checksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); } return tvb_captured_length(tvb); } diff --git a/epan/dissectors/packet-ip.c b/epan/dissectors/packet-ip.c index aac46b2cd1..c72b0dbee6 100644 --- a/epan/dissectors/packet-ip.c +++ b/epan/dissectors/packet-ip.c @@ -124,8 +124,7 @@ static int hf_ip_ttl = -1; static int hf_ip_proto = -1; static int hf_ip_checksum = -1; static int hf_ip_checksum_calculated = -1; -static int hf_ip_checksum_good = -1; -static int hf_ip_checksum_bad = -1; +static int hf_ip_checksum_status = -1; /* IP option fields */ static int hf_ip_opt_type = -1; @@ -243,7 +242,6 @@ static gint ett_ip_option_qs = -1; static gint ett_ip_option_other = -1; static gint ett_ip_fragments = -1; static gint ett_ip_fragment = -1; -static gint ett_ip_checksum = -1; static gint ett_ip_opt_type = -1; static gint ett_ip_opt_sec_prot_auth_flags = -1; static gint ett_unknown_ip_tcp_opt = -1; @@ -1999,7 +1997,6 @@ dissect_ip_v4(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, void* guint hlen, optlen; guint16 flags; guint16 ipsum; - guint16 expected_cksum; fragment_head *ipfd_head = NULL; tvbuff_t *next_tvb; gboolean update_col_info = TRUE; @@ -2008,7 +2005,6 @@ dissect_ip_v4(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, void* guint32 src32, dst32; proto_tree *tree; proto_item *item = NULL, *ttl_item; - proto_tree *checksum_tree; guint16 ttl; int bit_offset; tree = parent_tree; @@ -2207,55 +2203,25 @@ dissect_ip_v4(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, void* */ if (ip_check_checksum && tvb_bytes_exist(tvb, offset, hlen)&&(!pinfo->flags.in_error_pkt)) { ipsum = ip_checksum_tvb(tvb, offset, hlen); - if (tree) { - if (ipsum == 0) { - item = proto_tree_add_uint_format_value(ip_tree, hf_ip_checksum, tvb, - offset + 10, 2, iph->ip_sum, - "0x%04x [correct]", - iph->ip_sum); - checksum_tree = proto_item_add_subtree(item, ett_ip_checksum); - item = proto_tree_add_uint(checksum_tree, hf_ip_checksum_calculated, tvb, - offset + 10, 2, iph->ip_sum); - PROTO_ITEM_SET_GENERATED(item); - item = proto_tree_add_boolean(checksum_tree, hf_ip_checksum_good, tvb, - offset + 10, 2, TRUE); - PROTO_ITEM_SET_GENERATED(item); - item = proto_tree_add_boolean(checksum_tree, hf_ip_checksum_bad, tvb, - offset + 10, 2, FALSE); - PROTO_ITEM_SET_GENERATED(item); - } else { - expected_cksum = in_cksum_shouldbe(iph->ip_sum, ipsum); + item = proto_tree_add_checksum(ip_tree, tvb, offset + 10, hf_ip_checksum, hf_ip_checksum_status, &ei_ip_checksum_bad, pinfo, ipsum, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY|PROTO_CHECKSUM_IN_CKSUM); + if (ipsum == 0) { + /* XXX - Keeping hf_ip_checksum_calculated field for now. Doesn't fit into the + proto_tree_add_checksum design, but IP is a popular enough dissector that somebody + may have a legitimate reason for wanting it filtered */ + item = proto_tree_add_uint(ip_tree, hf_ip_checksum_calculated, tvb, + offset + 10, 2, iph->ip_sum); + PROTO_ITEM_SET_GENERATED(item); + } else { + proto_item_append_text(item, "(may be caused by \"IP checksum offload\"?)"); - item = proto_tree_add_uint_format_value(ip_tree, hf_ip_checksum, tvb, - offset + 10, 2, iph->ip_sum, - "0x%04x " - "[incorrect, should be 0x%04x " - "(may be caused by \"IP checksum " - "offload\"?)]", iph->ip_sum, - expected_cksum); - checksum_tree = proto_item_add_subtree(item, ett_ip_checksum); - item = proto_tree_add_uint(checksum_tree, hf_ip_checksum_calculated, tvb, - offset + 10, 2, expected_cksum); - PROTO_ITEM_SET_GENERATED(item); - item = proto_tree_add_boolean(checksum_tree, hf_ip_checksum_good, tvb, - offset + 10, 2, FALSE); - PROTO_ITEM_SET_GENERATED(item); - item = proto_tree_add_boolean(checksum_tree, hf_ip_checksum_bad, tvb, - offset + 10, 2, TRUE); - PROTO_ITEM_SET_GENERATED(item); - } - } - if (ipsum != 0) { - /* Add expert item always (so tap gets called if present); - if (tree == NULL) then item will be NULL - else item should be from the - add_boolean(..., hf_ip_checksum_bad, ...) above */ - expert_add_info(pinfo, item, &ei_ip_checksum_bad); + item = proto_tree_add_uint(ip_tree, hf_ip_checksum_calculated, tvb, + offset + 10, 2, in_cksum_shouldbe(iph->ip_sum, ipsum)); + PROTO_ITEM_SET_GENERATED(item); } } else { ipsum = 0; - if (tree) { - item = proto_tree_add_uint_format_value(ip_tree, hf_ip_checksum, tvb, + proto_tree_add_uint_format_value(ip_tree, hf_ip_checksum, tvb, offset + 10, 2, iph->ip_sum, "0x%04x [%s]", iph->ip_sum, @@ -2264,14 +2230,9 @@ dissect_ip_v4(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, void* "in ICMP error packet" : "not all data available") : "validation disabled"); - checksum_tree = proto_item_add_subtree(item, ett_ip_checksum); - item = proto_tree_add_boolean(checksum_tree, hf_ip_checksum_good, tvb, - offset + 10, 2, FALSE); - PROTO_ITEM_SET_GENERATED(item); - item = proto_tree_add_boolean(checksum_tree, hf_ip_checksum_bad, tvb, - offset + 10, 2, FALSE); - PROTO_ITEM_SET_GENERATED(item); - } + item = proto_tree_add_uint(ip_tree, hf_ip_checksum_status, tvb, + offset + 10, 0, PROTO_CHECKSUM_E_UNVERIFIED); + PROTO_ITEM_SET_GENERATED(item); } src32 = tvb_get_ntohl(tvb, offset + IPH_SRC); set_address_tvb(&pinfo->net_src, AT_IPv4, 4, tvb, offset + IPH_SRC); @@ -2801,13 +2762,9 @@ proto_register_ip(void) { "Calculated Checksum", "ip.checksum_calculated", FT_UINT16, BASE_HEX, NULL, 0x0, "The expected IP checksum field as calculated from the IP datagram", HFILL }}, - { &hf_ip_checksum_good, - { "Good", "ip.checksum_good", FT_BOOLEAN, BASE_NONE, NULL, 0x0, - "True: checksum matches packet content; False: doesn't match content or not checked", HFILL }}, - - { &hf_ip_checksum_bad, - { "Bad", "ip.checksum_bad", FT_BOOLEAN, BASE_NONE, NULL, 0x0, - "True: checksum doesn't match packet content; False: matches content or not checked", HFILL }}, + { &hf_ip_checksum_status, + { "Header checksum status", "ip.checksum.status", FT_UINT8, BASE_NONE, VALS(proto_checksum_vals), 0x0, + NULL, HFILL }}, /* IP options related fields */ { &hf_ip_opt_type, @@ -3080,7 +3037,6 @@ proto_register_ip(void) &ett_ip_option_other, &ett_ip_fragments, &ett_ip_fragment, - &ett_ip_checksum, &ett_ip_opt_type, &ett_ip_opt_sec_prot_auth_flags, &ett_unknown_ip_tcp_opt, diff --git a/epan/dissectors/packet-ipv6.c b/epan/dissectors/packet-ipv6.c index 3bc221b30f..e096b661a7 100644 --- a/epan/dissectors/packet-ipv6.c +++ b/epan/dissectors/packet-ipv6.c @@ -1426,8 +1426,8 @@ dissect_opt_calipso(tvbuff_t *tvb, gint offset, packet_info *pinfo, proto_tree * offset, 1, ENC_BIG_ENDIAN); offset += 1; - proto_tree_add_item(opt_tree, hf_ipv6_opt_calipso_checksum, tvb, - offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_checksum(opt_tree, tvb, offset, hf_ipv6_opt_calipso_checksum, -1, + NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); offset += 2; proto_tree_add_item(opt_tree, hf_ipv6_opt_calipso_cmpt_bitmap, tvb, diff --git a/epan/dissectors/packet-ipx.c b/epan/dissectors/packet-ipx.c index 4ebb8597a0..309617fcba 100644 --- a/epan/dissectors/packet-ipx.c +++ b/epan/dissectors/packet-ipx.c @@ -345,7 +345,7 @@ dissect_ipx(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) hidden_item = proto_tree_add_string(ipx_tree, hf_ipx_addr, tvb, 0, 0, str); PROTO_ITEM_SET_HIDDEN(hidden_item); - proto_tree_add_item(ipx_tree, hf_ipx_checksum, tvb, 0, 2, ENC_BIG_ENDIAN); + proto_tree_add_checksum(ipx_tree, tvb, 0, hf_ipx_checksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); proto_tree_add_uint_format_value(ipx_tree, hf_ipx_len, tvb, 2, 2, ipxh->ipx_length, "%d bytes", ipxh->ipx_length); ipx_hops = tvb_get_guint8(tvb, 4); diff --git a/epan/dissectors/packet-isis-hello.c b/epan/dissectors/packet-isis-hello.c index 2a8fef35a3..5371667c4d 100644 --- a/epan/dissectors/packet-isis-hello.c +++ b/epan/dissectors/packet-isis-hello.c @@ -765,29 +765,18 @@ dissect_hello_checksum_clv(tvbuff_t *tvb, packet_info* pinfo, * which is offseted 17 bytes in IIHs (relative to the beginning of the IS-IS packet) */ pdu_length = tvb_get_ntohs(tvb, 17); - /* unlike the LSP checksum verification which starts at an offset of 12 we start at offset 0*/ - switch (check_and_get_checksum(tvb, 0, pdu_length, checksum, offset, &cacl_checksum)) - { - case NO_CKSUM : - proto_tree_add_uint_format_value( tree, hf_isis_hello_checksum, tvb, offset, length, checksum, - "0x%04x [unused]", checksum); - break; - case DATA_MISSING : + if (checksum == 0) { + /* No checksum present */ + proto_tree_add_checksum(tree, tvb, offset, hf_isis_hello_checksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NOT_PRESENT); + } else { + if (osi_check_and_get_checksum(tvb, 0, pdu_length, offset, &cacl_checksum)) { + /* Successfully processed checksum, verify it */ + proto_tree_add_checksum(tree, tvb, offset, hf_isis_hello_checksum, -1, NULL, pinfo, cacl_checksum, ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); + } else { + proto_tree_add_checksum(tree, tvb, offset, hf_isis_hello_checksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); proto_tree_add_expert_format(tree, pinfo, &ei_isis_hello_long_packet, tvb, offset, -1, "Packet length %d went beyond packet", tvb_captured_length(tvb) ); - break; - case CKSUM_NOT_OK : - proto_tree_add_uint_format_value( tree, hf_isis_hello_checksum, tvb, offset, length, checksum, - "0x%04x [incorrect, should be 0x%04x]", - checksum, - cacl_checksum); - break; - case CKSUM_OK : - proto_tree_add_uint_format_value( tree, hf_isis_hello_checksum, tvb, offset, length, checksum, - "0x%04x [correct]", checksum); - break; - default : - g_message("'check_and_get_checksum' returned an invalid value"); + } } } diff --git a/epan/dissectors/packet-isis-lsp.c b/epan/dissectors/packet-isis-lsp.c index 827c6c8b16..3c5e82db14 100644 --- a/epan/dissectors/packet-isis-lsp.c +++ b/epan/dissectors/packet-isis-lsp.c @@ -156,8 +156,7 @@ static int hf_isis_lsp_srlg_ipv4_local = -1; static int hf_isis_lsp_srlg_ipv4_remote = -1; static int hf_isis_lsp_srlg_value = -1; static int hf_isis_lsp_checksum = -1; -static int hf_isis_lsp_checksum_bad = -1; -static int hf_isis_lsp_checksum_good = -1; +static int hf_isis_lsp_checksum_status = -1; static int hf_isis_lsp_clv_ipv4_int_addr = -1; static int hf_isis_lsp_clv_ipv6_int_addr = -1; static int hf_isis_lsp_clv_te_router_id = -1; @@ -3105,25 +3104,6 @@ dissect_lsp_prefix_neighbors_clv(tvbuff_t *tvb, packet_info* pinfo, proto_tree * } } -static void isis_lsp_checkum_additional_info(tvbuff_t * tvb, packet_info * pinfo, - proto_item * it_cksum, int offset, gboolean is_cksum_correct) -{ - proto_tree * checksum_tree; - proto_item * item; - - checksum_tree = proto_item_add_subtree(it_cksum, ett_isis_lsp_cksum); - item = proto_tree_add_boolean(checksum_tree, hf_isis_lsp_checksum_good, tvb, - offset, 2, is_cksum_correct); - PROTO_ITEM_SET_GENERATED(item); - item = proto_tree_add_boolean(checksum_tree, hf_isis_lsp_checksum_bad, tvb, - offset, 2, !is_cksum_correct); - PROTO_ITEM_SET_GENERATED(item); - if (!is_cksum_correct) { - expert_add_info(pinfo, item, &ie_isis_lsp_checksum_bad); - col_append_str(pinfo->cinfo, COL_INFO, " [ISIS CHECKSUM INCORRECT]"); - } -} - static const isis_clv_handle_t clv_l1_lsp_opts[] = { { ISIS_CLV_AREA_ADDRESS, @@ -3475,7 +3455,6 @@ dissect_isis_lsp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset guint16 pdu_length, lifetime, checksum, cacl_checksum=0; guint8 lsp_info; int len, offset_checksum; - proto_item *it_cksum; char* system_id; col_set_str(pinfo->cinfo, COL_PROTOCOL, "ISIS LSP"); @@ -3511,28 +3490,23 @@ dissect_isis_lsp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, int offset offset += 4; checksum = lifetime ? tvb_get_ntohs(tvb, offset) : 0; - switch (check_and_get_checksum(tvb, offset_checksum, pdu_length-12, checksum, offset, &cacl_checksum)) { - case NO_CKSUM : - checksum = tvb_get_ntohs(tvb, offset); - proto_tree_add_uint_format_value(lsp_tree, hf_isis_lsp_checksum, tvb, offset, 2, checksum, - "0x%04x [unused]", checksum); - break; - case DATA_MISSING : + if (checksum == 0) { + /* No checksum present */ + proto_tree_add_checksum(lsp_tree, tvb, offset_checksum, hf_isis_lsp_checksum, hf_isis_lsp_checksum_status, &ie_isis_lsp_checksum_bad, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NOT_PRESENT); + } else { + if (osi_check_and_get_checksum(tvb, offset_checksum, pdu_length-12, offset, &cacl_checksum)) { + /* Successfully processed checksum, verify it */ + proto_tree_add_checksum(lsp_tree, tvb, offset_checksum, hf_isis_lsp_checksum, hf_isis_lsp_checksum_status, &ie_isis_lsp_checksum_bad, pinfo, cacl_checksum, ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); + if (cacl_checksum != checksum) { + col_append_str(pinfo->cinfo, COL_INFO, " [ISIS CHECKSUM INCORRECT]"); + } + + } else { + proto_tree_add_checksum(lsp_tree, tvb, offset_checksum, hf_isis_lsp_checksum, hf_isis_lsp_checksum_status, &ie_isis_lsp_checksum_bad, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); proto_tree_add_expert_format(tree, pinfo, &ei_isis_lsp_long_packet, tvb, offset, -1, "Packet length %d went beyond packet", tvb_reported_length_remaining(tvb, offset_checksum)); - break; - case CKSUM_NOT_OK : - it_cksum = proto_tree_add_uint_format_value(lsp_tree, hf_isis_lsp_checksum, tvb, offset, 2, checksum, - "0x%04x [incorrect, should be 0x%04x]", - checksum, cacl_checksum); - isis_lsp_checkum_additional_info(tvb, pinfo, it_cksum, offset, FALSE); - break; - case CKSUM_OK : - it_cksum = proto_tree_add_uint_format_value(lsp_tree, hf_isis_lsp_checksum, tvb, offset, 2, checksum, - "0x%04x [correct]", checksum); - isis_lsp_checkum_additional_info(tvb, pinfo, it_cksum, offset, TRUE); - break; + } } offset += 2; @@ -3675,16 +3649,10 @@ proto_register_isis_lsp(void) NULL, HFILL } }, - { &hf_isis_lsp_checksum_good, - { "Good Checksum", "isis.lsp.checksum_good", - FT_BOOLEAN, BASE_NONE, NULL, 0x0, - "Good IS-IS LSP Checksum", HFILL } - }, - - { &hf_isis_lsp_checksum_bad, - { "Bad Checksum", "isis.lsp.checksum_bad", - FT_BOOLEAN, BASE_NONE, NULL, 0x0, - "Bad IS-IS LSP Checksum", HFILL } + { &hf_isis_lsp_checksum_status, + { "Checksum Status", "isis.lsp.checksum.status", + FT_UINT8, BASE_NONE, VALS(proto_checksum_vals), 0x0, + NULL, HFILL } }, { &hf_isis_lsp_clv_ipv4_int_addr, diff --git a/epan/dissectors/packet-isis-snp.c b/epan/dissectors/packet-isis-snp.c index cecd0655c6..9041de3c61 100644 --- a/epan/dissectors/packet-isis-snp.c +++ b/epan/dissectors/packet-isis-snp.c @@ -134,7 +134,6 @@ dissect_snp_checksum_clv(tvbuff_t *tvb, packet_info* pinfo, return; } - ti = proto_tree_add_item( tree, hf_isis_csnp_checksum, tvb, offset, length, ENC_BIG_ENDIAN); checksum = tvb_get_ntohs(tvb, offset); @@ -145,22 +144,18 @@ dissect_snp_checksum_clv(tvbuff_t *tvb, packet_info* pinfo, pdu_length = tvb_get_ntohs(tvb, 8); - /* unlike the LSP checksum verification which starts at an offset of 12 we start at offset 0*/ - switch (check_and_get_checksum(tvb, 0, pdu_length, checksum, offset, &cacl_checksum)) - { - case NO_CKSUM : - proto_item_append_text(ti, " [unused]"); - break; - case DATA_MISSING : - expert_add_info_format(pinfo, ti, &ei_isis_csnp_long_packet, + if (checksum == 0) { + /* No checksum present */ + proto_tree_add_checksum(tree, tvb, offset, hf_isis_csnp_checksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NOT_PRESENT); + } else { + if (osi_check_and_get_checksum(tvb, 0, pdu_length, offset, &cacl_checksum)) { + /* Successfully processed checksum, verify it */ + proto_tree_add_checksum(tree, tvb, offset, hf_isis_csnp_checksum, -1, NULL, pinfo, cacl_checksum, ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); + } else { + ti = proto_tree_add_checksum(tree, tvb, offset, hf_isis_csnp_checksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); + expert_add_info_format(pinfo, ti, &ei_isis_csnp_long_packet, "Packet length %d went beyond packet", tvb_captured_length(tvb)); - break; - case CKSUM_NOT_OK : - proto_item_append_text(ti, " [incorrect, should be 0x%04x]", cacl_checksum); - break; - case CKSUM_OK : - proto_item_append_text(ti, " [correct]"); - break; + } } } diff --git a/epan/dissectors/packet-itdm.c b/epan/dissectors/packet-itdm.c index 81ca8172d0..cbadee8d3c 100644 --- a/epan/dissectors/packet-itdm.c +++ b/epan/dissectors/packet-itdm.c @@ -225,7 +225,7 @@ dissect_itdm_125usec(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) proto_tree_add_item(itdm_tree, hf_itdm_last_pack, tvb, offset, 1, ENC_BIG_ENDIAN); proto_tree_add_item(itdm_tree, hf_itdm_pktlen, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; - proto_tree_add_item(itdm_tree, hf_itdm_chksum, tvb, offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_checksum(itdm_tree, tvb, offset, hf_itdm_chksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); offset += 2; proto_tree_add_item(itdm_tree, hf_itdm_uid, tvb, offset, 3, ENC_BIG_ENDIAN); offset += 3; @@ -318,7 +318,7 @@ dissect_itdm_control(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) proto_tree_add_item(itdm_ctl_tree, hf_itdm_last_pack, tvb, offset, 1, ENC_BIG_ENDIAN); proto_tree_add_item(itdm_ctl_tree, hf_itdm_pktlen, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; - proto_tree_add_item(itdm_ctl_tree, hf_itdm_chksum, tvb, offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_checksum(itdm_ctl_tree, tvb, offset, hf_itdm_chksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); offset += 2; proto_tree_add_item(itdm_ctl_tree, hf_itdm_uid, tvb, offset, 3, ENC_BIG_ENDIAN); offset += 3; diff --git a/epan/dissectors/packet-kingfisher.c b/epan/dissectors/packet-kingfisher.c index 66d0b60ea9..5686bb7350 100644 --- a/epan/dissectors/packet-kingfisher.c +++ b/epan/dissectors/packet-kingfisher.c @@ -294,7 +294,7 @@ dissect_kingfisher(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gboolean proto_tree_add_uint_format_value(kingfisher_tree, hf_kingfisher_message, tvb, 5, 1, kfp.message, "%u (0x%02X, %s)", message, kfp.message, ((kfp.message & 0xf0)?"Response":"Request")); /* message function code */ - proto_tree_add_uint_format(kingfisher_tree, hf_kingfisher_function, tvb, 6, 1, kfp.function, "Message Function Code: %u (0x%02X, %s)", kfp.function, kfp.function, func_string); + proto_tree_add_uint_format_value(kingfisher_tree, hf_kingfisher_function, tvb, 6, 1, kfp.function, "%u (0x%02X, %s)", kfp.function, kfp.function, func_string); /* message data */ if(kfp.length > ((kfp.version==3)?11:8)){ @@ -302,9 +302,7 @@ dissect_kingfisher(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gboolean } /* checksum */ - proto_tree_add_uint_format_value(kingfisher_tree, hf_kingfisher_checksum, tvb, kfp.length-1, 2, kfp.checksum, "0x%04X [%s]", kfp.checksum, ((checksum != kfp.checksum)?"incorrect":"correct")); - - + proto_tree_add_checksum(kingfisher_tree, tvb, kfp.length-1, hf_kingfisher_checksum, -1, NULL, pinfo, checksum, ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); return TRUE; } @@ -351,7 +349,7 @@ proto_register_kingfisher( void ) { &hf_kingfisher_target, { "Target RTU", "kingfisher.target", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } }, { &hf_kingfisher_via, { "Via RTU", "kingfisher.via", FT_UINT16, BASE_DEC_HEX, NULL, 0x0, NULL, HFILL } }, { &hf_kingfisher_message, { "Message Number", "kingfisher.message", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL } }, - { &hf_kingfisher_function, { "Function Code", "kingfisher.function", FT_UINT8, BASE_DEC, VALS( function_code_vals ), 0x0, NULL, HFILL } }, + { &hf_kingfisher_function, { "Message Function Code", "kingfisher.function", FT_UINT8, BASE_DEC, VALS( function_code_vals ), 0x0, NULL, HFILL } }, { &hf_kingfisher_checksum, { "Checksum", "kingfisher.checksum", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL } }, { &hf_kingfisher_message_data, { "Message Data", "kingfisher.message_data", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL } }, }; diff --git a/epan/dissectors/packet-lapd.c b/epan/dissectors/packet-lapd.c index 467977cd8b..8f782c0aad 100644 --- a/epan/dissectors/packet-lapd.c +++ b/epan/dissectors/packet-lapd.c @@ -74,8 +74,7 @@ static int hf_lapd_ftype_i = -1; static int hf_lapd_ftype_s_u = -1; static int hf_lapd_ftype_s_u_ext = -1; static int hf_lapd_checksum = -1; -static int hf_lapd_checksum_good = -1; -static int hf_lapd_checksum_bad = -1; +static int hf_lapd_checksum_status = -1; static gint ett_lapd = -1; static gint ett_lapd_address = -1; @@ -417,10 +416,10 @@ dissect_lapd(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_ static void dissect_lapd_full(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gboolean has_crc) { - proto_tree *lapd_tree, *addr_tree, *checksum_tree; - proto_item *lapd_ti, *addr_ti, *checksum_ti; + proto_tree *lapd_tree, *addr_tree; + proto_item *lapd_ti, *addr_ti; int direction; - guint16 control, checksum, checksum_calculated; + guint16 control; int lapd_header_len, checksum_offset; guint16 addr, cr, sapi, tei; gboolean is_response = 0; @@ -543,25 +542,9 @@ dissect_lapd_full(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gboolean /* check checksum */ checksum_offset = tvb_reported_length(tvb) - 2; - checksum = tvb_get_guint8(tvb, checksum_offset); /* high byte */ - checksum <<= 8; - checksum |= tvb_get_guint8(tvb, checksum_offset+1) & 0x00FF; /* low byte */ - checksum_calculated = crc16_ccitt_tvb(tvb, tvb_reported_length(tvb) - 2); - checksum_calculated = g_htons(checksum_calculated); /* Note: g_htons() macro may eval arg multiple times */ - if (checksum == checksum_calculated) { - checksum_ti = proto_tree_add_uint_format_value(lapd_tree, hf_lapd_checksum, tvb, checksum_offset, 2, 0,"0x%04x [correct]", checksum); - checksum_tree = proto_item_add_subtree(checksum_ti, ett_lapd_checksum); - proto_tree_add_boolean(checksum_tree, hf_lapd_checksum_good, tvb, checksum_offset, 2, TRUE); - proto_tree_add_boolean(checksum_tree, hf_lapd_checksum_bad, tvb, checksum_offset, 2, FALSE); - } else { - proto_item *pi; - checksum_ti = proto_tree_add_uint_format_value(lapd_tree, hf_lapd_checksum, tvb, checksum_offset, 2, 0,"0x%04x [incorrect, should be 0x%04x]", checksum, checksum_calculated); - checksum_tree = proto_item_add_subtree(checksum_ti, ett_lapd_checksum); - proto_tree_add_boolean(checksum_tree, hf_lapd_checksum_good, tvb, checksum_offset, 2, FALSE); - pi = proto_tree_add_boolean(checksum_tree, hf_lapd_checksum_bad, tvb, checksum_offset, 2, TRUE); - expert_add_info(pinfo, pi, &ei_lapd_checksum_bad); - } + proto_tree_add_checksum(lapd_tree, tvb, checksum_offset, hf_lapd_checksum, hf_lapd_checksum_status, &ei_lapd_checksum_bad, pinfo, + crc16_ccitt_tvb(tvb, tvb_reported_length(tvb) - 2), ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); next_tvb = tvb_new_subset_length(tvb, lapd_header_len, tvb_reported_length_remaining(tvb,lapd_header_len) - 2); @@ -702,13 +685,9 @@ proto_register_lapd(void) { "Checksum", "lapd.checksum", FT_UINT16, BASE_HEX, NULL, 0x0, "Details at: http://www.wireshark.org/docs/wsug_html_chunked/ChAdvChecksums.html", HFILL }}, - { &hf_lapd_checksum_good, - { "Good Checksum", "lapd.checksum_good", FT_BOOLEAN, BASE_NONE, - NULL, 0x0, "True: checksum matches packet content; False: doesn't match content or not checked", HFILL }}, - - { &hf_lapd_checksum_bad, - { "Bad Checksum", "lapd.checksum_bad", FT_BOOLEAN, BASE_NONE, - NULL, 0x0, "True: checksum doesn't match packet content; False: matches content or not checked", HFILL }}, + { &hf_lapd_checksum_status, + { "Checksum Status", "lapd.checksum.status", FT_UINT8, BASE_NONE, + VALS(proto_checksum_vals), 0x0, NULL, HFILL }}, }; static gint *ett[] = { &ett_lapd, diff --git a/epan/dissectors/packet-lmp.c b/epan/dissectors/packet-lmp.c index 500a7e0b7f..9b93e235aa 100644 --- a/epan/dissectors/packet-lmp.c +++ b/epan/dissectors/packet-lmp.c @@ -707,7 +707,6 @@ dissect_lmp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) proto_item *hidden_item, *msg_item; guint8 message_type; - guint16 cksum, computed_cksum; vec_t cksum_vec[1]; int j, k, l, len; int msg_length; @@ -759,24 +758,16 @@ dissect_lmp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) } if (lmp_checksum_config) { - cksum = tvb_get_ntohs(tvb, offset+6); - ti = proto_tree_add_item(lmp_header_tree, hf_lmp_filter[LMPF_CHECKSUM], tvb, - offset+6, 2, ENC_BIG_ENDIAN); if (!pinfo->fragmented && (int) tvb_captured_length(tvb) >= msg_length) { /* The packet isn't part of a fragmented datagram and isn't truncated, so we can checksum it. */ SET_CKSUM_VEC_TVB(cksum_vec[0], tvb, 0, msg_length); - computed_cksum = in_cksum(cksum_vec, 1); - - if (computed_cksum == 0) { - proto_item_append_text( ti, " [correct]"); - } - else { - expert_add_info_format(pinfo, ti, &ei_lmp_checksum_incorrect, "[incorrect, should be 0x%04x]", - in_cksum_shouldbe(cksum, computed_cksum)); - } + proto_tree_add_checksum(lmp_header_tree, tvb, offset+6, hf_lmp_filter[LMPF_CHECKSUM], -1, &ei_lmp_checksum_incorrect, pinfo, + in_cksum(cksum_vec, 1), ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY|PROTO_CHECKSUM_IN_CKSUM); + } else { + proto_tree_add_checksum(lmp_header_tree, tvb, offset+6, hf_lmp_filter[LMPF_CHECKSUM], -1, &ei_lmp_checksum_incorrect, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); } } else { - proto_tree_add_uint_format_value(lmp_header_tree, hf_lmp_filter[LMPF_CHECKSUM], tvb, offset+6, 2, 0, "[None]"); + proto_tree_add_checksum(lmp_header_tree, tvb, offset+6, hf_lmp_filter[LMPF_CHECKSUM], -1, &ei_lmp_checksum_incorrect, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NOT_PRESENT); } offset += 8; diff --git a/epan/dissectors/packet-manolito.c b/epan/dissectors/packet-manolito.c index c94e646cbf..fecbcecb25 100644 --- a/epan/dissectors/packet-manolito.c +++ b/epan/dissectors/packet-manolito.c @@ -90,8 +90,8 @@ dissect_manolito(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* diss manolito_tree = proto_item_add_subtree(ti, ett_manolito); /* MANOLITO packet header (network byte order) */ - proto_tree_add_item(manolito_tree, - hf_manolito_checksum, tvb, offset, 4, ENC_BIG_ENDIAN); + proto_tree_add_checksum(manolito_tree, tvb, offset, hf_manolito_checksum, + -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); offset += 4; proto_tree_add_item(manolito_tree, hf_manolito_seqno, tvb, offset, 4, ENC_BIG_ENDIAN); diff --git a/epan/dissectors/packet-mbtcp.c b/epan/dissectors/packet-mbtcp.c index c388a90c1a..a1b0b80ae2 100644 --- a/epan/dissectors/packet-mbtcp.c +++ b/epan/dissectors/packet-mbtcp.c @@ -517,14 +517,14 @@ static int dissect_mbrtu_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) { /* Set up structures needed to add the protocol subtree and manage it */ - proto_item *mi, *crc_item; + proto_item *mi; proto_tree *mbrtu_tree; int offset, packet_type; tvbuff_t *next_tvb; const char *func_string = ""; const char *pkt_type_str = ""; const char *err_str = ""; - guint16 len, crc16, calc_crc16; + guint16 len, calc_crc16; guint8 unit_id, function_code, exception_code, subfunction_code; /* Make entries in Protocol column on summary display */ @@ -535,7 +535,6 @@ dissect_mbrtu_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* dat unit_id = tvb_get_guint8(tvb, 0); function_code = tvb_get_guint8(tvb, 1) & 0x7F; - crc16 = tvb_get_ntohs(tvb, len-2); offset = 0; @@ -618,14 +617,16 @@ dissect_mbrtu_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* dat /* Add items to protocol tree specific to Modbus RTU */ proto_tree_add_uint(mbrtu_tree, hf_mbrtu_unitid, tvb, offset, 1, unit_id); - crc_item = proto_tree_add_uint(mbrtu_tree, hf_mbrtu_crc16, tvb, len-2, 2, crc16); /* CRC validation */ if (mbrtu_crc) { calc_crc16 = crc16_plain_tvb_offset_seed(tvb, offset, len-2, 0xFFFF); - if (g_htons(calc_crc16) != crc16) - expert_add_info_format(pinfo, crc_item, &ei_mbrtu_crc16_incorrect, "Incorrect CRC - should be 0x%04x", g_htons(calc_crc16)); + proto_tree_add_checksum(mbrtu_tree, tvb, len-2, hf_mbrtu_crc16, -1, &ei_mbrtu_crc16_incorrect, pinfo, g_htons(calc_crc16), ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); + } + else + { + proto_tree_add_checksum(mbrtu_tree, tvb, len-2, hf_mbrtu_crc16, -1, &ei_mbrtu_crc16_incorrect, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); } /* when determining payload length, make sure to ignore the unit ID header & CRC-16 footer bytes */ diff --git a/epan/dissectors/packet-mip6.c b/epan/dissectors/packet-mip6.c index e96c00c25f..98c8b5dea4 100644 --- a/epan/dissectors/packet-mip6.c +++ b/epan/dissectors/packet-mip6.c @@ -4093,8 +4093,8 @@ dissect_mip6(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_ proto_tree_add_item(mip6_tree, hf_mip6_reserved, tvb, MIP6_RES_OFF, 1, ENC_BIG_ENDIAN); - proto_tree_add_item(mip6_tree, hf_mip6_csum, tvb, - MIP6_CSUM_OFF, 2, ENC_BIG_ENDIAN); + proto_tree_add_checksum(mip6_tree, tvb, MIP6_CSUM_OFF, hf_mip6_csum, + -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); /* Process mobility header */ type = tvb_get_guint8(tvb, MIP6_TYPE_OFF); diff --git a/epan/dissectors/packet-mpeg-dsmcc.c b/epan/dissectors/packet-mpeg-dsmcc.c index 1c8f9c13d0..191f15289f 100644 --- a/epan/dissectors/packet-mpeg-dsmcc.c +++ b/epan/dissectors/packet-mpeg-dsmcc.c @@ -800,8 +800,8 @@ dissect_dsmcc_ts(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree_in, void *d } } else { /* TODO: actually check the checksum */ - proto_tree_add_item(tree, hf_dsmcc_checksum, tvb, - crc_len, 4, ENC_BIG_ENDIAN); + proto_tree_add_checksum(tree, tvb, crc_len, hf_dsmcc_checksum, + -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); } return tvb_reported_length(tvb); diff --git a/epan/dissectors/packet-mpeg-sect.c b/epan/dissectors/packet-mpeg-sect.c index 5ab94ef483..12af8aaf5b 100644 --- a/epan/dissectors/packet-mpeg-sect.c +++ b/epan/dissectors/packet-mpeg-sect.c @@ -37,6 +37,7 @@ static int hf_mpeg_sect_syntax_indicator = -1; static int hf_mpeg_sect_reserved = -1; static int hf_mpeg_sect_length = -1; static int hf_mpeg_sect_crc = -1; +static int hf_mpeg_sect_crc_status = -1; static gint ett_mpeg_sect = -1; @@ -247,30 +248,12 @@ guint packet_mpeg_sect_crc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint start, guint end) { - guint32 crc, calculated_crc; - const char *label; - - crc = tvb_get_ntohl(tvb, end); - - calculated_crc = crc; - label = "Unverified"; if (mpeg_sect_check_crc) { - label = "Verified"; - calculated_crc = crc32_mpeg2_tvb_offset(tvb, start, end); - } - - if (calculated_crc == crc) { - proto_tree_add_uint_format( tree, hf_mpeg_sect_crc, tvb, - end, 4, crc, "CRC: 0x%08x [%s]", crc, label); + proto_tree_add_checksum(tree, tvb, end, hf_mpeg_sect_crc, hf_mpeg_sect_crc_status, &ei_mpeg_sect_crc, pinfo, crc32_mpeg2_tvb_offset(tvb, start, end), + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); } else { - proto_item *msg_error; - - msg_error = proto_tree_add_uint_format( tree, hf_mpeg_sect_crc, tvb, - end, 4, crc, - "CRC: 0x%08x [Failed Verification (Calculated: 0x%08x)]", - crc, calculated_crc ); - PROTO_ITEM_SET_GENERATED(msg_error); - expert_add_info( pinfo, msg_error, &ei_mpeg_sect_crc); + proto_tree_add_checksum(tree, tvb, end, hf_mpeg_sect_crc, hf_mpeg_sect_crc_status, &ei_mpeg_sect_crc, pinfo, crc32_mpeg2_tvb_offset(tvb, start, end), + ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); } return 4; @@ -348,7 +331,13 @@ proto_register_mpeg_sect(void) { &hf_mpeg_sect_crc, { "CRC 32", "mpeg_sect.crc", FT_UINT32, BASE_HEX, NULL, 0, NULL, HFILL - } } + } }, + + { &hf_mpeg_sect_crc_status, { + "CRC 32 Status", "mpeg_sect.crc.status", + FT_UINT8, BASE_NONE, VALS(proto_checksum_vals), 0, NULL, HFILL + } }, + }; static gint *ett[] = { diff --git a/epan/dissectors/packet-mrdisc.c b/epan/dissectors/packet-mrdisc.c index 25637fc8cf..45fa7f4349 100644 --- a/epan/dissectors/packet-mrdisc.c +++ b/epan/dissectors/packet-mrdisc.c @@ -46,7 +46,7 @@ void proto_reg_handoff_mrdisc(void); static int proto_mrdisc = -1; static int hf_checksum = -1; -static int hf_checksum_bad = -1; +static int hf_checksum_status = -1; static int hf_type = -1; static int hf_advint = -1; static int hf_numopts = -1; @@ -91,7 +91,7 @@ dissect_mrdisc_mra(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, i offset += 1; /* checksum */ - igmp_checksum(parent_tree, tvb, hf_checksum, hf_checksum_bad, pinfo, 0); + igmp_checksum(parent_tree, tvb, hf_checksum, hf_checksum_status, pinfo, 0); offset += 2; /* skip unused bytes */ @@ -160,7 +160,7 @@ dissect_mrdisc_mrst(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, offset += 1; /* checksum */ - igmp_checksum(parent_tree, tvb, hf_checksum, hf_checksum_bad, pinfo, 0); + igmp_checksum(parent_tree, tvb, hf_checksum, hf_checksum_status, pinfo, 0); offset += 2; return offset; @@ -222,9 +222,9 @@ proto_register_mrdisc(void) { "Checksum", "mrdisc.checksum", FT_UINT16, BASE_HEX, NULL, 0, "MRDISC Checksum", HFILL }}, - { &hf_checksum_bad, - { "Bad Checksum", "mrdisc.checksum_bad", FT_BOOLEAN, BASE_NONE, - NULL, 0x0, "Bad MRDISC Checksum", HFILL }}, + { &hf_checksum_status, + { "Checksum Status", "mrdisc.checksum.status", FT_UINT8, BASE_NONE, + VALS(proto_checksum_vals), 0x0, NULL, HFILL }}, { &hf_advint, { "Advertising Interval", "mrdisc.adv_int", FT_UINT8, BASE_DEC, diff --git a/epan/dissectors/packet-msnip.c b/epan/dissectors/packet-msnip.c index e1544a418e..46ea45e359 100644 --- a/epan/dissectors/packet-msnip.c +++ b/epan/dissectors/packet-msnip.c @@ -44,7 +44,7 @@ void proto_reg_handoff_msnip(void); static int proto_msnip = -1; static int hf_checksum = -1; -static int hf_checksum_bad = -1; +static int hf_checksum_status = -1; static int hf_type = -1; static int hf_count = -1; static int hf_holdtime = -1; @@ -89,7 +89,7 @@ dissect_msnip_rmr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, in offset += 1; /* checksum */ - igmp_checksum(parent_tree, tvb, hf_checksum, hf_checksum_bad, pinfo, 0); + igmp_checksum(parent_tree, tvb, hf_checksum, hf_checksum_status, pinfo, 0); offset += 2; while (count--) { @@ -135,7 +135,7 @@ dissect_msnip_is(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, int offset += 1; /* checksum */ - igmp_checksum(parent_tree, tvb, hf_checksum, hf_checksum_bad, pinfo, 0); + igmp_checksum(parent_tree, tvb, hf_checksum, hf_checksum_status, pinfo, 0); offset += 2; /* 16 bit holdtime */ @@ -161,7 +161,7 @@ dissect_msnip_gm(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, int offset += 1; /* checksum */ - igmp_checksum(parent_tree, tvb, hf_checksum, hf_checksum_bad, pinfo, 0); + igmp_checksum(parent_tree, tvb, hf_checksum, hf_checksum_status, pinfo, 0); offset += 2; /* holdtime */ @@ -264,9 +264,9 @@ proto_register_msnip(void) { "Checksum", "msnip.checksum", FT_UINT16, BASE_HEX, NULL, 0, "MSNIP Checksum", HFILL }}, - { &hf_checksum_bad, - { "Bad Checksum", "msnip.checksum_bad", FT_BOOLEAN, BASE_NONE, - NULL, 0x0, "Bad MSNIP Checksum", HFILL }}, + { &hf_checksum_status, + { "Checksum Status", "msnip.checksum.status", FT_UINT8, BASE_NONE, + VALS(proto_checksum_vals), 0x0, NULL, HFILL }}, { &hf_count, { "Count", "msnip.count", FT_UINT8, BASE_DEC, diff --git a/epan/dissectors/packet-mstp.c b/epan/dissectors/packet-mstp.c index a97365f655..5b3c3a842f 100644 --- a/epan/dissectors/packet-mstp.c +++ b/epan/dissectors/packet-mstp.c @@ -86,8 +86,7 @@ static int hf_mstp_frame_vendor_id = -1; static int hf_mstp_frame_pdu_len = -1; static int hf_mstp_frame_crc8 = -1; static int hf_mstp_frame_crc16 = -1; -static int hf_mstp_frame_checksum_bad = -1; -static int hf_mstp_frame_checksum_good = -1; +static int hf_mstp_frame_checksum_status = -1; static expert_field ei_mstp_frame_pdu_len = EI_INIT; static expert_field ei_mstp_frame_checksum_bad = EI_INIT; @@ -190,12 +189,11 @@ dissect_mstp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, proto_item *item; #if defined(BACNET_MSTP_CHECKSUM_VALIDATE) /* used to calculate the crc value */ - guint8 crc8 = 0xFF, framecrc8; - guint16 crc16 = 0xFFFF, framecrc16; + guint8 crc8 = 0xFF; + guint16 crc16 = 0xFFFF; guint8 crcdata; guint16 i; /* loop counter */ guint16 max_len = 0; - proto_tree *checksum_tree; #endif col_set_str(pinfo->cinfo, COL_PROTOCOL, "BACnet"); @@ -228,39 +226,11 @@ dissect_mstp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, crc8 = CRC_Calc_Header(crcdata, crc8); } crc8 = ~crc8; - framecrc8 = tvb_get_guint8(tvb, offset+5); - if (framecrc8 == crc8) { - item = proto_tree_add_uint_format_value(subtree, hf_mstp_frame_crc8, - tvb, offset+5, 1, framecrc8, - "0x%02x [correct]", framecrc8); - checksum_tree = proto_item_add_subtree(item, ett_bacnet_mstp_checksum); - item = proto_tree_add_boolean(checksum_tree, - hf_mstp_frame_checksum_good, - tvb, offset+5, 1, TRUE); - PROTO_ITEM_SET_GENERATED(item); - item = proto_tree_add_boolean(checksum_tree, - hf_mstp_frame_checksum_bad, - tvb, offset+5, 1, FALSE); - PROTO_ITEM_SET_GENERATED(item); - } else { - item = proto_tree_add_uint_format_value(subtree, hf_mstp_frame_crc8, - tvb, offset+5, 1, framecrc8, - "0x%02x [incorrect, should be 0x%02x]", - framecrc8, crc8); - checksum_tree = proto_item_add_subtree(item, ett_bacnet_mstp_checksum); - item = proto_tree_add_boolean(checksum_tree, - hf_mstp_frame_checksum_good, - tvb, offset+5, 1, FALSE); - PROTO_ITEM_SET_GENERATED(item); - item = proto_tree_add_boolean(checksum_tree, - hf_mstp_frame_checksum_bad, - tvb, offset+5, 1, TRUE); - PROTO_ITEM_SET_GENERATED(item); - expert_add_info(pinfo, item, &ei_mstp_frame_checksum_bad); - } + proto_tree_add_checksum(subtree, tvb, offset+5, hf_mstp_frame_crc8, hf_mstp_frame_checksum_status, &ei_mstp_frame_checksum_bad, pinfo, crc8, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); #else - proto_tree_add_item(subtree, hf_mstp_frame_crc8, - tvb, offset+5, 1, ENC_LITTLE_ENDIAN); + proto_tree_add_checksum(subtree, tvb, offset+5, hf_mstp_frame_crc8, hf_mstp_frame_checksum_status, &ei_mstp_frame_checksum_bad, pinfo, 0, + PROTO_CHECKSUM_NO_FLAGS); #endif /* dissect BACnet PDU if there is one */ @@ -300,42 +270,12 @@ dissect_mstp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, crc16 = ~crc16; /* convert it to on-the-wire format */ crc16 = g_htons(crc16); - /* get the actual CRC from the frame */ - framecrc16 = tvb_get_ntohs(tvb, offset+mstp_frame_pdu_len); - if (framecrc16 == crc16) { - item = proto_tree_add_uint_format_value(subtree, hf_mstp_frame_crc16, - tvb, offset+mstp_frame_pdu_len, 2, framecrc16, - "0x%04x [correct]", framecrc16); - checksum_tree = proto_item_add_subtree(item, - ett_bacnet_mstp_checksum); - item = proto_tree_add_boolean(checksum_tree, - hf_mstp_frame_checksum_good, - tvb, offset+mstp_frame_pdu_len, 2, TRUE); - PROTO_ITEM_SET_GENERATED(item); - item = proto_tree_add_boolean(checksum_tree, - hf_mstp_frame_checksum_bad, - tvb, offset+mstp_frame_pdu_len, 2, FALSE); - PROTO_ITEM_SET_GENERATED(item); - } else { - item = proto_tree_add_uint_format_value(subtree, hf_mstp_frame_crc16, - tvb, offset+mstp_frame_pdu_len, 2, framecrc16, - "0x%04x [incorrect, should be 0x%04x]", - framecrc16, crc16); - checksum_tree = proto_item_add_subtree(item, - ett_bacnet_mstp_checksum); - item = proto_tree_add_boolean(checksum_tree, - hf_mstp_frame_checksum_good, - tvb, offset+mstp_frame_pdu_len, 2, FALSE); - PROTO_ITEM_SET_GENERATED(item); - item = proto_tree_add_boolean(checksum_tree, - hf_mstp_frame_checksum_bad, - tvb, offset+mstp_frame_pdu_len, 2, TRUE); - PROTO_ITEM_SET_GENERATED(item); - expert_add_info(pinfo, item, &ei_mstp_frame_checksum_bad); - } + + proto_tree_add_checksum(subtree, tvb, offset+mstp_frame_pdu_len, hf_mstp_frame_crc16, hf_mstp_frame_checksum_status, &ei_mstp_frame_checksum_bad, pinfo, crc16, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); #else - proto_tree_add_item(subtree, hf_mstp_frame_crc16, - tvb, offset+mstp_frame_pdu_len, 2, ENC_LITTLE_ENDIAN); + proto_tree_add_checksum(subtree, tvb, offset+mstp_frame_pdu_len, hf_mstp_frame_crc16, hf_mstp_frame_checksum_status, &ei_mstp_frame_checksum_bad, pinfo, 0, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); #endif } } @@ -427,16 +367,11 @@ proto_register_mstp(void) FT_UINT16, BASE_HEX, NULL, 0, "MS/TP Data CRC", HFILL } }, - { &hf_mstp_frame_checksum_bad, - { "Bad", "mstp.checksum_bad", - FT_BOOLEAN, BASE_NONE, NULL, 0x0, - "True: checksum doesn't match packet content; False: matches content or not checked", HFILL } + { &hf_mstp_frame_checksum_status, + { "Checksum status", "mstp.checksum.status", + FT_UINT8, BASE_NONE, VALS(proto_checksum_vals), 0x0, + NULL, HFILL } }, - { &hf_mstp_frame_checksum_good, - { "Good", "mstp.checksum_good", - FT_BOOLEAN, BASE_NONE, NULL, 0x0, - "True: checksum matches packet content; False: doesn't match content or not checked", HFILL } - } }; static gint *ett[] = { diff --git a/epan/dissectors/packet-mswsp.c b/epan/dissectors/packet-mswsp.c index de3d0826d2..c025d428b9 100644 --- a/epan/dissectors/packet-mswsp.c +++ b/epan/dissectors/packet-mswsp.c @@ -6324,8 +6324,7 @@ dissect_mswsp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gboolean in, "(Unknown: 0x%x)")); } - proto_tree_add_item(hdr_tree, hf_mswsp_hdr_checksum, tvb, - 8, 4, ENC_LITTLE_ENDIAN); + proto_tree_add_checksum(hdr_tree, tvb, 8, hf_mswsp_hdr_checksum, -1, NULL, pinfo, 0, ENC_LITTLE_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); /* todo: validate checksum */ proto_tree_add_item(hdr_tree, hf_mswsp_hdr_reserved, tvb, diff --git a/epan/dissectors/packet-mtp2.c b/epan/dissectors/packet-mtp2.c index 76fb4be073..bc82b455c5 100644 --- a/epan/dissectors/packet-mtp2.c +++ b/epan/dissectors/packet-mtp2.c @@ -148,11 +148,7 @@ mtp2_decode_crc16(tvbuff_t *tvb, proto_tree *fh_tree, packet_info *pinfo) { tvbuff_t *next_tvb; gint len, reported_len; - int rx_fcs_offset; - guint32 rx_fcs_exp; - guint32 rx_fcs_got; int proto_offset=0; - proto_item *cause; /* * Do we have the entire packet, and does it include a 2-byte FCS? @@ -191,16 +187,8 @@ mtp2_decode_crc16(tvbuff_t *tvb, proto_tree *fh_tree, packet_info *pinfo) /* * Compute the FCS and put it into the tree. */ - rx_fcs_offset = proto_offset + len; - rx_fcs_exp = mtp2_fcs16(tvb); - rx_fcs_got = tvb_get_letohs(tvb, rx_fcs_offset); - cause=proto_tree_add_item(fh_tree, hf_mtp2_fcs_16, tvb, rx_fcs_offset, 2, ENC_LITTLE_ENDIAN); - if (rx_fcs_got != rx_fcs_exp) { - proto_item_append_text(cause, " [incorrect, should be 0x%04x]", rx_fcs_exp); - expert_add_info(pinfo, cause, &ei_mtp2_checksum_error); - } else { - proto_item_append_text(cause, " [correct]"); - } + proto_tree_add_checksum(fh_tree, tvb, proto_offset + len, hf_mtp2_fcs_16, -1, &ei_mtp2_checksum_error, pinfo, mtp2_fcs16(tvb), + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); } return next_tvb; } diff --git a/epan/dissectors/packet-netsync.c b/epan/dissectors/packet-netsync.c index 90ba55bce5..f399b9423a 100644 --- a/epan/dissectors/packet-netsync.c +++ b/epan/dissectors/packet-netsync.c @@ -535,8 +535,8 @@ dissect_netsync_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* d offset += size; - proto_tree_add_item(netsync_tree, hf_netsync_checksum, tvb, - offset, 4, ENC_BIG_ENDIAN ); + proto_tree_add_checksum(netsync_tree, tvb, offset, hf_netsync_checksum, + -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS ); offset += 4; diff --git a/epan/dissectors/packet-nhrp.c b/epan/dissectors/packet-nhrp.c index c073a5b838..a09b730840 100644 --- a/epan/dissectors/packet-nhrp.c +++ b/epan/dissectors/packet-nhrp.c @@ -282,14 +282,6 @@ typedef struct _e_nhrp { guint8 ar_sstl; } e_nhrp_hdr; -static guint16 nhrp_checksum(tvbuff_t *tvb, int len) -{ - vec_t cksum_vec[1]; - - SET_CKSUM_VEC_TVB(cksum_vec[0], tvb, 0, len); - return in_cksum(&cksum_vec[0], 1); -} - static void dissect_nhrp_hdr(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, @@ -302,7 +294,6 @@ static void dissect_nhrp_hdr(tvbuff_t *tvb, gint offset = *pOffset; const gchar *pro_type_str; guint total_len = tvb_reported_length(tvb); - guint16 ipcsum, rx_chksum; proto_tree *nhrp_tree; proto_item *shtl_tree_item; @@ -379,20 +370,14 @@ static void dissect_nhrp_hdr(tvbuff_t *tvb, proto_tree_add_item(nhrp_tree, hf_nhrp_hdr_pktsz, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; - rx_chksum = tvb_get_ntohs(tvb, offset); if (tvb_bytes_exist(tvb, 0, total_len)) { - ipcsum = nhrp_checksum(tvb, total_len); - if (ipcsum == 0) { - proto_tree_add_uint_format_value(nhrp_tree, hf_nhrp_hdr_chksum, tvb, offset, 2, rx_chksum, - "0x%04x [correct]", rx_chksum); - } else { - proto_tree_add_uint_format_value(nhrp_tree, hf_nhrp_hdr_chksum, tvb, offset, 2, rx_chksum, - "0x%04x [incorrect, should be 0x%04x]", rx_chksum, - in_cksum_shouldbe(rx_chksum, ipcsum)); - } + vec_t cksum_vec[1]; + SET_CKSUM_VEC_TVB(cksum_vec[0], tvb, 0, total_len); + + proto_tree_add_checksum(nhrp_tree, tvb, offset, hf_nhrp_hdr_chksum, -1, NULL, pinfo, in_cksum(&cksum_vec[0], 1), + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY|PROTO_CHECKSUM_IN_CKSUM); } else { - proto_tree_add_uint_format_value(nhrp_tree, hf_nhrp_hdr_chksum, tvb, offset, 2, rx_chksum, - "0x%04x [not all data available]", rx_chksum); + proto_tree_add_checksum(nhrp_tree, tvb, offset, hf_nhrp_hdr_chksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); } offset += 2; diff --git a/epan/dissectors/packet-nlsp.c b/epan/dissectors/packet-nlsp.c index c23356ee63..37a2ea3fef 100644 --- a/epan/dissectors/packet-nlsp.c +++ b/epan/dissectors/packet-nlsp.c @@ -945,9 +945,7 @@ nlsp_dissect_nlsp_lsp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, offset += 4; /* XXX -> we could validate the cksum here! */ - proto_tree_add_item(tree, hf_nlsp_lsp_checksum, tvb, - offset, 2, ENC_BIG_ENDIAN ); - + proto_tree_add_checksum(tree, tvb, offset, hf_nlsp_lsp_checksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); offset += 2; if (tree) { @@ -1027,7 +1025,7 @@ dissect_csnp_lsp_entries(tvbuff_t *tvb, packet_info* pinfo, proto_tree *tree, in proto_tree_add_uint_format_value(subtree, hf_nlsp_csnp_remaining_lifetime, tvb, offset, 2, tvb_get_ntohs(tvb, offset), "%us", tvb_get_ntohs(tvb, offset)); - proto_tree_add_item(subtree, hf_nlsp_csnp_lsp_checksum, tvb, offset+14, 2, ENC_BIG_ENDIAN); + proto_tree_add_checksum(subtree, tvb, offset+14, hf_nlsp_csnp_lsp_checksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); length -= 16; offset += 16; @@ -1063,7 +1061,7 @@ dissect_psnp_lsp_entries(tvbuff_t *tvb, packet_info* pinfo, proto_tree *tree, in proto_tree_add_uint_format_value(subtree, hf_nlsp_psnp_remaining_lifetime, tvb, offset, 2, tvb_get_ntohs(tvb, offset), "%us", tvb_get_ntohs(tvb, offset)); - proto_tree_add_item(subtree, hf_nlsp_psnp_lsp_checksum, tvb, offset+14, 2, ENC_BIG_ENDIAN); + proto_tree_add_checksum(subtree, tvb, offset+14, hf_nlsp_psnp_lsp_checksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); length -= 16; offset += 16; diff --git a/epan/dissectors/packet-nsrp.c b/epan/dissectors/packet-nsrp.c index 70dc51c995..90c11ab2f4 100644 --- a/epan/dissectors/packet-nsrp.c +++ b/epan/dissectors/packet-nsrp.c @@ -243,7 +243,7 @@ dissect_nsrp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_ proto_tree_add_item(nsrp_tree, hf_nsrp_no_used, tvb, offset, 2, ENC_BIG_ENDIAN); offset += 2; - proto_tree_add_item(nsrp_tree, hf_nsrp_checksum, tvb, offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_checksum(nsrp_tree, tvb, offset, hf_nsrp_checksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); offset += 2; proto_tree_add_item(nsrp_tree, hf_nsrp_data, tvb, offset, -1, ENC_ASCII|ENC_NA); @@ -293,7 +293,7 @@ dissect_nsrp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_ proto_tree_add_item(nsrp_tree, hf_nsrp_dummy, tvb, offset, 1, ENC_BIG_ENDIAN); offset += 1; - proto_tree_add_item(nsrp_tree, hf_nsrp_authchecksum, tvb, offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_checksum(nsrp_tree, tvb, offset, hf_nsrp_authchecksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); offset += 2; proto_tree_add_item(nsrp_tree, hf_nsrp_data, tvb, offset, -1, ENC_ASCII|ENC_NA); diff --git a/epan/dissectors/packet-osi.c b/epan/dissectors/packet-osi.c index 5f829c3314..abfeb42567 100644 --- a/epan/dissectors/packet-osi.c +++ b/epan/dissectors/packet-osi.c @@ -52,23 +52,18 @@ static dissector_handle_t osi_handle; static gboolean tpkt_desegment = FALSE; static guint global_tcp_port_osi_over_tpkt = 0; -cksum_status_t -calc_checksum( tvbuff_t *tvb, int offset, guint len, guint checksum) { - const gchar *buffer; +gboolean +osi_calc_checksum( tvbuff_t *tvb, int offset, guint len, guint32* c0, guint32* c1) { guint available_len; const guint8 *p; - guint32 c0, c1; guint seglen; guint i; - if ( 0 == checksum ) - return( NO_CKSUM ); - available_len = tvb_captured_length_remaining( tvb, offset ); if ( available_len < len ) - return( DATA_MISSING ); + return FALSE; - buffer = tvb_get_ptr( tvb, offset, len ); + p = tvb_get_ptr( tvb, offset, len ); /* * The maximum values of c0 and c1 will occur if all bytes have the @@ -81,33 +76,29 @@ calc_checksum( tvbuff_t *tvb, int offset, guint len, guint checksum) { * we can solve this by taking c0 and c1 mod 255 every * 5803 bytes. */ - p = buffer; - c0 = 0; - c1 = 0; + *c0 = 0; + *c1 = 0; while (len != 0) { seglen = len; if (seglen > 5803) seglen = 5803; for (i = 0; i < seglen; i++) { - c0 = c0 + *(p++); - c1 += c0; + (*c0) += *(p++); + (*c1) += (*c0); } - c0 = c0 % 255; - c1 = c1 % 255; + (*c0) = (*c0) % 255; + (*c1) = (*c1) % 255; len -= seglen; } - if (c0 != 0 || c1 != 0) - return( CKSUM_NOT_OK ); /* XXX - what should the checksum field be? */ - else - return( CKSUM_OK ); + + return TRUE; } -cksum_status_t -check_and_get_checksum( tvbuff_t *tvb, int offset, guint len, guint checksum, int offset_check, guint16* result) { - const gchar *buffer; +gboolean +osi_check_and_get_checksum( tvbuff_t *tvb, int offset, guint len, int offset_check, guint16* result) { guint available_len; const guint8 *p; guint8 discard = 0; @@ -116,15 +107,12 @@ check_and_get_checksum( tvbuff_t *tvb, int offset, guint len, guint checksum, in guint i; int block, x, y; - if ( 0 == checksum ) - return( NO_CKSUM ); - available_len = tvb_captured_length_remaining( tvb, offset ); offset_check -= offset; if ( ( available_len < len ) || ( offset_check < 0 ) || ( (guint)(offset_check+2) > len ) ) - return( DATA_MISSING ); + return FALSE; - buffer = tvb_get_ptr( tvb, offset, len ); + p = tvb_get_ptr( tvb, offset, len ); block = offset_check / 5803; /* @@ -138,7 +126,6 @@ check_and_get_checksum( tvbuff_t *tvb, int offset, guint len, guint checksum, in * we can solve this by taking c0 and c1 mod 255 every * 5803 bytes. */ - p = buffer; c0 = 0; c1 = 0; @@ -189,11 +176,7 @@ check_and_get_checksum( tvbuff_t *tvb, int offset, guint len, guint checksum, in if (y == 0) y = 0x01; *result = ( x << 8 ) | ( y & 0xFF ); - - if (*result != checksum) - return( CKSUM_NOT_OK ); /* XXX - what should the checksum field be? */ - else - return( CKSUM_OK ); + return TRUE; } /* 4 octet ATN extended checksum: ICAO doc 9705 Ed3 Volume V section 5.5.4.6.4 */ @@ -201,7 +184,7 @@ check_and_get_checksum( tvbuff_t *tvb, int offset, guint len, guint checksum, in /* of length SRC-NSAP, SRC-NSAP, length DST-NSAP, DST-NSAP and ATN extended checksum. */ /* In case of a CR TPDU, the value of the ISO 8073 16-bit fletcher checksum parameter shall */ /* be set to zero. */ -gboolean check_atn_ec_32( +guint32 check_atn_ec_32( tvbuff_t *tvb, guint tpdu_len, guint offset_ec_32_val, /* offset ATN extended checksum value, calculated at last as part of pseudo trailer */ guint offset_iso8073_val, /* offset ISO 8073 fletcher checksum, CR only*/ @@ -314,12 +297,8 @@ gboolean check_atn_ec_32( c3 -= 0x000000FF; } - sum = (c3 << 24) + (c2 << 16 ) + (c1 << 8) + c0 ; - - if(!sum) - return TRUE; - else - return FALSE; + sum = (c3 << 24) + (c2 << 16 ) + (c1 << 8) + c0; + return sum; } /* 2 octet ATN extended checksum: ICAO doc 9705 Ed3 Volume V section 5.5.4.6.4 */ @@ -328,7 +307,7 @@ gboolean check_atn_ec_32( /* In case of a CR TPDU, the value of the ISO 8073 16-bit fletcher checksum parameter shall */ /* be set to zero. */ /* this routine is currently *untested* because of the unavailability of samples.*/ -gboolean check_atn_ec_16( +guint16 check_atn_ec_16( tvbuff_t *tvb, guint tpdu_len, guint offset_ec_16_val, /* offset ATN extended checksum value, calculated at last as part of pseudo trailer */ @@ -341,7 +320,7 @@ gboolean check_atn_ec_16( guint i = 0; guint16 c0 = 0; guint16 c1 = 0; - guint16 sum = 0; + guint16 sum; /* sum across complete TPDU */ for ( i =0; i< tpdu_len; i++){ @@ -405,11 +384,7 @@ gboolean check_atn_ec_16( } sum = (c1 << 8) + c0 ; - - if(!sum) - return TRUE; - else - return FALSE; + return sum; } diff --git a/epan/dissectors/packet-osi.h b/epan/dissectors/packet-osi.h index ca8d92f832..b32f6accb4 100644 --- a/epan/dissectors/packet-osi.h +++ b/epan/dissectors/packet-osi.h @@ -57,19 +57,12 @@ * published API functions */ -typedef enum { - NO_CKSUM, /* checksum field is 0 */ - DATA_MISSING, /* not all the data covered by the checksum was captured */ - CKSUM_OK, /* checksum is OK */ - CKSUM_NOT_OK /* checksum is not OK */ -} cksum_status_t; - /* Exposed to be used by packet-osi-options.c */ extern int proto_osi; -extern cksum_status_t calc_checksum(tvbuff_t *, int, guint, guint); -extern cksum_status_t check_and_get_checksum(tvbuff_t *, int, guint, guint, int, guint16*); -extern gboolean check_atn_ec_32(tvbuff_t *tvb, guint tpdu_len, guint offset_ec_32_val, guint offset_iso8073_val, guint clnp_dst_len, const guint8 *clnp_dst, guint clnp_src_len, const guint8 *clnp_src); -extern gboolean check_atn_ec_16(tvbuff_t *tvb, guint tpdu_len, guint offset_ec_16_val, guint offset_iso8073_val, guint clnp_dst_len, const guint8 *clnp_dst, guint clnp_src_len, const guint8 *clnp_src); +extern gboolean osi_calc_checksum( tvbuff_t *tvb, int offset, guint len, guint32* c0, guint32* c1); +extern gboolean osi_check_and_get_checksum( tvbuff_t *tvb, int offset, guint len, int offset_check, guint16* result); +extern guint32 check_atn_ec_32(tvbuff_t *tvb, guint tpdu_len, guint offset_ec_32_val, guint offset_iso8073_val, guint clnp_dst_len, const guint8 *clnp_dst, guint clnp_src_len, const guint8 *clnp_src); +extern guint16 check_atn_ec_16(tvbuff_t *tvb, guint tpdu_len, guint offset_ec_16_val, guint offset_iso8073_val, guint clnp_dst_len, const guint8 *clnp_dst, guint clnp_src_len, const guint8 *clnp_src); #endif /* _PACKET_OSI_H */ diff --git a/epan/dissectors/packet-ositp.c b/epan/dissectors/packet-ositp.c index 53d7328b75..08c671211d 100644 --- a/epan/dissectors/packet-ositp.c +++ b/epan/dissectors/packet-ositp.c @@ -68,7 +68,8 @@ static int hf_cotp_eot_extended = -1; static int hf_cotp_parameter_code = -1; static int hf_cotp_parameter_length = -1; static int hf_cotp_parameter_value = -1; -static int hf_cotp_atn_extended_checksum = -1; +static int hf_cotp_atn_extended_checksum16 = -1; +static int hf_cotp_atn_extended_checksum32 = -1; static int hf_cotp_ack_time = -1; static int hf_cotp_res_error_rate_target_value = -1; static int hf_cotp_res_error_rate_min_accept = -1; @@ -440,10 +441,8 @@ static gboolean ositp_decode_var_part(tvbuff_t *tvb, int offset, int vp_length, gint32 i = 0; guint8 tmp_code = 0; guint tmp_len = 0; - cksum_status_t cksum_status; - gboolean checksum_ok = FALSE; guint32 pref_max_tpdu_size; - proto_item *ti, *hidden_item; + proto_item *hidden_item; while (vp_length != 0) { code = tvb_get_guint8(tvb, offset); @@ -462,6 +461,7 @@ static gboolean ositp_decode_var_part(tvbuff_t *tvb, int offset, int vp_length, case VP_ATN_EC_16 : /* ATN */ if (cotp_decode_atn) { + guint16 sum; /* if an alternate OSI checksum is present in the currently unprocessed * VP section to the checksum algorithm has to know. * this may be the case for backward compatible CR TPDU */ @@ -477,12 +477,11 @@ static gboolean ositp_decode_var_part(tvbuff_t *tvb, int offset, int vp_length, i += tmp_len; } } - checksum_ok = check_atn_ec_16(tvb, tpdu_len , offset, + sum = check_atn_ec_16(tvb, tpdu_len , offset, offset_iso8073_checksum, pinfo->dst.len, (const guint8 *)pinfo->dst.data, pinfo->src.len, (const guint8 *)pinfo->src.data); - ti = proto_tree_add_item(tree, hf_cotp_atn_extended_checksum, tvb, offset, 2, ENC_BIG_ENDIAN); - proto_item_append_text(ti, checksum_ok ? " (correct)" : " (incorrect)"); + proto_tree_add_checksum(tree, tvb, offset, hf_cotp_atn_extended_checksum16, -1, NULL, pinfo, sum, ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY|PROTO_CHECKSUM_ZERO); } else { proto_tree_add_bytes_format_value(tree, hf_cotp_parameter_value, tvb, offset, length, NULL, ""); } @@ -492,6 +491,7 @@ static gboolean ositp_decode_var_part(tvbuff_t *tvb, int offset, int vp_length, case VP_ATN_EC_32 : /* ATN */ if (cotp_decode_atn) { + guint32 sum; /* if an alternate OSI checksum is present in the currently unprocessed * VP section the checksum algorithm has to know. * this may be the case for backward compatible CR TPDU */ @@ -507,12 +507,11 @@ static gboolean ositp_decode_var_part(tvbuff_t *tvb, int offset, int vp_length, i += tmp_len; } } - checksum_ok = check_atn_ec_32(tvb, tpdu_len , offset, + sum = check_atn_ec_32(tvb, tpdu_len , offset, offset_iso8073_checksum, pinfo->dst.len, (const guint8 *)pinfo->dst.data, pinfo->src.len, (const guint8 *)pinfo->src.data); - ti = proto_tree_add_item(tree, hf_cotp_atn_extended_checksum, tvb, offset, 4, ENC_BIG_ENDIAN); - proto_item_append_text(ti, checksum_ok ? " (correct)" : " (incorrect)"); + proto_tree_add_checksum(tree, tvb, offset, hf_cotp_atn_extended_checksum32, -1, NULL, pinfo, sum, ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY|PROTO_CHECKSUM_ZERO); } else { proto_tree_add_bytes_format_value(tree, hf_cotp_parameter_value, tvb, offset, length, NULL, ""); } @@ -691,36 +690,21 @@ static gboolean ositp_decode_var_part(tvbuff_t *tvb, int offset, int vp_length, case VP_CHECKSUM: offset_iso8073_checksum = offset; /* save ISO 8073 checksum offset for ATN extended checksum calculation */ - cksum_status = calc_checksum(tvb, 0, tpdu_len, - tvb_get_ntohs(tvb, offset)); - switch (cksum_status) { - default: - /* - * No checksum present, or not enough of the packet present to - * checksum it. - */ - proto_tree_add_item(tree, hf_cotp_checksum, tvb, offset, 2, ENC_BIG_ENDIAN); - break; + if (tvb_get_ntohs(tvb, offset) == 0) { + /* No checksum present */ + proto_tree_add_checksum(tree, tvb, offset, hf_cotp_checksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NOT_PRESENT); + } else { + guint32 calc_c0 = 0, calc_c1 = 0; - case CKSUM_OK: - /* - * Checksum is correct. - */ - s = tvb_get_ntohs(tvb, offset); - proto_tree_add_uint_format_value(tree, hf_cotp_checksum, tvb, offset, 2, - s, "0x%04x (correct)", s); - break; - - case CKSUM_NOT_OK: - /* - * Checksum is not correct. - */ - s = tvb_get_ntohs(tvb, offset); - proto_tree_add_uint_format_value(tree, hf_cotp_checksum, tvb, offset, 2, - s, "0x%04x (incorrect)", s); - break; + if (osi_calc_checksum(tvb, 0, length, &calc_c0, &calc_c1)) { + /* Successfully processed checksum, verify it */ + proto_tree_add_checksum(tree, tvb, offset, hf_cotp_checksum, -1, NULL, pinfo, calc_c0 | calc_c1, ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY|PROTO_CHECKSUM_ZERO); + } else { + proto_tree_add_checksum(tree, tvb, offset, hf_cotp_checksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); + } } + offset += length; vp_length -= length; break; @@ -2338,7 +2322,8 @@ void proto_register_cotp(void) { &hf_cotp_parameter_code, { "Parameter code", "cotp.parameter_code", FT_UINT8, BASE_HEX, VALS(tp_vpart_type_vals), 0x0, NULL, HFILL }}, { &hf_cotp_parameter_length, { "Parameter length", "cotp.parameter_length", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }}, { &hf_cotp_parameter_value, { "Parameter value", "cotp.parameter_value", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }}, - { &hf_cotp_atn_extended_checksum, { "ATN extended checksum", "cotp.atn_extended_checksum", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }}, + { &hf_cotp_atn_extended_checksum16, { "ATN extended checksum", "cotp.atn_extended_checksum", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }}, + { &hf_cotp_atn_extended_checksum32, { "ATN extended checksum", "cotp.atn_extended_checksum", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }}, { &hf_cotp_ack_time, { "Ack time (ms)", "cotp.ack_time", FT_UINT16, BASE_DEC, NULL, 0x0, NULL, HFILL }}, { &hf_cotp_res_error_rate_target_value, { "Residual error rate, target value", "cotp.res_error_rate.target_value", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }}, { &hf_cotp_res_error_rate_min_accept, { "Residual error rate, minimum acceptable", "cotp.res_error_rate.min_accept", FT_UINT8, BASE_DEC, NULL, 0x0, NULL, HFILL }}, diff --git a/epan/dissectors/packet-ospf.c b/epan/dissectors/packet-ospf.c index 9130fa1978..18e2bef340 100644 --- a/epan/dissectors/packet-ospf.c +++ b/epan/dissectors/packet-ospf.c @@ -1470,7 +1470,7 @@ dissect_ospf_lls_data_block(tvbuff_t *tvb, packet_info *pinfo, int offset, proto ospf_lls_data_block_tree = proto_tree_add_subtree(tree, tvb, offset, -1, ett_ospf_lls_data_block, NULL, "OSPF LLS Data Block"); /* TODO: verify checksum */ - proto_tree_add_item(ospf_lls_data_block_tree, hf_ospf_lls_checksum, tvb, offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_checksum(ospf_lls_data_block_tree, tvb, offset, hf_ospf_lls_checksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); proto_tree_add_uint_format_value(ospf_lls_data_block_tree, hf_ospf_lls_data_length, tvb, offset + 2, 2, ospf_lls_len, "%d bytes", ospf_lls_len); diff --git a/epan/dissectors/packet-pgm.c b/epan/dissectors/packet-pgm.c index cfb4cabd56..d97d1fe31b 100644 --- a/epan/dissectors/packet-pgm.c +++ b/epan/dissectors/packet-pgm.c @@ -148,7 +148,7 @@ static int hf_pgm_main_opts_netsig = -1; static int hf_pgm_main_opts_varlen = -1; static int hf_pgm_main_opts_parity = -1; static int hf_pgm_main_cksum = -1; -static int hf_pgm_main_cksum_bad = -1; +static int hf_pgm_main_cksum_status = -1; static int hf_pgm_main_gsi = -1; static int hf_pgm_main_tsdulen = -1; static int hf_pgm_spm_sqn = -1; @@ -910,30 +910,18 @@ dissect_pgm(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) if ((pgmhdr_type != PGM_RDATA_PCKT) && (pgmhdr_type != PGM_ODATA_PCKT) && (pgmhdr_cksum == 0)) { - proto_tree_add_uint_format_value(pgm_tree, hf_pgm_main_cksum, tvb, - ptvcursor_current_offset(cursor), 2, pgmhdr_cksum, "not available"); + proto_tree_add_checksum(pgm_tree, tvb, ptvcursor_current_offset(cursor), hf_pgm_main_cksum, hf_pgm_main_cksum_status, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NOT_PRESENT); } else { reportedlen = tvb_reported_length(tvb); pgmlen = tvb_captured_length(tvb); if (pgm_check_checksum && pgmlen >= reportedlen) { vec_t cksum_vec[1]; - guint16 computed_cksum; SET_CKSUM_VEC_TVB(cksum_vec[0], tvb, 0, pgmlen); - computed_cksum = in_cksum(&cksum_vec[0], 1); - if (computed_cksum == 0) { - proto_tree_add_uint_format_value(pgm_tree, hf_pgm_main_cksum, tvb, - ptvcursor_current_offset(cursor), 2, pgmhdr_cksum, "0x%04x [correct]", pgmhdr_cksum); - } else { - hidden_item = proto_tree_add_boolean(pgm_tree, hf_pgm_main_cksum_bad, tvb, - ptvcursor_current_offset(cursor), 2, TRUE); - PROTO_ITEM_SET_HIDDEN(hidden_item); - proto_tree_add_uint_format_value(pgm_tree, hf_pgm_main_cksum, tvb, - ptvcursor_current_offset(cursor), 2, pgmhdr_cksum, "0x%04x [incorrect, should be 0x%04x]", - pgmhdr_cksum, in_cksum_shouldbe(pgmhdr_cksum, computed_cksum)); - } + proto_tree_add_checksum(pgm_tree, tvb, ptvcursor_current_offset(cursor), hf_pgm_main_cksum_status, -1, NULL, pinfo, + in_cksum(&cksum_vec[0], 1), ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY|PROTO_CHECKSUM_IN_CKSUM); } else { - ptvcursor_add_no_advance(cursor, hf_pgm_main_cksum, 2, ENC_BIG_ENDIAN); + proto_tree_add_checksum(pgm_tree, tvb, ptvcursor_current_offset(cursor), hf_pgm_main_cksum, hf_pgm_main_cksum_status, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); } } ptvcursor_advance(cursor, 2); @@ -1120,9 +1108,9 @@ proto_register_pgm(void) { &hf_pgm_main_cksum, { "Checksum", "pgm.hdr.cksum", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }}, - { &hf_pgm_main_cksum_bad, - { "Bad Checksum", "pgm.hdr.cksum_bad", FT_BOOLEAN, BASE_NONE, - NULL, 0x0, NULL, HFILL }}, + { &hf_pgm_main_cksum_status, + { "Checksum Status", "pgm.hdr.cksum.status", FT_UINT8, BASE_NONE, + VALS(proto_checksum_vals), 0x0, NULL, HFILL }}, { &hf_pgm_main_gsi, { "Global Source Identifier", "pgm.hdr.gsi", FT_BYTES, BASE_NONE, NULL, 0x0, NULL, HFILL }}, diff --git a/epan/dissectors/packet-pim.c b/epan/dissectors/packet-pim.c index f2257dc8c2..1f216e6f54 100644 --- a/epan/dissectors/packet-pim.c +++ b/epan/dissectors/packet-pim.c @@ -327,12 +327,10 @@ dissect_pimv1(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U guint8 pim_type; guint8 pim_ver; guint length, pim_length; - guint16 pim_cksum, computed_cksum; vec_t cksum_vec[1]; proto_tree *pim_tree = NULL; proto_item *ti; proto_tree *pimopt_tree = NULL; - proto_item *ticksum; int offset = 0; col_set_str(pinfo->cinfo, COL_PROTOCOL, "PIMv1"); @@ -353,10 +351,10 @@ dissect_pimv1(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U proto_tree_add_uint(pim_tree, hf_pim_code, tvb, offset, 1, pim_type); offset += 1; - pim_cksum = tvb_get_ntohs(tvb, offset); - ticksum = proto_tree_add_item(pim_tree, hf_pim_cksum, tvb, offset, 2, ENC_BIG_ENDIAN); pim_ver = PIM_VER(tvb_get_guint8(tvb, offset + 2)); if (pim_ver != 1) { + proto_tree_add_checksum(pim_tree, tvb, offset, hf_pim_cksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); + /* * Not PIMv1; should we bother dissecting the PIM drafts * with a version number of 2 and with PIM running atop @@ -403,12 +401,10 @@ dissect_pimv1(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U * truncated, so we can checksum it. */ SET_CKSUM_VEC_TVB(cksum_vec[0], tvb, 0, pim_length); - computed_cksum = in_cksum(&cksum_vec[0], 1); - if (computed_cksum == 0) { - proto_item_append_text(ticksum, " [correct]"); - } else { - proto_item_append_text(ticksum, " [incorrect, should be 0x%04x]", in_cksum_shouldbe(pim_cksum, computed_cksum)); - } + proto_tree_add_checksum(pim_tree, tvb, offset, hf_pim_cksum, -1, NULL, pinfo, in_cksum(&cksum_vec[0], 1), + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY|PROTO_CHECKSUM_IN_CKSUM); + } else { + proto_tree_add_checksum(pim_tree, tvb, offset, hf_pim_cksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); } offset += 2; @@ -805,14 +801,13 @@ dissect_pim(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) guint8 pim_typever; guint8 pim_bidir_subtype = 0; guint length, pim_length; - guint16 pim_cksum, computed_cksum; vec_t cksum_vec[4]; guint32 phdr[2]; const char *typestr; proto_tree *pim_tree = NULL; proto_item *ti; proto_tree *pimopt_tree = NULL; - proto_item *tiopt, *ticksum; + proto_item *tiopt; col_set_str(pinfo->cinfo, COL_PROTOCOL, "PIM"); col_clear(pinfo->cinfo, COL_INFO); @@ -846,10 +841,9 @@ dissect_pim(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) else { proto_tree_add_item(pim_tree, hf_pim_res_bytes, tvb, offset + 1, 1, ENC_NA); } - pim_cksum = tvb_get_ntohs(tvb, offset + 2); - ticksum = proto_tree_add_item(pim_tree, hf_pim_cksum, tvb, offset + 2, 2, ENC_BIG_ENDIAN); if (PIM_VER(pim_typever) != 2) { + proto_tree_add_checksum(pim_tree, tvb, offset+2, hf_pim_cksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); /* * We don't know this version, so we don't know how much of the * packet the checksum covers. @@ -891,7 +885,8 @@ dissect_pim(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) switch (pinfo->src.type) { case AT_IPv4: SET_CKSUM_VEC_TVB(cksum_vec[0], tvb, 0, pim_length); - computed_cksum = in_cksum(&cksum_vec[0], 1); + proto_tree_add_checksum(pim_tree, tvb, offset+2, hf_pim_cksum, -1, NULL, pinfo, in_cksum(&cksum_vec[0], 1), + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY|PROTO_CHECKSUM_IN_CKSUM); break; case AT_IPv6: /* Set up the fields of the pseudo-header. */ @@ -901,20 +896,16 @@ dissect_pim(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) phdr[1] = g_htonl(IP_PROTO_PIM); SET_CKSUM_VEC_PTR(cksum_vec[2], (const guint8 *)&phdr, 8); SET_CKSUM_VEC_TVB(cksum_vec[3], tvb, 0, pim_length); - computed_cksum = in_cksum(&cksum_vec[0], 4); + proto_tree_add_checksum(pim_tree, tvb, offset+2, hf_pim_cksum, -1, NULL, pinfo, in_cksum(&cksum_vec[0], 4), + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY|PROTO_CHECKSUM_IN_CKSUM); break; default: /* PIM is available for IPv4 and IPv6 right now */ DISSECTOR_ASSERT_NOT_REACHED(); break; } - - if (computed_cksum == 0) { - proto_item_append_text(ticksum, " [correct]"); - - } else { - proto_item_append_text(ticksum, " [incorrect, should be 0x%04x]", in_cksum_shouldbe(pim_cksum, computed_cksum)); - } + } else { + proto_tree_add_checksum(pim_tree, tvb, offset+2, hf_pim_cksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); } offset += 4; diff --git a/epan/dissectors/packet-ppp.c b/epan/dissectors/packet-ppp.c index 7a38f177ff..a3ca67883b 100644 --- a/epan/dissectors/packet-ppp.c +++ b/epan/dissectors/packet-ppp.c @@ -1829,9 +1829,6 @@ decode_fcs(tvbuff_t *tvb, proto_tree *fh_tree, int fcs_decode, int proto_offset) { tvbuff_t *next_tvb; gint len, reported_len; - int rx_fcs_offset; - guint32 rx_fcs_exp; - guint32 rx_fcs_got; /* * Remove the FCS, if any, from the packet data. @@ -1880,17 +1877,8 @@ decode_fcs(tvbuff_t *tvb, proto_tree *fh_tree, int fcs_decode, int proto_offset) /* * Compute the FCS and put it into the tree. */ - rx_fcs_offset = proto_offset + len; - rx_fcs_exp = fcs16(tvb); - rx_fcs_got = tvb_get_letohs(tvb, rx_fcs_offset); - if (rx_fcs_got != rx_fcs_exp) { - proto_tree_add_uint_format_value(fh_tree, hf_ppp_fcs_16, tvb, rx_fcs_offset, 2, - rx_fcs_got, "0x%04x [incorrect, should be 0x%04x]", - rx_fcs_got, rx_fcs_exp); - } else { - proto_tree_add_uint_format_value(fh_tree, hf_ppp_fcs_16, tvb, rx_fcs_offset, 2, - rx_fcs_got, "0x%04x [correct]", rx_fcs_got); - } + proto_tree_add_checksum(fh_tree, tvb, proto_offset + len, hf_ppp_fcs_16, -1, NULL, NULL, fcs16(tvb), + ENC_LITTLE_ENDIAN, PROTO_CHECKSUM_VERIFY); } break; @@ -1931,17 +1919,8 @@ decode_fcs(tvbuff_t *tvb, proto_tree *fh_tree, int fcs_decode, int proto_offset) /* * Compute the FCS and put it into the tree. */ - rx_fcs_offset = proto_offset + len; - rx_fcs_exp = fcs32(tvb); - rx_fcs_got = tvb_get_letohl(tvb, rx_fcs_offset); - if (rx_fcs_got != rx_fcs_exp) { - proto_tree_add_uint_format_value(fh_tree, hf_ppp_fcs_32, tvb, rx_fcs_offset, 4, - rx_fcs_got, "0x%08x [incorrect, should be 0x%08x]", - rx_fcs_got, rx_fcs_exp); - } else { - proto_tree_add_uint_format_value(fh_tree, hf_ppp_fcs_32, tvb, rx_fcs_offset, 4, - rx_fcs_got, "0x%08x [correct]", rx_fcs_got); - } + proto_tree_add_checksum(fh_tree, tvb, proto_offset + len, hf_ppp_fcs_32, -1, NULL, NULL, fcs32(tvb), + ENC_LITTLE_ENDIAN, PROTO_CHECKSUM_VERIFY); } break; diff --git a/epan/dissectors/packet-quake2.c b/epan/dissectors/packet-quake2.c index 10a0297f7e..5ca865a874 100644 --- a/epan/dissectors/packet-quake2.c +++ b/epan/dissectors/packet-quake2.c @@ -137,7 +137,6 @@ dissect_quake2_client_commands_move(tvbuff_t *tvb, packet_info *pinfo _U_, #define BUTTON_USE 2 #define BUTTON_ANY 128 - guint8 chksum; guint32 lastframe; int i, offset = 0; enum { Q_OFFSET, Q_VALUE, Q_SIZE }; @@ -151,7 +150,6 @@ dissect_quake2_client_commands_move(tvbuff_t *tvb, packet_info *pinfo _U_, guint8 impulse[Q_SIZE]; } move[MOVES+1]; - chksum = tvb_get_guint8(tvb, offset); offset++; lastframe = tvb_get_letohl(tvb, offset); offset += 4; @@ -212,8 +210,7 @@ dissect_quake2_client_commands_move(tvbuff_t *tvb, packet_info *pinfo _U_, if (!tree) return offset; - proto_tree_add_uint(tree, hf_quake2_game_client_command_move_chksum, tvb, - 0, 1, chksum); + proto_tree_add_checksum(tree, tvb, 0, hf_quake2_game_client_command_move_chksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); proto_tree_add_uint(tree, hf_quake2_game_client_command_move_lframe, tvb, 1, 4, lastframe); diff --git a/epan/dissectors/packet-rdm.c b/epan/dissectors/packet-rdm.c index 105379fc77..19b8ee5e9b 100644 --- a/epan/dissectors/packet-rdm.c +++ b/epan/dissectors/packet-rdm.c @@ -540,8 +540,7 @@ static int hf_rdm_parameter_data = -1; static int hf_rdm_parameter_data_raw = -1; static int hf_rdm_intron = -1; static int hf_rdm_checksum = -1; -static int hf_rdm_checksum_good = -1; -static int hf_rdm_checksum_bad = -1; +static int hf_rdm_checksum_status = -1; static int hf_rdm_trailer = -1; static int hf_rdm_pd_device_label = -1; @@ -2051,9 +2050,7 @@ dissect_rdm(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) gint padding_size; guint16 man_id; guint32 dev_id; - guint message_length, checksum, checksum_shouldbe, offset = 0; - proto_item *item; - proto_tree *checksum_tree; + guint message_length, offset = 0; proto_tree *ti = proto_tree_add_item(tree, proto_rdm, tvb, offset, -1, ENC_NA); @@ -2096,32 +2093,8 @@ dissect_rdm(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) offset += padding_size; } - checksum_shouldbe = rdm_checksum(tvb, offset); - checksum = tvb_get_ntohs(tvb, offset); - item = proto_tree_add_item(rdm_tree, hf_rdm_checksum, tvb, - offset, 2, ENC_BIG_ENDIAN); - if (checksum == checksum_shouldbe) { - proto_item_append_text(item, " [correct]"); - - checksum_tree = proto_item_add_subtree(item, ett_rdm); - item = proto_tree_add_boolean(checksum_tree, hf_rdm_checksum_good, tvb, - offset, 2, TRUE); - PROTO_ITEM_SET_GENERATED(item); - item = proto_tree_add_boolean(checksum_tree, hf_rdm_checksum_bad, tvb, - offset, 2, FALSE); - PROTO_ITEM_SET_GENERATED(item); - } else { - proto_item_append_text(item, " [incorrect, should be 0x%04x]", checksum_shouldbe); - - checksum_tree = proto_item_add_subtree(item, ett_rdm); - item = proto_tree_add_boolean(checksum_tree, hf_rdm_checksum_good, tvb, - offset, 2, FALSE); - PROTO_ITEM_SET_GENERATED(item); - item = proto_tree_add_boolean(checksum_tree, hf_rdm_checksum_bad, tvb, - offset, 2, TRUE); - PROTO_ITEM_SET_GENERATED(item); - } - + proto_tree_add_checksum(rdm_tree, tvb, offset, hf_rdm_checksum, hf_rdm_checksum_status, NULL, pinfo, rdm_checksum(tvb, offset), + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); offset += 2; if (offset < tvb_reported_length(tvb)) @@ -2220,15 +2193,10 @@ proto_register_rdm(void) FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }}, - { &hf_rdm_checksum_good, - { "Good Checksum", "rdm.checksum_good", - FT_BOOLEAN, BASE_NONE, NULL, 0x0, - "True: checksum matches packet content; False: doesn't match content", HFILL }}, - - { &hf_rdm_checksum_bad, - { "Bad Checksum", "rdm.checksum_bad", - FT_BOOLEAN, BASE_NONE, NULL, 0x0, - "True: checksum doesn't match packet content; False: matches content", HFILL }}, + { &hf_rdm_checksum_status, + { "Checksum Status", "rdm.checksum.status", + FT_UINT8, BASE_NONE, VALS(proto_checksum_vals), 0x0, + NULL, HFILL }}, { &hf_rdm_trailer, { "Trailer", "rdm.trailer", diff --git a/epan/dissectors/packet-rfid-pn532-hci.c b/epan/dissectors/packet-rfid-pn532-hci.c index d85b3ed283..cbc3f2e475 100644 --- a/epan/dissectors/packet-rfid-pn532-hci.c +++ b/epan/dissectors/packet-rfid-pn532-hci.c @@ -137,15 +137,13 @@ dissect_pn532_hci(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *dat call_dissector_with_data(pn532_handle, next_tvb, pinfo, tree, usb_conv_info); offset += length; - proto_tree_add_item(main_tree, hf_data_checksum, tvb, offset, 1, ENC_BIG_ENDIAN); checksum = tvb_get_guint8(tvb, offset); while (length) { checksum += tvb_get_guint8(tvb, offset - length); length -= 1; } - if (checksum != 0) { - proto_tree_add_expert(main_tree, pinfo, &ei_invalid_data_checksum, tvb, offset, 1); - } + proto_tree_add_checksum(main_tree, tvb, offset, hf_data_checksum, -1, &ei_invalid_data_checksum, pinfo, 0, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY|PROTO_CHECKSUM_ZERO); offset += 1; } else { /* Normal Information Frame */ col_set_str(pinfo->cinfo, COL_INFO, "Normal Information Frame"); diff --git a/epan/dissectors/packet-rgmp.c b/epan/dissectors/packet-rgmp.c index 5cf1f361cc..dc0401d22b 100644 --- a/epan/dissectors/packet-rgmp.c +++ b/epan/dissectors/packet-rgmp.c @@ -39,7 +39,7 @@ static int proto_rgmp = -1; static int hf_type = -1; static int hf_reserved = -1; static int hf_checksum = -1; -static int hf_checksum_bad = -1; +static int hf_checksum_status = -1; static int hf_maddr = -1; static int ett_rgmp = -1; @@ -86,7 +86,7 @@ dissect_rgmp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree, void* d proto_tree_add_item(tree, hf_reserved, tvb, offset, 1, ENC_NA); offset += 1; - igmp_checksum(tree, tvb, hf_checksum, hf_checksum_bad, pinfo, 0); + igmp_checksum(tree, tvb, hf_checksum, hf_checksum_status, pinfo, 0); offset += 2; proto_tree_add_item(tree, hf_maddr, tvb, offset, 4, ENC_BIG_ENDIAN); @@ -115,9 +115,9 @@ proto_register_rgmp(void) NULL, 0, NULL, HFILL } }, - { &hf_checksum_bad, - { "Bad Checksum", "rgmp.checksum_bad", FT_BOOLEAN, BASE_NONE, - NULL, 0x0, NULL, HFILL } + { &hf_checksum_status, + { "Checksum Status", "rgmp.checksum.status", FT_UINT8, BASE_NONE, + VALS(proto_checksum_vals), 0x0, NULL, HFILL } }, { &hf_maddr, diff --git a/epan/dissectors/packet-rohc.c b/epan/dissectors/packet-rohc.c index bcfcbc0434..5647fddb72 100644 --- a/epan/dissectors/packet-rohc.c +++ b/epan/dissectors/packet-rohc.c @@ -1461,7 +1461,7 @@ dissect_rohc_ir_rtp_profile_dynamic(tvbuff_t *tvb, packet_info *pinfo, proto_tre dynamic_udp_tree = proto_item_add_subtree(root_ti, ett_rohc_dynamic_udp); id = tvb_get_ntohs(tvb, offset); rohc_cid_context->udp_checksum_present = id ? TRUE : FALSE; - proto_tree_add_item(dynamic_udp_tree, hf_rohc_dynamic_udp_checksum, tvb, offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_checksum(dynamic_udp_tree, tvb, offset, hf_rohc_dynamic_udp_checksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); offset +=2; proto_item_set_len(item, offset - start_offset); } @@ -2334,7 +2334,7 @@ start_over: /* UDP Checksum */ if (rohc_cid_context->udp_checksum_present) { - proto_tree_add_item(rohc_tree, hf_rohc_udp_checksum, tvb, offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_checksum(rohc_tree, tvb, offset, hf_rohc_udp_checksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); offset += 2; } diff --git a/epan/dissectors/packet-roofnet.c b/epan/dissectors/packet-roofnet.c index 236f496075..23563f999b 100644 --- a/epan/dissectors/packet-roofnet.c +++ b/epan/dissectors/packet-roofnet.c @@ -116,7 +116,9 @@ static void dissect_roofnet_header(proto_tree *tree, tvbuff_t *tvb, guint *offse ptvcursor_add(cursor, hf_roofnet_nlinks, 1, ENC_BIG_ENDIAN); ptvcursor_add(cursor, hf_roofnet_next, 1, ENC_BIG_ENDIAN); ptvcursor_add(cursor, hf_roofnet_ttl, 2, ENC_BIG_ENDIAN); - ptvcursor_add(cursor, hf_roofnet_cksum, 2, ENC_BIG_ENDIAN); + proto_tree_add_checksum(ptvcursor_tree(cursor), ptvcursor_tvbuff(cursor), ptvcursor_current_offset(cursor), + hf_roofnet_cksum, -1, NULL, NULL, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); + ptvcursor_advance(cursor, 2); ptvcursor_add(cursor, hf_roofnet_flags, 2, ENC_BIG_ENDIAN); ptvcursor_add(cursor, hf_roofnet_data_length, 2, ENC_BIG_ENDIAN); ptvcursor_add(cursor, hf_roofnet_query_dst, 4, ENC_BIG_ENDIAN); diff --git a/epan/dissectors/packet-rtp-midi.c b/epan/dissectors/packet-rtp-midi.c index ace94643c8..5eb601506d 100644 --- a/epan/dissectors/packet-rtp-midi.c +++ b/epan/dissectors/packet-rtp-midi.c @@ -2528,7 +2528,7 @@ static int hf_rtp_midi_controller_value = -1; static int hf_rtp_midi_program = -1; static int hf_rtp_midi_channel_pressure = -1; static int hf_rtp_midi_pitch_bend = -1; -static int hf_rtp_midi_pitch_bend_truncated = -1; +/* static int hf_rtp_midi_pitch_bend_truncated = -1; */ static int hf_rtp_midi_manu_short = -1; static int hf_rtp_midi_manu_long = -1; @@ -2733,7 +2733,7 @@ static int hf_rtp_midi_sj_chapter_x_invalid_data = -1; static int hf_rtp_midi_quarter_frame_type = -1; static int hf_rtp_midi_quarter_frame_value = -1; -static int hf_rtp_midi_spp_truncated = -1; +/* static int hf_rtp_midi_spp_truncated = -1; */ static int hf_rtp_midi_spp = -1; static int hf_rtp_midi_song_select = -1; static int hf_rtp_midi_manu_data = -1; @@ -3515,7 +3515,7 @@ decode_sysex_common_nrt_fd( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *t offset += ( data_len - 1 ); } - proto_tree_add_item( tree, hf_rtp_midi_sysex_common_nrt_fd_checksum, tvb, offset, 1, ENC_BIG_ENDIAN ); + proto_tree_add_checksum(tree, tvb, offset, hf_rtp_midi_sysex_common_nrt_fd_checksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); offset++; } else if ( sub_id == RTP_MIDI_SYSEX_COMMON_NRT_FD_REQUEST ) { @@ -3589,7 +3589,7 @@ decode_sysex_common_tuning( tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *t } /* checksum */ - proto_tree_add_item( tree, hf_rtp_midi_sysex_common_tune_checksum, tvb, offset, 1, ENC_BIG_ENDIAN ); + proto_tree_add_checksum(tree, tvb, offset, hf_rtp_midi_sysex_common_tune_checksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); offset++; } else if ( sub_id == RTP_MIDI_SYSEX_COMMON_TUNING_NOTE_CHANGE ) { @@ -6599,6 +6599,7 @@ proto_register_rtp_midi( void ) NULL, HFILL } }, +#if 0 { &hf_rtp_midi_pitch_bend_truncated, { @@ -6611,6 +6612,7 @@ proto_register_rtp_midi( void ) NULL, HFILL } }, +#endif { &hf_rtp_midi_manu_short, { @@ -8939,6 +8941,7 @@ proto_register_rtp_midi( void ) NULL, HFILL } }, +#if 0 { &hf_rtp_midi_spp_truncated, { @@ -8951,6 +8954,7 @@ proto_register_rtp_midi( void ) NULL, HFILL } }, +#endif { &hf_rtp_midi_song_select, { diff --git a/epan/dissectors/packet-rtps.c b/epan/dissectors/packet-rtps.c index 8d6664fe8d..5869579db5 100644 --- a/epan/dissectors/packet-rtps.c +++ b/epan/dissectors/packet-rtps.c @@ -5477,8 +5477,8 @@ static gboolean dissect_parameter_sequence_v1(proto_tree *rtps_parameter_tree, p case PID_TYPE_CHECKSUM: ENSURE_LENGTH(4); - proto_tree_add_item(rtps_parameter_tree, hf_rtps_type_checksum, tvb, offset, 4, - little_endian ? ENC_LITTLE_ENDIAN : ENC_BIG_ENDIAN); + proto_tree_add_checksum(rtps_parameter_tree, tvb, offset, hf_rtps_type_checksum, -1, NULL, pinfo, 0, + little_endian ? ENC_LITTLE_ENDIAN : ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); break; case PID_EXPECTS_ACK: diff --git a/epan/dissectors/packet-rudp.c b/epan/dissectors/packet-rudp.c index 2f0b12109f..ea8d25f5ed 100644 --- a/epan/dissectors/packet-rudp.c +++ b/epan/dissectors/packet-rudp.c @@ -116,7 +116,7 @@ dissect_rudp(tvbuff_t *tvb, packet_info *pinfo _U_ , proto_tree *tree, void* dat /* If the header is more than 4 bytes the next 2 bytes are the checksum */ if (hlen > 4) { - proto_tree_add_item(rudp_tree, hf_rudp_cksum, tvb, 4, 2, ENC_BIG_ENDIAN); + proto_tree_add_checksum(rudp_tree, tvb, 4, hf_rudp_cksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); } /* If we have even more bytes their meaning is unknown - we have seen this diff --git a/epan/dissectors/packet-s7comm.c b/epan/dissectors/packet-s7comm.c index 2ab5e102a1..5b1dccbe17 100644 --- a/epan/dissectors/packet-s7comm.c +++ b/epan/dissectors/packet-s7comm.c @@ -4438,7 +4438,7 @@ s7comm_decode_ud_block_subfunc(tvbuff_t *tvb, offset += 1; proto_tree_add_item(data_tree, hf_s7comm_ud_blockinfo_res_unknown, tvb, offset, 1, ENC_NA); offset += 1; - proto_tree_add_item(data_tree, hf_s7comm_ud_blockinfo_checksum, tvb, offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_checksum(data_tree, tvb, offset, hf_s7comm_ud_blockinfo_checksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); offset += 2; proto_tree_add_item(data_tree, hf_s7comm_ud_blockinfo_reserved1, tvb, offset, 4, ENC_BIG_ENDIAN); offset += 4; diff --git a/epan/dissectors/packet-sbus.c b/epan/dissectors/packet-sbus.c index f5b947da17..f761eff181 100644 --- a/epan/dissectors/packet-sbus.c +++ b/epan/dissectors/packet-sbus.c @@ -240,7 +240,7 @@ static int hf_sbus_week_day = -1; static int hf_sbus_date = -1; static int hf_sbus_time = -1; static int hf_sbus_crc = -1; -static int hf_sbus_crc_bad = -1; +static int hf_sbus_crc_status = -1; static int hf_sbus_flags_accu = -1; static int hf_sbus_flags_error = -1; static int hf_sbus_flags_negative = -1; @@ -650,7 +650,7 @@ dissect_sbus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_ { /* Set up structures needed to add the protocol subtree and manage it */ - proto_item *ti, *hi, *cs; + proto_item *ti, *hi; proto_tree *sbus_tree, *ethsbus_tree, *sbusdata_tree; gint i; /*for CRC calculation*/ @@ -1855,22 +1855,9 @@ dissect_sbus(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_ sbus_crc_calc = 0; for (i = 0; i < sbus_eth_len - 2; i++) sbus_crc_calc = crc_calc (sbus_crc_calc, tvb_get_guint8(tvb, i)); - /*Show CRC and add hidden item for wrong CRC*/ - sbus_helper = tvb_get_ntohs(tvb, offset); - if (sbus_helper == sbus_crc_calc) { - proto_tree_add_uint_format_value(sbus_tree, - hf_sbus_crc, tvb, offset, 2, sbus_helper, - "0x%04x (correct)", sbus_helper); - } else { - cs = proto_tree_add_uint_format_value(sbus_tree, - hf_sbus_crc, tvb, offset, 2, sbus_helper, - "0x%04x (NOT correct)", sbus_helper); - expert_add_info(pinfo, cs, &ei_sbus_crc_bad); - hi = proto_tree_add_boolean(sbus_tree, - hf_sbus_crc_bad, tvb, offset, 2, TRUE); - PROTO_ITEM_SET_HIDDEN(hi); - PROTO_ITEM_SET_GENERATED(hi); - } + + proto_tree_add_checksum(sbus_tree, tvb, offset, hf_sbus_crc, hf_sbus_crc_status, &ei_sbus_crc_bad, pinfo, sbus_crc_calc, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); offset += 2; /*now at the end of the telegram*/ } return offset; @@ -2231,10 +2218,10 @@ proto_register_sbus(void) "CRC 16", HFILL } }, - { &hf_sbus_crc_bad, - { "Bad Checksum", "sbus.crc_bad", - FT_BOOLEAN, BASE_NONE, NULL, 0x0, - "A bad checksum in the telegram", HFILL }}, + { &hf_sbus_crc_status, + { "Checksum Status", "sbus.crc.status", + FT_UINT8, BASE_NONE, VALS(proto_checksum_vals), 0x0, + NULL, HFILL }}, { &hf_sbus_flags_accu, { "ACCU", "sbus.flags.accu", diff --git a/epan/dissectors/packet-sctp.c b/epan/dissectors/packet-sctp.c index 106a1e954b..8c7a8ba36a 100644 --- a/epan/dissectors/packet-sctp.c +++ b/epan/dissectors/packet-sctp.c @@ -94,7 +94,9 @@ static int hf_source_port = -1; static int hf_destination_port = -1; static int hf_verification_tag = -1; static int hf_checksum = -1; -static int hf_checksum_bad = -1; +static int hf_checksum_adler = -1; +static int hf_checksum_crc32c = -1; +static int hf_checksum_status = -1; static int hf_chunk_type = -1; static int hf_chunk_flags = -1; @@ -272,7 +274,6 @@ static int exported_pdu_tap = -1; /* Initialize the subtree pointers */ static gint ett_sctp = -1; -static gint ett_sctp_checksum = -1; static gint ett_sctp_chunk = -1; static gint ett_sctp_chunk_parameter = -1; static gint ett_sctp_chunk_cause = -1; @@ -4573,8 +4574,8 @@ dissect_sctp_packet(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gboolea guint16 source_port, destination_port; guint captured_length, reported_length; gboolean crc32c_correct = FALSE, adler32_correct = FALSE; - proto_item *sctp_item, *hidden_item, *item; - proto_tree *sctp_tree, *checksum_tree; + proto_item *sctp_item, *hidden_item; + proto_tree *sctp_tree; guint32 vtag; sctp_half_assoc_t *ha = NULL; proto_item *pi, *vt = NULL; @@ -4654,58 +4655,36 @@ dissect_sctp_packet(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gboolea switch(sctp_checksum) { case SCTP_CHECKSUM_NONE: - proto_tree_add_uint_format_value(sctp_tree, hf_checksum, tvb, CHECKSUM_OFFSET, CHECKSUM_LENGTH, checksum, "0x%08x (not verified)", checksum); + proto_tree_add_checksum(sctp_tree, tvb, CHECKSUM_OFFSET, hf_checksum, hf_checksum_status, &ei_sctp_bad_sctp_checksum, pinfo, 0, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); break; case SCTP_CHECKSUM_ADLER32: - if (adler32_correct) - item = proto_tree_add_uint_format_value(sctp_tree, hf_checksum, tvb, CHECKSUM_OFFSET, CHECKSUM_LENGTH, - checksum, "0x%08x [correct Adler32]", checksum); - else { - item = proto_tree_add_uint_format_value(sctp_tree, hf_checksum, tvb, CHECKSUM_OFFSET, CHECKSUM_LENGTH, checksum, - "0x%08x [incorrect Adler32, should be 0x%08x]", - checksum, calculated_adler32); - expert_add_info(pinfo, item, &ei_sctp_bad_sctp_checksum); - } - checksum_tree = proto_item_add_subtree(item, ett_sctp_checksum); - proto_tree_add_boolean(checksum_tree, hf_checksum_bad, tvb, CHECKSUM_OFFSET, CHECKSUM_LENGTH, !(adler32_correct)); + proto_tree_add_checksum(sctp_tree, tvb, CHECKSUM_OFFSET, hf_checksum_adler, hf_checksum_status, &ei_sctp_bad_sctp_checksum, pinfo, calculated_adler32, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); break; case SCTP_CHECKSUM_CRC32C: - if (crc32c_correct) - item = proto_tree_add_uint_format_value(sctp_tree, hf_checksum, tvb, CHECKSUM_OFFSET, CHECKSUM_LENGTH, - checksum, "0x%08x [correct CRC32C]", checksum); - else { - item = proto_tree_add_uint_format_value(sctp_tree, hf_checksum, tvb, CHECKSUM_OFFSET, CHECKSUM_LENGTH, checksum, - "0x%08x [incorrect CRC32C, should be 0x%08x]", - checksum, calculated_crc32c); - expert_add_info(pinfo, item, &ei_sctp_bad_sctp_checksum); - } - checksum_tree = proto_item_add_subtree(item, ett_sctp_checksum); - proto_tree_add_boolean(checksum_tree, hf_checksum_bad, tvb, CHECKSUM_OFFSET, CHECKSUM_LENGTH, !(crc32c_correct)); + proto_tree_add_checksum(sctp_tree, tvb, CHECKSUM_OFFSET, hf_checksum_crc32c, hf_checksum_status, &ei_sctp_bad_sctp_checksum, pinfo, calculated_crc32c, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); break; case SCTP_CHECKSUM_AUTOMATIC: if ((adler32_correct) && !(crc32c_correct)) - item = proto_tree_add_uint_format_value(sctp_tree, hf_checksum, tvb, CHECKSUM_OFFSET, CHECKSUM_LENGTH, - checksum, "0x%08x [correct Adler32]", checksum); + proto_tree_add_checksum(sctp_tree, tvb, CHECKSUM_OFFSET, hf_checksum_adler, hf_checksum_status, &ei_sctp_bad_sctp_checksum, pinfo, calculated_adler32, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); else if ((!adler32_correct) && (crc32c_correct)) - item = proto_tree_add_uint_format_value(sctp_tree, hf_checksum, tvb, CHECKSUM_OFFSET, CHECKSUM_LENGTH, - checksum, "0x%08x [correct CRC32C]", checksum); - else if ((adler32_correct) && (crc32c_correct)) - item = proto_tree_add_uint_format_value(sctp_tree, hf_checksum, tvb, CHECKSUM_OFFSET, CHECKSUM_LENGTH, - checksum, "0x%08x [correct Adler32 and CRC32C]", checksum); + proto_tree_add_checksum(sctp_tree, tvb, CHECKSUM_OFFSET, hf_checksum_crc32c, hf_checksum_status, &ei_sctp_bad_sctp_checksum, pinfo, calculated_crc32c, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); else { - item = proto_tree_add_uint_format_value(sctp_tree, hf_checksum, tvb, CHECKSUM_OFFSET, CHECKSUM_LENGTH, checksum, - "0x%08x [incorrect, should be 0x%08x (Adler32) or 0x%08x (CRC32C)]", - checksum, calculated_adler32, calculated_crc32c); - expert_add_info(pinfo, item, &ei_sctp_bad_sctp_checksum); + proto_tree_add_checksum(sctp_tree, tvb, CHECKSUM_OFFSET, hf_checksum_adler, hf_checksum_status, &ei_sctp_bad_sctp_checksum, pinfo, calculated_adler32, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); + proto_tree_add_checksum(sctp_tree, tvb, CHECKSUM_OFFSET, hf_checksum_crc32c, hf_checksum_status, &ei_sctp_bad_sctp_checksum, pinfo, calculated_crc32c, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); } - checksum_tree = proto_item_add_subtree(item, ett_sctp_checksum); - proto_tree_add_boolean(checksum_tree, hf_checksum_bad, tvb, CHECKSUM_OFFSET, CHECKSUM_LENGTH, !(crc32c_correct || adler32_correct)); break; } } else { /* We don't have the whole packet so we can't verify the checksum */ - proto_tree_add_uint_format_value(sctp_tree, hf_checksum, tvb, CHECKSUM_OFFSET, CHECKSUM_LENGTH, - checksum, "0x%08x [unchecked, not all data available]", checksum); + proto_tree_add_checksum(sctp_tree, tvb, CHECKSUM_OFFSET, hf_checksum, hf_checksum_status, &ei_sctp_bad_sctp_checksum, pinfo, 0, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); } /* add all chunks of the sctp datagram to the protocol tree */ @@ -4789,7 +4768,9 @@ proto_register_sctp(void) { &hf_port, { "Port", "sctp.port", FT_UINT16, BASE_PT_SCTP, NULL, 0x0, NULL, HFILL } }, { &hf_verification_tag, { "Verification tag", "sctp.verification_tag", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } }, { &hf_checksum, { "Checksum", "sctp.checksum", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } }, - { &hf_checksum_bad, { "Bad checksum", "sctp.checksum_bad", FT_BOOLEAN, BASE_NONE, NULL, 0x0, NULL, HFILL } }, + { &hf_checksum_adler, { "Checksum (Adler)", "sctp.checksum", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } }, + { &hf_checksum_crc32c, { "Checksum (CRC32C)", "sctp.checksum", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL } }, + { &hf_checksum_status, { "Checksum Status", "sctp.checksum.status", FT_UINT8, BASE_NONE, VALS(proto_checksum_vals), 0x0, NULL, HFILL } }, { &hf_chunk_type, { "Chunk type", "sctp.chunk_type", FT_UINT8, BASE_DEC, VALS(chunk_type_values), 0x0, NULL, HFILL } }, { &hf_chunk_flags, { "Chunk flags", "sctp.chunk_flags", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL } }, { &hf_chunk_bit_1, { "Bit", "sctp.chunk_bit_1", FT_BOOLEAN, 8, TFS(&sctp_chunk_bit_1_value), SCTP_CHUNK_BIT_1, NULL, HFILL } }, @@ -4944,7 +4925,6 @@ proto_register_sctp(void) /* Setup protocol subtree array */ static gint *ett[] = { &ett_sctp, - &ett_sctp_checksum, &ett_sctp_chunk, &ett_sctp_chunk_parameter, &ett_sctp_chunk_cause, diff --git a/epan/dissectors/packet-selfm.c b/epan/dissectors/packet-selfm.c index d706c7ace9..4497736324 100644 --- a/epan/dissectors/packet-selfm.c +++ b/epan/dissectors/packet-selfm.c @@ -1103,10 +1103,9 @@ dissect_relaydef_frame(tvbuff_t *tvb, proto_tree *tree, int offset) offset += 1; } - proto_tree_add_item(relaydef_tree, hf_selfm_checksum, tvb, offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_checksum(relaydef_tree, tvb, offset, hf_selfm_checksum, -1, NULL, NULL, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); return tvb_reported_length(tvb); - } /******************************************************************************************************/ @@ -1208,7 +1207,7 @@ dissect_fmconfig_frame(tvbuff_t *tvb, proto_tree *tree, int offset) offset += 1; } - proto_tree_add_item(fmconfig_tree, hf_selfm_checksum, tvb, offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_checksum(fmconfig_tree, tvb, offset, hf_selfm_checksum, -1, NULL, NULL, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); return tvb_reported_length(tvb); @@ -1424,7 +1423,7 @@ dissect_fmdata_frame(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, int of offset += 1; } - proto_tree_add_item(fmdata_tree, hf_selfm_checksum, tvb, offset, 1, ENC_BIG_ENDIAN); + proto_tree_add_checksum(fmdata_tree, tvb, offset, hf_selfm_checksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); } /* matching config frame message was found */ @@ -1517,8 +1516,7 @@ dissect_foconfig_frame(tvbuff_t *tvb, proto_tree *tree, int offset) offset += 1; } - proto_tree_add_item(foconfig_tree, hf_selfm_checksum, tvb, offset, 1, ENC_BIG_ENDIAN); - + proto_tree_add_checksum(foconfig_tree, tvb, offset, hf_selfm_checksum, -1, NULL, NULL, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); return tvb_reported_length(tvb); @@ -1606,8 +1604,8 @@ dissect_fastop_frame(tvbuff_t *tvb, proto_tree *tree, packet_info *pinfo, int of proto_tree_add_item(fastop_tree, hf_selfm_fastop_valid, tvb, offset, 1, ENC_BIG_ENDIAN); offset += 1; - /* Add checksum */ - proto_tree_add_item(fastop_tree, hf_selfm_checksum, tvb, offset, 1, ENC_BIG_ENDIAN); + /* Add checksum */ + proto_tree_add_checksum(fastop_tree, tvb, offset, hf_selfm_checksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); return tvb_reported_length(tvb); diff --git a/epan/dissectors/packet-shim6.c b/epan/dissectors/packet-shim6.c index 6393f088b3..bb88dbdaf2 100644 --- a/epan/dissectors/packet-shim6.c +++ b/epan/dissectors/packet-shim6.c @@ -102,8 +102,7 @@ static int hf_shim6_ct = -1; static int hf_shim6_type = -1; static int hf_shim6_proto = -1; static int hf_shim6_checksum = -1; -static int hf_shim6_checksum_bad = -1; -static int hf_shim6_checksum_good = -1; +static int hf_shim6_checksum_status= -1; static int hf_shim6_inonce = -1; /* also for request nonce */ static int hf_shim6_rnonce = -1; static int hf_shim6_reserved = -1; @@ -563,26 +562,6 @@ static const value_string shimctrlvals[] = { { 0, NULL } }; -static void -add_shim6_checksum_additional_info(tvbuff_t * tvb, packet_info * pinfo, - proto_item * it_cksum, int offset, gboolean is_cksum_correct) -{ - proto_tree *checksum_tree; - proto_item *item; - - checksum_tree = proto_item_add_subtree(it_cksum, ett_shim6_cksum); - item = proto_tree_add_boolean(checksum_tree, hf_shim6_checksum_good, tvb, - offset, 2, is_cksum_correct); - PROTO_ITEM_SET_GENERATED(item); - item = proto_tree_add_boolean(checksum_tree, hf_shim6_checksum_bad, tvb, - offset, 2, !is_cksum_correct); - PROTO_ITEM_SET_GENERATED(item); - if (!is_cksum_correct) { - expert_add_info(pinfo, item, &ei_shim6_checksum_bad); - col_append_str(pinfo->cinfo, COL_INFO, " [Shim6 CHECKSUM INCORRECT]"); - } -} - static int dissect_shim6(tvbuff_t *tvb, packet_info * pinfo, proto_tree *tree, void* data _U_) { @@ -656,17 +635,10 @@ dissect_shim6(tvbuff_t *tvb, packet_info * pinfo, proto_tree *tree, void* data _ /* Checksum */ csum = shim6_checksum(tvb, offset, len); - - if (csum == 0) { - ti = proto_tree_add_uint_format_value(shim_tree, hf_shim6_checksum, tvb, p, 2, - tvb_get_ntohs(tvb, p), "0x%04x [correct]", tvb_get_ntohs(tvb, p)); - add_shim6_checksum_additional_info(tvb, pinfo, ti, p, TRUE); - } else { - ti = proto_tree_add_uint_format_value(shim_tree, hf_shim6_checksum, tvb, p, 2, - tvb_get_ntohs(tvb, p), "0x%04x [incorrect: should be 0x%04x]", - tvb_get_ntohs(tvb, p), in_cksum_shouldbe(tvb_get_ntohs(tvb, p), csum)); - add_shim6_checksum_additional_info(tvb, pinfo, ti, p, FALSE); - } + proto_tree_add_checksum(shim_tree, tvb, p, hf_shim6_checksum, hf_shim6_checksum_status, &ei_shim6_checksum_bad, pinfo, csum, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY|PROTO_CHECKSUM_IN_CKSUM); + if (csum != 0) + col_append_str(pinfo->cinfo, COL_INFO, " [Shim6 CHECKSUM INCORRECT]"); p += 2; /* Type specific data */ @@ -726,14 +698,9 @@ proto_register_shim6(void) FT_UINT16, BASE_HEX, NULL, 0x0, "Shim6 Checksum", HFILL } }, - { &hf_shim6_checksum_bad, - { "Bad Checksum", "shim6.checksum_bad", - FT_BOOLEAN, BASE_NONE, NULL, 0x0, - "Shim6 Bad Checksum", HFILL } - }, - { &hf_shim6_checksum_good, - { "Good Checksum", "shim6.checksum_good", - FT_BOOLEAN, BASE_NONE, NULL, 0x0, + { &hf_shim6_checksum_status, + { "Checksum Status", "shim6.checksum.status", + FT_UINT8, BASE_NONE, VALS(proto_checksum_vals), 0x0, NULL, HFILL } }, { &hf_shim6_inonce, diff --git a/epan/dissectors/packet-simple.c b/epan/dissectors/packet-simple.c index 3ac7754a31..90f7ca1222 100644 --- a/epan/dissectors/packet-simple.c +++ b/epan/dissectors/packet-simple.c @@ -247,7 +247,7 @@ static gint hf_simple_status_link11_pu = -1; static gint hf_simple_status_link11_dts_host_status = -1; static gint hf_simple_status_spare_3 = -1; static gint hf_simple_checksum = -1; -static gint hf_simple_checksum_bad = -1; +static gint hf_simple_checksum_status = -1; static gint ett_simple = -1; static gint ett_packet = -1; @@ -409,10 +409,6 @@ static void dissect_simple_status(tvbuff_t *tvb, packet_info *pinfo, proto_tree static void dissect_checksum(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, gint offset) { - gint checksum = tvb_get_letohs(tvb, offset); - proto_item *checksum_item = proto_tree_add_item(tree, hf_simple_checksum, tvb, offset, 2, ENC_BIG_ENDIAN); - proto_item *hidden_item; - const guint8 * v = tvb_get_ptr(tvb, 0, offset); guint16 expected_checksum = 0; gint i; @@ -420,17 +416,8 @@ static void dissect_checksum(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree for (i = 0; i < offset; i++) expected_checksum += v[i]; - if (checksum == expected_checksum) { - hidden_item = proto_tree_add_boolean(tree, hf_simple_checksum_bad, tvb, offset, 2, FALSE); - PROTO_ITEM_SET_HIDDEN(hidden_item); - proto_item_append_text(checksum_item, " [correct]"); - } else { - hidden_item = proto_tree_add_boolean(tree, hf_simple_checksum_bad, tvb, offset, 2, TRUE); - PROTO_ITEM_SET_HIDDEN(hidden_item); - proto_item_append_text(checksum_item, " [incorrect, should be 0x%04x]", expected_checksum); - expert_add_info_format(pinfo, checksum_item, &ei_simple_checksum_bad, - "SIMPLE Checksum Incorrect, should be 0x%04x", expected_checksum); - } + proto_tree_add_checksum(tree, tvb, offset, hf_simple_checksum, hf_simple_checksum_status, &ei_simple_checksum_bad, pinfo, expected_checksum, + ENC_LITTLE_ENDIAN, PROTO_CHECKSUM_VERIFY); } static int dissect_simple(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) @@ -669,8 +656,8 @@ void proto_register_simple(void) { &hf_simple_checksum, { "Checksum", "simple.checksum", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }}, - { &hf_simple_checksum_bad, - { "Bad Checksum", "simple.checksum_bad", FT_BOOLEAN, BASE_NONE, NULL, 0x0, + { &hf_simple_checksum_status, + { "Checksum Status", "simple.checksum.status", FT_UINT8, BASE_NONE, VALS(proto_checksum_vals), 0x0, NULL, HFILL }} }; static gint *ett[] = { diff --git a/epan/dissectors/packet-sml.c b/epan/dissectors/packet-sml.c index 7d405519c7..6f4916e24f 100644 --- a/epan/dissectors/packet-sml.c +++ b/epan/dissectors/packet-sml.c @@ -93,6 +93,7 @@ static int hf_sml_datatype = -1; static int hf_sml_abortOnError = -1; static int hf_sml_MessageBody = -1; static int hf_sml_crc16 = -1; +static int hf_sml_crc16_status = -1; static int hf_sml_endOfSmlMsg = -1; static int hf_sml_end = -1; static int hf_sml_codepage = -1; @@ -2391,31 +2392,22 @@ static void dissect_sml_file(tvbuff_t *tvb, packet_info *pinfo, gint *offset, pr proto_tree_add_item (crc16_tree, hf_sml_datatype, tvb, *offset, 1, ENC_BIG_ENDIAN); *offset+=1; - crc16 = proto_tree_add_item (crc16_tree, hf_sml_crc16, tvb, *offset, data, ENC_BIG_ENDIAN); - *offset+=data; - if (sml_crc_enabled) { - crc_msg_len = (*offset - crc_msg_len - data - 1); - crc_check = crc16_ccitt_tvb_offset(tvb, (*offset - crc_msg_len - data - 1), crc_msg_len); - crc_ref = tvb_get_letohs(tvb, *offset-2); + crc_msg_len = (*offset - crc_msg_len - 1); + crc_check = crc16_ccitt_tvb_offset(tvb, (*offset - crc_msg_len - 1), crc_msg_len); if (data == 1){ crc_ref = crc_ref & 0xFF00; } - if (crc_check == crc_ref) { - proto_item_append_text(crc16, " [CRC Okay]"); - } - else { - /*(little to big endian convert) to display in correct order*/ - crc_check = ((crc_check >> 8) & 0xFF) + ((crc_check << 8 & 0xFF00)); - proto_item_append_text(crc16, " [CRC Bad 0x%X]", crc_check); - expert_add_info(pinfo, crc16, &ei_sml_crc_error); - } + proto_tree_add_checksum(crc16_tree, tvb, *offset, hf_sml_crc16, hf_sml_crc16_status, &ei_sml_crc_error, pinfo, crc_check, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); } else { - proto_item_append_text(crc16, " [CRC validation disabled]"); + proto_tree_add_checksum(crc16_tree, tvb, *offset, hf_sml_crc16, hf_sml_crc16_status, &ei_sml_crc_error, pinfo, 0, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); } + *offset+=data; /*Message END*/ if (tvb_get_guint8 (tvb, *offset) == 0){ @@ -2477,27 +2469,19 @@ static void dissect_sml_file(tvbuff_t *tvb, packet_info *pinfo, gint *offset, pr *offset+=1; proto_tree_add_item (msgend_tree, hf_sml_padding, tvb, *offset, 1, ENC_NA); *offset+=1; - crc16 = proto_tree_add_item (msgend_tree, hf_sml_crc16, tvb, *offset, 2, ENC_BIG_ENDIAN); - *offset+=2; if (sml_crc_enabled && sml_reassemble){ - crc_file_len = *offset - crc_file_len - 2; - crc_check = crc16_ccitt_tvb_offset(tvb,*offset-crc_file_len-2, crc_file_len); - crc_ref = tvb_get_letohs(tvb, *offset-2); + crc_file_len = *offset - crc_file_len; + crc_check = crc16_ccitt_tvb_offset(tvb,*offset-crc_file_len, crc_file_len); - if (crc_check == crc_ref){ - proto_item_append_text(crc16, " [CRC Okay]"); - } - else{ - /*(little to big endian convert) to display in correct order*/ - crc_check = ((crc_check >> 8) & 0xFF) + ((crc_check << 8) & 0xFF00); - proto_item_append_text(crc16, " [CRC Bad 0x%X]", crc_check); - expert_add_info_format(pinfo, msgend, &ei_sml_crc_error, "CRC error (messages not reassembled ?)"); - } + proto_tree_add_checksum(msgend_tree, tvb, *offset, hf_sml_crc16, hf_sml_crc16_status, &ei_sml_crc_error, pinfo, crc_check, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); } else { - proto_item_append_text(crc16, " [CRC validation disabled]"); + proto_tree_add_checksum(msgend_tree, tvb, *offset, hf_sml_crc16, hf_sml_crc16_status, &ei_sml_crc_error, pinfo, crc_check, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); } + *offset+=2; available = tvb_reported_length_remaining(tvb, *offset); if (available <= 0){ @@ -2556,6 +2540,8 @@ void proto_register_sml (void) { { "SML Version", "sml.version", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }}, { &hf_sml_crc16, { "CRC16", "sml.crc", FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }}, + { &hf_sml_crc16_status, + { "CRC16 Status", "sml.crc.status", FT_UINT8, BASE_NONE, VALS(proto_checksum_vals), 0x0, NULL, HFILL }}, { &hf_sml_endOfSmlMsg, { "End of SML Msg", "sml.end", FT_UINT8, BASE_HEX, NULL, 0x0, NULL, HFILL }}, { &hf_sml_transactionId, diff --git a/epan/dissectors/packet-stt.c b/epan/dissectors/packet-stt.c index d4775826c6..a95cba8f1b 100644 --- a/epan/dissectors/packet-stt.c +++ b/epan/dissectors/packet-stt.c @@ -74,9 +74,7 @@ static int hf_stt_pkt_len = -1; static int hf_stt_seg_off = -1; static int hf_stt_pkt_id = -1; static int hf_stt_checksum = -1; -static int hf_stt_checksum_bad = -1; -static int hf_stt_checksum_good = -1; -static int hf_stt_checksum_calculated = -1; +static int hf_stt_checksum_status = -1; static int hf_stt_tcp_data = -1; static int hf_stt_tcp_data_offset = -1; static int hf_stt_tcp_flags = -1; @@ -122,7 +120,6 @@ static int hf_reassembled_in = -1; static int hf_reassembled_length = -1; static int ett_stt = -1; -static int ett_stt_checksum = -1; static int ett_stt_tcp_data = -1; static int ett_stt_tcp_flags = -1; static int ett_stt_flgs = -1; @@ -221,18 +218,7 @@ handle_segment(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, static void dissect_stt_checksum(tvbuff_t *tvb, packet_info *pinfo, proto_tree *stt_tree) { - proto_tree *checksum_tree; - proto_item *item; - guint16 checksum = tvb_get_ntohs(tvb, 16); - gboolean can_checksum; - guint16 computed_cksum; - gboolean checksum_good = FALSE, checksum_bad = FALSE; - - item = proto_tree_add_uint_format_value(stt_tree, hf_stt_checksum, - tvb, 16, 2, checksum, - "0x%04x", checksum); - - can_checksum = !pinfo->fragmented && + gboolean can_checksum = !pinfo->fragmented && tvb_bytes_exist(tvb, 0, tvb_reported_length(tvb)); if (can_checksum && pref_check_checksum) { @@ -262,41 +248,13 @@ dissect_stt_checksum(tvbuff_t *tvb, packet_info *pinfo, proto_tree *stt_tree) break; } SET_CKSUM_VEC_TVB(cksum_vec[3], tvb, 0, tvb_reported_length(tvb)); - computed_cksum = in_cksum(cksum_vec, 4); - checksum_good = (computed_cksum == 0); - checksum_bad = !checksum_good; - - if (checksum_good) { - proto_item_append_text(item, " [correct]"); - } else if (checksum_bad) { - guint16 expected_cksum = in_cksum_shouldbe(checksum, computed_cksum); - - proto_item_append_text(item, " [incorrect, should be 0x%04x (maybe caused by \"TCP checksum offload\"?)]", - expected_cksum); - - expert_add_info(pinfo, item, &ei_stt_checksum_bad); - checksum = expected_cksum; - } - } else if (pref_check_checksum) { - proto_item_append_text(item, " [unchecked, not all data available]"); + proto_tree_add_checksum(stt_tree, tvb, 16, hf_stt_checksum, hf_stt_checksum_status, &ei_stt_checksum_bad, pinfo, + in_cksum(cksum_vec, 4), ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); } else { - proto_item_append_text(item, " [validation disabled]"); + proto_tree_add_checksum(stt_tree, tvb, 16, hf_stt_checksum, hf_stt_checksum_status, &ei_stt_checksum_bad, pinfo, + 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); } - - checksum_tree = proto_item_add_subtree(item, ett_stt_checksum); - - if (checksum_good || checksum_bad) { - item = proto_tree_add_uint(checksum_tree, hf_stt_checksum_calculated, - tvb, 16, 2, checksum); - PROTO_ITEM_SET_GENERATED(item); - } - item = proto_tree_add_boolean(checksum_tree, hf_stt_checksum_good, tvb, - 16, 2, checksum_good); - PROTO_ITEM_SET_GENERATED(item); - item = proto_tree_add_boolean(checksum_tree, hf_stt_checksum_bad, tvb, - 16, 2, checksum_bad); - PROTO_ITEM_SET_GENERATED(item); } static int @@ -834,22 +792,10 @@ proto_register_stt(void) "Details at: http://www.wireshark.org/docs/wsug_html_chunked/ChAdvChecksums.html", HFILL }, }, - { &hf_stt_checksum_good, - { "Good Checksum", "stt.checksum.good", - FT_BOOLEAN, BASE_NONE, NULL, 0x0, - "True: checksum matches packet content; False: doesn't match content or not checked", HFILL - }, - }, - { &hf_stt_checksum_bad, - { "Bad Checksum", "stt.checksum.bad", - FT_BOOLEAN, BASE_NONE, NULL, 0x0, - "True: checksum doesn't match packet content; False: matches content or not checked", HFILL - }, - }, - { &hf_stt_checksum_calculated, - { "Calculated Checksum", "stt.checksum.calculated", - FT_UINT16, BASE_HEX, NULL, 0x0, - "The expected STT checksum field as calculated from the STT segment", HFILL + { &hf_stt_checksum_status, + { "Checksum Status", "stt.checksum.status", + FT_UINT8, BASE_NONE, VALS(proto_checksum_vals), 0x0, + NULL, HFILL }, }, @@ -923,7 +869,6 @@ proto_register_stt(void) &ett_stt_tcp_flags, &ett_stt_flgs, &ett_stt_vlan, - &ett_stt_checksum, &ett_segment, &ett_segments }; diff --git a/epan/dissectors/packet-synphasor.c b/epan/dissectors/packet-synphasor.c index d4b56d4423..47760b50ee 100644 --- a/epan/dissectors/packet-synphasor.c +++ b/epan/dissectors/packet-synphasor.c @@ -546,10 +546,10 @@ static int dissect_common(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, v /* check CRC, call appropriate subdissector for the rest of the frame if CRC is correct*/ sub_item = proto_tree_add_item(synphasor_tree, hf_synphasor_data, tvb, offset, tvbsize - 16, ENC_NA); crc_good = check_crc(tvb, &crc); - temp_item = proto_tree_add_uint(synphasor_tree, hf_synphasor_checksum, tvb, tvbsize - 2, 2, crc); + proto_tree_add_checksum(synphasor_tree, tvb, tvbsize - 2, hf_synphasor_checksum, -1, NULL, pinfo, crc16_x25_ccitt_tvb(tvb, tvb_get_ntohs(tvb, 2) - 2), + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); if (!crc_good) { proto_item_append_text(sub_item, ", not dissected because of wrong checksum"); - proto_item_append_text(temp_item, " [incorrect]"); } else { /* create a new tvb to pass to the subdissector diff --git a/epan/dissectors/packet-sysex.c b/epan/dissectors/packet-sysex.c index f8d1a7414c..e5e827bdbb 100644 --- a/epan/dissectors/packet-sysex.c +++ b/epan/dissectors/packet-sysex.c @@ -1186,16 +1186,8 @@ dissect_sysex_command(tvbuff_t *tvb, packet_info *pinfo, proto_tree *parent_tree digitech_helper ^= *data_ptr++; } - item = proto_tree_add_item(tree, hf_digitech_checksum, tvb, offset, 1, ENC_BIG_ENDIAN); - if (digitech_helper == 0) - { - proto_item_append_text(item, " (correct)"); - } - else - { - proto_item_append_text(item, " (NOT correct)"); - expert_add_info(pinfo, item, &ei_digitech_checksum_bad); - } + proto_tree_add_checksum(tree, tvb, offset, hf_digitech_checksum, -1, &ei_digitech_checksum_bad, pinfo, digitech_helper, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY|PROTO_CHECKSUM_ZERO); offset++; break; } diff --git a/epan/dissectors/packet-tcp.c b/epan/dissectors/packet-tcp.c index 575ca1cb2a..d58ff69768 100644 --- a/epan/dissectors/packet-tcp.c +++ b/epan/dissectors/packet-tcp.c @@ -140,8 +140,7 @@ static int hf_tcp_window_size_value = -1; static int hf_tcp_window_size = -1; static int hf_tcp_window_size_scalefactor = -1; static int hf_tcp_checksum = -1; -static int hf_tcp_checksum_bad = -1; -static int hf_tcp_checksum_good = -1; +static int hf_tcp_checksum_status = -1; static int hf_tcp_checksum_calculated = -1; static int hf_tcp_len = -1; static int hf_tcp_urgent_pointer = -1; @@ -3872,8 +3871,7 @@ dissect_tcpopt_mptcp(const ip_tcp_opt *optp _U_, tvbuff_t *tvb, if ((int)optlen >= offset-start_offset+4) { - proto_tree_add_item(mptcp_tree, - hf_tcp_option_mptcp_checksum, tvb, offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_checksum(mptcp_tree, tvb, offset, hf_tcp_option_mptcp_checksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); } } break; @@ -5286,7 +5284,6 @@ dissect_tcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) vec_t cksum_vec[4]; guint32 phdr[2]; guint16 computed_cksum; - guint16 expected_cksum; guint16 real_window; guint captured_length_remaining; gboolean desegment_ok; @@ -5753,11 +5750,9 @@ dissect_tcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) item = proto_tree_add_uint(checksum_tree, hf_tcp_checksum_calculated, tvb, offset + 16, 2, 0x0000); PROTO_ITEM_SET_GENERATED(item); - item = proto_tree_add_boolean(checksum_tree, hf_tcp_checksum_good, tvb, - offset + 16, 2, FALSE); - PROTO_ITEM_SET_GENERATED(item); - item = proto_tree_add_boolean(checksum_tree, hf_tcp_checksum_bad, tvb, - offset + 16, 2, FALSE); + /* XXX - What should this special status be? */ + item = proto_tree_add_uint(checksum_tree, hf_tcp_checksum_status, tvb, + offset + 16, 0, 4); PROTO_ITEM_SET_GENERATED(item); expert_add_info(pinfo, item, &ei_tcp_checksum_ffff); @@ -5765,60 +5760,30 @@ dissect_tcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) /* Checksum is treated as valid on most systems, so we're willing to desegment it. */ desegment_ok = TRUE; - } else if (computed_cksum == 0) { - item = proto_tree_add_uint_format_value(tcp_tree, hf_tcp_checksum, tvb, - offset + 16, 2, th_sum, "0x%04x [correct]", th_sum); + } else { + proto_item* calc_item; + item = proto_tree_add_checksum(tcp_tree, tvb, offset+16, hf_tcp_checksum, hf_tcp_checksum_status, &ei_tcp_checksum_bad, pinfo, computed_cksum, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY|PROTO_CHECKSUM_IN_CKSUM); - checksum_tree = proto_item_add_subtree(item, ett_tcp_checksum); - item = proto_tree_add_uint(checksum_tree, hf_tcp_checksum_calculated, tvb, + calc_item = proto_tree_add_uint(tcp_tree, hf_tcp_checksum_calculated, tvb, offset + 16, 2, th_sum); - PROTO_ITEM_SET_GENERATED(item); - item = proto_tree_add_boolean(checksum_tree, hf_tcp_checksum_good, tvb, - offset + 16, 2, TRUE); - PROTO_ITEM_SET_GENERATED(item); - item = proto_tree_add_boolean(checksum_tree, hf_tcp_checksum_bad, tvb, - offset + 16, 2, FALSE); - PROTO_ITEM_SET_GENERATED(item); + PROTO_ITEM_SET_GENERATED(calc_item); /* Checksum is valid, so we're willing to desegment it. */ - desegment_ok = TRUE; - } else { - expected_cksum = in_cksum_shouldbe(th_sum, computed_cksum); + if (computed_cksum == 0) { + desegment_ok = TRUE; + } else { + proto_item_append_text(item, "(maybe caused by \"TCP checksum offload\"?)"); - item = proto_tree_add_uint_format_value(tcp_tree, hf_tcp_checksum, tvb, - offset + 16, 2, th_sum, - "0x%04x [incorrect, should be 0x%04x (maybe caused by \"TCP checksum offload\"?)]", th_sum, - expected_cksum); - - checksum_tree = proto_item_add_subtree(item, ett_tcp_checksum); - item = proto_tree_add_uint(checksum_tree, hf_tcp_checksum_calculated, tvb, - offset + 16, 2, expected_cksum); - PROTO_ITEM_SET_GENERATED(item); - item = proto_tree_add_boolean(checksum_tree, hf_tcp_checksum_good, tvb, - offset + 16, 2, FALSE); - PROTO_ITEM_SET_GENERATED(item); - item = proto_tree_add_boolean(checksum_tree, hf_tcp_checksum_bad, tvb, - offset + 16, 2, TRUE); - PROTO_ITEM_SET_GENERATED(item); - expert_add_info(pinfo, item, &ei_tcp_checksum_bad); - - col_append_str(pinfo->cinfo, COL_INFO, " [TCP CHECKSUM INCORRECT]"); - - /* Checksum is invalid, so we're not willing to desegment it. */ - desegment_ok = FALSE; - pinfo->noreassembly_reason = " [incorrect TCP checksum]"; + /* Checksum is invalid, so we're not willing to desegment it. */ + desegment_ok = FALSE; + pinfo->noreassembly_reason = " [incorrect TCP checksum]"; + col_append_str(pinfo->cinfo, COL_INFO, " [TCP CHECKSUM INCORRECT]"); + } } } else { - item = proto_tree_add_uint_format_value(tcp_tree, hf_tcp_checksum, tvb, - offset + 16, 2, th_sum, "0x%04x [validation disabled]", th_sum); - - checksum_tree = proto_item_add_subtree(item, ett_tcp_checksum); - item = proto_tree_add_boolean(checksum_tree, hf_tcp_checksum_good, tvb, - offset + 16, 2, FALSE); - PROTO_ITEM_SET_GENERATED(item); - item = proto_tree_add_boolean(checksum_tree, hf_tcp_checksum_bad, tvb, - offset + 16, 2, FALSE); - PROTO_ITEM_SET_GENERATED(item); + proto_tree_add_checksum(tcp_tree, tvb, offset+16, hf_tcp_checksum, hf_tcp_checksum_status, &ei_tcp_checksum_bad, pinfo, 0, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); /* We didn't check the checksum, and don't care if it's valid, so we're willing to desegment it. */ @@ -5826,16 +5791,8 @@ dissect_tcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_) } } else { /* We don't have all the packet data, so we can't checksum it... */ - item = proto_tree_add_uint_format_value(tcp_tree, hf_tcp_checksum, tvb, - offset + 16, 2, th_sum, "0x%04x [unchecked, not all data available]", th_sum); - - checksum_tree = proto_item_add_subtree(item, ett_tcp_checksum); - item = proto_tree_add_boolean(checksum_tree, hf_tcp_checksum_good, tvb, - offset + 16, 2, FALSE); - PROTO_ITEM_SET_GENERATED(item); - item = proto_tree_add_boolean(checksum_tree, hf_tcp_checksum_bad, tvb, - offset + 16, 2, FALSE); - PROTO_ITEM_SET_GENERATED(item); + proto_tree_add_checksum(tcp_tree, tvb, offset+16, hf_tcp_checksum, hf_tcp_checksum_status, &ei_tcp_checksum_bad, pinfo, 0, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); /* ...and aren't willing to desegment it. */ desegment_ok = FALSE; @@ -6201,13 +6158,9 @@ proto_register_tcp(void) { "Checksum", "tcp.checksum", FT_UINT16, BASE_HEX, NULL, 0x0, "Details at: http://www.wireshark.org/docs/wsug_html_chunked/ChAdvChecksums.html", HFILL }}, - { &hf_tcp_checksum_good, - { "Good Checksum", "tcp.checksum_good", FT_BOOLEAN, BASE_NONE, NULL, 0x0, - "True: checksum matches packet content; False: doesn't match content or not checked", HFILL }}, - - { &hf_tcp_checksum_bad, - { "Bad Checksum", "tcp.checksum_bad", FT_BOOLEAN, BASE_NONE, NULL, 0x0, - "True: checksum doesn't match packet content; False: matches content or not checked", HFILL }}, + { &hf_tcp_checksum_status, + { "Checksum Status", "tcp.checksum.status", FT_UINT8, BASE_NONE, VALS(proto_checksum_vals), 0x0, + NULL, HFILL }}, { &hf_tcp_checksum_calculated, { "Calculated Checksum", "tcp.checksum_calculated", FT_UINT16, BASE_HEX, NULL, 0x0, diff --git a/epan/dissectors/packet-teamspeak2.c b/epan/dissectors/packet-teamspeak2.c index 3febde13f3..388dd4dba1 100644 --- a/epan/dissectors/packet-teamspeak2.c +++ b/epan/dissectors/packet-teamspeak2.c @@ -304,7 +304,7 @@ typedef struct static reassembly_table msg_reassembly_table; /* forward reference */ -static gboolean ts2_add_checked_crc32(proto_tree *tree, int hf_item, tvbuff_t *tvb, guint16 offset, guint32 icrc32); +static void ts2_add_checked_crc32(proto_tree *tree, int hf_item, tvbuff_t *tvb, guint16 offset); static void ts2_parse_playerlist(tvbuff_t *tvb, proto_tree *ts2_tree); static void ts2_parse_channellist(tvbuff_t *tvb, proto_tree *ts2_tree); static void ts2_parse_newplayerjoined(tvbuff_t *tvb, proto_tree *ts2_tree); @@ -421,7 +421,7 @@ static void ts2_standard_dissect(tvbuff_t *tvb, packet_info *pinfo, proto_tree * proto_tree_add_item(ts2_tree, hf_ts2_resend_count, tvb, 16, 2, ENC_LITTLE_ENDIAN); proto_tree_add_item(ts2_tree, hf_ts2_fragmentnumber, tvb, 18, 2, ENC_LITTLE_ENDIAN); - ts2_add_checked_crc32(ts2_tree, hf_ts2_crc32, tvb, 20, tvb_get_letohl(tvb, 20)); + ts2_add_checked_crc32(ts2_tree, hf_ts2_crc32, tvb, 20); /* Reassemble the packet if it's fragmented */ new_tvb = NULL; @@ -764,7 +764,7 @@ static int dissect_ts2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void { case TS2C_CONNECTION: proto_tree_add_item(ts2_tree, hf_ts2_seqnum, tvb, 12, 4, ENC_LITTLE_ENDIAN); - ts2_add_checked_crc32(ts2_tree, hf_ts2_crc32, tvb, 16, tvb_get_letohl(tvb, 16)); + ts2_add_checked_crc32(ts2_tree, hf_ts2_crc32, tvb, 16); switch(type) { @@ -816,29 +816,20 @@ static int dissect_ts2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void /* Calculates a CRC32 checksum from the tvb zeroing out four bytes at the offset and checks it with the given crc32 and adds the result to the tree * Returns true if the calculated CRC32 matches the passed CRC32. * */ -static gboolean ts2_add_checked_crc32(proto_tree *tree, int hf_item, tvbuff_t *tvb, guint16 offset, guint32 icrc32 ) +static void ts2_add_checked_crc32(proto_tree *tree, int hf_item, tvbuff_t *tvb, guint16 offset) { - guint8 *zero; - gint len; + guint32 zero = 0; + gint len = tvb_reported_length_remaining(tvb, offset+4); guint32 ocrc32; - zero = (guint8 *)wmem_alloc0(wmem_packet_scope(), 4); - ocrc32 = crc32_ccitt_tvb(tvb, offset); - ocrc32 = crc32_ccitt_seed(zero, 4, 0xffffffff-ocrc32); - len = tvb_reported_length_remaining(tvb, offset+4); if (len<0) - return FALSE; + return; + + ocrc32 = crc32_ccitt_tvb(tvb, offset); + ocrc32 = crc32_ccitt_seed((guint8*)&zero, 4, 0xffffffff-ocrc32); ocrc32 = crc32_ccitt_tvb_offset_seed(tvb, offset+4, (guint)len, 0xffffffff-ocrc32); - if(icrc32==ocrc32) - { - proto_tree_add_uint_format(tree, hf_item, tvb, offset, 4, tvb_get_letohl(tvb, 16), "crc32: 0x%04x [correct]", tvb_get_letohl(tvb, offset)); - return TRUE; - } - else - { - proto_tree_add_uint_format(tree, hf_item, tvb, offset, 4, tvb_get_letohl(tvb,16), "crc32: 0x%04x [incorrect, should be 0x%04x]", tvb_get_letohl(tvb, offset),ocrc32); - return FALSE; - } + + proto_tree_add_checksum(tree, tvb, offset, hf_item, -1, NULL, NULL, ocrc32, ENC_LITTLE_ENDIAN, PROTO_CHECKSUM_VERIFY); } static void ts2_init(void) diff --git a/epan/dissectors/packet-tnef.c b/epan/dissectors/packet-tnef.c index b57a2627c9..0a83831dce 100644 --- a/epan/dissectors/packet-tnef.c +++ b/epan/dissectors/packet-tnef.c @@ -612,7 +612,7 @@ static int dissect_tnef(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, voi offset += length; } - proto_tree_add_item(attr_tree, hf_tnef_attribute_checksum, tvb, offset, 2, ENC_LITTLE_ENDIAN); + proto_tree_add_checksum(attr_tree, tvb, offset, hf_tnef_attribute_checksum, -1, NULL, pinfo, 0, ENC_LITTLE_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); offset += 2; proto_item_set_len(attr_item, offset - start_offset); diff --git a/epan/dissectors/packet-tns.c b/epan/dissectors/packet-tns.c index 0d3a82c404..137d4b71a1 100644 --- a/epan/dissectors/packet-tns.c +++ b/epan/dissectors/packet-tns.c @@ -816,11 +816,7 @@ dissect_tns_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data } offset += 2; - if ( tree ) - { - proto_tree_add_item(tns_tree, hf_tns_packet_checksum, tvb, - offset, 2, ENC_BIG_ENDIAN); - } + proto_tree_add_checksum(tns_tree, tvb, offset, hf_tns_packet_checksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); offset += 2; type = tvb_get_guint8(tvb, offset); @@ -841,11 +837,7 @@ dissect_tns_pdu(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data } offset += 1; - if ( tree ) - { - proto_tree_add_item(tns_tree, hf_tns_header_checksum, tvb, - offset, 2, ENC_BIG_ENDIAN); - } + proto_tree_add_checksum(tns_tree, tvb, offset, hf_tns_header_checksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); offset += 2; switch (type) diff --git a/epan/dissectors/packet-ua3g.c b/epan/dissectors/packet-ua3g.c index e4b99e7365..c8acf15cbd 100644 --- a/epan/dissectors/packet-ua3g.c +++ b/epan/dissectors/packet-ua3g.c @@ -2796,7 +2796,7 @@ decode_ua_dwl_protocol(proto_tree *tree, tvbuff_t *tvb, packet_info *pinfo, proto_tree_add_item(ua3g_body_tree, hf_ua3g_ua_dwl_protocol_packet_download_end_ack_ok_status, tvb, offset, 1, ENC_BIG_ENDIAN); break; case 0x06: /* Downloading Iso Checksum (MESSAGE FROM THE SYSTEM) */ - proto_tree_add_item(ua3g_body_tree, hf_ua3g_ua_dwl_protocol_checksum, tvb, offset, 4, ENC_BIG_ENDIAN); + proto_tree_add_checksum(ua3g_body_tree, tvb, offset, hf_ua3g_ua_dwl_protocol_checksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); break; case 0x07: /* Downloading ISO Checksum Acknowledge (MESSAGE FROM THE TERMINAL) */ proto_tree_add_item(ua3g_body_tree, hf_ua3g_ua_dwl_protocol_acknowledge, tvb, offset, 1, ENC_BIG_ENDIAN); diff --git a/epan/dissectors/packet-udld.c b/epan/dissectors/packet-udld.c index b694d0d3a6..b77d3ce6ee 100644 --- a/epan/dissectors/packet-udld.c +++ b/epan/dissectors/packet-udld.c @@ -125,7 +125,7 @@ dissect_udld(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_ proto_tree_add_item(flags_tree, hf_udld_flags_rt, tvb, offset, 1, ENC_BIG_ENDIAN); proto_tree_add_item(flags_tree, hf_udld_flags_rsy, tvb, offset, 1, ENC_BIG_ENDIAN); offset += 1; - proto_tree_add_item(udld_tree, hf_udld_checksum, tvb, offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_checksum(udld_tree, tvb, offset, hf_udld_checksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); offset += 2; } else { offset += 4; /* The version/opcode/flags/checksum fields from above */ diff --git a/epan/dissectors/packet-udp.c b/epan/dissectors/packet-udp.c index 1b170f817b..ce4ad54507 100644 --- a/epan/dissectors/packet-udp.c +++ b/epan/dissectors/packet-udp.c @@ -93,13 +93,9 @@ static header_field_info hfi_udp_checksum_calculated UDP_HFI_INIT = { "Calculated Checksum", "udp.checksum_calculated", FT_UINT16, BASE_HEX, NULL, 0x0, "The expected UDP checksum field as calculated from the UDP packet", HFILL }; -static header_field_info hfi_udp_checksum_good UDP_HFI_INIT = -{ "Good Checksum", "udp.checksum_good", FT_BOOLEAN, BASE_NONE, NULL, 0x0, - "True: checksum matches packet content; False: doesn't match content or not checked", HFILL }; - -static header_field_info hfi_udp_checksum_bad UDP_HFI_INIT = -{ "Bad Checksum", "udp.checksum_bad", FT_BOOLEAN, BASE_NONE, NULL, 0x0, - "True: checksum doesn't match packet content; False: matches content or not checked", HFILL }; +static header_field_info hfi_udp_checksum_status UDP_HFI_INIT = +{ "Checksum Status", "udp.checksum.status", FT_UINT8, BASE_NONE, VALS(proto_checksum_vals), 0x0, + NULL, HFILL }; static header_field_info hfi_udp_proc_src_uid UDP_HFI_INIT = { "Source process user ID", "udp.proc.srcuid", FT_UINT32, BASE_DEC, NULL, 0x0, @@ -777,14 +773,13 @@ static void dissect(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 ip_proto) { proto_tree *udp_tree = NULL; - proto_item *ti, *item, *hidden_item; + proto_item *ti, *item, *hidden_item, *calc_item; proto_item *src_port_item, *dst_port_item, *len_cov_item; guint len; guint reported_len; vec_t cksum_vec[4]; guint32 phdr[2]; guint16 computed_cksum; - guint16 expected_cksum; int offset = 0; e_udphdr *udph; proto_tree *checksum_tree; @@ -890,28 +885,17 @@ dissect(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 ip_proto) if (udph->uh_sum == 0) { /* No checksum supplied in the packet. */ if (((ip_proto == IP_PROTO_UDP) && (pinfo->src.type == AT_IPv4)) || pinfo->flags.in_error_pkt) { - item = proto_tree_add_uint_format_value(udp_tree, hfi_udp_checksum.id, tvb, offset + 6, 2, 0, - "0x%04x (none)", 0); - - checksum_tree = proto_item_add_subtree(item, ett_udp_checksum); - item = proto_tree_add_boolean(checksum_tree, &hfi_udp_checksum_good, tvb, - offset + 6, 2, FALSE); - PROTO_ITEM_SET_GENERATED(item); - item = proto_tree_add_boolean(checksum_tree, &hfi_udp_checksum_bad, tvb, - offset + 6, 2, FALSE); - PROTO_ITEM_SET_GENERATED(item); + proto_tree_add_checksum(udp_tree, tvb, offset + 6, hfi_udp_checksum.id, hfi_udp_checksum_status.id, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NOT_PRESENT); } else { - item = proto_tree_add_uint_format_value(udp_tree, hfi_udp_checksum.id, tvb, offset + 6, 2, 0, - "0x%04x (Illegal)", 0); + item = proto_tree_add_uint_format_value(udp_tree, hfi_udp_checksum.id, tvb, offset + 6, 2, 0, "0 (Illegal)"); + checksum_tree = proto_item_add_subtree(item, ett_udp_checksum); + expert_add_info(pinfo, item, &ei_udp_checksum_zero); col_append_str(pinfo->cinfo, COL_INFO, " [ILLEGAL CHECKSUM (0)]"); - checksum_tree = proto_item_add_subtree(item, ett_udp_checksum); - item = proto_tree_add_boolean(checksum_tree, &hfi_udp_checksum_good, tvb, - offset + 6, 2, FALSE); - PROTO_ITEM_SET_GENERATED(item); - item = proto_tree_add_boolean(checksum_tree, &hfi_udp_checksum_bad, tvb, - offset + 6, 2, TRUE); + /* XXX - What should this special status be? */ + item = proto_tree_add_uint(checksum_tree, &hfi_udp_checksum_status, tvb, + offset + 6, 0, 4); PROTO_ITEM_SET_GENERATED(item); } } else if (!pinfo->fragmented && (len >= reported_len) && @@ -953,63 +937,27 @@ dissect(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 ip_proto) } SET_CKSUM_VEC_TVB(cksum_vec[3], tvb, offset, udph->uh_sum_cov); computed_cksum = in_cksum(&cksum_vec[0], 4); - if (computed_cksum == 0) { - item = proto_tree_add_uint_format_value(udp_tree, hfi_udp_checksum.id, tvb, - offset + 6, 2, udph->uh_sum, "0x%04x [correct]", udph->uh_sum); - checksum_tree = proto_item_add_subtree(item, ett_udp_checksum); - item = proto_tree_add_uint(checksum_tree, &hfi_udp_checksum_calculated, - tvb, offset + 6, 2, udph->uh_sum); - PROTO_ITEM_SET_GENERATED(item); - item = proto_tree_add_boolean(checksum_tree, &hfi_udp_checksum_good, tvb, - offset + 6, 2, TRUE); - PROTO_ITEM_SET_GENERATED(item); - item = proto_tree_add_boolean(checksum_tree, &hfi_udp_checksum_bad, tvb, - offset + 6, 2, FALSE); - PROTO_ITEM_SET_GENERATED(item); - } else { - expected_cksum = in_cksum_shouldbe(udph->uh_sum, computed_cksum); - item = proto_tree_add_uint_format_value(udp_tree, hfi_udp_checksum.id, tvb, - offset + 6, 2, udph->uh_sum, - "0x%04x [incorrect, should be 0x%04x (maybe caused by \"UDP checksum offload\"?)]", udph->uh_sum, - expected_cksum); - - checksum_tree = proto_item_add_subtree(item, ett_udp_checksum); - item = proto_tree_add_uint(checksum_tree, &hfi_udp_checksum_calculated, - tvb, offset + 6, 2, expected_cksum); - PROTO_ITEM_SET_GENERATED(item); - item = proto_tree_add_boolean(checksum_tree, &hfi_udp_checksum_good, tvb, - offset + 6, 2, FALSE); - PROTO_ITEM_SET_GENERATED(item); - item = proto_tree_add_boolean(checksum_tree, &hfi_udp_checksum_bad, tvb, - offset + 6, 2, TRUE); - PROTO_ITEM_SET_GENERATED(item); - expert_add_info(pinfo, item, &ei_udp_checksum_bad); - - col_append_str(pinfo->cinfo, COL_INFO, " [UDP CHECKSUM INCORRECT]"); - } - } else { - item = proto_tree_add_uint_format_value(udp_tree, hfi_udp_checksum.id, tvb, - offset + 6, 2, udph->uh_sum, "0x%04x [validation disabled]", udph->uh_sum); + item = proto_tree_add_checksum(udp_tree, tvb, offset+6, hfi_udp_checksum.id, hfi_udp_checksum_status.id, &ei_udp_checksum_bad, pinfo, computed_cksum, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY|PROTO_CHECKSUM_IN_CKSUM); checksum_tree = proto_item_add_subtree(item, ett_udp_checksum); - item = proto_tree_add_boolean(checksum_tree, &hfi_udp_checksum_good, tvb, - offset + 6, 2, FALSE); - PROTO_ITEM_SET_GENERATED(item); - item = proto_tree_add_boolean(checksum_tree, &hfi_udp_checksum_bad, tvb, - offset + 6, 2, FALSE); - PROTO_ITEM_SET_GENERATED(item); + + if (computed_cksum != 0) { + proto_item_append_text(item, "(maybe caused by \"UDP checksum offload\"?)"); + col_append_str(pinfo->cinfo, COL_INFO, " [UDP CHECKSUM INCORRECT]"); + calc_item = proto_tree_add_uint(checksum_tree, &hfi_udp_checksum_calculated, + tvb, offset + 6, 2, in_cksum_shouldbe(udph->uh_sum, computed_cksum)); + } else { + calc_item = proto_tree_add_uint(checksum_tree, &hfi_udp_checksum_calculated, + tvb, offset + 6, 2, udph->uh_sum); + } + PROTO_ITEM_SET_GENERATED(calc_item); + + } else { + proto_tree_add_checksum(udp_tree, tvb, offset + 6, hfi_udp_checksum.id, hfi_udp_checksum_status.id, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); } } else { - item = proto_tree_add_uint_format_value(udp_tree, hfi_udp_checksum.id, tvb, - offset + 6, 2, udph->uh_sum, "0x%04x [unchecked, not all data available]", udph->uh_sum); - - checksum_tree = proto_item_add_subtree(item, ett_udp_checksum); - item = proto_tree_add_boolean(checksum_tree, &hfi_udp_checksum_good, tvb, - offset + 6, 2, FALSE); - PROTO_ITEM_SET_GENERATED(item); - item = proto_tree_add_boolean(checksum_tree, &hfi_udp_checksum_bad, tvb, - offset + 6, 2, FALSE); - PROTO_ITEM_SET_GENERATED(item); + proto_tree_add_checksum(udp_tree, tvb, offset + 6, hfi_udp_checksum.id, hfi_udp_checksum_status.id, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); } /* Skip over header */ @@ -1116,8 +1064,7 @@ proto_register_udp(void) &hfi_udp_length, &hfi_udp_checksum, &hfi_udp_checksum_calculated, - &hfi_udp_checksum_good, - &hfi_udp_checksum_bad, + &hfi_udp_checksum_status, &hfi_udp_proc_src_uid, &hfi_udp_proc_src_pid, &hfi_udp_proc_src_uname, diff --git a/epan/dissectors/packet-v5dl.c b/epan/dissectors/packet-v5dl.c index fd1f067105..1c4ed88e12 100644 --- a/epan/dissectors/packet-v5dl.c +++ b/epan/dissectors/packet-v5dl.c @@ -61,8 +61,7 @@ static int hf_v5dl_ftype_s_u = -1; static int hf_v5dl_ftype_s_u_ext = -1; #if 0 static int hf_v5dl_checksum = -1; -static int hf_v5dl_checksum_good = -1; -static int hf_v5dl_checksum_bad = -1; +static int hf_v5dl_checksum_status = -1; #endif static gint ett_v5dl = -1; static gint ett_v5dl_address = -1; @@ -241,28 +240,11 @@ dissect_v5dl(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_ * packet. */ checksum_offset = reported_length - 2; - checksum = tvb_get_ntohs(tvb, checksum_offset); checksum_calculated = crc16_ccitt_tvb(tvb, checksum_offset); checksum_calculated = g_htons(checksum_calculated); /* Note: g_htons() macro may eval arg multiple times */ - if (checksum == checksum_calculated) { - checksum_ti = proto_tree_add_uint_format_value(v5dl_tree, hf_v5dl_checksum, tvb, checksum_offset, - 2, 0, - "0x%04x [correct]", - checksum); - checksum_tree = proto_item_add_subtree(checksum_ti, ett_v5dl_checksum); - proto_tree_add_boolean(checksum_tree, hf_v5dl_checksum_good, tvb, checksum_offset, 2, TRUE); - proto_tree_add_boolean(checksum_tree, hf_v5dl_checksum_bad, tvb, checksum_offset, 2, FALSE); - } else { - checksum_ti = proto_tree_add_uint_format_value(v5dl_tree, hf_v5dl_checksum, tvb, checksum_offset, - 2, 0, - "0x%04x [incorrect, should be 0x%04x]", - checksum, checksum_calculated); - checksum_tree = proto_item_add_subtree(checksum_ti, ett_v5dl_checksum); - proto_tree_add_boolean(checksum_tree, hf_v5dl_checksum_good, tvb, checksum_offset, 2, FALSE); - proto_tree_add_boolean(checksum_tree, hf_v5dl_checksum_bad, tvb, checksum_offset, 2, TRUE); - } - + proto_tree_add_checksum(v5dl_tree, tvb, checksum_offset, hf_v5dl_checksum, hf_v5dl_checksum_status, NULL, pinfo, checksum_calculated, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); /* * Remove the V5DL header *and* the checksum. */ @@ -406,13 +388,9 @@ proto_register_v5dl(void) { "Checksum", "v5dl.checksum", FT_UINT16, BASE_HEX, NULL, 0x0, "Details at: http://www.wireshark.org/docs/wsug_html_chunked/ChAdvChecksums.html", HFILL }}, - { &hf_v5dl_checksum_good, - { "Good Checksum", "v5dl.checksum_good", FT_BOOLEAN, BASE_NONE, - NULL, 0x0, "True: checksum matches packet content; False: doesn't match content or not checked", HFILL }}, - - { &hf_v5dl_checksum_bad, - { "Bad Checksum", "v5dl.checksum_bad", FT_BOOLEAN, BASE_NONE, - NULL, 0x0, "True: checksum doesn't match packet content; False: matches content or not checked", HFILL }} + { &hf_v5dl_checksum_status, + { "Checksum Status", "v5dl.checksum.status", FT_UINT8, BASE_NONE, + VALS(proto_checksum_vals), 0x0, NULL, HFILL }}, #endif }; diff --git a/epan/dissectors/packet-vines.c b/epan/dissectors/packet-vines.c index 8df6bd96f2..e78db5c2be 100644 --- a/epan/dissectors/packet-vines.c +++ b/epan/dissectors/packet-vines.c @@ -578,7 +578,7 @@ dissect_vines_ip(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data if (tree) { ti = proto_tree_add_item(tree, proto_vines_ip, tvb, offset, vip_pktlen, ENC_NA); vip_tree = proto_item_add_subtree(ti, ett_vines_ip); - proto_tree_add_item(vip_tree, hf_vines_ip_checksum, tvb, offset, 2, ENC_BIG_ENDIAN); + proto_tree_add_checksum(vip_tree, tvb, offset, hf_vines_ip_checksum, -1, NULL, pinfo, 0, ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); offset += 2; proto_tree_add_item(vip_tree, hf_vines_ip_length, tvb, offset, 2, ENC_BIG_ENDIAN); diff --git a/epan/dissectors/packet-vrrp.c b/epan/dissectors/packet-vrrp.c index 00fa9cf9cd..e2819bd4c1 100644 --- a/epan/dissectors/packet-vrrp.c +++ b/epan/dissectors/packet-vrrp.c @@ -47,7 +47,7 @@ static gint hf_vrrp_virt_rtr_id = -1; static gint hf_vrrp_prio = -1; static gint hf_vrrp_addr_count = -1; static gint hf_vrrp_checksum = -1; -static gint hf_vrrp_checksum_bad = -1; +static gint hf_vrrp_checksum_status = -1; static gint hf_vrrp_auth_type = -1; static gint hf_vrrp_adver_int = -1; static gint hf_vrrp_reserved_mbz = -1; @@ -101,10 +101,10 @@ dissect_vrrp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_ vec_t cksum_vec[4]; guint32 phdr[2]; gboolean is_ipv6; - proto_item *ti, *tv, *hidden_item, *checksum_item; + proto_item *ti, *tv; proto_tree *vrrp_tree, *ver_type_tree; guint8 priority, addr_count = 0, auth_type = VRRP_AUTH_TYPE_NONE; - guint16 cksum, computed_cksum; + guint16 computed_cksum; is_ipv6 = (pinfo->src.type == AT_IPv6); @@ -168,10 +168,6 @@ dissect_vrrp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_ offset += 6; } - - checksum_item = proto_tree_add_item(vrrp_tree, hf_vrrp_checksum, tvb, offset, 2, ENC_BIG_ENDIAN); - - cksum = tvb_get_ntohs(tvb, offset); vrrp_len = (gint)tvb_reported_length(tvb); if (!pinfo->fragmented && (gint)tvb_captured_length(tvb) >= vrrp_len) { /* The packet isn't part of a fragmented datagram @@ -196,22 +192,11 @@ dissect_vrrp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_ break; } - if (computed_cksum == 0) { - hidden_item = proto_tree_add_boolean(vrrp_tree, hf_vrrp_checksum_bad, tvb, offset, 2, FALSE); - PROTO_ITEM_SET_HIDDEN(hidden_item); - proto_item_append_text(checksum_item, " [correct]"); - } else { - hidden_item = proto_tree_add_boolean(vrrp_tree, hf_vrrp_checksum_bad, tvb, offset, 2, TRUE); - PROTO_ITEM_SET_HIDDEN(hidden_item); - if(hi_nibble(ver_type)==3){ - proto_item_append_text(checksum_item, " [incorrect, should be 0x%04x(check preferences)]", in_cksum_shouldbe(cksum, computed_cksum)); - } else { - proto_item_append_text(checksum_item, " [incorrect, should be 0x%04x]", in_cksum_shouldbe(cksum, computed_cksum)); - } - expert_add_info_format(pinfo, checksum_item, &ei_vrrp_checksum, - "VRRP Checksum Incorrect, should be 0x%04x", in_cksum_shouldbe(cksum, computed_cksum)); - } - + proto_tree_add_checksum(vrrp_tree, tvb, offset, hf_vrrp_checksum, hf_vrrp_checksum_status, &ei_vrrp_checksum, pinfo, computed_cksum, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY|PROTO_CHECKSUM_IN_CKSUM); + } else { + proto_tree_add_checksum(vrrp_tree, tvb, offset, hf_vrrp_checksum, hf_vrrp_checksum_status, &ei_vrrp_checksum, pinfo, 0, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); } offset += 2; @@ -273,9 +258,9 @@ void proto_register_vrrp(void) FT_UINT16, BASE_HEX, NULL, 0x0, "Used to detect data corruption in the VRRP message", HFILL }}, - { &hf_vrrp_checksum_bad, - { "Bad Checksum", "vrrp.checksum_bad", - FT_BOOLEAN, BASE_NONE, NULL, 0x0, + { &hf_vrrp_checksum_status, + { "Checksum Status", "vrrp.checksum.status", + FT_UINT8, BASE_NONE, VALS(proto_checksum_vals), 0x0, NULL, HFILL }}, { &hf_vrrp_auth_type, diff --git a/epan/dissectors/packet-wcp.c b/epan/dissectors/packet-wcp.c index f7ac337c28..45335fa9a8 100644 --- a/epan/dissectors/packet-wcp.c +++ b/epan/dissectors/packet-wcp.c @@ -383,8 +383,7 @@ static int dissect_wcp( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, voi } /* add the check byte */ - proto_tree_add_item(wcp_tree, hf_wcp_chksum, tvb, - tvb_reported_length( tvb)-1, 1, ENC_NA); + proto_tree_add_checksum(wcp_tree, tvb, tvb_reported_length( tvb)-1, hf_wcp_chksum, -1, NULL, pinfo, 0, ENC_NA, PROTO_CHECKSUM_NO_FLAGS); call_dissector(fr_uncompressed_handle, next_tvb, pinfo, tree); diff --git a/epan/dissectors/packet-xip-serval.c b/epan/dissectors/packet-xip-serval.c index acf852c066..ae1219ff1d 100644 --- a/epan/dissectors/packet-xip-serval.c +++ b/epan/dissectors/packet-xip-serval.c @@ -179,12 +179,11 @@ static void display_xip_serval(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { proto_tree *xip_serval_tree; - proto_item *ti, *check_ti, *hl_ti; + proto_item *ti, *hl_ti; tvbuff_t *next_tvb; vec_t cksum_vec; gint offset; - guint16 packet_checksum, actual_checksum; guint8 xsh_len, protocol, bytes_remaining; /* Get XIP Serval header length, stored as number of 32-bit words. */ @@ -216,27 +215,9 @@ display_xip_serval(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) /* Compute checksum. */ SET_CKSUM_VEC_TVB(cksum_vec, tvb, 0, xsh_len); - actual_checksum = in_cksum(&cksum_vec, 1); - /* Get XIP Serval checksum. */ - packet_checksum = tvb_get_ntohs(tvb, XSRVL_CHK); - - if (actual_checksum == 0) { - /* Add XIP Serval checksum as correct. */ - proto_tree_add_uint_format(xip_serval_tree, - hf_xip_serval_check, tvb, XSRVL_CHK, 2, packet_checksum, - "Header checksum: 0x%04x [correct]", packet_checksum); - } else { - /* Add XIP Serval checksum as incorrect. */ - check_ti = proto_tree_add_uint_format(xip_serval_tree, - hf_xip_serval_check, tvb, XSRVL_CHK, 2, packet_checksum, - "Header checksum: 0x%04x [incorrect, should be 0x%04x]", - packet_checksum, - in_cksum_shouldbe(packet_checksum, actual_checksum)); - - expert_add_info_format(pinfo, check_ti, - &ei_xip_serval_bad_checksum, "Bad checksum"); - } + proto_tree_add_checksum(xip_serval_tree, tvb, XSRVL_CHK, hf_xip_serval_check, -1, &ei_xip_serval_bad_checksum, pinfo, in_cksum(&cksum_vec, 1), + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY|PROTO_CHECKSUM_IN_CKSUM); offset = XSRVL_EXT; /* If there's still more room, check for extension headers. */ diff --git a/epan/dissectors/packet-xtp.c b/epan/dissectors/packet-xtp.c index 2eeea7a0de..7f36a1b304 100644 --- a/epan/dissectors/packet-xtp.c +++ b/epan/dissectors/packet-xtp.c @@ -887,7 +887,6 @@ dissect_xtp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) guint i, bpos; guint cmd_options; vec_t cksum_vec[1]; - guint16 computed_cksum; gboolean have_btag; static const int * cmd_options_flags[] = { &hf_xtp_cmd_options_nocheck, @@ -1018,20 +1017,12 @@ dissect_xtp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void *data _U_) if (!(xtph->cmd_options & XTP_CMD_OPTIONS_NOCHECK)) check_len += xtph->dlen; SET_CKSUM_VEC_TVB(cksum_vec[0], tvb, 0, check_len); - computed_cksum = in_cksum(cksum_vec, 1); - if (computed_cksum == 0) { - proto_tree_add_uint_format_value(xtp_tree, hf_xtp_checksum, tvb, offset, 2, - xtph->check, "0x%04x [correct]", xtph->check); - } else { - proto_tree_add_uint_format_value(xtp_tree, hf_xtp_checksum, tvb, offset, 2, - xtph->check, "0x%04x [incorrect, should be 0x%04x]", - xtph->check, - in_cksum_shouldbe(xtph->check, computed_cksum)); - } + proto_tree_add_checksum(xtp_tree, tvb, offset, hf_xtp_checksum, -1, NULL, pinfo, in_cksum(cksum_vec, 1), + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY|PROTO_CHECKSUM_IN_CKSUM); } else { - proto_tree_add_uint_format_value(xtp_tree, hf_xtp_checksum, tvb, offset, 2, - xtph->check, "0x%04x", xtph->check); + proto_tree_add_checksum(xtp_tree, tvb, offset, hf_xtp_checksum, -1, NULL, pinfo, 0, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); } offset += 2; /* sort(2) */ diff --git a/epan/dissectors/packet-zrtp.c b/epan/dissectors/packet-zrtp.c index d34ea79b44..b73509193a 100644 --- a/epan/dissectors/packet-zrtp.c +++ b/epan/dissectors/packet-zrtp.c @@ -113,8 +113,7 @@ static int hf_zrtp_msg_ping_ssrc = -1; Checksum Data */ static int hf_zrtp_checksum = -1; -static int hf_zrtp_checksum_good = -1; -static int hf_zrtp_checksum_bad = -1; +static int hf_zrtp_checksum_status = -1; /* Sub-Tree @@ -318,14 +317,13 @@ dissect_zrtp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_ proto_tree *zrtp_tree; proto_tree *zrtp_msg_tree; proto_tree *zrtp_msg_data_tree; - proto_tree *checksum_tree; proto_item *ti; int linelen; int checksum_offset; unsigned char message_type[9]; unsigned int prime_offset = 0; unsigned int msg_offset = 12; - guint32 sent_crc, calc_crc; + guint32 calc_crc; col_set_str(pinfo->cinfo, COL_PROTOCOL, "ZRTP"); @@ -416,27 +414,10 @@ dissect_zrtp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_ dissect_PingACK(tvb, pinfo, zrtp_msg_data_tree); } - sent_crc = tvb_get_ntohl(tvb, msg_offset+checksum_offset); calc_crc = ~crc32c_tvb_offset_calculate(tvb, 0, msg_offset+checksum_offset, CRC32C_PRELOAD); - if (sent_crc == calc_crc) { - ti = proto_tree_add_uint_format_value(zrtp_tree, hf_zrtp_checksum, tvb, msg_offset+checksum_offset, 4, sent_crc, - "0x%04x [correct]", sent_crc); - checksum_tree = proto_item_add_subtree(ti, ett_zrtp_checksum); - ti = proto_tree_add_boolean(checksum_tree, hf_zrtp_checksum_good, tvb, msg_offset+checksum_offset, 4, TRUE); - PROTO_ITEM_SET_GENERATED(ti); - ti = proto_tree_add_boolean(checksum_tree, hf_zrtp_checksum_bad, tvb, msg_offset+checksum_offset, 4, FALSE); - PROTO_ITEM_SET_GENERATED(ti); - } else { - ti = proto_tree_add_uint_format_value(zrtp_tree, hf_zrtp_checksum, tvb, msg_offset+checksum_offset, 4, sent_crc, - "0x%04x [incorrect, should be 0x%04x]", sent_crc, calc_crc); - checksum_tree = proto_item_add_subtree(ti, ett_zrtp_checksum); - ti = proto_tree_add_boolean(checksum_tree, hf_zrtp_checksum_good, tvb, msg_offset+checksum_offset, 4, FALSE); - PROTO_ITEM_SET_GENERATED(ti); - ti = proto_tree_add_boolean(checksum_tree, hf_zrtp_checksum_bad, tvb, msg_offset+checksum_offset, 4, TRUE); - PROTO_ITEM_SET_GENERATED(ti); - } - + proto_tree_add_checksum(zrtp_tree, tvb, msg_offset+checksum_offset, hf_zrtp_checksum, hf_zrtp_checksum_status, NULL, pinfo, calc_crc, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); return tvb_captured_length(tvb); } @@ -1098,21 +1079,12 @@ proto_register_zrtp(void) } }, - {&hf_zrtp_checksum_good, + {&hf_zrtp_checksum_status, { - "Good", "zrtp.checksum_good", - FT_BOOLEAN, BASE_NONE, - NULL, 0x0, - "True: checksum matches packet content; False: doesn't match content", HFILL - } - }, - - {&hf_zrtp_checksum_bad, - { - "Bad", "zrtp.checksum_bad", - FT_BOOLEAN, BASE_NONE, - NULL, 0x0, - "True: checksum doesn't match packet content; False: matches content", HFILL + "Checksum Status", "zrtp.checksum.status", + FT_UINT8, BASE_NONE, + VALS(proto_checksum_vals), 0x0, + NULL, HFILL } }, diff --git a/epan/proto.c b/epan/proto.c index 268e443221..5298ba4c16 100644 --- a/epan/proto.c +++ b/epan/proto.c @@ -53,6 +53,7 @@ #include "osi-utils.h" #include "expert.h" #include "show_exception.h" +#include "in_cksum.h" #include @@ -10012,6 +10013,133 @@ proto_tree_add_ascii_7bits_item(proto_tree *tree, const int hfindex, tvbuff_t *t return pi; } +const value_string proto_checksum_vals[] = { + { PROTO_CHECKSUM_E_BAD, "Bad" }, + { PROTO_CHECKSUM_E_GOOD, "Good" }, + { PROTO_CHECKSUM_E_UNVERIFIED, "Unverified" }, + { PROTO_CHECKSUM_E_NOT_PRESENT, "Not present" }, + + { 0, NULL } +}; + +proto_item * +proto_tree_add_checksum(proto_tree *tree, tvbuff_t *tvb, const guint offset, + const int hf_checksum, const int hf_checksum_status, struct expert_field* bad_checksum_expert, + packet_info *pinfo, guint32 computed_checksum, const guint encoding, const guint flags) +{ + header_field_info *hfinfo = proto_registrar_get_nth(hf_checksum); + guint32 checksum; + guint32 len; + proto_item* ti = NULL; + proto_item* ti2; + gboolean incorrect_checksum = TRUE; + + DISSECTOR_ASSERT_HINT(hfinfo != NULL, "Not passed hfi!"); + + if (flags & PROTO_CHECKSUM_NOT_PRESENT) { + ti = proto_tree_add_uint_format_value(tree, hf_checksum, tvb, offset, 0, 0, "[missing]"); + PROTO_ITEM_SET_GENERATED(ti); + if (hf_checksum_status != -1) { + ti2 = proto_tree_add_uint(tree, hf_checksum_status, tvb, offset, 0, PROTO_CHECKSUM_E_NOT_PRESENT); + PROTO_ITEM_SET_GENERATED(ti2); + } + return ti; + } + + switch (hfinfo->type){ + case FT_UINT8: + len = 1; + break; + case FT_UINT16: + len = 2; + break; + case FT_UINT24: + len = 3; + break; + case FT_UINT32: + len = 4; + break; + default: + DISSECTOR_ASSERT_NOT_REACHED(); + } + + if (flags & PROTO_CHECKSUM_GENERATED) { + ti = proto_tree_add_uint(tree, hf_checksum, tvb, offset, 0, computed_checksum); + PROTO_ITEM_SET_GENERATED(ti); + } else { + ti = proto_tree_add_item_ret_uint(tree, hf_checksum, tvb, offset, len, encoding, &checksum); + if (flags & PROTO_CHECKSUM_VERIFY) { + if (flags & (PROTO_CHECKSUM_IN_CKSUM|PROTO_CHECKSUM_ZERO)) { + if (computed_checksum == 0) { + proto_item_append_text(ti, " [correct]"); + if (hf_checksum_status != -1) { + ti2 = proto_tree_add_uint(tree, hf_checksum_status, tvb, offset, 0, PROTO_CHECKSUM_E_GOOD); + PROTO_ITEM_SET_GENERATED(ti2); + } + incorrect_checksum = FALSE; + } else if (flags & PROTO_CHECKSUM_IN_CKSUM) { + computed_checksum = in_cksum_shouldbe(checksum, computed_checksum); + } + } else { + if (checksum == computed_checksum) { + proto_item_append_text(ti, " [correct]"); + if (hf_checksum_status != -1) { + ti2 = proto_tree_add_uint(tree, hf_checksum_status, tvb, offset, 0, PROTO_CHECKSUM_E_GOOD); + PROTO_ITEM_SET_GENERATED(ti2); + } + incorrect_checksum = FALSE; + } + } + + if (incorrect_checksum) { + if (hf_checksum_status != -1) { + ti2 = proto_tree_add_uint(tree, hf_checksum_status, tvb, offset, 0, PROTO_CHECKSUM_E_BAD); + PROTO_ITEM_SET_GENERATED(ti2); + } + if (flags & PROTO_CHECKSUM_ZERO) { + proto_item_append_text(ti, " [incorrect]"); + if (bad_checksum_expert != NULL) + expert_add_info_format(pinfo, ti, bad_checksum_expert, "Bad checksum"); + } else { + switch(hfinfo->type) + { + case FT_UINT8: + proto_item_append_text(ti, " [incorrect, should be 0x%02x]", computed_checksum); + if (bad_checksum_expert != NULL) + expert_add_info_format(pinfo, ti, bad_checksum_expert, "Bad checksum [should be 0x%02x]", computed_checksum); + break; + case FT_UINT16: + proto_item_append_text(ti, " [incorrect, should be 0x%04x]", computed_checksum); + if (bad_checksum_expert != NULL) + expert_add_info_format(pinfo, ti, bad_checksum_expert, "Bad checksum [should be 0x%04x]", computed_checksum); + break; + case FT_UINT24: + proto_item_append_text(ti, " [incorrect, should be 0x%06x]", computed_checksum); + if (bad_checksum_expert != NULL) + expert_add_info_format(pinfo, ti, bad_checksum_expert, "Bad checksum [should be 0x%06x]", computed_checksum); + break; + case FT_UINT32: + proto_item_append_text(ti, " [incorrect, should be 0x%08x]", computed_checksum); + if (bad_checksum_expert != NULL) + expert_add_info_format(pinfo, ti, bad_checksum_expert, "Bad checksum [should be 0x%08x]", computed_checksum); + break; + default: + DISSECTOR_ASSERT_NOT_REACHED(); + } + } + } + } else { + if (hf_checksum_status != -1) { + proto_item_append_text(ti, " [unverified]"); + ti2 = proto_tree_add_uint(tree, hf_checksum_status, tvb, offset, 0, PROTO_CHECKSUM_E_UNVERIFIED); + PROTO_ITEM_SET_GENERATED(ti2); + } + } + } + + return ti; +} + guchar proto_check_field_name(const gchar *field_name) { diff --git a/epan/proto.h b/epan/proto.h index b48ecadeb7..de96b7cec7 100644 --- a/epan/proto.h +++ b/epan/proto.h @@ -45,6 +45,8 @@ #include "wsutil/nstime.h" #include "time_fmt.h" #include "tvbuff.h" +#include "value_string.h" +#include "packet_info.h" #include "ftypes/ftypes.h" #include "register.h" #include "ws_symbol_export.h" @@ -2847,6 +2849,47 @@ WS_DLL_PUBLIC proto_item * proto_tree_add_ascii_7bits_item(proto_tree *tree, const int hfindex, tvbuff_t *tvb, const guint bit_offset, const gint no_of_chars); +/** Add a checksum filed to a proto_tree. + This standardizes the display of a checksum field as well as any + status and expert info supporting it. + @param tree the tree to append this item to + @param tvb the tv buffer of the current data + @param offset start of data in tvb + @param hf_checksum checksum field index + @param hf_checksum_status optional checksum status field index. If none + exists, just pass -1 + @param bad_checksum_expert optional expert info for a bad checksum. If + none exists, just pass NULL + @pinfo Packet info used for optional expert info. If unused, NULL can + be passed + @param computed_checksum Checksum to verify against + @param encoding data encoding of checksum from tvb + @param flags bitmask field of PROTO_CHECKSUM_ options + @return the newly created item */ +WS_DLL_PUBLIC proto_item * +proto_tree_add_checksum(proto_tree *tree, tvbuff_t *tvb, const guint offset, + const int hf_checksum, const int hf_checksum_status, struct expert_field* bad_checksum_expert, + packet_info *pinfo, guint32 computed_checksum, const guint encoding, const guint flags); + +typedef enum +{ + PROTO_CHECKSUM_E_BAD = 0, + PROTO_CHECKSUM_E_GOOD, + PROTO_CHECKSUM_E_UNVERIFIED, + PROTO_CHECKSUM_E_NOT_PRESENT + +} proto_checksum_enum_e; + +#define PROTO_CHECKSUM_NO_FLAGS 0x00 /**< Don't use any flags */ +#define PROTO_CHECKSUM_VERIFY 0x01 /**< Compare against computed checksum */ +#define PROTO_CHECKSUM_GENERATED 0x02 /**< Checksum is generated only */ +#define PROTO_CHECKSUM_IN_CKSUM 0x04 /**< Internet checksum routine used for computation */ +#define PROTO_CHECKSUM_ZERO 0x08 /**< Computed checksum must be zero (but correct checksum can't be calculated) */ +#define PROTO_CHECKSUM_NOT_PRESENT 0x10 /**< Checksum field is not present (Just populates status field) */ + +WS_DLL_PUBLIC const value_string proto_checksum_vals[]; + + /** Check if given string is a valid field name @param field_name the field name to check @return 0 if valid, else first illegal character */ diff --git a/plugins/irda/packet-sir.c b/plugins/irda/packet-sir.c index 98ee323390..11188a47bf 100644 --- a/plugins/irda/packet-sir.c +++ b/plugins/irda/packet-sir.c @@ -56,10 +56,20 @@ static int hf_sir_bof = -1; /* static int hf_sir_ce = -1; */ static int hf_sir_eof = -1; static int hf_sir_fcs = -1; -static int hf_sir_fcs_bad = -1; +static int hf_sir_fcs_status = -1; static int hf_sir_length = -1; static int hf_sir_preamble = -1; +/* Copied and renamed from proto.c because global value_strings don't work for plugins */ +static const value_string plugin_proto_checksum_vals[] = { + { PROTO_CHECKSUM_E_BAD, "Bad" }, + { PROTO_CHECKSUM_E_GOOD, "Good" }, + { PROTO_CHECKSUM_E_UNVERIFIED, "Unverified" }, + { PROTO_CHECKSUM_E_NOT_PRESENT, "Not present" }, + + { 0, NULL } +}; + /** Unescapes the data. */ static tvbuff_t * @@ -94,29 +104,13 @@ unescape_data(tvbuff_t *tvb, packet_info *pinfo) static tvbuff_t * checksum_data(tvbuff_t *tvb, proto_tree *tree) { - proto_item *hidden_item; int len = tvb_reported_length(tvb) - 2; if (len < 0) return tvb; - if (tree) { - guint16 actual_fcs = tvb_get_letohs(tvb, len); - guint16 calculated_fcs = crc16_ccitt_tvb(tvb, len); - if (calculated_fcs == actual_fcs) { - proto_tree_add_uint_format(tree, hf_sir_fcs, - tvb, len, 2, actual_fcs, - "Frame check sequence: 0x%04x (correct)", - actual_fcs); - } else { - hidden_item = proto_tree_add_boolean(tree, - hf_sir_fcs_bad, tvb, len, 2, TRUE); - PROTO_ITEM_SET_HIDDEN(hidden_item); - proto_tree_add_uint_format(tree, hf_sir_fcs, - tvb, len, 2, actual_fcs, - "Frame check sequence: 0x%04x " - "(incorrect, should be 0x%04x)", - actual_fcs, calculated_fcs); - } - } + + proto_tree_add_checksum(tree, tvb, len, hf_sir_fcs, hf_sir_fcs_status, NULL, NULL, crc16_ccitt_tvb(tvb, len), + ENC_LITTLE_ENDIAN, PROTO_CHECKSUM_VERIFY); + return tvb_new_subset_length(tvb, 0, len); } @@ -209,9 +203,9 @@ proto_register_irsir(void) { "Frame check sequence", "sir.fcs", FT_UINT16, BASE_HEX, NULL, 0, NULL, HFILL }}, - { &hf_sir_fcs_bad, - { "Bad frame check sequence", "sir.fcs_bad", - FT_BOOLEAN, BASE_NONE, NULL, 0x0, + { &hf_sir_fcs_status, + { "Frame check sequence Status", "sir.fcs.status", + FT_UINT8, BASE_NONE, VALS(plugin_proto_checksum_vals), 0x0, NULL, HFILL }}, { &hf_sir_length, { "Length", "sir.length", diff --git a/plugins/profinet/packet-pn-rt.c b/plugins/profinet/packet-pn-rt.c index 8757a1a9ff..885cd9fc68 100644 --- a/plugins/profinet/packet-pn-rt.c +++ b/plugins/profinet/packet-pn-rt.c @@ -58,8 +58,7 @@ static int hf_pn_rt_data_status_redundancy = -1; static int hf_pn_rt_data_status_primary = -1; static int hf_pn_rt_sf_crc16 = -1; -static int hf_pn_rt_sf_crc16_ok = -1; -static int hf_pn_rt_sf_crc16_null = -1; +static int hf_pn_rt_sf_crc16_status = -1; static int hf_pn_rt_sf = -1; static int hf_pn_rt_sf_position = -1; /* static int hf_pn_rt_sf_position_control = -1; */ @@ -124,6 +123,16 @@ static const value_string pn_rt_frag_status_more_follows[] = { { 0, NULL } }; +/* Copied and renamed from proto.c because global value_strings don't work for plugins */ +static const value_string plugin_proto_checksum_vals[] = { + { PROTO_CHECKSUM_E_BAD, "Bad" }, + { PROTO_CHECKSUM_E_GOOD, "Good" }, + { PROTO_CHECKSUM_E_UNVERIFIED, "Unverified" }, + { PROTO_CHECKSUM_E_NOT_PRESENT, "Not present" }, + + { 0, NULL } +}; + static void dissect_DataStatus(tvbuff_t *tvb, int offset, proto_tree *tree, guint8 u8DataStatus) { @@ -246,7 +255,6 @@ dissect_CSF_SDU_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void * guint32 u32SubStart; proto_item *sub_item; proto_tree *sub_tree; - proto_item *item; guint16 crc; @@ -256,10 +264,16 @@ dissect_CSF_SDU_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void * if (IsDFP_Frame(tvb, pinfo, tree, u16FrameID)) { /* can't check this CRC, as the checked data bytes are not available */ u16SFCRC16 = tvb_get_letohs(tvb, offset); - if (u16SFCRC16 != 0) - proto_tree_add_uint(tree, hf_pn_rt_sf_crc16_ok, tvb, offset, 2, u16SFCRC16); - else - proto_tree_add_uint(tree, hf_pn_rt_sf_crc16_null, tvb, offset, 2, u16SFCRC16); + if (u16SFCRC16 != 0) { + /* Checksum verify will always succeed */ + /* XXX - should we combine the two calls to always show "unverified"? */ + proto_tree_add_checksum(tree, tvb, offset, hf_pn_rt_sf_crc16, hf_pn_rt_sf_crc16_status, &ei_pn_rt_sf_crc16, pinfo, u16SFCRC16, + ENC_LITTLE_ENDIAN, PROTO_CHECKSUM_VERIFY); + } + else { + proto_tree_add_checksum(tree, tvb, offset, hf_pn_rt_sf_crc16, hf_pn_rt_sf_crc16_status, &ei_pn_rt_sf_crc16, pinfo, 0, + ENC_LITTLE_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); + } offset += 2; while (1) { @@ -292,18 +306,14 @@ dissect_CSF_SDU_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void * offset = dissect_pn_user_data(tvb, offset, pinfo, sub_tree, u8SFDataLength, "DataItem"); u16SFCRC16 = tvb_get_letohs(tvb, offset); - item = proto_tree_add_uint(sub_tree, hf_pn_rt_sf_crc16, tvb, offset, 2, u16SFCRC16); if (u16SFCRC16 != 0 /* "old check": u8SFPosition & 0x80 */) { crc = crc16_plain_tvb_offset_seed(tvb, u32SubStart, offset-u32SubStart, 0); - if (crc != u16SFCRC16) { - proto_item_append_text(item, " [Preliminary check: incorrect, should be: %u]", crc); - expert_add_info(pinfo, item, &ei_pn_rt_sf_crc16); - } else { - proto_item_append_text(item, " [Preliminary check: Correct]"); - } + proto_tree_add_checksum(tree, tvb, offset, hf_pn_rt_sf_crc16, hf_pn_rt_sf_crc16_status, &ei_pn_rt_sf_crc16, pinfo, crc, + ENC_LITTLE_ENDIAN, PROTO_CHECKSUM_VERIFY); } else { - proto_item_append_text(item, " [No check, supplied CRC == zero]"); + proto_tree_add_checksum(tree, tvb, offset, hf_pn_rt_sf_crc16, hf_pn_rt_sf_crc16_status, &ei_pn_rt_sf_crc16, pinfo, 0, + ENC_LITTLE_ENDIAN, PROTO_CHECKSUM_NO_FLAGS); } offset += 2; @@ -872,14 +882,9 @@ proto_register_pn_rt(void) FT_UINT16, BASE_HEX, NULL, 0x0, NULL, HFILL }}, - { &hf_pn_rt_sf_crc16_ok, - { "SFCRC16 checked [ok]", "pn_rt.sf.crc16_ok", - FT_UINT16, BASE_HEX, NULL, 0x0, - NULL, HFILL }}, - - { &hf_pn_rt_sf_crc16_null, - { "SFCRC16 not checked but ok", "pn_rt.sf.crc16_null", - FT_UINT16, BASE_HEX, NULL, 0x0, + { &hf_pn_rt_sf_crc16_status, + { "SFCRC16 status", "pn_rt.sf.crc16.status", + FT_UINT8, BASE_NONE, VALS(plugin_proto_checksum_vals), 0x0, NULL, HFILL }}, { &hf_pn_rt_sf_position, diff --git a/plugins/wimax/mac_hd_generic_decoder.c b/plugins/wimax/mac_hd_generic_decoder.c index b5fc149827..ad47a3915f 100644 --- a/plugins/wimax/mac_hd_generic_decoder.c +++ b/plugins/wimax/mac_hd_generic_decoder.c @@ -1218,16 +1218,12 @@ check_crc: proto_item_append_text(parent_item, ", CRC"); /* check the length */ if (MIN(tvb_len, tvb_reported_length(tvb)) >= mac_len) - { /* get the CRC */ - mac_crc = tvb_get_ntohl(tvb, mac_len - (int)sizeof(mac_crc)); - /* calculate the CRC */ + { + /* calculate the CRC */ calculated_crc = wimax_mac_calc_crc32(tvb_get_ptr(tvb, 0, mac_len - (int)sizeof(mac_crc)), mac_len - (int)sizeof(mac_crc)); /* display the CRC */ - generic_item = proto_tree_add_item(tree, hf_mac_header_generic_crc, tvb, mac_len - (int)sizeof(mac_crc), (int)sizeof(mac_crc), ENC_BIG_ENDIAN); - if (mac_crc != calculated_crc) - { - proto_item_append_text(generic_item, " - incorrect! (should be: 0x%x)", calculated_crc); - } + proto_tree_add_checksum(tree, tvb, mac_len - (int)sizeof(mac_crc), hf_mac_header_generic_crc, -1, NULL, pinfo, calculated_crc, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); } else { /* display error message */ diff --git a/plugins/wimax/msg_dlmap.c b/plugins/wimax/msg_dlmap.c index 8a3ae02371..6f022cbdf4 100644 --- a/plugins/wimax/msg_dlmap.c +++ b/plugins/wimax/msg_dlmap.c @@ -822,9 +822,7 @@ static gint DL_HARQ_IR_CTC_sub_burst_IE(proto_tree *diuc_tree, gint offset, gint { /* offset of IE in nibbles, length is variable */ gint bit; - guint data; proto_tree *tree; - proto_item *generic_item = NULL; gint nsub, ddci, dur; gint j; guint32 calculated_crc; @@ -867,14 +865,9 @@ static gint DL_HARQ_IR_CTC_sub_burst_IE(proto_tree *diuc_tree, gint offset, gint if (include_cor2_changes) { /* CRC-16 is always appended */ - data = TVB_BIT_BITS(bit, tvb, 16); - generic_item = proto_tree_add_uint(tree, hf_crc16, tvb, BITHI(bit,16), data); - /* calculate the CRC */ calculated_crc = wimax_mac_calc_crc16(tvb_get_ptr(tvb, 0, BIT_TO_BYTE(bit)), BIT_TO_BYTE(bit)); - if (data != calculated_crc) - { - proto_item_append_text(generic_item, " - incorrect! (should be: 0x%x)", calculated_crc); - } + proto_tree_add_checksum(tree, tvb, BIT_ADDR(bit), hf_crc16, -1, NULL, NULL, calculated_crc, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); bit += 16; } @@ -885,9 +878,7 @@ static gint DL_HARQ_IR_CC_sub_burst_IE(proto_tree *diuc_tree, gint offset, gint { /* offset of IE in nibbles, length is variable */ gint bit; - gint data; proto_tree *tree; - proto_item *generic_item = NULL; gint nsub, sbdi, ddci, dur; gint j; guint16 calculated_crc; @@ -938,14 +929,9 @@ static gint DL_HARQ_IR_CC_sub_burst_IE(proto_tree *diuc_tree, gint offset, gint if (include_cor2_changes) { /* CRC-16 is always appended */ - data = TVB_BIT_BITS(bit, tvb, 16); - generic_item = proto_tree_add_uint(tree, hf_crc16, tvb, BITHI(bit,16), data); - /* calculate the CRC */ calculated_crc = wimax_mac_calc_crc16(tvb_get_ptr(tvb, 0, BIT_TO_BYTE(bit)), BIT_TO_BYTE(bit)); - if (data != calculated_crc) - { - proto_item_append_text(generic_item, " - incorrect! (should be: 0x%x)", calculated_crc); - } + proto_tree_add_checksum(tree, tvb, BIT_ADDR(bit), hf_crc16, -1, NULL, NULL, calculated_crc, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); bit += 16; } @@ -958,7 +944,6 @@ static gint MIMO_DL_Chase_HARQ_sub_burst_IE(proto_tree *diuc_tree, gint offset, gint bit; gint data; proto_tree *tree; - proto_item *generic_item = NULL; gint nsub, mui, dci, akd; gint i, j; guint16 calculated_crc; @@ -1005,14 +990,9 @@ static gint MIMO_DL_Chase_HARQ_sub_burst_IE(proto_tree *diuc_tree, gint offset, if (include_cor2_changes) { /* CRC-16 is always appended */ - data = TVB_BIT_BITS(bit, tvb, 16); - generic_item = proto_tree_add_uint(tree, hf_crc16, tvb, BITHI(bit,16), data); - /* calculate the CRC */ calculated_crc = wimax_mac_calc_crc16(tvb_get_ptr(tvb, 0, BIT_TO_BYTE(bit)), BIT_TO_BYTE(bit)); - if (data != calculated_crc) - { - proto_item_append_text(generic_item, " - incorrect! (should be: 0x%x)", calculated_crc); - } + proto_tree_add_checksum(tree, tvb, BIT_ADDR(bit), hf_crc16, -1, NULL, NULL, calculated_crc, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); bit += 16; } @@ -1023,9 +1003,7 @@ static gint MIMO_DL_IR_HARQ_sub_burst_IE(proto_tree *diuc_tree, gint offset, gin { /* offset of IE in nibbles, length is variable */ gint bit; - gint data; proto_tree *tree; - proto_item *generic_item = NULL; gint nsub, mui, dci, akd; gint i, j; guint16 calculated_crc; @@ -1066,14 +1044,9 @@ static gint MIMO_DL_IR_HARQ_sub_burst_IE(proto_tree *diuc_tree, gint offset, gin if (include_cor2_changes) { /* CRC-16 is always appended */ - data = TVB_BIT_BITS(bit, tvb, 16); - generic_item = proto_tree_add_uint(tree, hf_crc16, tvb, BITHI(bit,16), data); - /* calculate the CRC */ calculated_crc = wimax_mac_calc_crc16(tvb_get_ptr(tvb, 0, BIT_TO_BYTE(bit)), BIT_TO_BYTE(bit)); - if (data != calculated_crc) - { - proto_item_append_text(generic_item, " - incorrect! (should be: 0x%x)", calculated_crc); - } + proto_tree_add_checksum(tree, tvb, BIT_ADDR(bit), hf_crc16, -1, NULL, NULL, calculated_crc, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); bit += 16; } @@ -1084,9 +1057,7 @@ static gint MIMO_DL_IR_HARQ_for_CC_sub_burst_IE(proto_tree *diuc_tree, gint offs { /* offset of IE in nibbles, length is variable */ gint bit; - gint data; proto_tree *tree; - proto_item *generic_item = NULL; gint nsub, mui, dci, akd; gint i, j; guint16 calculated_crc; @@ -1128,14 +1099,9 @@ static gint MIMO_DL_IR_HARQ_for_CC_sub_burst_IE(proto_tree *diuc_tree, gint offs if (include_cor2_changes) { /* CRC-16 is always appended */ - data = TVB_BIT_BITS(bit, tvb, 16); - generic_item = proto_tree_add_uint(tree, hf_crc16, tvb, BITHI(bit,16), data); - /* calculate the CRC */ calculated_crc = wimax_mac_calc_crc16(tvb_get_ptr(tvb, 0, BIT_TO_BYTE(bit)), BIT_TO_BYTE(bit)); - if (data != calculated_crc) - { - proto_item_append_text(generic_item, " - incorrect! (should be: 0x%x)", calculated_crc); - } + proto_tree_add_checksum(tree, tvb, BIT_ADDR(bit), hf_crc16, -1, NULL, NULL, calculated_crc, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); bit += 16; } @@ -1146,9 +1112,7 @@ static gint MIMO_DL_STC_HARQ_sub_burst_IE(proto_tree *diuc_tree, gint offset, gi { /* offset of IE in nibbles, length is variable */ gint bit; - gint data; proto_tree *tree; - proto_item *generic_item = NULL; gint nsub, sbi, txc, akd, dmci; gint j; guint16 calculated_crc; @@ -1188,14 +1152,9 @@ static gint MIMO_DL_STC_HARQ_sub_burst_IE(proto_tree *diuc_tree, gint offset, gi if (include_cor2_changes) { /* CRC-16 is always appended */ - data = TVB_BIT_BITS(bit, tvb, 16); - generic_item = proto_tree_add_uint(tree, hf_crc16, tvb, BITHI(bit,16), data); - /* calculate the CRC */ calculated_crc = wimax_mac_calc_crc16(tvb_get_ptr(tvb, 0, BIT_TO_BYTE(bit)), BIT_TO_BYTE(bit)); - if (data != calculated_crc) - { - proto_item_append_text(generic_item, " - incorrect! (should be: 0x%x)", calculated_crc); - } + proto_tree_add_checksum(tree, tvb, BIT_ADDR(bit), hf_crc16, -1, NULL, NULL, calculated_crc, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); bit += 16; } @@ -2341,7 +2300,6 @@ gint wimax_decode_dlmapc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *base_tre proto_item *ti = NULL; proto_item *ti_phy = NULL; proto_item *ti_dlmap_ies = NULL; - proto_item *generic_item = NULL; proto_tree *tree = NULL; proto_tree *ie_tree = NULL; proto_tree *phy_tree = NULL; @@ -2424,16 +2382,11 @@ gint wimax_decode_dlmapc(tvbuff_t *tvb, packet_info *pinfo, proto_tree *base_tre /* CRC is always appended */ /* check the length */ if (MIN(tvb_len, tvb_reported_length(tvb)) >= mac_len) - { /* get the CRC */ - mac_crc = tvb_get_ntohl(tvb, mac_len - (int)sizeof(mac_crc)); + { /* calculate the CRC */ calculated_crc = wimax_mac_calc_crc32(tvb_get_ptr(tvb, 0, mac_len - (int)sizeof(mac_crc)), mac_len - (int)sizeof(mac_crc)); - /* display the CRC */ - generic_item = proto_tree_add_item(base_tree, hf_mac_header_compress_dlmap_crc, tvb, mac_len - (int)sizeof(mac_crc), (int)sizeof(mac_crc), ENC_BIG_ENDIAN); - if (mac_crc != calculated_crc) - { - proto_item_append_text(generic_item, " - incorrect! (should be: 0x%x)", calculated_crc); - } + proto_tree_add_checksum(base_tree, tvb, mac_len - (int)sizeof(mac_crc), hf_mac_header_compress_dlmap_crc, -1, NULL, pinfo, calculated_crc, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); } else { /* display error message */ @@ -2510,14 +2463,9 @@ static gint wimax_decode_sub_dl_ul_map(tvbuff_t *tvb, packet_info *pinfo, proto_ } /* CRC-16 is always appended */ - data = TVB_NIB_WORD(nib, tvb); - generic_item = proto_tree_add_uint(tree, hf_crc16, tvb, NIBHI(nib,4), data); - /* calculate the CRC */ calculated_crc = wimax_mac_calc_crc16(tvb_get_ptr(tvb, 0, NIB_TO_BYTE(nib)), NIB_TO_BYTE(nib)); - if (data != calculated_crc) - { - proto_item_append_text(generic_item, " - incorrect! (should be: 0x%x)", calculated_crc); - } + proto_tree_add_checksum(tree, tvb, NIBHI(nib,4), hf_crc16, -1, NULL, pinfo, calculated_crc, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); /* nib += 4; */ sub_dl_ul_map = 0; /* clear flag */ @@ -2533,7 +2481,6 @@ gint wimax_decode_dlmap_reduced_aas(tvbuff_t *tvb, packet_info *pinfo _U_, proto guint offset = 0; proto_item *ti = NULL; proto_tree *tree = NULL; - proto_item *generic_item = NULL; gint ulmap_appended; gint length; gint tvb_len = tvb_reported_length(tvb); @@ -2636,14 +2583,9 @@ gint wimax_decode_dlmap_reduced_aas(tvbuff_t *tvb, packet_info *pinfo _U_, proto } /* CRC-16 is always appended */ - data = TVB_BIT_BITS(bit, tvb, 16); - generic_item = proto_tree_add_uint(tree, hf_crc16, tvb, BITHI(bit,16), data); - /* calculate the CRC */ calculated_crc = wimax_mac_calc_crc16(tvb_get_ptr(tvb, 0, BIT_TO_BYTE(bit)), BIT_TO_BYTE(bit)); - if (data != calculated_crc) - { - proto_item_append_text(generic_item, " - incorrect! (should be: 0x%x)", calculated_crc); - } + proto_tree_add_checksum(tree, tvb, BIT_ADDR(bit), hf_crc16, -1, NULL, pinfo, calculated_crc, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); bit += 16; return BIT_TO_BYTE(bit) - offset; diff --git a/plugins/wimax/msg_ulmap.c b/plugins/wimax/msg_ulmap.c index afce354898..dd19011bd8 100644 --- a/plugins/wimax/msg_ulmap.c +++ b/plugins/wimax/msg_ulmap.c @@ -634,16 +634,10 @@ static gint UL_HARQ_Chase_Sub_Burst_IE(proto_tree *uiuc_tree, gint offset, gint #if 0 if (include_cor2_changes) { - /* CRC-16 is always appended */ - data = TVB_BIT_BITS(bit, tvb, 16); - generic_item = proto_tree_add_uint(tree, hf_ulmap_crc16, tvb, BITHI(bit,16), data); - /* calculate the CRC */ - calculated_crc = wimax_mac_calc_crc16((guint8 *)tvb_get_ptr(tvb, 0, BIT_TO_BYTE(bit)), BIT_TO_BYTE(bit)); - if (data != calculated_crc) - { - proto_item_append_text(generic_item, " - incorrect! (should be: 0x%x)", calculated_crc); - } - bit += 16; + calculated_crc = wimax_mac_calc_crc16((guint8 *)tvb_get_ptr(tvb, 0, BIT_TO_BYTE(bit)), BIT_TO_BYTE(bit)); + proto_tree_add_checksum(tree, tvb, BITHI(bit,16), hf_ulmap_crc16, -1, NULL, pinfo, calculated_crc, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); + bit += 16; } #endif @@ -680,16 +674,11 @@ static gint UL_HARQ_IR_CTC_Sub_Burst_IE(proto_tree *uiuc_tree, gint offset, gint #if 0 if (include_cor2_changes) { - /* CRC-16 is always appended */ - data = TVB_BIT_BITS(bit, tvb, 16); - generic_item = proto_tree_add_uint(tree, hf_ulmap_crc16, tvb, BITHI(bit,16), data); - /* calculate the CRC */ - calculated_crc = wimax_mac_calc_crc16((guint8 *)tvb_get_ptr(tvb, 0, BIT_TO_BYTE(bit)), BIT_TO_BYTE(bit)); - if (data != calculated_crc) - { - proto_item_append_text(generic_item, " - incorrect! (should be: 0x%x)", calculated_crc); - } - bit += 16; + /* CRC-16 is always appended */ + calculated_crc = wimax_mac_calc_crc16((guint8 *)tvb_get_ptr(tvb, 0, BIT_TO_BYTE(bit)), BIT_TO_BYTE(bit)); + proto_tree_add_checksum(tree, tvb, BITHI(bit,16), hf_ulmap_crc16, -1, NULL, pinfo, calculated_crc, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); + bit += 16; } #endif @@ -727,16 +716,12 @@ static gint UL_HARQ_IR_CC_Sub_Burst_IE(proto_tree *uiuc_tree, gint offset, gint #if 0 if (include_cor2_changes) { - /* CRC-16 is always appended */ - data = TVB_BIT_BITS(bit, tvb, 16); - generic_item = proto_tree_add_uint(tree, hf_ulmap_crc16, tvb, BITHI(bit,16), data); - /* calculate the CRC */ - calculated_crc = wimax_mac_calc_crc16((guint8 *)tvb_get_ptr(tvb, 0, BIT_TO_BYTE(bit)), BIT_TO_BYTE(bit)); - if (data != calculated_crc) - { - proto_item_append_text(generic_item, " - incorrect! (should be: 0x%x)", calculated_crc); - } - bit += 16; + /* CRC-16 is always appended */ + calculated_crc = wimax_mac_calc_crc16((guint8 *)tvb_get_ptr(tvb, 0, BIT_TO_BYTE(bit)), BIT_TO_BYTE(bit)); + proto_tree_add_checksum(tree, tvb, BITHI(bit,16), hf_ulmap_crc16, -1, NULL, pinfo, calculated_crc, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); + + bit += 16; } #endif @@ -784,16 +769,12 @@ static gint MIMO_UL_Chase_HARQ_Sub_Burst_IE(proto_tree *uiuc_tree, gint offset, #if 0 if (include_cor2_changes) { - /* CRC-16 is always appended */ - data = TVB_BIT_BITS(bit, tvb, 16); - generic_item = proto_tree_add_uint(tree, hf_ulmap_crc16, tvb, BITHI(bit,16), data); - /* calculate the CRC */ - calculated_crc = wimax_mac_calc_crc16((guint8 *)tvb_get_ptr(tvb, 0, BIT_TO_BYTE(bit)), BIT_TO_BYTE(bit)); - if (data != calculated_crc) - { - proto_item_append_text(generic_item, " - incorrect! (should be: 0x%x)", calculated_crc); - } - bit += 16; + /* CRC-16 is always appended */ + calculated_crc = wimax_mac_calc_crc16((guint8 *)tvb_get_ptr(tvb, 0, BIT_TO_BYTE(bit)), BIT_TO_BYTE(bit)); + proto_tree_add_checksum(tree, tvb, BITHI(bit,16), hf_ulmap_crc16, -1, NULL, pinfo, calculated_crc, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); + + bit += 16; } #endif @@ -841,16 +822,12 @@ static gint MIMO_UL_IR_HARQ__Sub_Burst_IE(proto_tree *uiuc_tree, gint offset, gi #if 0 if (include_cor2_changes) { - /* CRC-16 is always appended */ - data = TVB_BIT_BITS(bit, tvb, 16); - generic_item = proto_tree_add_uint(tree, hf_ulmap_crc16, tvb, BITHI(bit,16), data); - /* calculate the CRC */ - calculated_crc = wimax_mac_calc_crc16((guint8 *)tvb_get_ptr(tvb, 0, BIT_TO_BYTE(bit)), BIT_TO_BYTE(bit)); - if (data != calculated_crc) - { - proto_item_append_text(generic_item, " - incorrect! (should be: 0x%x)", calculated_crc); - } - bit += 16; + /* CRC-16 is always appended */ + calculated_crc = wimax_mac_calc_crc16((guint8 *)tvb_get_ptr(tvb, 0, BIT_TO_BYTE(bit)), BIT_TO_BYTE(bit)); + proto_tree_add_checksum(tree, tvb, BITHI(bit,16), hf_ulmap_crc16, -1, NULL, pinfo, calculated_crc, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); + + bit += 16; } #endif @@ -899,16 +876,12 @@ static gint MIMO_UL_IR_HARQ_for_CC_Sub_Burst_UIE(proto_tree *uiuc_tree, gint off #if 0 if (include_cor2_changes) { - /* CRC-16 is always appended */ - data = TVB_BIT_BITS(bit, tvb, 16); - generic_item = proto_tree_add_uint(tree, hf_ulmap_crc16, tvb, BITHI(bit,16), data); - /* calculate the CRC */ - calculated_crc = wimax_mac_calc_crc16((guint8 *)tvb_get_ptr(tvb, 0, BIT_TO_BYTE(bit)), BIT_TO_BYTE(bit)); - if (data != calculated_crc) - { - proto_item_append_text(generic_item, " - incorrect! (should be: 0x%x)", calculated_crc); - } - bit += 16; + /* CRC-16 is always appended */ + calculated_crc = wimax_mac_calc_crc16((guint8 *)tvb_get_ptr(tvb, 0, BIT_TO_BYTE(bit)), BIT_TO_BYTE(bit)); + proto_tree_add_checksum(tree, tvb, BITHI(bit,16), hf_ulmap_crc16, -1, NULL, pinfo, calculated_crc, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); + + bit += 16; } #endif @@ -949,16 +922,12 @@ static gint MIMO_UL_STC_HARQ_Sub_Burst_IE(proto_tree *uiuc_tree, gint offset, gi #if 0 if (include_cor2_changes) { - /* CRC-16 is always appended */ - data = TVB_BIT_BITS(bit, tvb, 16); - generic_item = proto_tree_add_uint(tree, hf_ulmap_crc16, tvb, BITHI(bit,16), data); - /* calculate the CRC */ - calculated_crc = wimax_mac_calc_crc16((guint8 *)tvb_get_ptr(tvb, 0, BIT_TO_BYTE(bit)), BIT_TO_BYTE(bit)); - if (data != calculated_crc) - { - proto_item_append_text(generic_item, " - incorrect! (should be: 0x%x)", calculated_crc); - } - bit += 16; + /* CRC-16 is always appended */ + calculated_crc = wimax_mac_calc_crc16((guint8 *)tvb_get_ptr(tvb, 0, BIT_TO_BYTE(bit)), BIT_TO_BYTE(bit)); + proto_tree_add_checksum(tree, tvb, BITHI(bit,16), hf_ulmap_crc16, -1, NULL, pinfo, calculated_crc, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); + + bit += 16; } #endif diff --git a/plugins/wimax/wimax_harq_map_decoder.c b/plugins/wimax/wimax_harq_map_decoder.c index dd643ff37d..0666515160 100644 --- a/plugins/wimax/wimax_harq_map_decoder.c +++ b/plugins/wimax/wimax_harq_map_decoder.c @@ -71,7 +71,6 @@ static int dissector_wimax_harq_map_decoder(tvbuff_t *tvb, packet_info *pinfo, p proto_tree *harq_map_tree = NULL; guint nibble_offset; proto_item *parent_item = NULL; - proto_item *it = NULL; guint ulmap_appended; guint32 harq_map_msg_crc, calculated_crc; guint32 first_24bits; @@ -150,17 +149,10 @@ static int dissector_wimax_harq_map_decoder(tvbuff_t *tvb, packet_info *pinfo, p } /* add the CRC info */ proto_item_append_text(parent_item, ",CRC"); - /* get the CRC */ - harq_map_msg_crc = tvb_get_ntohl(tvb, length - (int)sizeof(harq_map_msg_crc)); /* calculate the HARQ MAM Message CRC */ calculated_crc = wimax_mac_calc_crc32(tvb_get_ptr(tvb, 0, length - (int)sizeof(harq_map_msg_crc)), length - (int)sizeof(harq_map_msg_crc)); - /* display the CRC */ - it = proto_tree_add_item(harq_map_tree, hf_harq_map_msg_crc, tvb, length - (int)sizeof(harq_map_msg_crc), (int)sizeof(harq_map_msg_crc), ENC_BIG_ENDIAN); - /* verify the CRC */ - if (harq_map_msg_crc != calculated_crc) - { - proto_item_append_text(it, " - incorrect! (should be: 0x%x)", calculated_crc); - } + proto_tree_add_checksum(tree, tvb, length - (int)sizeof(harq_map_msg_crc), hf_harq_map_msg_crc, -1, NULL, pinfo, calculated_crc, + ENC_BIG_ENDIAN, PROTO_CHECKSUM_VERIFY); } return tvb_captured_length(tvb); } diff --git a/profiles/Bluetooth/colorfilters b/profiles/Bluetooth/colorfilters index 73b03f1b1f..ad5f5a81af 100644 --- a/profiles/Bluetooth/colorfilters +++ b/profiles/Bluetooth/colorfilters @@ -9,7 +9,7 @@ @TCP RST@tcp.flags.reset eq 1@[42148,0,0][65535,64764,40092] @SCTP ABORT@sctp.chunk_type eq ABORT@[42148,0,0][65535,64764,40092] @TTL low or unexpected@( ! ip.dst == 224.0.0.0/4 && ip.ttl < 5 && !pim) || (ip.dst == 224.0.0.0/24 && ip.dst != 224.0.0.251 && ip.ttl != 1 && !(vrrp || carp))@[42148,0,0][60652,61680,60395] -@Checksum Errors@eth.fcs_bad==1 || ip.checksum_bad==1 || tcp.checksum_bad==1 || udp.checksum_bad==1 || sctp.checksum_bad==1 || mstp.checksum_bad==1 || cdp.checksum_bad==1 || edp.checksum_bad==1 || wlan.fcs_bad==1@[4718,10030,11796][63479,34695,34695] +@Checksum Errors@eth.fcs.status=="Bad" || ip.checksum.status=="Bad" || tcp.checksum.status=="Bad" || udp.checksum.status=="Bad" || sctp.checksum.status=="Bad" || mstp.checksum.status=="Bad" || cdp.checksum.status=="Bad" || edp.checksum.status=="Bad" || wlan.fcs.status=="Bad"@[4718,10030,11796][63479,34695,34695] @SMB@smb || nbss || nbns || nbipx || ipxsap || netbios@[65278,65535,53456][4718,10030,11796] @HTTP@http || tcp.port == 80@[58596,65535,51143][4718,10030,11796] @IPX@ipx || spx@[65534,58325,58808][4718,10030,11796] diff --git a/profiles/Classic/colorfilters b/profiles/Classic/colorfilters index 382f5be52a..5f8db510b8 100644 --- a/profiles/Classic/colorfilters +++ b/profiles/Classic/colorfilters @@ -9,7 +9,7 @@ @TCP RST@tcp.flags.reset eq 1@[37008,0,0][65535,63121,32911] @SCTP ABORT@sctp.chunk_type eq ABORT@[37008,0,0][65535,63121,32911] @TTL low or unexpected@( ! ip.dst == 224.0.0.0/4 && ip.ttl < 5 && !pim) || (ip.dst == 224.0.0.0/24 && ip.dst != 224.0.0.251 && ip.ttl != 1 && !(vrrp || carp))@[42148,0,0][60652,61680,60395] -@Checksum Errors@cdp.checksum_bad==1 || edp.checksum_bad==1 || ip.checksum_bad==1 || tcp.checksum_bad==1 || udp.checksum_bad==1 || sctp.checksum_bad==1 || mstp.checksum_bad==1@[0,0,0][65535,24383,24383] +@Checksum Errors@cdp.checksum.status=="Bad" || edp.checksum.status=="Bad" || ip.checksum.status=="Bad" || tcp.checksum.status=="Bad" || udp.checksum.status=="Bad"|| sctp.checksum.status=="Bad" || mstp.checksum.status=="Bad"@[0,0,0][65535,24383,24383] @SMB@smb || nbss || nbns || nbipx || ipxsap || netbios@[65534,64008,39339][0,0,0] @HTTP@http || tcp.port == 80@[36107,65535,32590][0,0,0] @IPX@ipx || spx@[65534,58325,58808][0,0,0] diff --git a/tools/checkAPIs.pl b/tools/checkAPIs.pl index 36a2110f2d..f78ce92baa 100755 --- a/tools/checkAPIs.pl +++ b/tools/checkAPIs.pl @@ -1578,7 +1578,7 @@ sub check_proto_tree_add_XXX_encoding($$) $args =~ s/\(.*\)//sg; if ($args =~ /,\s*ENC_/xos) { - if (!($func =~ /proto_tree_add_(time|item|bitmask|bits_item|bits_ret_val|item_ret_int|item_ret_uint|bytes_item)/xos) + if (!($func =~ /proto_tree_add_(time|item|bitmask|bits_item|bits_ret_val|item_ret_int|item_ret_uint|bytes_item|checksum)/xos) ) { print STDERR "Error: ".$filename." uses $func with ENC_*.\n"; $errorCount++;