Ethereal-dev: Re: [ethereal-dev] ICMP Checksum
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Guy Harris <gharris@xxxxxxxxxxxx>
Date: Fri, 9 Jun 2000 22:50:01 -0700
On Fri, Jun 09, 2000 at 06:50:35PM -0400, Joshua Krage wrote: > Well here is a vote that ICMP checksums receive some attention. :) Well, here is a patch that should do the job, although it suffers from one of the same problems as my TCP/UDP payload checksum patch, i.e. it doesn't blow off the checksum checking for fragmented datagrams.
Index: packet-ip.c =================================================================== RCS file: /usr/local/cvsroot/ethereal/packet-ip.c,v retrieving revision 1.92 diff -c -r1.92 packet-ip.c *** packet-ip.c 2000/06/05 03:21:01 1.92 --- packet-ip.c 2000/06/10 05:47:56 *************** *** 775,791 **** "Not set" }; ! static char *ip_checksum_state(e_ip *iph) { unsigned long Sum; ! unsigned char *Ptr, *PtrEnd; unsigned short word; Sum = 0; ! PtrEnd = (lo_nibble(iph->ip_v_hl) * 4 + (char *)iph); ! for (Ptr = (unsigned char *) iph; Ptr < PtrEnd; Ptr += 2) { memcpy(&word, Ptr, sizeof word); Sum += word; } Sum = (Sum & 0xFFFF) + (Sum >> 16); --- 775,792 ---- "Not set" }; ! static char *ip_checksum_state(const u_char *Ptr, int len) { unsigned long Sum; ! const u_char *PtrEnd; unsigned short word; Sum = 0; ! PtrEnd = Ptr + len; ! while (Ptr < PtrEnd) { memcpy(&word, Ptr, sizeof word); Sum += word; + Ptr += 2; } Sum = (Sum & 0xFFFF) + (Sum >> 16); *************** *** 903,909 **** proto_tree_add_uint_format(ip_tree, hf_ip_proto, NullTVB, offset + 9, 1, iph.ip_p, "Protocol: %s (0x%02x)", ipprotostr(iph.ip_p), iph.ip_p); proto_tree_add_uint_format(ip_tree, hf_ip_checksum, NullTVB, offset + 10, 2, iph.ip_sum, ! "Header checksum: 0x%04x (%s)", iph.ip_sum, ip_checksum_state((e_ip*) &pd[offset])); proto_tree_add_ipv4(ip_tree, hf_ip_src, NullTVB, offset + 12, 4, iph.ip_src); proto_tree_add_ipv4(ip_tree, hf_ip_dst, NullTVB, offset + 16, 4, iph.ip_dst); proto_tree_add_ipv4_hidden(ip_tree, hf_ip_addr, NullTVB, offset + 12, 4, iph.ip_src); --- 904,911 ---- proto_tree_add_uint_format(ip_tree, hf_ip_proto, NullTVB, offset + 9, 1, iph.ip_p, "Protocol: %s (0x%02x)", ipprotostr(iph.ip_p), iph.ip_p); proto_tree_add_uint_format(ip_tree, hf_ip_checksum, NullTVB, offset + 10, 2, iph.ip_sum, ! "Header checksum: 0x%04x (%s)", iph.ip_sum, ! ip_checksum_state(&pd[offset], hlen)); proto_tree_add_ipv4(ip_tree, hf_ip_src, NullTVB, offset + 12, 4, iph.ip_src); proto_tree_add_ipv4(ip_tree, hf_ip_dst, NullTVB, offset + 16, 4, iph.ip_dst); proto_tree_add_ipv4_hidden(ip_tree, hf_ip_addr, NullTVB, offset + 12, 4, iph.ip_src); *************** *** 1083,1089 **** col_add_str(fd, COL_INFO, type_str); if (tree) { ! ti = proto_tree_add_item(tree, proto_icmp, NullTVB, offset, 4, FALSE); icmp_tree = proto_item_add_subtree(ti, ett_icmp); proto_tree_add_uint_format(icmp_tree, hf_icmp_type, NullTVB, offset, 1, ih.icmp_type, --- 1085,1091 ---- col_add_str(fd, COL_INFO, type_str); if (tree) { ! ti = proto_tree_add_item(tree, proto_icmp, NullTVB, offset, END_OF_FRAME, FALSE); icmp_tree = proto_item_add_subtree(ti, ett_icmp); proto_tree_add_uint_format(icmp_tree, hf_icmp_type, NullTVB, offset, 1, ih.icmp_type, *************** *** 1093,1100 **** ih.icmp_code, "Code: %u %s", ih.icmp_code, code_str); ! proto_tree_add_uint(icmp_tree, hf_icmp_checksum, NullTVB, offset + 2, 2, cksum); /* Decode the second 4 bytes of the packet. */ switch (ih.icmp_type) { --- 1095,1113 ---- ih.icmp_code, "Code: %u %s", ih.icmp_code, code_str); ! if (pi.captured_len >= pi.len) { ! /* The packet isn't truncated, so we can checksum it. ! XXX - we have to check whether this is part of a fragmented ! IP datagram, too.... */ ! ! proto_tree_add_uint_format(icmp_tree, hf_icmp_checksum, NullTVB, offset + 2, 2, ! cksum, ! "Checksum: 0x%04x (%s)", cksum, ! ip_checksum_state(&pd[offset], END_OF_FRAME)); ! } else { ! proto_tree_add_uint(icmp_tree, hf_icmp_checksum, NullTVB, offset + 2, 2, cksum); + } /* Decode the second 4 bytes of the packet. */ switch (ih.icmp_type) {
- References:
- [ethereal-dev] ICMP Checksum
- From: Joshua Krage
- Re: [ethereal-dev] ICMP Checksum
- From: Guy Harris
- Re: [ethereal-dev] ICMP Checksum
- From: Joshua Krage
- [ethereal-dev] ICMP Checksum
- Prev by Date: Re: [ethereal-dev] tcp header checksum validation
- Next by Date: Re: [ethereal-dev] Bug report: edit/filters/apply does not work
- Previous by thread: Re: [ethereal-dev] ICMP Checksum
- Next by thread: [ethereal-dev] tcp header checksum validation
- Index(es):