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