diff options
author | Irene RĂ¼ngeler <I.Ruengeler@fh-muenster.de> | 2013-03-13 12:38:08 +0000 |
---|---|---|
committer | Irene RĂ¼ngeler <I.Ruengeler@fh-muenster.de> | 2013-03-13 12:38:08 +0000 |
commit | 44e6a88b134b0b35ea6c7d76dd76647f357b86c0 (patch) | |
tree | 1116fe96aa640a09d11e2b82901c030a1e410e62 /ui/gtk/prefs_capture.c | |
parent | 27fc641a791f6132f13521697ea4c3dc47f8bc7e (diff) |
Add interface options preferences.
svn path=/trunk/; revision=48275
Diffstat (limited to 'ui/gtk/prefs_capture.c')
-rw-r--r-- | ui/gtk/prefs_capture.c | 192 |
1 files changed, 170 insertions, 22 deletions
diff --git a/ui/gtk/prefs_capture.c b/ui/gtk/prefs_capture.c index 098498a07e..acb4c5b5ce 100644 --- a/ui/gtk/prefs_capture.c +++ b/ui/gtk/prefs_capture.c @@ -64,6 +64,8 @@ #define COLOPTS_CALLER_PTR_KEY "colopts_caller_ptr" #define COLOPTS_DIALOG_PTR_KEY "colopts_dialog_ptr" +static GtkWidget *capture_window; + /* interface options dialog */ static GtkWidget *cur_list, *if_dev_lb, *if_name_lb, *if_linktype_lb, *if_linktype_cb, *if_descr_te, *if_hide_cb, *if_default_if_lb; #ifdef HAVE_PCAP_CREATE @@ -72,7 +74,7 @@ static GtkWidget *if_monitor_lb, *if_monitor_cb; #if defined(_WIN32) || defined(HAVE_PCAP_CREATE) static GtkWidget *if_buffersize_lb, *if_buffersize_cb; #endif -static GtkWidget *if_snaplen_lb, *if_snaplen_cb, *if_snaplen_tg; +static GtkWidget *if_snaplen_lb, *if_snaplen_cb, *if_snaplen_tg, *if_pmode_lb, *if_pmode_cb; static GtkTreeSelection *if_selection; /* current interface row selected */ static int num_linktypes; static gboolean interfaces_info_nochange; /* TRUE to ignore Interface Options Properties */ @@ -93,6 +95,7 @@ static void ifopts_edit_buffersize_changed_cb(GtkSpinButton *ed, gpointer udata) #endif static void ifopts_edit_snaplen_changed_cb(GtkSpinButton *ed, gpointer udata); static void ifopts_edit_hassnap_changed_cb(GtkToggleButton *tbt, gpointer udata); +static void ifopts_edit_pmode_changed_cb(GtkToggleButton *tbt, gpointer udata); static void ifopts_options_add(GtkListStore *list_store, if_info_t *if_info); static void ifopts_options_free(gchar *text[]); static void ifopts_if_liststore_add(void); @@ -106,6 +109,8 @@ static void ifopts_write_new_buffersize(void); static void ifopts_write_new_snaplen(void); static void ifopts_write_new_descr(void); static void ifopts_write_new_hide(void); +static void ifopts_write_new_pmode(void); +static void prom_mode_cb(GtkToggleButton *tbt, gpointer udata); /* Columns options dialog */ #ifdef HAVE_PCAP_CREATE @@ -123,7 +128,7 @@ static void colopts_edit_ok_cb(GtkWidget *w, gpointer parent_w); GtkWidget* capture_prefs_show(void) { - GtkWidget *main_grid, *main_vb; + GtkWidget *main_grid; GtkWidget *if_cbxe, *if_lb, *promisc_cb, *pcap_ng_cb, *sync_cb, *auto_scroll_cb, *show_info_cb; GtkWidget *ifopts_lb, *ifopts_bt, *colopts_lb, *colopts_bt; GList *if_list, *combo_list; @@ -132,12 +137,12 @@ capture_prefs_show(void) const gchar *tooltips_text; /* Main vertical box */ - main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 7, FALSE); - gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5); + capture_window = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 7, FALSE); + gtk_container_set_border_width(GTK_CONTAINER(capture_window), 5); /* Main grid */ main_grid = ws_gtk_grid_new(); - gtk_box_pack_start(GTK_BOX(main_vb), main_grid, FALSE, FALSE, 0); + gtk_box_pack_start(GTK_BOX(capture_window), main_grid, FALSE, FALSE, 0); ws_gtk_grid_set_row_spacing(GTK_GRID(main_grid), 10); ws_gtk_grid_set_column_spacing(GTK_GRID(main_grid), 15); gtk_widget_show(main_grid); @@ -175,7 +180,7 @@ capture_prefs_show(void) gtk_widget_set_tooltip_text(if_lb, tooltips_text); gtk_widget_set_tooltip_text(gtk_bin_get_child(GTK_BIN(if_cbxe)), tooltips_text); gtk_widget_show(if_cbxe); - g_object_set_data(G_OBJECT(main_vb), DEVICE_KEY, if_cbxe); + g_object_set_data(G_OBJECT(capture_window), DEVICE_KEY, if_cbxe); row++; /* Interface properties */ @@ -194,20 +199,21 @@ capture_prefs_show(void) /* Promiscuous mode */ promisc_cb = create_preference_check_button(main_grid, row++, - "Capture packets in promiscuous mode:", - "You probably want to enable this. " + "Capture packets in promiscuous mode on all network cards:", + "To set this mode on a per interface basis, select the interface first." "Usually a network card will only capture the traffic sent to its own network address. " "If you want to capture all traffic that the network card can \"see\", mark this option. " "See the FAQ for some more details of capturing packets from a switched network. ", prefs.capture_prom_mode); - g_object_set_data(G_OBJECT(main_vb), PROM_MODE_KEY, promisc_cb); + g_signal_connect(promisc_cb, "toggled", G_CALLBACK(prom_mode_cb), NULL); + g_object_set_data(G_OBJECT(capture_window), PROM_MODE_KEY, promisc_cb); /* Pcap-NG format */ pcap_ng_cb = create_preference_check_button(main_grid, row++, "Capture packets in pcap-ng format:", "Capture packets in the next-generation capture file format.", prefs.capture_pcap_ng); - g_object_set_data(G_OBJECT(main_vb), PCAP_NG_KEY, pcap_ng_cb); + g_object_set_data(G_OBJECT(capture_window), PCAP_NG_KEY, pcap_ng_cb); /* Real-time capture */ sync_cb = create_preference_check_button(main_grid, row++, @@ -215,21 +221,21 @@ capture_prefs_show(void) "Update the list of packets while capture is in progress. " "This can result in dropped packets on high-speed networks.", prefs.capture_real_time); - g_object_set_data(G_OBJECT(main_vb), CAPTURE_REAL_TIME_KEY, sync_cb); + g_object_set_data(G_OBJECT(capture_window), CAPTURE_REAL_TIME_KEY, sync_cb); /* Auto-scroll real-time capture */ auto_scroll_cb = create_preference_check_button(main_grid, row++, "Automatic scrolling in live capture:", "Keep the packet list scrolled to the bottom while capturing.", prefs.capture_auto_scroll); - g_object_set_data(G_OBJECT(main_vb), AUTO_SCROLL_KEY, auto_scroll_cb); + g_object_set_data(G_OBJECT(capture_window), AUTO_SCROLL_KEY, auto_scroll_cb); /* Show capture info dialog */ show_info_cb = create_preference_check_button(main_grid, row++, "Hide capture info dialog:", "Hide the capture info dialog while capturing. ", !prefs.capture_show_info); - g_object_set_data(G_OBJECT(main_vb), SHOW_INFO_KEY, show_info_cb); + g_object_set_data(G_OBJECT(capture_window), SHOW_INFO_KEY, show_info_cb); /* Column properties */ colopts_lb = gtk_label_new("Columns:"); @@ -246,9 +252,9 @@ capture_prefs_show(void) row++; /* Show 'em what we got */ - gtk_widget_show_all(main_vb); + gtk_widget_show_all(capture_window); - return(main_vb); + return(capture_window); } void @@ -340,6 +346,7 @@ enum #endif HASSNAP_COLUMN, SNAPLEN_COLUMN, + PMODE_COLUMN, DEF_LINK_LAYER_COLUMN, COMMENT_COLUMN, HIDE_COLUMN, @@ -565,8 +572,8 @@ ifopts_edit_cb(GtkWidget *w, gpointer data _U_) *if_hide_lb, *bbox, *ok_bt, *cancel_bt, *help_bt; - GtkListStore *list_store; - GtkWidget *list; + GtkListStore *list_store; + GtkWidget *list; GtkTreeViewColumn *column; GtkCellRenderer *renderer; GtkTreeView *list_view; @@ -590,7 +597,7 @@ ifopts_edit_cb(GtkWidget *w, gpointer data _U_) /* create a new dialog */ ifopts_edit_dlg = dlg_conf_window_new("Wireshark: Preferences: Interface Options"); - gtk_window_set_default_size(GTK_WINDOW(ifopts_edit_dlg), 1000, 440); + gtk_window_set_default_size(GTK_WINDOW(ifopts_edit_dlg), 1000, 500); main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 1, FALSE); gtk_container_set_border_width(GTK_CONTAINER(main_vb), 5); @@ -622,6 +629,7 @@ ifopts_edit_cb(GtkWidget *w, gpointer data _U_) #endif G_TYPE_BOOLEAN, /* Has snap length */ G_TYPE_INT, /* Snap length */ + G_TYPE_BOOLEAN, /* Promiscuous mode */ G_TYPE_STRING, /* Default link-layer */ G_TYPE_STRING, /* Comment */ G_TYPE_BOOLEAN, /* Hide? */ @@ -705,7 +713,12 @@ ifopts_edit_cb(GtkWidget *w, gpointer data _U_) "text", SNAPLEN_COLUMN, NULL); - gtk_tree_view_column_set_resizable(column, TRUE); + renderer = gtk_cell_renderer_toggle_new (); + column = gtk_tree_view_column_new_with_attributes ("Default to promiscuous mode", renderer, + "active", PMODE_COLUMN, + NULL); + + gtk_tree_view_column_set_resizable(column, FALSE); gtk_tree_view_column_set_sizing(column, GTK_TREE_VIEW_COLUMN_FIXED); /* Add the column to the view. */ gtk_tree_view_append_column (list_view, column); @@ -858,6 +871,19 @@ ifopts_edit_cb(GtkWidget *w, gpointer data _U_) ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), if_snaplen_cb, 1, row, 1, 1); gtk_widget_show(if_snaplen_cb); row++; + + /* create "promiscuous mode" label and button */ + if_pmode_lb = gtk_label_new("Promiscuous mode:"); + ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), if_pmode_lb, 0, row, 1, 1); + gtk_misc_set_alignment(GTK_MISC(if_pmode_lb), 1.0f, 0.5f); + gtk_widget_show(if_pmode_lb); + + if_pmode_cb = gtk_check_button_new(); + g_signal_connect(if_pmode_cb, "toggled", G_CALLBACK(ifopts_edit_pmode_changed_cb), + cur_list); + ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), if_pmode_cb, 1, row, 1, 1); + gtk_widget_show(if_pmode_cb); + row++; if_linktype_lb = gtk_label_new("Default link-layer header type:"); ws_gtk_grid_attach_defaults(GTK_GRID(main_grid), if_linktype_lb, 0, row, 1, 1); @@ -1010,6 +1036,8 @@ ifopts_edit_ok_cb(GtkWidget *w _U_, gpointer parent_w) /* create/write new "snaplen" interfaces string */ ifopts_write_new_snaplen(); + /* create/write new promiscuous mode interfaces string */ + ifopts_write_new_pmode(); } /* Update everything that shows an interface list that includes @@ -1105,7 +1133,7 @@ ifopts_edit_ifsel_cb(GtkTreeSelection *selection _U_, gint buffersize; #endif gint snaplen; - gboolean hide, hide_enabled = TRUE, hassnap = FALSE; + gboolean hide, hide_enabled = TRUE, hassnap = FALSE, pmode; if_capabilities_t *caps; gint selected = 0; @@ -1124,6 +1152,7 @@ ifopts_edit_ifsel_cb(GtkTreeSelection *selection _U_, #endif HASSNAP_COLUMN, &hassnap, SNAPLEN_COLUMN, &snaplen, + PMODE_COLUMN, &pmode, DEF_LINK_LAYER_COLUMN, &linktype, COMMENT_COLUMN, &comment, HIDE_COLUMN, &hide, @@ -1145,6 +1174,14 @@ ifopts_edit_ifsel_cb(GtkTreeSelection *selection _U_, gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(if_snaplen_tg), hassnap); gtk_widget_set_sensitive(GTK_WIDGET(if_snaplen_cb), hassnap); + if (prefs.capture_prom_mode) { + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(if_pmode_cb), TRUE); + } else if (capture_dev_user_pmode_find(if_name) != -1) { + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(if_pmode_cb), capture_dev_user_pmode_find(if_name)); + } else { + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(if_pmode_cb), FALSE); + } + /* Ignore "changed" callbacks while we update the Properties widgets */ interfaces_info_nochange = TRUE; @@ -1454,7 +1491,7 @@ ifopts_edit_hassnap_changed_cb(GtkToggleButton *tbt, gpointer udata) return; } hassnap = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(tbt)); - + list_store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW (udata))); gtk_list_store_set (list_store, &list_iter, HASSNAP_COLUMN, hassnap, @@ -1463,6 +1500,32 @@ ifopts_edit_hassnap_changed_cb(GtkToggleButton *tbt, gpointer udata) } /* + * Checkbutton for the promiscuous mode changed callback; update list_store for currently selected interface. + */ +static void +ifopts_edit_pmode_changed_cb(GtkToggleButton *tbt, gpointer udata) +{ + gboolean pmode; + GtkTreeModel *list_model; + GtkTreeIter list_iter; + GtkListStore *list_store; + + if (if_selection == NULL) /* XXX: Cannot be NULL ?? */ + return; + + if (!gtk_tree_selection_get_selected (if_selection, &list_model, &list_iter)){ + return; + } + pmode = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(tbt)); + + list_store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW (udata))); + gtk_list_store_set (list_store, &list_iter, + PMODE_COLUMN, pmode, + -1); +} + + +/* * Comment text entry changed callback; update list_store for currently selected interface. */ static void @@ -1554,7 +1617,7 @@ ifopts_options_add(GtkListStore *list_store, if_info_t *if_info) gint buffersize; #endif gint snaplen; - gboolean hide, hassnap = TRUE; + gboolean hide, hassnap = TRUE, pmode; GtkTreeIter iter; /* set device name text */ @@ -1611,6 +1674,15 @@ ifopts_options_add(GtkListStore *list_store, if_info_t *if_info) hassnap = FALSE; } + if (prefs.capture_prom_mode) { + pmode = TRUE; + } else { + if ((pmode = capture_dev_user_pmode_find(if_info->name)) != -1) { + pmode = capture_dev_user_pmode_find(if_info->name); + } else { + pmode = FALSE; + } + } /* if we have no link-layer */ if (text[2] == NULL) @@ -1681,6 +1753,7 @@ ifopts_options_add(GtkListStore *list_store, if_info_t *if_info) #endif HASSNAP_COLUMN, hassnap, SNAPLEN_COLUMN, snaplen, + PMODE_COLUMN, pmode, DEF_LINK_LAYER_COLUMN, text[2], COMMENT_COLUMN, text[3], HIDE_COLUMN, hide, @@ -1966,6 +2039,76 @@ ifopts_write_new_snaplen(void) } /* + * Create/write new promiscuous mode string based on current CList. + * Put it into the preferences value. + */ +static void +ifopts_write_new_pmode(void) +{ + GtkListStore *store; + GtkTreeIter iter; + GtkTreeModel *model; + GtkWidget *promisc_cb; + + gboolean more_items = TRUE, first_if = TRUE; /* flag to check if first in list */ + gchar *ifnm; + gboolean pmode, all_pmode, off = FALSE; + gchar *tmp_pmode; + gchar *new_pmode; + + /* new preferences interfaces promiscuous mode string */ + new_pmode = g_malloc0(MAX_VAL_LEN); + + all_pmode = prefs.capture_prom_mode; + + /* get promiscuous mode for each row (interface) */ + model = gtk_tree_view_get_model(GTK_TREE_VIEW(cur_list)); + store = GTK_LIST_STORE(model); + if( gtk_tree_model_get_iter_first(GTK_TREE_MODEL(store), &iter) ) { + + while (more_items) { + gtk_tree_model_get(GTK_TREE_MODEL(store), &iter, + DEVICE_COLUMN, &ifnm, + PMODE_COLUMN, &pmode, + -1); + if (pmode == -1){ + more_items = gtk_tree_model_iter_next (model,&iter); + continue; + } + + if (first_if != TRUE) { + g_strlcat (new_pmode, ",", MAX_VAL_LEN); + } + /* + * create/cat interface promiscuous mode to new string + * (leave space for parens, comma and terminator) + */ + if (!pmode) { + off = TRUE; + } + tmp_pmode = g_strdup_printf("%s(%d)", ifnm, pmode); + g_strlcat(new_pmode, tmp_pmode, MAX_VAL_LEN); + g_free(tmp_pmode); + g_free(ifnm); + /* set first-in-list flag to false */ + first_if = FALSE; + more_items = gtk_tree_model_iter_next (model,&iter); + } + + /* write new promiscuous mode string to preferences */ + g_free(prefs.capture_devices_pmode); + prefs.capture_devices_pmode = new_pmode; + if (off) { + prefs.capture_prom_mode = FALSE; + } else { + prefs.capture_prom_mode = TRUE; + } + promisc_cb = (GtkWidget *)g_object_get_data(G_OBJECT(capture_window), PROM_MODE_KEY); + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(promisc_cb), prefs.capture_prom_mode); + } +} + +/* * Create/write new interfaces description string based on current CList. * Put it into the preferences value. */ @@ -2077,4 +2220,9 @@ ifopts_write_new_hide(void) } } +static void +prom_mode_cb(GtkToggleButton *tbt, gpointer udata _U_) { + prefs.capture_prom_mode = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(tbt)); +} + #endif /* HAVE_LIBPCAP */ |