Make the column check actually check the information column status.
[obnox/wireshark/wip.git] / airpcap_loader.c
1 /* airpcap_loader.c
2  *
3  * $Id$
4  *
5  * Giorgio Tino <giorgio.tino@cacetech.com>
6  * Copyright (c) CACE Technologies, LLC 2006
7  *
8  * Wireshark - Network traffic analyzer
9  * By Gerald Combs <gerald@wireshark.org>
10  * Copyright 2000 Gerald Combs
11  *
12  * This program is free software; you can redistribute it and/or
13  * modify it under the terms of the GNU General Public License
14  * as published by the Free Software Foundation; either version 2
15  * of the License, or (at your option) any later version.
16  *
17  * This program is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20  * GNU General Public License for more details.
21  *
22  * You should have received a copy of the GNU General Public License
23  * along with this program; if not, write to the Free Software
24  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
25  */
26
27 #ifdef _WIN32
28 #ifdef HAVE_CONFIG_H
29 # include "config.h"
30 #endif
31
32 #ifdef HAVE_AIRPCAP
33
34 #ifdef HAVE_LIBPCAP
35 #include <glib.h>
36 #include <gmodule.h>
37
38
39 #include <wtap.h>
40 #include <pcap.h>
41 #endif
42
43 #include <epan/packet.h>
44 #include <epan/prefs.h>
45 #include <epan/prefs-int.h>
46 #include <epan/crypt/wep-wpadefs.h>
47 #include <epan/crypt/airpdcap_ws.h>
48 #include <epan/strutil.h>
49 #include <epan/frequency-utils.h>
50 #include "capture_ui_utils.h"
51
52 #include "simple_dialog.h"
53
54 #include <airpcap.h>
55 #include "airpcap_loader.h"
56
57
58 /*
59  * We load dynamically the dag library in order link it only when
60  * it's present on the system
61  */
62 static HMODULE AirpcapLib = NULL;
63
64 /*
65  * Set to TRUE if the DLL was successfully loaded AND all functions
66  * are present.
67  */
68 static gboolean AirpcapLoaded = FALSE;
69
70 static int AirpcapVersion = 3;
71
72 static AirpcapGetLastErrorHandler g_PAirpcapGetLastError;
73 static AirpcapGetDeviceListHandler g_PAirpcapGetDeviceList;
74 static AirpcapFreeDeviceListHandler g_PAirpcapFreeDeviceList;
75 static AirpcapOpenHandler g_PAirpcapOpen;
76 static AirpcapCloseHandler g_PAirpcapClose;
77 static AirpcapGetLinkTypeHandler g_PAirpcapGetLinkType;
78 static AirpcapSetLinkTypeHandler g_PAirpcapSetLinkType;
79 static AirpcapSetKernelBufferHandler g_PAirpcapSetKernelBuffer;
80 static AirpcapSetFilterHandler g_PAirpcapSetFilter;
81 static AirpcapGetMacAddressHandler g_PAirpcapGetMacAddress;
82 static AirpcapSetMinToCopyHandler g_PAirpcapSetMinToCopy;
83 static AirpcapGetReadEventHandler g_PAirpcapGetReadEvent;
84 static AirpcapReadHandler g_PAirpcapRead;
85 static AirpcapGetStatsHandler g_PAirpcapGetStats;
86 static AirpcapTurnLedOnHandler g_PAirpcapTurnLedOn;
87 static AirpcapTurnLedOffHandler g_PAirpcapTurnLedOff;
88 static AirpcapGetDeviceChannelHandler g_PAirpcapGetDeviceChannel;
89 static AirpcapSetDeviceChannelHandler g_PAirpcapSetDeviceChannel;
90 static AirpcapGetFcsPresenceHandler g_PAirpcapGetFcsPresence;
91 static AirpcapSetFcsPresenceHandler g_PAirpcapSetFcsPresence;
92 static AirpcapGetFcsValidationHandler g_PAirpcapGetFcsValidation;
93 static AirpcapSetFcsValidationHandler g_PAirpcapSetFcsValidation;
94 static AirpcapGetDeviceKeysHandler g_PAirpcapGetDeviceKeys;
95 static AirpcapSetDeviceKeysHandler g_PAirpcapSetDeviceKeys;
96 static AirpcapGetDriverKeysHandler g_PAirpcapGetDriverKeys;
97 static AirpcapSetDriverKeysHandler g_PAirpcapSetDriverKeys;
98 static AirpcapGetDecryptionStateHandler g_PAirpcapGetDecryptionState;
99 static AirpcapSetDecryptionStateHandler g_PAirpcapSetDecryptionState;
100 static AirpcapGetDriverDecryptionStateHandler g_PAirpcapGetDriverDecryptionState;
101 static AirpcapSetDriverDecryptionStateHandler g_PAirpcapSetDriverDecryptionState;
102 static AirpcapStoreCurConfigAsAdapterDefaultHandler g_PAirpcapStoreCurConfigAsAdapterDefault;
103 static AirpcapGetVersionHandler g_PAirpcapGetVersion;
104 static AirpcapSetDeviceChannelExHandler g_PAirpcapSetDeviceChannelEx;
105 static AirpcapGetDeviceChannelExHandler g_PAirpcapGetDeviceChannelEx;
106 static AirpcapGetDeviceSupportedChannelsHandler g_PAirpcapGetDeviceSupportedChannels;
107
108 /* Airpcap interface list */
109 GList *airpcap_if_list = NULL;
110
111 /* Airpcap current selected interface */
112 airpcap_if_info_t *airpcap_if_selected = NULL;
113
114 /* Airpcap current active interface */
115 airpcap_if_info_t *airpcap_if_active = NULL;
116
117 /* WLAN preferences pointer */
118 module_t *wlan_prefs = NULL;
119
120 Dot11Channel *pSupportedChannels;
121 ULONG numSupportedChannels;
122
123 static AirpcapChannelInfo LegacyChannels[] =
124 {
125         {2412, 0, {0,0,0}},
126         {2417, 0, {0,0,0}},
127         {2422, 0, {0,0,0}},
128         {2427, 0, {0,0,0}},
129         {2432, 0, {0,0,0}},
130         {2437, 0, {0,0,0}},
131         {2442, 0, {0,0,0}},
132         {2447, 0, {0,0,0}},
133         {2452, 0, {0,0,0}},
134         {2457, 0, {0,0,0}},
135         {2462, 0, {0,0,0}},
136         {2467, 0, {0,0,0}},
137         {2472, 0, {0,0,0}},
138         {2484, 0, {0,0,0}},
139 };
140
141 static ULONG num_legacy_channels = 14;
142
143 /*
144  * Callback used by the load_wlan_keys() routine in order to read a WEP decryption key
145  */
146 static guint
147 get_wep_key(pref_t *pref, gpointer ud)
148 {
149     gchar *my_string = NULL;
150     keys_cb_data_t* user_data;
151
152     decryption_key_t* new_key;
153
154     /* Retrieve user data info */
155     user_data = (keys_cb_data_t*)ud;
156
157     if (g_ascii_strncasecmp(pref->name, "wep_key", 7) == 0 && pref->type == PREF_STRING)
158     {
159         my_string = g_strdup(*pref->varp.string);
160
161             /* Here we have the string describing the key... */
162             new_key = parse_key_string(my_string);
163
164         if( new_key != NULL)
165         {
166             /* Key is added only if not null ... */
167             user_data->list = g_list_append(user_data->list,new_key);
168             user_data->number_of_keys++;
169             user_data->current_index++;
170         }
171     }
172     return 0;
173 }
174
175 /* Returs TRUE if the WEP key is valid, false otherwise */
176 gboolean
177 wep_key_is_valid(char* key)
178 {
179     GString *new_key_string;
180     guint i=0;
181
182     if(key == NULL)
183         return FALSE;
184
185     new_key_string = g_string_new(key);
186
187     if( ((new_key_string->len) > WEP_KEY_MAX_CHAR_SIZE) || ((new_key_string->len) < 2))
188     {
189         g_string_free(new_key_string,FALSE);
190         return FALSE;
191     }
192     if((new_key_string->len % 2) != 0)
193     {
194         g_string_free(new_key_string,FALSE);
195         return FALSE;
196     }
197     for(i = 0; i < new_key_string->len; i++)
198     {
199         if(!g_ascii_isxdigit(new_key_string->str[i]))
200         {
201             g_string_free(new_key_string,FALSE);
202             return FALSE;
203         }
204     }
205
206     g_string_free(new_key_string,FALSE);
207     return TRUE;
208 }
209
210 /* Callback used by the save_wlan_keys() routine in order to write a decryption key */
211 static guint
212 set_wep_key(pref_t *pref, gpointer ud _U_)
213 {
214     gchar *my_string = NULL;
215     keys_cb_data_t* user_data;
216     gint wep_key_number = 0;
217
218     decryption_key_t* new_key;
219
220     /* Retrieve user data info */
221     user_data = (keys_cb_data_t*)ud;
222
223     if (g_ascii_strncasecmp(pref->name, "wep_key", 7) == 0 && pref->type == PREF_STRING)
224     {
225         /* Ok, the pref we're gonna set is a wep_key ... but what number? */
226         sscanf(pref->name,"wep_key%d",&wep_key_number);
227
228         if(user_data->current_index < user_data->number_of_keys)
229         {
230             if(wep_key_number == (user_data->current_index+1))
231             {
232                 /* Retrieve the nth decryption_key_t structure pointer */
233                 new_key = (decryption_key_t*)g_list_nth_data(user_data->list,user_data->current_index);
234
235                 /* Free the old key string */
236                 g_free((void *)*pref->varp.string);
237
238                 /* Create the new string describing the decryption key */
239                 my_string = get_key_string(new_key);
240
241                 /* Duplicate the string, and assign it to the variable pointer */
242                 *pref->varp.string = (void *)g_strdup(my_string);
243
244                 /* Free the previously allocated string */
245                 g_free(my_string);
246             }
247         }
248         else /* If the number of keys has been reduced somehow, we need to delete all the other keys
249               * (remember that the new ones have been probably overwritten)
250               */
251         {
252             g_free((void *)*pref->varp.string);
253             *pref->varp.string = (void *)g_strdup("");  /* Do not just free memory!!! Put an 'empty' string! */
254         }
255         user_data->current_index++;
256     }
257
258     return 0;
259 }
260
261 /*
262  * Function used to read the Decryption Keys from the preferences and store them
263  * properly into the airpcap adapter.
264  */
265 BOOL
266 load_wlan_driver_wep_keys()
267 {
268     keys_cb_data_t* user_data;
269     guint i;
270     gchar *tmp = NULL;
271
272     /* Retrieve the wlan preferences */
273     wlan_prefs = prefs_find_module("wlan");
274
275     /* Allocate a structure used to keep infos  between the callbacks */
276     user_data = (keys_cb_data_t*)g_malloc(sizeof(keys_cb_data_t));
277
278     /* Fill the structure */
279     user_data->list = NULL;
280     user_data->current_index = 0;
281     user_data->number_of_keys= 0; /* Still unknown */
282
283     /* Run the callback on each 802.11 preference */
284     prefs_pref_foreach(wlan_prefs, get_wep_key, (gpointer)user_data);
285
286     /* Now the key list should be filled */
287
288     /*
289      * Signal that we've changed things, and run the 802.11 dissector's
290      * callback
291      */
292     wlan_prefs->prefs_changed = TRUE;
293
294     prefs_apply(wlan_prefs);
295
296     write_wlan_driver_wep_keys_to_registry(user_data->list);
297
298     /* FREE MEMORY */
299     /* free the WEP key string */
300     for(i=0;i<g_list_length(user_data->list);i++)
301     {
302         g_free(g_list_nth(user_data->list,i)->data);
303     }
304
305     /* free the (empty) list */
306     g_list_free(user_data->list);
307
308     /* free the user_data structure */
309     g_free(user_data);
310
311     /* airpcap_if_info_free(fake_info_if); */
312
313     return TRUE;
314 }
315
316 /*
317  * This function will tell the airpcap driver the key list to use
318  * This will be stored into the registry...
319  */
320 BOOL
321 write_wlan_wep_keys_to_registry(airpcap_if_info_t* info_if, GList* key_list)
322 {
323     UINT i,j;
324     GString *new_key;
325     gchar s[3];
326     PAirpcapKeysCollection KeysCollection;
327     ULONG KeysCollectionSize;
328     UCHAR KeyByte;
329     UINT keys_in_list = 0;
330     decryption_key_t* key_item = NULL;
331
332     keys_in_list = g_list_length(key_list);
333
334     /*
335      * Save the encryption keys, if we have any of them
336      */
337     KeysCollectionSize = 0;
338
339     /*
340      * Calculate the size of the keys collection
341      */
342     KeysCollectionSize = sizeof(AirpcapKeysCollection) + keys_in_list * sizeof(AirpcapKey);
343
344     /*
345      * Allocate the collection
346      */
347     KeysCollection = (PAirpcapKeysCollection)g_malloc(KeysCollectionSize);
348     if(!KeysCollection)
349     {
350         return FALSE;
351     }
352
353     /*
354      * Populate the key collection
355      */
356     KeysCollection->nKeys = keys_in_list;
357
358     for(i = 0; i < keys_in_list; i++)
359     {
360         KeysCollection->Keys[i].KeyType = AIRPDCAP_KEY_TYPE_WEP;
361
362         /* Retrieve the Item corresponding to the i-th key */
363         key_item = (decryption_key_t*)g_list_nth_data(key_list,i);
364         new_key = g_string_new(key_item->key->str);
365
366         KeysCollection->Keys[i].KeyLen = new_key->len / 2;
367         memset(&KeysCollection->Keys[i].KeyData, 0, sizeof(KeysCollection->Keys[i].KeyData));
368
369         for(j = 0 ; j < new_key->len; j += 2)
370         {
371             s[0] = new_key->str[j];
372             s[1] = new_key->str[j+1];
373             s[2] = '\0';
374             KeyByte = (UCHAR)strtol(s, NULL, 16);
375             KeysCollection->Keys[i].KeyData[j / 2] = KeyByte;
376         }
377
378         g_string_free(new_key,TRUE);
379
380     }
381     /*
382      * Free the old adapter key collection!
383      */
384     if(info_if->keysCollection != NULL)
385         g_free(info_if->keysCollection);
386
387     /*
388      * Set this collection ad the new one
389      */
390     info_if->keysCollection = KeysCollection;
391     info_if->keysCollectionSize = KeysCollectionSize;
392
393     /*
394      * Configuration must be saved
395      */
396     info_if->saved = FALSE;
397
398     /*
399      * Write down the changes to the registry
400      */
401     airpcap_save_selected_if_configuration(info_if);
402
403     return TRUE;
404 }
405
406 /*
407  * This function will tell the airpcap driver the key list to use
408  * This will be stored into the registry...
409  */
410 BOOL
411 write_wlan_driver_wep_keys_to_registry(GList* key_list)
412 {
413     UINT i,j,k,n,y;
414     GString *new_key;
415     gchar s[3];
416     PAirpcapKeysCollection KeysCollection;
417     ULONG KeysCollectionSize;
418     UCHAR KeyByte;
419     UINT keys_in_list = 0;
420     decryption_key_t* key_item = NULL;
421     airpcap_if_info_t* fake_info_if = NULL;
422
423     /* Create the fake_info_if from the first adapter of the list */
424     fake_info_if = airpcap_driver_fake_if_info_new();
425
426     if(fake_info_if == NULL)
427         return FALSE;
428
429     /*
430      * XXX - When WPA will be supported, change this to: keys_in_list = g_list_length(key_list);
431      * but right now we will have to count only the WEP keys (or we will have a malloc-mess :-) )
432      */
433     n = g_list_length(key_list);
434     for(k = 0; k < n; k++ )
435         if(((decryption_key_t*)g_list_nth_data(key_list,k))->type == AIRPDCAP_KEY_TYPE_WEP)
436             keys_in_list++;
437
438     /*
439      * Save the encryption keys, if we have any of them
440      */
441     KeysCollectionSize = 0;
442
443     /*
444      * Calculate the size of the keys collection
445      */
446     KeysCollectionSize = sizeof(AirpcapKeysCollection) + keys_in_list * sizeof(AirpcapKey);
447
448     /*
449      * Allocate the collection
450      */
451     KeysCollection = (PAirpcapKeysCollection)g_malloc(KeysCollectionSize);
452     if(!KeysCollection)
453     {
454         return FALSE;
455     }
456
457     /*
458      * Populate the key collection
459      */
460     KeysCollection->nKeys = keys_in_list;
461
462     /*
463      * XXX - If we have, let's say, six keys, the first three are WEP, then two are WPA, and the
464      * last is WEP, we have to scroll the whole list (n) but increment the array counter only
465      * when a WEP key is found (y) .. When WPA will be supported by the driver, I'll have to change
466      * this
467      */
468     y = 0; /* Current position in the key list */
469
470     for(i = 0; i < n; i++)
471     {
472         /* Retrieve the Item corresponding to the i-th key */
473         key_item = (decryption_key_t*)g_list_nth_data(key_list,i);
474
475         /*
476          * XXX - The AIRPDCAP_KEY_TYPE_WEP is the only supported right now!
477          * We will have to modify the AirpcapKey structure in order to
478          * support the other two types! What happens now, is that simply the
479          * not supported keys will just be discarded (they will be saved in Wireshark though)
480          */
481         if(key_item->type == AIRPDCAP_KEY_TYPE_WEP)
482         {
483             KeysCollection->Keys[y].KeyType = AIRPDCAP_KEY_TYPE_WEP;
484
485             new_key = g_string_new(key_item->key->str);
486
487             KeysCollection->Keys[y].KeyLen = new_key->len / 2;
488             memset(&KeysCollection->Keys[y].KeyData, 0, sizeof(KeysCollection->Keys[y].KeyData));
489
490             for(j = 0 ; j < new_key->len; j += 2)
491             {
492                 s[0] = new_key->str[j];
493                 s[1] = new_key->str[j+1];
494                 s[2] = '\0';
495                 KeyByte = (UCHAR)strtol(s, NULL, 16);
496                 KeysCollection->Keys[y].KeyData[j / 2] = KeyByte;
497             }
498             /* XXX - Change when WPA will be supported!!! */
499             y++;
500             g_string_free(new_key,TRUE);
501         }
502         else if(key_item->type == AIRPDCAP_KEY_TYPE_WPA_PWD)
503         {
504             /* XXX - The driver cannot deal with this kind of key yet... */
505         }
506         else if(key_item->type == AIRPDCAP_KEY_TYPE_WPA_PMK)
507         {
508             /* XXX - The driver cannot deal with this kind of key yet... */
509         }
510     }
511
512     /*
513      * Free the old adapter key collection!
514      */
515     if(fake_info_if->keysCollection != NULL)
516         g_free(fake_info_if->keysCollection);
517
518     /*
519      * Set this collection ad the new one
520      */
521     fake_info_if->keysCollection = KeysCollection;
522     fake_info_if->keysCollectionSize = KeysCollectionSize;
523
524     /*
525      * Configuration must be saved
526      */
527     fake_info_if->saved = FALSE;
528
529     /*
530      * Write down the changes to the registry
531      */
532     airpcap_save_driver_if_configuration(fake_info_if);
533
534     airpcap_if_info_free(fake_info_if);
535
536     return TRUE;
537 }
538
539 /*
540  *  Function used to save to the preference file the Decryption Keys.
541  */
542 int
543 save_wlan_driver_wep_keys()
544 {
545     GList* key_list = NULL;
546     char* tmp_key = NULL;
547     guint keys_in_list,i;
548     keys_cb_data_t* user_data;
549     airpcap_if_info_t* fake_info_if = NULL;
550
551     /* Create the fake_info_if from the first adapter of the list */
552     fake_info_if = airpcap_driver_fake_if_info_new();
553
554     if(fake_info_if == NULL)
555         return 0;
556
557     /* Retrieve the wlan preferences */
558     wlan_prefs = prefs_find_module("wlan");
559
560     /* Allocate a structure used to keep infos  between the callbacks */
561     user_data = (keys_cb_data_t*)g_malloc(sizeof(keys_cb_data_t));
562
563     /* Number of keys in key list */
564     if(fake_info_if->keysCollectionSize != 0)
565         keys_in_list = (guint)(fake_info_if->keysCollectionSize -  sizeof(AirpcapKeysCollection))/sizeof(AirpcapKey);
566     else
567         keys_in_list = 0;
568
569     for(i=0; i<keys_in_list; i++)
570     {
571     /* Only if it is a WEP key... */
572         if(fake_info_if->keysCollection->Keys[i].KeyType == AIRPDCAP_KEY_TYPE_WEP)
573         {
574             tmp_key = airpcap_get_key_string(fake_info_if->keysCollection->Keys[i]);
575             key_list = g_list_append(key_list,g_strdup(tmp_key));
576             g_free(tmp_key);
577         }
578     }
579
580     /* Now we know the exact number of WEP keys in the list, so store it ... */
581     keys_in_list = g_list_length(key_list);
582
583     /* Fill the structure */
584     user_data->list = key_list;
585     user_data->current_index = 0;
586     user_data->number_of_keys= keys_in_list;
587
588     /* Retrieve the wlan preferences */
589     wlan_prefs = prefs_find_module("wlan");
590
591     /* Run the callback on each 802.11 preference */
592     prefs_pref_foreach(wlan_prefs, set_wep_key,  (gpointer)user_data);
593
594     /* Signal that we've changed things, and run the 802.11 dissector's
595      * callback */
596     wlan_prefs->prefs_changed = TRUE;
597
598     /* Apply changes for the specified preference */
599     prefs_apply(wlan_prefs);
600
601     /* FREE MEMORY */
602     /* free the WEP key string */
603     for(i=0;i<g_list_length(user_data->list);i++)
604     {
605         g_free(g_list_nth(user_data->list,i)->data);
606     }
607
608     /* free the (empty) list */
609     g_list_free(user_data->list);
610
611     /* free the user_data structure */
612     g_free(user_data);
613
614     airpcap_if_info_free(fake_info_if);
615
616     return keys_in_list;
617 }
618
619 /*
620  *  Function used to save to the preference file the Decryption Keys.
621  */
622 int
623 save_wlan_wireshark_wep_keys(GList* key_ls)
624 {
625     GList* key_list = NULL;
626     char* tmp_key = NULL;
627     guint keys_in_list,i;
628     keys_cb_data_t* user_data;
629     airpcap_if_info_t* fake_info_if = NULL;
630     decryption_key_t* tmp_dk;
631
632     /* Retrieve the wlan preferences */
633     wlan_prefs = prefs_find_module("wlan");
634
635     /* Allocate a structure used to keep infos  between the callbacks */
636     user_data = (keys_cb_data_t*)g_malloc(sizeof(keys_cb_data_t));
637
638     keys_in_list = g_list_length(key_ls);
639
640     key_list = key_ls;
641
642     /* Fill the structure */
643     user_data->list = key_list;
644     user_data->current_index = 0;
645     user_data->number_of_keys= keys_in_list;
646
647     /* Retrieve the wlan preferences */
648     wlan_prefs = prefs_find_module("wlan");
649
650     /* Run the callback on each 802.11 preference */
651     prefs_pref_foreach(wlan_prefs, set_wep_key,  (gpointer)user_data);
652
653     /* Signal that we've changed things, and run the 802.11 dissector's
654      * callback */
655     wlan_prefs->prefs_changed = TRUE;
656
657     /* Apply changes for the specified preference */
658     prefs_apply(wlan_prefs);
659
660     /* FREE MEMORY */
661     /* free the WEP key string */
662     for(i=0;i<g_list_length(user_data->list);i++)
663     {
664         tmp_dk = (decryption_key_t*)g_list_nth(user_data->list,i)->data;
665         g_string_free(tmp_dk->key,TRUE);
666         if(tmp_dk->ssid != NULL) g_byte_array_free(tmp_dk->ssid,TRUE);
667     }
668
669     /* free the (empty) list */
670     g_list_free(user_data->list);
671
672     /* free the user_data structure */
673     g_free(user_data);
674
675     return keys_in_list;
676 }
677
678 /*
679  * Get an error message string for a CANT_GET_INTERFACE_LIST error from
680  * "get_airpcap_interface_list()".
681  */
682 static gchar *
683 cant_get_airpcap_if_list_error_message(const char *err_str)
684 {
685     return g_strdup_printf("Can't get list of Wireless interfaces: %s", err_str);
686 }
687
688 /*
689  * Airpcap wrapper, used to store the current settings for the selected adapter
690  */
691 BOOL
692 airpcap_if_store_cur_config_as_adapter_default(PAirpcapHandle ah)
693 {
694     if (!AirpcapLoaded) return FALSE;
695     return g_PAirpcapStoreCurConfigAsAdapterDefault(ah);
696 }
697
698 /*
699  * Airpcap wrapper, used to open an airpcap adapter
700  */
701 PAirpcapHandle
702 airpcap_if_open(PCHAR name, PCHAR err)
703 {
704     if (!AirpcapLoaded) return NULL;
705     if (name == NULL) return NULL;
706     return g_PAirpcapOpen(name,err);
707 }
708
709 /*
710  * Airpcap wrapper, used to close an airpcap adapter
711  */
712 VOID
713 airpcap_if_close(PAirpcapHandle handle)
714 {
715     if (!AirpcapLoaded) return;
716     g_PAirpcapClose(handle);
717 }
718
719 /*
720  * Retrieve the state of the Airpcap DLL
721  */
722 int
723 airpcap_get_dll_state()
724 {
725   return AirpcapVersion;
726 }
727
728 /*
729  * Airpcap wrapper, used to turn on the led of an airpcap adapter
730  */
731 BOOL
732 airpcap_if_turn_led_on(PAirpcapHandle AdapterHandle, UINT LedNumber)
733 {
734     if (!AirpcapLoaded) return FALSE;
735     return g_PAirpcapTurnLedOn(AdapterHandle,LedNumber);
736 }
737
738 /*
739  * Airpcap wrapper, used to turn off the led of an airpcap adapter
740  */
741 BOOL
742 airpcap_if_turn_led_off(PAirpcapHandle AdapterHandle, UINT LedNumber)
743 {
744     if (!AirpcapLoaded) return FALSE;
745     return g_PAirpcapTurnLedOff(AdapterHandle,LedNumber);
746 }
747
748 /*
749  * Airpcap wrapper, used to get the channel of an airpcap adapter
750  */
751 BOOL
752 airpcap_if_get_device_channel(PAirpcapHandle ah, PUINT ch)
753 {
754     if (!AirpcapLoaded) return FALSE;
755     return g_PAirpcapGetDeviceChannel(ah,ch);
756 }
757
758 /*
759  * Airpcap wrapper, used to get the supported channels of an airpcap adapter
760  */
761 BOOL
762 airpcap_if_get_device_supported_channels(PAirpcapHandle ah, AirpcapChannelInfo **cInfo, PULONG nInfo)
763 {
764     if (!AirpcapLoaded) return FALSE;
765     if (airpcap_get_dll_state() == AIRPCAP_DLL_OLD){
766       *nInfo = num_legacy_channels;
767       *cInfo = (AirpcapChannelInfo*)&LegacyChannels;
768
769       return TRUE;
770     } else if (airpcap_get_dll_state() == AIRPCAP_DLL_OK){
771       return g_PAirpcapGetDeviceSupportedChannels(ah, cInfo, nInfo);
772     }
773     return FALSE;
774 }
775
776 /*
777  * Airpcap wrapper, used to get the supported channels of an airpcap adapter
778  */
779 Dot11Channel*
780 airpcap_if_get_device_supported_channels_array(PAirpcapHandle ah, PULONG pNumSupportedChannels)
781 {
782     AirpcapChannelInfo *chanInfo;
783     ULONG i=0, j=0, numInfo = 0;
784
785     if (!AirpcapLoaded)
786         return NULL;
787     if (airpcap_if_get_device_supported_channels(ah, &chanInfo, &numInfo) == FALSE)
788         return NULL;
789     numSupportedChannels = 0;
790
791     /*
792      * allocate a bigger array
793      */
794     if (numInfo == 0)
795         return NULL;
796
797     pSupportedChannels = malloc(numInfo * (sizeof *pSupportedChannels));
798
799     for (i = 0; i < numInfo; i++)
800     {
801         ULONG supportedChannel = 0xFFFFFFFF;
802
803         /*
804          * search if we have it already
805          */
806         for (j = 0; j < numSupportedChannels; j++)
807         {
808             if (pSupportedChannels[j].Frequency == chanInfo[i].Frequency)
809             {
810                 supportedChannel = j;
811                 break;
812             }
813         }
814
815         if (supportedChannel == 0xFFFFFFFF)
816         {
817             /*
818              * not found, create a new item
819              */
820             pSupportedChannels[numSupportedChannels].Frequency = chanInfo[i].Frequency;
821
822             switch(chanInfo[i].ExtChannel)
823             {
824                 case -1:
825                     pSupportedChannels[numSupportedChannels].Flags = FLAG_CAN_BE_HIGH;
826                     break;
827                 case +1:
828                     pSupportedChannels[numSupportedChannels].Flags = FLAG_CAN_BE_LOW;
829                     break;
830                 case 0:
831                 default:
832                     pSupportedChannels[numSupportedChannels].Flags = 0;
833             }
834
835             /*
836              * Gather channel information
837              */
838
839             pSupportedChannels[numSupportedChannels].Flags |=
840                 FREQ_IS_BG(pSupportedChannels[numSupportedChannels].Frequency) ?
841                     FLAG_IS_BG_CHANNEL : FLAG_IS_A_CHANNEL;
842             pSupportedChannels[numSupportedChannels].Channel =
843                 ieee80211_mhz_to_chan(pSupportedChannels[numSupportedChannels].Frequency);
844             numSupportedChannels++;
845         }
846         else
847         {
848             /*
849              * just update the ext channel flags
850              */
851             switch(chanInfo[i].ExtChannel)
852             {
853                 case -1:
854                     pSupportedChannels[supportedChannel].Flags |= FLAG_CAN_BE_HIGH;
855                     break;
856                 case +1:
857                     pSupportedChannels[supportedChannel].Flags |= FLAG_CAN_BE_LOW;
858                     break;
859                 case 0:
860                 default:
861                     break;
862             }
863         }
864     }
865
866     if (numSupportedChannels < 1)
867         return NULL;
868     /*
869      * Now sort the list by frequency
870      */
871     for (i = 0 ; i < numSupportedChannels - 1; i++)
872     {
873         for (j = i + 1; j < numSupportedChannels; j++)
874         {
875             if (pSupportedChannels[i].Frequency > pSupportedChannels[j].Frequency)
876             {
877                 Dot11Channel temp = pSupportedChannels[i];
878                 pSupportedChannels[i] = pSupportedChannels[j];
879                 pSupportedChannels[j] = temp;
880             }
881         }
882     }
883
884     *pNumSupportedChannels = numSupportedChannels;
885     return pSupportedChannels;
886 }
887
888 /*
889  * Airpcap wrapper, used to set the channel of an airpcap adapter
890  */
891 BOOL
892 airpcap_if_set_device_channel(PAirpcapHandle ah, UINT ch)
893 {
894     if (!AirpcapLoaded) return FALSE;
895     return g_PAirpcapSetDeviceChannel(ah,ch);
896 }
897
898 /*
899  * Airpcap wrapper, used to set the frequency of an airpcap adapter
900  */
901 BOOL
902 airpcap_if_set_device_channel_ex(PAirpcapHandle ah, AirpcapChannelInfo ChannelInfo)
903 {
904     if (!AirpcapLoaded) return FALSE;
905     if (airpcap_get_dll_state() == AIRPCAP_DLL_OLD){
906       guint channel = 0;
907       channel = ieee80211_mhz_to_chan(ChannelInfo.Frequency);
908
909       if (channel < 0){
910         return FALSE;
911       } else {
912         return airpcap_if_set_device_channel(ah, channel);
913       }
914     } else if (airpcap_get_dll_state() == AIRPCAP_DLL_OK){
915       return g_PAirpcapSetDeviceChannelEx (ah, ChannelInfo);
916     }
917
918     return FALSE;
919 }
920
921 /*
922  * Airpcap wrapper, used to get the frequency of an airpcap adapter
923  */
924 BOOL
925 airpcap_if_get_device_channel_ex(PAirpcapHandle ah, PAirpcapChannelInfo pChannelInfo)
926 {
927     if (!AirpcapLoaded) return FALSE;
928
929     pChannelInfo->Frequency = 0;
930     pChannelInfo->ExtChannel = 0;
931     pChannelInfo->Reserved[0] = 0;
932     pChannelInfo->Reserved[1] = 0;
933     pChannelInfo->Reserved[2] = 0;
934
935     if (airpcap_get_dll_state() == AIRPCAP_DLL_OLD){
936       guint channel = 0;
937       ULONG chan_freq = 0;
938
939       if (!airpcap_if_get_device_channel(ah, &channel)) return FALSE;
940
941       chan_freq = ieee80211_chan_to_mhz(channel, TRUE);
942       if (chan_freq == 0) return FALSE;
943       pChannelInfo->Frequency = chan_freq;
944
945       return TRUE;
946     } else if (airpcap_get_dll_state() == AIRPCAP_DLL_OK){
947       return g_PAirpcapGetDeviceChannelEx (ah, pChannelInfo);
948     }
949     return FALSE;
950 }
951
952 /*
953  * Airpcap wrapper, used to get the link type of an airpcap adapter
954  */
955 BOOL
956 airpcap_if_get_link_type(PAirpcapHandle ah, PAirpcapLinkType lt)
957 {
958     if (!AirpcapLoaded) return FALSE;
959     return g_PAirpcapGetLinkType(ah,lt);
960 }
961
962 /*
963  * Airpcap wrapper, used to set the link type of an airpcap adapter
964  */
965 BOOL
966 airpcap_if_set_link_type(PAirpcapHandle ah, AirpcapLinkType lt)
967 {
968     if (!AirpcapLoaded) return FALSE;
969     return g_PAirpcapSetLinkType(ah,lt);
970 }
971
972 /*
973  * Airpcap wrapper, used to get the fcs presence of an airpcap adapter
974  */
975 BOOL
976 airpcap_if_get_fcs_presence(PAirpcapHandle ah, PBOOL fcs)
977 {
978     if (!AirpcapLoaded) return FALSE;
979     return g_PAirpcapGetFcsPresence(ah,fcs);
980 }
981
982 /*
983  * Airpcap wrapper, used to set the fcs presence of an airpcap adapter
984  */
985 BOOL
986 airpcap_if_set_fcs_presence(PAirpcapHandle ah, BOOL fcs)
987 {
988     if (!AirpcapLoaded) return FALSE;
989     return g_PAirpcapSetFcsPresence(ah,fcs);
990 }
991
992 /*
993  * Airpcap wrapper, used to get the decryption enabling of an airpcap adapter
994  */
995 BOOL
996 airpcap_if_get_decryption_state(PAirpcapHandle ah, PAirpcapDecryptionState PEnable)
997 {
998     if (!AirpcapLoaded) return FALSE;
999     return g_PAirpcapGetDecryptionState(ah,PEnable);
1000 }
1001
1002 /*
1003  * Airpcap wrapper, used to set the decryption enabling of an airpcap adapter
1004  */
1005 BOOL
1006 airpcap_if_set_decryption_state(PAirpcapHandle ah, AirpcapDecryptionState Enable)
1007 {
1008     if (!AirpcapLoaded) return FALSE;
1009     return g_PAirpcapSetDecryptionState(ah,Enable);
1010 }
1011
1012 /*
1013  * Airpcap wrapper, used to get the decryption enabling of an airpcap driver
1014  */
1015 BOOL
1016 airpcap_if_get_driver_decryption_state(PAirpcapHandle ah, PAirpcapDecryptionState PEnable)
1017 {
1018     if (!AirpcapLoaded || (g_PAirpcapGetDriverDecryptionState==NULL)) return FALSE;
1019     return g_PAirpcapGetDriverDecryptionState(ah,PEnable);
1020 }
1021
1022 /*
1023  * Airpcap wrapper, used to set the decryption enabling of an airpcap driver
1024  */
1025 BOOL
1026 airpcap_if_set_driver_decryption_state(PAirpcapHandle ah, AirpcapDecryptionState Enable)
1027 {
1028     if (!AirpcapLoaded || (g_PAirpcapSetDriverDecryptionState==NULL)) return FALSE;
1029     return g_PAirpcapSetDriverDecryptionState(ah,Enable);
1030 }
1031
1032 /*
1033  * Airpcap wrapper, used to get the fcs validation of an airpcap adapter
1034  */
1035 BOOL
1036 airpcap_if_get_fcs_validation(PAirpcapHandle ah, PAirpcapValidationType val)
1037 {
1038     if (!AirpcapLoaded) return FALSE;
1039     return g_PAirpcapGetFcsValidation(ah,val);
1040 }
1041
1042 /*
1043  * Airpcap wrapper, used to set the fcs validation of an airpcap adapter
1044  */
1045 BOOL
1046 airpcap_if_set_fcs_validation(PAirpcapHandle ah, AirpcapValidationType val)
1047 {
1048     if (!AirpcapLoaded) return FALSE;
1049     return g_PAirpcapSetFcsValidation(ah,val);
1050 }
1051
1052 /*
1053  * Airpcap wrapper, used to save the settings for the selected_if
1054  */
1055 BOOL
1056 airpcap_if_set_device_keys(PAirpcapHandle AdapterHandle, PAirpcapKeysCollection KeysCollection)
1057 {
1058     if (!AirpcapLoaded) return FALSE;
1059     return g_PAirpcapSetDeviceKeys(AdapterHandle,KeysCollection);
1060 }
1061
1062 /*
1063  * Airpcap wrapper, used to save the settings for the selected_if
1064  */
1065 BOOL
1066 airpcap_if_get_device_keys(PAirpcapHandle AdapterHandle, PAirpcapKeysCollection KeysCollection, PUINT PKeysCollectionSize)
1067 {
1068     if (!AirpcapLoaded) return FALSE;
1069     return g_PAirpcapGetDeviceKeys(AdapterHandle,KeysCollection,PKeysCollectionSize);
1070 }
1071
1072 /*
1073  * Airpcap wrapper, used to save the driver's set of keys
1074  */
1075 BOOL
1076 airpcap_if_set_driver_keys(PAirpcapHandle AdapterHandle, PAirpcapKeysCollection KeysCollection)
1077 {
1078     if (!AirpcapLoaded || (g_PAirpcapSetDriverKeys==NULL)) return FALSE;
1079     return g_PAirpcapSetDriverKeys(AdapterHandle,KeysCollection);
1080 }
1081
1082 /*
1083  * Airpcap wrapper, used to load the driver's set of keys
1084  */
1085 BOOL
1086 airpcap_if_get_driver_keys(PAirpcapHandle AdapterHandle, PAirpcapKeysCollection KeysCollection, PUINT PKeysCollectionSize)
1087 {
1088     if (!AirpcapLoaded || (g_PAirpcapGetDriverKeys==NULL)) return FALSE;
1089     return g_PAirpcapGetDriverKeys(AdapterHandle,KeysCollection,PKeysCollectionSize);
1090 }
1091
1092 /*
1093  * This function will create a new airpcap_if_info_t using a name and a description
1094  */
1095 airpcap_if_info_t *
1096 airpcap_if_info_new(char *name, char *description)
1097 {
1098     PAirpcapHandle ad;
1099     gchar ebuf[AIRPCAP_ERRBUF_SIZE];
1100
1101     airpcap_if_info_t *if_info = NULL;
1102
1103     /* Probably I have to switch on the leds!!! */
1104     ad = airpcap_if_open(name, ebuf);
1105     if(ad)
1106     {
1107                 if_info = g_malloc(sizeof (airpcap_if_info_t));
1108                 if_info->name = g_strdup(name);
1109                 if (description == NULL){
1110                         if_info->description = NULL;
1111                 }else{
1112                         if_info->description = g_strdup(description);
1113                 }
1114
1115                 if_info->ip_addr = NULL;
1116                 if_info->loopback = FALSE;
1117                 airpcap_if_get_fcs_validation(ad,&(if_info->CrcValidationOn));
1118                 airpcap_if_get_fcs_presence(ad,&(if_info->IsFcsPresent));
1119                 airpcap_if_get_link_type(ad,&(if_info->linkType));
1120                 airpcap_if_get_device_channel_ex(ad,&(if_info->channelInfo));
1121                 if_info->pSupportedChannels = airpcap_if_get_device_supported_channels_array(ad, &(if_info->numSupportedChannels));
1122                 airpcap_if_turn_led_on(ad, 0);
1123                 airpcap_if_get_decryption_state(ad, &(if_info->DecryptionOn));
1124                 if_info->led = TRUE;
1125                 if_info->blinking = FALSE;
1126                 if_info->saved = TRUE; /* NO NEED TO BE SAVED */
1127
1128                 /* get the keys, if everything is ok, close the adapter */
1129                 if(airpcap_if_load_keys(ad,if_info))
1130                 {
1131                         airpcap_if_close(ad);
1132                 }
1133     }
1134     return if_info;
1135 }
1136
1137 /*
1138  * This function will create a new fake drivers' interface, to load global keys...
1139  */
1140 airpcap_if_info_t*
1141 airpcap_driver_fake_if_info_new()
1142 {
1143     PAirpcapHandle ad;
1144     gchar ebuf[AIRPCAP_ERRBUF_SIZE];
1145
1146     airpcap_if_info_t *if_info = NULL;
1147     airpcap_if_info_t *fake_if_info = NULL;
1148
1149     /* Maybe for some reason no airpcap adapter is found */
1150     if(airpcap_if_list == NULL)
1151         return NULL;
1152
1153     /*
1154      * Retrieve the first AirPcap adapter available. If no interface is found,
1155      * it is not possible to retrieve the driver's settings, so return NULL.
1156      */
1157     if_info = g_list_nth_data(airpcap_if_list,0);
1158     if(if_info == NULL)
1159         return NULL;
1160
1161     /* Open the 'fake' adapter */
1162     ad = airpcap_if_open(if_info->name, ebuf);
1163     if(ad)
1164     {
1165                 fake_if_info = g_malloc(sizeof (airpcap_if_info_t));
1166                 fake_if_info->name = g_strdup(if_info->name);
1167                 fake_if_info->description = g_strdup(if_info->description);
1168                 fake_if_info->loopback = FALSE;
1169                 fake_if_info->ip_addr = NULL;
1170                 airpcap_if_get_driver_decryption_state(ad, &(fake_if_info->DecryptionOn));
1171                 airpcap_if_get_fcs_validation(ad,&(fake_if_info->CrcValidationOn));
1172                 airpcap_if_get_fcs_presence(ad,&(fake_if_info->IsFcsPresent));
1173                 airpcap_if_get_link_type(ad,&(fake_if_info->linkType));
1174                 airpcap_if_get_device_channel_ex(ad,&(fake_if_info->channelInfo));
1175                 airpcap_if_turn_led_on(ad, 0);
1176                 fake_if_info->led = TRUE;
1177                 fake_if_info->blinking = FALSE;
1178                 fake_if_info->saved = TRUE; /* NO NEED TO BE SAVED */
1179
1180                 /* get the keys, if everything is ok, close the adapter */
1181                 if(airpcap_if_load_driver_keys(ad,fake_if_info))
1182                 {
1183                         airpcap_if_close(ad);
1184                 }
1185     }
1186
1187     return fake_if_info;
1188 }
1189
1190 /*
1191  * USED FOR DEBUG ONLY... PRINTS AN AirPcap ADAPTER STRUCTURE in a fancy way.
1192  */
1193 void
1194 airpcap_if_info_print(airpcap_if_info_t* if_info)
1195 {
1196     guint i;
1197     if(if_info == NULL)
1198     {
1199                 g_print("\nWARNING : AirPcap Interface pointer is NULL!\n");
1200                 return;
1201     }
1202
1203     g_print("\n----------------- AirPcap Interface \n");
1204     g_print("                      NAME: %s\n",if_info->name);
1205     g_print("               DESCRIPTION: %s\n",if_info->description);
1206     g_print("                  BLINKING: %s\n",if_info->blinking ? "TRUE" : "FALSE");
1207     g_print("     channelInfo.Frequency: %u\n",if_info->channelInfo.Frequency);
1208     g_print("    channelInfo.ExtChannel: %d\n",if_info->channelInfo.ExtChannel);
1209     g_print("             CRCVALIDATION: %s\n",if_info->CrcValidationOn ? "ON" : "OFF");
1210     g_print("                DECRYPTION: %s\n",if_info->DecryptionOn ? "ON" : "OFF");
1211     g_print("                   IP ADDR: %s\n",if_info->ip_addr!=NULL ? "NOT NULL" : "NULL");
1212     g_print("                FCSPRESENT: %s\n",if_info->IsFcsPresent ? "TRUE" : "FALSE");
1213     g_print("            KEYSCOLLECTION: %s\n",if_info->keysCollection!=NULL ? "NOT NULL" : "NULL");
1214     g_print("        KEYSCOLLECTIONSIZE: %u\n",if_info->keysCollectionSize);
1215     g_print("                       LED: %s\n",if_info->led ? "ON" : "OFF");
1216     g_print("                  LINKTYPE: %d\n",if_info->linkType);
1217     g_print("                  LOOPBACK: %s\n",if_info->loopback ? "YES" : "NO");
1218     g_print("                 (GTK) TAG: %d\n",if_info->tag);
1219     g_print("SUPPORTED CHANNELS POINTER: %lu\n",if_info->pSupportedChannels);
1220     g_print("    NUM SUPPORTED CHANNELS: %lu\n",if_info->numSupportedChannels);
1221
1222     for(i=0; i<(if_info->numSupportedChannels); i++){
1223       g_print("\n        SUPPORTED CHANNEL #%u\n",i+1);
1224       g_print("                   CHANNEL: %u\n",if_info->pSupportedChannels[i].Channel);
1225       g_print("                 FREQUENCY: %lu\n",if_info->pSupportedChannels[i].Frequency);
1226       g_print("                     FLAGS: %lu\n",if_info->pSupportedChannels[i].Flags);
1227     }
1228     g_print("\n\n");
1229 }
1230
1231 /*
1232  * Function used to load the WEP keys for a selected interface
1233  */
1234 BOOL
1235 airpcap_if_load_keys(PAirpcapHandle ad, airpcap_if_info_t *if_info)
1236 {
1237     if(!if_info) return FALSE;
1238
1239     if_info->keysCollectionSize = 0;
1240     if_info->keysCollection = NULL;
1241
1242     if(!airpcap_if_get_device_keys(ad, NULL, &(if_info->keysCollectionSize)))
1243     {
1244         if(if_info->keysCollectionSize == 0)
1245         {
1246             if_info->keysCollection = NULL;
1247             airpcap_if_close(ad);
1248             return FALSE;
1249         }
1250
1251         if_info->keysCollection = (PAirpcapKeysCollection)g_malloc(if_info->keysCollectionSize);
1252         if(!if_info->keysCollection)
1253         {
1254             if_info->keysCollectionSize = 0;
1255             if_info->keysCollection = NULL;
1256             airpcap_if_close(ad);
1257             return FALSE;
1258         }
1259
1260         airpcap_if_get_device_keys(ad, if_info->keysCollection, &(if_info->keysCollectionSize));
1261         return TRUE;
1262     }
1263
1264     airpcap_if_close(ad);
1265     return FALSE;
1266 }
1267
1268 /*
1269  * Function used to load the WEP keys for a selected interface
1270  */
1271 BOOL
1272 airpcap_if_load_driver_keys(PAirpcapHandle ad, airpcap_if_info_t *if_info)
1273 {
1274     if_info->keysCollectionSize = 0;
1275     if_info->keysCollection = NULL;
1276
1277     if(!airpcap_if_get_driver_keys(ad, NULL, &(if_info->keysCollectionSize)))
1278     {
1279         if(if_info->keysCollectionSize == 0)
1280         {
1281             if_info->keysCollection = NULL;
1282             airpcap_if_close(ad);
1283             return FALSE;
1284         }
1285
1286         if_info->keysCollection = (PAirpcapKeysCollection)g_malloc(if_info->keysCollectionSize);
1287         if(!if_info->keysCollection)
1288         {
1289             if_info->keysCollectionSize = 0;
1290             if_info->keysCollection = NULL;
1291             airpcap_if_close(ad);
1292             return FALSE;
1293         }
1294
1295         airpcap_if_get_driver_keys(ad, if_info->keysCollection, &(if_info->keysCollectionSize));
1296         return TRUE;
1297     }
1298
1299     airpcap_if_close(ad);
1300     return FALSE;
1301 }
1302
1303 /*
1304  * Function used to save the WEP keys for a selected interface
1305  */
1306 void
1307 airpcap_if_save_keys(PAirpcapHandle ad, airpcap_if_info_t *if_info)
1308 {
1309     if(!if_info || !AirpcapLoaded) return;
1310
1311     if(if_info->keysCollection != NULL)
1312         g_PAirpcapSetDeviceKeys(ad,if_info->keysCollection);
1313 }
1314
1315 /*
1316  * Function used to save the WEP keys for a selected interface
1317  */
1318 void
1319 airpcap_if_save_driver_keys(PAirpcapHandle ad, airpcap_if_info_t *if_info)
1320 {
1321     if(if_info->keysCollection != NULL)
1322         airpcap_if_set_driver_keys(ad,if_info->keysCollection);
1323 }
1324
1325 /*
1326  * Callback used to free an instance of airpcap_if_info_t
1327  */
1328 static void
1329 free_airpcap_if_cb(gpointer data, gpointer user_data _U_)
1330 {
1331     airpcap_if_info_t *if_info = data;
1332
1333     if (if_info->name != NULL)
1334         g_free(if_info->name);
1335
1336     if (if_info->description != NULL)
1337         g_free(if_info->description);
1338
1339     /* XXX - FREE THE WEP KEY LIST HERE!!!*/
1340     if(if_info->keysCollection != NULL)
1341     {
1342         g_free(if_info->keysCollection);
1343         if_info->keysCollection = NULL;
1344     }
1345
1346     if(if_info->ip_addr != NULL)
1347         g_slist_free(if_info->ip_addr);
1348
1349     if(if_info != NULL)
1350         g_free(if_info);
1351 }
1352
1353 /*
1354  * Function used to free the airpcap interface list
1355  */
1356 void
1357 free_airpcap_interface_list(GList *if_list)
1358 {
1359     g_list_foreach(if_list, free_airpcap_if_cb, NULL);
1360     g_list_free(if_list);
1361     if_list = NULL;
1362 }
1363
1364 /*
1365  * This function will use the airpcap.dll to find all the airpcap devices.
1366  * Will return null if no device is found.
1367  */
1368 GList*
1369 get_airpcap_interface_list(int *err, char **err_str)
1370 {
1371     GList  *il = NULL;
1372     airpcap_if_info_t *if_info;
1373     int i, n_adapts;
1374     AirpcapDeviceDescription *devsList, *adListEntry;
1375     char errbuf[PCAP_ERRBUF_SIZE];
1376
1377     if (!AirpcapLoaded)
1378     {
1379                 *err = AIRPCAP_NOT_LOADED;
1380                 return il;
1381     }
1382
1383     if (!g_PAirpcapGetDeviceList(&devsList, errbuf))
1384     {
1385                 /* No interfaces, return il = NULL; */
1386                 *err = CANT_GET_AIRPCAP_INTERFACE_LIST;
1387                 if (err_str != NULL)
1388                         *err_str = cant_get_airpcap_if_list_error_message(errbuf);
1389                 return il;
1390     }
1391
1392     /*
1393      * Count the adapters
1394      */
1395     adListEntry = devsList;
1396     n_adapts = 0;
1397     while(adListEntry)
1398     {
1399         n_adapts++;
1400         adListEntry = adListEntry->next;
1401     }
1402
1403     if(n_adapts == 0)
1404     {
1405                 /* No interfaces, return il= NULL */
1406                 g_PAirpcapFreeDeviceList(devsList);
1407                 *err = NO_AIRPCAP_INTERFACES_FOUND;
1408                 if (err_str != NULL)
1409                         *err_str = NULL;
1410                 return il;
1411     }
1412
1413     /*
1414      * Insert the adapters in our list
1415      */
1416     adListEntry = devsList;
1417     for(i = 0; i < n_adapts; i++)
1418     {
1419                 if_info = airpcap_if_info_new(adListEntry->Name, adListEntry->Description);
1420                 if (if_info != NULL){
1421                         il = g_list_append(il, if_info);
1422                 }
1423
1424                 adListEntry = adListEntry->next;
1425     }
1426
1427     g_PAirpcapFreeDeviceList(devsList);
1428
1429     *err = 0;
1430     return il;
1431 }
1432
1433 /*
1434  * Used to retrieve the interface given the name
1435  * (the name is used in AirpcapOpen)
1436  */
1437 airpcap_if_info_t* get_airpcap_if_from_name(GList* if_list, const gchar* name)
1438 {
1439     unsigned int ifn;
1440     GList* curr;
1441     airpcap_if_info_t* if_info;
1442
1443     ifn = 0;
1444     if(if_list != NULL)
1445     {
1446         while( ifn < g_list_length(if_list) )
1447         {
1448             curr = g_list_nth(if_list, ifn);
1449
1450             if_info = NULL;
1451             if(curr != NULL)
1452                     if_info = curr->data;
1453             if(if_info != NULL)
1454             {
1455                 if ( g_ascii_strcasecmp(if_info->name,name) == 0
1456 #ifdef HAVE_PCAP_REMOTE /* The interface will be prepended with "rpcap://" */
1457                         || g_str_has_suffix(name, if_info->name)
1458 #endif
1459                         )
1460                 {
1461                     return if_info;
1462                 }
1463             }
1464             ifn++;
1465         }
1466     }
1467     return NULL;
1468 }
1469
1470 /*
1471  * Returns the ASCII string of a key given the key bytes
1472  */
1473 gchar*
1474 airpcap_get_key_string(AirpcapKey key)
1475 {
1476     unsigned int j = 0;
1477     unsigned int l = 0;
1478     gchar *dst,*src;
1479
1480     dst = NULL;
1481     src = NULL;
1482
1483     if(key.KeyType == AIRPDCAP_KEY_TYPE_WEP)
1484     {
1485         if(key.KeyLen != 0)
1486         {
1487             /* Allocate the string used to store the ASCII representation of the WEP key */
1488             dst = (gchar*)g_malloc(sizeof(gchar)*WEP_KEY_MAX_CHAR_SIZE + 1);
1489             /* Make sure that the first char is '\0' in order to make g_strlcat() work */
1490             dst[0]='\0';
1491
1492             for(j = 0; j < key.KeyLen; j++)
1493             {
1494                 src = g_strdup_printf("%.2x\0", key.KeyData[j]);
1495                 /*
1496                  * XXX - use g_strconcat() or GStrings instead ???
1497                  */
1498                 l = g_strlcat(dst,src,WEP_KEY_MAX_CHAR_SIZE+1);
1499             }
1500             g_free(src);
1501         }
1502     }
1503     else if(key.KeyType == AIRPDCAP_KEY_TYPE_WPA_PWD)
1504     {
1505         /* XXX - Add code here */
1506     }
1507     else if(key.KeyType == AIRPDCAP_KEY_TYPE_WPA_PMK)
1508     {
1509         /* XXX - Add code here */
1510     }
1511     else
1512     {
1513         /* XXX - Add code here */
1514     }
1515
1516     return dst;
1517 }
1518
1519 /*
1520  * Clear keys and decryption status for the specified interface
1521  */
1522 void
1523 airpcap_if_clear_decryption_settings(airpcap_if_info_t* info_if)
1524 {
1525     if(info_if != NULL)
1526     {
1527         if(info_if->keysCollection != NULL)
1528         {
1529             g_free(info_if->keysCollection);
1530             info_if->keysCollection = NULL;
1531         }
1532
1533         info_if->keysCollectionSize = 0;
1534
1535         info_if->DecryptionOn = FALSE;
1536         info_if->saved = FALSE;
1537     }
1538 }
1539
1540 /*
1541  * Used to retrieve the two chars string from interface
1542  */
1543 gchar*
1544 airpcap_get_if_string_number(airpcap_if_info_t* if_info)
1545 {
1546     gchar* number;
1547     guint n;
1548     int a;
1549
1550     a = sscanf(if_info->name,AIRPCAP_DEVICE_NUMBER_EXTRACT_STRING,&n);
1551
1552     /* If sscanf() returned 1, it means that has read a number, so interface is not "Any"
1553      * Otherwise, check if it is the "Any" adapter...
1554      */
1555     if(a == 0)
1556     {
1557         if(g_ascii_strcasecmp(if_info->name,AIRPCAP_DEVICE_ANY_EXTRACT_STRING)!=0)
1558             number = g_strdup_printf("??");
1559         else
1560             number = g_strdup_printf(AIRPCAP_CHANNEL_ANY_NAME);
1561     }
1562     else
1563     {
1564         number = g_strdup_printf("%.2u\0",n);
1565     }
1566
1567     return number;
1568 }
1569
1570 /*
1571  * Used to retrieve the two chars string from interface
1572  */
1573 gchar*
1574 airpcap_get_if_string_number_from_description(gchar* description)
1575 {
1576     gchar* number;
1577     gchar* pointer;
1578
1579     number = (gchar*)g_malloc(sizeof(gchar)*3);
1580
1581     pointer = g_strrstr(description,"#\0");
1582
1583     number[0] = *(pointer+1);
1584     number[1] = *(pointer+2);
1585     number[2] = '\0';
1586
1587     return number;
1588 }
1589
1590 /*
1591  * Returns the default airpcap interface of a list, NULL if list is empty
1592  */
1593 airpcap_if_info_t*
1594 airpcap_get_default_if(GList* airpcap_if_list)
1595 {
1596     int ifn = 0;
1597     GList* popdown_if_list = NULL;
1598     GList* curr = NULL;
1599
1600     gchar* s;
1601     airpcap_if_info_t* if_info = NULL;
1602
1603     if(prefs.capture_device != NULL)
1604     {
1605         s = g_strdup(get_if_name(prefs.capture_device));
1606         if_info = get_airpcap_if_from_name(airpcap_if_list,g_strdup(get_if_name(prefs.capture_device)));
1607         g_free(s);
1608     }
1609     return if_info;
1610 }
1611
1612 /*
1613  * Load the configuration for the specified interface
1614  */
1615 void
1616 airpcap_load_selected_if_configuration(airpcap_if_info_t* if_info)
1617 {
1618     gchar ebuf[AIRPCAP_ERRBUF_SIZE];
1619     PAirpcapHandle ad;
1620
1621     if(if_info != NULL)
1622     {
1623         ad = airpcap_if_open(if_info->name, ebuf);
1624
1625         if(ad)
1626         {
1627             /* Stop blinking (if it was blinking!)*/
1628             if(if_info->blinking)
1629             {
1630                 /* Turn on the light (if it was off) */
1631                 if(!(if_info->led)) airpcap_if_turn_led_on(ad, 0);
1632             }
1633
1634             /* Apply settings... */
1635             airpcap_if_get_device_channel_ex(ad,&(if_info->channelInfo));
1636             airpcap_if_get_fcs_validation(ad,&(if_info->CrcValidationOn));
1637             airpcap_if_get_fcs_presence(ad,&(if_info->IsFcsPresent));
1638             airpcap_if_get_link_type(ad,&(if_info->linkType));
1639             airpcap_if_get_decryption_state(ad, &(if_info->DecryptionOn));
1640             /* get the keys, if everything is ok, close the adapter */
1641             if(airpcap_if_load_keys(ad,if_info))
1642                 airpcap_if_close(ad);
1643
1644             if_info->saved = TRUE;
1645         }
1646         else
1647         {
1648             simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, " Error in opening adapter for %s",if_info->description);
1649         }
1650     }
1651 }
1652
1653 /*
1654  * Save the configuration for the specified interface
1655  */
1656 void
1657 airpcap_save_selected_if_configuration(airpcap_if_info_t* if_info)
1658 {
1659     gchar ebuf[AIRPCAP_ERRBUF_SIZE];
1660     PAirpcapHandle ad;
1661
1662     if(if_info != NULL)
1663     {
1664         ad = airpcap_if_open(if_info->name, ebuf);
1665
1666         if(ad)
1667         {
1668             /* Stop blinking (if it was blinking!)*/
1669             if(if_info->blinking)
1670             {
1671                 /* Turn on the light (if it was off) */
1672                 if(!(if_info->led)) airpcap_if_turn_led_on(ad, 0);
1673             }
1674
1675             /* Apply settings... */
1676             airpcap_if_set_device_channel_ex(ad,if_info->channelInfo);
1677             airpcap_if_set_fcs_validation(ad,if_info->CrcValidationOn);
1678             airpcap_if_set_fcs_presence(ad,if_info->IsFcsPresent);
1679             airpcap_if_set_link_type(ad,if_info->linkType);
1680             airpcap_if_set_decryption_state(ad, if_info->DecryptionOn);
1681             airpcap_if_save_keys(ad,if_info);
1682
1683             /* ... and save them */
1684             if(!airpcap_if_store_cur_config_as_adapter_default(ad))
1685             {
1686                 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "Cannot save Wireless 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.");
1687                 if_info->saved = FALSE;
1688                 airpcap_if_close(ad);
1689                 return;
1690             }
1691
1692             if_info->saved = TRUE;
1693             airpcap_if_close(ad);
1694         }
1695         else
1696         {
1697             simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, " Error in opening adapter for %s",if_info->description);
1698         }
1699     }
1700 }
1701
1702 /*
1703  * Save the configuration for the specified interface
1704  */
1705 void
1706 airpcap_save_driver_if_configuration(airpcap_if_info_t* fake_if_info)
1707 {
1708     gchar ebuf[AIRPCAP_ERRBUF_SIZE];
1709     PAirpcapHandle ad;
1710
1711     if(fake_if_info != NULL)
1712     {
1713         ad = airpcap_if_open(fake_if_info->name, ebuf);
1714
1715         if(ad)
1716         {
1717             /* Apply decryption settings... */
1718             airpcap_if_set_driver_decryption_state(ad, fake_if_info->DecryptionOn);
1719             airpcap_if_save_driver_keys(ad,fake_if_info);
1720             airpcap_if_close(ad);
1721         }
1722         else
1723         {
1724             simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, " Error in opening adapter for %s",fake_if_info->description);
1725         }
1726     }
1727
1728     return;
1729 }
1730
1731 /*
1732  * DECRYPTION KEYS FUNCTIONS
1733  */
1734 /*
1735  * This function is used for DEBUG POURPOSES ONLY!!!
1736  */
1737 void
1738 print_key_list(GList* key_list)
1739 {
1740     gint n,i;
1741     decryption_key_t* tmp;
1742
1743     if(key_list == NULL)
1744     {
1745         g_print("\n\n******* KEY LIST NULL *******\n\n");
1746         return;
1747     }
1748
1749     n = g_list_length(key_list);
1750
1751     g_print("\n\n********* KEY LIST **********\n\n");
1752
1753     g_print("NUMBER OF KEYS IN LIST : %d\n\n",n);
1754
1755     for(i =0; i < n; i++)
1756     {
1757         g_print("[%d] :\n",i+1);
1758         tmp = (decryption_key_t*)(g_list_nth_data(key_list,i));
1759         g_print("KEY : %s\n",tmp->key->str);
1760
1761         g_print("BITS: %d\n",tmp->bits);
1762
1763         if(tmp->type == AIRPDCAP_KEY_TYPE_WEP)
1764             g_print("TYPE: %s\n",AIRPCAP_WEP_KEY_STRING);
1765         else if(tmp->type == AIRPDCAP_KEY_TYPE_WPA_PWD)
1766             g_print("TYPE: %s\n",AIRPCAP_WPA_PWD_KEY_STRING);
1767         else if(tmp->type == AIRPDCAP_KEY_TYPE_WPA_PMK)
1768             g_print("TYPE: %s\n",AIRPCAP_WPA_BIN_KEY_STRING);
1769         else
1770             g_print("TYPE: %s\n","???");
1771
1772         g_print("SSID: %s\n",(tmp->ssid != NULL) ?
1773                 format_text((guchar *)tmp->ssid->data, tmp->ssid->len) : "---");
1774         g_print("\n");
1775     }
1776
1777     g_print("\n*****************************\n\n");
1778 }
1779
1780 /*
1781  * Retrieves a GList of decryption_key_t structures containing infos about the
1782  * keys for the given adapter... returns NULL if no keys are found.
1783  */
1784 GList*
1785 get_airpcap_device_keys(airpcap_if_info_t* info_if)
1786 {
1787     /* tmp vars */
1788     char* tmp_key = NULL;
1789     guint i,keys_in_list = 0;
1790
1791     /* real vars*/
1792     decryption_key_t *new_key  = NULL;
1793     GList            *key_list = NULL;
1794
1795     /* Number of keys in key list */
1796     if(info_if->keysCollectionSize != 0)
1797         keys_in_list = (guint)(info_if->keysCollectionSize -  sizeof(AirpcapKeysCollection))/sizeof(AirpcapKey);
1798     else
1799         keys_in_list = 0;
1800
1801     for(i=0; i<keys_in_list; i++)
1802     {
1803         /* Different things to do depending on the key type  */
1804         if(info_if->keysCollection->Keys[i].KeyType == AIRPDCAP_KEY_TYPE_WEP)
1805         {
1806             /* allocate memory for the new key item */
1807             new_key = (decryption_key_t*)g_malloc(sizeof(decryption_key_t));
1808
1809             /* fill the fields */
1810             /* KEY */
1811             tmp_key = airpcap_get_key_string(info_if->keysCollection->Keys[i]);
1812             new_key->key = g_string_new(tmp_key);
1813             g_free(tmp_key);
1814
1815             /* BITS */
1816             new_key->bits = new_key->key->len *4; /* every char is 4 bits in WEP keys (it is an hexadecimal number) */
1817
1818             /* SSID not used in WEP keys */
1819             new_key->ssid = NULL;
1820
1821             /* TYPE (WEP in this case) */
1822             new_key->type = info_if->keysCollection->Keys[i].KeyType;
1823
1824             /* Append the new element in the list */
1825             key_list = g_list_append(key_list,(gpointer)new_key);
1826         }
1827         else if(info_if->keysCollection->Keys[i].KeyType == AIRPDCAP_KEY_TYPE_WPA_PWD)
1828         {
1829             /* XXX - Not supported yet */
1830         }
1831         else if(info_if->keysCollection->Keys[i].KeyType == AIRPDCAP_KEY_TYPE_WPA_PMK)
1832         {
1833             /* XXX - Not supported yet */
1834         }
1835     }
1836
1837     return key_list;
1838 }
1839
1840 /*
1841  * Retrieves a GList of decryption_key_t structures containing infos about the
1842  * keys for the global AirPcap driver... returns NULL if no keys are found.
1843  */
1844 GList*
1845 get_airpcap_driver_keys()
1846 {
1847     /* tmp vars */
1848     char* tmp_key = NULL;
1849     guint i,keys_in_list = 0;
1850
1851     /* real vars*/
1852     decryption_key_t *new_key  = NULL;
1853     GList            *key_list = NULL;
1854
1855     /*
1856      * To read the drivers general settings we need to create and use one airpcap adapter...
1857      * The only way to do that is to instantiate a fake adapter, and then close it and delete it.
1858      */
1859     airpcap_if_info_t* fake_info_if = NULL;
1860
1861     /* Create the fake_info_if from the first adapter of the list */
1862     fake_info_if = airpcap_driver_fake_if_info_new();
1863
1864     if(fake_info_if == NULL)
1865         return NULL;
1866
1867     /* Number of keys in key list */
1868     if(fake_info_if->keysCollectionSize != 0)
1869         keys_in_list = (guint)(fake_info_if->keysCollectionSize -  sizeof(AirpcapKeysCollection))/sizeof(AirpcapKey);
1870     else
1871         keys_in_list = 0;
1872
1873     for(i=0; i<keys_in_list; i++)
1874     {
1875         /* Different things to do depending on the key type  */
1876         if(fake_info_if->keysCollection->Keys[i].KeyType == AIRPDCAP_KEY_TYPE_WEP)
1877         {
1878             /* allocate memory for the new key item */
1879             new_key = (decryption_key_t*)g_malloc(sizeof(decryption_key_t));
1880
1881             /* fill the fields */
1882             /* KEY */
1883             tmp_key = airpcap_get_key_string(fake_info_if->keysCollection->Keys[i]);
1884             new_key->key = g_string_new(tmp_key);
1885             if(tmp_key != NULL) g_free(tmp_key);
1886
1887             /* BITS */
1888             new_key->bits = new_key->key->len *4; /* every char is 4 bits in WEP keys (it is an hexadecimal number) */
1889
1890             /* SSID not used in WEP keys */
1891             new_key->ssid = NULL;
1892
1893             /* TYPE (WEP in this case) */
1894             new_key->type = fake_info_if->keysCollection->Keys[i].KeyType;
1895
1896             /* Append the new element in the list */
1897             key_list = g_list_append(key_list,(gpointer)new_key);
1898         }
1899         else if(fake_info_if->keysCollection->Keys[i].KeyType == AIRPDCAP_KEY_TYPE_WPA_PWD)
1900         {
1901             /* XXX - Not supported yet */
1902         }
1903         else if(fake_info_if->keysCollection->Keys[i].KeyType == AIRPDCAP_KEY_TYPE_WPA_PMK)
1904         {
1905             /* XXX - Not supported yet */
1906         }
1907     }
1908
1909     airpcap_if_info_free(fake_info_if);
1910
1911     return key_list;
1912 }
1913
1914 /*
1915  * Returns the list of the decryption keys specified for wireshark, NULL if
1916  * no key is found
1917  */
1918 GList*
1919 get_wireshark_keys()
1920 {
1921     keys_cb_data_t* wep_user_data = NULL;
1922
1923     gchar *tmp = NULL;
1924
1925     GList* final_list = NULL;
1926     GList* wep_final_list = NULL;
1927
1928     /* Retrieve the wlan preferences */
1929     wlan_prefs = prefs_find_module("wlan");
1930
1931     /* Allocate a structure used to keep infos  between the callbacks */
1932     wep_user_data = (keys_cb_data_t*)g_malloc(sizeof(keys_cb_data_t));
1933
1934     /* Fill the structure */
1935     wep_user_data->list = NULL;
1936     wep_user_data->current_index = 0;
1937     wep_user_data->number_of_keys= 0; /* Still unknown */
1938
1939     /* Run the callback on each 802.11 preference */
1940     /* XXX - Right now, only WEP keys will be loaded */
1941     prefs_pref_foreach(wlan_prefs, get_wep_key, (gpointer)wep_user_data);
1942
1943     /* Copy the list field in the user data structure pointer into the final_list */
1944     if(wep_user_data != NULL)  wep_final_list  = wep_user_data->list;
1945
1946     /* XXX - Merge the three lists!!!!! */
1947     final_list = wep_final_list;
1948
1949     /* free the wep_user_data structure */
1950     g_free(wep_user_data);
1951
1952     return final_list;
1953 }
1954
1955 /*
1956  * Merges two lists of keys and return a newly created GList. If a key is
1957  * found multiple times, it will just appear once!
1958  * list1 and list 2 pointer will have to be freed manually if needed!!!
1959  * If the total number of keys exceeeds the maximum number allowed,
1960  * exceeding keys will be discarded...
1961  */
1962 GList*
1963 merge_key_list(GList* list1, GList* list2)
1964 {
1965     guint n1=0,n2=0;
1966     guint i;
1967     decryption_key_t *dk1=NULL,
1968                       *dk2=NULL,
1969                       *new_dk=NULL;
1970
1971     GList* merged_list = NULL;
1972
1973     if( (list1 == NULL) && (list2 == NULL) )
1974         return NULL;
1975
1976     if(list1 == NULL)
1977     {
1978         n1 = 0;
1979         n2 = g_list_length(list2);
1980
1981         for(i=0;i<n2;i++)
1982         {
1983             new_dk = (decryption_key_t*)g_malloc(sizeof(decryption_key_t));
1984             dk2 = (decryption_key_t *)g_list_nth_data(list2,i);
1985
1986             new_dk->bits = dk2->bits;
1987             new_dk->type = dk2->type;
1988             new_dk->key  = g_string_new(dk2->key->str);
1989             new_dk->ssid = byte_array_dup(dk2->ssid);
1990
1991             /* Check the total length of the merged list */
1992             if(g_list_length(merged_list) < MAX_ENCRYPTION_KEYS)
1993                 merged_list = g_list_append(merged_list,(gpointer)new_dk);
1994         }
1995     }
1996     else if(list2 == NULL)
1997     {
1998         n1 = g_list_length(list1);
1999         n2 = 0;
2000
2001         for(i=0;i<n1;i++)
2002         {
2003             new_dk = (decryption_key_t*)g_malloc(sizeof(decryption_key_t));
2004             dk1 = (decryption_key_t*)g_list_nth_data(list1,i);
2005
2006             new_dk->bits = dk1->bits;
2007             new_dk->type = dk1->type;
2008             new_dk->key  = g_string_new(dk1->key->str);
2009             new_dk->ssid = byte_array_dup(dk1->ssid);
2010
2011             /* Check the total length of the merged list */
2012             if(g_list_length(merged_list) < MAX_ENCRYPTION_KEYS)
2013                 merged_list = g_list_append(merged_list,(gpointer)new_dk);
2014         }
2015     }
2016     else
2017     {
2018         n1 = g_list_length(list1);
2019         n2 = g_list_length(list2);
2020
2021         /* Copy the whole list1 into merged_list */
2022         for(i=0;i<n1;i++)
2023         {
2024             new_dk = (decryption_key_t*)g_malloc(sizeof(decryption_key_t));
2025             dk1 = (decryption_key_t *)g_list_nth_data(list1,i);
2026
2027             new_dk->bits = dk1->bits;
2028             new_dk->type = dk1->type;
2029             new_dk->key  = g_string_new(dk1->key->str);
2030             new_dk->ssid = byte_array_dup(dk1->ssid);
2031
2032             /* Check the total length of the merged list */
2033             if(g_list_length(merged_list) < MAX_ENCRYPTION_KEYS)
2034                 merged_list = g_list_append(merged_list,(gpointer)new_dk);
2035         }
2036
2037         /* Look for keys that are present in list2 but aren't in list1 yet...
2038          * Add them to merged_list
2039          */
2040         for(i=0;i<n2;i++)
2041         {
2042             dk2 = (decryption_key_t *)g_list_nth_data(list2,i);
2043
2044             if(!key_is_in_list(dk2,merged_list))
2045             {
2046                 new_dk = (decryption_key_t*)g_malloc(sizeof(decryption_key_t));
2047
2048                 new_dk->bits = dk2->bits;
2049                 new_dk->type = dk2->type;
2050                 new_dk->key  = g_string_new(dk2->key->str);
2051                 new_dk->ssid = byte_array_dup(dk2->ssid);
2052
2053                 /* Check the total length of the merged list */
2054                 if(g_list_length(merged_list) < MAX_ENCRYPTION_KEYS)
2055                     merged_list = g_list_append(merged_list,(gpointer)new_dk);
2056             }
2057         }
2058     }
2059
2060     return merged_list;
2061 }
2062
2063 /*
2064  * Use this function to free a key list.
2065  */
2066 void
2067 free_key_list(GList *list)
2068 {
2069     guint i,n;
2070     decryption_key_t *curr_key;
2071
2072     if(list == NULL)
2073         return;
2074
2075     n = g_list_length(list);
2076
2077     for(i = 0; i < n; i++)
2078     {
2079         curr_key = (decryption_key_t*)g_list_nth_data(list,i);
2080
2081         /* Free all the strings */
2082         if(curr_key->key != NULL)
2083             g_string_free(curr_key->key, TRUE);
2084
2085         if(curr_key->ssid != NULL)
2086         g_byte_array_free(curr_key->ssid, TRUE);
2087
2088         /* free the decryption_key_t structure*/
2089         g_free(curr_key);
2090         curr_key = NULL;
2091     }
2092
2093     /* Free the list */
2094     g_list_free(list);
2095
2096     return;
2097 }
2098
2099
2100 /*
2101  * If the given key is contained in the list, returns TRUE.
2102  * Returns FALSE otherwise.
2103  */
2104 gboolean
2105 key_is_in_list(decryption_key_t *dk,GList *list)
2106 {
2107     guint i,n;
2108     decryption_key_t* curr_key = NULL;
2109     gboolean found = FALSE;
2110
2111     if( (list == NULL) || (dk == NULL) )
2112         return FALSE;
2113
2114     n = g_list_length(list);
2115
2116     if(n < 1)
2117         return FALSE;
2118
2119     for(i = 0; i < n; i++)
2120     {
2121         curr_key = (decryption_key_t*)g_list_nth_data(list,i);
2122         if(keys_are_equals(dk,curr_key))
2123             found = TRUE;
2124     }
2125
2126     return found;
2127 }
2128
2129 /*
2130  * Returns TRUE if keys are equals, FALSE otherwise
2131  */
2132 gboolean
2133 keys_are_equals(decryption_key_t *k1,decryption_key_t *k2)
2134 {
2135
2136     if((k1==NULL) || (k2==NULL))
2137         return FALSE;
2138
2139     /* XXX - Remove this check when we will have the WPA/WPA2 decryption in the Driver! */
2140     /** if( (k1->type == AIRPDCAP_KEY_TYPE_WPA_PWD) || (k2->type == AIRPDCAP_KEY_TYPE_WPA_PWD) || (k1->type == AIRPDCAP_KEY_TYPE_WPA_PMK) || (k2->type == AIRPDCAP_KEY_TYPE_WPA_PMK) ) **/
2141     /**         return TRUE;  **/
2142
2143     if( g_string_equal(k1->key,k2->key) &&
2144         (k1->bits == k2->bits) && /* If the previous is TRUE, this must be TRUE as well */
2145         k1->type == k2->type)
2146     {
2147         /* Check the ssid... if the key type is WEP, the two fields should be NULL */
2148         if((k1->ssid == NULL) && (k2->ssid == NULL))
2149             return TRUE;
2150
2151         /* If they are not null, they must share the same ssid */
2152         return byte_array_equal(k1->ssid,k2->ssid);
2153     }
2154
2155     /* Some field is not equal ... */
2156     return FALSE;
2157 }
2158
2159 /*
2160  * Tests if two collection of keys are equal or not, to be considered equals, they have to
2161  * contain the same keys in the SAME ORDER! (If both lists are NULL, which means empty will
2162  * return TRUE)
2163  */
2164 gboolean
2165 key_lists_are_equal(GList* list1, GList* list2)
2166 {
2167     guint n1=0,n2=0;
2168     /* XXX - Remove */
2169     guint wep_n1=0,wep_n2=0;
2170     GList *wep_list1=NULL;
2171     GList *wep_list2=NULL;
2172     /* XXX - END*/
2173     guint i/*,j*/;
2174     decryption_key_t *dk1=NULL,*dk2=NULL;
2175
2176     n1 = g_list_length(list1);
2177     n2 = g_list_length(list2);
2178
2179     /*
2180      * XXX - START : Retrieve the aublists of WEP keys!!! This is needed only 'till Driver WPA decryption
2181      * is implemented.
2182      */
2183     for(i=0;i<n1;i++)
2184     {
2185         dk1=(decryption_key_t*)g_list_nth_data(list1,i);
2186         if(dk1->type == AIRPDCAP_KEY_TYPE_WEP)
2187         {
2188             wep_list1 = g_list_append(wep_list1,(gpointer)dk1);
2189             wep_n1++;
2190         }
2191     }
2192     for(i=0;i<n2;i++)
2193     {
2194         dk2=(decryption_key_t*)g_list_nth_data(list2,i);
2195         if(dk2->type == AIRPDCAP_KEY_TYPE_WEP)
2196         {
2197             wep_list2 = g_list_append(wep_list2,(gpointer)dk2);
2198             wep_n2++;
2199         }
2200     }
2201
2202     /*
2203      * XXX - END : Remove from START to END when the WPA/WPA2 decryption will be implemented in
2204      * the Driver
2205      */
2206
2207     /*
2208      * Commented, because in the new AirPcap version all the keys will be saved
2209      * into the driver, and all the keys for every specific adapter will be
2210      * removed. This means that this check will always fail... and the user will
2211      * always be asked what to do... and it doesn't make much sense.
2212      */
2213     /* if(n1 != n2) return FALSE; */
2214     if(wep_n1 != wep_n2) return FALSE;
2215
2216     n1 = wep_n1;
2217     n2 = wep_n2;
2218
2219     /*for(i=0;i<n1;i++)
2220     {
2221     dk1=(decryption_key_t*)g_list_nth_data(list1,i);
2222     dk2=(decryption_key_t*)g_list_nth_data(list2,i);
2223
2224     if(!g_string_equal(dk1->key,dk2->key)) return FALSE;
2225     }*/
2226     for(i=0;i<n2;i++)
2227     {
2228         dk2=(decryption_key_t*)g_list_nth_data(wep_list2,i);
2229         if(!key_is_in_list(dk2,wep_list1)) return FALSE;
2230     }
2231
2232     return TRUE;
2233 }
2234
2235 static guint
2236 test_if_on(pref_t *pref, gpointer ud)
2237 {
2238     gboolean *is_on;
2239     gboolean number;
2240
2241     /* Retrieve user data info */
2242     is_on = (gboolean*)ud;
2243
2244
2245     if (g_ascii_strncasecmp(pref->name, "enable_decryption", 17) == 0 && pref->type == PREF_BOOL)
2246     {
2247         number = *pref->varp.boolp;
2248
2249         if(number) *is_on = TRUE;
2250         else *is_on = FALSE;
2251
2252         return 1;
2253     }
2254     return 0;
2255 }
2256
2257 /*
2258  * Returns TRUE if the Wireshark decryption is active, false otherwise
2259  */
2260 gboolean
2261 wireshark_decryption_on()
2262 {
2263     gboolean is_on;
2264
2265     /* Retrieve the wlan preferences */
2266     wlan_prefs = prefs_find_module("wlan");
2267
2268     /* Run the callback on each 802.11 preference */
2269     prefs_pref_foreach(wlan_prefs, test_if_on, (gpointer)&is_on);
2270
2271     return is_on;
2272 }
2273
2274 /*
2275  * Returns TRUE if the AirPcap decryption for the current adapter is active, false otherwise
2276  */
2277 gboolean
2278 airpcap_decryption_on()
2279 {
2280     gboolean is_on = FALSE;
2281
2282     airpcap_if_info_t* fake_if_info = NULL;
2283
2284     fake_if_info = airpcap_driver_fake_if_info_new();
2285
2286     if(fake_if_info != NULL)
2287     {
2288         if(fake_if_info->DecryptionOn == AIRPCAP_DECRYPTION_ON)
2289             is_on = TRUE;
2290         else if(fake_if_info->DecryptionOn == AIRPCAP_DECRYPTION_OFF)
2291             is_on = FALSE;
2292     }
2293
2294     airpcap_if_info_free(fake_if_info);
2295
2296     return is_on;
2297 }
2298
2299 /*
2300  * Free an instance of airpcap_if_info_t
2301  */
2302 void
2303 airpcap_if_info_free(airpcap_if_info_t *if_info)
2304 {
2305     if(if_info != NULL)
2306     {
2307         if (if_info->name != NULL)
2308             g_free(if_info->name);
2309
2310         if (if_info->description != NULL)
2311             g_free(if_info->description);
2312
2313         if(if_info->keysCollection != NULL)
2314         {
2315             g_free(if_info->keysCollection);
2316             if_info->keysCollection = NULL;
2317         }
2318
2319         if(if_info->ip_addr != NULL)
2320         {
2321             g_slist_free(if_info->ip_addr);
2322             if_info->ip_addr = NULL;
2323         }
2324
2325         if(if_info != NULL)
2326         {
2327             g_free(if_info);
2328             if_info = NULL;
2329         }
2330     }
2331 }
2332
2333 static guint
2334 set_on_off(pref_t *pref, gpointer ud)
2335 {
2336     gboolean *is_on;
2337     gboolean number;
2338
2339     /* Retrieve user data info */
2340     is_on = (gboolean*)ud;
2341
2342     if (g_ascii_strncasecmp(pref->name, "enable_decryption", 17) == 0 && pref->type == PREF_BOOL)
2343     {
2344         number = *pref->varp.boolp;
2345
2346         g_free((void *)*pref->varp.boolp);
2347         if(*is_on)
2348             *pref->varp.boolp = TRUE;
2349         else
2350             *pref->varp.boolp = FALSE;
2351
2352         return 1;
2353     }
2354     return 0;
2355 }
2356
2357 /*
2358  * Enables decryption for Wireshark if on_off is TRUE, disables it otherwise.
2359  */
2360 void
2361 set_wireshark_decryption(gboolean on_off)
2362 {
2363     gboolean is_on;
2364
2365     is_on = on_off;
2366
2367     /* Retrieve the wlan preferences */
2368     wlan_prefs = prefs_find_module("wlan");
2369
2370     /* Run the callback on each 802.11 preference */
2371     prefs_pref_foreach(wlan_prefs, set_on_off, (gpointer)&is_on);
2372
2373     /*
2374      * Signal that we've changed things, and run the 802.11 dissector's
2375      * callback
2376      */
2377     wlan_prefs->prefs_changed = TRUE;
2378
2379     prefs_apply(wlan_prefs);
2380 }
2381
2382 /*
2383  * Enables decryption for all the adapters if on_off is TRUE, disables it otherwise.
2384  */
2385 gboolean
2386 set_airpcap_decryption(gboolean on_off)
2387 {
2388     /* We need to directly access the .dll functions here... */
2389     gchar ebuf[AIRPCAP_ERRBUF_SIZE];
2390     PAirpcapHandle ad,ad_driver;
2391
2392     gboolean success = TRUE;
2393
2394     gint n = 0;
2395     gint i = 0;
2396     airpcap_if_info_t* curr_if = NULL;
2397     airpcap_if_info_t* fake_if_info = NULL;
2398
2399     fake_if_info = airpcap_driver_fake_if_info_new();
2400
2401     if(fake_if_info == NULL)
2402         /* We apparently don't have any adapters installed.
2403          * This isn't a failure, so return TRUE
2404          */
2405         return TRUE;
2406
2407         /* Set the driver decryption */
2408         ad_driver = airpcap_if_open(fake_if_info->name, ebuf);
2409         if(ad_driver)
2410         {
2411             if(on_off)
2412                 airpcap_if_set_driver_decryption_state(ad_driver,AIRPCAP_DECRYPTION_ON);
2413             else
2414                 airpcap_if_set_driver_decryption_state(ad_driver,AIRPCAP_DECRYPTION_OFF);
2415
2416             airpcap_if_close(ad_driver);
2417         }
2418
2419         airpcap_if_info_free(fake_if_info);
2420
2421         n = g_list_length(airpcap_if_list);
2422
2423         /* Set to FALSE the decryption for all the adapters */
2424         /* Apply this change to all the adapters !!! */
2425         for(i = 0; i < n; i++)
2426         {
2427             curr_if = (airpcap_if_info_t*)g_list_nth_data(airpcap_if_list,i);
2428
2429             if( curr_if != NULL )
2430             {
2431                 ad = airpcap_if_open(curr_if->name, ebuf);
2432                 if(ad)
2433                 {
2434                     curr_if->DecryptionOn = (gboolean)AIRPCAP_DECRYPTION_OFF;
2435                     airpcap_if_set_decryption_state(ad,curr_if->DecryptionOn);
2436                     /* Save configuration for the curr_if */
2437                     if(!airpcap_if_store_cur_config_as_adapter_default(ad))
2438                     {
2439                         success = FALSE;
2440                     }
2441                     airpcap_if_close(ad);
2442                 }
2443             }
2444         }
2445
2446         return success;
2447 }
2448
2449
2450 /* DYNAMIC LIBRARY LOADER */
2451 /*
2452  *  Used to dynamically load the airpcap library in order link it only when
2453  *  it's present on the system
2454  */
2455 int load_airpcap(void)
2456 {
2457     BOOL base_functions = TRUE;
2458     BOOL eleven_n_functions = TRUE;
2459
2460     if((AirpcapLib =  LoadLibrary(TEXT("airpcap.dll"))) == NULL)
2461     {
2462                 /* Report the error but go on */
2463                 AirpcapVersion = AIRPCAP_DLL_NOT_FOUND;
2464                 return AirpcapVersion;
2465     }
2466     else
2467     {
2468                 if((g_PAirpcapGetLastError = (AirpcapGetLastErrorHandler) GetProcAddress(AirpcapLib, "AirpcapGetLastError")) == NULL) base_functions = FALSE;
2469                 if((g_PAirpcapGetDeviceList = (AirpcapGetDeviceListHandler) GetProcAddress(AirpcapLib, "AirpcapGetDeviceList")) == NULL) base_functions = FALSE;
2470                 if((g_PAirpcapFreeDeviceList = (AirpcapFreeDeviceListHandler) GetProcAddress(AirpcapLib, "AirpcapFreeDeviceList")) == NULL) base_functions = FALSE;
2471                 if((g_PAirpcapOpen = (AirpcapOpenHandler) GetProcAddress(AirpcapLib, "AirpcapOpen")) == NULL) base_functions = FALSE;
2472                 if((g_PAirpcapClose = (AirpcapCloseHandler) GetProcAddress(AirpcapLib, "AirpcapClose")) == NULL) base_functions = FALSE;
2473                 if((g_PAirpcapGetLinkType = (AirpcapGetLinkTypeHandler) GetProcAddress(AirpcapLib, "AirpcapGetLinkType")) == NULL) base_functions = FALSE;
2474                 if((g_PAirpcapSetLinkType = (AirpcapSetLinkTypeHandler) GetProcAddress(AirpcapLib, "AirpcapSetLinkType")) == NULL) base_functions = FALSE;
2475                 if((g_PAirpcapSetKernelBuffer = (AirpcapSetKernelBufferHandler) GetProcAddress(AirpcapLib, "AirpcapSetKernelBuffer")) == NULL) base_functions = FALSE;
2476                 if((g_PAirpcapSetFilter = (AirpcapSetFilterHandler) GetProcAddress(AirpcapLib, "AirpcapSetFilter")) == NULL) base_functions = FALSE;
2477                 if((g_PAirpcapGetMacAddress = (AirpcapGetMacAddressHandler) GetProcAddress(AirpcapLib, "AirpcapGetMacAddress")) == NULL) base_functions = FALSE;
2478                 if((g_PAirpcapSetMinToCopy = (AirpcapSetMinToCopyHandler) GetProcAddress(AirpcapLib, "AirpcapSetMinToCopy")) == NULL) base_functions = FALSE;
2479                 if((g_PAirpcapGetReadEvent = (AirpcapGetReadEventHandler) GetProcAddress(AirpcapLib, "AirpcapGetReadEvent")) == NULL) base_functions = FALSE;
2480                 if((g_PAirpcapRead = (AirpcapReadHandler) GetProcAddress(AirpcapLib, "AirpcapRead")) == NULL) base_functions = FALSE;
2481                 if((g_PAirpcapGetStats = (AirpcapGetStatsHandler) GetProcAddress(AirpcapLib, "AirpcapGetStats")) == NULL) base_functions = FALSE;
2482                 if((g_PAirpcapTurnLedOn = (AirpcapTurnLedOnHandler) GetProcAddress(AirpcapLib, "AirpcapTurnLedOn")) == NULL) base_functions = FALSE;
2483                 if((g_PAirpcapTurnLedOff = (AirpcapTurnLedOffHandler) GetProcAddress(AirpcapLib, "AirpcapTurnLedOff")) == NULL) base_functions = FALSE;
2484                 if((g_PAirpcapGetDeviceChannel = (AirpcapGetDeviceChannelHandler) GetProcAddress(AirpcapLib, "AirpcapGetDeviceChannel")) == NULL) base_functions = FALSE;
2485                 if((g_PAirpcapSetDeviceChannel = (AirpcapSetDeviceChannelHandler) GetProcAddress(AirpcapLib, "AirpcapSetDeviceChannel")) == NULL) base_functions = FALSE;
2486                 if((g_PAirpcapGetFcsPresence = (AirpcapGetFcsPresenceHandler) GetProcAddress(AirpcapLib, "AirpcapGetFcsPresence")) == NULL) base_functions = FALSE;
2487                 if((g_PAirpcapSetFcsPresence = (AirpcapSetFcsPresenceHandler) GetProcAddress(AirpcapLib, "AirpcapSetFcsPresence")) == NULL) base_functions = FALSE;
2488                 if((g_PAirpcapGetFcsValidation = (AirpcapGetFcsValidationHandler) GetProcAddress(AirpcapLib, "AirpcapGetFcsValidation")) == NULL) base_functions = FALSE;
2489                 if((g_PAirpcapSetFcsValidation = (AirpcapSetFcsValidationHandler) GetProcAddress(AirpcapLib, "AirpcapSetFcsValidation")) == NULL) base_functions = FALSE;
2490                 if((g_PAirpcapGetDeviceKeys = (AirpcapGetDeviceKeysHandler) GetProcAddress(AirpcapLib, "AirpcapGetDeviceKeys")) == NULL) base_functions = FALSE;
2491                 if((g_PAirpcapSetDeviceKeys = (AirpcapSetDeviceKeysHandler) GetProcAddress(AirpcapLib, "AirpcapSetDeviceKeys")) == NULL) base_functions = FALSE;
2492                 if((g_PAirpcapGetDecryptionState = (AirpcapGetDecryptionStateHandler) GetProcAddress(AirpcapLib, "AirpcapGetDecryptionState")) == NULL) base_functions = FALSE;
2493                 if((g_PAirpcapSetDecryptionState = (AirpcapSetDecryptionStateHandler) GetProcAddress(AirpcapLib, "AirpcapSetDecryptionState")) == NULL) base_functions = FALSE;
2494                 if((g_PAirpcapStoreCurConfigAsAdapterDefault = (AirpcapStoreCurConfigAsAdapterDefaultHandler) GetProcAddress(AirpcapLib, "AirpcapStoreCurConfigAsAdapterDefault")) == NULL) base_functions = FALSE;
2495                 if((g_PAirpcapGetVersion = (AirpcapGetVersionHandler) GetProcAddress(AirpcapLib, "AirpcapGetVersion")) == NULL) base_functions = FALSE;
2496                 if((g_PAirpcapGetDriverDecryptionState = (AirpcapGetDriverDecryptionStateHandler) GetProcAddress(AirpcapLib, "AirpcapGetDriverDecryptionState")) == NULL) base_functions = FALSE;
2497                 if((g_PAirpcapSetDriverDecryptionState = (AirpcapSetDriverDecryptionStateHandler) GetProcAddress(AirpcapLib, "AirpcapSetDriverDecryptionState")) == NULL) base_functions = FALSE;
2498                 if((g_PAirpcapGetDriverKeys = (AirpcapGetDriverKeysHandler) GetProcAddress(AirpcapLib, "AirpcapGetDriverKeys")) == NULL) base_functions = FALSE;
2499                 if((g_PAirpcapSetDriverKeys = (AirpcapSetDriverKeysHandler) GetProcAddress(AirpcapLib, "AirpcapSetDriverKeys")) == NULL) base_functions = FALSE;
2500
2501                 /* TEST IF AIRPCAP SUPPORTS 11N */
2502                 if((g_PAirpcapSetDeviceChannelEx = (AirpcapSetDeviceChannelExHandler) GetProcAddress(AirpcapLib, "AirpcapSetDeviceChannelEx")) == NULL) eleven_n_functions = FALSE;
2503                 if((g_PAirpcapGetDeviceChannelEx = (AirpcapGetDeviceChannelExHandler) GetProcAddress(AirpcapLib, "AirpcapGetDeviceChannelEx")) == NULL) eleven_n_functions = FALSE;
2504                 if((g_PAirpcapGetDeviceSupportedChannels = (AirpcapGetDeviceSupportedChannelsHandler) GetProcAddress(AirpcapLib, "AirpcapGetDeviceSupportedChannels")) == NULL) eleven_n_functions = FALSE;
2505
2506                 if(base_functions && eleven_n_functions){
2507                         AirpcapLoaded = TRUE;
2508                         AirpcapVersion = AIRPCAP_DLL_OK;
2509                 }else if(base_functions){
2510                         AirpcapLoaded = TRUE;
2511                         AirpcapVersion = AIRPCAP_DLL_OLD;
2512                         return AIRPCAP_DLL_OK;
2513                 }else{
2514                         AirpcapLoaded = FALSE;
2515                         AirpcapVersion = AIRPCAP_DLL_ERROR;
2516                 }
2517     }
2518     return AirpcapVersion;
2519 }
2520
2521 /*
2522  * Append the version of AirPcap with which we were compiled to a GString.
2523  */
2524 void
2525 get_compiled_airpcap_version(GString *str)
2526 {
2527     g_string_append(str, "with AirPcap");
2528 }
2529
2530 /*
2531  * Append the version of AirPcap with which we we're running to a GString.
2532  */
2533 void
2534 get_runtime_airpcap_version(GString *str)
2535 {
2536     guint vmaj, vmin, vrev, build;
2537
2538     /* See if the DLL has been loaded successfully.  Bail if it hasn't */
2539     if (AirpcapLoaded == FALSE) {
2540         g_string_append(str, "without AirPcap");
2541         return;
2542     }
2543
2544     g_PAirpcapGetVersion(&vmaj, &vmin, &vrev, &build);
2545     g_string_append_printf(str, "with AirPcap %d.%d.%d build %d", vmaj, vmin,
2546         vrev, build);
2547 }
2548 #endif /* HAVE_AIRPCAP */
2549 #endif /* _WIN32 */