From 55d2b928c25bbf1279d03560a50a071f9e5d9f5d Mon Sep 17 00:00:00 2001 From: Gerald Combs Date: Fri, 18 May 2007 21:06:20 +0000 Subject: From Dustin Johnson: - Update the wireless/AirPcap GUI code to support 802.11n as well as some related upcoming code changes. - Remove airpcap.h from the repository, since it exists in the AirPcap devpack (and will be superseded Real Soon Now). - Show the individual channel flag bits in radiotap. Fix the 802.11n MCS set display. This is a partial checkin, so hopefully nothing is broken. svn path=/trunk/; revision=21831 --- gtk/Makefile.nmake | 2 +- gtk/airpcap_dlg.c | 374 +++++++++++++-------------------------- gtk/airpcap_dlg.h | 29 ---- gtk/airpcap_gui_utils.c | 454 +++++++++++++++++++++++++++++++++--------------- gtk/airpcap_gui_utils.h | 34 +++- gtk/capture_dlg.c | 8 +- gtk/capture_if_dlg.c | 20 ++- gtk/keys.h | 2 + gtk/main.c | 222 ++++++++++++++--------- 9 files changed, 632 insertions(+), 513 deletions(-) (limited to 'gtk') diff --git a/gtk/Makefile.nmake b/gtk/Makefile.nmake index 9ab577f026..96c18a365b 100644 --- a/gtk/Makefile.nmake +++ b/gtk/Makefile.nmake @@ -10,7 +10,7 @@ include ..\config.nmake CFLAGS=-WX -DHAVE_CONFIG_H /I.. /I../wiretap $(GTK_CFLAGS) $(GNUTLS_CFLAGS) \ /I$(PCAP_DIR)\WPCAP\LIBPCAP /I$(PCAP_DIR)\WPCAP\LIBPCAP\bpf \ /I$(PCAP_DIR)\WPCAP\LIBPCAP\lbl \ - /I$(PCAP_DIR)\include $(NET_SNMP_CFLAGS) \ + /I$(PCAP_DIR)\include $(NET_SNMP_CFLAGS) $(AIRPCAP_CFLAGS) \ /Zm800 -D_U_="" -D_NEED_VAR_IMPORT_ $(LOCAL_CFLAGS) \ $(PORTAUDIO_CFLAGS) \ $(HHC_CFLAGS) diff --git a/gtk/airpcap_dlg.c b/gtk/airpcap_dlg.c index ab92fa39fc..dd4881efa6 100644 --- a/gtk/airpcap_dlg.c +++ b/gtk/airpcap_dlg.c @@ -24,6 +24,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + #ifdef HAVE_CONFIG_H # include "config.h" #endif @@ -39,6 +40,7 @@ #include #include #include +#include #include @@ -375,8 +377,7 @@ static void on_channel_en_changed(GtkWidget *w _U_, gpointer data) { const gchar *s; - - s = gtk_entry_get_text(GTK_ENTRY(w)); + ULONG ch_freq; if ( !block_advanced_signals && (data != NULL) && (w != NULL) ) { @@ -385,244 +386,65 @@ on_channel_en_changed(GtkWidget *w _U_, gpointer data) { if (airpcap_if_selected != NULL) { - airpcap_if_selected->channel = airpcap_get_channel_number(s); + ch_freq = airpcap_get_frequency_from_str(s); + airpcap_if_active->channelInfo.Frequency = ch_freq; airpcap_if_selected->saved = FALSE; + airpcap_update_channel_offset_cb(airpcap_if_selected, ch_freq, GTK_WIDGET(data)); } } } } /* - * Changed callback for the capture type combobox + * Changed callback for the channel offset combobox */ static void -on_capture_type_en_changed(GtkWidget *w _U_, gpointer data) +on_channel_offset_cb_changed(GtkWidget *w _U_, gpointer data) { const gchar *s; - - s = gtk_entry_get_text(GTK_ENTRY(w)); + gchar offset; if ( !block_advanced_signals && (data != NULL) && (w != NULL) ) { + s = gtk_entry_get_text(GTK_ENTRY(w)); if ((g_strcasecmp("",s))) { - airpcap_if_selected->linkType = airpcap_get_link_type(s); - airpcap_if_selected->saved = FALSE; + if (airpcap_if_selected != NULL) + { + sscanf(s,"%d",&offset); + airpcap_if_selected->channelInfo.ExtChannel = offset; + airpcap_if_selected->saved = FALSE; + } } } } /* - * Activate callback for the adapter combobox + * Changed callback for the capture type combobox */ static void -combo_if_activate_cb(GtkWidget *entry _U_, gpointer data) -{ -} - -/* - * Pop-up window, used to ask the user if he wants to save the selected interface settings - * when closing the window. - */ -void -airpcap_ask_for_save_before_closing(GtkWidget *w _U_, gpointer data) -{ - GtkWidget* dialog; - - dialog = simple_dialog(ESD_TYPE_CONFIRMATION, ESD_BTNS_SAVE_DONTSAVE_CANCEL, - PRIMARY_TEXT_START "Save settings before closing?" PRIMARY_TEXT_END "\n\n" - "If you close the window without saving, changes you made will\nbe discarded."); - simple_dialog_set_cb(dialog, airpcap_dialog_save_before_closing_cb, data); -} - -/* user confirmed the "Save settings..." dialog */ -void -airpcap_dialog_save_before_closing_cb(gpointer dialog _U_, gint btn, gpointer data) +on_capture_type_en_changed(GtkWidget *w _U_, gpointer data) { - GtkWidget* interface_combo; - GtkWidget* key_ls; + const gchar *s; - /* I need the combo box entry */ - interface_combo = GTK_WIDGET(OBJECT_GET_DATA(GTK_WIDGET(data),AIRPCAP_ADVANCED_INTERFACE_KEY)); - key_ls = GTK_WIDGET(OBJECT_GET_DATA(data,AIRPCAP_ADVANCED_KEYLIST_KEY)); + s = gtk_entry_get_text(GTK_ENTRY(w)); - switch (btn) + if ( !block_advanced_signals && (data != NULL) && (w != NULL) ) { - case(ESD_BTN_SAVE): - /* save interface and exit */ - airpcap_add_keys_from_list(key_ls,airpcap_if_selected); - airpcap_save_selected_if_configuration(airpcap_if_selected); - /* Remove gtk timeout */ - gtk_timeout_remove(airpcap_if_selected->tag); - break; - case(ESD_BTN_DONT_SAVE): - /* exit without saving */ - break; - - default: - break; + if ((g_strcasecmp("",s))) + { + airpcap_if_selected->linkType = airpcap_get_link_type(s); + airpcap_if_selected->saved = FALSE; + } } } /* - * Pop-up window, used to ask the user if he wants to save the selected interface settings - * when changing the interface in the advanced dialog box + * Activate callback for the adapter combobox */ -void -airpcap_ask_for_save(GtkWidget *entry _U_, gpointer data) -{ - GtkWidget* dialog; - - dialog = simple_dialog(ESD_TYPE_CONFIRMATION, ESD_BTNS_SAVE_DONTSAVE_CANCEL, - PRIMARY_TEXT_START "Save settings before changing interface?" PRIMARY_TEXT_END "\n\n" - "If you change interface without saving, changes you made will\nbe discarded."); - simple_dialog_set_cb(dialog, airpcap_dialog_save_cb, data); - -} - -/* user confirmed the "Save settings..." dialog */ -void -airpcap_dialog_save_cb(GtkWidget* dialog _U_, gint btn, gpointer data) +static void +combo_if_activate_cb(GtkWidget *entry _U_, gpointer data) { - GtkWidget* interface_combo; - GtkWidget* key_ls; - - /* I need the combo box entry */ - interface_combo = GTK_WIDGET(OBJECT_GET_DATA(GTK_WIDGET(data),AIRPCAP_ADVANCED_INTERFACE_KEY)); - key_ls = GTK_WIDGET(OBJECT_GET_DATA(data,AIRPCAP_ADVANCED_KEYLIST_KEY)); - - switch (btn) - { - case(ESD_BTN_SAVE): - /* save interface and change */ - airpcap_add_keys_from_list(key_ls,airpcap_if_selected); - airpcap_save_selected_if_configuration(airpcap_if_selected); - /* Remove gtk timeout */ - gtk_timeout_remove(airpcap_if_selected->tag); - airpcap_change_if(GTK_COMBO(interface_combo)->entry,data); - break; - case(ESD_BTN_DONT_SAVE): - /* change interface without saving */ - airpcap_change_if(GTK_COMBO(interface_combo)->entry,data); - break; - case(ESD_BTN_CANCEL): - /* don't change interface and don't save */ - break; - default: - break; - } -} - -/* - * Function used to change the selected interface and advanced dialog box - */ -void -airpcap_change_if(GtkWidget *entry _U_, gpointer data) -{ - const gchar *s; - gchar *channel_s; - gchar *capture_s; - GtkWidget *main_w; - - GtkWidget *interface_combo; - GtkWidget *channel_combo; - GtkWidget *capture_combo; - GtkWidget *crc_check; - GtkWidget *wrong_crc_combo; - GtkWidget *blink_bt; - GtkWidget *key_ls; - - airpcap_if_info_t *new_if; - - /* Retrieve the GUI object pointers */ - main_w = GTK_WIDGET(data); - interface_combo = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_INTERFACE_KEY)); - channel_combo = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_CHANNEL_KEY)); - capture_combo = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_LINK_TYPE_KEY)); - crc_check = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_FCS_CHECK_KEY)); - wrong_crc_combo = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_FCS_FILTER_KEY)); - blink_bt = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_BLINK_KEY)); - key_ls = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_ADVANCED_KEYLIST_KEY)); - - s = gtk_entry_get_text(GTK_ENTRY(entry)); - - /* Select actual interface*/ - new_if = get_airpcap_if_from_description(airpcap_if_list, s); - - /* And change the GUI according to it... */ - /* This should always happen, but it seems that the callback is - * called twice, the first time with an 'empty' text... so it - * will return NULL! - */ - if (new_if != NULL) - { - airpcap_if_selected = new_if; - - new_if = NULL; - /* I need to 'block' signals to widgets or they will receive a signal now - and will change twice */ - block_advanced_signals = TRUE; - - /* Blink button */ - if (airpcap_if_selected->blinking) - { -#if GTK_MAJOR_VERSION >= 2 - gtk_button_set_label(GTK_BUTTON(blink_bt),"Stop Blinking"); -#else - gtk_label_set_text(GTK_LABEL(GTK_BIN(blink_bt)->child),"Stop Blinking"); -#endif - } - else - { -#if GTK_MAJOR_VERSION >= 2 - gtk_button_set_label(GTK_BUTTON(blink_bt)," Blink Led "); -#else - gtk_label_set_text(GTK_LABEL(GTK_BIN(blink_bt)->child)," Blink Led "); -#endif - } - - /* Channel combo */ - channel_s = g_strdup_printf("%d",airpcap_if_selected->channel); - if (channel_combo != NULL) /* this event seems to happen when combo is still NULL */ - gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(channel_combo)->entry), channel_s); - - /* Link Layer combo */ - capture_s = NULL; - if (airpcap_if_selected->linkType == AIRPCAP_LT_802_11) - { - capture_s = g_strdup_printf(AIRPCAP_LINK_TYPE_NAME_802_11_ONLY); - if (capture_combo != NULL) /* this event seems to happen when combo is still NULL */ - gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(capture_combo)->entry), capture_s); - } - else if (airpcap_if_selected->linkType == AIRPCAP_LT_802_11_PLUS_RADIO) - { - capture_s = g_strdup_printf(AIRPCAP_LINK_TYPE_NAME_802_11_PLUS_RADIO); - if (capture_combo != NULL) /* this event seems to happen when combo is still NULL */ - gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(capture_combo)->entry), capture_s); - } - - /* Fcs Presence check box */ - if (airpcap_if_selected->IsFcsPresent) - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(crc_check),TRUE); - else - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(crc_check),FALSE); - - /* Wrong Crc combo box */ - if (airpcap_if_selected->CrcValidationOn == AIRPCAP_VT_ACCEPT_EVERYTHING) - gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(wrong_crc_combo)->entry),AIRPCAP_VALIDATION_TYPE_NAME_ALL); - else if (airpcap_if_selected->CrcValidationOn == AIRPCAP_VT_ACCEPT_CORRECT_FRAMES) - gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(wrong_crc_combo)->entry),AIRPCAP_VALIDATION_TYPE_NAME_CORRECT); - else if (airpcap_if_selected->CrcValidationOn == AIRPCAP_VT_ACCEPT_CORRUPT_FRAMES) - gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(wrong_crc_combo)->entry),AIRPCAP_VALIDATION_TYPE_NAME_CORRUPT); - - /* Remove old keys */ - gtk_list_remove_items(GTK_LIST(key_ls),GTK_LIST(key_ls)->children); - /* Add new keys */ - airpcap_fill_key_list(key_ls); - - /* Enable the signals again */ - block_advanced_signals = FALSE; - } } /* @@ -636,7 +458,7 @@ void update_blink(gpointer data _U_) sel = (airpcap_if_info_t*)data; - ad = airpcap_if_open(get_airpcap_name_from_description(airpcap_if_list, sel->description), ebuf); + ad = airpcap_if_open(sel->name, ebuf); if (ad) { if (sel->led) @@ -834,7 +656,7 @@ on_key_management_apply_bt_clicked(GtkWidget *button, gpointer data _U_) update_decryption_mode_cm(toolbar_cm); /* Redissect all the packets, and re-evaluate the display filter. */ -/** //cf_redissect_packets(&cfile); **/ +/** cf_redissect_packets(&cfile); **/ } /* * Callback for the Wireless Advanced Settings 'Apply' button. @@ -849,6 +671,7 @@ on_advanced_apply_bt_clicked(GtkWidget *button, gpointer data _U_) GtkWidget *toolbar, *toolbar_if_lb, *toolbar_channel_cm, + *toolbar_channel_offset_cb, *toolbar_wrong_crc_cm; /* retrieve main window */ @@ -857,9 +680,10 @@ on_advanced_apply_bt_clicked(GtkWidget *button, gpointer data _U_) toolbar = GTK_WIDGET(OBJECT_GET_DATA(main_w,AIRPCAP_TOOLBAR_KEY)); /* retrieve toolbar info */ - toolbar_if_lb = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_INTERFACE_KEY)); - toolbar_channel_cm = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_CHANNEL_KEY)); - toolbar_wrong_crc_cm = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_FCS_FILTER_KEY)); + toolbar_if_lb = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_INTERFACE_KEY)); + toolbar_channel_cm = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_CHANNEL_KEY)); + toolbar_channel_offset_cb = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_CHANNEL_OFFSET_KEY)); + toolbar_wrong_crc_cm = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_FCS_FILTER_KEY)); /* Save the configuration (for all ) */ airpcap_save_selected_if_configuration(airpcap_if_selected); @@ -868,8 +692,9 @@ on_advanced_apply_bt_clicked(GtkWidget *button, gpointer data _U_) if ( g_strcasecmp(airpcap_if_selected->description,airpcap_if_active->description) == 0) { gtk_label_set_text(GTK_LABEL(toolbar_if_lb), g_strdup_printf("%s %s\t","Current Wireless Interface: #",airpcap_get_if_string_number(airpcap_if_selected))); - airpcap_update_channel_combo(GTK_WIDGET(toolbar_channel_cm),airpcap_if_selected); - airpcap_validation_type_combo_set_by_type(toolbar_wrong_crc_cm,airpcap_if_selected->CrcValidationOn); + airpcap_update_channel_combo(GTK_WIDGET(toolbar_channel_cm),airpcap_if_selected); + airpcap_update_channel_offset_combo_entry(GTK_WIDGET(toolbar_channel_offset_cb),airpcap_if_selected->channelInfo.ExtChannel); + airpcap_validation_type_combo_set_by_type(toolbar_wrong_crc_cm,airpcap_if_selected->CrcValidationOn); } } @@ -2101,7 +1926,7 @@ update_decryption_mode_list(GtkWidget *w) enable_decryption_cb_items = g_list_append (enable_decryption_cb_items, AIRPCAP_DECRYPTION_TYPE_STRING_NONE); enable_decryption_cb_items = g_list_append (enable_decryption_cb_items, AIRPCAP_DECRYPTION_TYPE_STRING_WIRESHARK); - if (airpcap_if_list != NULL) + if (airpcap_if_list != NULL && g_list_length(airpcap_if_list) > 0) { enable_decryption_cb_items = g_list_append (enable_decryption_cb_items, AIRPCAP_DECRYPTION_TYPE_STRING_AIRPCAP); } @@ -2144,11 +1969,13 @@ display_airpcap_advanced_cb(GtkWidget *w, gpointer data) GtkWidget *basic_parameters_al; GtkWidget *basic_parameters_tb; GtkWidget *channel_lb; + GtkWidget *channel_offset_lb; GtkWidget *capture_type_lb; GtkWidget *channel_cm; GList *channel_cm_items = NULL; GtkWidget *channel_en; GtkWidget *capture_type_cm; + GtkWidget *channel_offset_cb; GList *capture_type_cm_items = NULL; GtkWidget *capture_type_en; GtkWidget *fcs_ck; @@ -2166,6 +1993,9 @@ display_airpcap_advanced_cb(GtkWidget *w, gpointer data) GtkWidget *apply_bt; GtkWidget *cancel_bt; + /* for loop counter */ + guint i; + /* widgets in the toolbar */ GtkWidget *toolbar, *toolbar_if_lb, @@ -2324,32 +2154,49 @@ display_airpcap_advanced_cb(GtkWidget *w, gpointer data) capture_type_lb = gtk_label_new ("Capture Type:"); gtk_widget_set_name (capture_type_lb, "capture_type_lb"); gtk_widget_show (capture_type_lb); - gtk_table_attach (GTK_TABLE (basic_parameters_tb), capture_type_lb, 0, 1, 1, - 2, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), + gtk_table_attach (GTK_TABLE (basic_parameters_tb), capture_type_lb, 0, 1, 2, + 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (0), 0, 0); gtk_misc_set_alignment (GTK_MISC (capture_type_lb), 0, 0.5); + /* Start: Channel offset label */ + channel_offset_lb = gtk_label_new ("Channel Offset:"); + gtk_widget_set_name (channel_offset_lb, "channel_offset_lb"); + gtk_widget_show (channel_offset_lb); + gtk_table_attach (GTK_TABLE (basic_parameters_tb), channel_offset_lb, 0, 1, 1, 2, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + gtk_misc_set_alignment (GTK_MISC (channel_offset_lb), 0, 0.5); + /* End: Channel offset label */ + + /* Start: Channel offset combo box */ + channel_offset_cb = gtk_combo_new(); + gtk_widget_set_name (channel_offset_cb, "channel_offset_cb"); + gtk_editable_set_editable(GTK_EDITABLE(GTK_COMBO(channel_offset_cb)->entry),FALSE); + + airpcap_update_channel_offset_cb(airpcap_if_selected, airpcap_if_selected->channelInfo.Frequency, channel_offset_cb); + airpcap_update_channel_offset_combo_entry(channel_offset_cb, airpcap_if_selected->channelInfo.ExtChannel); + + gtk_widget_show(channel_offset_cb); + + gtk_table_attach (GTK_TABLE (basic_parameters_tb), channel_offset_cb, 1, 2, 1, 2, + (GtkAttachOptions) (GTK_FILL), + (GtkAttachOptions) (0), 0, 0); + /* End: Channel offset combo box */ + channel_cm = gtk_combo_new (); gtk_widget_set_name (channel_cm, "channel_cm"); gtk_widget_show (channel_cm); gtk_table_attach (GTK_TABLE (basic_parameters_tb), channel_cm, 1, 2, 0, 1, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); - channel_cm_items = g_list_append (channel_cm_items, (gpointer) "1"); - channel_cm_items = g_list_append (channel_cm_items, (gpointer) "2"); - channel_cm_items = g_list_append (channel_cm_items, (gpointer) "3"); - channel_cm_items = g_list_append (channel_cm_items, (gpointer) "4"); - channel_cm_items = g_list_append (channel_cm_items, (gpointer) "5"); - channel_cm_items = g_list_append (channel_cm_items, (gpointer) "6"); - channel_cm_items = g_list_append (channel_cm_items, (gpointer) "7"); - channel_cm_items = g_list_append (channel_cm_items, (gpointer) "8"); - channel_cm_items = g_list_append (channel_cm_items, (gpointer) "9"); - channel_cm_items = g_list_append (channel_cm_items, (gpointer) "10"); - channel_cm_items = g_list_append (channel_cm_items, (gpointer) "11"); - channel_cm_items = g_list_append (channel_cm_items, (gpointer) "12"); - channel_cm_items = g_list_append (channel_cm_items, (gpointer) "13"); - channel_cm_items = g_list_append (channel_cm_items, (gpointer) "14"); - gtk_combo_set_popdown_strings (GTK_COMBO (channel_cm), channel_cm_items); + + if (airpcap_if_selected != NULL && airpcap_if_selected->pSupportedChannels != NULL && airpcap_if_selected->numSupportedChannels > 0){ + for (i = 0; i<(airpcap_if_selected->numSupportedChannels); i++){ + channel_cm_items = g_list_append(channel_cm_items, airpcap_get_channelstr_from_freq(airpcap_if_selected->pSupportedChannels[i].Frequency)); + } + gtk_combo_set_popdown_strings( GTK_COMBO(channel_cm), channel_cm_items) ; + } /* Select the first entry */ if (airpcap_if_selected != NULL) @@ -2367,13 +2214,18 @@ display_airpcap_advanced_cb(GtkWidget *w, gpointer data) capture_type_cm = gtk_combo_new (); gtk_widget_set_name (capture_type_cm, "capture_type_cm"); gtk_widget_show (capture_type_cm); - gtk_table_attach (GTK_TABLE (basic_parameters_tb), capture_type_cm, 1, 2, 1, - 2, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), + gtk_table_attach (GTK_TABLE (basic_parameters_tb), capture_type_cm, 1, 2, 2, + 3, (GtkAttachOptions) (GTK_EXPAND | GTK_FILL), (GtkAttachOptions) (0), 0, 0); capture_type_cm_items = g_list_append (capture_type_cm_items, (gpointer) AIRPCAP_LINK_TYPE_NAME_802_11_ONLY); capture_type_cm_items = g_list_append (capture_type_cm_items, (gpointer) AIRPCAP_LINK_TYPE_NAME_802_11_PLUS_RADIO); + + if (airpcap_get_dll_state() == AIRPCAP_DLL_OK){ + capture_type_cm_items = + g_list_append (capture_type_cm_items, (gpointer) AIRPCAP_LINK_TYPE_NAME_802_11_PLUS_PPI); + } gtk_combo_set_popdown_strings (GTK_COMBO (capture_type_cm), capture_type_cm_items); @@ -2381,10 +2233,14 @@ display_airpcap_advanced_cb(GtkWidget *w, gpointer data) capture_s = NULL; if (airpcap_if_selected != NULL) { - if (airpcap_if_selected->linkType == AIRPCAP_LT_802_11) - capture_s = g_strdup_printf("%s",AIRPCAP_LINK_TYPE_NAME_802_11_ONLY); - else if (airpcap_if_selected->linkType == AIRPCAP_LT_802_11_PLUS_RADIO) - capture_s = g_strdup_printf("%s",AIRPCAP_LINK_TYPE_NAME_802_11_PLUS_RADIO); + if (airpcap_if_selected->linkType == AIRPCAP_LT_802_11){ + capture_s = g_strdup_printf("%s",AIRPCAP_LINK_TYPE_NAME_802_11_ONLY); + }else if (airpcap_if_selected->linkType == AIRPCAP_LT_802_11_PLUS_RADIO){ + capture_s = g_strdup_printf("%s",AIRPCAP_LINK_TYPE_NAME_802_11_PLUS_RADIO); + }else if (airpcap_if_selected->linkType == AIRPCAP_LT_802_11_PLUS_PPI){ + capture_s = g_strdup_printf("%s",AIRPCAP_LINK_TYPE_NAME_802_11_PLUS_PPI); + } + if (capture_s != NULL) gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(capture_type_cm)->entry), capture_s); } g_free(capture_s); @@ -2421,7 +2277,7 @@ display_airpcap_advanced_cb(GtkWidget *w, gpointer data) "basic_parameters_fcs_h_box"); gtk_widget_show (basic_parameters_fcs_h_box); gtk_table_attach (GTK_TABLE (basic_parameters_tb), - basic_parameters_fcs_h_box, 2, 3, 1, 2, + basic_parameters_fcs_h_box, 2, 3, 2, 3, (GtkAttachOptions) (GTK_FILL), (GtkAttachOptions) (GTK_FILL), 3, 0); @@ -2492,7 +2348,7 @@ display_airpcap_advanced_cb(GtkWidget *w, gpointer data) #endif gtk_widget_set_name (reset_configuration_bt, "reset_configuration_bt"); /* gtk_widget_show (reset_configuration_bt); */ - gtk_container_add (GTK_CONTAINER (left_h_button_box), + gtk_container_add (GTK_CONTAINER (low_buttons_h_box), reset_configuration_bt); GTK_WIDGET_SET_FLAGS (reset_configuration_bt, GTK_CAN_DEFAULT); @@ -2520,7 +2376,8 @@ display_airpcap_advanced_cb(GtkWidget *w, gpointer data) SIGNAL_CONNECT (blink_bt, "clicked", on_what_s_this_bt_clicked, airpcap_advanced_w); } - SIGNAL_CONNECT (channel_en, "changed",on_channel_en_changed, airpcap_advanced_w); + SIGNAL_CONNECT (channel_en, "changed",on_channel_en_changed, channel_offset_cb); + SIGNAL_CONNECT (GTK_COMBO(channel_offset_cb)->entry, "changed",on_channel_offset_cb_changed, airpcap_advanced_w); SIGNAL_CONNECT (capture_type_en, "changed",on_capture_type_en_changed, airpcap_advanced_w); SIGNAL_CONNECT (fcs_ck, "toggled",on_fcs_ck_toggled, airpcap_advanced_w); SIGNAL_CONNECT (fcs_filter_en, "changed",on_fcs_filter_en_changed, airpcap_advanced_w); @@ -2577,26 +2434,28 @@ on_advanced_ok_bt_clicked(GtkWidget *button, gpointer data _U_) GtkWidget *toolbar, *toolbar_if_lb, *toolbar_channel_cm, + *toolbar_channel_offset_cb, *toolbar_wrong_crc_cm, *advanced_bt; /* Retrieve the GUI object pointers */ - airpcap_advanced_w = GTK_WIDGET(data); - interface_combo = GTK_WIDGET(OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_INTERFACE_KEY)); - channel_combo = GTK_WIDGET(OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_CHANNEL_KEY)); - capture_combo = GTK_WIDGET(OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_LINK_TYPE_KEY)); - crc_check = GTK_WIDGET(OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_FCS_CHECK_KEY)); - wrong_crc_combo = GTK_WIDGET(OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_FCS_FILTER_KEY)); - blink_bt = GTK_WIDGET(OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_BLINK_KEY)); - cancel_bt = GTK_WIDGET(OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_CANCEL_KEY)); - ok_bt = GTK_WIDGET(OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_OK_KEY)); - advanced_bt = GTK_WIDGET(OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_KEY)); - - toolbar = GTK_WIDGET(OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_TOOLBAR_KEY)); + airpcap_advanced_w = GTK_WIDGET(data); + interface_combo = GTK_WIDGET(OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_INTERFACE_KEY)); + channel_combo = GTK_WIDGET(OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_CHANNEL_KEY)); + capture_combo = GTK_WIDGET(OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_LINK_TYPE_KEY)); + crc_check = GTK_WIDGET(OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_FCS_CHECK_KEY)); + wrong_crc_combo = GTK_WIDGET(OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_FCS_FILTER_KEY)); + blink_bt = GTK_WIDGET(OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_BLINK_KEY)); + cancel_bt = GTK_WIDGET(OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_CANCEL_KEY)); + ok_bt = GTK_WIDGET(OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_OK_KEY)); + advanced_bt = GTK_WIDGET(OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_ADVANCED_KEY)); + + toolbar = GTK_WIDGET(OBJECT_GET_DATA(airpcap_advanced_w,AIRPCAP_TOOLBAR_KEY)); /* retrieve toolbar info */ toolbar_if_lb = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_INTERFACE_KEY)); toolbar_channel_cm = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_CHANNEL_KEY)); + toolbar_channel_offset_cb = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_CHANNEL_OFFSET_KEY)); toolbar_wrong_crc_cm = GTK_WIDGET(OBJECT_GET_DATA(toolbar,AIRPCAP_TOOLBAR_FCS_FILTER_KEY)); /* Stop blinking ALL leds (go through the airpcap_if_list) */ @@ -2624,14 +2483,13 @@ on_advanced_ok_bt_clicked(GtkWidget *button, gpointer data _U_) if ( g_strcasecmp(airpcap_if_selected->description,airpcap_if_active->description) == 0) { gtk_label_set_text(GTK_LABEL(toolbar_if_lb), g_strdup_printf("%s %s\t","Current Wireless Interface: #",airpcap_get_if_string_number(airpcap_if_selected))); - airpcap_update_channel_combo(GTK_WIDGET(toolbar_channel_cm),airpcap_if_selected); - + airpcap_update_channel_offset_combo_entry(GTK_WIDGET(toolbar_channel_offset_cb),airpcap_if_selected->channelInfo.ExtChannel); airpcap_validation_type_combo_set_by_type(toolbar_wrong_crc_cm,airpcap_if_selected->CrcValidationOn); } /* If interface active is airpcap, set sensitive TRUE for airpcap toolbar */ - if ( get_airpcap_if_by_name(airpcap_if_list,airpcap_if_active->description) != NULL) + if ( get_airpcap_if_from_name(airpcap_if_list,airpcap_if_active->description) != NULL) { airpcap_set_toolbar_start_capture(airpcap_if_active); } @@ -3102,11 +2960,11 @@ on_key_management_ok_bt_clicked(GtkWidget *button, gpointer data _U_) write_prefs_to_file(); /* If interface active is airpcap, set sensitive TRUE for airpcap toolbar */ - if (airpcap_if_list != NULL) + if (airpcap_if_list != NULL && g_list_length(airpcap_if_list) > 0) { if (airpcap_if_active != NULL) { - if ( get_airpcap_if_by_name(airpcap_if_list,airpcap_if_active->description) != NULL) + if ( get_airpcap_if_from_name(airpcap_if_list,airpcap_if_active->description) != NULL) { airpcap_set_toolbar_start_capture(airpcap_if_active); } diff --git a/gtk/airpcap_dlg.h b/gtk/airpcap_dlg.h index e5fbcc904d..82cc3373c9 100644 --- a/gtk/airpcap_dlg.h +++ b/gtk/airpcap_dlg.h @@ -50,29 +50,6 @@ on_edit_key_w_destroy(GtkWidget *button, gpointer data _U_); void on_add_key_w_destroy(GtkWidget *button, gpointer data _U_); -/* - * Pop-up window, used to ask the user if he wants to save the selected interface settings - * when closing the window. - */ -void -airpcap_ask_for_save_before_closing(GtkWidget *w _U_, gpointer data); - -/* user confirmed the "Save settings..." dialog */ -void -airpcap_dialog_save_before_closing_cb(gpointer dialog _U_, gint btn, gpointer data); - -/* - * Pop-up window, used to ask the user if he wants to save the selected interface settings - */ -void -airpcap_ask_for_save(GtkWidget *entry _U_, gpointer data); - -/* - * Function used to change the selected interface and advanced dialog box - */ -void -airpcap_change_if(GtkWidget *entry _U_, gpointer data); - /* * Fill the interface combo box specified */ @@ -261,12 +238,6 @@ key_sel_list_button_cb(GtkWidget *widget, GdkEventButton *event,gpointer func_da static void combo_if_activate_cb(GtkWidget *w _U_, gpointer data); -/* - * Pop-up window that appears when user confirms the "Save settings..." dialog - */ -static void -airpcap_dialog_save_cb(GtkWidget* dialog _U_, gint btn, gpointer data); - /* * Thread function used to blink the led */ diff --git a/gtk/airpcap_gui_utils.c b/gtk/airpcap_gui_utils.c index f5d2abce59..fc413fd1bb 100644 --- a/gtk/airpcap_gui_utils.c +++ b/gtk/airpcap_gui_utils.c @@ -54,6 +54,9 @@ #include "keys.h" +/* Controls the releay of settings back to the adapter. */ +gboolean change_airpcap_settings = FALSE; + /* * Used to retrieve a string containing a list of all the channels * on which at least one adapter is capturing. This is true @@ -63,37 +66,37 @@ gchar* airpcap_get_all_channels_list(airpcap_if_info_t* if_info) { - gchar *channels; + gchar *frequencies; gchar *tmp; guint n,i; GList *current_item; airpcap_if_info_t* current_adapter; /* Allocate the string used to store the ASCII representation of the WEP key */ - channels = (gchar*)g_malloc(sizeof(gchar)*128); + frequencies = (gchar*)g_malloc(sizeof(gchar)*128); /* Make sure that the first char is '\0' in order to make g_strlcat() work */ - channels[0]='\0'; + frequencies[0]='\0'; if(airpcap_if_is_any(if_info)) { - n = g_list_length(airpcap_if_list); - - for(i = 0; i < n; i++) - { - current_item = g_list_nth(airpcap_if_list,i); - current_adapter = (airpcap_if_info_t*)current_item->data; - if(current_adapter != if_info) - { - tmp = g_strdup_printf("%d",current_adapter->channel); - g_strlcat(channels,tmp,128); - g_free(tmp); - - if(i<(n-1)) g_strlcat(channels,",",128); - } - } + n = g_list_length(airpcap_if_list); + + for(i = 0; i < n; i++) + { + current_item = g_list_nth(airpcap_if_list,i); + current_adapter = (airpcap_if_info_t*)current_item->data; + if(current_adapter != if_info && g_strncasecmp("AirPcap USB wireless capture adapter nr.", current_adapter->description, 40) == 0) + { + tmp = g_strdup_printf("%d",current_adapter->channelInfo.Frequency); + g_strlcat(frequencies,tmp,128); + g_free(tmp); + + if(i<(n-1)) g_strlcat(frequencies,",",128); + } + } } - return channels; + return frequencies; } /* @@ -105,6 +108,8 @@ airpcap_set_toolbar_start_capture(airpcap_if_info_t* if_info) GtkWidget *airpcap_toolbar_label; GtkWidget *airpcap_toolbar_channel; GtkWidget *airpcap_toolbar_channel_lb; + GtkWidget *airpcap_toolbar_channel_offset; + GtkWidget *airpcap_toolbar_channel_offset_lb; GtkWidget *airpcap_toolbar_button; GtkWidget *airpcap_toolbar_fcs; GtkWidget *airpcap_toolbar_fcs_lb; @@ -117,6 +122,8 @@ airpcap_set_toolbar_start_capture(airpcap_if_info_t* if_info) airpcap_toolbar_label = OBJECT_GET_DATA(airpcap_tb,AIRPCAP_TOOLBAR_INTERFACE_KEY); airpcap_toolbar_channel = OBJECT_GET_DATA(airpcap_tb,AIRPCAP_TOOLBAR_CHANNEL_KEY); airpcap_toolbar_channel_lb = OBJECT_GET_DATA(airpcap_tb,AIRPCAP_TOOLBAR_CHANNEL_LABEL_KEY); + airpcap_toolbar_channel_offset = OBJECT_GET_DATA(airpcap_tb,AIRPCAP_TOOLBAR_CHANNEL_OFFSET_KEY); + airpcap_toolbar_channel_offset_lb = OBJECT_GET_DATA(airpcap_tb,AIRPCAP_TOOLBAR_CHANNEL_OFFSET_LABEL_KEY); airpcap_toolbar_fcs = OBJECT_GET_DATA(airpcap_tb,AIRPCAP_TOOLBAR_FCS_FILTER_KEY); airpcap_toolbar_fcs_lb = OBJECT_GET_DATA(airpcap_tb,AIRPCAP_TOOLBAR_FCS_FILTER_LABEL_KEY); airpcap_toolbar_button = OBJECT_GET_DATA(airpcap_tb,AIRPCAP_TOOLBAR_ADVANCED_KEY); @@ -127,45 +134,65 @@ airpcap_set_toolbar_start_capture(airpcap_if_info_t* if_info) /* The current interface is an airpcap interface */ if(if_info != NULL) { - gtk_widget_set_sensitive(airpcap_tb,TRUE); - gtk_widget_set_sensitive(airpcap_toolbar_label,TRUE); - gtk_widget_set_sensitive(airpcap_toolbar_channel,TRUE); - gtk_widget_set_sensitive(airpcap_toolbar_channel_lb,TRUE); - gtk_widget_set_sensitive(airpcap_toolbar_fcs,FALSE); - gtk_widget_set_sensitive(airpcap_toolbar_fcs_lb,FALSE); - gtk_widget_set_sensitive(airpcap_toolbar_button,FALSE); - gtk_widget_set_sensitive(airpcap_toolbar_button,FALSE); - gtk_widget_set_sensitive(airpcap_toolbar_decryption,FALSE); - gtk_widget_set_sensitive(airpcap_toolbar_decryption_lb,FALSE); - gtk_widget_set_sensitive(airpcap_toolbar_keys_button,FALSE); - airpcap_update_channel_combo(GTK_WIDGET(airpcap_toolbar_channel),if_info); - - /*decription check box*/ - gtk_signal_handler_block_by_func (GTK_OBJECT(airpcap_toolbar_decryption),GTK_SIGNAL_FUNC(airpcap_toolbar_encryption_cb), airpcap_tb); - if(if_info->DecryptionOn == AIRPCAP_DECRYPTION_ON) - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(airpcap_toolbar_decryption),TRUE); - else - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(airpcap_toolbar_decryption),FALSE); - gtk_signal_handler_unblock_by_func (GTK_OBJECT(airpcap_toolbar_decryption),GTK_SIGNAL_FUNC(airpcap_toolbar_encryption_cb), airpcap_tb); - - if_label_text = g_strdup_printf("Current Wireless Interface: #%s", airpcap_get_if_string_number(if_info)); - gtk_label_set_text(GTK_LABEL(airpcap_toolbar_label),if_label_text); - g_free(if_label_text); + gtk_widget_set_sensitive(airpcap_tb,TRUE); + gtk_widget_set_sensitive(airpcap_toolbar_label,TRUE); + gtk_widget_set_sensitive(airpcap_toolbar_channel,TRUE); + gtk_widget_set_sensitive(airpcap_toolbar_channel_lb,TRUE); + gtk_widget_set_sensitive(airpcap_toolbar_channel_offset,TRUE); + gtk_widget_set_sensitive(airpcap_toolbar_channel_offset_lb,TRUE); + gtk_widget_set_sensitive(airpcap_toolbar_fcs,FALSE); + gtk_widget_set_sensitive(airpcap_toolbar_fcs_lb,FALSE); + gtk_widget_set_sensitive(airpcap_toolbar_button,FALSE); + gtk_widget_set_sensitive(airpcap_toolbar_button,FALSE); + gtk_widget_set_sensitive(airpcap_toolbar_decryption,FALSE); + gtk_widget_set_sensitive(airpcap_toolbar_decryption_lb,FALSE); + gtk_widget_set_sensitive(airpcap_toolbar_keys_button,FALSE); + + /*decription check box*/ + gtk_signal_handler_block_by_func (GTK_OBJECT(airpcap_toolbar_decryption),GTK_SIGNAL_FUNC(airpcap_toolbar_encryption_cb), airpcap_tb); + if(if_info->DecryptionOn == AIRPCAP_DECRYPTION_ON) + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(airpcap_toolbar_decryption),TRUE); + else + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(airpcap_toolbar_decryption),FALSE); + gtk_signal_handler_unblock_by_func (GTK_OBJECT(airpcap_toolbar_decryption),GTK_SIGNAL_FUNC(airpcap_toolbar_encryption_cb), airpcap_tb); + + if_label_text = g_strdup_printf("Current Wireless Interface: #%s", airpcap_get_if_string_number(if_info)); + gtk_label_set_text(GTK_LABEL(airpcap_toolbar_label),if_label_text); + g_free(if_label_text); + + change_airpcap_settings = FALSE; + if (if_info->pSupportedChannels != NULL && if_info->numSupportedChannels > 0){ + guint i = 0; + GList *channel_list = NULL; + + for (; inumSupportedChannels; i++){ + channel_list = g_list_append(channel_list, airpcap_get_channelstr_from_freq(if_info->pSupportedChannels[i].Frequency)); + } + gtk_combo_set_popdown_strings( GTK_COMBO(airpcap_toolbar_channel), channel_list); + g_list_free(channel_list); + } + + airpcap_update_channel_combo(GTK_WIDGET(airpcap_toolbar_channel),if_info); + airpcap_update_channel_offset_cb(if_info, if_info->channelInfo.Frequency, airpcap_toolbar_channel_offset); + airpcap_update_channel_offset_combo_entry(airpcap_toolbar_channel_offset, if_info->channelInfo.ExtChannel); + change_airpcap_settings = TRUE; } else /* Current interface is NOT an AirPcap one... */ { - gtk_widget_set_sensitive(airpcap_tb,FALSE); - gtk_widget_set_sensitive(airpcap_toolbar_label,FALSE); - gtk_widget_set_sensitive(airpcap_toolbar_channel,FALSE); - gtk_widget_set_sensitive(airpcap_toolbar_channel_lb,FALSE); - gtk_widget_set_sensitive(airpcap_toolbar_fcs,FALSE); - gtk_widget_set_sensitive(airpcap_toolbar_fcs_lb,FALSE); - gtk_widget_set_sensitive(airpcap_toolbar_button,FALSE); - gtk_widget_set_sensitive(airpcap_toolbar_button,FALSE); - gtk_widget_set_sensitive(airpcap_toolbar_decryption,FALSE); - gtk_widget_set_sensitive(airpcap_toolbar_decryption_lb,FALSE); - gtk_widget_set_sensitive(airpcap_toolbar_keys_button,FALSE); - airpcap_set_toolbar_no_if(airpcap_tb); + gtk_widget_set_sensitive(airpcap_tb,FALSE); + gtk_widget_set_sensitive(airpcap_toolbar_label,FALSE); + gtk_widget_set_sensitive(airpcap_toolbar_channel,FALSE); + gtk_widget_set_sensitive(airpcap_toolbar_channel_lb,FALSE); + gtk_widget_set_sensitive(airpcap_toolbar_channel_offset,FALSE); + gtk_widget_set_sensitive(airpcap_toolbar_channel_offset_lb,FALSE); + gtk_widget_set_sensitive(airpcap_toolbar_fcs,FALSE); + gtk_widget_set_sensitive(airpcap_toolbar_fcs_lb,FALSE); + gtk_widget_set_sensitive(airpcap_toolbar_button,FALSE); + gtk_widget_set_sensitive(airpcap_toolbar_button,FALSE); + gtk_widget_set_sensitive(airpcap_toolbar_decryption,FALSE); + gtk_widget_set_sensitive(airpcap_toolbar_decryption_lb,FALSE); + gtk_widget_set_sensitive(airpcap_toolbar_keys_button,FALSE); + airpcap_set_toolbar_no_if(airpcap_tb); } } @@ -179,6 +206,8 @@ airpcap_set_toolbar_stop_capture(airpcap_if_info_t* if_info) GtkWidget *airpcap_toolbar_label; GtkWidget *airpcap_toolbar_channel; GtkWidget *airpcap_toolbar_channel_lb; + GtkWidget *airpcap_toolbar_channel_offset; + GtkWidget *airpcap_toolbar_channel_offset_lb; GtkWidget *airpcap_toolbar_button; GtkWidget *airpcap_toolbar_fcs; GtkWidget *airpcap_toolbar_fcs_lb; @@ -192,6 +221,8 @@ airpcap_set_toolbar_stop_capture(airpcap_if_info_t* if_info) airpcap_toolbar_label = OBJECT_GET_DATA(airpcap_tb,AIRPCAP_TOOLBAR_INTERFACE_KEY); airpcap_toolbar_channel = OBJECT_GET_DATA(airpcap_tb,AIRPCAP_TOOLBAR_CHANNEL_KEY); airpcap_toolbar_channel_lb = OBJECT_GET_DATA(airpcap_tb,AIRPCAP_TOOLBAR_CHANNEL_LABEL_KEY); + airpcap_toolbar_channel_offset = OBJECT_GET_DATA(airpcap_tb,AIRPCAP_TOOLBAR_CHANNEL_OFFSET_KEY); + airpcap_toolbar_channel_offset_lb = OBJECT_GET_DATA(airpcap_tb,AIRPCAP_TOOLBAR_CHANNEL_OFFSET_LABEL_KEY); airpcap_toolbar_fcs = OBJECT_GET_DATA(airpcap_tb,AIRPCAP_TOOLBAR_FCS_FILTER_KEY); airpcap_toolbar_fcs_lb = OBJECT_GET_DATA(airpcap_tb,AIRPCAP_TOOLBAR_FCS_FILTER_LABEL_KEY); airpcap_toolbar_button = OBJECT_GET_DATA(airpcap_tb,AIRPCAP_TOOLBAR_ADVANCED_KEY); @@ -202,47 +233,67 @@ airpcap_set_toolbar_stop_capture(airpcap_if_info_t* if_info) /* The current interface is an airpcap interface */ if(if_info != NULL) { - gtk_widget_set_sensitive(airpcap_tb,TRUE); - gtk_widget_set_sensitive(airpcap_toolbar_label,TRUE); - gtk_widget_set_sensitive(airpcap_toolbar_channel,TRUE); - gtk_widget_set_sensitive(airpcap_toolbar_channel_lb,TRUE); - gtk_widget_set_sensitive(airpcap_toolbar_fcs,TRUE); - gtk_widget_set_sensitive(airpcap_toolbar_fcs_lb,TRUE); - gtk_widget_set_sensitive(airpcap_toolbar_button,TRUE); - gtk_widget_set_sensitive(airpcap_toolbar_crc_filter_combo,TRUE); - gtk_widget_set_sensitive(airpcap_toolbar_decryption,TRUE); - gtk_widget_set_sensitive(airpcap_toolbar_decryption_lb,TRUE); - gtk_widget_set_sensitive(airpcap_toolbar_keys_button,TRUE); - airpcap_validation_type_combo_set_by_type(GTK_WIDGET(airpcap_toolbar_crc_filter_combo),if_info->CrcValidationOn); - airpcap_update_channel_combo(GTK_WIDGET(airpcap_toolbar_channel),if_info); - - /*decription check box*/ - gtk_signal_handler_block_by_func (GTK_OBJECT(airpcap_toolbar_decryption),GTK_SIGNAL_FUNC(airpcap_toolbar_encryption_cb), airpcap_tb); - if(if_info->DecryptionOn == AIRPCAP_DECRYPTION_ON) - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(airpcap_toolbar_decryption),TRUE); - else - gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(airpcap_toolbar_decryption),FALSE); - gtk_signal_handler_unblock_by_func (GTK_OBJECT(airpcap_toolbar_decryption),GTK_SIGNAL_FUNC(airpcap_toolbar_encryption_cb), airpcap_tb); - - - if_label_text = g_strdup_printf("Current Wireless Interface: #%s", airpcap_get_if_string_number(if_info)); - gtk_label_set_text(GTK_LABEL(airpcap_toolbar_label),if_label_text); - g_free(if_label_text); - } + gtk_widget_set_sensitive(airpcap_tb,TRUE); + gtk_widget_set_sensitive(airpcap_toolbar_label,TRUE); + gtk_widget_set_sensitive(airpcap_toolbar_channel,TRUE); + gtk_widget_set_sensitive(airpcap_toolbar_channel_lb,TRUE); + gtk_widget_set_sensitive(airpcap_toolbar_channel_offset,TRUE); + gtk_widget_set_sensitive(airpcap_toolbar_channel_offset_lb,TRUE); + gtk_widget_set_sensitive(airpcap_toolbar_fcs,TRUE); + gtk_widget_set_sensitive(airpcap_toolbar_fcs_lb,TRUE); + gtk_widget_set_sensitive(airpcap_toolbar_button,TRUE); + gtk_widget_set_sensitive(airpcap_toolbar_crc_filter_combo,TRUE); + gtk_widget_set_sensitive(airpcap_toolbar_decryption,TRUE); + gtk_widget_set_sensitive(airpcap_toolbar_decryption_lb,TRUE); + gtk_widget_set_sensitive(airpcap_toolbar_keys_button,TRUE); + airpcap_validation_type_combo_set_by_type(GTK_WIDGET(airpcap_toolbar_crc_filter_combo),if_info->CrcValidationOn); + + /*decription check box*/ + gtk_signal_handler_block_by_func (GTK_OBJECT(airpcap_toolbar_decryption),GTK_SIGNAL_FUNC(airpcap_toolbar_encryption_cb), airpcap_tb); + if(if_info->DecryptionOn == AIRPCAP_DECRYPTION_ON) + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(airpcap_toolbar_decryption),TRUE); + else + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(airpcap_toolbar_decryption),FALSE); + gtk_signal_handler_unblock_by_func (GTK_OBJECT(airpcap_toolbar_decryption),GTK_SIGNAL_FUNC(airpcap_toolbar_encryption_cb), airpcap_tb); + + if_label_text = g_strdup_printf("Current Wireless Interface: #%s", airpcap_get_if_string_number(if_info)); + gtk_label_set_text(GTK_LABEL(airpcap_toolbar_label),if_label_text); + g_free(if_label_text); + + change_airpcap_settings = FALSE; + if (if_info->pSupportedChannels != NULL && if_info->numSupportedChannels > 0){ + guint i = 0; + GList *channel_list = NULL; + + for (; inumSupportedChannels; i++){ + channel_list = g_list_append(channel_list, airpcap_get_channelstr_from_freq(if_info->pSupportedChannels[i].Frequency)); + } + gtk_combo_set_popdown_strings( GTK_COMBO(airpcap_toolbar_channel), channel_list); + g_list_free(channel_list); + } + + airpcap_update_channel_combo(GTK_WIDGET(airpcap_toolbar_channel),if_info); + airpcap_update_channel_offset_cb(if_info, if_info->channelInfo.Frequency, airpcap_toolbar_channel_offset); + airpcap_update_channel_offset_combo_entry(airpcap_toolbar_channel_offset, if_info->channelInfo.ExtChannel); + change_airpcap_settings = TRUE; + } else { - gtk_widget_set_sensitive(airpcap_tb,TRUE); - gtk_widget_set_sensitive(airpcap_toolbar_label,FALSE); - gtk_widget_set_sensitive(airpcap_toolbar_channel,FALSE); - gtk_widget_set_sensitive(airpcap_toolbar_channel_lb,FALSE); - gtk_widget_set_sensitive(airpcap_toolbar_fcs,FALSE); - gtk_widget_set_sensitive(airpcap_toolbar_fcs_lb,FALSE); - gtk_widget_set_sensitive(airpcap_toolbar_button,FALSE); - gtk_widget_set_sensitive(airpcap_toolbar_crc_filter_combo,FALSE); - gtk_widget_set_sensitive(airpcap_toolbar_decryption,TRUE); - gtk_widget_set_sensitive(airpcap_toolbar_decryption_lb,TRUE); - gtk_widget_set_sensitive(airpcap_toolbar_keys_button,TRUE); - airpcap_set_toolbar_no_if(airpcap_tb); + gtk_widget_set_sensitive(airpcap_tb,TRUE); + gtk_widget_set_sensitive(airpcap_toolbar_label,FALSE); + gtk_widget_set_sensitive(airpcap_toolbar_channel,FALSE); + gtk_widget_set_sensitive(airpcap_toolbar_channel_lb,FALSE); + gtk_widget_set_sensitive(airpcap_toolbar_channel_offset,FALSE); + gtk_widget_set_sensitive(airpcap_toolbar_channel_offset_lb,FALSE); + gtk_widget_set_sensitive(airpcap_toolbar_fcs,FALSE); + gtk_widget_set_sensitive(airpcap_toolbar_fcs_lb,FALSE); + gtk_widget_set_sensitive(airpcap_toolbar_button,FALSE); + gtk_widget_set_sensitive(airpcap_toolbar_crc_filter_combo,FALSE); + gtk_widget_set_sensitive(airpcap_toolbar_decryption,TRUE); + gtk_widget_set_sensitive(airpcap_toolbar_decryption_lb,TRUE); + gtk_widget_set_sensitive(airpcap_toolbar_keys_button,TRUE); + airpcap_set_toolbar_no_if(airpcap_tb); + change_airpcap_settings = FALSE; } } @@ -435,17 +486,14 @@ airpcap_get_validation_name(AirpcapValidationType vt) AirpcapLinkType airpcap_get_link_type(const gchar* name) { - if(!(g_strcasecmp(AIRPCAP_LINK_TYPE_NAME_802_11_ONLY,name))) - { - return AIRPCAP_LT_802_11; - } - else if(!(g_strcasecmp(AIRPCAP_LINK_TYPE_NAME_802_11_PLUS_RADIO,name))) - { - return AIRPCAP_LT_802_11_PLUS_RADIO; - } - else - { - return AIRPCAP_LT_UNKNOWN; + if(!(g_strcasecmp(AIRPCAP_LINK_TYPE_NAME_802_11_ONLY,name))){ + return AIRPCAP_LT_802_11; + }else if(!(g_strcasecmp(AIRPCAP_LINK_TYPE_NAME_802_11_PLUS_RADIO,name))){ + return AIRPCAP_LT_802_11_PLUS_RADIO; + }else if(!(g_strcasecmp(AIRPCAP_LINK_TYPE_NAME_802_11_PLUS_PPI,name))){ + return AIRPCAP_LT_802_11_PLUS_PPI; + }else{ + return AIRPCAP_LT_UNKNOWN; } } @@ -456,17 +504,14 @@ airpcap_get_link_type(const gchar* name) gchar* airpcap_get_link_name(AirpcapLinkType lt) { - if(lt == AIRPCAP_LT_802_11) - { - return AIRPCAP_LINK_TYPE_NAME_802_11_ONLY; - } - else if(lt == AIRPCAP_LT_802_11_PLUS_RADIO) - { - return AIRPCAP_LINK_TYPE_NAME_802_11_PLUS_RADIO; - } - else if(lt == AIRPCAP_LT_UNKNOWN) - { - return AIRPCAP_LINK_TYPE_NAME_UNKNOWN; + if(lt == AIRPCAP_LT_802_11){ + return AIRPCAP_LINK_TYPE_NAME_802_11_ONLY; + }else if(lt == AIRPCAP_LT_802_11_PLUS_RADIO){ + return AIRPCAP_LINK_TYPE_NAME_802_11_PLUS_RADIO; + }else if(lt == AIRPCAP_LT_802_11_PLUS_PPI){ + return AIRPCAP_LINK_TYPE_NAME_802_11_PLUS_PPI; + }else if(lt == AIRPCAP_LT_UNKNOWN){ + return AIRPCAP_LINK_TYPE_NAME_UNKNOWN; } return NULL; } @@ -524,16 +569,16 @@ airpcap_validation_type_combo_get_type(GtkWidget* c) /* * Retrieve the UINT corresponding to the given string (channel only, handle with care!) */ -UINT -airpcap_get_channel_number(const gchar* s) +ULONG +airpcap_get_frequency_from_str(const gchar* s) { - int ch_num; + ULONG ch_freq; - sscanf(s,"%d",&ch_num); + sscanf(s,"%ld",&ch_freq); /* XXX - check for ch_num btween 1-14, and return -1 otherwise??? */ - return ch_num; + return ch_freq; } /* @@ -549,9 +594,85 @@ airpcap_get_channel_name(UINT n) * Set the combo box entry string given an UINT channel number */ void -airpcap_channel_combo_set_by_number(GtkWidget* w,UINT channel) +airpcap_channel_combo_set_by_number(GtkWidget* w,UINT chan_freq) +{ + gchar *entry_text; + + entry_text = airpcap_get_channelstr_from_freq(chan_freq); + gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(w)->entry),airpcap_get_channelstr_from_freq(chan_freq)); + g_free(entry_text); +} + +/* + * Change channel of Airpcap Adapter + */ +gboolean +airpcap_update_frequency_and_offset(airpcap_if_info_t* if_info) { - gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(w)->entry),airpcap_get_channel_name(channel)); + gchar ebuf[AIRPCAP_ERRBUF_SIZE]; + PAirpcapHandle ad; + gboolean return_value = FALSE; + + if (if_info != NULL){ + ad = airpcap_if_open(if_info->name, ebuf); + + if(ad != NULL) { + return_value = airpcap_if_set_device_channel_ex(ad,if_info->channelInfo); + airpcap_if_close(ad); + } + } + + return return_value; +} + +/* + * Update the channel offset of the given combobox + */ +void +airpcap_update_channel_offset_cb(airpcap_if_info_t* if_info, ULONG ch_freq, GtkWidget *channel_offset_cb) +{ + const gchar *current_offset; + gchar current_offset_copy[10]; + gchar *new_offset_str; + ULONG chan_flags; + + if (airpcap_if_is_any(if_info)){ + gtk_widget_set_sensitive(GTK_WIDGET(channel_offset_cb),FALSE); + gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(channel_offset_cb)->entry), "0"); + return; + } + + current_offset = gtk_entry_get_text(GTK_ENTRY(GTK_COMBO(channel_offset_cb)->entry)); + strcpy (current_offset_copy, current_offset); + chan_flags = airpcap_load_channel_offset_cb(if_info, channel_offset_cb, ch_freq); + + new_offset_str = current_offset_copy; + + /* If current_offset == -1 && new_offset cannot be -1 */ + if (strcmp(current_offset_copy, "-1") == 0 && !(chan_flags & FLAG_CAN_BE_HIGH)){ + if ((chan_flags & FLAG_CAN_BE_LOW)){ + new_offset_str = "+1"; + }else{ + new_offset_str = "0"; + } + }else if (strcmp(current_offset_copy, "+1") == 0 && !(chan_flags & FLAG_CAN_BE_LOW)){ + if ((chan_flags & FLAG_CAN_BE_HIGH)){ + new_offset_str = "-1"; + }else{ + new_offset_str = "0"; + } + } + + change_airpcap_settings = FALSE; + gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(channel_offset_cb)->entry), new_offset_str); + change_airpcap_settings = TRUE; + + sscanf(new_offset_str,"%d",&(if_info->channelInfo.ExtChannel)); + if (!airpcap_update_frequency_and_offset(if_info)){ + simple_dialog(ESD_TYPE_ERROR,ESD_BTN_OK,"Adapter failed to be set with the following settings: Frequency - %ld Extension Channel - %d", if_info->channelInfo.Frequency, if_info->channelInfo.ExtChannel); + } + + g_free(new_offset_str); } /* @@ -572,22 +693,72 @@ airpcap_if_is_any(airpcap_if_info_t* if_info) void airpcap_update_channel_combo(GtkWidget* w, airpcap_if_info_t* if_info) { -gchar* channels_list; + gchar* frequency_list; if(airpcap_if_is_any(if_info)) { - channels_list = airpcap_get_all_channels_list(if_info); - gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(w)->entry),channels_list); - g_free(channels_list); - gtk_widget_set_sensitive(GTK_WIDGET(w),FALSE); + frequency_list = airpcap_get_all_channels_list(if_info); + gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(w)->entry),frequency_list); + g_free(frequency_list); + change_airpcap_settings = FALSE; + gtk_widget_set_sensitive(GTK_WIDGET(w),FALSE); } else { - airpcap_channel_combo_set_by_number(w,if_info->channel); - gtk_widget_set_sensitive(GTK_WIDGET(w),TRUE); + airpcap_channel_combo_set_by_number(w,if_info->channelInfo.Frequency); + change_airpcap_settings = TRUE; + gtk_widget_set_sensitive(GTK_WIDGET(w),TRUE); } } +/* + * Update channel offset combo box to 'offset'. + */ +void +airpcap_update_channel_offset_combo_entry(GtkWidget* w, gchar extChannel) +{ + gchar channel_offset_value[3]; + + if (extChannel > 0){ + sprintf(channel_offset_value, "+%d", extChannel); + }else{ + sprintf(channel_offset_value, "%d", extChannel); + } + + gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(w)->entry), channel_offset_value); +} + +/* + * Update channel offset combo box given the selected frequency. Return the flags from the given frequency. + */ +ULONG +airpcap_load_channel_offset_cb(airpcap_if_info_t* if_info, GtkWidget* channel_offset_cb, ULONG chan_freq) +{ + GList *channel_offset_list = NULL; + + if (if_info != NULL && if_info->pSupportedChannels != NULL && if_info->numSupportedChannels > 0){ + guint i = 0; + + for (; inumSupportedChannels; i++){ + if (if_info->pSupportedChannels[i].Frequency == chan_freq){ + if ((if_info->pSupportedChannels[i].Flags & FLAG_CAN_BE_HIGH)){ + channel_offset_list = g_list_append(channel_offset_list, "-1"); + } + channel_offset_list = g_list_append(channel_offset_list, "0"); + if ((if_info->pSupportedChannels[i].Flags & FLAG_CAN_BE_LOW)){ + channel_offset_list = g_list_append(channel_offset_list, "+1"); + } + gtk_combo_set_popdown_strings( GTK_COMBO(channel_offset_cb), channel_offset_list) ; + gtk_widget_set_sensitive(channel_offset_cb, g_list_length(channel_offset_list) > 1); + g_list_free(channel_offset_list); + return if_info->pSupportedChannels[i].Flags; + } + } + } + + return NULL; +} + /* * Takes the keys from the GtkList widget, and add them to the interface list */ @@ -1026,6 +1197,8 @@ airpcap_enable_toolbar_widgets(GtkWidget* w, gboolean en) *if_description_lb, *channel_cb, *channel_lb, + *channel_offset_cb, + *channel_offset_lb, *fcs_cb, *fcs_lb, *advanced_bt; @@ -1038,6 +1211,8 @@ airpcap_enable_toolbar_widgets(GtkWidget* w, gboolean en) if_description_lb = OBJECT_GET_DATA(toolbar_tb,AIRPCAP_TOOLBAR_INTERFACE_KEY); channel_lb = OBJECT_GET_DATA(toolbar_tb,AIRPCAP_TOOLBAR_CHANNEL_LABEL_KEY); channel_cb = OBJECT_GET_DATA(toolbar_tb,AIRPCAP_TOOLBAR_CHANNEL_KEY); + channel_offset_cb = OBJECT_GET_DATA(toolbar_tb,AIRPCAP_TOOLBAR_CHANNEL_OFFSET_KEY); + channel_offset_lb = OBJECT_GET_DATA(toolbar_tb,AIRPCAP_TOOLBAR_CHANNEL_OFFSET_LABEL_KEY); fcs_lb = OBJECT_GET_DATA(toolbar_tb,AIRPCAP_TOOLBAR_FCS_FILTER_LABEL_KEY); fcs_cb = OBJECT_GET_DATA(toolbar_tb,AIRPCAP_TOOLBAR_FCS_FILTER_KEY); advanced_bt = OBJECT_GET_DATA(toolbar_tb,AIRPCAP_TOOLBAR_ADVANCED_KEY); @@ -1046,6 +1221,8 @@ airpcap_enable_toolbar_widgets(GtkWidget* w, gboolean en) if(if_description_lb != NULL) gtk_widget_set_sensitive(if_description_lb,en); if(channel_lb != NULL) gtk_widget_set_sensitive(channel_lb,en); if(channel_cb != NULL) gtk_widget_set_sensitive(channel_cb,en); + if(channel_offset_cb != NULL) gtk_widget_set_sensitive(channel_offset_cb,en); + if(channel_offset_lb != NULL) gtk_widget_set_sensitive(channel_offset_lb,en); if(fcs_lb != NULL) gtk_widget_set_sensitive(fcs_lb,en); if(fcs_cb != NULL) gtk_widget_set_sensitive(fcs_cb,en); if(advanced_bt != NULL) gtk_widget_set_sensitive(advanced_bt,en); @@ -1064,6 +1241,8 @@ airpcap_set_toolbar_no_if(GtkWidget* w) *if_description_lb, *channel_cb, *channel_lb, + *channel_offset_cb, + *channel_offset_lb, *fcs_cb, *fcs_lb, *advanced_bt; @@ -1073,15 +1252,18 @@ airpcap_set_toolbar_no_if(GtkWidget* w) toolbar_tb = w; - if_description_lb = OBJECT_GET_DATA(toolbar_tb,AIRPCAP_TOOLBAR_INTERFACE_KEY); - channel_lb = OBJECT_GET_DATA(toolbar_tb,AIRPCAP_TOOLBAR_CHANNEL_LABEL_KEY); - channel_cb = OBJECT_GET_DATA(toolbar_tb,AIRPCAP_TOOLBAR_CHANNEL_KEY); - fcs_lb = OBJECT_GET_DATA(toolbar_tb,AIRPCAP_TOOLBAR_FCS_FILTER_LABEL_KEY); - fcs_cb = OBJECT_GET_DATA(toolbar_tb,AIRPCAP_TOOLBAR_FCS_FILTER_KEY); - advanced_bt = OBJECT_GET_DATA(toolbar_tb,AIRPCAP_TOOLBAR_ADVANCED_KEY); + if_description_lb = OBJECT_GET_DATA(toolbar_tb,AIRPCAP_TOOLBAR_INTERFACE_KEY); + channel_lb = OBJECT_GET_DATA(toolbar_tb,AIRPCAP_TOOLBAR_CHANNEL_LABEL_KEY); + channel_cb = OBJECT_GET_DATA(toolbar_tb,AIRPCAP_TOOLBAR_CHANNEL_KEY); + channel_offset_lb = OBJECT_GET_DATA(toolbar_tb,AIRPCAP_TOOLBAR_CHANNEL_OFFSET_LABEL_KEY); + channel_offset_cb = OBJECT_GET_DATA(toolbar_tb,AIRPCAP_TOOLBAR_CHANNEL_OFFSET_KEY); + fcs_lb = OBJECT_GET_DATA(toolbar_tb,AIRPCAP_TOOLBAR_FCS_FILTER_LABEL_KEY); + fcs_cb = OBJECT_GET_DATA(toolbar_tb,AIRPCAP_TOOLBAR_FCS_FILTER_KEY); + advanced_bt = OBJECT_GET_DATA(toolbar_tb,AIRPCAP_TOOLBAR_ADVANCED_KEY); if(fcs_cb != NULL) gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(fcs_cb)->entry),""); if(channel_cb != NULL) gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(channel_cb)->entry),""); + if(channel_offset_cb != NULL) gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(channel_offset_cb)->entry),""); if(if_description_lb != NULL) gtk_label_set_text(GTK_LABEL(if_description_lb),"Current Wireless Interface: None"); /*if(if_description_lb != NULL) gtk_widget_set_sensitive(if_description_lb,FALSE); diff --git a/gtk/airpcap_gui_utils.h b/gtk/airpcap_gui_utils.h index d4e4e7c604..5139de8941 100644 --- a/gtk/airpcap_gui_utils.h +++ b/gtk/airpcap_gui_utils.h @@ -35,7 +35,8 @@ #define AIRPCAP_LINK_TYPE_NAME_802_11_ONLY "802.11 Only" #define AIRPCAP_LINK_TYPE_NAME_802_11_PLUS_RADIO "802.11 + Radio" -#define AIRPCAP_LINK_TYPE_NAME_UNKNOWN "Unknown" +#define AIRPCAP_LINK_TYPE_NAME_UNKNOWN "Unknown" +#define AIRPCAP_LINK_TYPE_NAME_802_11_PLUS_PPI "802.11 + PPI" #define AIRPCAP_DECRYPTION_TYPE_STRING_WIRESHARK "Wireshark" #define AIRPCAP_DECRYPTION_TYPE_STRING_AIRPCAP "Driver" @@ -44,6 +45,9 @@ #define NO_ROW_SELECTED -1 #define NO_COLUMN_SELECTED -1 +/* Controls the releay of settings back to the adapter. */ +extern gboolean change_airpcap_settings; + /* * This structure is used because we need to store infos about the currently selected * row in the key list. @@ -146,11 +150,17 @@ airpcap_validation_type_combo_set_by_type(GtkWidget* c,AirpcapValidationType typ AirpcapValidationType airpcap_validation_type_combo_get_type(GtkWidget* c); +/* + * Update channel offset combo box to 'offset'. + */ +void +airpcap_update_channel_offset_combo_entry(GtkWidget* w, gchar extChannel); + /* * Returns the string corresponding to the given UINT (1-14, for channel only) */ -UINT -airpcap_get_channel_number(const gchar* s); +ULONG +airpcap_get_frequency_from_str(const gchar* s); /* * Retrieve the UINT corresponding to the given string (channel only, handle with care!) @@ -170,6 +180,12 @@ airpcap_channel_combo_set_by_number(GtkWidget* w,UINT channel); int airpcap_if_is_any(airpcap_if_info_t* if_info); +/* + * Change channel of Airpcap Adapter + */ +gboolean +airpcap_update_frequency_and_offset(airpcap_if_info_t* if_info); + /* * Takes the keys from the GtkList widget, and add them to the interface list */ @@ -182,6 +198,18 @@ airpcap_add_keys_from_list(GtkWidget *w, airpcap_if_info_t *if_info); void airpcap_update_channel_combo(GtkWidget* w, airpcap_if_info_t* if_info); +/* + * Update the channel offset of the given combobox + */ +void +airpcap_update_channel_offset_cb(airpcap_if_info_t* if_info, ULONG ch_freq, GtkWidget *channel_offset_cb); + +/* + * Update channel offset combo box given the selected frequency. Return the flags from the given frequency. + */ +ULONG +airpcap_load_channel_offset_cb(airpcap_if_info_t* if_info, GtkWidget* channel_offset_cb, ULONG chan_freq); + /* * This function will take the current keys (widget list), specified for the * current adapter, and save them as default for ALL the others. diff --git a/gtk/capture_dlg.c b/gtk/capture_dlg.c index 656340866d..4420dbeab2 100644 --- a/gtk/capture_dlg.c +++ b/gtk/capture_dlg.c @@ -207,7 +207,7 @@ set_link_type_list(GtkWidget *linktype_om, GtkWidget *entry) /* is it an airpcap interface??? */ /* retrieve the advanced button pointer */ advanced_bt = OBJECT_GET_DATA(entry,AIRPCAP_OPTIONS_ADVANCED_KEY); - airpcap_if_selected = get_airpcap_if_by_name(airpcap_if_list,if_name); + airpcap_if_selected = get_airpcap_if_from_name(airpcap_if_list,if_name); airpcap_enable_toolbar_widgets(airpcap_tb,FALSE); if( airpcap_if_selected != NULL) { @@ -582,9 +582,11 @@ capture_prep_cb(GtkWidget *w _U_, gpointer d _U_) *m_resolv_cb, *n_resolv_cb, *t_resolv_cb, *bbox, *ok_bt, *cancel_bt, *help_bt; +#if GTK_MAJOR_VERSION >= 2 /* For some reason this button's action crashes under GTK 1. */ #ifdef HAVE_AIRPCAP GtkWidget *advanced_hb, *advanced_bt; #endif +#endif #if GTK_MAJOR_VERSION < 2 GtkAccelGroup *accel_group; #endif @@ -700,7 +702,7 @@ capture_prep_cb(GtkWidget *w _U_, gpointer d _U_) #ifdef HAVE_AIRPCAP /* get the airpcap interface (if it IS an airpcap interface, and update the toolbar... and of course enable the advanced button...)*/ - airpcap_if_selected = get_airpcap_if_by_name(airpcap_if_list,capture_opts->iface); + airpcap_if_selected = get_airpcap_if_from_name(airpcap_if_list,capture_opts->iface); #endif if (capture_opts->iface != NULL) { @@ -872,6 +874,7 @@ capture_prep_cb(GtkWidget *w _U_, gpointer d _U_) OBJECT_SET_DATA(filter_bt, E_FILT_TE_PTR_KEY, filter_te); /* advanced row */ +#if GTK_MAJOR_VERSION >= 2 /* For some reason this button's action crashes under GTK 1. */ #ifdef HAVE_AIRPCAP advanced_hb = gtk_hbox_new(FALSE,5); gtk_box_pack_start(GTK_BOX(capture_vb), advanced_hb, FALSE, FALSE, 0); @@ -904,6 +907,7 @@ capture_prep_cb(GtkWidget *w _U_, gpointer d _U_) gtk_box_pack_start(GTK_BOX(linktype_hb),advanced_bt,FALSE,FALSE,0); gtk_widget_show(advanced_bt); gtk_widget_show(advanced_hb); +#endif #endif /* Capture file-related options frame */ diff --git a/gtk/capture_if_dlg.c b/gtk/capture_if_dlg.c index ef5483ac8f..35c59d5a19 100644 --- a/gtk/capture_if_dlg.c +++ b/gtk/capture_if_dlg.c @@ -120,6 +120,7 @@ typedef struct if_dlg_data_s { #endif guint32 last_packets; gchar *device; + if_info_t if_info; } if_dlg_data_t; void update_if(if_dlg_data_t *if_dlg_data); @@ -132,7 +133,7 @@ capture_do_cb(GtkWidget *capture_bt _U_, gpointer if_data) if_dlg_data_t *if_dlg_data = if_data; #ifdef HAVE_AIRPCAP - airpcap_if_active = get_airpcap_if_from_description(airpcap_if_list, GTK_LABEL(if_dlg_data->descr_lb)->label); + airpcap_if_active = get_airpcap_if_from_name(airpcap_if_list, if_dlg_data->if_info.name); airpcap_if_selected = airpcap_if_active; #endif @@ -390,6 +391,17 @@ combo_channel_new(void) return channel_cb; } +/* + * Sorts the Interface List in alphabetical order + */ +int if_list_comparator_alph (const if_info_t *first, const if_info_t *second){ + if(first != NULL && first->description != NULL && second != NULL && second->description != NULL){ + return g_strcasecmp(first->description, second->description); + } else { + return 0; + } +} + /* start getting capture stats from all interfaces */ void capture_if_cb(GtkWidget *w _U_, gpointer d _U_) @@ -444,6 +456,7 @@ capture_if_cb(GtkWidget *w _U_, gpointer d _U_) /* LOAD THE INTERFACES */ if_list = get_interface_list(&err, &err_str); + if_list = g_list_sort (if_list, if_list_comparator_alph); if (if_list == NULL && err == CANT_GET_INTERFACE_LIST) { simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err_str); g_free(err_str); @@ -460,7 +473,7 @@ capture_if_cb(GtkWidget *w _U_, gpointer d _U_) update_decryption_mode_list(decryption_cm); if (airpcap_if_list == NULL && err == CANT_GET_AIRPCAP_INTERFACE_LIST) { - simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err_str); + /* simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err_str); /* XXX - Do we need to show an error here? */ g_free(err_str); } @@ -552,10 +565,11 @@ capture_if_cb(GtkWidget *w _U_, gpointer d _U_) g_string_assign(if_tool_str, ""); if_info = curr->data; if_dlg_data = g_malloc0(sizeof(if_dlg_data_t)); + if_dlg_data->if_info = *if_info; /* Kind of adaptor (icon) */ #ifdef HAVE_AIRPCAP - if(get_airpcap_if_from_description(airpcap_if_list,if_info->description) != NULL) + if(get_airpcap_if_from_name(airpcap_if_list,if_info->name) != NULL) icon = xpm_to_widget(capture_airpcap_16_xpm); else icon = xpm_to_widget(capture_ethernet_16_xpm); diff --git a/gtk/keys.h b/gtk/keys.h index 23dfd554ff..ebc25bb663 100644 --- a/gtk/keys.h +++ b/gtk/keys.h @@ -53,6 +53,8 @@ #define AIRPCAP_TOOLBAR_LINK_TYPE_KEY "airpcap_toolbar_lt_key" #define AIRPCAP_TOOLBAR_CHANNEL_KEY "airpcap_toolbar_ch_key" #define AIRPCAP_TOOLBAR_CHANNEL_LABEL_KEY "airpcap_toolbar_ch_lb_key" +#define AIRPCAP_TOOLBAR_CHANNEL_OFFSET_KEY "airpcap_toolbar_ch_offset_key" +#define AIRPCAP_TOOLBAR_CHANNEL_OFFSET_LABEL_KEY "airpcap_toolbar_ch_offset_lb_key" #define AIRPCAP_TOOLBAR_FCS_CHECK_KEY "airpcap_toolbar_fcs_check_key" #define AIRPCAP_TOOLBAR_FCS_FILTER_LABEL_KEY "airpcap_toolbar_fcs_filter_lb_key" #define AIRPCAP_TOOLBAR_FCS_FILTER_KEY "airpcap_toolbar_fcs_filter_key" diff --git a/gtk/main.c b/gtk/main.c index c395ce6f90..ff1bfdec17 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -2184,14 +2184,19 @@ main(int argc, char *argv[]) /* load the airpcap interfaces */ airpcap_if_list = get_airpcap_interface_list(&err, &err_str); - if (airpcap_if_list == NULL && err == CANT_GET_AIRPCAP_INTERFACE_LIST) { - simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err_str); - g_free(err_str); - } - /* select the first ad default (THIS SHOULD BE CHANGED) */ - airpcap_if_active = airpcap_get_default_if(airpcap_if_list); - break; + if (airpcap_if_list == NULL || g_list_length(airpcap_if_list) == 0){ + if (err == CANT_GET_AIRPCAP_INTERFACE_LIST && err_str != NULL) { + simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", "Failed to open Airpcap Adapters!"); + g_free(err_str); + } + airpcap_if_active = NULL; + + } else { + /* select the first ad default (THIS SHOULD BE CHANGED) */ + airpcap_if_active = airpcap_get_default_if(airpcap_if_list); + } + break; #if 0 /* * XXX - Maybe we need to warn the user if one of the following happens??? @@ -4106,30 +4111,48 @@ window_state_event_cb (GtkWidget *widget _U_, static void airpcap_toolbar_channel_changed_cb(GtkWidget *w _U_, gpointer data) { - gchar ebuf[AIRPCAP_ERRBUF_SIZE]; - PAirpcapHandle ad; const gchar *s; - int ch_num; - - s = gtk_entry_get_text(GTK_ENTRY(data)); + ULONG ch_freq; - if ((data != NULL) && (w != NULL) ) { - s = gtk_entry_get_text(GTK_ENTRY(data)); + if ((data != NULL) && (w != NULL) && change_airpcap_settings) { + s = gtk_entry_get_text(GTK_ENTRY(w)); if ((g_strcasecmp("",s))) { - sscanf(s,"%d",&ch_num); + ch_freq = airpcap_get_frequency_from_str(s); if (airpcap_if_active != NULL) { - ad = airpcap_if_open(get_airpcap_name_from_description(airpcap_if_list, airpcap_if_active->description), ebuf); - - if(ad) { - airpcap_if_set_device_channel(ad,ch_num); - airpcap_if_active->channel = ch_num; - airpcap_if_close(ad); - } + airpcap_if_active->channelInfo.Frequency = ch_freq; + airpcap_update_channel_offset_cb(airpcap_if_active, ch_freq, GTK_WIDGET(data)); } } } } +/* + * Changed callback for the channel offset combobox + */ +static void +on_channel_offset_cb_changed(GtkWidget *w _U_, gpointer data) +{ + const gchar *s; + gchar offset; + + if ((data != NULL) && (w != NULL) && change_airpcap_settings) + { + s = gtk_entry_get_text(GTK_ENTRY(w)); + if ((g_strcasecmp("",s))) + { + if (airpcap_if_active != NULL) + { + sscanf(s,"%d",&offset); + airpcap_if_active->channelInfo.ExtChannel = offset; + if (change_airpcap_settings != NULL) + { + airpcap_update_frequency_and_offset(airpcap_if_active); + } + } + } + } +} + /* * Callback for the wrong crc combo */ @@ -4140,15 +4163,13 @@ airpcap_toolbar_wrong_crc_combo_cb(GtkWidget *entry, gpointer user_data) PAirpcapHandle ad; if( !block_toolbar_signals && (airpcap_if_active != NULL)) { - ad = airpcap_if_open(get_airpcap_name_from_description(airpcap_if_list,airpcap_if_active->description), ebuf); + ad = airpcap_if_open(airpcap_if_active->name, ebuf); if (ad) { airpcap_if_active->CrcValidationOn = airpcap_get_validation_type(gtk_entry_get_text(GTK_ENTRY(entry))); airpcap_if_set_fcs_validation(ad,airpcap_if_active->CrcValidationOn); /* Save configuration */ - if(!airpcap_if_store_cur_config_as_adapter_default(ad)) { - simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "Cannot save configuration!!!\nRemember that in order to store the configuration in the registry you have to:\n\n- Close all the airpcap-based applications.\n- Be sure to have administrative privileges."); - } + airpcap_if_store_cur_config_as_adapter_default(ad); airpcap_if_close(ad); } } @@ -4167,7 +4188,7 @@ airpcap_toolbar_encryption_cb(GtkWidget *entry, gpointer user_data) /* Apply changes to the current adapter */ if( (airpcap_if_active != NULL)) { - ad = airpcap_if_open(get_airpcap_name_from_description(airpcap_if_list,airpcap_if_active->description), ebuf); + ad = airpcap_if_open(airpcap_if_active->name, ebuf); if(ad) { if(airpcap_if_active->DecryptionOn == AIRPCAP_DECRYPTION_ON) { @@ -4193,6 +4214,7 @@ airpcap_toolbar_encryption_cb(GtkWidget *entry, gpointer user_data) return; } + if (!(airpcap_if_list == NULL)){ n = g_list_length(airpcap_if_list); /* The same kind of settings should be propagated to all the adapters */ @@ -4201,18 +4223,22 @@ airpcap_toolbar_encryption_cb(GtkWidget *entry, gpointer user_data) curr_if = (airpcap_if_info_t*)g_list_nth_data(airpcap_if_list,i); if( (curr_if != NULL) && (curr_if != airpcap_if_selected) ) { - ad = airpcap_if_open(get_airpcap_name_from_description(airpcap_if_list,curr_if->description), ebuf); + ad = airpcap_if_open(curr_if->name, ebuf); if(ad) { curr_if->DecryptionOn = airpcap_if_selected->DecryptionOn; airpcap_if_set_decryption_state(ad,curr_if->DecryptionOn); /* Save configuration for the curr_if */ if(!airpcap_if_store_cur_config_as_adapter_default(ad)) { simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "Cannot save configuration!!!\nRemember that in order to store the configuration in the registry you have to:\n\n- Close all the airpcap-based applications.\n- Be sure to have administrative privileges."); - } + } airpcap_if_close(ad); } } } + } else { + simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "AirPcap Adapter Error!"); + return; + } } /* @@ -4289,13 +4315,16 @@ create_main_window (gint pl_size, gint tv_size, gint bv_size, e_prefs *prefs) gchar *title; #ifdef HAVE_AIRPCAP - GtkWidget *advanced_bt, - *key_management_bt, - *interface_lb, - *channel_lb, - *channel_cm, - *wrong_crc_lb, - *wrong_crc_cm; + GtkWidget *key_management_bt = NULL, +#if GTK_MAJOR_VERSION >= 2 /* For some reason this button's action crashes under GTK 1. */ + *advanced_bt = NULL, +#endif + *channel_lb = NULL, + *channel_cm = NULL, + *channel_offset_lb = NULL, + *channel_offset_cb = NULL, + *wrong_crc_lb = NULL, + *wrong_crc_cm = NULL; GtkWidget *enable_decryption_lb; GtkWidget *enable_decryption_cb; @@ -4306,7 +4335,7 @@ create_main_window (gint pl_size, gint tv_size, gint bv_size, e_prefs *prefs) GList *linktype_list = NULL; GList *link_list = NULL; GtkTooltips *airpcap_tooltips; - gchar *if_label_text; + /* gchar *if_label_text; */ gint *from_widget = NULL; #endif @@ -4421,72 +4450,100 @@ create_main_window (gint pl_size, gint tv_size, gint bv_size, e_prefs *prefs) gtk_widget_show(airpcap_tb); /* Interface Label */ - if(airpcap_if_active != NULL) { + /*if(airpcap_if_active != NULL) { if_label_text = g_strdup_printf("%s %s\t","Current Wireless Interface: #",airpcap_get_if_string_number(airpcap_if_active)); interface_lb = gtk_label_new(if_label_text); g_free(if_label_text); } else { interface_lb = gtk_label_new("No Wireless Interface Found "); - } + }*/ /* Add the label to the toolbar */ - gtk_toolbar_append_widget(GTK_TOOLBAR(airpcap_tb), interface_lb, + /*gtk_toolbar_append_widget(GTK_TOOLBAR(airpcap_tb), interface_lb, "Current Wireless Interface", "Private"); OBJECT_SET_DATA(airpcap_tb,AIRPCAP_TOOLBAR_INTERFACE_KEY,interface_lb); gtk_widget_show(interface_lb); - gtk_toolbar_insert_space(GTK_TOOLBAR(airpcap_tb),1); + gtk_toolbar_insert_space(GTK_TOOLBAR(airpcap_tb),1);*/ /* Create the "802.11 Channel:" label */ - channel_lb = gtk_label_new(" 802.11 Channel: "); + channel_lb = gtk_label_new("802.11 Channel: "); OBJECT_SET_DATA(airpcap_tb,AIRPCAP_TOOLBAR_CHANNEL_LABEL_KEY,channel_lb); gtk_toolbar_append_widget(GTK_TOOLBAR(airpcap_tb), channel_lb, "Current 802.11 Channel", "Private"); gtk_widget_show(channel_lb); - WIDGET_SET_SIZE(channel_lb, 100, 28); + WIDGET_SET_SIZE(channel_lb, 85, 28); /* Create the channel combo box */ channel_cm = gtk_combo_new(); gtk_editable_set_editable(GTK_EDITABLE(GTK_COMBO(channel_cm)->entry),FALSE); OBJECT_SET_DATA(airpcap_tb,AIRPCAP_TOOLBAR_CHANNEL_KEY,channel_cm); - channel_list = g_list_append(channel_list, "1 (2412MHz)"); - channel_list = g_list_append(channel_list, "2 (2417MHz)"); - channel_list = g_list_append(channel_list, "3 (2422MHz)"); - channel_list = g_list_append(channel_list, "4 (2427MHz)"); - channel_list = g_list_append(channel_list, "5 (2432MHz)"); - channel_list = g_list_append(channel_list, "6 (2437MHz)"); - channel_list = g_list_append(channel_list, "7 (2442MHz)"); - channel_list = g_list_append(channel_list, "8 (2447MHz)"); - channel_list = g_list_append(channel_list, "9 (2452MHz)"); - channel_list = g_list_append(channel_list, "10 (2457MHz)"); - channel_list = g_list_append(channel_list, "11 (2462MHz)"); - channel_list = g_list_append(channel_list, "12 (2467MHz)"); - channel_list = g_list_append(channel_list, "13 (2472MHz)"); - channel_list = g_list_append(channel_list, "14 (2484MHz)"); - - gtk_combo_set_popdown_strings( GTK_COMBO(channel_cm), channel_list) ; + if (airpcap_if_active != NULL && airpcap_if_active->pSupportedChannels != NULL && airpcap_if_active->numSupportedChannels > 0){ + guint i = 0; + for (; inumSupportedChannels; i++){ + channel_list = g_list_append(channel_list, airpcap_get_channelstr_from_freq(airpcap_if_active->pSupportedChannels[i].Frequency)); + } + gtk_combo_set_popdown_strings( GTK_COMBO(channel_cm), channel_list) ; + } gtk_tooltips_set_tip(airpcap_tooltips, GTK_WIDGET(GTK_COMBO(channel_cm)->entry), "Change the 802.11 RF channel", NULL); - WIDGET_SET_SIZE(channel_cm, 100, 28); + WIDGET_SET_SIZE(channel_cm, 120, 28); - if(airpcap_if_active != NULL) - gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(channel_cm)->entry), airpcap_get_channel_name(airpcap_if_active->channel)); - else + if(airpcap_if_active != NULL) + gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(channel_cm)->entry), airpcap_get_channelstr_from_freq(airpcap_if_active->channelInfo.Frequency)); + else gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(channel_cm)->entry),""); - /* callback for channel combo box */ - SIGNAL_CONNECT(GTK_COMBO(channel_cm)->entry,"changed",airpcap_toolbar_channel_changed_cb,GTK_COMBO(channel_cm)->entry); gtk_widget_show(channel_cm); gtk_toolbar_append_widget(GTK_TOOLBAR(airpcap_tb), channel_cm, "802.11 Channel", "Private"); + /* gtk_toolbar_append_space(GTK_TOOLBAR(airpcap_tb)); */ + + /* Create the "Channel Offset:" label */ + channel_offset_lb = gtk_label_new("Channel Offset: "); + OBJECT_SET_DATA(airpcap_tb,AIRPCAP_TOOLBAR_CHANNEL_OFFSET_LABEL_KEY,channel_offset_lb); + gtk_toolbar_append_widget(GTK_TOOLBAR(airpcap_tb), channel_offset_lb, + "Current 802.11 Channel Offset", "Private"); + gtk_widget_show(channel_offset_lb); + + WIDGET_SET_SIZE(channel_offset_lb, 80, 28); + + /* Start: Channel offset combo box */ + channel_offset_cb = gtk_combo_new(); + gtk_editable_set_editable(GTK_EDITABLE(GTK_COMBO(channel_offset_cb)->entry),FALSE); + OBJECT_SET_DATA(airpcap_tb, AIRPCAP_TOOLBAR_CHANNEL_OFFSET_KEY, channel_offset_cb); + + if(airpcap_if_active != NULL){ + airpcap_update_channel_offset_cb(airpcap_if_active, airpcap_if_active->channelInfo.Frequency, channel_offset_cb); + airpcap_update_channel_offset_combo_entry(channel_offset_cb, airpcap_if_active->channelInfo.ExtChannel); + } else { + gtk_entry_set_text(GTK_ENTRY(GTK_COMBO(channel_offset_cb)->entry),""); + } + + gtk_tooltips_set_tip(airpcap_tooltips, GTK_WIDGET(GTK_COMBO(channel_offset_cb)->entry), + "Change channel offset", NULL); + + WIDGET_SET_SIZE(channel_offset_cb, 50, 28); + + gtk_widget_show(channel_offset_cb); + + gtk_toolbar_append_widget(GTK_TOOLBAR(airpcap_tb), channel_offset_cb, + "802.11 Channel Offset", "Private"); + gtk_toolbar_append_space(GTK_TOOLBAR(airpcap_tb)); + /* callback for channel combo box */ + SIGNAL_CONNECT(GTK_COMBO(channel_cm)->entry,"changed", airpcap_toolbar_channel_changed_cb, channel_offset_cb); + /* callback for channel offset combo box */ + SIGNAL_CONNECT(GTK_COMBO(channel_offset_cb)->entry,"changed", on_channel_offset_cb_changed, channel_offset_cb); + /* End: Channel offset combo box */ + /* Wrong CRC Label */ wrong_crc_lb = gtk_label_new(" FCS Filter: "); OBJECT_SET_DATA(airpcap_tb,AIRPCAP_TOOLBAR_FCS_FILTER_LABEL_KEY,wrong_crc_lb); @@ -4552,6 +4609,7 @@ create_main_window (gint pl_size, gint tv_size, gint bv_size, e_prefs *prefs) gtk_toolbar_append_space(GTK_TOOLBAR(airpcap_tb)); +#if GTK_MAJOR_VERSION >= 2 /* For some reason this button's action crashes under GTK 1. */ /* Advanced button */ advanced_bt = gtk_button_new_with_label("Wireless Settings..."); OBJECT_SET_DATA(airpcap_tb,AIRPCAP_TOOLBAR_ADVANCED_KEY,advanced_bt); @@ -4559,7 +4617,10 @@ create_main_window (gint pl_size, gint tv_size, gint bv_size, e_prefs *prefs) SIGNAL_CONNECT(advanced_bt, "clicked", toolbar_display_airpcap_advanced_cb, airpcap_tb); gtk_toolbar_append_widget(GTK_TOOLBAR(airpcap_tb), advanced_bt, "Set Advanced Wireless Settings", "Private"); + + gtk_widget_show(advanced_bt); +#endif /* GTK_MAJOR_VERSION */ /* Key Management button */ key_management_bt = gtk_button_new_with_label("Decryption Keys..."); @@ -4570,21 +4631,18 @@ create_main_window (gint pl_size, gint tv_size, gint bv_size, e_prefs *prefs) "Manage Decryption Keys", "Private"); gtk_widget_show(key_management_bt); - /* select the default interface */ - airpcap_if_active = airpcap_get_default_if(airpcap_if_list); - /* If no airpcap interface is present, gray everything */ if(airpcap_if_active == NULL) { - if(airpcap_if_list == NULL) { + if(airpcap_if_list == NULL || g_list_length(airpcap_if_list) == 0) { /*No airpcap device found */ airpcap_enable_toolbar_widgets(airpcap_tb,FALSE); /* recent.airpcap_toolbar_show = TRUE; */ - } else { - /* default adapter is not airpcap... or is airpcap but is not found*/ - airpcap_set_toolbar_stop_capture(airpcap_if_active); - airpcap_enable_toolbar_widgets(airpcap_tb,FALSE); - /* recent.airpcap_toolbar_show = TRUE; */ - } + } else { + /* default adapter is not airpcap... or is airpcap but is not found*/ + airpcap_set_toolbar_stop_capture(airpcap_if_active); + airpcap_enable_toolbar_widgets(airpcap_tb,FALSE); + /* recent.airpcap_toolbar_show = TRUE; */ + } } else { airpcap_set_toolbar_stop_capture(airpcap_if_active); /* recent.airpcap_toolbar_show = TRUE; */ @@ -4764,12 +4822,14 @@ show_main_window(gboolean doing_work) * This will read the decryption keys from the preferences file, and will * store them into the registry... */ - if(!airpcap_check_decryption_keys(airpcap_if_list)) { - /* Ask the user what to do ...*/ - airpcap_keys_check_w(NULL,NULL); - } else { - /* Keys from lists are equals, or wireshark has got no keys */ - airpcap_load_decryption_keys(airpcap_if_list); + if(airpcap_if_list != NULL && g_list_length(airpcap_if_list) > 0){ + if (!airpcap_check_decryption_keys(airpcap_if_list)) { + /* Ask the user what to do ...*/ + airpcap_keys_check_w(NULL,NULL); + } else { + /* Keys from lists are equals, or wireshark has got no keys */ + airpcap_load_decryption_keys(airpcap_if_list); + } } switch (airpcap_dll_ret_val) { -- cgit v1.2.3