Instead of converting between 802.11 frequencies and channels umpteen
[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  * We load dynamically the dag library in order link it only when
59  * it's present on the system
60  */
61 static HMODULE AirpcapLib = NULL;
62
63 /*
64  * Set to TRUE if the DLL was successfully loaded AND all functions
65  * are present.
66  */
67 static gboolean AirpcapLoaded = FALSE;
68
69 static int AirpcapVersion = 3;
70
71 static AirpcapGetLastErrorHandler g_PAirpcapGetLastError;
72 static AirpcapGetDeviceListHandler g_PAirpcapGetDeviceList;
73 static AirpcapFreeDeviceListHandler g_PAirpcapFreeDeviceList;
74 static AirpcapOpenHandler g_PAirpcapOpen;
75 static AirpcapCloseHandler g_PAirpcapClose;
76 static AirpcapGetLinkTypeHandler g_PAirpcapGetLinkType;
77 static AirpcapSetLinkTypeHandler g_PAirpcapSetLinkType;
78 static AirpcapSetKernelBufferHandler g_PAirpcapSetKernelBuffer;
79 static AirpcapSetFilterHandler g_PAirpcapSetFilter;
80 static AirpcapGetMacAddressHandler g_PAirpcapGetMacAddress;
81 static AirpcapSetMinToCopyHandler g_PAirpcapSetMinToCopy;
82 static AirpcapGetReadEventHandler g_PAirpcapGetReadEvent;
83 static AirpcapReadHandler g_PAirpcapRead;
84 static AirpcapGetStatsHandler g_PAirpcapGetStats;
85 static AirpcapTurnLedOnHandler g_PAirpcapTurnLedOn;
86 static AirpcapTurnLedOffHandler g_PAirpcapTurnLedOff;
87 static AirpcapGetDeviceChannelHandler g_PAirpcapGetDeviceChannel;
88 static AirpcapSetDeviceChannelHandler g_PAirpcapSetDeviceChannel;
89 static AirpcapGetFcsPresenceHandler g_PAirpcapGetFcsPresence;
90 static AirpcapSetFcsPresenceHandler g_PAirpcapSetFcsPresence;
91 static AirpcapGetFcsValidationHandler g_PAirpcapGetFcsValidation;
92 static AirpcapSetFcsValidationHandler g_PAirpcapSetFcsValidation;
93 static AirpcapGetDeviceKeysHandler g_PAirpcapGetDeviceKeys;
94 static AirpcapSetDeviceKeysHandler g_PAirpcapSetDeviceKeys;
95 static AirpcapGetDriverKeysHandler g_PAirpcapGetDriverKeys;
96 static AirpcapSetDriverKeysHandler g_PAirpcapSetDriverKeys;
97 static AirpcapGetDecryptionStateHandler g_PAirpcapGetDecryptionState;
98 static AirpcapSetDecryptionStateHandler g_PAirpcapSetDecryptionState;
99 static AirpcapGetDriverDecryptionStateHandler g_PAirpcapGetDriverDecryptionState;
100 static AirpcapSetDriverDecryptionStateHandler g_PAirpcapSetDriverDecryptionState;
101 static AirpcapStoreCurConfigAsAdapterDefaultHandler g_PAirpcapStoreCurConfigAsAdapterDefault;
102 static AirpcapGetVersionHandler g_PAirpcapGetVersion;
103 static AirpcapSetDeviceChannelExHandler g_PAirpcapSetDeviceChannelEx;
104 static AirpcapGetDeviceChannelExHandler g_PAirpcapGetDeviceChannelEx;
105 static AirpcapGetDeviceSupportedChannelsHandler g_PAirpcapGetDeviceSupportedChannels;
106
107 /* Airpcap interface list */
108 GList *airpcap_if_list = NULL;
109
110 /* Airpcap current selected interface */
111 airpcap_if_info_t *airpcap_if_selected = NULL;
112
113 /* Airpcap current active interface */
114 airpcap_if_info_t *airpcap_if_active = NULL;
115
116 /* WLAN preferences pointer */
117 module_t *wlan_prefs = NULL;
118
119 Dot11Channel *pSupportedChannels;
120 ULONG numSupportedChannels;
121
122 static AirpcapChannelInfo LegacyChannels[] =
123 {
124         {2412, 0, {0,0,0}},
125         {2417, 0, {0,0,0}},
126         {2422, 0, {0,0,0}},
127         {2427, 0, {0,0,0}},
128         {2432, 0, {0,0,0}},
129         {2437, 0, {0,0,0}},
130         {2442, 0, {0,0,0}},
131         {2447, 0, {0,0,0}},
132         {2452, 0, {0,0,0}},
133         {2457, 0, {0,0,0}},
134         {2462, 0, {0,0,0}},
135         {2467, 0, {0,0,0}},
136         {2472, 0, {0,0,0}},
137         {2484, 0, {0,0,0}},
138 };
139
140 static ULONG num_legacy_channels = 14;
141
142 /*
143  * Callback used by the load_wlan_keys() routine in order to read a WEP decryption key
144  */
145 static guint
146 get_wep_key(pref_t *pref, gpointer ud _U_)
147 {
148     gchar *my_string = NULL;
149     keys_cb_data_t* user_data;
150
151     decryption_key_t* new_key;
152
153     /* Retrieve user data info */
154     user_data = (keys_cb_data_t*)ud;
155
156     if (g_strncasecmp(pref->name, "wep_key", 7) == 0 && pref->type == PREF_STRING)
157     {
158         my_string = g_strdup(*pref->varp.string);
159
160             /* Here we have the string describing the key... */
161             new_key = parse_key_string(my_string);
162
163         if( new_key != NULL)
164         {
165             /* Key is added only if not null ... */
166             user_data->list = g_list_append(user_data->list,new_key);
167             user_data->number_of_keys++;
168             user_data->current_index++;
169         }
170     }
171     return 0;
172 }
173
174 /* Returs TRUE if the WEP key is valid, false otherwise */
175 gboolean
176 wep_key_is_valid(char* key)
177 {
178     GString *new_key_string;
179     guint i=0;
180
181     if(key == NULL)
182         return FALSE;
183
184     new_key_string = g_string_new(key);
185
186     if( ((new_key_string->len) > WEP_KEY_MAX_CHAR_SIZE) || ((new_key_string->len) < 2))
187     {
188         g_string_free(new_key_string,FALSE);
189         return FALSE;
190     }
191     if((new_key_string->len % 2) != 0)
192     {
193         g_string_free(new_key_string,FALSE);
194         return FALSE;
195     }
196     for(i = 0; i < new_key_string->len; i++)
197     {
198         if(!g_ascii_isxdigit(new_key_string->str[i]))
199         {
200             g_string_free(new_key_string,FALSE);
201             return FALSE;
202         }
203     }
204
205     g_string_free(new_key_string,FALSE);
206     return TRUE;
207 }
208
209 /* Callback used by the save_wlan_keys() routine in order to write a decryption key */
210 static guint
211 set_wep_key(pref_t *pref, gpointer ud _U_)
212 {
213     gchar *my_string = NULL;
214     keys_cb_data_t* user_data;
215     gint wep_key_number = 0;
216
217     decryption_key_t* new_key;
218
219     /* Retrieve user data info */
220     user_data = (keys_cb_data_t*)ud;
221
222     if (g_strncasecmp(pref->name, "wep_key", 7) == 0 && pref->type == PREF_STRING)
223     {
224         /* Ok, the pref we're gonna set is a wep_key ... but what number? */
225         sscanf(pref->name,"wep_key%d",&wep_key_number);
226
227         if(user_data->current_index < user_data->number_of_keys)
228         {
229             if(wep_key_number == (user_data->current_index+1))
230             {
231                 /* Retrieve the nth decryption_key_t structure pointer */
232                 new_key = (decryption_key_t*)g_list_nth_data(user_data->list,user_data->current_index);
233
234                 /* Free the old key string */
235                 g_free((void *)*pref->varp.string);
236
237                 /* Create the new string describing the decryption key */
238                 my_string = get_key_string(new_key);
239
240                 /* Duplicate the string, and assign it to the variable pointer */
241                 *pref->varp.string = (void *)g_strdup(my_string);
242
243                 /* Free the previously allocated string */
244                 g_free(my_string);
245             }
246         }
247         else /* If the number of keys has been reduced somehow, we need to delete all the other keys
248               * (remember that the new ones have been probably overwritten)
249               */
250         {
251             g_free((void *)*pref->varp.string);
252             *pref->varp.string = (void *)g_strdup("");  /* Do not just free memory!!! Put an 'empty' string! */
253         }
254         user_data->current_index++;
255     }
256
257     return 0;
258 }
259
260 /*
261  * Function used to read the Decryption Keys from the preferences and store them
262  * properly into the airpcap adapter.
263  */
264 BOOL
265 load_wlan_driver_wep_keys()
266 {
267     keys_cb_data_t* user_data;
268     guint i;
269     gchar *tmp = NULL;
270
271     /* Retrieve the wlan preferences */
272     wlan_prefs = prefs_find_module("wlan");
273
274     /* Allocate a structure used to keep infos  between the callbacks */
275     user_data = (keys_cb_data_t*)g_malloc(sizeof(keys_cb_data_t));
276
277     /* Fill the structure */
278     user_data->list = NULL;
279     user_data->current_index = 0;
280     user_data->number_of_keys= 0; /* Still unknown */
281
282     /* Run the callback on each 802.11 preference */
283     prefs_pref_foreach(wlan_prefs, get_wep_key, (gpointer)user_data);
284
285     /* Now the key list should be filled */
286
287     /*
288      * Signal that we've changed things, and run the 802.11 dissector's
289      * callback
290      */
291     wlan_prefs->prefs_changed = TRUE;
292
293     prefs_apply(wlan_prefs);
294
295     write_wlan_driver_wep_keys_to_registry(user_data->list);
296
297     /* FREE MEMORY */
298     /* free the WEP key string */
299     for(i=0;i<g_list_length(user_data->list);i++)
300     {
301         g_free(g_list_nth(user_data->list,i)->data);
302     }
303
304     /* free the (empty) list */
305     g_list_free(user_data->list);
306
307     /* free the user_data structure */
308     g_free(user_data);
309
310     /* airpcap_if_info_free(fake_info_if); */
311
312     return TRUE;
313 }
314
315 /*
316  * This function will tell the airpcap driver the key list to use
317  * This will be stored into the registry...
318  */
319 BOOL
320 write_wlan_wep_keys_to_registry(airpcap_if_info_t* info_if, GList* key_list)
321 {
322     UINT i,j;
323     GString *new_key;
324     gchar s[3];
325     PAirpcapKeysCollection KeysCollection;
326     ULONG KeysCollectionSize;
327     UCHAR KeyByte;
328     UINT keys_in_list = 0;
329     decryption_key_t* key_item = NULL;
330
331     keys_in_list = g_list_length(key_list);
332
333     /*
334      * Save the encryption keys, if we have any of them
335      */
336     KeysCollectionSize = 0;
337
338     /*
339      * Calculate the size of the keys collection
340      */
341     KeysCollectionSize = sizeof(AirpcapKeysCollection) + keys_in_list * sizeof(AirpcapKey);
342
343     /*
344      * Allocate the collection
345      */
346     KeysCollection = (PAirpcapKeysCollection)g_malloc(KeysCollectionSize);
347     if(!KeysCollection)
348     {
349         return FALSE;
350     }
351
352     /*
353      * Populate the key collection
354      */
355     KeysCollection->nKeys = keys_in_list;
356
357     for(i = 0; i < keys_in_list; i++)
358     {
359         KeysCollection->Keys[i].KeyType = AIRPDCAP_KEY_TYPE_WEP;
360
361         /* Retrieve the Item corresponding to the i-th key */
362         key_item = (decryption_key_t*)g_list_nth_data(key_list,i);
363         new_key = g_string_new(key_item->key->str);
364
365         KeysCollection->Keys[i].KeyLen = new_key->len / 2;
366         memset(&KeysCollection->Keys[i].KeyData, 0, sizeof(KeysCollection->Keys[i].KeyData));
367
368         for(j = 0 ; j < new_key->len; j += 2)
369         {
370             s[0] = new_key->str[j];
371             s[1] = new_key->str[j+1];
372             s[2] = '\0';
373             KeyByte = (UCHAR)strtol(s, NULL, 16);
374             KeysCollection->Keys[i].KeyData[j / 2] = KeyByte;
375         }
376
377         g_string_free(new_key,TRUE);
378
379     }
380     /*
381      * Free the old adapter key collection!
382      */
383     if(info_if->keysCollection != NULL)
384         g_free(info_if->keysCollection);
385
386     /*
387      * Set this collection ad the new one
388      */
389     info_if->keysCollection = KeysCollection;
390     info_if->keysCollectionSize = KeysCollectionSize;
391
392     /*
393      * Configuration must be saved
394      */
395     info_if->saved = FALSE;
396
397     /*
398      * Write down the changes to the registry
399      */
400     airpcap_save_selected_if_configuration(info_if);
401
402     return TRUE;
403 }
404
405 /*
406  * This function will tell the airpcap driver the key list to use
407  * This will be stored into the registry...
408  */
409 BOOL
410 write_wlan_driver_wep_keys_to_registry(GList* key_list)
411 {
412     UINT i,j,k,n,y;
413     GString *new_key;
414     gchar s[3];
415     PAirpcapKeysCollection KeysCollection;
416     ULONG KeysCollectionSize;
417     UCHAR KeyByte;
418     UINT keys_in_list = 0;
419     decryption_key_t* key_item = NULL;
420     airpcap_if_info_t* fake_info_if = NULL;
421
422     /* Create the fake_info_if from the first adapter of the list */
423     fake_info_if = airpcap_driver_fake_if_info_new();
424
425     if(fake_info_if == NULL)
426         return FALSE;
427
428     /*
429      * XXX - When WPA will be supported, change this to: keys_in_list = g_list_length(key_list);
430      * but right now we will have to count only the WEP keys (or we will have a malloc-mess :-) )
431      */
432     n = g_list_length(key_list);
433     for(k = 0; k < n; k++ )
434         if(((decryption_key_t*)g_list_nth_data(key_list,k))->type == AIRPDCAP_KEY_TYPE_WEP)
435             keys_in_list++;
436
437     /*
438      * Save the encryption keys, if we have any of them
439      */
440     KeysCollectionSize = 0;
441
442     /*
443      * Calculate the size of the keys collection
444      */
445     KeysCollectionSize = sizeof(AirpcapKeysCollection) + keys_in_list * sizeof(AirpcapKey);
446
447     /*
448      * Allocate the collection
449      */
450     KeysCollection = (PAirpcapKeysCollection)g_malloc(KeysCollectionSize);
451     if(!KeysCollection)
452     {
453         return FALSE;
454     }
455
456     /*
457      * Populate the key collection
458      */
459     KeysCollection->nKeys = keys_in_list;
460
461     /*
462      * XXX - If we have, let's say, six keys, the first three are WEP, then two are WPA, and the
463      * last is WEP, we have to scroll the whole list (n) but increment the array counter only
464      * when a WEP key is found (y) .. When WPA will be supported by the driver, I'll have to change
465      * this
466      */
467     y = 0; /* Current position in the key list */
468
469     for(i = 0; i < n; i++)
470     {
471         /* Retrieve the Item corresponding to the i-th key */
472         key_item = (decryption_key_t*)g_list_nth_data(key_list,i);
473
474         /*
475          * XXX - The AIRPDCAP_KEY_TYPE_WEP is the only supportd right now!
476          * We will have to modify the AirpcapKey structure in order to
477          * support the other two types! What happens now, is that simply the
478          * not supported keys will just be discarded (they will be saved in wireshark though)
479          */
480         if(key_item->type == AIRPDCAP_KEY_TYPE_WEP)
481         {
482             KeysCollection->Keys[y].KeyType = AIRPDCAP_KEY_TYPE_WEP;
483
484             new_key = g_string_new(key_item->key->str);
485
486             KeysCollection->Keys[y].KeyLen = new_key->len / 2;
487             memset(&KeysCollection->Keys[y].KeyData, 0, sizeof(KeysCollection->Keys[y].KeyData));
488
489             for(j = 0 ; j < new_key->len; j += 2)
490             {
491                 s[0] = new_key->str[j];
492                 s[1] = new_key->str[j+1];
493                 s[2] = '\0';
494                 KeyByte = (UCHAR)strtol(s, NULL, 16);
495                 KeysCollection->Keys[y].KeyData[j / 2] = KeyByte;
496             }
497             /* XXX - Change when WPA will be supported!!! */
498             y++;
499             g_string_free(new_key,TRUE);
500         }
501         else if(key_item->type == AIRPDCAP_KEY_TYPE_WPA_PWD)
502         {
503             /* XXX - The driver cannot deal with this kind of key yet... */
504         }
505         else if(key_item->type == AIRPDCAP_KEY_TYPE_WPA_PMK)
506         {
507             /* XXX - The driver cannot deal with this kind of key yet... */
508         }
509     }
510
511     /*
512      * Free the old adapter key collection!
513      */
514     if(fake_info_if->keysCollection != NULL)
515         g_free(fake_info_if->keysCollection);
516
517     /*
518      * Set this collection ad the new one
519      */
520     fake_info_if->keysCollection = KeysCollection;
521     fake_info_if->keysCollectionSize = KeysCollectionSize;
522
523     /*
524      * Configuration must be saved
525      */
526     fake_info_if->saved = FALSE;
527
528     /*
529      * Write down the changes to the registry
530      */
531     airpcap_save_driver_if_configuration(fake_info_if);
532
533     airpcap_if_info_free(fake_info_if);
534
535     return TRUE;
536 }
537
538 /*
539  *  Function used to save to the preference file the Decryption Keys.
540  */
541 int
542 save_wlan_driver_wep_keys()
543 {
544     GList* key_list = NULL;
545     char* tmp_key = NULL;
546     guint keys_in_list,i;
547     keys_cb_data_t* user_data;
548     airpcap_if_info_t* fake_info_if = NULL;
549
550     /* Create the fake_info_if from the first adapter of the list */
551     fake_info_if = airpcap_driver_fake_if_info_new();
552
553     if(fake_info_if == NULL)
554         return FALSE;
555
556     /* Retrieve the wlan preferences */
557     wlan_prefs = prefs_find_module("wlan");
558
559     /* Allocate a structure used to keep infos  between the callbacks */
560     user_data = (keys_cb_data_t*)g_malloc(sizeof(keys_cb_data_t));
561
562     /* Number of keys in key list */
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 FALSE;
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                 {
1457                     return if_info;
1458                 }
1459             }
1460             ifn++;
1461         }
1462     }
1463     return NULL;
1464 }
1465
1466 /*
1467  * Returns the ASCII string of a key given the key bytes
1468  */
1469 gchar*
1470 airpcap_get_key_string(AirpcapKey key)
1471 {
1472     unsigned int j = 0;
1473     unsigned int l = 0;
1474     gchar *dst,*src;
1475
1476     dst = NULL;
1477     src = NULL;
1478
1479     if(key.KeyType == AIRPDCAP_KEY_TYPE_WEP)
1480     {
1481         if(key.KeyLen != 0)
1482         {
1483             /* Allocate the string used to store the ASCII representation of the WEP key */
1484             dst = (gchar*)g_malloc(sizeof(gchar)*WEP_KEY_MAX_CHAR_SIZE + 1);
1485             /* Make sure that the first char is '\0' in order to make g_strlcat() work */
1486             dst[0]='\0';
1487
1488             for(j = 0; j < key.KeyLen; j++)
1489             {
1490                 src = g_strdup_printf("%.2x\0", key.KeyData[j]);
1491                 /*
1492                  * XXX - use g_strconcat() or GStrings instead ???
1493                  */
1494                 l = g_strlcat(dst,src,WEP_KEY_MAX_CHAR_SIZE+1);
1495             }
1496             g_free(src);
1497         }
1498     }
1499     else if(key.KeyType == AIRPDCAP_KEY_TYPE_WPA_PWD)
1500     {
1501         /* XXX - Add code here */
1502     }
1503     else if(key.KeyType == AIRPDCAP_KEY_TYPE_WPA_PMK)
1504     {
1505         /* XXX - Add code here */
1506     }
1507     else
1508     {
1509         /* XXX - Add code here */
1510     }
1511
1512     return dst;
1513 }
1514
1515 /*
1516  * Clear keys and decryption status for the specified interface
1517  */
1518 void
1519 airpcap_if_clear_decryption_settings(airpcap_if_info_t* info_if)
1520 {
1521     if(info_if != NULL)
1522     {
1523         if(info_if->keysCollection != NULL)
1524         {
1525             g_free(info_if->keysCollection);
1526             info_if->keysCollection = NULL;
1527         }
1528
1529         info_if->keysCollectionSize = 0;
1530
1531         info_if->DecryptionOn = FALSE;
1532         info_if->saved = FALSE;
1533     }
1534 }
1535
1536 /*
1537  * Used to retrieve the two chars string from interface
1538  */
1539 gchar*
1540 airpcap_get_if_string_number(airpcap_if_info_t* if_info)
1541 {
1542     gchar* number;
1543     guint n;
1544     int a;
1545
1546     a = sscanf(if_info->name,AIRPCAP_DEVICE_NUMBER_EXTRACT_STRING,&n);
1547
1548     /* If sscanf() returned 1, it means that has read a number, so interface is not "Any"
1549      * Otherwise, check if it is the "Any" adapter...
1550      */
1551     if(a == 0)
1552     {
1553         if(g_strcasecmp(if_info->name,AIRPCAP_DEVICE_ANY_EXTRACT_STRING)!=0)
1554             number = g_strdup_printf("??");
1555         else
1556             number = g_strdup_printf(AIRPCAP_CHANNEL_ANY_NAME);
1557     }
1558     else
1559     {
1560         number = g_strdup_printf("%.2u\0",n);
1561     }
1562
1563     return number;
1564 }
1565
1566 /*
1567  * Used to retrieve the two chars string from interface
1568  */
1569 gchar*
1570 airpcap_get_if_string_number_from_description(gchar* description)
1571 {
1572     gchar* number;
1573     gchar* pointer;
1574
1575     number = (gchar*)g_malloc(sizeof(gchar)*3);
1576
1577     pointer = g_strrstr(description,"#\0");
1578
1579     number[0] = *(pointer+1);
1580     number[1] = *(pointer+2);
1581     number[2] = '\0';
1582
1583     return number;
1584 }
1585
1586 /*
1587  * Returns the default airpcap interface of a list, NULL if list is empty
1588  */
1589 airpcap_if_info_t*
1590 airpcap_get_default_if(GList* airpcap_if_list)
1591 {
1592     int ifn = 0;
1593     GList* popdown_if_list = NULL;
1594     GList* curr = NULL;
1595
1596     gchar* s;
1597     airpcap_if_info_t* if_info = NULL;
1598
1599     if(prefs.capture_device != NULL)
1600     {
1601         s = g_strdup(get_if_name(prefs.capture_device));
1602         if_info = get_airpcap_if_from_name(airpcap_if_list,g_strdup(get_if_name(prefs.capture_device)));
1603         g_free(s);
1604     }
1605     return if_info;
1606 }
1607
1608 /*
1609  * Load the configuration for the specified interface
1610  */
1611 void
1612 airpcap_load_selected_if_configuration(airpcap_if_info_t* if_info)
1613 {
1614     gchar ebuf[AIRPCAP_ERRBUF_SIZE];
1615     PAirpcapHandle ad;
1616
1617     if(if_info != NULL)
1618     {
1619         ad = airpcap_if_open(if_info->name, ebuf);
1620
1621         if(ad)
1622         {
1623             /* Stop blinking (if it was blinkig!)*/
1624             if(if_info->blinking)
1625             {
1626                 /* Turn on the light (if it was off) */
1627                 if(!(if_info->led)) airpcap_if_turn_led_on(ad, 0);
1628             }
1629
1630             /* Apply settings... */
1631             airpcap_if_get_device_channel_ex(ad,&(if_info->channelInfo));
1632             airpcap_if_get_fcs_validation(ad,&(if_info->CrcValidationOn));
1633             airpcap_if_get_fcs_presence(ad,&(if_info->IsFcsPresent));
1634             airpcap_if_get_link_type(ad,&(if_info->linkType));
1635             airpcap_if_get_decryption_state(ad, &(if_info->DecryptionOn));
1636             /* get the keys, if everything is ok, close the adapter */
1637             if(airpcap_if_load_keys(ad,if_info))
1638                 airpcap_if_close(ad);
1639
1640             if_info->saved = TRUE;
1641         }
1642         else
1643         {
1644             simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, " Error in opening adapter for %s",if_info->description);
1645         }
1646     }
1647 }
1648
1649 /*
1650  * Save the configuration for the specified interface
1651  */
1652 void
1653 airpcap_save_selected_if_configuration(airpcap_if_info_t* if_info)
1654 {
1655     gchar ebuf[AIRPCAP_ERRBUF_SIZE];
1656     PAirpcapHandle ad;
1657
1658     if(if_info != NULL)
1659     {
1660         ad = airpcap_if_open(if_info->name, ebuf);
1661
1662         if(ad)
1663         {
1664             /* Stop blinking (if it was blinkig!)*/
1665             if(if_info->blinking)
1666             {
1667                 /* Turn on the light (if it was off) */
1668                 if(!(if_info->led)) airpcap_if_turn_led_on(ad, 0);
1669             }
1670
1671             /* Apply settings... */
1672             airpcap_if_set_device_channel_ex(ad,if_info->channelInfo);
1673             airpcap_if_set_fcs_validation(ad,if_info->CrcValidationOn);
1674             airpcap_if_set_fcs_presence(ad,if_info->IsFcsPresent);
1675             airpcap_if_set_link_type(ad,if_info->linkType);
1676             airpcap_if_set_decryption_state(ad, if_info->DecryptionOn);
1677             airpcap_if_save_keys(ad,if_info);
1678
1679             /* ... and save them */
1680             if(!airpcap_if_store_cur_config_as_adapter_default(ad))
1681             {
1682                 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.");
1683                 if_info->saved = FALSE;
1684                 airpcap_if_close(ad);
1685                 return;
1686             }
1687
1688             if_info->saved = TRUE;
1689             airpcap_if_close(ad);
1690         }
1691         else
1692         {
1693             simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, " Error in opening adapter for %s",if_info->description);
1694         }
1695     }
1696 }
1697
1698 /*
1699  * Save the configuration for the specified interface
1700  */
1701 void
1702 airpcap_save_driver_if_configuration(airpcap_if_info_t* fake_if_info)
1703 {
1704     gchar ebuf[AIRPCAP_ERRBUF_SIZE];
1705     PAirpcapHandle ad;
1706
1707     if(fake_if_info != NULL)
1708     {
1709         ad = airpcap_if_open(fake_if_info->name, ebuf);
1710
1711         if(ad)
1712         {
1713             /* Apply decryption settings... */
1714             airpcap_if_set_driver_decryption_state(ad, fake_if_info->DecryptionOn);
1715             airpcap_if_save_driver_keys(ad,fake_if_info);
1716             airpcap_if_close(ad);
1717         }
1718         else
1719         {
1720             simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, " Error in opening adapter for %s",fake_if_info->description);
1721         }
1722     }
1723
1724     return;
1725 }
1726
1727 /*
1728  * DECRYPTION KEYS FUNCTIONS
1729  */
1730 /*
1731  * This function is used for DEBUG POURPOSES ONLY!!!
1732  */
1733 void
1734 print_key_list(GList* key_list)
1735 {
1736     gint n,i;
1737     decryption_key_t* tmp;
1738
1739     if(key_list == NULL)
1740     {
1741         g_print("\n\n******* KEY LIST NULL *******\n\n");
1742         return;
1743     }
1744
1745     n = g_list_length(key_list);
1746
1747     g_print("\n\n********* KEY LIST **********\n\n");
1748
1749     g_print("NUMBER OF KEYS IN LIST : %d\n\n",n);
1750
1751     for(i =0; i < n; i++)
1752     {
1753         g_print("[%d] :\n",i+1);
1754         tmp = (decryption_key_t*)(g_list_nth_data(key_list,i));
1755         g_print("KEY : %s\n",tmp->key->str);
1756
1757         g_print("BITS: %d\n",tmp->bits);
1758
1759         if(tmp->type == AIRPDCAP_KEY_TYPE_WEP)
1760             g_print("TYPE: %s\n",AIRPCAP_WEP_KEY_STRING);
1761         else if(tmp->type == AIRPDCAP_KEY_TYPE_WPA_PWD)
1762             g_print("TYPE: %s\n",AIRPCAP_WPA_PWD_KEY_STRING);
1763         else if(tmp->type == AIRPDCAP_KEY_TYPE_WPA_PMK)
1764             g_print("TYPE: %s\n",AIRPCAP_WPA_BIN_KEY_STRING);
1765         else
1766             g_print("TYPE: %s\n","???");
1767
1768         g_print("SSID: %s\n",(tmp->ssid != NULL) ?
1769                 format_text((guchar *)tmp->ssid->data, tmp->ssid->len) : "---");
1770         g_print("\n");
1771     }
1772
1773     g_print("\n*****************************\n\n");
1774 }
1775
1776 /*
1777  * Retrieves a GList of decryption_key_t structures containing infos about the
1778  * keys for the given adapter... returns NULL if no keys are found.
1779  */
1780 GList*
1781 get_airpcap_device_keys(airpcap_if_info_t* info_if)
1782 {
1783     /* tmp vars */
1784     char* tmp_key = NULL;
1785     guint i,keys_in_list = 0;
1786
1787     /* real vars*/
1788     decryption_key_t *new_key  = NULL;
1789     GList            *key_list = NULL;
1790
1791     /* Number of keys in key list */
1792     if(info_if->keysCollectionSize != 0)
1793         keys_in_list = (guint)(info_if->keysCollectionSize -  sizeof(AirpcapKeysCollection))/sizeof(AirpcapKey);
1794     else
1795         keys_in_list = 0;
1796
1797     for(i=0; i<keys_in_list; i++)
1798     {
1799         /* Different things to do depending on the key type  */
1800         if(info_if->keysCollection->Keys[i].KeyType == AIRPDCAP_KEY_TYPE_WEP)
1801         {
1802             /* allocate memory for the new key item */
1803             new_key = (decryption_key_t*)g_malloc(sizeof(decryption_key_t));
1804
1805             /* fill the fields */
1806             /* KEY */
1807             tmp_key = airpcap_get_key_string(info_if->keysCollection->Keys[i]);
1808             new_key->key = g_string_new(tmp_key);
1809             g_free(tmp_key);
1810
1811             /* BITS */
1812             new_key->bits = new_key->key->len *4; /* every char is 4 bits in WEP keys (it is an exadecimal number) */
1813
1814             /* SSID not used in WEP keys */
1815             new_key->ssid = NULL;
1816
1817             /* TYPE (WEP in this case) */
1818             new_key->type = info_if->keysCollection->Keys[i].KeyType;
1819
1820             /* Append the new element in the list */
1821             key_list = g_list_append(key_list,(gpointer)new_key);
1822         }
1823         else if(info_if->keysCollection->Keys[i].KeyType == AIRPDCAP_KEY_TYPE_WPA_PWD)
1824         {
1825             /* XXX - Not supported yet */
1826         }
1827         else if(info_if->keysCollection->Keys[i].KeyType == AIRPDCAP_KEY_TYPE_WPA_PMK)
1828         {
1829             /* XXX - Not supported yet */
1830         }
1831     }
1832
1833     return key_list;
1834 }
1835
1836 /*
1837  * Retrieves a GList of decryption_key_t structures containing infos about the
1838  * keys for the global AirPcap driver... returns NULL if no keys are found.
1839  */
1840 GList*
1841 get_airpcap_driver_keys()
1842 {
1843     /* tmp vars */
1844     char* tmp_key = NULL;
1845     guint i,keys_in_list = 0;
1846
1847     /* real vars*/
1848     decryption_key_t *new_key  = NULL;
1849     GList            *key_list = NULL;
1850
1851     /*
1852      * To read the drivers general settings we need to create and use one airpcap adapter...
1853      * The only way to do that is to instantiate a fake adapter, and then close it and delete it.
1854      */
1855     airpcap_if_info_t* fake_info_if = NULL;
1856
1857     /* Create the fake_info_if from the first adapter of the list */
1858     fake_info_if = airpcap_driver_fake_if_info_new();
1859
1860     if(fake_info_if == NULL)
1861         return NULL;
1862
1863     /* Number of keys in key list */
1864     if(fake_info_if->keysCollectionSize != 0)
1865         keys_in_list = (guint)(fake_info_if->keysCollectionSize -  sizeof(AirpcapKeysCollection))/sizeof(AirpcapKey);
1866     else
1867         keys_in_list = 0;
1868
1869     for(i=0; i<keys_in_list; i++)
1870     {
1871         /* Different things to do depending on the key type  */
1872         if(fake_info_if->keysCollection->Keys[i].KeyType == AIRPDCAP_KEY_TYPE_WEP)
1873         {
1874             /* allocate memory for the new key item */
1875             new_key = (decryption_key_t*)g_malloc(sizeof(decryption_key_t));
1876
1877             /* fill the fields */
1878             /* KEY */
1879             tmp_key = airpcap_get_key_string(fake_info_if->keysCollection->Keys[i]);
1880             new_key->key = g_string_new(tmp_key);
1881             if(tmp_key != NULL) g_free(tmp_key);
1882
1883             /* BITS */
1884             new_key->bits = new_key->key->len *4; /* every char is 4 bits in WEP keys (it is an exadecimal number) */
1885
1886             /* SSID not used in WEP keys */
1887             new_key->ssid = NULL;
1888
1889             /* TYPE (WEP in this case) */
1890             new_key->type = fake_info_if->keysCollection->Keys[i].KeyType;
1891
1892             /* Append the new element in the list */
1893             key_list = g_list_append(key_list,(gpointer)new_key);
1894         }
1895         else if(fake_info_if->keysCollection->Keys[i].KeyType == AIRPDCAP_KEY_TYPE_WPA_PWD)
1896         {
1897             /* XXX - Not supported yet */
1898         }
1899         else if(fake_info_if->keysCollection->Keys[i].KeyType == AIRPDCAP_KEY_TYPE_WPA_PMK)
1900         {
1901             /* XXX - Not supported yet */
1902         }
1903     }
1904
1905     airpcap_if_info_free(fake_info_if);
1906
1907     return key_list;
1908 }
1909
1910 /*
1911  * Returns the list of the decryption keys specified for wireshark, NULL if
1912  * no key is found
1913  */
1914 GList*
1915 get_wireshark_keys()
1916 {
1917     keys_cb_data_t* wep_user_data = NULL;
1918
1919     gchar *tmp = NULL;
1920
1921     GList* final_list = NULL;
1922     GList* wep_final_list = NULL;
1923
1924     /* Retrieve the wlan preferences */
1925     wlan_prefs = prefs_find_module("wlan");
1926
1927     /* Allocate a structure used to keep infos  between the callbacks */
1928     wep_user_data = (keys_cb_data_t*)g_malloc(sizeof(keys_cb_data_t));
1929
1930     /* Fill the structure */
1931     wep_user_data->list = NULL;
1932     wep_user_data->current_index = 0;
1933     wep_user_data->number_of_keys= 0; /* Still unknown */
1934
1935     /* Run the callback on each 802.11 preference */
1936     /* XXX - Right now, only WEP keys will be loaded */
1937     prefs_pref_foreach(wlan_prefs, get_wep_key, (gpointer)wep_user_data);
1938
1939     /* Copy the list field in the user data structure pointer into the final_list */
1940     if(wep_user_data != NULL)  wep_final_list  = wep_user_data->list;
1941
1942     /* XXX - Merge the three lists!!!!! */
1943     final_list = wep_final_list;
1944
1945     /* free the wep_user_data structure */
1946     g_free(wep_user_data);
1947
1948     return final_list;
1949 }
1950
1951 /*
1952  * Merges two lists of keys and return a newly created GList. If a key is
1953  * found multiple times, it will just appear once!
1954  * list1 and list 2 pointer will have to be freed manually if needed!!!
1955  * If the total number of keys exceeeds the maximum number allowed,
1956  * exceeding keys will be discarded...
1957  */
1958 GList*
1959 merge_key_list(GList* list1, GList* list2)
1960 {
1961     guint n1=0,n2=0;
1962     guint i;
1963     decryption_key_t *dk1=NULL,
1964                       *dk2=NULL,
1965                       *new_dk=NULL;
1966
1967     GList* merged_list = NULL;
1968
1969     if( (list1 == NULL) && (list2 == NULL) )
1970         return NULL;
1971
1972     if(list1 == NULL)
1973     {
1974         n1 = 0;
1975         n2 = g_list_length(list2);
1976
1977         for(i=0;i<n2;i++)
1978         {
1979             new_dk = (decryption_key_t*)g_malloc(sizeof(decryption_key_t));
1980             dk2 = (decryption_key_t *)g_list_nth_data(list2,i);
1981
1982             new_dk->bits = dk2->bits;
1983             new_dk->type = dk2->type;
1984             new_dk->key  = g_string_new(dk2->key->str);
1985             new_dk->ssid = byte_array_dup(dk2->ssid);
1986
1987             /* Check the total length of the merged list */
1988             if(g_list_length(merged_list) < MAX_ENCRYPTION_KEYS)
1989                 merged_list = g_list_append(merged_list,(gpointer)new_dk);
1990         }
1991     }
1992     else if(list2 == NULL)
1993     {
1994         n1 = g_list_length(list1);
1995         n2 = 0;
1996
1997         for(i=0;i<n1;i++)
1998         {
1999             new_dk = (decryption_key_t*)g_malloc(sizeof(decryption_key_t));
2000             dk1 = (decryption_key_t*)g_list_nth_data(list1,i);
2001
2002             new_dk->bits = dk1->bits;
2003             new_dk->type = dk1->type;
2004             new_dk->key  = g_string_new(dk1->key->str);
2005             new_dk->ssid = byte_array_dup(dk1->ssid);
2006
2007             /* Check the total length of the merged list */
2008             if(g_list_length(merged_list) < MAX_ENCRYPTION_KEYS)
2009                 merged_list = g_list_append(merged_list,(gpointer)new_dk);
2010         }
2011     }
2012     else
2013     {
2014         n1 = g_list_length(list1);
2015         n2 = g_list_length(list2);
2016
2017         /* Copy the whole list1 into merged_list */
2018         for(i=0;i<n1;i++)
2019         {
2020             new_dk = (decryption_key_t*)g_malloc(sizeof(decryption_key_t));
2021             dk1 = (decryption_key_t *)g_list_nth_data(list1,i);
2022
2023             new_dk->bits = dk1->bits;
2024             new_dk->type = dk1->type;
2025             new_dk->key  = g_string_new(dk1->key->str);
2026             new_dk->ssid = byte_array_dup(dk1->ssid);
2027
2028             /* Check the total length of the merged list */
2029             if(g_list_length(merged_list) < MAX_ENCRYPTION_KEYS)
2030                 merged_list = g_list_append(merged_list,(gpointer)new_dk);
2031         }
2032
2033         /* Look for keys that are present in list2 but aren't in list1 yet...
2034          * Add them to merged_list
2035          */
2036         for(i=0;i<n2;i++)
2037         {
2038             dk2 = (decryption_key_t *)g_list_nth_data(list2,i);
2039
2040             if(!key_is_in_list(dk2,merged_list))
2041             {
2042                 new_dk = (decryption_key_t*)g_malloc(sizeof(decryption_key_t));
2043
2044                 new_dk->bits = dk2->bits;
2045                 new_dk->type = dk2->type;
2046                 new_dk->key  = g_string_new(dk2->key->str);
2047                 new_dk->ssid = byte_array_dup(dk2->ssid);
2048
2049                 /* Check the total length of the merged list */
2050                 if(g_list_length(merged_list) < MAX_ENCRYPTION_KEYS)
2051                     merged_list = g_list_append(merged_list,(gpointer)new_dk);
2052             }
2053         }
2054     }
2055
2056     return merged_list;
2057 }
2058
2059 /*
2060  * Use this function to free a key list.
2061  */
2062 void
2063 free_key_list(GList *list)
2064 {
2065     guint i,n;
2066     decryption_key_t *curr_key;
2067
2068     if(list == NULL)
2069         return;
2070
2071     n = g_list_length(list);
2072
2073     for(i = 0; i < n; i++)
2074     {
2075         curr_key = (decryption_key_t*)g_list_nth_data(list,i);
2076
2077         /* Free all the strings */
2078         if(curr_key->key != NULL)
2079             g_string_free(curr_key->key, TRUE);
2080
2081         if(curr_key->ssid != NULL)
2082         g_byte_array_free(curr_key->ssid, TRUE);
2083
2084         /* free the decryption_key_t structure*/
2085         g_free(curr_key);
2086         curr_key = NULL;
2087     }
2088
2089     /* Free the list */
2090     g_list_free(list);
2091
2092     return;
2093 }
2094
2095
2096 /*
2097  * If the given key is contained in the list, returns TRUE.
2098  * Returns FALSE otherwise.
2099  */
2100 gboolean
2101 key_is_in_list(decryption_key_t *dk,GList *list)
2102 {
2103     guint i,n;
2104     decryption_key_t* curr_key = NULL;
2105     gboolean found = FALSE;
2106
2107     if( (list == NULL) || (dk == NULL) )
2108         return FALSE;
2109
2110     n = g_list_length(list);
2111
2112     if(n < 1)
2113         return FALSE;
2114
2115     for(i = 0; i < n; i++)
2116     {
2117         curr_key = (decryption_key_t*)g_list_nth_data(list,i);
2118         if(keys_are_equals(dk,curr_key))
2119             found = TRUE;
2120     }
2121
2122     return found;
2123 }
2124
2125 /*
2126  * Returns TRUE if keys are equals, FALSE otherwise
2127  */
2128 gboolean
2129 keys_are_equals(decryption_key_t *k1,decryption_key_t *k2)
2130 {
2131
2132     if((k1==NULL) || (k2==NULL))
2133         return FALSE;
2134
2135     /* XXX - Remove this check when we will have the WPA/WPA2 decryption in the Driver! */
2136     /** 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) ) **/
2137     /**         return TRUE;  **/
2138
2139     if( g_string_equal(k1->key,k2->key) &&
2140         (k1->bits == k2->bits) && /* If the previous is TRUE, this must be TRUE as well */
2141         k1->type == k2->type)
2142     {
2143         /* Check the ssid... if the key type is WEP, the two fields should be NULL */
2144         if((k1->ssid == NULL) && (k2->ssid == NULL))
2145             return TRUE;
2146
2147         /* If they are not null, they must share the same ssid */
2148         return byte_array_equal(k1->ssid,k2->ssid);
2149     }
2150
2151     /* Some field is not equal ... */
2152     return FALSE;
2153 }
2154
2155 /*
2156  * Tests if two collection of keys are equal or not, to be considered equals, they have to
2157  * contain the same keys in the SAME ORDER! (If both lists are NULL, which means empty will
2158  * return TRUE)
2159  */
2160 gboolean
2161 key_lists_are_equal(GList* list1, GList* list2)
2162 {
2163     guint n1=0,n2=0;
2164     /* XXX - Remove */
2165     guint wep_n1=0,wep_n2=0;
2166     GList *wep_list1=NULL;
2167     GList *wep_list2=NULL;
2168     /* XXX - END*/
2169     guint i/*,j*/;
2170     decryption_key_t *dk1=NULL,*dk2=NULL;
2171
2172     n1 = g_list_length(list1);
2173     n2 = g_list_length(list2);
2174
2175     /*
2176      * XXX - START : Retrieve the aublists of WEP keys!!! This is needed only 'till Driver WPA decryption
2177      * is not implemented.
2178      */
2179     for(i=0;i<n1;i++)
2180     {
2181         dk1=(decryption_key_t*)g_list_nth_data(list1,i);
2182         if(dk1->type == AIRPDCAP_KEY_TYPE_WEP)
2183         {
2184             wep_list1 = g_list_append(wep_list1,(gpointer)dk1);
2185             wep_n1++;
2186         }
2187     }
2188     for(i=0;i<n2;i++)
2189     {
2190         dk2=(decryption_key_t*)g_list_nth_data(list2,i);
2191         if(dk2->type == AIRPDCAP_KEY_TYPE_WEP)
2192         {
2193             wep_list2 = g_list_append(wep_list2,(gpointer)dk2);
2194             wep_n2++;
2195         }
2196     }
2197
2198     /*
2199      * XXX - END : Remove from START to END when the WPA/WPA2 decryption will be implemented in
2200      * the Driver
2201      */
2202
2203     /*
2204      * Commented, because in the new AirPcap version all the keys will be saved
2205      * into the driver, and all the keys for every specific adapter will be
2206      * removed. This means that this check will always fail... and the user will
2207      * always be asked what to do... and it doesn't make much sense.
2208      */
2209     /* if(n1 != n2) return FALSE; */
2210     if(wep_n1 != wep_n2) return FALSE;
2211
2212     n1 = wep_n1;
2213     n2 = wep_n2;
2214
2215     /*for(i=0;i<n1;i++)
2216     {
2217     dk1=(decryption_key_t*)g_list_nth_data(list1,i);
2218     dk2=(decryption_key_t*)g_list_nth_data(list2,i);
2219
2220     if(!g_string_equal(dk1->key,dk2->key)) return FALSE;
2221     }*/
2222     for(i=0;i<n2;i++)
2223     {
2224         dk2=(decryption_key_t*)g_list_nth_data(wep_list2,i);
2225         if(!key_is_in_list(dk2,wep_list1)) return FALSE;
2226     }
2227
2228     return TRUE;
2229 }
2230
2231 static guint
2232 test_if_on(pref_t *pref, gpointer ud _U_)
2233 {
2234     gboolean *is_on;
2235     gboolean number;
2236
2237     /* Retrieve user data info */
2238     is_on = (gboolean*)ud;
2239
2240
2241     if (g_strncasecmp(pref->name, "enable_decryption", 17) == 0 && pref->type == PREF_BOOL)
2242     {
2243         number = *pref->varp.boolp;
2244
2245         if(number) *is_on = TRUE;
2246         else *is_on = FALSE;
2247
2248         return 1;
2249     }
2250     return 0;
2251 }
2252
2253 /*
2254  * Returns TRUE if the Wireshark decryption is active, false otherwise
2255  */
2256 gboolean
2257 wireshark_decryption_on()
2258 {
2259     gboolean is_on;
2260
2261     /* Retrieve the wlan preferences */
2262     wlan_prefs = prefs_find_module("wlan");
2263
2264     /* Run the callback on each 802.11 preference */
2265     prefs_pref_foreach(wlan_prefs, test_if_on, (gpointer)&is_on);
2266
2267     return is_on;
2268 }
2269
2270 /*
2271  * Returns TRUE if the AirPcap decryption for the current adapter is active, false otherwise
2272  */
2273 gboolean
2274 airpcap_decryption_on()
2275 {
2276     gboolean is_on = FALSE;
2277
2278     airpcap_if_info_t* fake_if_info = NULL;
2279
2280     fake_if_info = airpcap_driver_fake_if_info_new();
2281
2282     if(fake_if_info != NULL)
2283     {
2284         if(fake_if_info->DecryptionOn == AIRPCAP_DECRYPTION_ON)
2285             is_on = TRUE;
2286         else if(fake_if_info->DecryptionOn == AIRPCAP_DECRYPTION_OFF)
2287             is_on = FALSE;
2288     }
2289
2290     airpcap_if_info_free(fake_if_info);
2291
2292     return is_on;
2293 }
2294
2295 /*
2296  * Free an instance of airpcap_if_info_t
2297  */
2298 void
2299 airpcap_if_info_free(airpcap_if_info_t *if_info)
2300 {
2301     if(if_info != NULL)
2302     {
2303         if (if_info->name != NULL)
2304             g_free(if_info->name);
2305
2306         if (if_info->description != NULL)
2307             g_free(if_info->description);
2308
2309         if(if_info->keysCollection != NULL)
2310         {
2311             g_free(if_info->keysCollection);
2312             if_info->keysCollection = NULL;
2313         }
2314
2315         if(if_info->ip_addr != NULL)
2316         {
2317             g_slist_free(if_info->ip_addr);
2318             if_info->ip_addr = NULL;
2319         }
2320
2321         if(if_info != NULL)
2322         {
2323             g_free(if_info);
2324             if_info = NULL;
2325         }
2326     }
2327 }
2328
2329 static guint
2330 set_on_off(pref_t *pref, gpointer ud _U_)
2331 {
2332     gboolean *is_on;
2333     gboolean number;
2334
2335     /* Retrieve user data info */
2336     is_on = (gboolean*)ud;
2337
2338     if (g_strncasecmp(pref->name, "enable_decryption", 17) == 0 && pref->type == PREF_BOOL)
2339     {
2340         number = *pref->varp.boolp;
2341
2342         g_free((void *)*pref->varp.boolp);
2343         if(*is_on)
2344             *pref->varp.boolp = TRUE;
2345         else
2346             *pref->varp.boolp = FALSE;
2347
2348         return 1;
2349     }
2350     return 0;
2351 }
2352
2353 /*
2354  * Enables decryption for Wireshark if on_off is TRUE, disables it otherwise.
2355  */
2356 void
2357 set_wireshark_decryption(gboolean on_off)
2358 {
2359     gboolean is_on;
2360
2361     is_on = on_off;
2362
2363     /* Retrieve the wlan preferences */
2364     wlan_prefs = prefs_find_module("wlan");
2365
2366     /* Run the callback on each 802.11 preference */
2367     prefs_pref_foreach(wlan_prefs, set_on_off, (gpointer)&is_on);
2368
2369     /*
2370      * Signal that we've changed things, and run the 802.11 dissector's
2371      * callback
2372      */
2373     wlan_prefs->prefs_changed = TRUE;
2374
2375     prefs_apply(wlan_prefs);
2376 }
2377
2378 /*
2379  * Enables decryption for all the adapters if on_off is TRUE, disables it otherwise.
2380  */
2381 gboolean
2382 set_airpcap_decryption(gboolean on_off)
2383 {
2384     /* We need to directly access the .dll functions here... */
2385     gchar ebuf[AIRPCAP_ERRBUF_SIZE];
2386     PAirpcapHandle ad,ad_driver;
2387
2388     gboolean success = TRUE;
2389
2390     gint n = 0;
2391     gint i = 0;
2392     airpcap_if_info_t* curr_if = NULL;
2393     airpcap_if_info_t* fake_if_info = NULL;
2394
2395     fake_if_info = airpcap_driver_fake_if_info_new();
2396
2397     if(fake_if_info == NULL)
2398         /* We apparently don't have any adapters installed.
2399          * This isn't a failure, so return TRUE
2400          */
2401         return TRUE;
2402
2403         /* Set the driver decryption */
2404         ad_driver = airpcap_if_open(fake_if_info->name, ebuf);
2405         if(ad_driver)
2406         {
2407             if(on_off)
2408                 airpcap_if_set_driver_decryption_state(ad_driver,AIRPCAP_DECRYPTION_ON);
2409             else
2410                 airpcap_if_set_driver_decryption_state(ad_driver,AIRPCAP_DECRYPTION_OFF);
2411
2412             airpcap_if_close(ad_driver);
2413         }
2414
2415         airpcap_if_info_free(fake_if_info);
2416
2417         n = g_list_length(airpcap_if_list);
2418
2419         /* Set to FALSE the decryption for all the adapters */
2420         /* Apply this change to all the adapters !!! */
2421         for(i = 0; i < n; i++)
2422         {
2423             curr_if = (airpcap_if_info_t*)g_list_nth_data(airpcap_if_list,i);
2424
2425             if( curr_if != NULL )
2426             {
2427                 ad = airpcap_if_open(curr_if->name, ebuf);
2428                 if(ad)
2429                 {
2430                     curr_if->DecryptionOn = (gboolean)AIRPCAP_DECRYPTION_OFF;
2431                     airpcap_if_set_decryption_state(ad,curr_if->DecryptionOn);
2432                     /* Save configuration for the curr_if */
2433                     if(!airpcap_if_store_cur_config_as_adapter_default(ad))
2434                     {
2435                         success = FALSE;
2436                     }
2437                     airpcap_if_close(ad);
2438                 }
2439             }
2440         }
2441
2442         return success;
2443 }
2444
2445
2446 /* DYNAMIC LIBRARY LOADER */
2447 /*
2448  *  Used to dynamically load the airpcap library in order link it only when
2449  *  it's present on the system
2450  */
2451 int load_airpcap(void)
2452 {
2453     BOOL base_functions = TRUE;
2454     BOOL eleven_n_functions = TRUE;
2455
2456     if((AirpcapLib =  LoadLibrary(TEXT("airpcap.dll"))) == NULL)
2457     {
2458                 /* Report the error but go on */
2459       AirpcapVersion = AIRPCAP_DLL_NOT_FOUND;
2460                 return AirpcapVersion;
2461     }
2462     else
2463     {
2464                 if((g_PAirpcapGetLastError = (AirpcapGetLastErrorHandler) GetProcAddress(AirpcapLib, "AirpcapGetLastError")) == NULL) base_functions = FALSE;
2465                 if((g_PAirpcapGetDeviceList = (AirpcapGetDeviceListHandler) GetProcAddress(AirpcapLib, "AirpcapGetDeviceList")) == NULL) base_functions = FALSE;
2466                 if((g_PAirpcapFreeDeviceList = (AirpcapFreeDeviceListHandler) GetProcAddress(AirpcapLib, "AirpcapFreeDeviceList")) == NULL) base_functions = FALSE;
2467                 if((g_PAirpcapOpen = (AirpcapOpenHandler) GetProcAddress(AirpcapLib, "AirpcapOpen")) == NULL) base_functions = FALSE;
2468                 if((g_PAirpcapClose = (AirpcapCloseHandler) GetProcAddress(AirpcapLib, "AirpcapClose")) == NULL) base_functions = FALSE;
2469                 if((g_PAirpcapGetLinkType = (AirpcapGetLinkTypeHandler) GetProcAddress(AirpcapLib, "AirpcapGetLinkType")) == NULL) base_functions = FALSE;
2470                 if((g_PAirpcapSetLinkType = (AirpcapSetLinkTypeHandler) GetProcAddress(AirpcapLib, "AirpcapSetLinkType")) == NULL) base_functions = FALSE;
2471                 if((g_PAirpcapSetKernelBuffer = (AirpcapSetKernelBufferHandler) GetProcAddress(AirpcapLib, "AirpcapSetKernelBuffer")) == NULL) base_functions = FALSE;
2472                 if((g_PAirpcapSetFilter = (AirpcapSetFilterHandler) GetProcAddress(AirpcapLib, "AirpcapSetFilter")) == NULL) base_functions = FALSE;
2473                 if((g_PAirpcapGetMacAddress = (AirpcapGetMacAddressHandler) GetProcAddress(AirpcapLib, "AirpcapGetMacAddress")) == NULL) base_functions = FALSE;
2474                 if((g_PAirpcapSetMinToCopy = (AirpcapSetMinToCopyHandler) GetProcAddress(AirpcapLib, "AirpcapSetMinToCopy")) == NULL) base_functions = FALSE;
2475                 if((g_PAirpcapGetReadEvent = (AirpcapGetReadEventHandler) GetProcAddress(AirpcapLib, "AirpcapGetReadEvent")) == NULL) base_functions = FALSE;
2476                 if((g_PAirpcapRead = (AirpcapReadHandler) GetProcAddress(AirpcapLib, "AirpcapRead")) == NULL) base_functions = FALSE;
2477                 if((g_PAirpcapGetStats = (AirpcapGetStatsHandler) GetProcAddress(AirpcapLib, "AirpcapGetStats")) == NULL) base_functions = FALSE;
2478                 if((g_PAirpcapTurnLedOn = (AirpcapTurnLedOnHandler) GetProcAddress(AirpcapLib, "AirpcapTurnLedOn")) == NULL) base_functions = FALSE;
2479                 if((g_PAirpcapTurnLedOff = (AirpcapTurnLedOffHandler) GetProcAddress(AirpcapLib, "AirpcapTurnLedOff")) == NULL) base_functions = FALSE;
2480                 if((g_PAirpcapGetDeviceChannel = (AirpcapGetDeviceChannelHandler) GetProcAddress(AirpcapLib, "AirpcapGetDeviceChannel")) == NULL) base_functions = FALSE;
2481                 if((g_PAirpcapSetDeviceChannel = (AirpcapSetDeviceChannelHandler) GetProcAddress(AirpcapLib, "AirpcapSetDeviceChannel")) == NULL) base_functions = FALSE;
2482                 if((g_PAirpcapGetFcsPresence = (AirpcapGetFcsPresenceHandler) GetProcAddress(AirpcapLib, "AirpcapGetFcsPresence")) == NULL) base_functions = FALSE;
2483                 if((g_PAirpcapSetFcsPresence = (AirpcapSetFcsPresenceHandler) GetProcAddress(AirpcapLib, "AirpcapSetFcsPresence")) == NULL) base_functions = FALSE;
2484                 if((g_PAirpcapGetFcsValidation = (AirpcapGetFcsValidationHandler) GetProcAddress(AirpcapLib, "AirpcapGetFcsValidation")) == NULL) base_functions = FALSE;
2485                 if((g_PAirpcapSetFcsValidation = (AirpcapSetFcsValidationHandler) GetProcAddress(AirpcapLib, "AirpcapSetFcsValidation")) == NULL) base_functions = FALSE;
2486                 if((g_PAirpcapGetDeviceKeys = (AirpcapGetDeviceKeysHandler) GetProcAddress(AirpcapLib, "AirpcapGetDeviceKeys")) == NULL) base_functions = FALSE;
2487                 if((g_PAirpcapSetDeviceKeys = (AirpcapSetDeviceKeysHandler) GetProcAddress(AirpcapLib, "AirpcapSetDeviceKeys")) == NULL) base_functions = FALSE;
2488                 if((g_PAirpcapGetDecryptionState = (AirpcapGetDecryptionStateHandler) GetProcAddress(AirpcapLib, "AirpcapGetDecryptionState")) == NULL) base_functions = FALSE;
2489                 if((g_PAirpcapSetDecryptionState = (AirpcapSetDecryptionStateHandler) GetProcAddress(AirpcapLib, "AirpcapSetDecryptionState")) == NULL) base_functions = FALSE;
2490                 if((g_PAirpcapStoreCurConfigAsAdapterDefault = (AirpcapStoreCurConfigAsAdapterDefaultHandler) GetProcAddress(AirpcapLib, "AirpcapStoreCurConfigAsAdapterDefault")) == NULL) base_functions = FALSE;
2491       if((g_PAirpcapGetVersion = (AirpcapGetVersionHandler) GetProcAddress(AirpcapLib, "AirpcapGetVersion")) == NULL) base_functions = FALSE;
2492       if((g_PAirpcapGetDriverDecryptionState = (AirpcapGetDriverDecryptionStateHandler) GetProcAddress(AirpcapLib, "AirpcapGetDriverDecryptionState")) == NULL) base_functions = FALSE;
2493                 if((g_PAirpcapSetDriverDecryptionState = (AirpcapSetDriverDecryptionStateHandler) GetProcAddress(AirpcapLib, "AirpcapSetDriverDecryptionState")) == NULL) base_functions = FALSE;
2494       if((g_PAirpcapGetDriverKeys = (AirpcapGetDriverKeysHandler) GetProcAddress(AirpcapLib, "AirpcapGetDriverKeys")) == NULL) base_functions = FALSE;
2495                 if((g_PAirpcapSetDriverKeys = (AirpcapSetDriverKeysHandler) GetProcAddress(AirpcapLib, "AirpcapSetDriverKeys")) == NULL) base_functions = FALSE;
2496
2497                 /* TEST IF AIRPCAP SUPPORTS 11N */
2498                 if((g_PAirpcapSetDeviceChannelEx = (AirpcapSetDeviceChannelExHandler) GetProcAddress(AirpcapLib, "AirpcapSetDeviceChannelEx")) == NULL) eleven_n_functions = FALSE;
2499       if((g_PAirpcapGetDeviceChannelEx = (AirpcapGetDeviceChannelExHandler) GetProcAddress(AirpcapLib, "AirpcapGetDeviceChannelEx")) == NULL) eleven_n_functions = FALSE;
2500                 if((g_PAirpcapGetDeviceSupportedChannels = (AirpcapGetDeviceSupportedChannelsHandler) GetProcAddress(AirpcapLib, "AirpcapGetDeviceSupportedChannels")) == NULL) eleven_n_functions = FALSE;
2501
2502                 if(base_functions && eleven_n_functions){
2503                         AirpcapLoaded = TRUE;
2504         AirpcapVersion = AIRPCAP_DLL_OK;
2505                 }else if(base_functions){
2506                         AirpcapLoaded = TRUE;
2507                         AirpcapVersion = AIRPCAP_DLL_OLD;
2508         return AIRPCAP_DLL_OK;
2509                 }else{
2510                         AirpcapLoaded = FALSE;
2511                         AirpcapVersion = AIRPCAP_DLL_ERROR;
2512                 }
2513     }
2514     return AirpcapVersion;
2515 }
2516
2517 /*
2518  * Append the version of AirPcap with which we were compiled to a GString.
2519  */
2520 void
2521 get_compiled_airpcap_version(GString *str)
2522 {
2523     g_string_append(str, "with AirPcap");
2524 }
2525
2526 /*
2527  * Append the version of AirPcap with which we we're running to a GString.
2528  */
2529 void
2530 get_runtime_airpcap_version(GString *str)
2531 {
2532     guint vmaj, vmin, vrev, build;
2533
2534     /* See if the DLL has been loaded successfully.  Bail if it hasn't */
2535     if (AirpcapLoaded == FALSE) {
2536         g_string_append(str, "without AirPcap");
2537         return;
2538     }
2539
2540     g_PAirpcapGetVersion(&vmaj, &vmin, &vrev, &build);
2541     g_string_sprintfa(str, "with AirPcap %d.%d.%d build %d", vmaj, vmin,
2542         vrev, build);
2543 }
2544 #endif /* HAVE_AIRPCAP */
2545 #endif /* _WIN32 */