Wireshark-dev: [Wireshark-dev] Bug #1138 fix: 'Follow TP streams gets stream direction wrong...
From: Stephen Fisher <stephentfisher@xxxxxxxxx>
Date: Wed, 25 Oct 2006 20:05:25 -0700
Attached is a patch to fix bug #1138: "Follow TCP Streams gets stream direction wrong if started from a server->client frame." THE PROBLEM: The drop-down list of which direction's flow you want to see is based on the source port of the currently selected packet. The actual text is based on a temporary file that starts with "follow". If you clicked on a packet from the server back to the client, the source port would be of the server not the client. This caused the drop-down list's results to be the reverse of what it shows. When you clicked on a packet from client to server, it works correctly. MY SOLUTION: I rewind() back to the top of the "follow" text file after writing it to get the client's source port (the first line written to the file). I compare the first packet's source port to the source port of the currently selected packet and reverse the output in the drop-down if they don't match. This causes the drop-down box to always be tied to the correct data above. The client->server is always shown first in the drop-down. Thanks, Steve
Index: gtk/follow_dlg.c =================================================================== --- gtk/follow_dlg.c (revision 19694) +++ gtk/follow_dlg.c (working copy) @@ -176,6 +176,7 @@ char string[128]; follow_tcp_stats_t stats; follow_info_t *follow_info; + tcp_stream_chunk sc; /* we got tcp so we can follow */ if (cfile.edt->pi.ipproto != IP_PROTO_TCP) { @@ -206,7 +207,7 @@ return; } - data_out_file = fdopen(tmp_fd, "wb"); + data_out_file = fdopen(tmp_fd, "w+b"); if (data_out_file == NULL) { simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "Could not create temporary file %s: %s", @@ -256,9 +257,6 @@ /* Free the filter string, as we're done with it. */ g_free(follow_filter); - /* The data_out_file should now be full of the streams information */ - fclose(data_out_file); - /* The data_out_filename file now has all the text that was in the session */ streamwindow = dlg_window_new("Follow TCP Stream"); @@ -361,10 +359,28 @@ gtk_widget_show(stream_mi); follow_info->show_stream = BOTH_HOSTS; + /* Go back to the top of the file and read the first tcp_stream_chunk + * to ensure that the IP addresses and port numbers in the drop-down + * list are tied to the correct lines displayed by follow_read_stream() + * later on (which also reads from this file). Close the file when + * we're done. + */ + + rewind(data_out_file); + fread(&sc, 1, sizeof(sc), data_out_file); + fclose(data_out_file); + /* Host 0 --> Host 1 */ - g_snprintf(string, sizeof(string), "%s:%s --> %s:%s (%u bytes)", - hostname0, port0, hostname1, port1, - stats.bytes_written[0]); + if(sc.src_port == strtol(port0, NULL, 10)) { + g_snprintf(string, sizeof(string), "%s:%s --> %s:%s (%u bytes)", + hostname0, port0, hostname1, port1, + stats.bytes_written[0]); + } else { + g_snprintf(string, sizeof(string), "%s:%s --> %s:%s (%u bytes)", + hostname1, port1, hostname0, port0, + stats.bytes_written[0]); + } + stream_mi = gtk_menu_item_new_with_label(string); SIGNAL_CONNECT(stream_mi, "activate", follow_stream_om_client, follow_info); @@ -372,9 +388,16 @@ gtk_widget_show(stream_mi); /* Host 1 --> Host 0 */ - g_snprintf(string, sizeof(string), "%s:%s --> %s:%s (%u bytes)", - hostname1, port1, hostname0, port0, - stats.bytes_written[1]); + if(sc.src_port == strtol(port0, NULL, 10)) { + g_snprintf(string, sizeof(string), "%s:%s --> %s:%s (%u bytes)", + hostname1, port1, hostname0, port0, + stats.bytes_written[1]); + } else { + g_snprintf(string, sizeof(string), "%s:%s --> %s:%s (%u bytes)", + hostname0, port0, hostname1, port1, + stats.bytes_written[1]); + } + stream_mi = gtk_menu_item_new_with_label(string); SIGNAL_CONNECT(stream_mi, "activate", follow_stream_om_server, follow_info);
- Prev by Date: Re: [Wireshark-dev] new style dissectors (Was: Source code for ACN (ANSI BSR E1.17) Dissector)
- Next by Date: Re: [Wireshark-dev] [patch] YMSG dissector update
- Previous by thread: Re: [Wireshark-dev] Why am I getting a BoundsError?
- Next by thread: Re: [Wireshark-dev] [patch] YMSG dissector update
- Index(es):