Add initial support for multiple interfaces. More to come after
the capture options dialog box supports also multiple interfaces. This patch has been developed by Irene Ruengeler. svn path=/trunk/; revision=37904
This commit is contained in:
parent
4b8f5a1865
commit
cb90aa7904
|
@ -41,6 +41,7 @@
|
|||
#include "../globals.h"
|
||||
#include "../file.h"
|
||||
#include "../summary.h"
|
||||
#include "../capture-pcap-util.h"
|
||||
#ifdef HAVE_LIBPCAP
|
||||
#include "../capture.h"
|
||||
#include "gtk/main.h"
|
||||
|
@ -52,7 +53,6 @@
|
|||
#include "gtk/gui_utils.h"
|
||||
#include "gtk/help_dlg.h"
|
||||
|
||||
|
||||
#define SUM_STR_MAX 1024
|
||||
#define FILTER_SNIP_LEN 50
|
||||
|
||||
|
@ -106,13 +106,19 @@ summary_open_cb(GtkWidget *w _U_, gpointer d _U_)
|
|||
summary_tally summary;
|
||||
GtkWidget *sum_open_w,
|
||||
*main_vb, *bbox, *close_bt, *help_bt;
|
||||
GtkWidget *table;
|
||||
GtkWidget *list;
|
||||
GtkWidget *table, *scrolled_window;
|
||||
GtkWidget *list, *treeview;
|
||||
GtkListStore *store;
|
||||
GtkTreeIter iter;
|
||||
GtkCellRenderer *renderer;
|
||||
GtkTreeViewColumn *column;
|
||||
static const char *titles[] = { "Traffic", "Captured", "Displayed", "Marked" };
|
||||
|
||||
gchar string_buff[SUM_STR_MAX];
|
||||
gchar string_buff2[SUM_STR_MAX];
|
||||
gchar string_buff3[SUM_STR_MAX];
|
||||
gchar string_buff4[SUM_STR_MAX];
|
||||
gchar string_buff5[SUM_STR_MAX];
|
||||
|
||||
double seconds;
|
||||
double disp_seconds;
|
||||
|
@ -126,6 +132,8 @@ summary_open_cb(GtkWidget *w _U_, gpointer d _U_)
|
|||
time_t ti_time;
|
||||
struct tm *ti_tm;
|
||||
unsigned int elapsed_time;
|
||||
iface_options iface;
|
||||
unsigned int i;
|
||||
|
||||
/* initial computations */
|
||||
summary_fill_in(&cfile, &summary);
|
||||
|
@ -221,37 +229,81 @@ summary_open_cb(GtkWidget *w _U_, gpointer d _U_)
|
|||
|
||||
/* Capture */
|
||||
add_string_to_table(table, &row, "", "");
|
||||
add_string_to_table_sensitive(table, &row, "Capture", "", (summary.iface != NULL));
|
||||
add_string_to_table_sensitive(table, &row, "Capture", "", (global_capture_opts.ifaces->len>0));
|
||||
scrolled_window = gtk_scrolled_window_new (NULL, NULL);
|
||||
gtk_container_set_border_width (GTK_CONTAINER (scrolled_window), 5);
|
||||
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
|
||||
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
|
||||
gtk_widget_set_size_request(scrolled_window, -1, 120);
|
||||
|
||||
/* interface */
|
||||
if (summary.iface) {
|
||||
g_snprintf(string_buff, SUM_STR_MAX, "%s", summary.iface_descr);
|
||||
} else {
|
||||
g_snprintf(string_buff, SUM_STR_MAX, "unknown");
|
||||
}
|
||||
add_string_to_table_sensitive(table, &row, "Interface:", string_buff, (summary.iface) != NULL);
|
||||
|
||||
/* Dropped count */
|
||||
if (summary.drops_known) {
|
||||
g_snprintf(string_buff, SUM_STR_MAX, "%" G_GINT64_MODIFIER "u", summary.drops);
|
||||
} else {
|
||||
g_snprintf(string_buff, SUM_STR_MAX, "unknown");
|
||||
}
|
||||
add_string_to_table_sensitive(table, &row, "Dropped packets:", string_buff, (summary.iface != NULL));
|
||||
|
||||
#ifdef HAVE_LIBPCAP
|
||||
/* Capture filter */
|
||||
if (summary.cfilter && summary.cfilter[0] != '\0') {
|
||||
g_snprintf(string_buff, SUM_STR_MAX, "%s", summary.cfilter);
|
||||
} else {
|
||||
if(summary.iface) {
|
||||
g_snprintf(string_buff, SUM_STR_MAX, "none");
|
||||
treeview = gtk_tree_view_new();
|
||||
renderer = gtk_cell_renderer_text_new();
|
||||
column = gtk_tree_view_column_new_with_attributes("Interface", renderer, "text", 0, NULL);
|
||||
gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
|
||||
renderer = gtk_cell_renderer_text_new();
|
||||
column = gtk_tree_view_column_new_with_attributes("Dropped Packets", renderer, "text", 1, NULL);
|
||||
gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
|
||||
renderer = gtk_cell_renderer_text_new();
|
||||
column = gtk_tree_view_column_new_with_attributes("Capture Filter", renderer, "text", 2, NULL);
|
||||
gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
|
||||
renderer = gtk_cell_renderer_text_new();
|
||||
column = gtk_tree_view_column_new_with_attributes("Link type", renderer, "text", 3, NULL);
|
||||
gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
|
||||
renderer = gtk_cell_renderer_text_new();
|
||||
column = gtk_tree_view_column_new_with_attributes("Packet size limit", renderer, "text", 4, NULL);
|
||||
gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column);
|
||||
|
||||
store = gtk_list_store_new(5, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
|
||||
for (i = 0; i < summary.ifaces->len; i++) {
|
||||
iface = g_array_index(summary.ifaces, iface_options, i);
|
||||
/* interface */
|
||||
if (iface.descr) {
|
||||
g_snprintf(string_buff, SUM_STR_MAX, "%s", iface.descr);
|
||||
} else if (iface.name) {
|
||||
g_snprintf(string_buff, SUM_STR_MAX, "%s", iface.name);
|
||||
} else {
|
||||
g_snprintf(string_buff, SUM_STR_MAX, "unknown");
|
||||
}
|
||||
}
|
||||
add_string_to_table_sensitive(table, &row, "Capture filter:", string_buff, (summary.iface != NULL));
|
||||
/* Dropped count */
|
||||
if (iface.drops_known) {
|
||||
g_snprintf(string_buff2, SUM_STR_MAX, "%" G_GINT64_MODIFIER "u", iface.drops);
|
||||
} else {
|
||||
g_snprintf(string_buff2, SUM_STR_MAX, "unknown");
|
||||
}
|
||||
#ifdef HAVE_LIBPCAP
|
||||
/* Capture filter */
|
||||
if (iface.cfilter && iface.cfilter[0] != '\0') {
|
||||
g_snprintf(string_buff3, SUM_STR_MAX, "%s", iface.cfilter);
|
||||
} else {
|
||||
if(iface.name) {
|
||||
g_snprintf(string_buff3, SUM_STR_MAX, "none");
|
||||
} else {
|
||||
g_snprintf(string_buff3, SUM_STR_MAX, "unknown");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
g_snprintf(string_buff4, SUM_STR_MAX, "%s", pcap_datalink_val_to_description(iface.linktype));
|
||||
if (strcmp(string_buff4, "(null)") == 0) {
|
||||
strcpy(string_buff4, "unknown");
|
||||
}
|
||||
if (iface.has_snap) {
|
||||
g_snprintf(string_buff5, SUM_STR_MAX, "%u bytes", iface.snap);
|
||||
} else {
|
||||
g_snprintf(string_buff5, SUM_STR_MAX, "unknown");
|
||||
}
|
||||
gtk_list_store_append(store, &iter);
|
||||
gtk_list_store_set(store, &iter, 0, string_buff, 1, string_buff2, 2, string_buff3, 3, string_buff4, 4, string_buff5,-1);
|
||||
}
|
||||
gtk_tree_view_set_model(GTK_TREE_VIEW(treeview), GTK_TREE_MODEL(store));
|
||||
g_object_unref (store);
|
||||
gtk_container_add(GTK_CONTAINER(scrolled_window), treeview);
|
||||
gtk_container_add(GTK_CONTAINER(main_vb),scrolled_window);
|
||||
gtk_widget_show_all (scrolled_window);
|
||||
table = gtk_table_new(1, 2, FALSE);
|
||||
gtk_table_set_col_spacings(GTK_TABLE(table), 6);
|
||||
gtk_table_set_row_spacings(GTK_TABLE(table), 3);
|
||||
gtk_container_add(GTK_CONTAINER(main_vb), table);
|
||||
row = 0;
|
||||
|
||||
|
||||
/* Data */
|
||||
|
|
34
summary.c
34
summary.c
|
@ -131,22 +131,38 @@ summary_fill_in(capture_file *cf, summary_tally *st)
|
|||
st->drops = cf->drops;
|
||||
st->dfilter = cf->dfilter;
|
||||
|
||||
/* capture related */
|
||||
st->cfilter = NULL;
|
||||
st->iface = NULL;
|
||||
st->iface_descr = NULL;
|
||||
st->ifaces = g_array_new(FALSE, FALSE, sizeof(iface_options));
|
||||
}
|
||||
|
||||
|
||||
#ifdef HAVE_LIBPCAP
|
||||
/* FIXME: This needs additional functionality to support multiple interfaces */
|
||||
void
|
||||
summary_fill_in_capture(capture_options *capture_opts, summary_tally *st)
|
||||
{
|
||||
iface_options iface;
|
||||
interface_options interface_opts;
|
||||
guint i;
|
||||
|
||||
if (capture_opts->ifaces->len > 0) {
|
||||
st->cfilter = g_array_index(capture_opts->ifaces, interface_options, 0).cfilter;
|
||||
st->iface = g_array_index(capture_opts->ifaces, interface_options, 0).name;
|
||||
st->iface_descr = get_iface_description_for_interface(capture_opts, 0);
|
||||
}
|
||||
while (st->ifaces->len > 0) {
|
||||
iface = g_array_index(st->ifaces, iface_options, 0);
|
||||
st->ifaces = g_array_remove_index(st->ifaces, 0);
|
||||
g_free(iface.name);
|
||||
g_free(iface.descr);
|
||||
g_free(iface.cfilter);
|
||||
}
|
||||
for (i = 0; i < capture_opts->ifaces->len; i++) {
|
||||
interface_opts = g_array_index(capture_opts->ifaces, interface_options, i);
|
||||
iface.cfilter = g_strdup(interface_opts.cfilter);
|
||||
iface.name = g_strdup(interface_opts.name);
|
||||
iface.descr = g_strdup(interface_opts.descr);
|
||||
iface.drops_known = FALSE;
|
||||
iface.drops = 0;
|
||||
iface.has_snap = interface_opts.has_snaplen;
|
||||
iface.snap = interface_opts.snaplen;
|
||||
iface.linktype = interface_opts.linktype;
|
||||
g_array_append_val(st->ifaces, iface);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
|
16
summary.h
16
summary.h
|
@ -29,6 +29,17 @@
|
|||
#include "capture.h"
|
||||
#endif
|
||||
|
||||
typedef struct iface_options_tag {
|
||||
char *name;
|
||||
char *descr;
|
||||
char *cfilter;
|
||||
guint64 drops; /* number of packet drops */
|
||||
gboolean drops_known; /* TRUE if number of packet drops is known */
|
||||
gboolean has_snap; /* TRUE if maximum capture packet length is known */
|
||||
int snap; /* Maximum captured packet length */
|
||||
int linktype; /* wiretap encapsulation type */
|
||||
} iface_options;
|
||||
|
||||
typedef struct _summary_tally {
|
||||
guint64 bytes; /* total bytes */
|
||||
double start_time; /* seconds, with msec resolution */
|
||||
|
@ -57,9 +68,8 @@ typedef struct _summary_tally {
|
|||
const char *dfilter; /* display filter */
|
||||
|
||||
/* capture related, use summary_fill_in_capture() to get values */
|
||||
const char *cfilter; /* capture filter */
|
||||
const char *iface; /* interface name */
|
||||
const char *iface_descr;/* descriptive interface name */
|
||||
GArray *ifaces;
|
||||
gboolean legacy;
|
||||
} summary_tally;
|
||||
|
||||
extern void
|
||||
|
|
Loading…
Reference in New Issue