8302ddfe061dcf6cdb4bc73bd0f21039322efee6
[obnox/wireshark/wip.git] / gtk / capture_if_details_dlg.c
1 /* capture_if_details_dlg.c
2  * Routines for capture interface details window (only Win32!)
3  *
4  * $Id$
5  *
6  * Wireshark - Network traffic analyzer
7  * By Gerald Combs <gerald@wireshark.org>
8  * Copyright 1998 Gerald Combs
9  *
10  * This program is free software; you can redistribute it and/or
11  * modify it under the terms of the GNU General Public License
12  * as published by the Free Software Foundation; either version 2
13  * of the License, or (at your option) any later version.
14  *
15  * This program is distributed in the hope that it will be useful,
16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18  * GNU General Public License for more details.
19  *
20  * You should have received a copy of the GNU General Public License
21  * along with this program; if not, write to the Free Software
22  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
23  */
24
25 #ifdef HAVE_CONFIG_H
26 # include "config.h"
27 #endif
28
29
30 #if defined HAVE_LIBPCAP && defined _WIN32
31
32 #include <string.h>
33
34 #include <gtk/gtk.h>
35
36 #include <wtap.h>
37 #include <time.h>
38
39 #include "globals.h"
40 #include "file.h"
41 #include "capture.h"
42 #include "main.h"
43 #include "dlg_utils.h"
44 #include "gui_utils.h"
45 #include "compat_macros.h"
46 #include "help_dlg.h"
47
48 #include <epan/value_string.h>
49 #include <epan/addr_resolv.h>
50
51 #ifndef HAVE_SOCKADDR_STORAGE
52 /* packet32.h requires sockaddr_storage (usually defined in Platform SDK)
53  * copied from RFC2553 (and slightly modified because of datatypes) ...
54  * XXX - defined more than once, move this to a header file */
55 typedef unsigned short eth_sa_family_t;
56
57 /*
58  * Desired design of maximum size and alignment
59  */
60 #define ETH_SS_MAXSIZE    128  /* Implementation specific max size */
61 #define ETH_SS_ALIGNSIZE  (sizeof (gint64 /*int64_t*/))
62                          /* Implementation specific desired alignment */
63 /*
64  * Definitions used for sockaddr_storage structure paddings design.
65  */
66 #define ETH_SS_PAD1SIZE   (ETH_SS_ALIGNSIZE - sizeof (eth_sa_family_t))
67 #define ETH_SS_PAD2SIZE   (ETH_SS_MAXSIZE - (sizeof (eth_sa_family_t) + \
68                               ETH_SS_PAD1SIZE + ETH_SS_ALIGNSIZE))
69
70 struct sockaddr_storage {
71     eth_sa_family_t  __ss_family;     /* address family */
72     /* Following fields are implementation specific */
73     char      __ss_pad1[ETH_SS_PAD1SIZE];
74               /* 6 byte pad, this is to make implementation */
75               /* specific pad up to alignment field that */
76               /* follows explicit in the data structure */
77     gint64 /*int64_t*/   __ss_align;     /* field to force desired structure */
78                /* storage alignment */
79     char      __ss_pad2[ETH_SS_PAD2SIZE];
80               /* 112 byte pad to achieve desired size, */
81               /* _SS_MAXSIZE value minus size of ss_family */
82               /* __ss_pad1, __ss_align fields is 112 */
83 };
84 /* ... copied from RFC2553 */
85 #endif
86
87
88 #include <Packet32.h>
89 #include <windows.h>
90 #include <windowsx.h>
91 #include <Ntddndis.h>
92
93 #include "capture_wpcap_packet.h"
94 #include "capture_if_details_dlg.h"
95
96 #include "simple_dialog.h"
97
98 #define DETAILS_STR_MAX     1024
99
100
101 /* The informations and definitions used here are coming from various places on the web:
102  *
103  * ndiswrapper (various NDIS related definitions)
104  *  http://cvs.sourceforge.net/viewcvs.py/ndiswrapper/ndiswrapper/driver/
105  *  
106  * ReactOS (various NDIS related definitions)
107  *  http://www.reactos.org/generated/doxygen/d2/d6d/ndis_8h-source.html
108  *
109  * IEEE802.11 "Detailed NDIS OID Log for a 802.11b Miniport"
110  *  http://www.ndis.com/papers/ieee802_11_log.htm
111  *
112  * FreeBSD (various NDIS related definitions)
113  *  http://lists.freebsd.org/pipermail/p4-projects/2004-January/003433.html
114  *
115  * MS WHDC "Network Drivers and Windows"
116  *  http://www.microsoft.com/whdc/archive/netdrv_up.mspx
117  *
118  * IEEE "Get IEEE 802" (the various 802.11 docs)
119  *  http://standards.ieee.org/getieee802/802.11.html
120  *
121  * MS MSDN "Network Devices: Windows Driver Kit"
122  *  http://msdn.microsoft.com/library/default.asp?url=/library/en-us/NetXP_r/hh/NetXP_r/netref_4c297a96-2ba5-41ed-ab21-b7a9cfaa9b4d.xml.asp
123  *
124  * MS MSDN "Microsoft Windows CE .NET 4.2 Network Driver Reference"
125  *  http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceddk40/html/cxgrfNetworkDriverReference.asp
126  *
127  * MS MSDN (some explanations of a special MS 802.11 Information Element)
128  *  http://msdn.microsoft.com/library/default.asp?url=/library/en-us/randz/protocol/securing_public_wi-fi_hotspots.asp
129  *
130  * "WLANINFO für Windows XP"
131  *  http://www-pc.uni-regensburg.de/systemsw/TOOLS/wlaninfo.htm
132  */
133
134 /********************************************************************************/
135 /* definitions that would usually come from the windows DDK (device driver kit) */
136 /* and are not part of the ntddndis.h file delivered with WinPcap */
137
138 /* Required OIDs */
139 #define OID_GEN_VLAN_ID                         0x0001021C
140
141 /* Optional OIDs */
142 #define OID_GEN_MEDIA_CAPABILITIES              0x00010201
143 #define OID_GEN_PHYSICAL_MEDIUM                 0x00010202
144
145 /* Optional OIDs */
146 #define OID_GEN_NETWORK_LAYER_ADDRESSES 0x00010118
147 #define OID_GEN_TRANSPORT_HEADER_OFFSET 0x00010119
148
149
150 /* Physical medium (OID_GEN_PHYSICAL_MEDIUM) */
151 typedef enum ndis_phys_medium {
152         NdisPhysicalMediumUnspecified,
153         NdisPhysicalMediumWirelessLan,
154         NdisPhysicalMediumCableModem,
155         NdisPhysicalMediumPhoneLine,
156         NdisPhysicalMediumPowerLine,
157         NdisPhysicalMediumDSL,
158         NdisPhysicalMediumFibreChannel,
159         NdisPhysicalMedium1394,
160         NdisPhysicalMediumWirelessWan,
161         NdisPhysicalMediumMax
162 };
163
164 /* flag definitions for OID_GEN_MAC_OPTIONS */
165 #define NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA     0x00000001
166 #define NDIS_MAC_OPTION_RECEIVE_SERIALIZED      0x00000002
167 #define NDIS_MAC_OPTION_TRANSFERS_NOT_PEND      0x00000004
168 #define NDIS_MAC_OPTION_NO_LOOPBACK             0x00000008
169 #define NDIS_MAC_OPTION_FULL_DUPLEX             0x00000010
170 #define NDIS_MAC_OPTION_EOTX_INDICATION         0x00000020
171 #define NDIS_MAC_OPTION_8021P_PRIORITY          0x00000040
172 #define NDIS_MAC_OPTION_8021Q_VLAN              0x00000080
173
174 /* 802.11 OIDs */
175 #define OID_802_11_BSSID                        0x0D010101
176 #define OID_802_11_SSID                         0x0D010102
177 #define OID_802_11_NETWORK_TYPES_SUPPORTED      0x0D010203
178 #define OID_802_11_NETWORK_TYPE_IN_USE          0x0D010204
179 #define OID_802_11_TX_POWER_LEVEL               0x0D010205
180 #define OID_802_11_RSSI                         0x0D010206
181 #define OID_802_11_RSSI_TRIGGER                 0x0D010207
182 #define OID_802_11_INFRASTRUCTURE_MODE          0x0D010108
183 #define OID_802_11_FRAGMENTATION_THRESHOLD      0x0D010209
184 #define OID_802_11_RTS_THRESHOLD                0x0D01020A
185 #define OID_802_11_NUMBER_OF_ANTENNAS           0x0D01020B
186 #define OID_802_11_RX_ANTENNA_SELECTED          0x0D01020C
187 #define OID_802_11_TX_ANTENNA_SELECTED          0x0D01020D
188 #define OID_802_11_SUPPORTED_RATES              0x0D01020E
189 #define OID_802_11_DESIRED_RATES                0x0D010210
190 #define OID_802_11_CONFIGURATION                0x0D010211
191 #define OID_802_11_STATISTICS                   0x0D020212
192 #define OID_802_11_ADD_WEP                      0x0D010113
193 #define OID_802_11_REMOVE_WEP                   0x0D010114
194 #define OID_802_11_DISASSOCIATE                 0x0D010115
195 #define OID_802_11_POWER_MODE                   0x0D010216
196 #define OID_802_11_BSSID_LIST                   0x0D010217
197 #define OID_802_11_AUTHENTICATION_MODE          0x0D010118
198 #define OID_802_11_PRIVACY_FILTER               0x0D010119
199 #define OID_802_11_BSSID_LIST_SCAN              0x0D01011A
200 #define OID_802_11_WEP_STATUS                   0x0D01011B
201 #define OID_802_11_ENCRYPTION_STATUS            OID_802_11_WEP_STATUS
202 #define OID_802_11_RELOAD_DEFAULTS              0x0D01011C
203 #define OID_802_11_ADD_KEY                      0x0D01011D
204 #define OID_802_11_REMOVE_KEY                   0x0D01011E
205 #define OID_802_11_ASSOCIATION_INFORMATION      0x0D01011F
206 #define OID_802_11_TEST                         0x0D010120
207 #define OID_802_11_CAPABILITY                   0x0D010122
208 #define OID_802_11_PMKID                        0x0D010123
209
210
211 /* PnP and power management OIDs */
212 #define OID_PNP_CAPABILITIES                    0xFD010100
213 #define OID_PNP_SET_POWER                       0xFD010101
214 #define OID_PNP_QUERY_POWER                     0xFD010102
215 #define OID_PNP_ADD_WAKE_UP_PATTERN             0xFD010103
216 #define OID_PNP_REMOVE_WAKE_UP_PATTERN          0xFD010104
217 #define OID_PNP_WAKE_UP_PATTERN_LIST            0xFD010105
218 #define OID_PNP_ENABLE_WAKE_UP                  0xFD010106
219
220
221 /* Currently associated SSID (OID_802_11_SSID) */
222 #define NDIS_ESSID_MAX_SIZE 32
223 struct ndis_essid {
224         ULONG length;
225         UCHAR essid[NDIS_ESSID_MAX_SIZE];
226 };
227
228 /* Current infrastructure mode (OID_802_11_INFRASTRUCTURE_MODE) */
229 enum network_infrastructure {
230         Ndis802_11IBSS,
231         Ndis802_11Infrastructure,
232         Ndis802_11AutoUnknown,
233         Ndis802_11InfrastructureMax
234 };
235
236 /* Current authentication mode (OID_802_11_AUTHENTICATION_MODE) */
237 enum authentication_mode {
238         Ndis802_11AuthModeOpen,
239         Ndis802_11AuthModeShared,
240         Ndis802_11AuthModeAutoSwitch,
241         Ndis802_11AuthModeWPA,
242         Ndis802_11AuthModeWPAPSK,
243         Ndis802_11AuthModeWPANone,
244         Ndis802_11AuthModeWPA2,
245         Ndis802_11AuthModeWPA2PSK,
246         Ndis802_11AuthModeMax
247 };
248
249 /* Current network type (OID_802_11_NETWORK_TYPES_SUPPORTED / OID_802_11_NETWORK_TYPE_IN_USE) */
250 enum network_type {
251         Ndis802_11FH,
252         Ndis802_11DS,
253         Ndis802_11OFDM5,
254         Ndis802_11OFDM24,
255         /* MSDN site uses Ndis802_11Automode, which is not mentioned
256          * in DDK, so add one and assign it to
257          * Ndis802_11NetworkTypeMax */
258         Ndis802_11Automode,
259         Ndis802_11NetworkTypeMax = Ndis802_11Automode
260 };
261
262 /* Current encryption status (OID_802_11_ENCRYPTION_STATUS) */
263 enum encryption_status {
264         Ndis802_11WEPEnabled,
265         Ndis802_11Encryption1Enabled = Ndis802_11WEPEnabled,
266         Ndis802_11WEPDisabled,
267         Ndis802_11EncryptionDisabled = Ndis802_11WEPDisabled,
268         Ndis802_11WEPKeyAbsent,
269         Ndis802_11Encryption1KeyAbsent = Ndis802_11WEPKeyAbsent,
270         Ndis802_11WEPNotSupported,
271         Ndis802_11EncryptionNotSupported = Ndis802_11WEPNotSupported,
272         Ndis802_11Encryption2Enabled,
273         Ndis802_11Encryption2KeyAbsent,
274         Ndis802_11Encryption3Enabled,
275         Ndis802_11Encryption3KeyAbsent
276 };
277
278
279 /* some definitions needed for the following structs */
280 #define NDIS_MAX_RATES_EX 16
281 typedef UCHAR mac_address[/* ETH_ALEN */ 6];
282 typedef UCHAR ndis_rates[NDIS_MAX_RATES_EX];
283
284 /* configuration, e.g. frequency (OID_802_11_CONFIGURATION / OID_802_11_BSSID_LIST) */
285 struct /*packed*/ ndis_configuration {
286         ULONG length;
287         ULONG beacon_period;
288         ULONG atim_window;
289         ULONG ds_config;
290         struct ndis_configuration_fh {
291                 ULONG length;
292                 ULONG hop_pattern;
293                 ULONG hop_set;
294                 ULONG dwell_time;
295         } fh_config;
296 };
297
298 /* bssid list item (OID_802_11_BSSID_LIST) */
299 struct ndis_ssid_item {
300         ULONG length;
301         mac_address mac;
302         UCHAR reserved[2];
303         struct ndis_essid ssid;
304         ULONG privacy;
305         LONG rssi;
306         UINT net_type;
307         struct ndis_configuration config;
308         UINT mode;
309         ndis_rates rates;
310         ULONG ie_length;
311         UCHAR ies[1];
312 };
313
314
315 typedef struct _NDIS_802_11_FIXED_IEs
316 {
317   UCHAR  Timestamp[8];
318   USHORT  BeaconInterval;
319   USHORT  Capabilities;
320 } NDIS_802_11_FIXED_IEs, *PNDIS_802_11_FIXED_IEs;
321
322
323 /* bssid list (OID_802_11_BSSID_LIST) */
324 struct ndis_bssid_list {
325         ULONG num_items;
326         struct ndis_ssid_item items[1];
327 };
328
329
330 /******************************************************************************/
331 /* OID_TCP_TASK_OFFLOAD specific definitions that would usually come from the */
332 /* windows DDK (device driver kit) and are not part of the ntddndis.h file */
333 /* delivered with WinPcap */
334
335 /* optional OID */
336 #define OID_TCP_TASK_OFFLOAD    0xFC010201
337
338 /* task id's */
339 typedef enum _NDIS_TASK {
340   TcpIpChecksumNdisTask,
341   IpSecNdisTask,
342   TcpLargeSendNdisTask,
343   MaxNdisTask
344 } NDIS_TASK, *PNDIS_TASK;
345
346 /* TaskBuffer content on TcpIpChecksumNdisTask */
347 typedef struct _NDIS_TASK_TCP_IP_CHECKSUM
348 {
349   struct
350   {
351     ULONG    IpOptionsSupported:1;
352     ULONG    TcpOptionsSupported:1;
353     ULONG    TcpChecksum:1;
354     ULONG    UdpChecksum:1;
355     ULONG    IpChecksum:1;
356   } V4Transmit;
357  
358   struct
359   {
360     ULONG    IpOptionsSupported:1;
361     ULONG    TcpOptionsSupported:1;
362     ULONG    TcpChecksum:1;
363     ULONG    UdpChecksum:1;
364     ULONG    IpChecksum:1;
365   } V4Receive;
366  
367   struct
368   {
369     ULONG    IpOptionsSupported:1;
370     ULONG    TcpOptionsSupported:1;
371     ULONG    TcpChecksum:1;
372     ULONG    UdpChecksum:1;
373   } V6Transmit;
374  
375   struct
376   {
377     ULONG    IpOptionsSupported:1;
378     ULONG    TcpOptionsSupported:1;
379     ULONG    TcpChecksum:1;
380     ULONG    UdpChecksum:1;
381   } V6Receive;
382 } NDIS_TASK_TCP_IP_CHECKSUM, *PNDIS_TASK_TCP_IP_CHECKSUM;
383
384 /* TaskBuffer content on TcpLargeSendNdisTask */
385 typedef struct _NDIS_TASK_TCP_LARGE_SEND
386 {
387   ULONG  Version;
388   ULONG  MaxOffLoadSize;
389   ULONG  MinSegmentCount;
390   BOOLEAN  TcpOptions;
391   BOOLEAN  IpOptions;
392 } NDIS_TASK_TCP_LARGE_SEND, *PNDIS_TASK_TCP_LARGE_SEND;
393
394 /* Encapsulations */
395 typedef enum _NDIS_ENCAPSULATION {
396   UNSPECIFIED_Encapsulation,
397   NULL_Encapsulation,
398   IEEE_802_3_Encapsulation,
399   IEEE_802_5_Encapsulation,
400   LLC_SNAP_ROUTED_Encapsulation,
401   LLC_SNAP_BRIDGED_Encapsulation
402 } NDIS_ENCAPSULATION;
403
404 /* Encapsulation format */
405 typedef struct _NDIS_ENCAPSULATION_FORMAT {
406   NDIS_ENCAPSULATION  Encapsulation;
407   struct {
408     ULONG  FixedHeaderSize : 1;
409     ULONG  Reserved : 31;
410   } Flags;
411   ULONG  EncapsulationHeaderSize;
412 } NDIS_ENCAPSULATION_FORMAT, *PNDIS_ENCAPSULATION_FORMAT;
413
414 /* request struct */
415 typedef struct _NDIS_TASK_OFFLOAD_HEADER
416 {
417   ULONG  Version;
418   ULONG  Size;
419   ULONG  Reserved;
420   UCHAR  OffsetFirstTask;
421   NDIS_ENCAPSULATION_FORMAT  EncapsulationFormat;
422 } NDIS_TASK_OFFLOAD_HEADER, *PNDIS_TASK_OFFLOAD_HEADER;
423
424 /* response struct */
425 #define NDIS_TASK_OFFLOAD_VERSION 1
426 typedef struct _NDIS_TASK_OFFLOAD
427 {
428   ULONG  Version;
429   ULONG  Size;
430   NDIS_TASK  Task;
431   ULONG  OffsetNextTask;
432   ULONG  TaskBufferLength;
433   UCHAR  TaskBuffer[1];
434 } NDIS_TASK_OFFLOAD, *PNDIS_TASK_OFFLOAD;
435
436
437 /***********************************************************************/
438 /* value_string's for info functions */
439
440
441 /* NDIS driver medium (OID_GEN_MEDIA_SUPPORTED / OID_GEN_MEDIA_IN_USE) */
442 static const value_string win32_802_3_medium_vals[] = {
443         { NdisMedium802_3,      "802.3 (Ethernet)" },    /* might as well be WLAN, ... (see NDIS_PHYSICAL_MEDIUM) */
444         { NdisMedium802_5,      "802.5 (Token Ring)" },
445         { NdisMediumFddi,       "FDDI" },
446         { NdisMediumWan,        "WAN" },
447         { NdisMediumLocalTalk,  "Local Talk" },
448         { NdisMediumDix,        "Dix" },
449         { NdisMediumArcnetRaw,  "Arcnet Raw" },
450         { NdisMediumArcnet878_2,"Arcnet 878_2" },
451         { NdisMediumAtm,        "ATM" },
452         { NdisMediumWirelessWan,"Wireless WAN" },
453         { NdisMediumIrda,       "Irda" },
454     { 0, NULL }
455 };
456
457 /* NDIS physical driver medium (OID_GEN_PHYSICAL_MEDIUM) */
458 static const value_string win32_802_3_physical_medium_vals[] = {
459         { NdisPhysicalMediumUnspecified,    "Unspecified" },
460         { NdisPhysicalMediumWirelessLan,    "Wireless LAN" },
461         { NdisPhysicalMediumCableModem,     "Cable Modem (DOCSIS)" },
462         { NdisPhysicalMediumPhoneLine,      "Phone Line" },
463         { NdisPhysicalMediumPowerLine,      "Power Line" },
464         { NdisPhysicalMediumDSL,            "DSL" },
465         { NdisPhysicalMediumFibreChannel,   "Fibre Channel" },
466         { NdisPhysicalMedium1394,           "IEEE 1394" },
467         { NdisPhysicalMediumWirelessWan,    "Wireless WAN" },
468     { 0, NULL }
469 };
470
471 static const value_string win32_802_11_infra_mode_vals[] = {
472         { Ndis802_11IBSS,           "Ad Hoc" },
473         { Ndis802_11Infrastructure, "Access Point" },
474         { Ndis802_11AutoUnknown,    "Auto or unknown" },
475     { 0, NULL }
476 };
477
478 static const value_string win32_802_11_auth_mode_vals[] = {
479         { Ndis802_11AuthModeOpen,       "Open System" },
480         { Ndis802_11AuthModeShared,     "Shared Key" },
481         { Ndis802_11AuthModeAutoSwitch, "Auto Switch" },
482         { Ndis802_11AuthModeWPA,        "WPA" },
483         { Ndis802_11AuthModeWPAPSK,     "WPA-PSK (pre shared key)" },
484         { Ndis802_11AuthModeWPANone,    "WPA (ad hoc)" },
485         { Ndis802_11AuthModeWPA2,       "WPA2" },
486         { Ndis802_11AuthModeWPA2PSK,    "WPA2-PSK (pre shared key)" },
487     { 0, NULL }
488 };
489
490 static const value_string win32_802_11_network_type_vals[] = {
491         { Ndis802_11FH,         "FH (frequency-hopping spread-spectrum)" },
492         { Ndis802_11DS,         "DS (direct-sequence spread-spectrum)" },
493         { Ndis802_11OFDM5,      "5-GHz OFDM" },
494         { Ndis802_11OFDM24,     "2.4-GHz OFDM" },
495         { Ndis802_11Automode,   "Auto" },
496     { 0, NULL }
497 };
498
499 static const value_string win32_802_11_encryption_status_vals[] = {
500         { Ndis802_11Encryption1Enabled,     "Encryption 1 Enabled  (WEP enabled, TKIP & AES disabled, transmit key available)" },
501         { Ndis802_11EncryptionDisabled,     "Encryption Disabled  (WEP & TKIP & AES disabled, transmit key available)" },
502         { Ndis802_11Encryption1KeyAbsent,   "Encryption 1 Key Absent (WEP enabled, TKIP & AES disabled, transmit key unavailable)" },
503         { Ndis802_11EncryptionNotSupported, "Encryption Not Supported (WEP & TKIP & AES not supported)" },
504         { Ndis802_11Encryption2Enabled,     "Encryption 2 Enabled (WEP & TKIP enabled, AES disabled, transmit key available)" },
505         { Ndis802_11Encryption2KeyAbsent,   "Encryption 2 Key Absent (WEP & TKIP enabled, AES disabled, transmit key unavailable)" },
506         { Ndis802_11Encryption3Enabled,     "Encryption 3 Enabled (WEP & TKIP & AES enabled, transmit key available)" },
507         { Ndis802_11Encryption3KeyAbsent,   "Encryption 3 Key Absent (WEP & TKIP & AES enabled, transmit key unavailable)" },
508     { 0, NULL }
509 };
510
511 /* frequency to channel mapping (OID_802_11_CONFIGURATION) */
512 static const value_string win32_802_11_channel_freq_vals[] = {
513         { 2412000, "1 (2412000 kHz)" },
514         { 2417000, "2 (2417000 kHz)" },
515         { 2422000, "3 (2422000 kHz)" },
516         { 2427000, "4 (2427000 kHz)" },
517         { 2432000, "5 (2432000 kHz)" },
518         { 2437000, "6 (2437000 kHz)" },
519         { 2442000, "7 (2442000 kHz)" },
520         { 2447000, "8 (2447000 kHz)" },
521         { 2452000, "9 (2452000 kHz)" },
522         { 2457000, "10 (2457000 kHz)" },
523         { 2462000, "11 (2462000 kHz)" },
524         { 2467000, "12 (2467000 kHz)" },
525         { 2472000, "13 (2472000 kHz)" },
526         { 2484000, "14 (2484000 kHz)" },
527     { 0, NULL }
528 };
529
530 /* frequency to channel mapping (OID_802_11_CONFIGURATION) */
531 static const value_string win32_802_11_channel_vals[] = {
532         { 2412000, "1" },
533         { 2417000, "2" },
534         { 2422000, "3" },
535         { 2427000, "4" },
536         { 2432000, "5" },
537         { 2437000, "6" },
538         { 2442000, "7" },
539         { 2447000, "8" },
540         { 2452000, "9" },
541         { 2457000, "10" },
542         { 2462000, "11" },
543         { 2467000, "12" },
544         { 2472000, "13" },
545         { 2484000, "14" },
546     { 0, NULL }
547 };
548
549
550 /* ElementID in NDIS_802_11_VARIABLE_IEs */
551 static const value_string ie_id_vals[] = {
552         { 0, "SSID, 802.11" },
553         { 1, "Supported Rates, 802.11" },
554         { 2, "FH Parameter Set, 802.11" },
555         { 3, "DS Parameter Set, 802.11" },
556         { 4, "CF Parameter Set, 802.11" },
557         { 5, "TIM, 802.11" },
558         { 6, "IBSS Parameter Set, 802.11" },
559         { 7, "Country, 802.11d" },
560         { 8, "Hopping Pattern Parameters, 802.11d" },
561         { 9, "Hopping Pattern Table, 802.11d" },
562         { 10, "Request, 802.11d" },
563     /* 11-15 reserved, 802.11d */
564         { 16, "Challenge text, 802.11" },
565     /* 17-31 reserved, 802.11h */
566         { 32, "Power Constraint, 802.11h" },
567         { 33, "Power Capability, 802.11h" },
568         { 34, "TPC Request, 802.11h" },
569         { 35, "TPC Report, 802.11h" },
570         { 36, "Supported Channels, 802.11h" },
571         { 37, "Channel Switch Announcement, 802.11h" },
572         { 38, "Measurement Request, 802.11h" },
573         { 39, "Measurement Report, 802.11h" },
574         { 40, "Quiet, 802.11h" },
575         { 41, "IBSS DFS, 802.11h" },
576         { 42, "ERP information, 802.11g" },
577     /* 43-47 reserved, 802.11i */
578         { 48, "WPA2/RSN (Robust Secure Network), 802.11i" },
579     /* 49 reserved, 802.11i */
580         { 50, "Extended Supported Rates, 802.11g" },
581     /* 51-255 reserved, 802.11g */
582         { 221, "WPA, (no 802.11!)" },
583     { 0, NULL }
584 };
585
586
587 static const value_string oid_vals[] = {
588         { OID_GEN_SUPPORTED_LIST, "OID_GEN_SUPPORTED_LIST" },
589         { OID_GEN_HARDWARE_STATUS, "OID_GEN_HARDWARE_STATUS (only internally interesting)" },
590         { OID_GEN_MEDIA_SUPPORTED, "OID_GEN_MEDIA_SUPPORTED" },
591         { OID_GEN_MEDIA_IN_USE, "OID_GEN_MEDIA_IN_USE" },
592     { OID_GEN_MAXIMUM_LOOKAHEAD, "OID_GEN_MAXIMUM_LOOKAHEAD (unused)" },
593         { OID_GEN_MAXIMUM_FRAME_SIZE, "OID_GEN_MAXIMUM_FRAME_SIZE (unused)" },
594         { OID_GEN_LINK_SPEED, "OID_GEN_LINK_SPEED" },
595         { OID_GEN_TRANSMIT_BUFFER_SPACE, "OID_GEN_TRANSMIT_BUFFER_SPACE" },
596         { OID_GEN_RECEIVE_BUFFER_SPACE, "OID_GEN_RECEIVE_BUFFER_SPACE" },
597         { OID_GEN_TRANSMIT_BLOCK_SIZE, "OID_GEN_TRANSMIT_BLOCK_SIZE" },
598         { OID_GEN_RECEIVE_BLOCK_SIZE, "OID_GEN_RECEIVE_BLOCK_SIZE" },
599         { OID_GEN_VENDOR_ID, "OID_GEN_VENDOR_ID" },
600         { OID_GEN_VENDOR_DESCRIPTION, "OID_GEN_VENDOR_DESCRIPTION" },
601         { OID_GEN_CURRENT_PACKET_FILTER, "OID_GEN_CURRENT_PACKET_FILTER (info seems to be constant)" },
602         { OID_GEN_CURRENT_LOOKAHEAD, "OID_GEN_CURRENT_LOOKAHEAD (only internally interesting)" },
603         { OID_GEN_DRIVER_VERSION, "OID_GEN_DRIVER_VERSION" },
604         { OID_GEN_MAXIMUM_TOTAL_SIZE, "OID_GEN_MAXIMUM_TOTAL_SIZE" },
605         { OID_GEN_PROTOCOL_OPTIONS, "OID_GEN_PROTOCOL_OPTIONS (info not interesting)" },
606     { OID_GEN_MAC_OPTIONS, "OID_GEN_MAC_OPTIONS" },
607         { OID_GEN_MEDIA_CONNECT_STATUS, "OID_GEN_MEDIA_CONNECT_STATUS" },
608         { OID_GEN_MAXIMUM_SEND_PACKETS, "OID_GEN_MAXIMUM_SEND_PACKETS (only internally interesting)" },
609         { OID_GEN_VENDOR_DRIVER_VERSION, "OID_GEN_VENDOR_DRIVER_VERSION" },
610         { OID_GEN_XMIT_OK, "OID_GEN_XMIT_OK" },
611         { OID_GEN_RCV_OK, "OID_GEN_RCV_OK" },
612         { OID_GEN_XMIT_ERROR, "OID_GEN_XMIT_ERROR" },
613         { OID_GEN_RCV_ERROR, "OID_GEN_RCV_ERROR" },
614         { OID_GEN_RCV_NO_BUFFER, "OID_GEN_RCV_NO_BUFFER" },
615         { OID_GEN_DIRECTED_BYTES_XMIT, "OID_GEN_DIRECTED_BYTES_XMIT" },
616         { OID_GEN_DIRECTED_FRAMES_XMIT, "OID_GEN_DIRECTED_FRAMES_XMIT" },
617         { OID_GEN_MULTICAST_BYTES_XMIT, "OID_GEN_MULTICAST_BYTES_XMIT" },
618         { OID_GEN_MULTICAST_FRAMES_XMIT, "OID_GEN_MULTICAST_FRAMES_XMIT" },
619         { OID_GEN_BROADCAST_BYTES_XMIT, "OID_GEN_BROADCAST_BYTES_XMIT" },
620         { OID_GEN_BROADCAST_FRAMES_XMIT, "OID_GEN_BROADCAST_FRAMES_XMIT" },
621         { OID_GEN_DIRECTED_BYTES_RCV, "OID_GEN_DIRECTED_BYTES_RCV" },
622         { OID_GEN_DIRECTED_FRAMES_RCV, "OID_GEN_DIRECTED_FRAMES_RCV" },
623         { OID_GEN_MULTICAST_BYTES_RCV, "OID_GEN_MULTICAST_BYTES_RCV" },
624         { OID_GEN_MULTICAST_FRAMES_RCV, "OID_GEN_MULTICAST_FRAMES_RCV" },
625         { OID_GEN_BROADCAST_BYTES_RCV, "OID_GEN_BROADCAST_BYTES_RCV" },
626     { OID_GEN_BROADCAST_FRAMES_RCV, "OID_GEN_BROADCAST_FRAMES_RCV" },
627         { OID_GEN_RCV_CRC_ERROR, "OID_GEN_RCV_CRC_ERROR" },
628         { OID_GEN_TRANSMIT_QUEUE_LENGTH, "OID_GEN_TRANSMIT_QUEUE_LENGTH" },
629         { OID_GEN_GET_TIME_CAPS, "OID_GEN_GET_TIME_CAPS (unsupp, unused)" },
630         { OID_GEN_GET_NETCARD_TIME, "OID_GEN_GET_NETCARD_TIME (unsupp, unused)" },
631
632     { OID_GEN_PHYSICAL_MEDIUM, "OID_GEN_PHYSICAL_MEDIUM" },
633         /*{ OID_GEN_MACHINE_NAME, "OID_GEN_MACHINE_NAME (unsupp, unused)" },*/
634         { OID_GEN_VLAN_ID, "OID_GEN_VLAN_ID" },
635         { OID_GEN_MEDIA_CAPABILITIES, "OID_GEN_MEDIA_CAPABILITIES (unsupp, unused)" },
636
637     { OID_GEN_NETWORK_LAYER_ADDRESSES, "OID_GEN_NETWORK_LAYER_ADDRESSES (write only)" },
638     { OID_GEN_TRANSPORT_HEADER_OFFSET, "OID_GEN_TRANSPORT_HEADER_OFFSET (write only)" },
639
640         { OID_802_3_PERMANENT_ADDRESS, "OID_802_3_PERMANENT_ADDRESS" },
641         { OID_802_3_CURRENT_ADDRESS, "OID_802_3_CURRENT_ADDRESS" },
642     { OID_802_3_MAXIMUM_LIST_SIZE, "OID_802_3_MAXIMUM_LIST_SIZE (unused)" },
643     { OID_802_3_MULTICAST_LIST, "OID_802_3_MULTICAST_LIST (unused)" }, /* XXX */
644     { OID_802_3_MAC_OPTIONS, "OID_802_3_MAC_OPTIONS (unsupp, unused)" },
645
646     { OID_802_3_RCV_ERROR_ALIGNMENT, "OID_802_3_RCV_ERROR_ALIGNMENT" },
647     { OID_802_3_XMIT_ONE_COLLISION, "OID_802_3_XMIT_ONE_COLLISION" },
648     { OID_802_3_XMIT_MORE_COLLISIONS, "OID_802_3_XMIT_MORE_COLLISIONS" },
649     { OID_802_3_XMIT_DEFERRED, "OID_802_3_XMIT_DEFERRED" },
650     { OID_802_3_XMIT_MAX_COLLISIONS, "OID_802_3_XMIT_MAX_COLLISIONS" },
651     { OID_802_3_RCV_OVERRUN, "OID_802_3_RCV_OVERRUN" },
652     { OID_802_3_XMIT_UNDERRUN, "OID_802_3_XMIT_UNDERRUN" },
653     { OID_802_3_XMIT_HEARTBEAT_FAILURE, "OID_802_3_XMIT_HEARTBEAT_FAILURE (unsupp, used)" },
654     { OID_802_3_XMIT_TIMES_CRS_LOST, "OID_802_3_XMIT_TIMES_CRS_LOST (unsupp, used)" },
655     { OID_802_3_XMIT_LATE_COLLISIONS, "OID_802_3_XMIT_LATE_COLLISIONS" },
656
657     { OID_802_11_BSSID, "OID_802_11_BSSID" },
658         { OID_802_11_SSID, "OID_802_11_SSID" },
659         { OID_802_11_NETWORK_TYPES_SUPPORTED, "OID_802_11_NETWORK_TYPES_SUPPORTED (info not interesting)" },
660         { OID_802_11_NETWORK_TYPE_IN_USE, "OID_802_11_NETWORK_TYPE_IN_USE" },
661         { OID_802_11_TX_POWER_LEVEL, "OID_802_11_TX_POWER_LEVEL (unsupp, used)" },
662         { OID_802_11_RSSI, "OID_802_11_RSSI" },
663         { OID_802_11_RSSI_TRIGGER, "OID_802_11_RSSI_TRIGGER (unsupp, unused)" },
664     { OID_802_11_INFRASTRUCTURE_MODE, "OID_802_11_INFRASTRUCTURE_MODE" },
665         { OID_802_11_FRAGMENTATION_THRESHOLD, "OID_802_11_FRAGMENTATION_THRESHOLD (unused)" },
666         { OID_802_11_RTS_THRESHOLD, "OID_802_11_RTS_THRESHOLD (unused)" },
667         { OID_802_11_NUMBER_OF_ANTENNAS, "OID_802_11_NUMBER_OF_ANTENNAS (unsupp, unused)" },
668         { OID_802_11_RX_ANTENNA_SELECTED, "OID_802_11_RX_ANTENNA_SELECTED (unsupp, unused)" },
669         { OID_802_11_TX_ANTENNA_SELECTED, "OID_802_11_TX_ANTENNA_SELECTED (unsupp, unused)" },
670         { OID_802_11_SUPPORTED_RATES, "OID_802_11_SUPPORTED_RATES" },
671         { OID_802_11_DESIRED_RATES, "OID_802_11_DESIRED_RATES (unsupp, used)" },
672         { OID_802_11_CONFIGURATION, "OID_802_11_CONFIGURATION" },
673         { OID_802_11_STATISTICS, "OID_802_11_STATISTICS (unsupp, unused)" },
674         { OID_802_11_ADD_WEP, "OID_802_11_ADD_WEP (write only)" },
675         { OID_802_11_REMOVE_WEP, "OID_802_11_REMOVE_WEP (write only)" },
676         { OID_802_11_DISASSOCIATE, "OID_802_11_DISASSOCIATE (write only)" },
677         { OID_802_11_POWER_MODE, "OID_802_11_POWER_MODE (info not interesting)" },
678         { OID_802_11_BSSID_LIST, "OID_802_11_BSSID_LIST" },
679         { OID_802_11_AUTHENTICATION_MODE, "OID_802_11_AUTHENTICATION_MODE" },
680         { OID_802_11_PRIVACY_FILTER, "OID_802_11_PRIVACY_FILTER (info not interesting)" },
681         { OID_802_11_BSSID_LIST_SCAN, "OID_802_11_BSSID_LIST_SCAN" },
682         { OID_802_11_WEP_STATUS, "OID_802_11_WEP_STATUS (info not interesting?)" },
683         { OID_802_11_ENCRYPTION_STATUS, "OID_802_11_ENCRYPTION_STATUS (unsupp, used)" },
684         { OID_802_11_RELOAD_DEFAULTS, "OID_802_11_RELOAD_DEFAULTS (write only)" },
685         { OID_802_11_ADD_KEY, "OID_802_11_ADD_KEY (write only)" },
686         { OID_802_11_REMOVE_KEY, "OID_802_11_REMOVE_KEY (write only)" },
687         { OID_802_11_ASSOCIATION_INFORMATION, "OID_802_11_ASSOCIATION_INFORMATION (unused)" }, /* XXX */
688         { OID_802_11_TEST, "OID_802_11_TEST (write only)" },
689         { OID_802_11_CAPABILITY, "OID_802_11_CAPABILITY (unsupp, unused)" },
690         { OID_802_11_PMKID, "OID_802_11_PMKID (unsupp, unused)" },
691
692     /* Token-Ring list is utterly incomplete (contains only the values for MS Loopback Driver) */
693     { OID_802_5_PERMANENT_ADDRESS, "OID_802_5_PERMANENT_ADDRESS (unused)" },
694     { OID_802_5_CURRENT_ADDRESS, "OID_802_5_CURRENT_ADDRESS (unused)" },
695     { OID_802_5_CURRENT_FUNCTIONAL, "OID_802_5_CURRENT_FUNCTIONAL (unused)" },
696     { OID_802_5_CURRENT_GROUP, "OID_802_5_CURRENT_GROUP (unused)" },
697     { OID_802_5_LAST_OPEN_STATUS, "OID_802_5_LAST_OPEN_STATUS (unused)" },
698     { OID_802_5_CURRENT_RING_STATUS, "OID_802_5_CURRENT_RING_STATUS (unused)" },
699     { OID_802_5_CURRENT_RING_STATE, "OID_802_5_CURRENT_RING_STATE (unused)" },
700     { OID_802_5_LINE_ERRORS, "OID_802_5_LINE_ERRORS (unused)" },
701     { OID_802_5_LOST_FRAMES, "OID_802_5_LOST_FRAMES (unused)" },
702
703     /* FDDI list is utterly incomplete (contains only the values for MS Loopback Driver) */
704     { OID_FDDI_LONG_PERMANENT_ADDR, "OID_FDDI_LONG_PERMANENT_ADDR (unused)" },
705     { OID_FDDI_LONG_CURRENT_ADDR, "OID_FDDI_LONG_CURRENT_ADDR (unused)" },
706     { OID_FDDI_LONG_MULTICAST_LIST, "OID_FDDI_LONG_MULTICAST_LIST (unused)" },
707     { OID_FDDI_LONG_MAX_LIST_SIZE, "OID_FDDI_LONG_MAX_LIST_SIZE (unused)" },
708     { OID_FDDI_SHORT_PERMANENT_ADDR, "OID_FDDI_SHORT_PERMANENT_ADDR (unused)" },
709     { OID_FDDI_SHORT_CURRENT_ADDR, "OID_FDDI_SHORT_CURRENT_ADDR (unused)" },
710     { OID_FDDI_SHORT_MULTICAST_LIST, "OID_FDDI_SHORT_MULTICAST_LIST (unused)" },
711     { OID_FDDI_SHORT_MAX_LIST_SIZE, "OID_FDDI_SHORT_MAX_LIST_SIZE (unused)" },
712
713     /* LocalTalk list is utterly incomplete (contains only the values for MS Loopback Driver) */
714     { OID_LTALK_CURRENT_NODE_ID, "OID_LTALK_CURRENT_NODE_ID (unused)" },
715
716     /* Arcnet list is utterly incomplete (contains only the values for MS Loopback Driver) */
717     { OID_ARCNET_PERMANENT_ADDRESS, "OID_ARCNET_PERMANENT_ADDRESS (unused)" },
718     { OID_ARCNET_CURRENT_ADDRESS, "OID_ARCNET_CURRENT_ADDRESS (unused)" },
719
720     { OID_TCP_TASK_OFFLOAD, "OID_TCP_TASK_OFFLOAD" },
721
722     /* PnP and power management OIDs */
723     { OID_PNP_CAPABILITIES, "OID_PNP_CAPABILITIES (unused)" },
724     { OID_PNP_SET_POWER, "OID_PNP_SET_POWER (write only)" },
725     { OID_PNP_QUERY_POWER, "OID_PNP_QUERY_POWER (unused)" },
726     { OID_PNP_ADD_WAKE_UP_PATTERN, "OID_PNP_ADD_WAKE_UP_PATTERN (write only)" },
727     { OID_PNP_REMOVE_WAKE_UP_PATTERN, "OID_PNP_REMOVE_WAKE_UP_PATTERN (write only)" },
728     { OID_PNP_WAKE_UP_PATTERN_LIST, "OID_PNP_WAKE_UP_PATTERN_LIST (unused)" },
729     { OID_PNP_ENABLE_WAKE_UP, "OID_PNP_ENABLE_WAKE_UP (unused)" },
730
731     /* Unknown OID's (seen on an "Intel(R) PRO/Wireless 2200BG" 802.11 interface) */
732     { 0xFF100000, "Unknown 0xFF100000 (unused)" },
733     { 0xFF100002, "Unknown 0xFF100002 (unused)" },
734     { 0xFF100003, "Unknown 0xFF100003 (unused)" },
735     { 0xFF100004, "Unknown 0xFF100004 (unused)" },
736     { 0xFF100005, "Unknown 0xFF100005 (unused)" },
737     { 0xFF100006, "Unknown 0xFF100006 (unused)" },
738     { 0xFF100007, "Unknown 0xFF100007 (unused)" },
739     { 0xFF100009, "Unknown 0xFF100009 (unused)" },
740     { 0xFF10000b, "Unknown 0xFF10000b (unused)" },
741     { 0xFF10000c, "Unknown 0xFF10000c (unused)" },
742     { 0xFF10000e, "Unknown 0xFF10000e (unused)" },
743     { 0xFF10000f, "Unknown 0xFF10000f (unused)" },
744     /* continued by a lot more 0xFF... values */
745     
746     { 0, NULL }
747 };
748
749
750 /***************************************************************************/
751 /* debug functions, query or list supported NDIS OID's */
752
753
754 static void
755 supported_list(LPADAPTER adapter) 
756 {
757     unsigned char       values[10000];
758     int                 length;
759
760
761     g_warning("supported_list_unhandled");
762     length = sizeof(values);
763     if (wpcap_packet_request(adapter, OID_GEN_SUPPORTED_LIST, FALSE /* !set */, values, &length)) {
764         guint32 *value = (guint32 *) values;
765
766         while (length>=4) {
767             printf("OID: 0x%08X %s\n", *value, val_to_str(*value, oid_vals, "unknown"));
768
769             value++;
770             length-=4;
771         }
772     }
773 }
774
775
776 static gboolean
777 supported_query_oid(LPADAPTER adapter, guint32 oid) 
778 {
779     unsigned char       values[10000];
780     int                 length;
781
782     
783     length = sizeof(values);
784     if (wpcap_packet_request(adapter, OID_GEN_SUPPORTED_LIST, FALSE /* !set */, values, &length)) {
785         guint32 *value = (guint32 *) values;
786
787         while (length>=4) {
788             if(*value == oid) {
789                 return TRUE;
790             }
791             value++;
792             length-=4;
793         }
794     }
795
796     return FALSE;
797 }
798
799
800 /******************************************************************************/
801 /* info functions, get and display various NDIS driver values */
802
803
804 static void
805 add_row_to_table(GtkWidget *list, guint *row, gchar *title, const gchar *value, gboolean sensitive)
806 {
807     GtkWidget *label;
808     gchar     *indent;
809
810     if(strlen(value) != 0) {
811         indent = g_strdup_printf("   %s", title);
812     } else {
813         indent = g_strdup(title);
814     }
815     label = gtk_label_new(indent);
816     g_free(indent);
817     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
818     gtk_widget_set_sensitive(label, sensitive);
819     gtk_table_attach_defaults(GTK_TABLE(list), label, 0, 1, *row, *row+1);
820
821     label = gtk_label_new(value);
822     gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
823     gtk_widget_set_sensitive(label, sensitive);
824     gtk_table_attach_defaults(GTK_TABLE(list), label, 1, 2, *row, *row+1);
825
826     *row = *row + 1;
827 }
828
829
830 static void
831 add_string_to_table_sensitive(GtkWidget *list, guint *row, gchar *title, gchar *value, gboolean sensitive)
832 {
833     add_row_to_table(list, row, title, value, sensitive);
834 }
835
836
837 static void
838 add_string_to_table(GtkWidget *list, guint *row, gchar *title, const gchar *value)
839 {
840     add_row_to_table(list, row, title, value, TRUE);
841 }
842
843
844 static void
845 ssid_details(GtkWidget *table, guint *row, struct ndis_essid *ssid_in) {
846     struct ndis_essid   ssid[2]; /* prevent an off by one error */
847
848
849     ssid[0] = *ssid_in;
850     g_assert(ssid->length <= NDIS_ESSID_MAX_SIZE);
851
852     if(ssid->length != 0) {
853         ssid->essid[ssid->length] = '\0';
854         add_string_to_table(table, row, "SSID (Service Set IDentifier)", ssid->essid);
855     } else {
856         add_string_to_table(table, row, "SSID (Service Set IDentifier)", "(currently not associated with an SSID)");
857     }
858 }
859
860
861 static GString *
862 rates_details(unsigned char *values, int length) {
863     int                 i;
864     GString             *Rates;
865     float               float_value;
866     int                 int_value;
867
868
869     Rates = g_string_new("");
870
871     if(length != 0) {
872         i = 0;
873         while(length--) {
874             if(values[i]) {
875                 if(i != 0) {
876                     g_string_append(Rates, "/");
877                 }
878
879                 float_value = (float) ((values[i] & 0x7F) / 2);
880
881                 /* reduce the screen estate by showing fractions only where required */
882                 int_value = (int)float_value;
883                 if(float_value == (float)int_value) {
884                     g_string_sprintfa(Rates, "%.0f", float_value);
885                 } else {
886                     g_string_sprintfa(Rates, "%.1f", float_value);
887                 }
888             }
889             i++;
890         }
891         Rates = g_string_append(Rates, " MBits/s");
892     } else {
893         Rates = g_string_append(Rates, "-");
894     }
895
896     return Rates;
897 }
898
899
900 /* debugging only */
901 static void
902 hex(unsigned char *p, int len) {
903     int i = 0;
904     while(len) {
905         g_warning("%u: 0x%x (%u) '%c'", i, *p, *p,
906             isprint(*p) ? *p : '.');
907
908         i++;
909         p++;
910         len--;
911     }
912 }
913
914
915 static void
916 capture_if_details_802_11_bssid_list(GtkWidget *main_vb, struct ndis_bssid_list *bssid_list)
917 {
918     struct ndis_ssid_item   *bssid_item;
919     unsigned char           mac[6];
920     const gchar             *manuf_name;
921     GString                 *Rates;
922
923
924     if(bssid_list->num_items != 0) {
925         char *titles[] = { "SSID", "MAC", "Vendor", "Privacy", "RSSI" , "Network Type" , "Infra. Mode" , "Ch." , "Rates" };
926         GtkWidget   *list;
927         gboolean    privacy_required;
928         gboolean    privacy_wpa;
929         gboolean    privacy_wpa2;
930
931         gchar ssid_buff[DETAILS_STR_MAX];
932         gchar mac_buff[DETAILS_STR_MAX];
933         gchar vendor_buff[DETAILS_STR_MAX];
934         gchar privacy_buff[DETAILS_STR_MAX];
935         gchar rssi_buff[DETAILS_STR_MAX];
936         gchar nettype_buff[DETAILS_STR_MAX];
937         gchar infra_buff[DETAILS_STR_MAX];
938         gchar freq_buff[DETAILS_STR_MAX];
939
940         list = simple_list_new(9, titles);
941         gtk_container_add(GTK_CONTAINER(main_vb), list);
942
943         bssid_item = &bssid_list->items[0];
944
945         while(bssid_list->num_items--) {
946             privacy_required = FALSE;
947             privacy_wpa = FALSE;
948             privacy_wpa2 = FALSE;
949
950             /* SSID */
951             if(bssid_item->ssid.length > DETAILS_STR_MAX-1) {
952                 bssid_item->ssid.length = DETAILS_STR_MAX-1;
953             }
954             memcpy(ssid_buff, bssid_item->ssid.essid, bssid_item->ssid.length);
955             ssid_buff[bssid_item->ssid.length] = '\0';
956
957             /* MAC */
958             memcpy(mac, &bssid_item->mac, sizeof(mac));
959             g_snprintf(mac_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X",
960                 mac[0], mac[1], mac[2], 
961                 mac[3], mac[4], mac[5]);
962
963             /* Vendor */
964             manuf_name = get_manuf_name_if_known(mac);
965             if(manuf_name != NULL) {
966                 strcpy(vendor_buff, manuf_name);
967             } else {
968                 strcpy(vendor_buff, "");
969             }
970
971             /* Supported Rates */
972             Rates = rates_details(bssid_item->rates, NDIS_MAX_RATES_EX);
973
974             /* RSSI */
975             g_snprintf(rssi_buff, DETAILS_STR_MAX, "%d dBm", bssid_item->rssi);
976
977             /* Privacy */
978             /* (flag is set, if WEP (or higher) privacy is required) */
979             if(bssid_item->privacy) {
980                 privacy_required = TRUE;
981             }
982
983             /* Network Type */
984             g_snprintf(nettype_buff, sizeof(nettype_buff), "%s",
985                 val_to_str(bssid_item->net_type, win32_802_11_network_type_vals, "(0x%x)"));
986
987             /* Infrastructure Mode */
988             g_snprintf(infra_buff, sizeof(infra_buff), "%s",
989                 val_to_str(bssid_item->mode, win32_802_11_infra_mode_vals, "(0x%x)"));
990
991             /* Channel */
992             g_snprintf(freq_buff, sizeof(freq_buff), "%s",
993                 val_to_str(bssid_item->config.ds_config, win32_802_11_channel_vals, "(%u kHz)"));
994
995             /* XXX - IE Length is currently not really supported here */
996             {
997                 int len = bssid_item->ie_length;
998                 unsigned char *iep = bssid_item->ies;
999                 unsigned char id;
1000                 unsigned el_len;
1001                 NDIS_802_11_FIXED_IEs *fixed_ies;
1002 /*#define DEBUG_IE*/
1003 #ifdef DEBUG_IE
1004                 const gchar     *manuf_name;
1005                 gchar           string_buff[DETAILS_STR_MAX];
1006 #endif
1007
1008
1009                 fixed_ies = (NDIS_802_11_FIXED_IEs *) iep;
1010
1011 #if 0
1012                   UCHAR  Timestamp[8];
1013   USHORT  BeaconInterval;
1014   USHORT  Capabilities;
1015 } NDIS_802_11_FIXED_IEs, *PNDIS_802_11_FIXED_IEs;
1016 #endif
1017
1018                 iep += sizeof(NDIS_802_11_FIXED_IEs);
1019                 len = bssid_item->ie_length - sizeof(NDIS_802_11_FIXED_IEs);
1020
1021                 while(len >= 2) {
1022                     id = *iep;
1023                     iep++;
1024                     el_len = *iep;
1025                     iep++;
1026                     len-=2;
1027
1028 #ifdef DEBUG_IE
1029                     g_warning("ID: %s (%u) Len: %u", 
1030                         val_to_str(id, ie_id_vals, "0x%x"), id, el_len);
1031 #endif
1032
1033                     if (id != 0 && id != 1 && id != 3 && id != 5 && id != 42 && id != 50 && id != 221) {
1034                         hex(iep, el_len);
1035                     }
1036                     
1037                     /* WPA2 (RSN) */
1038                     if (id == 48) {
1039                         privacy_wpa2 = TRUE;
1040                     }
1041
1042                     /* WPA */
1043                     if (id == 221) {
1044                         privacy_wpa = TRUE;
1045
1046 #ifdef DEBUG_IE
1047                         /* include information from epan/packet-ieee80211.c dissect_vendor_ie_wpawme() */
1048                         manuf_name = get_manuf_name_if_known(iep);
1049                         if(manuf_name != NULL) {
1050                             g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X (%s) Type: %02X", 
1051                                 *(iep), *(iep+1), *(iep+2), manuf_name, *(iep+3));
1052                         } else {
1053                             g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X Type: %02X", 
1054                                 *(iep), *(iep+1), *(iep+2), *(iep+3));
1055                         }
1056
1057                         g_warning("%s", string_buff);
1058                         iep += 4;
1059                         el_len-= 4;
1060                         len -= 4;
1061
1062                         hex(iep, el_len);
1063 #endif
1064                     }
1065                     
1066                     iep += el_len;
1067                     len -= el_len;
1068                 }
1069             }
1070
1071             if(privacy_required) {
1072                 if(privacy_wpa2) {
1073                     /* XXX - how to detect data encryption (TKIP and AES)? */
1074                     /* XXX - how to detect authentication (PSK or not)? */
1075                     g_snprintf(privacy_buff, DETAILS_STR_MAX, "WPA2");
1076                 } else {
1077                     if(privacy_wpa) {
1078                         /* XXX - how to detect data encryption (TKIP and AES)? */
1079                         /* XXX - how to detect authentication (PSK or not)? */
1080                         g_snprintf(privacy_buff, DETAILS_STR_MAX, "WPA");
1081                     } else {
1082                         /* XXX - how to detect authentication (Open System and Shared Key)? */
1083                         g_snprintf(privacy_buff, DETAILS_STR_MAX, "WEP");
1084                     }
1085                 }
1086             } else {
1087                 g_snprintf(privacy_buff, DETAILS_STR_MAX, "None");
1088             }
1089
1090             simple_list_append(list, 
1091                 0, ssid_buff,
1092                 1, mac_buff,
1093                 2, vendor_buff,
1094                 3, privacy_buff,
1095                 4, rssi_buff,
1096                 5, nettype_buff,
1097                 6, infra_buff, 
1098                 7, freq_buff, 
1099                 8, Rates->str,
1100                 -1);
1101
1102             g_string_free(Rates, TRUE /* free_segment */);
1103
1104             /* the bssid_list isn't an array, but a sequence of variable length items */
1105             bssid_item = (struct ndis_ssid_item *) (((char *) bssid_item) + bssid_item->length);
1106         }
1107     }
1108 }
1109
1110 static int
1111 capture_if_details_802_11(GtkWidget *table, GtkWidget *main_vb, guint *row, LPADAPTER adapter) {
1112     ULONG               ulong_value;
1113     LONG                long_value;
1114     unsigned int        uint_value;
1115     unsigned char       values[100];
1116     struct ndis_essid   ssid;
1117     int                 length;
1118     struct ndis_bssid_list      *bssid_list;
1119     struct ndis_configuration   *configuration;
1120     gchar               string_buff[DETAILS_STR_MAX];
1121     GString             *Rates;
1122     int                 entries = 0;
1123     const gchar         *manuf_name;
1124
1125
1126     add_string_to_table(table, row, "Characteristics", "");
1127
1128     /* SSID */
1129     length = sizeof(struct ndis_essid);
1130     memset(&ssid, 0, length);
1131     if (wpcap_packet_request(adapter, OID_802_11_SSID, FALSE /* !set */, (char *) &ssid, &length)) {
1132         ssid_details(table, row, &ssid);
1133         entries++;
1134     } else {
1135         add_string_to_table(table, row, "SSID (Service Set IDentifier)", "-");
1136     }
1137
1138     /* BSSID */
1139     length = sizeof(values);
1140     memset(values, 0, 6);
1141     if (wpcap_packet_request(adapter, OID_802_11_BSSID, FALSE /* !set */, values, &length)) {
1142         manuf_name = get_manuf_name_if_known(values);
1143         if(manuf_name != NULL) {
1144             g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X (%s)",
1145                 values[0], values[1], values[2], 
1146                 values[3], values[4], values[5],
1147                 manuf_name);
1148         } else {
1149             g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X",
1150                 values[0], values[1], values[2], 
1151                 values[3], values[4], values[5]);
1152         }
1153         entries++;
1154     } else {
1155         g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1156     }
1157     add_string_to_table(table, row, "BSSID (Basic Service Set IDentifier)", string_buff);
1158
1159     /* Network type in use */
1160     if (wpcap_packet_request_uint(adapter, OID_802_11_NETWORK_TYPE_IN_USE, &uint_value)) {
1161         add_string_to_table(table, row, "Network type used", 
1162             val_to_str(uint_value, win32_802_11_network_type_vals, "(0x%x)"));
1163         entries++;
1164     } else {
1165         add_string_to_table(table, row, "Network type used", "-");
1166     }
1167
1168     /* Infrastructure mode */
1169     if (wpcap_packet_request_ulong(adapter, OID_802_11_INFRASTRUCTURE_MODE, &uint_value)) {
1170         add_string_to_table(table, row, "Infrastructure mode", 
1171             val_to_str(uint_value, win32_802_11_infra_mode_vals, "(0x%x)"));
1172         entries++;
1173     } else {
1174         add_string_to_table(table, row, "Infrastructure mode", "-");
1175     }
1176
1177     /* Authentication mode */
1178     if (wpcap_packet_request_ulong(adapter, OID_802_11_AUTHENTICATION_MODE, &uint_value)) {
1179         add_string_to_table(table, row, "Authentication mode", 
1180             val_to_str(uint_value, win32_802_11_auth_mode_vals, "(0x%x)"));
1181         entries++;
1182     } else {
1183         add_string_to_table(table, row, "Authentication mode", "-");
1184     }
1185
1186     /* Encryption (WEP) status */
1187     if (wpcap_packet_request_ulong(adapter, OID_802_11_ENCRYPTION_STATUS, &uint_value)) {
1188         add_string_to_table(table, row, "Encryption status", 
1189             val_to_str(uint_value, win32_802_11_encryption_status_vals, "(0x%x)"));
1190         entries++;
1191     } else {
1192         add_string_to_table(table, row, "Encryption status", "-");
1193     }
1194
1195     /* TX power */
1196     if (wpcap_packet_request_ulong(adapter, OID_802_11_TX_POWER_LEVEL, &ulong_value)) {
1197         g_snprintf(string_buff, DETAILS_STR_MAX, "%ld mW", ulong_value);
1198         add_string_to_table(table, row, "TX power", string_buff);
1199         entries++;
1200     } else {
1201         add_string_to_table(table, row, "TX power", "-");
1202     }
1203
1204     /* RSSI */
1205     if (wpcap_packet_request_ulong(adapter, OID_802_11_RSSI, &long_value)) {
1206         g_snprintf(string_buff, DETAILS_STR_MAX, "%ld dBm (typical -10 through -100)", long_value);
1207         add_string_to_table(table, row, "RSSI (Received Signal Strength Indication)", string_buff);
1208         entries++;
1209     } else {
1210         add_string_to_table(table, row, "RSSI (Received Signal Strength Indication)", "-");
1211     }
1212
1213     /* Supported Rates */
1214     length = sizeof(values);
1215     if (!wpcap_packet_request(adapter, OID_802_11_SUPPORTED_RATES, FALSE /* !set */, values, &length)) {
1216         length = 0;
1217     } else {
1218         entries++;
1219     }
1220
1221     Rates = rates_details(values, length);
1222     add_string_to_table(table, row, "Supported Rates", Rates->str);
1223     g_string_free(Rates, TRUE /* free_segment */);
1224
1225     /* Desired Rates */
1226     length = sizeof(values);
1227     if (!wpcap_packet_request(adapter, OID_802_11_DESIRED_RATES, FALSE /* !set */, values, &length)) {
1228         length = 0;
1229     } else {
1230         entries++;
1231     }
1232
1233     Rates = rates_details(values, length);
1234     add_string_to_table(table, row, "Desired Rates", Rates->str);
1235     g_string_free(Rates, TRUE /* free_segment */);
1236
1237     /* Configuration (e.g. frequency) */
1238     length = sizeof(values);
1239     if (wpcap_packet_request(adapter, OID_802_11_CONFIGURATION, FALSE /* !set */, (char *) values, &length)) {
1240         configuration = (struct ndis_configuration *) values;
1241
1242         add_string_to_table(table, row, "Channel",
1243             val_to_str(configuration->ds_config, win32_802_11_channel_freq_vals, "(%u kHz)"));
1244         entries++;
1245     } else {
1246         add_string_to_table(table, row, "Channel", "-");
1247     }
1248
1249     /* BSSID list: first trigger a scan */
1250     length = sizeof(uint_value);
1251     if (wpcap_packet_request(adapter, OID_802_11_BSSID_LIST_SCAN, TRUE /* set */, (char *) &uint_value, &length)) {
1252 #if 0
1253         g_warning("BSSID list scan done");
1254     } else {
1255         g_warning("BSSID list scan failed");
1256 #endif
1257     }
1258
1259     /* BSSID list: get scan results */
1260     /* XXX - we might have to wait up to 7 seconds! */
1261         length = sizeof(ULONG) + sizeof(struct ndis_ssid_item) * 16;
1262         bssid_list = g_malloc(length);
1263         /* some drivers don't set bssid_list->num_items to 0 if
1264            OID_802_11_BSSID_LIST returns no items (prism54 driver, e.g.,) */
1265         memset(bssid_list, 0, length);
1266
1267     if (wpcap_packet_request(adapter, OID_802_11_BSSID_LIST, FALSE /* !set */, (char *) bssid_list, &length)) {
1268         add_string_to_table(table, row, "", "");
1269         add_string_to_table(table, row, "BSSID list", "");
1270
1271         capture_if_details_802_11_bssid_list(main_vb, bssid_list);
1272         entries += bssid_list->num_items;
1273     } else {
1274         add_string_to_table(table, row, "802.11 BSSID list", "-");
1275     }
1276
1277     g_free(bssid_list);
1278
1279     return entries;
1280 }
1281
1282
1283 static int
1284 capture_if_details_802_3(GtkWidget *table, GtkWidget *main_vb, guint *row, LPADAPTER adapter) {
1285     unsigned int    uint_value;
1286     unsigned char   values[100];
1287     int             length;
1288     gchar           string_buff[DETAILS_STR_MAX];
1289     const gchar     *manuf_name;
1290     int             entries = 0;
1291
1292
1293     add_string_to_table(table, row, "Characteristics", "");
1294
1295     length = sizeof(values);
1296     if (wpcap_packet_request(adapter, OID_802_3_PERMANENT_ADDRESS, FALSE /* !set */, values, &length)) {
1297         manuf_name = get_manuf_name_if_known(values);
1298         if(manuf_name != NULL) {
1299             g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X (%s)",
1300                 values[0], values[1], values[2], 
1301                 values[3], values[4], values[5],
1302                 manuf_name);
1303         } else {
1304             g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X",
1305                 values[0], values[1], values[2], 
1306                 values[3], values[4], values[5]);
1307         }
1308         entries++;
1309     } else {
1310         g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1311     }
1312     add_string_to_table(table, row, "Permanent station address", string_buff);
1313
1314     length = sizeof(values);
1315     if (wpcap_packet_request(adapter, OID_802_3_CURRENT_ADDRESS, FALSE /* !set */, values, &length)) {
1316         manuf_name = get_manuf_name_if_known(values);
1317         if(manuf_name != NULL) {
1318             g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X (%s)",
1319                 values[0], values[1], values[2], 
1320                 values[3], values[4], values[5],
1321                 manuf_name);
1322         } else {
1323             g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X",
1324                 values[0], values[1], values[2], 
1325                 values[3], values[4], values[5]);
1326         }
1327         entries++;
1328     } else {
1329         g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1330     }
1331     add_string_to_table(table, row, "Current station address", string_buff);
1332
1333
1334     add_string_to_table(table, row, "", "");
1335     add_string_to_table(table, row, "Statistics", "");
1336
1337     if (wpcap_packet_request_uint(adapter, OID_802_3_RCV_ERROR_ALIGNMENT, &uint_value)) {
1338         g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1339         entries++;
1340     } else {
1341         g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1342     }
1343     add_string_to_table(table, row, "Packets received with alignment error", string_buff);
1344
1345     if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_ONE_COLLISION, &uint_value)) {
1346         g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1347         entries++;
1348     } else {
1349         g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1350     }
1351     add_string_to_table(table, row, "Packets transmitted with one collision", string_buff);
1352
1353     if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_MORE_COLLISIONS, &uint_value)) {
1354         g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1355         entries++;
1356     } else {
1357         g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1358     }
1359     add_string_to_table(table, row, "Packets transmitted with more than one collision", string_buff);
1360
1361     if (wpcap_packet_request_uint(adapter, OID_802_3_RCV_OVERRUN, &uint_value)) {
1362         g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1363         entries++;
1364     } else {
1365         g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1366     }
1367     add_string_to_table(table, row, "Packets not received due to overrun", string_buff);
1368
1369     if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_DEFERRED, &uint_value)) {
1370         g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1371         entries++;
1372     } else {
1373         g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1374     }
1375     add_string_to_table(table, row, "Packets transmitted after deferred", string_buff);
1376
1377     if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_MAX_COLLISIONS, &uint_value)) {
1378         g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1379         entries++;
1380     } else {
1381         g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1382     }
1383     add_string_to_table(table, row, "Packets not transmitted due to collisions", string_buff);
1384
1385     if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_UNDERRUN, &uint_value)) {
1386         g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1387         entries++;
1388     } else {
1389         g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1390     }
1391     add_string_to_table(table, row, "Packets not transmitted due to underrun", string_buff);
1392
1393     if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_HEARTBEAT_FAILURE, &uint_value)) {
1394         g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1395         entries++;
1396     } else {
1397         g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1398     }
1399     add_string_to_table(table, row, "Packets transmitted with heartbeat failure", string_buff);
1400
1401     if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_TIMES_CRS_LOST, &uint_value)) {
1402         g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1403         entries++;
1404     } else {
1405         g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1406     }
1407     add_string_to_table(table, row, "Times carrier sense signal lost during transmission", string_buff);
1408
1409     if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_LATE_COLLISIONS, &uint_value)) {
1410         g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1411         entries++;
1412     } else {
1413         g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1414     }
1415     add_string_to_table(table, row, "Times late collisions detected", string_buff);
1416
1417     return entries;
1418 }
1419
1420 static int
1421 capture_if_details_task_offload(GtkWidget *table, GtkWidget *main_vb, guint *row, LPADAPTER adapter) {
1422     NDIS_TASK_OFFLOAD_HEADER *offload;
1423     unsigned char   values[10000];
1424     int             length;
1425     gchar           string_buff[DETAILS_STR_MAX];
1426     int             entries = 0;
1427     int             TcpIpChecksumSupported = 0;
1428     int             IpSecSupported = 0;
1429     int             TcpLargeSendSupported = 0;
1430
1431
1432     /* Task Offload */
1433     offload = (NDIS_TASK_OFFLOAD_HEADER *) values;
1434     offload->Version = NDIS_TASK_OFFLOAD_VERSION;
1435     offload->Size = sizeof(NDIS_TASK_OFFLOAD_HEADER);
1436     offload->Reserved = 0;
1437     offload->OffsetFirstTask = 0;
1438     /* the EncapsulationFormat seems to be ignored on a query (using Ethernet values) */
1439     offload->EncapsulationFormat.Encapsulation = IEEE_802_3_Encapsulation;
1440     offload->EncapsulationFormat.Flags.FixedHeaderSize = 1;
1441     offload->EncapsulationFormat.Flags.Reserved = 0;
1442     offload->EncapsulationFormat.EncapsulationHeaderSize = 14; /* sizeof(struct ether_header) */;
1443     
1444     length = sizeof(values);
1445     if (wpcap_packet_request(adapter, OID_TCP_TASK_OFFLOAD, FALSE /* !set */, values, &length)) {
1446         NDIS_TASK_OFFLOAD *of;
1447         /* XXX - hmmm, using a tvb for this? */
1448         unsigned char *valuep = values + offload->OffsetFirstTask;
1449         length -= offload->OffsetFirstTask;
1450
1451         do {
1452             of = (NDIS_TASK_OFFLOAD *) valuep;
1453
1454             switch(of->Task) {
1455             case TcpIpChecksumNdisTask:
1456                 {
1457                     NDIS_TASK_TCP_IP_CHECKSUM *tic = (NDIS_TASK_TCP_IP_CHECKSUM *) (of->TaskBuffer);
1458
1459                     entries++;
1460                     TcpIpChecksumSupported++;
1461
1462                     add_string_to_table(table, row, "TCP/IP Checksum", "");
1463
1464                     g_snprintf(string_buff, DETAILS_STR_MAX, "");
1465                     add_string_to_table(table, row, "V4 transmit checksum", "");
1466
1467                     g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, UDP: %s, IP: %s",
1468                         tic->V4Transmit.TcpChecksum ? "Yes" : "No",
1469                         tic->V4Transmit.UdpChecksum ? "Yes" : "No",
1470                         tic->V4Transmit.IpChecksum ? "Yes" : "No");
1471                     add_string_to_table(table, row, "Calculation supported", string_buff);
1472
1473                     g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, IP: %s",
1474                         tic->V4Transmit.TcpOptionsSupported ? "Yes" : "No",
1475                         tic->V4Transmit.IpOptionsSupported ? "Yes" : "No");
1476                     add_string_to_table(table, row, "Options fields supported", string_buff);
1477
1478                     g_snprintf(string_buff, DETAILS_STR_MAX, "");
1479                     add_string_to_table(table, row, "V4 receive checksum", "");
1480
1481                     g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, UDP: %s, IP: %s",
1482                         tic->V4Receive.TcpChecksum ? "Yes" : "No",
1483                         tic->V4Receive.UdpChecksum ? "Yes" : "No",
1484                         tic->V4Receive.IpChecksum ? "Yes" : "No");
1485                     add_string_to_table(table, row, "Validation supported", string_buff);
1486
1487                     g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, IP: %s",
1488                         tic->V4Receive.TcpOptionsSupported ? "Yes" : "No",
1489                         tic->V4Receive.IpOptionsSupported ? "Yes" : "No");
1490                     add_string_to_table(table, row, "Options fields supported", string_buff);
1491
1492                     g_snprintf(string_buff, DETAILS_STR_MAX, "");
1493                     add_string_to_table(table, row, "V6 transmit checksum", "");
1494
1495                     g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, UDP: %s",
1496                         tic->V6Transmit.TcpChecksum ? "Yes" : "No",
1497                         tic->V6Transmit.UdpChecksum ? "Yes" : "No");
1498                     add_string_to_table(table, row, "Calculation supported", string_buff);
1499
1500                     g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, IP: %s",
1501                         tic->V6Transmit.TcpOptionsSupported ? "Yes" : "No",
1502                         tic->V6Transmit.IpOptionsSupported ? "Yes" : "No");
1503                     add_string_to_table(table, row, "Options fields supported", string_buff);
1504
1505                     g_snprintf(string_buff, DETAILS_STR_MAX, "");
1506                     add_string_to_table(table, row, "V6 receive checksum", "");
1507
1508                     g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, UDP: %s",
1509                         tic->V6Receive.TcpChecksum ? "Yes" : "No",
1510                         tic->V6Receive.UdpChecksum ? "Yes" : "No");
1511                     add_string_to_table(table, row, "Validation supported", string_buff);
1512
1513                     g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, IP: %s",
1514                         tic->V6Receive.TcpOptionsSupported ? "Yes" : "No",
1515                         tic->V6Receive.IpOptionsSupported ? "Yes" : "No");
1516                     add_string_to_table(table, row, "Options fields supported", string_buff);
1517                 }
1518                 break;
1519             case IpSecNdisTask:
1520                 entries++;
1521                 IpSecSupported++;
1522
1523                 add_string_to_table(table, row, "IPSEC", "");
1524                 g_snprintf(string_buff, DETAILS_STR_MAX, "IPSEC (TaskID 1) not decoded yet");
1525                 add_string_to_table(table, row, "Task", string_buff);
1526                 break;
1527             case TcpLargeSendNdisTask:
1528                 {
1529                     NDIS_TASK_TCP_LARGE_SEND *tls = (NDIS_TASK_TCP_LARGE_SEND *) (of->TaskBuffer);
1530
1531                     entries++;
1532                     TcpLargeSendSupported++;
1533
1534                     add_string_to_table(table, row, "TCP large send", "");
1535                     /* XXX - while MSDN tells about version 0, we see version 1?!? */
1536                     if(tls->Version == 1) {
1537                         g_snprintf(string_buff, DETAILS_STR_MAX, "%u", tls->MaxOffLoadSize);
1538                         add_string_to_table(table, row, "Max Offload Size", string_buff);
1539                         g_snprintf(string_buff, DETAILS_STR_MAX, "%u", tls->MinSegmentCount);
1540                         add_string_to_table(table, row, "Min Segment Count", string_buff);
1541                         g_snprintf(string_buff, DETAILS_STR_MAX, "%s", tls->TcpOptions ? "Yes" : "No");
1542                         add_string_to_table(table, row, "TCP option fields", string_buff);
1543                         g_snprintf(string_buff, DETAILS_STR_MAX, "%s", tls->IpOptions ? "Yes" : "No");
1544                         add_string_to_table(table, row, "IP option fields", string_buff);
1545                     } else {
1546                         g_snprintf(string_buff, DETAILS_STR_MAX, "%u (unknown)", tls->Version);
1547                         add_string_to_table(table, row, "Version", string_buff);
1548                     }
1549                 }
1550                 break;
1551             default:
1552                 g_snprintf(string_buff, DETAILS_STR_MAX, "Unknown task %u", of->Task);
1553                 add_string_to_table(table, row, "Task", string_buff);
1554
1555             }
1556             
1557             add_string_to_table(table, row, "", "");
1558
1559             valuep += of->OffsetNextTask;
1560             length -= of->OffsetNextTask;
1561         } while(of->OffsetNextTask != 0);
1562     } 
1563
1564     if(TcpIpChecksumSupported == 0) {
1565         add_string_to_table(table, row, "TCP/IP Checksum", "");
1566         add_string_to_table(table, row, "Offload not supported", "-");
1567     }
1568
1569     if(IpSecSupported == 0) {
1570         add_string_to_table(table, row, "IpSec", "");
1571         add_string_to_table(table, row, "Offload not supported", "-");
1572     }
1573         
1574     if(TcpLargeSendSupported == 0) {
1575         add_string_to_table(table, row, "TCP Large Send", "");
1576         add_string_to_table(table, row, "Offload not supported", "-");
1577     }
1578
1579     return entries;
1580 }
1581
1582 static int
1583 capture_if_details_general(GtkWidget *table, GtkWidget *main_vb, guint *row, LPADAPTER adapter, gchar *iface) {
1584     gchar           string_buff[DETAILS_STR_MAX];
1585     const gchar     *manuf_name;
1586     unsigned int    uint_value;
1587     unsigned int    uint_array[50];
1588     int             uint_array_size;
1589     unsigned int    physical_medium;
1590     int             i;
1591     unsigned char   values[100];
1592     int             length;
1593     unsigned short  ushort_value;
1594     int             entries = 0;
1595
1596
1597     /* general */
1598     add_string_to_table(table, row, "Characteristics", "");
1599
1600     /* Vendor description */
1601     length = sizeof(values);
1602     if (wpcap_packet_request(adapter, OID_GEN_VENDOR_DESCRIPTION, FALSE /* !set */, values, &length)) {
1603         g_snprintf(string_buff, DETAILS_STR_MAX, "%s", values);
1604         entries++;
1605     } else {
1606         g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1607     }
1608     add_string_to_table(table, row, "Vendor description", string_buff);
1609
1610     /* Interface */
1611     add_string_to_table(table, row, "Interface", iface);
1612
1613     /* link status (connected/disconnected) */
1614     if (wpcap_packet_request_uint(adapter, OID_GEN_MEDIA_CONNECT_STATUS, &uint_value)) {
1615         entries++;
1616         if(uint_value == 0) {
1617             add_string_to_table(table, row, "Link status", "Connected");
1618         } else {
1619             add_string_to_table(table, row, "Link status", "Disconnected");
1620         }
1621     } else {
1622         add_string_to_table(table, row, "Link status", "-");
1623     }
1624
1625     /* link speed */
1626     if (wpcap_packet_request_uint(adapter, OID_GEN_LINK_SPEED, &uint_value)) {
1627         entries++;
1628         uint_value *= 100;
1629         if(uint_value >= 1000 * 1000) {
1630             g_snprintf(string_buff, DETAILS_STR_MAX, "%d MBits/s", uint_value / 1000 / 1000);
1631         } else {
1632             if(uint_value >= 1000) {
1633                 g_snprintf(string_buff, DETAILS_STR_MAX, "%d KBits/s", uint_value / 1000);
1634             } else {
1635                 g_snprintf(string_buff, DETAILS_STR_MAX, "%d Bits/s", uint_value);
1636             }
1637         }
1638     } else {
1639         g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1640     }
1641     add_string_to_table(table, row, "Link speed", string_buff);
1642
1643
1644
1645     uint_array_size = sizeof(uint_array);
1646     if (wpcap_packet_request(adapter, OID_GEN_MEDIA_SUPPORTED, FALSE /* !set */, (char *) uint_array, &uint_array_size)) {
1647         entries++;
1648         uint_array_size /= sizeof(unsigned int);
1649         i=0;
1650         while(uint_array_size--) {
1651             add_string_to_table(table, row, "Media supported", 
1652                 val_to_str(uint_array[i], win32_802_3_medium_vals, "(0x%x)"));
1653             i++;
1654         }
1655     } else {
1656         add_string_to_table(table, row, "Media supported", "-");
1657     }
1658
1659     uint_array_size = sizeof(uint_array);
1660     if (wpcap_packet_request(adapter, OID_GEN_MEDIA_IN_USE, FALSE /* !set */, (char *) uint_array, &uint_array_size)) {
1661         entries++;
1662         uint_array_size /= sizeof(unsigned int);
1663         i=0;
1664         while(uint_array_size--) {
1665             add_string_to_table(table, row, "Medium in use", 
1666                   val_to_str(uint_array[i], win32_802_3_medium_vals, "(0x%x)"));
1667             i++;
1668         }
1669     } else {
1670         add_string_to_table(table, row, "Medium in use", "-");
1671     }
1672
1673     if (wpcap_packet_request_uint(adapter, OID_GEN_PHYSICAL_MEDIUM, &physical_medium)) {
1674         entries++;
1675         add_string_to_table(table, row, "Physical medium", 
1676             val_to_str(physical_medium, win32_802_3_physical_medium_vals, "(0x%x)"));
1677     } else {
1678         add_string_to_table(table, row, "Physical medium", "-");
1679     }
1680
1681     length = sizeof(ushort_value);
1682     if (wpcap_packet_request(adapter, OID_GEN_DRIVER_VERSION, FALSE /* !set */, (char *) &ushort_value, &length)) {
1683         entries++;
1684         g_snprintf(string_buff, DETAILS_STR_MAX, "%u.%u", ushort_value / 0x100, ushort_value % 0x100);
1685     } else {
1686         g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1687     }
1688     add_string_to_table(table, row, "NDIS Driver Version", string_buff);
1689
1690     length = sizeof(uint_value);
1691     if (wpcap_packet_request(adapter, OID_GEN_VENDOR_DRIVER_VERSION, FALSE /* !set */, (char *) &uint_value, &length)) {
1692         entries++;
1693         /* XXX - what's the correct output format? */
1694         g_snprintf(string_buff, DETAILS_STR_MAX, "%u.%u (Hex: %X.%X)", 
1695             (uint_value / 0x10000  ) % 0x10000,
1696              uint_value              % 0x10000,
1697             (uint_value / 0x10000  ) % 0x10000,
1698              uint_value              % 0x10000);
1699     } else {
1700         g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1701     }
1702     add_string_to_table(table, row, "Vendor Driver Version", string_buff);
1703
1704     length = sizeof(values);
1705     if (wpcap_packet_request(adapter, OID_GEN_VENDOR_ID, FALSE /* !set */, values, &length)) {
1706         entries++;
1707         manuf_name = get_manuf_name_if_known(values);
1708         if(manuf_name != NULL) {
1709             g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X (%s) NIC: %02X", 
1710                 values[0], values[1], values[2], manuf_name, values[3]);
1711         } else {
1712             g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X NIC: %02X", 
1713                 values[0], values[1], values[2], values[3]);
1714         }
1715     } else {
1716         g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1717     }
1718     add_string_to_table(table, row, "Vendor ID", string_buff);
1719
1720     if (wpcap_packet_request_uint(adapter, OID_GEN_MAC_OPTIONS, &uint_value)) {
1721         entries++;
1722         g_snprintf(string_buff, DETAILS_STR_MAX, 
1723             "802.1P Priority: %s, 802.1Q VLAN: %s", 
1724             (uint_value & NDIS_MAC_OPTION_8021P_PRIORITY) ? "Supported" : "Unsupported",
1725             (uint_value & NDIS_MAC_OPTION_8021Q_VLAN) ? "Supported" : "Unsupported" );
1726     } else {
1727         g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1728     }
1729     add_string_to_table(table, row, "MAC Options", string_buff);
1730
1731     if (wpcap_packet_request_uint(adapter, OID_GEN_VLAN_ID, &uint_value)) {
1732         entries++;
1733         g_snprintf(string_buff, DETAILS_STR_MAX, "%u", uint_value);
1734     } else {
1735         g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1736     }
1737     add_string_to_table(table, row, "VLAN ID", string_buff);
1738
1739 #if 0
1740     /* value seems to be constant */
1741     if (wpcap_packet_request_uint(adapter, OID_GEN_CURRENT_PACKET_FILTER, &uint_value)) {
1742         entries++;
1743         g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1744     } else {
1745         g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1746     }
1747     add_string_to_table(table, row, "Packet filter", string_buff);
1748 #endif
1749
1750     if (wpcap_packet_request_uint(adapter, OID_GEN_TRANSMIT_BUFFER_SPACE, &uint_value)) {
1751         entries++;
1752         g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1753     } else {
1754         g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1755     }
1756     add_string_to_table(table, row, "Transmit Buffer Space", string_buff);
1757
1758     if (wpcap_packet_request_uint(adapter, OID_GEN_RECEIVE_BUFFER_SPACE, &uint_value)) {
1759         entries++;
1760         g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1761     } else {
1762         g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1763     }
1764     add_string_to_table(table, row, "Receive Buffer Space", string_buff);
1765
1766     if (wpcap_packet_request_uint(adapter, OID_GEN_TRANSMIT_BLOCK_SIZE , &uint_value)) {
1767         entries++;
1768         g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1769     } else {
1770         g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1771     }
1772     add_string_to_table(table, row, "Transmit Block Size", string_buff);
1773
1774     if (wpcap_packet_request_uint(adapter, OID_GEN_RECEIVE_BLOCK_SIZE, &uint_value)) {
1775         entries++;
1776         g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1777     } else {
1778         g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1779     }
1780     add_string_to_table(table, row, "Receive Block Size", string_buff);
1781
1782     if (wpcap_packet_request_uint(adapter, OID_GEN_MAXIMUM_TOTAL_SIZE, &uint_value)) {
1783         entries++;
1784         g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1785     } else {
1786         g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1787     }
1788     add_string_to_table(table, row, "Maximum Packet Size", string_buff);
1789
1790     return entries;
1791 }
1792
1793
1794 static int
1795 capture_if_details_stats(GtkWidget *table, GtkWidget *main_vb, guint *row, LPADAPTER adapter) {
1796     gchar           string_buff[DETAILS_STR_MAX];
1797     unsigned int    uint_value;
1798     int             entries = 0;
1799
1800
1801     add_string_to_table(table, row, "Statistics", "");
1802
1803     if (wpcap_packet_request_uint(adapter, OID_GEN_XMIT_OK, &uint_value)) {
1804         entries++;
1805         g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1806     } else {
1807         g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1808     }
1809     add_string_to_table(table, row, "Transmit OK", string_buff);
1810
1811     if (wpcap_packet_request_uint(adapter, OID_GEN_XMIT_ERROR, &uint_value)) {
1812         entries++;
1813         g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1814     } else {
1815         g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1816     }
1817     add_string_to_table(table, row, "Transmit Error", string_buff);
1818
1819
1820     if (wpcap_packet_request_uint(adapter, OID_GEN_RCV_OK, &uint_value)) {
1821         entries++;
1822         g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1823     } else {
1824         g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1825     }
1826     add_string_to_table(table, row, "Receive OK", string_buff);
1827
1828     if (wpcap_packet_request_uint(adapter, OID_GEN_RCV_ERROR, &uint_value)) {
1829         entries++;
1830         g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1831     } else {
1832         g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1833     }
1834     add_string_to_table(table, row, "Receive Error", string_buff);
1835
1836     if (wpcap_packet_request_uint(adapter, OID_GEN_RCV_NO_BUFFER, &uint_value)) {
1837         entries++;
1838         g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1839     } else {
1840         g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1841     }
1842     add_string_to_table(table, row, "Receive but no Buffer", string_buff);
1843
1844     if (wpcap_packet_request_uint(adapter, OID_GEN_DIRECTED_BYTES_XMIT, &uint_value)) {
1845         entries++;
1846         g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1847     } else {
1848         g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1849     }
1850     add_string_to_table(table, row, "Directed bytes transmitted w/o errors", string_buff);
1851
1852     if (wpcap_packet_request_uint(adapter, OID_GEN_DIRECTED_FRAMES_XMIT, &uint_value)) {
1853         entries++;
1854         g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1855     } else {
1856         g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1857     }
1858     add_string_to_table(table, row, "Directed packets transmitted w/o errors", string_buff);
1859
1860     if (wpcap_packet_request_uint(adapter, OID_GEN_MULTICAST_BYTES_XMIT, &uint_value)) {
1861         entries++;
1862         g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1863     } else {
1864         g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1865     }
1866     add_string_to_table(table, row, "Multicast bytes transmitted w/o errors", string_buff);
1867
1868     if (wpcap_packet_request_uint(adapter, OID_GEN_MULTICAST_FRAMES_XMIT, &uint_value)) {
1869         entries++;
1870         g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1871     } else {
1872         g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1873     }
1874     add_string_to_table(table, row, "Multicast packets transmitted w/o errors", string_buff);
1875
1876     if (wpcap_packet_request_uint(adapter, OID_GEN_BROADCAST_BYTES_XMIT, &uint_value)) {
1877         entries++;
1878         g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1879     } else {
1880         g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1881     }
1882     add_string_to_table(table, row, "Broadcast bytes transmitted w/o errors", string_buff);
1883
1884     if (wpcap_packet_request_uint(adapter, OID_GEN_BROADCAST_FRAMES_XMIT, &uint_value)) {
1885         entries++;
1886         g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1887     } else {
1888         g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1889     }
1890     add_string_to_table(table, row, "Broadcast packets transmitted w/o errors", string_buff);
1891
1892     if (wpcap_packet_request_uint(adapter, OID_GEN_DIRECTED_BYTES_RCV, &uint_value)) {
1893         entries++;
1894         g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1895     } else {
1896         g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1897     }
1898     add_string_to_table(table, row, "Directed bytes received w/o errors", string_buff);
1899
1900     if (wpcap_packet_request_uint(adapter, OID_GEN_DIRECTED_FRAMES_RCV, &uint_value)) {
1901         entries++;
1902         g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1903     } else {
1904         g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1905     }
1906     add_string_to_table(table, row, "Directed packets received w/o errors", string_buff);
1907
1908     if (wpcap_packet_request_uint(adapter, OID_GEN_MULTICAST_BYTES_RCV, &uint_value)) {
1909         entries++;
1910         g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1911     } else {
1912         g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1913     }
1914     add_string_to_table(table, row, "Multicast bytes received w/o errors", string_buff);
1915
1916     if (wpcap_packet_request_uint(adapter, OID_GEN_MULTICAST_FRAMES_RCV, &uint_value)) {
1917         entries++;
1918         g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1919     } else {
1920         g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1921     }
1922     add_string_to_table(table, row, "Multicast packets received w/o errors", string_buff);
1923
1924     if (wpcap_packet_request_uint(adapter, OID_GEN_BROADCAST_BYTES_RCV, &uint_value)) {
1925         entries++;
1926         g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1927     } else {
1928         g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1929     }
1930     add_string_to_table(table, row, "Broadcast bytes received w/o errors", string_buff);
1931
1932     if (wpcap_packet_request_uint(adapter, OID_GEN_BROADCAST_FRAMES_RCV, &uint_value)) {
1933         entries++;
1934         g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1935     } else {
1936         g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1937     }
1938     add_string_to_table(table, row, "Broadcast packets received w/o errors", string_buff);
1939
1940     if (wpcap_packet_request_uint(adapter, OID_GEN_RCV_CRC_ERROR, &uint_value)) {
1941         entries++;
1942         g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1943     } else {
1944         g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1945     }
1946     add_string_to_table(table, row, "Packets received with CRC or FCS errors", string_buff);
1947
1948     if (wpcap_packet_request_uint(adapter, OID_GEN_TRANSMIT_QUEUE_LENGTH, &uint_value)) {
1949         entries++;
1950         g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1951     } else {
1952         g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1953     }
1954     add_string_to_table(table, row, "Packets queued for transmission", string_buff);
1955
1956     return entries;
1957 }
1958
1959
1960 static GtkWidget *
1961 capture_if_details_page_new(GtkWidget **table)
1962 {
1963     GtkWidget *main_vb;
1964
1965     main_vb = gtk_vbox_new(FALSE, 6);
1966     gtk_container_border_width(GTK_CONTAINER(main_vb), 12);
1967
1968     /* table */
1969     *table = gtk_table_new(1, 2, FALSE);
1970     gtk_table_set_col_spacings(GTK_TABLE(*table), 6);
1971     gtk_table_set_row_spacings(GTK_TABLE(*table), 3);
1972     gtk_container_add(GTK_CONTAINER(main_vb), *table);
1973
1974     return main_vb;
1975 }
1976
1977
1978 static void
1979 capture_if_details_open_win(char *iface)
1980 {
1981     GtkWidget   *details_open_w,
1982                 *main_vb, *bbox, *close_bt, *help_bt;
1983     GtkWidget   *page_general, *page_stats, *page_802_3, *page_802_11, *page_task_offload;
1984     GtkWidget   *page_lb;
1985     GtkWidget   *table, *notebook, *label;
1986     guint       row;
1987     LPADAPTER   adapter;
1988     int         entries;
1989
1990
1991     /* open the network adapter */
1992     adapter = wpcap_packet_open(iface);
1993     if(adapter == NULL) {
1994         simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, 
1995             PRIMARY_TEXT_START "Could not open adapter: %s!" PRIMARY_TEXT_END
1996             "\n\nThe adapter might be removed from the system in the meantime!", iface);
1997         return;
1998     }
1999
2000     /* open a new window */
2001     details_open_w = window_new(GTK_WINDOW_TOPLEVEL, "Ethereal: Interface Details");
2002
2003     /* Container for the window contents */
2004     main_vb = gtk_vbox_new(FALSE, 12);
2005     gtk_container_border_width(GTK_CONTAINER(main_vb), 12);
2006     gtk_container_add(GTK_CONTAINER(details_open_w), main_vb);
2007
2008     /* notebook */
2009     notebook = gtk_notebook_new();
2010     gtk_container_add(GTK_CONTAINER(main_vb), notebook);
2011
2012     /* General page */
2013     page_general = capture_if_details_page_new(&table);
2014     page_lb = gtk_label_new("Characteristics");
2015     gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page_general, page_lb);
2016     row = 0;
2017     entries = capture_if_details_general(table, page_general, &row, adapter, iface);
2018     if(entries == 0) {
2019         gtk_widget_set_sensitive(page_lb, FALSE);
2020     }
2021
2022     /* Statistics page */
2023     page_stats = capture_if_details_page_new(&table);
2024     page_lb = gtk_label_new("Statistics");
2025     gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page_stats, page_lb);
2026     row = 0;
2027     entries = capture_if_details_stats(table, page_stats, &row, adapter);
2028     if(entries == 0) {
2029         gtk_widget_set_sensitive(page_lb, FALSE);
2030     }
2031
2032     /* 802.3 (Ethernet) page */
2033     page_802_3 = capture_if_details_page_new(&table);
2034     page_lb = gtk_label_new("802.3 (Ethernet)");
2035     gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page_802_3, page_lb);
2036     row = 0;
2037     entries = capture_if_details_802_3(table, page_802_3, &row, adapter);
2038     if(entries == 0) {
2039         gtk_widget_set_sensitive(page_lb, FALSE);
2040     }
2041
2042     /* 802_11 (WI-FI) page */
2043     page_802_11 = capture_if_details_page_new(&table);
2044     page_lb = gtk_label_new("802.11 (WLAN)");
2045     gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page_802_11, page_lb);
2046     row = 0;
2047     entries = capture_if_details_802_11(table, page_802_11, &row, adapter);
2048     if(entries == 0) {
2049         gtk_widget_set_sensitive(page_lb, FALSE);
2050     }
2051
2052     /* Task offload page */
2053     page_task_offload = capture_if_details_page_new(&table);
2054     page_lb = gtk_label_new("Task Offload");
2055     gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page_task_offload, page_lb);
2056     row = 0;
2057     entries = capture_if_details_task_offload(table, page_task_offload, &row, adapter);
2058     if(entries == 0) {
2059         gtk_widget_set_sensitive(page_lb, FALSE);
2060     }
2061
2062     wpcap_packet_close(adapter);
2063
2064     label = gtk_label_new("Note: accuracy of all of these values are only relying on the network card driver!");
2065     gtk_container_add(GTK_CONTAINER(main_vb), label);
2066
2067     /* Button row. */
2068     if(topic_available(HELP_CAPTURE_INTERFACES_DETAILS_DIALOG)) {
2069         bbox = dlg_button_row_new(GTK_STOCK_CLOSE, GTK_STOCK_HELP, NULL);
2070     } else {
2071         bbox = dlg_button_row_new(GTK_STOCK_CLOSE, NULL);
2072     }
2073     gtk_container_add(GTK_CONTAINER(main_vb), bbox);
2074
2075     close_bt = OBJECT_GET_DATA(bbox, GTK_STOCK_CLOSE);
2076     window_set_cancel_button(details_open_w, close_bt, window_cancel_button_cb);
2077
2078     if(topic_available(HELP_CAPTURE_INTERFACES_DETAILS_DIALOG)) {
2079         help_bt = OBJECT_GET_DATA(bbox, GTK_STOCK_HELP);
2080         SIGNAL_CONNECT(help_bt, "clicked", topic_cb, HELP_CAPTURE_INTERFACES_DETAILS_DIALOG);
2081     }
2082
2083     gtk_widget_grab_focus(close_bt);
2084
2085     SIGNAL_CONNECT(details_open_w, "delete_event", window_delete_event_cb, NULL);
2086
2087     gtk_widget_show_all(details_open_w);
2088     window_present(details_open_w);
2089 }
2090
2091
2092 static void capture_if_details_open_answered_cb(gpointer dialog _U_, gint btn, gpointer data)
2093 {
2094     switch(btn) {
2095     case(ESD_BTN_OK):
2096         capture_if_details_open_win(data);
2097         break;
2098     case(ESD_BTN_CANCEL):
2099         break;
2100     default:
2101         g_assert_not_reached();
2102     }
2103 }
2104
2105
2106 void
2107 capture_if_details_open(char *iface)
2108 {
2109     char        *version;
2110     gboolean    version_ok = FALSE;
2111     gpointer    dialog;
2112
2113
2114     /* check packet.dll version */
2115     version = wpcap_packet_get_version();
2116
2117     if(version == NULL) {
2118         /* couldn't even get the packet.dll version, must be a very old one or just not existing -> give up */
2119         /* (this seems to be the case for 2.3 beta and all previous releases) */
2120         simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK, 
2121             PRIMARY_TEXT_START "Couldn't optain WinPcap packet.dll version!" PRIMARY_TEXT_END
2122             "\n\nThe WinPcap packet.dll is not installed or the version you use seems to be very old!"
2123             "\n\nPlease update/install WinPcap.");
2124         return;
2125     }
2126
2127     /* XXX - add more known DLL versions here */
2128     /* (all versions since the 2.3 release seems to be working (although the 2.3 beta did not) */
2129     if( strcmp(version, "3, 2, 0, 29") == 0 ||       /* 3.2 beta 1 */
2130         strcmp(version, "3, 1, 0, 27") == 0 ||       /* 3.1 release */
2131         strcmp(version, "3, 1, 0, 24") == 0 ||       /* 3.1 beta 4 */
2132         strcmp(version, "3, 1, 0, 23") == 0 ||       /* 3.1 beta 3 */
2133         strcmp(version, "3, 1, 0, 22") == 0 ||       /* 3.1 beta 2 */
2134         strcmp(version, "3, 1, 0, 20") == 0 ||       /* 3.1 beta */
2135         strcmp(version, "3.0 alpha3" ) == 0 ||       /* 3.0 release or 3.0 beta (yes, both versions report alpha3!) */
2136         strcmp(version, "2.3"        ) == 0          /* 2.3 release */
2137         ) {   
2138             version_ok = TRUE;
2139     }
2140
2141     if(!version_ok) {
2142         /* packet.dll version not known to us, warn user but try to continue */
2143         dialog = simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK | ESD_BTN_CANCEL, 
2144             PRIMARY_TEXT_START "Unknown WinPcap version might crash or fail!" PRIMARY_TEXT_END
2145             "\n\nThe WinPcap packet.dll version \"%s\" is unknown if it supports required functions!"
2146             "\n\nOnly WinPcap versions 3.0 and 3.1 are known to work with this feature."
2147             "\n\nCrashes or unexpected behaviour might occur, you have been warned!"
2148             "\n\nContinue anyway?",
2149             version);
2150         simple_dialog_set_cb(dialog, capture_if_details_open_answered_cb, iface);
2151     } else {
2152         capture_if_details_open_win(iface);
2153     }
2154 }
2155
2156
2157 #endif /* HAVE_LIBPCAP && _WIN32 */