Ethereal-dev: [Ethereal-dev] ethereal 0.8.12: ICMP checksum, ICMP payload dissect, capture sta
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Santeri Paavolainen <santtu@xxxxxxx>
Date: Sat, 21 Oct 2000 00:31:34 +0300 (EEST)
The attached patch contains the following changes: - ICMPv4 checksum checking - ICMPv4 payload dissection, if the ICMP type contains IP payload (paramprob etc.) - Capture statistics dialog has been changed, it's a lot more better looking and also adding new stats fields will be a lot easier This patch is against 0.8.12 tree which contains the patches I've posted before, but it should go pretty smoothly on a vanilla 0.8.12. -- santtu@xxxxxx I have become death, destroyer of the worlds.
*** ethereal-0.8.12-orig/capture.c Tue Aug 22 09:04:40 2000 --- ethereal-0.8.12/capture.c Sat Oct 21 00:22:30 2000 *************** *** 942,949 **** int capture(void) { ! GtkWidget *cap_w, *main_vb, *count_lb, *sctp_lb, *tcp_lb, *udp_lb, *icmp_lb, ! *ospf_lb, *gre_lb, *netbios_lb, *ipx_lb, *vines_lb, *other_lb, *stop_bt; pcap_t *pch; int pcap_encap; int snaplen; --- 942,948 ---- int capture(void) { ! GtkWidget *cap_w, *main_vb, *stop_bt, *counts_tb; pcap_t *pch; int pcap_encap; int snaplen; *************** *** 951,957 **** loop_data ld; bpf_u_int32 netnum, netmask; time_t upd_time, cur_time; ! int err, inpkts; char errmsg[4096+1]; #ifndef _WIN32 static const char ppamsg[] = "can't find PPA for "; --- 950,956 ---- loop_data ld; bpf_u_int32 netnum, netmask; time_t upd_time, cur_time; ! int err, inpkts, i; char errmsg[4096+1]; #ifndef _WIN32 static const char ppamsg[] = "can't find PPA for "; *************** *** 970,975 **** --- 969,993 ---- int pipe_fd = -1; struct pcap_hdr hdr; #endif + struct { + const gchar *title; + gint *value_ptr; + GtkWidget *label, *value, *percent; + } stats[] = { + { "Total", &ld.counts.total }, + { "SCTP", &ld.counts.sctp }, + { "TCP", &ld.counts.tcp }, + { "UDP", &ld.counts.udp }, + { "ICMP", &ld.counts.icmp }, + { "OSPF", &ld.counts.ospf }, + { "GRE", &ld.counts.gre }, + { "NetBIOS", &ld.counts.netbios }, + { "IPX", &ld.counts.ipx }, + { "VINES", &ld.counts.vines }, + { "Other", &ld.counts.other } + }; + + #define N_STATS (sizeof stats / sizeof stats[0]) /* Initialize Windows Socket if we are in a WIN32 OS This needs to be done before querying the interface for network/netmask */ *************** *** 1176,1224 **** gtk_container_add(GTK_CONTAINER(cap_w), main_vb); gtk_widget_show(main_vb); ! count_lb = gtk_label_new("Count: 0"); ! gtk_box_pack_start(GTK_BOX(main_vb), count_lb, FALSE, FALSE, 3); ! gtk_widget_show(count_lb); ! ! sctp_lb = gtk_label_new("SCTP: 0 (0.0%)"); ! gtk_box_pack_start(GTK_BOX(main_vb), sctp_lb, FALSE, FALSE, 3); ! gtk_widget_show(sctp_lb); ! ! tcp_lb = gtk_label_new("TCP: 0 (0.0%)"); ! gtk_box_pack_start(GTK_BOX(main_vb), tcp_lb, FALSE, FALSE, 3); ! gtk_widget_show(tcp_lb); ! ! udp_lb = gtk_label_new("UDP: 0 (0.0%)"); ! gtk_box_pack_start(GTK_BOX(main_vb), udp_lb, FALSE, FALSE, 3); ! gtk_widget_show(udp_lb); ! ! icmp_lb = gtk_label_new("ICMP: 0 (0.0%)"); ! gtk_box_pack_start(GTK_BOX(main_vb), icmp_lb, FALSE, FALSE, 3); ! gtk_widget_show(icmp_lb); ! ! ospf_lb = gtk_label_new("OSPF: 0 (0.0%)"); ! gtk_box_pack_start(GTK_BOX(main_vb), ospf_lb, FALSE, FALSE, 3); ! gtk_widget_show(ospf_lb); ! ! gre_lb = gtk_label_new("GRE: 0 (0.0%)"); ! gtk_box_pack_start(GTK_BOX(main_vb), gre_lb, FALSE, FALSE, 3); ! gtk_widget_show(gre_lb); ! ! netbios_lb = gtk_label_new("NetBIOS: 0 (0.0%)"); ! gtk_box_pack_start(GTK_BOX(main_vb), netbios_lb, FALSE, FALSE, 3); ! gtk_widget_show(netbios_lb); ! ! ipx_lb = gtk_label_new("IPX: 0 (0.0%)"); ! gtk_box_pack_start(GTK_BOX(main_vb), ipx_lb, FALSE, FALSE, 3); ! gtk_widget_show(ipx_lb); ! ! vines_lb = gtk_label_new("VINES: 0 (0.0%)"); ! gtk_box_pack_start(GTK_BOX(main_vb), vines_lb, FALSE, FALSE, 3); ! gtk_widget_show(vines_lb); ! ! other_lb = gtk_label_new("Other: 0 (0.0%)"); ! gtk_box_pack_start(GTK_BOX(main_vb), other_lb, FALSE, FALSE, 3); ! gtk_widget_show(other_lb); /* allow user to either click a stop button, or the close button on the window to stop a capture in progress. */ --- 1194,1228 ---- gtk_container_add(GTK_CONTAINER(cap_w), main_vb); gtk_widget_show(main_vb); ! /* Individual statistic elements */ ! counts_tb = gtk_table_new(N_STATS, 3, TRUE); ! gtk_box_pack_start(GTK_BOX(main_vb), counts_tb, TRUE, TRUE, 3); ! gtk_widget_show(counts_tb); ! ! for (i = 0; i < N_STATS; i++) { ! stats[i].label = gtk_label_new(stats[i].title); ! gtk_misc_set_alignment(GTK_MISC(stats[i].label), 0.0f, 0.0f); ! ! stats[i].value = gtk_label_new("0"); ! gtk_misc_set_alignment(GTK_MISC(stats[i].value), 0.0f, 0.0f); ! ! stats[i].percent = gtk_label_new("0.0%"); ! gtk_misc_set_alignment(GTK_MISC(stats[i].percent), 0.0f, 0.0f); ! ! gtk_table_attach_defaults(GTK_TABLE(counts_tb), ! stats[i].label, 0, 1, i, i + 1); ! ! gtk_table_attach(GTK_TABLE(counts_tb), ! stats[i].value, ! 1, 2, i, i + 1, 0, 0, 5, 0); ! ! gtk_table_attach_defaults(GTK_TABLE(counts_tb), ! stats[i].percent, 2, 3, i, i + 1); ! ! gtk_widget_show(stats[i].label); ! gtk_widget_show(stats[i].value); ! gtk_widget_show(stats[i].percent); ! } /* allow user to either click a stop button, or the close button on the window to stop a capture in progress. */ *************** *** 1302,1349 **** if (cur_time > upd_time) { upd_time = cur_time; ! sprintf(label_str, "Count: %d", ld.counts.total); ! gtk_label_set(GTK_LABEL(count_lb), label_str); ! sprintf(label_str, "SCTP: %d (%.1f%%)", ld.counts.sctp, ! pct(ld.counts.sctp, ld.counts.total)); ! gtk_label_set(GTK_LABEL(sctp_lb), label_str); ! ! sprintf(label_str, "TCP: %d (%.1f%%)", ld.counts.tcp, ! pct(ld.counts.tcp, ld.counts.total)); ! gtk_label_set(GTK_LABEL(tcp_lb), label_str); ! ! sprintf(label_str, "UDP: %d (%.1f%%)", ld.counts.udp, ! pct(ld.counts.udp, ld.counts.total)); ! gtk_label_set(GTK_LABEL(udp_lb), label_str); ! ! sprintf(label_str, "ICMP: %d (%.1f%%)", ld.counts.icmp, ! pct(ld.counts.icmp, ld.counts.total)); ! gtk_label_set(GTK_LABEL(icmp_lb), label_str); ! ! sprintf(label_str, "OSPF: %d (%.1f%%)", ld.counts.ospf, ! pct(ld.counts.ospf, ld.counts.total)); ! gtk_label_set(GTK_LABEL(ospf_lb), label_str); ! ! sprintf(label_str, "GRE: %d (%.1f%%)", ld.counts.gre, ! pct(ld.counts.gre, ld.counts.total)); ! gtk_label_set(GTK_LABEL(gre_lb), label_str); ! ! sprintf(label_str, "NetBIOS: %d (%.1f%%)", ld.counts.netbios, ! pct(ld.counts.netbios, ld.counts.total)); ! gtk_label_set(GTK_LABEL(netbios_lb), label_str); ! ! sprintf(label_str, "IPX: %d (%.1f%%)", ld.counts.ipx, ! pct(ld.counts.ipx, ld.counts.total)); ! gtk_label_set(GTK_LABEL(ipx_lb), label_str); ! ! sprintf(label_str, "VINES: %d (%.1f%%)", ld.counts.vines, ! pct(ld.counts.vines, ld.counts.total)); ! gtk_label_set(GTK_LABEL(vines_lb), label_str); ! ! sprintf(label_str, "Other: %d (%.1f%%)", ld.counts.other, ! pct(ld.counts.other, ld.counts.total)); ! gtk_label_set(GTK_LABEL(other_lb), label_str); /* do sync here, too */ fflush(wtap_dump_file(ld.pdh)); --- 1306,1322 ---- if (cur_time > upd_time) { upd_time = cur_time; ! for (i = 0; i < N_STATS; i++) { ! snprintf(label_str, sizeof(label_str), "%d", ! *stats[i].value_ptr); ! ! gtk_label_set(GTK_LABEL(stats[i].value), label_str); ! snprintf(label_str, sizeof(label_str), "(%.1f%%)", ! pct(*stats[i].value_ptr, ld.counts.total)); ! ! gtk_label_set(GTK_LABEL(stats[i].percent), label_str); ! } /* do sync here, too */ fflush(wtap_dump_file(ld.pdh)); *** ethereal-0.8.12-orig/packet-ip.c Sun Aug 13 17:08:16 2000 --- ethereal-0.8.12/packet-ip.c Fri Oct 20 22:47:37 2000 *************** *** 1001,1013 **** static void dissect_icmp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) { e_icmp ih; ! proto_tree *icmp_tree; proto_item *ti; guint16 cksum; gchar type_str[64], code_str[64] = ""; guint8 num_addrs = 0; guint8 addr_entry_size = 0; int i; OLD_CHECK_DISPLAY_AS_DATA(proto_icmp, pd, offset, fd, tree); --- 1001,1014 ---- static void dissect_icmp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) { e_icmp ih; ! proto_tree *icmp_tree = NULL; proto_item *ti; guint16 cksum; gchar type_str[64], code_str[64] = ""; guint8 num_addrs = 0; guint8 addr_entry_size = 0; int i; + gboolean dissect_payload = FALSE; OLD_CHECK_DISPLAY_AS_DATA(proto_icmp, pd, offset, fd, tree); *************** *** 1027,1035 **** --- 1028,1038 ---- } else { strcpy(code_str, "(Unknown - error?)"); } + dissect_payload = TRUE; break; case ICMP_SOURCEQUENCH: strcpy(type_str, "Source quench (flow control)"); + dissect_payload = TRUE; break; case ICMP_REDIRECT: strcpy(type_str, "Redirect"); *************** *** 1038,1043 **** --- 1041,1047 ---- } else { strcpy(code_str, "(Unknown - error?)"); } + dissect_payload = TRUE; break; case ICMP_ECHO: strcpy(type_str, "Echo (ping) request"); *************** *** 1055,1060 **** --- 1059,1065 ---- } else { strcpy(code_str, "(Unknown - error?)"); } + dissect_payload = TRUE; break; case ICMP_PARAMPROB: strcpy(type_str, "Parameter problem"); *************** *** 1063,1068 **** --- 1068,1074 ---- } else { strcpy(code_str, "(Unknown - error?)"); } + dissect_payload = TRUE; break; case ICMP_TSTAMP: strcpy(type_str, "Timestamp request"); *************** *** 1102,1109 **** 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) { --- 1108,1123 ---- ih.icmp_code, "Code: %u %s", ih.icmp_code, code_str); ! ! if (pi.captured_len >= pi.len) ! proto_tree_add_uint_format(icmp_tree, hf_icmp_checksum, NullTVB, ! offset + 2, 2, cksum, ! "Checksum: 0x%04x (%s)", cksum, ! ip_checksum(pd+offset, END_OF_FRAME) == 0 ? ! "correct" : "incorrect"); ! 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) { *************** *** 1202,1207 **** --- 1216,1228 ---- break; } } + + /* The packet type contains (some parts of) the original IP packet + which caused the ICMP message. We can try to dissect those, + also. */ + if (dissect_payload && tree) { + dissect_ip(pd, offset + 8, fd, icmp_tree); + } } static void
- Follow-Ups:
- Re: [Ethereal-dev] ethereal 0.8.12: ICMP checksum, ICMP payload dissect, capture stats dialog update
- From: Guy Harris
- Re: [Ethereal-dev] ethereal 0.8.12: ICMP checksum, ICMP payload dissect, capture stats dialog update
- From: Guy Harris
- Re: [Ethereal-dev] ethereal 0.8.12: ICMP checksum, ICMP payload dissect, capture stats dialog update
- From: Guy Harris
- Re: [Ethereal-dev] ethereal 0.8.12: ICMP checksum, ICMP payload dissect, capture stats dialog update
- Prev by Date: Re: [Ethereal-dev] Remote online packet capture?
- Next by Date: Re: [Ethereal-dev] Patches for packet-diameter.c
- Previous by thread: Re: [Ethereal-dev] Patches for packet-diameter.c
- Next by thread: Re: [Ethereal-dev] ethereal 0.8.12: ICMP checksum, ICMP payload dissect, capture stats dialog update
- Index(es):