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