forked from osmocom/wireshark
Add interface options preferences.
svn path=/trunk/; revision=48275
This commit is contained in:
parent
27fc641a79
commit
44e6a88b13
|
@ -127,6 +127,7 @@ capture_opts_init(capture_options *capture_opts, void *cf)
|
|||
capture_opts->owner = getuid();
|
||||
capture_opts->group = getgid();
|
||||
#endif
|
||||
capture_opts->session_started = FALSE;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -123,7 +123,6 @@ typedef struct interface_tag {
|
|||
gint active_dlt;
|
||||
gboolean pmode;
|
||||
gboolean has_snaplen;
|
||||
gboolean snap_pref;
|
||||
guint snaplen;
|
||||
gboolean local;
|
||||
#if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
|
||||
|
@ -233,6 +232,7 @@ typedef struct capture_options_tag {
|
|||
uid_t owner; /**< owner of the cfile */
|
||||
gid_t group; /**< group of the cfile */
|
||||
#endif
|
||||
gboolean session_started;
|
||||
} capture_options;
|
||||
|
||||
/* initialize the capture_options with some reasonable values */
|
||||
|
|
|
@ -223,6 +223,31 @@ capture_dev_user_hassnap_find(const gchar *if_name)
|
|||
return (gboolean)hassnap;
|
||||
}
|
||||
|
||||
gboolean
|
||||
capture_dev_user_pmode_find(const gchar *if_name)
|
||||
{
|
||||
gchar *p, *next;
|
||||
gboolean pmode;
|
||||
|
||||
if ((prefs.capture_devices_pmode == NULL) ||
|
||||
(*prefs.capture_devices_pmode == '\0')) {
|
||||
/* There is no promiscuous mode defined */
|
||||
return -1;
|
||||
}
|
||||
|
||||
if ((p = strstr(prefs.capture_devices_pmode, if_name)) == NULL) {
|
||||
/* There are, but there isn't one for this interface. */
|
||||
return -1;
|
||||
}
|
||||
|
||||
p += strlen(if_name) + 1;
|
||||
pmode = (gboolean)strtol(p, &next, 10);
|
||||
if (next == p || *next != ')') {
|
||||
/* Syntax error */
|
||||
return -1;
|
||||
}
|
||||
return (gboolean)pmode;
|
||||
}
|
||||
|
||||
/*
|
||||
* Return as descriptive a name for an interface as we can get.
|
||||
|
|
|
@ -62,6 +62,12 @@ gint capture_dev_user_buffersize_find(const gchar *if_name);
|
|||
gint capture_dev_user_snaplen_find(const gchar *if_name);
|
||||
gboolean capture_dev_user_hassnap_find(const gchar *if_name);
|
||||
|
||||
/**
|
||||
* Find user-specified promiscuous mode that matches interface
|
||||
* name, if any.
|
||||
*/
|
||||
gboolean capture_dev_user_pmode_find(const gchar *if_name);
|
||||
|
||||
/** Return as descriptive a name for an interface as we can get.
|
||||
* If the user has specified a comment, use that. Otherwise,
|
||||
* if capture_interface_list() supplies a description, use that,
|
||||
|
|
|
@ -2190,6 +2190,10 @@ prefs_register_modules(void)
|
|||
"Interface snap length (Ex: en0(65535),en1(1430),...)",
|
||||
(const char**)(&prefs.capture_devices_snaplen));
|
||||
|
||||
prefs_register_string_preference(capture_module, "devices_pmode", "Interface promiscuous mode",
|
||||
"Interface promiscuous mode (Ex: en0(0),en1(1),...)",
|
||||
(const char**)(&prefs.capture_devices_pmode));
|
||||
|
||||
prefs_register_bool_preference(capture_module, "prom_mode", "Capture in promiscuous mode",
|
||||
"Capture in promiscuous mode?", &prefs.capture_prom_mode);
|
||||
|
||||
|
|
|
@ -186,6 +186,7 @@ typedef struct _e_prefs {
|
|||
gchar *capture_devices_buffersize;
|
||||
#endif
|
||||
gchar *capture_devices_snaplen;
|
||||
gchar *capture_devices_pmode;
|
||||
gboolean capture_prom_mode;
|
||||
gboolean capture_pcap_ng;
|
||||
gboolean capture_real_time;
|
||||
|
|
|
@ -1249,9 +1249,10 @@ insert_new_rows(GList *list)
|
|||
device.buffer = global_capture_opts.default_options.buffer_size;
|
||||
}
|
||||
#endif
|
||||
device.pmode = global_capture_opts.default_options.promisc_mode;
|
||||
if ((device.pmode = capture_dev_user_pmode_find(if_string)) == -1) {
|
||||
device.pmode = global_capture_opts.default_options.promisc_mode;
|
||||
}
|
||||
device.has_snaplen = global_capture_opts.default_options.has_snaplen;
|
||||
device.snap_pref = TRUE;
|
||||
if ((device.snaplen = capture_dev_user_snaplen_find(if_string)) == -1) {
|
||||
device.snaplen = global_capture_opts.default_options.snaplen;
|
||||
}
|
||||
|
@ -2479,7 +2480,6 @@ save_options_cb(GtkWidget *win _U_, gpointer user_data _U_)
|
|||
device.has_snaplen = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(snap_cb));
|
||||
if (device.has_snaplen) {
|
||||
if (device.snaplen != (guint)gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(snap_sb))) {
|
||||
device.snap_pref = FALSE;
|
||||
}
|
||||
device.snaplen = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(snap_sb));
|
||||
if (device.snaplen < 1)
|
||||
|
@ -2523,7 +2523,10 @@ adjust_snap_sensitivity(GtkWidget *tb _U_, gpointer parent_w _U_)
|
|||
gtk_widget_set_sensitive(GTK_WIDGET(snap_sb),
|
||||
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(snap_cb)));
|
||||
device.has_snaplen = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(snap_cb));
|
||||
device.snap_pref = FALSE;
|
||||
if (!device.has_snaplen) {
|
||||
gtk_spin_button_set_value(GTK_SPIN_BUTTON (snap_sb), WTAP_MAX_PACKET_SIZE);
|
||||
device.snaplen = WTAP_MAX_PACKET_SIZE;
|
||||
}
|
||||
g_array_insert_val(global_capture_opts.all_ifaces, marked_interface, device);
|
||||
}
|
||||
|
||||
|
@ -3152,16 +3155,32 @@ static void capture_all_cb(GtkToggleButton *button, gpointer d _U_)
|
|||
}
|
||||
|
||||
|
||||
static gboolean get_all_prom_mode(void)
|
||||
{
|
||||
interface_options interface_opts;
|
||||
guint i;
|
||||
|
||||
for (i = 0; i < global_capture_opts.ifaces->len; i++) {
|
||||
interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, i);
|
||||
if (!interface_opts.promisc_mode) {
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void promisc_mode_callback(GtkToggleButton *button, gpointer d _U_)
|
||||
{
|
||||
GtkTreeIter iter;
|
||||
GtkTreeView *if_cb;
|
||||
GtkTreeModel *model;
|
||||
gboolean enabled = FALSE;
|
||||
gboolean enabled = FALSE, set;
|
||||
interface_t device;
|
||||
interface_options interface_opts;
|
||||
guint i;
|
||||
|
||||
set = gtk_toggle_button_get_active(button);
|
||||
gtk_toggle_button_set_active(button, (set?FALSE:TRUE));
|
||||
if (gtk_toggle_button_get_active(button))
|
||||
enabled = TRUE;
|
||||
|
||||
|
@ -4333,11 +4352,9 @@ update_properties_all(void) {
|
|||
}
|
||||
}
|
||||
}
|
||||
promisc_b = (GtkWidget *)g_object_get_data(G_OBJECT(cap_open_w), E_CAP_PROMISC_KEY_ALL);
|
||||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(promisc_b), promisc_all);
|
||||
|
||||
if (promisc_all) {
|
||||
promisc_b = (GtkWidget *)g_object_get_data(G_OBJECT(cap_open_w), E_CAP_PROMISC_KEY_ALL);
|
||||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(promisc_b), TRUE);
|
||||
}
|
||||
if (capture_all) {
|
||||
capture_b = (GtkWidget *)g_object_get_data(G_OBJECT(cap_open_w), E_CAP_KEY_ALL);
|
||||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(capture_b), TRUE);
|
||||
|
@ -4641,11 +4658,12 @@ capture_prep_cb(GtkWidget *w _U_, gpointer d _U_)
|
|||
gtk_widget_set_sensitive(GTK_WIDGET(all_cb), if_present);
|
||||
/* Promiscuous mode row */
|
||||
promisc_cb = gtk_check_button_new_with_mnemonic("Capture all in _promiscuous mode");
|
||||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(promisc_cb),
|
||||
global_capture_opts.default_options.promisc_mode);
|
||||
if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(promisc_cb)))
|
||||
promisc_mode_callback(GTK_TOGGLE_BUTTON(promisc_cb), NULL);
|
||||
g_signal_connect(promisc_cb, "toggled", G_CALLBACK(promisc_mode_callback), NULL);
|
||||
if (!global_capture_opts.session_started) {
|
||||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(promisc_cb), prefs.capture_prom_mode);
|
||||
} else {
|
||||
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(promisc_cb), get_all_prom_mode());
|
||||
}
|
||||
g_signal_connect(promisc_cb, "button-press-event", G_CALLBACK(promisc_mode_callback), NULL);
|
||||
|
||||
gtk_widget_set_tooltip_text(promisc_cb,
|
||||
"Usually a network adapter will only capture the traffic sent to its own network address. "
|
||||
|
@ -4654,7 +4672,6 @@ capture_prep_cb(GtkWidget *w _U_, gpointer d _U_)
|
|||
"option individually."
|
||||
"See the FAQ for some more details of capturing packets from a switched network.");
|
||||
gtk_box_pack_start(GTK_BOX(left_vb), promisc_cb, TRUE, TRUE, 0);
|
||||
gtk_widget_set_sensitive(GTK_WIDGET(promisc_cb), if_present);
|
||||
|
||||
iftype_cbx = gtk_button_new_with_label("Manage Interfaces");
|
||||
gtk_widget_set_tooltip_text(iftype_cbx, "Add a new interface or pipe to capture from or remove "
|
||||
|
@ -5121,6 +5138,7 @@ capture_prep_cb(GtkWidget *w _U_, gpointer d _U_)
|
|||
window_present(cap_open_w);
|
||||
|
||||
cap_open_complete = TRUE; /* "Capture:Start" is now OK */
|
||||
global_capture_opts.session_started = TRUE;
|
||||
}
|
||||
|
||||
/* everythings prepared, now it's really time to start the capture */
|
||||
|
@ -5454,7 +5472,7 @@ create_and_fill_model(GtkTreeView *view)
|
|||
gint buffer;
|
||||
#endif
|
||||
gint snaplen;
|
||||
gboolean hassnap;
|
||||
gboolean hassnap, pmode;
|
||||
|
||||
#if defined(HAVE_PCAP_CREATE)
|
||||
store = gtk_list_store_new (9, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_STRING);
|
||||
|
@ -5473,6 +5491,9 @@ create_and_fill_model(GtkTreeView *view)
|
|||
temp = g_strdup_printf("<b>%s</b>\n<span size='small'>%s</span>", device.display_name, device.addresses);
|
||||
}
|
||||
linkname = NULL;
|
||||
if(global_capture_opts.session_started == FALSE && capture_dev_user_linktype_find(device.name) != -1) {
|
||||
device.active_dlt = capture_dev_user_linktype_find(device.name);
|
||||
}
|
||||
for (list = device.links; list != NULL; list = g_list_next(list)) {
|
||||
linkr = (link_row*)(list->data);
|
||||
if (linkr->dlt == device.active_dlt) {
|
||||
|
@ -5480,29 +5501,39 @@ create_and_fill_model(GtkTreeView *view)
|
|||
break;
|
||||
}
|
||||
}
|
||||
hassnap = capture_dev_user_hassnap_find(device.name);
|
||||
snaplen = capture_dev_user_snaplen_find(device.name);
|
||||
if((snaplen>0)&&(hassnap>0)){
|
||||
pmode = capture_dev_user_pmode_find(device.name);
|
||||
if (global_capture_opts.session_started == FALSE && pmode != -1) {
|
||||
device.pmode = pmode;
|
||||
}
|
||||
if(global_capture_opts.session_started == FALSE) {
|
||||
hassnap = capture_dev_user_hassnap_find(device.name);
|
||||
snaplen = capture_dev_user_snaplen_find(device.name);
|
||||
if(snaplen != -1 && hassnap != -1) {
|
||||
/* Default snap lenght set in preferences */
|
||||
device.snaplen = snaplen;
|
||||
device.has_snaplen = TRUE;
|
||||
global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, i);
|
||||
g_array_insert_val(global_capture_opts.all_ifaces, i, device);
|
||||
snaplen_string = g_strdup_printf("%d", device.snaplen);
|
||||
}else if (device.has_snaplen) {
|
||||
snaplen_string = g_strdup_printf("%d", device.snaplen);
|
||||
}else{
|
||||
snaplen_string = g_strdup("default");
|
||||
device.has_snaplen = hassnap;
|
||||
} else {
|
||||
/* No preferences set yet, use default values */
|
||||
device.snaplen = WTAP_MAX_PACKET_SIZE;
|
||||
device.has_snaplen = FALSE;
|
||||
}
|
||||
}
|
||||
if (device.has_snaplen) {
|
||||
snaplen_string = g_strdup_printf("%d", device.snaplen);
|
||||
} else {
|
||||
snaplen_string = g_strdup("default");
|
||||
}
|
||||
|
||||
#if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
|
||||
buffer = device.buffer;
|
||||
if (buffer == DEFAULT_CAPTURE_BUFFER_SIZE && capture_dev_user_buffersize_find(device.name) != DEFAULT_CAPTURE_BUFFER_SIZE && capture_dev_user_buffersize_find(device.name) != -1) {
|
||||
if (global_capture_opts.session_started == FALSE && capture_dev_user_buffersize_find(device.name) != -1) {
|
||||
buffer = capture_dev_user_buffersize_find(device.name);
|
||||
device.buffer = buffer;
|
||||
global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, i);
|
||||
g_array_insert_val(global_capture_opts.all_ifaces, i, device);
|
||||
}
|
||||
} else if (global_capture_opts.session_started == FALSE) {
|
||||
device.buffer = DEFAULT_CAPTURE_BUFFER_SIZE;
|
||||
}
|
||||
#endif
|
||||
global_capture_opts.all_ifaces = g_array_remove_index(global_capture_opts.all_ifaces, i);
|
||||
g_array_insert_val(global_capture_opts.all_ifaces, i, device);
|
||||
gtk_list_store_append (store, &iter);
|
||||
#if defined(HAVE_PCAP_CREATE)
|
||||
gtk_list_store_set (store, &iter, CAPTURE, device.selected, IFACE_HIDDEN_NAME, device.name, INTERFACE, temp, LINK, linkname?linkname:"This should not happen", PMODE, device.pmode?"enabled":"disabled", SNAPLEN, snaplen_string, BUFFER, (guint) device.buffer, MONITOR, device.monitor_mode_supported?(device.monitor_mode_enabled?"enabled":"disabled"):"n/a", FILTER, device.cfilter, -1);
|
||||
|
@ -5901,7 +5932,8 @@ void
|
|||
refresh_local_interface_lists(void)
|
||||
{
|
||||
/* Reload the local interface list. */
|
||||
scan_local_interfaces();
|
||||
if (global_capture_opts.session_started == FALSE)
|
||||
scan_local_interfaces();
|
||||
|
||||
/* If there's an interfaces dialog up, refresh it. */
|
||||
if (interfaces_dialog_window_present())
|
||||
|
|
|
@ -926,12 +926,11 @@ update_capture_box(void)
|
|||
interface_t device;
|
||||
gboolean changed = FALSE;
|
||||
|
||||
entry = gtk_tree_view_get_selection(GTK_TREE_VIEW(if_view));
|
||||
gtk_tree_selection_unselect_all(GTK_TREE_SELECTION(entry));
|
||||
store = gtk_list_store_new(NUMCOLUMNS, GDK_TYPE_PIXBUF, G_TYPE_STRING, G_TYPE_STRING);
|
||||
|
||||
gtk_list_store_clear(store);
|
||||
gtk_tree_view_set_model(GTK_TREE_VIEW(if_view), GTK_TREE_MODEL (store));
|
||||
entry = gtk_tree_view_get_selection(GTK_TREE_VIEW(if_view));
|
||||
for (i = 0; i < global_capture_opts.all_ifaces->len; i++) {
|
||||
device = g_array_index(global_capture_opts.all_ifaces, interface_t, i);
|
||||
if (!device.hidden) {
|
||||
|
|
|
@ -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,
|
||||
|
@ -1462,6 +1499,32 @@ ifopts_edit_hassnap_changed_cb(GtkToggleButton *tbt, gpointer udata)
|
|||
gtk_widget_set_sensitive(GTK_WIDGET(if_snaplen_cb), hassnap);
|
||||
}
|
||||
|
||||
/*
|
||||
* 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.
|
||||
*/
|
||||
|
@ -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,
|
||||
|
@ -1965,6 +2038,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 */
|
||||
|
|
|
@ -242,12 +242,22 @@ scan_local_interfaces(void)
|
|||
device.local = TRUE;
|
||||
device.if_info = *temp;
|
||||
device.last_packets = 0;
|
||||
device.pmode = global_capture_opts.default_options.promisc_mode;
|
||||
device.has_snaplen = global_capture_opts.default_options.has_snaplen;
|
||||
device.snaplen = global_capture_opts.default_options.snaplen;
|
||||
if ((device.pmode = capture_dev_user_pmode_find(if_info->name)) == -1) {
|
||||
device.pmode = global_capture_opts.default_options.promisc_mode;
|
||||
}
|
||||
if ((device.has_snaplen = capture_dev_user_hassnap_find(if_info->name)) == -1) {
|
||||
device.has_snaplen = global_capture_opts.default_options.has_snaplen;
|
||||
}
|
||||
if (capture_dev_user_snaplen_find(if_info->name) == -1) {
|
||||
device.snaplen = global_capture_opts.default_options.snaplen;
|
||||
} else {
|
||||
device.snaplen = (guint)capture_dev_user_snaplen_find(if_info->name);
|
||||
}
|
||||
device.cfilter = g_strdup(global_capture_opts.default_options.cfilter);
|
||||
#if defined(_WIN32) || defined(HAVE_PCAP_CREATE)
|
||||
device.buffer = DEFAULT_CAPTURE_BUFFER_SIZE;
|
||||
if ((device.buffer = capture_dev_user_buffersize_find(if_info->name)) == -1) {
|
||||
device.buffer = global_capture_opts.default_options.buffer_size;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (global_capture_opts.ifaces->len > 0) {
|
||||
|
|
Loading…
Reference in New Issue