1 /* capture_if_details_dlg.c
2 * Routines for capture interface details window (only Win32!)
6 * Wireshark - Network traffic analyzer
7 * By Gerald Combs <gerald@wireshark.org>
8 * Copyright 1998 Gerald Combs
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.
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.
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.
30 #if defined HAVE_LIBPCAP && defined _WIN32
37 #include <epan/value_string.h>
38 #include <epan/addr_resolv.h>
41 #include "../capture.h"
42 #include "../simple_dialog.h"
45 #include "gtk/dlg_utils.h"
46 #include "gtk/gui_utils.h"
47 #include "gtk/help_dlg.h"
48 #include "gtk/gtkvumeter.h"
49 #include "gtk/capture_if_details_dlg_win32.h"
51 #include <winsock2.h> /* Needed here to force a definition of WINVER */
52 /* for some (all ?) Microsoft compilers newer than vc6. */
53 /* (If windows.h were used instead, there might be */
54 /* issues re winsock.h included before winsock2.h ) */
57 #ifdef HAVE_NTDDNDIS_H
59 /* VC 6.0 with SDK has the same Ntddndis.h as MSVC2003 */
60 # if (_MSC_VER <= 1200)
62 # define _MSC_VER 1310
66 #include "../capture_wpcap_packet.h"
68 /* packet32.h requires sockaddr_storage
69 * whether sockaddr_storage is defined or not depends on the Platform SDK
70 * version installed. The only one not defining it is the SDK that comes
71 * with MSVC 6.0 (WINVER 0x0400).
73 * copied from RFC2553 (and slightly modified because of datatypes) ...
74 * XXX - defined more than once, move this to a header file */
76 #error WINVER not defined ...
78 #if (WINVER <= 0x0400) && defined(_MSC_VER)
79 typedef unsigned short eth_sa_family_t;
82 * Desired design of maximum size and alignment
84 #define ETH_SS_MAXSIZE 128 /* Implementation specific max size */
85 #define ETH_SS_ALIGNSIZE (sizeof (gint64 /*int64_t*/))
86 /* Implementation specific desired alignment */
88 * Definitions used for sockaddr_storage structure paddings design.
90 #define ETH_SS_PAD1SIZE (ETH_SS_ALIGNSIZE - sizeof (eth_sa_family_t))
91 #define ETH_SS_PAD2SIZE (ETH_SS_MAXSIZE - (sizeof (eth_sa_family_t) + \
92 ETH_SS_PAD1SIZE + ETH_SS_ALIGNSIZE))
94 struct sockaddr_storage {
95 eth_sa_family_t __ss_family; /* address family */
96 /* Following fields are implementation specific */
97 char __ss_pad1[ETH_SS_PAD1SIZE];
98 /* 6 byte pad, this is to make implementation */
99 /* specific pad up to alignment field that */
100 /* follows explicit in the data structure */
101 gint64 /*int64_t*/ __ss_align; /* field to force desired structure */
102 /* storage alignment */
103 char __ss_pad2[ETH_SS_PAD2SIZE];
104 /* 112 byte pad to achieve desired size, */
105 /* _SS_MAXSIZE value minus size of ss_family */
106 /* __ss_pad1, __ss_align fields is 112 */
108 /* ... copied from RFC2553 */
111 #include <Packet32.h>
113 #define DETAILS_STR_MAX 1024
116 /* The informations and definitions used here are coming from various places on the web:
118 * ndiswrapper (various NDIS related definitions)
119 * http://cvs.sourceforge.net/viewcvs.py/ndiswrapper/ndiswrapper/driver/
121 * ReactOS (various NDIS related definitions)
122 * http://www.reactos.org/generated/doxygen/d2/d6d/ndis_8h-source.html
124 * IEEE802.11 "Detailed NDIS OID Log for a 802.11b Miniport"
125 * http://www.ndis.com/papers/ieee802_11_log.htm
127 * FreeBSD (various NDIS related definitions)
128 * http://lists.freebsd.org/pipermail/p4-projects/2004-January/003433.html
130 * MS WHDC "Network Drivers and Windows"
131 * http://www.microsoft.com/whdc/archive/netdrv_up.mspx
133 * IEEE "Get IEEE 802" (the various 802.11 docs)
134 * http://standards.ieee.org/getieee802/802.11.html
136 * MS MSDN "Network Devices: Windows Driver Kit"
137 * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/NetXP_r/hh/NetXP_r/netref_4c297a96-2ba5-41ed-ab21-b7a9cfaa9b4d.xml.asp
139 * MS MSDN "Microsoft Windows CE .NET 4.2 Network Driver Reference"
140 * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceddk40/html/cxgrfNetworkDriverReference.asp
142 * MS MSDN (some explanations of a special MS 802.11 Information Element)
143 * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/randz/protocol/securing_public_wi-fi_hotspots.asp
145 * "WLANINFO fuer Windows XP"
146 * http://www-pc.uni-regensburg.de/systemsw/TOOLS/wlaninfo.htm
149 /********************************************************************************/
150 /* definitions that would usually come from the windows DDK (device driver kit) */
151 /* and are not part of the ntddndis.h file delivered with WinPcap */
154 #define OID_GEN_VLAN_ID 0x0001021C
157 #define OID_GEN_MEDIA_CAPABILITIES 0x00010201
158 #define OID_GEN_PHYSICAL_MEDIUM 0x00010202
161 #define OID_GEN_NETWORK_LAYER_ADDRESSES 0x00010118
162 #define OID_GEN_TRANSPORT_HEADER_OFFSET 0x00010119
165 /* This will probably break if you're using VC++ 6 _and_ have a newer SDK. */
166 #if (_MSC_VER <= 1200) || (_MSC_VER == 1310)
167 #if (_MSC_VER <= 1200)
168 /* Physical medium (OID_GEN_PHYSICAL_MEDIUM) */
169 typedef enum ndis_phys_medium {
170 NdisPhysicalMediumUnspecified,
171 NdisPhysicalMediumWirelessLan,
172 NdisPhysicalMediumCableModem,
173 NdisPhysicalMediumPhoneLine,
174 NdisPhysicalMediumPowerLine,
175 NdisPhysicalMediumDSL,
176 NdisPhysicalMediumFibreChannel,
177 NdisPhysicalMedium1394,
178 NdisPhysicalMediumWirelessWan,
179 NdisPhysicalMediumMax
182 /* flag definitions for OID_GEN_MAC_OPTIONS */
183 #define NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA 0x00000001
184 #define NDIS_MAC_OPTION_RECEIVE_SERIALIZED 0x00000002
185 #define NDIS_MAC_OPTION_TRANSFERS_NOT_PEND 0x00000004
186 #define NDIS_MAC_OPTION_NO_LOOPBACK 0x00000008
187 #define NDIS_MAC_OPTION_FULL_DUPLEX 0x00000010
188 #define NDIS_MAC_OPTION_EOTX_INDICATION 0x00000020
189 #define NDIS_MAC_OPTION_8021P_PRIORITY 0x00000040
190 #define NDIS_MAC_OPTION_8021Q_VLAN 0x00000080
193 #define OID_802_11_BSSID 0x0D010101
194 #define OID_802_11_SSID 0x0D010102
195 #define OID_802_11_NETWORK_TYPES_SUPPORTED 0x0D010203
196 #define OID_802_11_NETWORK_TYPE_IN_USE 0x0D010204
197 #define OID_802_11_TX_POWER_LEVEL 0x0D010205
198 #define OID_802_11_RSSI 0x0D010206
199 #define OID_802_11_RSSI_TRIGGER 0x0D010207
200 #define OID_802_11_INFRASTRUCTURE_MODE 0x0D010108
201 #define OID_802_11_FRAGMENTATION_THRESHOLD 0x0D010209
202 #define OID_802_11_RTS_THRESHOLD 0x0D01020A
203 #define OID_802_11_NUMBER_OF_ANTENNAS 0x0D01020B
204 #define OID_802_11_RX_ANTENNA_SELECTED 0x0D01020C
205 #define OID_802_11_TX_ANTENNA_SELECTED 0x0D01020D
206 #define OID_802_11_SUPPORTED_RATES 0x0D01020E
207 #define OID_802_11_DESIRED_RATES 0x0D010210
208 #define OID_802_11_CONFIGURATION 0x0D010211
209 #define OID_802_11_STATISTICS 0x0D020212
210 #define OID_802_11_ADD_WEP 0x0D010113
211 #define OID_802_11_REMOVE_WEP 0x0D010114
212 #define OID_802_11_DISASSOCIATE 0x0D010115
213 #define OID_802_11_POWER_MODE 0x0D010216
214 #define OID_802_11_BSSID_LIST 0x0D010217
215 #define OID_802_11_AUTHENTICATION_MODE 0x0D010118
216 #define OID_802_11_PRIVACY_FILTER 0x0D010119
217 #define OID_802_11_BSSID_LIST_SCAN 0x0D01011A
218 #define OID_802_11_WEP_STATUS 0x0D01011B
220 #endif /*(_MSC_VER <= 1200)*/
222 #define OID_802_11_ENCRYPTION_STATUS OID_802_11_WEP_STATUS
223 #define OID_802_11_RELOAD_DEFAULTS 0x0D01011C
224 #define OID_802_11_ADD_KEY 0x0D01011D
225 #define OID_802_11_REMOVE_KEY 0x0D01011E
226 #define OID_802_11_ASSOCIATION_INFORMATION 0x0D01011F
227 #define OID_802_11_TEST 0x0D010120
228 #define OID_802_11_CAPABILITY 0x0D010122
229 #define OID_802_11_PMKID 0x0D010123
231 #if (_MSC_VER <= 1200)
233 /* PnP and power management OIDs */
234 #define OID_PNP_CAPABILITIES 0xFD010100
235 #define OID_PNP_SET_POWER 0xFD010101
236 #define OID_PNP_QUERY_POWER 0xFD010102
237 #define OID_PNP_ADD_WAKE_UP_PATTERN 0xFD010103
238 #define OID_PNP_REMOVE_WAKE_UP_PATTERN 0xFD010104
239 #define OID_PNP_WAKE_UP_PATTERN_LIST 0xFD010105
240 #define OID_PNP_ENABLE_WAKE_UP 0xFD010106
242 /* Current infrastructure mode (OID_802_11_INFRASTRUCTURE_MODE) */
243 enum network_infrastructure {
245 Ndis802_11Infrastructure,
246 Ndis802_11AutoUnknown,
247 Ndis802_11InfrastructureMax
250 /* Current authentication mode (OID_802_11_AUTHENTICATION_MODE) */
251 enum authentication_mode {
252 Ndis802_11AuthModeOpen,
253 Ndis802_11AuthModeShared,
254 Ndis802_11AuthModeAutoSwitch,
255 Ndis802_11AuthModeWPA,
256 Ndis802_11AuthModeWPAPSK,
257 Ndis802_11AuthModeWPANone,
258 Ndis802_11AuthModeWPA2,
259 Ndis802_11AuthModeWPA2PSK,
260 Ndis802_11AuthModeMax
263 /* Current network type (OID_802_11_NETWORK_TYPES_SUPPORTED / OID_802_11_NETWORK_TYPE_IN_USE) */
269 /* MSDN site uses Ndis802_11Automode, which is not mentioned
270 * in DDK, so add one and assign it to
271 * Ndis802_11NetworkTypeMax */
273 Ndis802_11NetworkTypeMax = Ndis802_11Automode
276 /* Current encryption status (OID_802_11_ENCRYPTION_STATUS) */
277 enum encryption_status {
278 Ndis802_11WEPEnabled,
279 Ndis802_11Encryption1Enabled = Ndis802_11WEPEnabled,
280 Ndis802_11WEPDisabled,
281 Ndis802_11EncryptionDisabled = Ndis802_11WEPDisabled,
282 Ndis802_11WEPKeyAbsent,
283 Ndis802_11Encryption1KeyAbsent = Ndis802_11WEPKeyAbsent,
284 Ndis802_11WEPNotSupported,
285 Ndis802_11EncryptionNotSupported = Ndis802_11WEPNotSupported,
286 Ndis802_11Encryption2Enabled,
287 Ndis802_11Encryption2KeyAbsent,
288 Ndis802_11Encryption3Enabled,
289 Ndis802_11Encryption3KeyAbsent
292 #endif /*(_MSC_VER <= 1200)*/
294 typedef struct _NDIS_802_11_FIXED_IEs
297 USHORT BeaconInterval;
299 } NDIS_802_11_FIXED_IEs, *PNDIS_802_11_FIXED_IEs;
301 #endif /* (_MSC_VER <= 1200) || (_MSC_VER == 1310) */
304 /* Currently associated SSID (OID_802_11_SSID) */
305 #define NDIS_ESSID_MAX_SIZE 32
308 UCHAR essid[NDIS_ESSID_MAX_SIZE+1];
312 /* some definitions needed for the following structs */
313 #define NDIS_MAX_RATES_EX 16
314 typedef UCHAR mac_address[/* ETH_ALEN */ 6];
315 typedef UCHAR ndis_rates[NDIS_MAX_RATES_EX];
317 /* configuration, e.g. frequency (OID_802_11_CONFIGURATION / OID_802_11_BSSID_LIST) */
318 struct /*packed*/ ndis_configuration {
323 struct ndis_configuration_fh {
331 /* bssid list item (OID_802_11_BSSID_LIST) */
332 struct ndis_ssid_item {
336 struct ndis_essid ssid;
340 struct ndis_configuration config;
348 /* bssid list (OID_802_11_BSSID_LIST) */
349 struct ndis_bssid_list {
351 struct ndis_ssid_item items[1];
355 /******************************************************************************/
356 /* OID_TCP_TASK_OFFLOAD specific definitions that would usually come from the */
357 /* windows DDK (device driver kit) and are not part of the ntddndis.h file */
358 /* delivered with WinPcap */
361 #define OID_TCP_TASK_OFFLOAD 0xFC010201
364 typedef enum _NDIS_TASK {
365 TcpIpChecksumNdisTask,
367 TcpLargeSendNdisTask,
369 } NDIS_TASK, *PNDIS_TASK;
371 /* TaskBuffer content on TcpIpChecksumNdisTask */
372 typedef struct _NDIS_TASK_TCP_IP_CHECKSUM
376 ULONG IpOptionsSupported:1;
377 ULONG TcpOptionsSupported:1;
385 ULONG IpOptionsSupported:1;
386 ULONG TcpOptionsSupported:1;
394 ULONG IpOptionsSupported:1;
395 ULONG TcpOptionsSupported:1;
402 ULONG IpOptionsSupported:1;
403 ULONG TcpOptionsSupported:1;
407 } NDIS_TASK_TCP_IP_CHECKSUM, *PNDIS_TASK_TCP_IP_CHECKSUM;
409 /* TaskBuffer content on TcpLargeSendNdisTask */
410 typedef struct _NDIS_TASK_TCP_LARGE_SEND
413 ULONG MaxOffLoadSize;
414 ULONG MinSegmentCount;
417 } NDIS_TASK_TCP_LARGE_SEND, *PNDIS_TASK_TCP_LARGE_SEND;
420 typedef enum _NDIS_ENCAPSULATION {
421 UNSPECIFIED_Encapsulation,
423 IEEE_802_3_Encapsulation,
424 IEEE_802_5_Encapsulation,
425 LLC_SNAP_ROUTED_Encapsulation,
426 LLC_SNAP_BRIDGED_Encapsulation
427 } NDIS_ENCAPSULATION;
429 /* Encapsulation format */
430 typedef struct _NDIS_ENCAPSULATION_FORMAT {
431 NDIS_ENCAPSULATION Encapsulation;
433 ULONG FixedHeaderSize : 1;
436 ULONG EncapsulationHeaderSize;
437 } NDIS_ENCAPSULATION_FORMAT, *PNDIS_ENCAPSULATION_FORMAT;
440 typedef struct _NDIS_TASK_OFFLOAD_HEADER
445 UCHAR OffsetFirstTask;
446 NDIS_ENCAPSULATION_FORMAT EncapsulationFormat;
447 } NDIS_TASK_OFFLOAD_HEADER, *PNDIS_TASK_OFFLOAD_HEADER;
449 /* response struct */
450 #define NDIS_TASK_OFFLOAD_VERSION 1
451 typedef struct _NDIS_TASK_OFFLOAD
456 ULONG OffsetNextTask;
457 ULONG TaskBufferLength;
459 } NDIS_TASK_OFFLOAD, *PNDIS_TASK_OFFLOAD;
462 /***********************************************************************/
463 /* value_string's for info functions */
466 /* NDIS driver medium (OID_GEN_MEDIA_SUPPORTED / OID_GEN_MEDIA_IN_USE) */
467 static const value_string win32_802_3_medium_vals[] = {
468 { NdisMedium802_3, "802.3 (Ethernet)" }, /* might as well be WLAN, ... (see NDIS_PHYSICAL_MEDIUM) */
469 { NdisMedium802_5, "802.5 (Token Ring)" },
470 { NdisMediumFddi, "FDDI" },
471 { NdisMediumWan, "WAN" },
472 { NdisMediumLocalTalk, "Local Talk" },
473 { NdisMediumDix, "Dix" },
474 { NdisMediumArcnetRaw, "Arcnet Raw" },
475 { NdisMediumArcnet878_2,"Arcnet 878_2" },
476 { NdisMediumAtm, "ATM" },
477 { NdisMediumWirelessWan,"Wireless WAN" },
478 { NdisMediumIrda, "Irda" },
482 /* NDIS physical driver medium (OID_GEN_PHYSICAL_MEDIUM) */
483 static const value_string win32_802_3_physical_medium_vals[] = {
484 { NdisPhysicalMediumUnspecified, "Unspecified" },
485 { NdisPhysicalMediumWirelessLan, "Wireless LAN" },
486 { NdisPhysicalMediumCableModem, "Cable Modem (DOCSIS)" },
487 { NdisPhysicalMediumPhoneLine, "Phone Line" },
488 { NdisPhysicalMediumPowerLine, "Power Line" },
489 { NdisPhysicalMediumDSL, "DSL" },
490 { NdisPhysicalMediumFibreChannel, "Fibre Channel" },
491 { NdisPhysicalMedium1394, "IEEE 1394" },
492 { NdisPhysicalMediumWirelessWan, "Wireless WAN" },
496 static const value_string win32_802_11_infra_mode_vals[] = {
497 { Ndis802_11IBSS, "Ad Hoc" },
498 { Ndis802_11Infrastructure, "Access Point" },
499 { Ndis802_11AutoUnknown, "Auto or unknown" },
503 static const value_string win32_802_11_auth_mode_vals[] = {
504 { Ndis802_11AuthModeOpen, "Open System" },
505 { Ndis802_11AuthModeShared, "Shared Key" },
506 { Ndis802_11AuthModeAutoSwitch, "Auto Switch" },
507 #if (_MSC_VER != 1310)
508 { Ndis802_11AuthModeWPA, "WPA" },
509 { Ndis802_11AuthModeWPAPSK, "WPA-PSK (pre shared key)" },
510 { Ndis802_11AuthModeWPANone, "WPA (ad hoc)" },
511 #if (_MSC_VER != 1400) /* These are not defined in Ntddndis.h in MSVC2005/MSVC2005EE PSDK */
512 { Ndis802_11AuthModeWPA2, "WPA2" },
513 { Ndis802_11AuthModeWPA2PSK, "WPA2-PSK (pre shared key)" },
519 static const value_string win32_802_11_network_type_vals[] = {
520 { Ndis802_11FH, "FH (frequency-hopping spread-spectrum)" },
521 { Ndis802_11DS, "DS (direct-sequence spread-spectrum)" },
522 #if (_MSC_VER != 1310)
523 { Ndis802_11OFDM5, "5-GHz OFDM" },
524 { Ndis802_11OFDM24, "2.4-GHz OFDM" },
525 #if (_MSC_VER != 1400) /* These are not defined in Ntddndis.h in MSVC2005/MSVC2005EE PSDK */
526 { Ndis802_11Automode, "Auto" },
532 static const value_string win32_802_11_encryption_status_vals[] = {
533 #if (_MSC_VER != 1310)
534 { Ndis802_11Encryption1Enabled, "WEP enabled, TKIP & AES disabled, transmit key available" },
535 { Ndis802_11EncryptionDisabled, "WEP & TKIP & AES disabled, transmit key available" },
536 { Ndis802_11Encryption1KeyAbsent, "WEP enabled, TKIP & AES disabled, transmit key unavailable" },
537 { Ndis802_11EncryptionNotSupported, "WEP & TKIP & AES not supported" },
538 { Ndis802_11Encryption2Enabled, "WEP & TKIP enabled, AES disabled, transmit key available" },
539 { Ndis802_11Encryption2KeyAbsent, "WEP & TKIP enabled, AES disabled, transmit key unavailable" },
540 { Ndis802_11Encryption3Enabled, "WEP & TKIP & AES enabled, transmit key available" },
541 { Ndis802_11Encryption3KeyAbsent, "WEP & TKIP & AES enabled, transmit key unavailable" },
546 /* frequency to channel mapping (OID_802_11_CONFIGURATION) */
547 static const value_string win32_802_11_channel_freq_vals[] = {
548 { 2412000, "1 (2412 MHz)" },
549 { 2417000, "2 (2417 MHz)" },
550 { 2422000, "3 (2422 MHz)" },
551 { 2427000, "4 (2427 MHz)" },
552 { 2432000, "5 (2432 MHz)" },
553 { 2437000, "6 (2437 MHz)" },
554 { 2442000, "7 (2442 MHz)" },
555 { 2447000, "8 (2447 MHz)" },
556 { 2452000, "9 (2452 MHz)" },
557 { 2457000, "10 (2457 MHz)" },
558 { 2462000, "11 (2462 MHz)" },
559 { 2467000, "12 (2467 MHz)" },
560 { 2472000, "13 (2472 MHz)" },
561 { 2484000, "14 (2484 MHz)" },
565 /* frequency to channel mapping (OID_802_11_CONFIGURATION) */
566 static const value_string win32_802_11_channel_vals[] = {
585 /* Information Element IDs (802.11 Spec: "7.3.2 Information elements") */
587 #define IE_ID_SUPPORTED_RATES 1
588 #define IE_ID_DS_PARAMETER_SET 3
590 #define IE_ID_COUNTRY 7
591 #define IE_ID_ERP_INFORMATION 42
592 #define IE_ID_WPA2 48
593 #define IE_ID_EXTENDED_SUPPORT_RATES 50
594 #define IE_ID_VENDOR_SPECIFIC 221
596 /* ElementID in NDIS_802_11_VARIABLE_IEs */
597 static const value_string ie_id_vals[] = {
598 { IE_ID_SSID, "SSID, 802.11" },
599 { IE_ID_SUPPORTED_RATES, "Supported Rates, 802.11" },
600 { 2, "FH Parameter Set, 802.11" },
601 { IE_ID_DS_PARAMETER_SET, "DS Parameter Set, 802.11" },
602 { 4, "CF Parameter Set, 802.11" },
603 { IE_ID_TIM, "TIM, 802.11" },
604 { 6, "IBSS Parameter Set, 802.11" },
605 { IE_ID_COUNTRY, "Country, 802.11d" },
606 { 8, "Hopping Pattern Parameters, 802.11d" },
607 { 9, "Hopping Pattern Table, 802.11d" },
608 { 10, "Request, 802.11d" },
609 /* 11-15 reserved, 802.11d */
610 { 16, "Challenge text, 802.11" },
611 /* 17-31 reserved, 802.11h */
612 { 32, "Power Constraint, 802.11h" },
613 { 33, "Power Capability, 802.11h" },
614 { 34, "TPC Request, 802.11h" },
615 { 35, "TPC Report, 802.11h" },
616 { 36, "Supported Channels, 802.11h" },
617 { 37, "Channel Switch Announcement, 802.11h" },
618 { 38, "Measurement Request, 802.11h" },
619 { 39, "Measurement Report, 802.11h" },
620 { 40, "Quiet, 802.11h" },
621 { 41, "IBSS DFS, 802.11h" },
622 { IE_ID_ERP_INFORMATION, "ERP information, 802.11g" },
623 /* 43-47 reserved, 802.11i */
624 { IE_ID_WPA2, "WPA2/RSN (Robust Secure Network), 802.11i" },
625 /* 49 reserved, 802.11i */
626 { IE_ID_EXTENDED_SUPPORT_RATES, "Extended Supported Rates, 802.11g" },
627 /* 51-255 reserved, 802.11g */
628 { IE_ID_VENDOR_SPECIFIC, "WPA, (not 802.11!)" },
633 static const value_string oid_vals[] = {
634 { OID_GEN_SUPPORTED_LIST, "OID_GEN_SUPPORTED_LIST" },
635 { OID_GEN_HARDWARE_STATUS, "OID_GEN_HARDWARE_STATUS (only internally interesting)" },
636 { OID_GEN_MEDIA_SUPPORTED, "OID_GEN_MEDIA_SUPPORTED" },
637 { OID_GEN_MEDIA_IN_USE, "OID_GEN_MEDIA_IN_USE" },
638 { OID_GEN_MAXIMUM_LOOKAHEAD, "OID_GEN_MAXIMUM_LOOKAHEAD (unused)" },
639 { OID_GEN_MAXIMUM_FRAME_SIZE, "OID_GEN_MAXIMUM_FRAME_SIZE (unused)" },
640 { OID_GEN_LINK_SPEED, "OID_GEN_LINK_SPEED" },
641 { OID_GEN_TRANSMIT_BUFFER_SPACE, "OID_GEN_TRANSMIT_BUFFER_SPACE" },
642 { OID_GEN_RECEIVE_BUFFER_SPACE, "OID_GEN_RECEIVE_BUFFER_SPACE" },
643 { OID_GEN_TRANSMIT_BLOCK_SIZE, "OID_GEN_TRANSMIT_BLOCK_SIZE" },
644 { OID_GEN_RECEIVE_BLOCK_SIZE, "OID_GEN_RECEIVE_BLOCK_SIZE" },
645 { OID_GEN_VENDOR_ID, "OID_GEN_VENDOR_ID" },
646 { OID_GEN_VENDOR_DESCRIPTION, "OID_GEN_VENDOR_DESCRIPTION" },
647 { OID_GEN_CURRENT_PACKET_FILTER, "OID_GEN_CURRENT_PACKET_FILTER (info seems to be constant)" },
648 { OID_GEN_CURRENT_LOOKAHEAD, "OID_GEN_CURRENT_LOOKAHEAD (only internally interesting)" },
649 { OID_GEN_DRIVER_VERSION, "OID_GEN_DRIVER_VERSION" },
650 { OID_GEN_MAXIMUM_TOTAL_SIZE, "OID_GEN_MAXIMUM_TOTAL_SIZE" },
651 { OID_GEN_PROTOCOL_OPTIONS, "OID_GEN_PROTOCOL_OPTIONS (info not interesting)" },
652 { OID_GEN_MAC_OPTIONS, "OID_GEN_MAC_OPTIONS" },
653 { OID_GEN_MEDIA_CONNECT_STATUS, "OID_GEN_MEDIA_CONNECT_STATUS" },
654 { OID_GEN_MAXIMUM_SEND_PACKETS, "OID_GEN_MAXIMUM_SEND_PACKETS (only internally interesting)" },
655 { OID_GEN_VENDOR_DRIVER_VERSION, "OID_GEN_VENDOR_DRIVER_VERSION" },
656 { OID_GEN_XMIT_OK, "OID_GEN_XMIT_OK" },
657 { OID_GEN_RCV_OK, "OID_GEN_RCV_OK" },
658 { OID_GEN_XMIT_ERROR, "OID_GEN_XMIT_ERROR" },
659 { OID_GEN_RCV_ERROR, "OID_GEN_RCV_ERROR" },
660 { OID_GEN_RCV_NO_BUFFER, "OID_GEN_RCV_NO_BUFFER" },
661 { OID_GEN_DIRECTED_BYTES_XMIT, "OID_GEN_DIRECTED_BYTES_XMIT" },
662 { OID_GEN_DIRECTED_FRAMES_XMIT, "OID_GEN_DIRECTED_FRAMES_XMIT" },
663 { OID_GEN_MULTICAST_BYTES_XMIT, "OID_GEN_MULTICAST_BYTES_XMIT" },
664 { OID_GEN_MULTICAST_FRAMES_XMIT, "OID_GEN_MULTICAST_FRAMES_XMIT" },
665 { OID_GEN_BROADCAST_BYTES_XMIT, "OID_GEN_BROADCAST_BYTES_XMIT" },
666 { OID_GEN_BROADCAST_FRAMES_XMIT, "OID_GEN_BROADCAST_FRAMES_XMIT" },
667 { OID_GEN_DIRECTED_BYTES_RCV, "OID_GEN_DIRECTED_BYTES_RCV" },
668 { OID_GEN_DIRECTED_FRAMES_RCV, "OID_GEN_DIRECTED_FRAMES_RCV" },
669 { OID_GEN_MULTICAST_BYTES_RCV, "OID_GEN_MULTICAST_BYTES_RCV" },
670 { OID_GEN_MULTICAST_FRAMES_RCV, "OID_GEN_MULTICAST_FRAMES_RCV" },
671 { OID_GEN_BROADCAST_BYTES_RCV, "OID_GEN_BROADCAST_BYTES_RCV" },
672 { OID_GEN_BROADCAST_FRAMES_RCV, "OID_GEN_BROADCAST_FRAMES_RCV" },
673 { OID_GEN_RCV_CRC_ERROR, "OID_GEN_RCV_CRC_ERROR" },
674 { OID_GEN_TRANSMIT_QUEUE_LENGTH, "OID_GEN_TRANSMIT_QUEUE_LENGTH" },
675 { OID_GEN_GET_TIME_CAPS, "OID_GEN_GET_TIME_CAPS (unsupp, unused)" },
676 { OID_GEN_GET_NETCARD_TIME, "OID_GEN_GET_NETCARD_TIME (unsupp, unused)" },
678 { OID_GEN_PHYSICAL_MEDIUM, "OID_GEN_PHYSICAL_MEDIUM" },
679 /*{ OID_GEN_MACHINE_NAME, "OID_GEN_MACHINE_NAME (unsupp, unused)" },*/
680 { OID_GEN_VLAN_ID, "OID_GEN_VLAN_ID" },
681 { OID_GEN_MEDIA_CAPABILITIES, "OID_GEN_MEDIA_CAPABILITIES (unsupp, unused)" },
683 { OID_GEN_NETWORK_LAYER_ADDRESSES, "OID_GEN_NETWORK_LAYER_ADDRESSES (write only)" },
684 { OID_GEN_TRANSPORT_HEADER_OFFSET, "OID_GEN_TRANSPORT_HEADER_OFFSET (write only)" },
686 { OID_802_3_PERMANENT_ADDRESS, "OID_802_3_PERMANENT_ADDRESS" },
687 { OID_802_3_CURRENT_ADDRESS, "OID_802_3_CURRENT_ADDRESS" },
688 { OID_802_3_MAXIMUM_LIST_SIZE, "OID_802_3_MAXIMUM_LIST_SIZE (unused)" },
689 { OID_802_3_MULTICAST_LIST, "OID_802_3_MULTICAST_LIST (unused)" }, /* XXX */
690 { OID_802_3_MAC_OPTIONS, "OID_802_3_MAC_OPTIONS (unsupp, unused)" },
692 { OID_802_3_RCV_ERROR_ALIGNMENT, "OID_802_3_RCV_ERROR_ALIGNMENT" },
693 { OID_802_3_XMIT_ONE_COLLISION, "OID_802_3_XMIT_ONE_COLLISION" },
694 { OID_802_3_XMIT_MORE_COLLISIONS, "OID_802_3_XMIT_MORE_COLLISIONS" },
695 { OID_802_3_XMIT_DEFERRED, "OID_802_3_XMIT_DEFERRED" },
696 { OID_802_3_XMIT_MAX_COLLISIONS, "OID_802_3_XMIT_MAX_COLLISIONS" },
697 { OID_802_3_RCV_OVERRUN, "OID_802_3_RCV_OVERRUN" },
698 { OID_802_3_XMIT_UNDERRUN, "OID_802_3_XMIT_UNDERRUN" },
699 { OID_802_3_XMIT_HEARTBEAT_FAILURE, "OID_802_3_XMIT_HEARTBEAT_FAILURE (unsupp, used)" },
700 { OID_802_3_XMIT_TIMES_CRS_LOST, "OID_802_3_XMIT_TIMES_CRS_LOST (unsupp, used)" },
701 { OID_802_3_XMIT_LATE_COLLISIONS, "OID_802_3_XMIT_LATE_COLLISIONS" },
703 { OID_802_11_BSSID, "OID_802_11_BSSID" },
704 { OID_802_11_SSID, "OID_802_11_SSID" },
705 { OID_802_11_NETWORK_TYPES_SUPPORTED, "OID_802_11_NETWORK_TYPES_SUPPORTED (info not interesting)" },
706 { OID_802_11_NETWORK_TYPE_IN_USE, "OID_802_11_NETWORK_TYPE_IN_USE" },
707 { OID_802_11_TX_POWER_LEVEL, "OID_802_11_TX_POWER_LEVEL (unsupp, used)" },
708 { OID_802_11_RSSI, "OID_802_11_RSSI" },
709 { OID_802_11_RSSI_TRIGGER, "OID_802_11_RSSI_TRIGGER (unsupp, unused)" },
710 { OID_802_11_INFRASTRUCTURE_MODE, "OID_802_11_INFRASTRUCTURE_MODE" },
711 { OID_802_11_FRAGMENTATION_THRESHOLD, "OID_802_11_FRAGMENTATION_THRESHOLD (unused)" },
712 { OID_802_11_RTS_THRESHOLD, "OID_802_11_RTS_THRESHOLD (unused)" },
713 { OID_802_11_NUMBER_OF_ANTENNAS, "OID_802_11_NUMBER_OF_ANTENNAS (unsupp, unused)" },
714 { OID_802_11_RX_ANTENNA_SELECTED, "OID_802_11_RX_ANTENNA_SELECTED (unsupp, unused)" },
715 { OID_802_11_TX_ANTENNA_SELECTED, "OID_802_11_TX_ANTENNA_SELECTED (unsupp, unused)" },
716 { OID_802_11_SUPPORTED_RATES, "OID_802_11_SUPPORTED_RATES" },
717 { OID_802_11_DESIRED_RATES, "OID_802_11_DESIRED_RATES (unsupp, used)" },
718 { OID_802_11_CONFIGURATION, "OID_802_11_CONFIGURATION" },
719 { OID_802_11_STATISTICS, "OID_802_11_STATISTICS (unsupp, unused)" },
720 { OID_802_11_ADD_WEP, "OID_802_11_ADD_WEP (write only)" },
721 { OID_802_11_REMOVE_WEP, "OID_802_11_REMOVE_WEP (write only)" },
722 { OID_802_11_DISASSOCIATE, "OID_802_11_DISASSOCIATE (write only)" },
723 { OID_802_11_POWER_MODE, "OID_802_11_POWER_MODE (info not interesting)" },
724 { OID_802_11_BSSID_LIST, "OID_802_11_BSSID_LIST" },
725 { OID_802_11_AUTHENTICATION_MODE, "OID_802_11_AUTHENTICATION_MODE" },
726 { OID_802_11_PRIVACY_FILTER, "OID_802_11_PRIVACY_FILTER (info not interesting)" },
727 { OID_802_11_BSSID_LIST_SCAN, "OID_802_11_BSSID_LIST_SCAN" },
728 { OID_802_11_WEP_STATUS, "OID_802_11_WEP_STATUS (info not interesting?)" },
729 { OID_802_11_ENCRYPTION_STATUS, "OID_802_11_ENCRYPTION_STATUS (unsupp, used)" },
730 { OID_802_11_RELOAD_DEFAULTS, "OID_802_11_RELOAD_DEFAULTS (write only)" },
731 { OID_802_11_ADD_KEY, "OID_802_11_ADD_KEY (write only)" },
732 { OID_802_11_REMOVE_KEY, "OID_802_11_REMOVE_KEY (write only)" },
733 { OID_802_11_ASSOCIATION_INFORMATION, "OID_802_11_ASSOCIATION_INFORMATION (unused)" }, /* XXX */
734 { OID_802_11_TEST, "OID_802_11_TEST (write only)" },
735 #if (_MSC_VER != 1400) /* These are not defined in Ntddndis.h in MSVC2005/MSVC2005EE PSDK */
736 { OID_802_11_CAPABILITY, "OID_802_11_CAPABILITY (unsupp, unused)" },
737 { OID_802_11_PMKID, "OID_802_11_PMKID (unsupp, unused)" },
740 /* Token-Ring list is utterly incomplete (contains only the values for MS Loopback Driver) */
741 { OID_802_5_PERMANENT_ADDRESS, "OID_802_5_PERMANENT_ADDRESS (unused)" },
742 { OID_802_5_CURRENT_ADDRESS, "OID_802_5_CURRENT_ADDRESS (unused)" },
743 { OID_802_5_CURRENT_FUNCTIONAL, "OID_802_5_CURRENT_FUNCTIONAL (unused)" },
744 { OID_802_5_CURRENT_GROUP, "OID_802_5_CURRENT_GROUP (unused)" },
745 { OID_802_5_LAST_OPEN_STATUS, "OID_802_5_LAST_OPEN_STATUS (unused)" },
746 { OID_802_5_CURRENT_RING_STATUS, "OID_802_5_CURRENT_RING_STATUS (unused)" },
747 { OID_802_5_CURRENT_RING_STATE, "OID_802_5_CURRENT_RING_STATE (unused)" },
748 { OID_802_5_LINE_ERRORS, "OID_802_5_LINE_ERRORS (unused)" },
749 { OID_802_5_LOST_FRAMES, "OID_802_5_LOST_FRAMES (unused)" },
751 /* FDDI list is utterly incomplete (contains only the values for MS Loopback Driver) */
752 { OID_FDDI_LONG_PERMANENT_ADDR, "OID_FDDI_LONG_PERMANENT_ADDR (unused)" },
753 { OID_FDDI_LONG_CURRENT_ADDR, "OID_FDDI_LONG_CURRENT_ADDR (unused)" },
754 { OID_FDDI_LONG_MULTICAST_LIST, "OID_FDDI_LONG_MULTICAST_LIST (unused)" },
755 { OID_FDDI_LONG_MAX_LIST_SIZE, "OID_FDDI_LONG_MAX_LIST_SIZE (unused)" },
756 { OID_FDDI_SHORT_PERMANENT_ADDR, "OID_FDDI_SHORT_PERMANENT_ADDR (unused)" },
757 { OID_FDDI_SHORT_CURRENT_ADDR, "OID_FDDI_SHORT_CURRENT_ADDR (unused)" },
758 { OID_FDDI_SHORT_MULTICAST_LIST, "OID_FDDI_SHORT_MULTICAST_LIST (unused)" },
759 { OID_FDDI_SHORT_MAX_LIST_SIZE, "OID_FDDI_SHORT_MAX_LIST_SIZE (unused)" },
761 /* LocalTalk list is utterly incomplete (contains only the values for MS Loopback Driver) */
762 { OID_LTALK_CURRENT_NODE_ID, "OID_LTALK_CURRENT_NODE_ID (unused)" },
764 /* Arcnet list is utterly incomplete (contains only the values for MS Loopback Driver) */
765 { OID_ARCNET_PERMANENT_ADDRESS, "OID_ARCNET_PERMANENT_ADDRESS (unused)" },
766 { OID_ARCNET_CURRENT_ADDRESS, "OID_ARCNET_CURRENT_ADDRESS (unused)" },
768 { OID_TCP_TASK_OFFLOAD, "OID_TCP_TASK_OFFLOAD" },
770 /* PnP and power management OIDs */
771 { OID_PNP_CAPABILITIES, "OID_PNP_CAPABILITIES (unused)" },
772 { OID_PNP_SET_POWER, "OID_PNP_SET_POWER (write only)" },
773 { OID_PNP_QUERY_POWER, "OID_PNP_QUERY_POWER (unused)" },
774 { OID_PNP_ADD_WAKE_UP_PATTERN, "OID_PNP_ADD_WAKE_UP_PATTERN (write only)" },
775 { OID_PNP_REMOVE_WAKE_UP_PATTERN, "OID_PNP_REMOVE_WAKE_UP_PATTERN (write only)" },
776 { OID_PNP_WAKE_UP_PATTERN_LIST, "OID_PNP_WAKE_UP_PATTERN_LIST (unused)" },
777 { OID_PNP_ENABLE_WAKE_UP, "OID_PNP_ENABLE_WAKE_UP (unused)" },
779 /* Unknown OID's (seen on an "Intel(R) PRO/Wireless 2200BG" 802.11 interface) */
780 { 0xFF100000, "Unknown 0xFF100000 (unused)" },
781 { 0xFF100002, "Unknown 0xFF100002 (unused)" },
782 { 0xFF100003, "Unknown 0xFF100003 (unused)" },
783 { 0xFF100004, "Unknown 0xFF100004 (unused)" },
784 { 0xFF100005, "Unknown 0xFF100005 (unused)" },
785 { 0xFF100006, "Unknown 0xFF100006 (unused)" },
786 { 0xFF100007, "Unknown 0xFF100007 (unused)" },
787 { 0xFF100009, "Unknown 0xFF100009 (unused)" },
788 { 0xFF10000b, "Unknown 0xFF10000b (unused)" },
789 { 0xFF10000c, "Unknown 0xFF10000c (unused)" },
790 { 0xFF10000e, "Unknown 0xFF10000e (unused)" },
791 { 0xFF10000f, "Unknown 0xFF10000f (unused)" },
792 /* continued by a lot more 0xFF... values */
798 /***************************************************************************/
799 /* debug functions, query or list supported NDIS OID's */
803 supported_list(LPADAPTER adapter)
805 unsigned char values[10000];
809 g_warning("supported_list_unhandled");
810 length = sizeof(values);
811 if (wpcap_packet_request(adapter, OID_GEN_SUPPORTED_LIST, FALSE /* !set */, values, &length)) {
812 guint32 *value = (guint32 *) values;
815 printf("OID: 0x%08X %s\n", *value, val_to_str(*value, oid_vals, "unknown"));
825 supported_query_oid(LPADAPTER adapter, guint32 oid)
827 unsigned char values[10000];
831 length = sizeof(values);
832 if (wpcap_packet_request(adapter, OID_GEN_SUPPORTED_LIST, FALSE /* !set */, values, &length)) {
833 guint32 *value = (guint32 *) values;
848 /******************************************************************************/
849 /* info functions, get and display various NDIS driver values */
857 add_meter_to_table(GtkWidget *list, guint *row, gchar *title,
858 int value, gchar *value_title,
869 indent = g_strdup_printf(" %s", title);
870 label = gtk_label_new(indent);
872 gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
873 gtk_table_attach(GTK_TABLE(list), label, 0, 1, *row, *row+1, GTK_EXPAND|GTK_FILL, 0, 0,0);
875 /* the level meter */
876 main_hb = gtk_hbox_new(FALSE, 6);
878 meter = gtk_vumeter_new ();
880 gtk_vumeter_set_orientation(GTK_VUMETER(meter), GTK_VUMETER_LEFT_TO_RIGHT);
882 gtk_vumeter_set_min_max(GTK_VUMETER(meter), &min, &max);
883 gtk_vumeter_set_yellow_level (GTK_VUMETER(meter), yellow_level);
884 gtk_vumeter_set_thickness (GTK_VUMETER(meter), 10);
885 gtk_vumeter_set_thickness_reduction (GTK_VUMETER(meter), 2);
886 gtk_vumeter_set_scale_hole_size (GTK_VUMETER(meter), 2);
887 gtk_vumeter_set_colors_inverted (GTK_VUMETER(meter), TRUE);
890 gtk_vumeter_set_scale_items(GTK_VUMETER(meter), scale);
893 gtk_vumeter_set_level(GTK_VUMETER(meter), value);
895 gtk_box_pack_start (GTK_BOX(main_hb),
901 val_lb = gtk_label_new(value_title);
902 gtk_widget_set_size_request(val_lb, 50, -1);
903 gtk_misc_set_alignment(GTK_MISC(val_lb), 1.0, 0.5);
905 gtk_box_pack_start (GTK_BOX(main_hb),
911 gtk_table_attach(GTK_TABLE(list), main_hb, 1, 2, *row, *row+1, GTK_EXPAND|GTK_FILL, 0, 0,0);
921 add_row_to_table(GtkWidget *list, guint *row, gchar *title, const gchar *value, gboolean sensitive)
926 if(strlen(value) != 0) {
927 indent = g_strdup_printf(" %s", title);
929 indent = g_strdup(title);
931 label = gtk_label_new(indent);
933 gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
934 gtk_widget_set_sensitive(label, sensitive);
935 gtk_table_attach(GTK_TABLE(list), label, 0, 1, *row, *row+1, GTK_EXPAND | GTK_FILL, 0, 0,0);
937 label = gtk_label_new(value);
938 gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
939 gtk_widget_set_sensitive(label, sensitive);
940 gtk_table_attach(GTK_TABLE(list), label, 1, 2, *row, *row+1, GTK_EXPAND | GTK_FILL, 0, 0,0);
947 add_string_to_table_sensitive(GtkWidget *list, guint *row, gchar *title, gchar *value, gboolean sensitive)
949 add_row_to_table(list, row, title, value, sensitive);
954 add_string_to_table(GtkWidget *list, guint *row, gchar *title, const gchar *value)
956 add_row_to_table(list, row, title, value, TRUE);
961 ssid_details(GtkWidget *table, guint *row, struct ndis_essid *ssid_in) {
962 struct ndis_essid ssid[2]; /* prevent an off by one error */
966 g_assert(ssid->length <= NDIS_ESSID_MAX_SIZE);
968 if(ssid->length != 0) {
969 ssid->essid[ssid->length] = '\0';
970 add_string_to_table(table, row, "SSID (Service Set IDentifier)", ssid->essid);
972 add_string_to_table(table, row, "SSID (Service Set IDentifier)", "(currently not associated with an SSID)");
978 rates_details(unsigned char *values, int length) {
985 Rates = g_string_new("");
992 g_string_append(Rates, "/");
995 float_value = ((float) (values[i] & 0x7F)) / 2;
997 /* reduce the screen estate by showing fractions only where required */
998 int_value = (int)float_value;
999 if(float_value == (float)int_value) {
1000 g_string_append_printf(Rates, "%.0f", float_value);
1002 g_string_append_printf(Rates, "%.1f", float_value);
1007 Rates = g_string_append(Rates, " MBits/s");
1009 Rates = g_string_append(Rates, "-");
1018 rates_vu_list(unsigned char *values, int length, int *max)
1021 GList *Rates = NULL;
1022 GtkVUMeterScaleItem * item;
1031 /* add a zero scale point */
1032 item = g_malloc(sizeof(GtkVUMeterScaleItem));
1036 Rates = g_list_append(Rates, item);
1038 /* get the maximum rate */
1039 for(i=0; i<length; i++) {
1043 level = (values[i] & 0x7F) / 2;
1052 /* debug: fake the 108MBit entry (I don't own one :-) */
1055 item = g_malloc(sizeof(GtkVUMeterScaleItem));
1058 item->label = "108";
1059 Rates = g_list_append(Rates, item);
1062 for(i=0; i<length; i++) {
1064 /* reduce the screen estate by showing fractions only where required */
1065 item = g_malloc(sizeof(GtkVUMeterScaleItem));
1067 item->level = (values[i] & 0x7F) / 2;
1069 /* common data rates: */
1070 /* 802.11 (15.1) : mandatory: 2, 1 */
1071 /* 802.11a (17.1) : mandatory: 24, 12, 6 optional: 54, 48, 36, 18, 9 */
1072 /* 802.11b (18.1) : mandatory: 11, 5.5 (+ 2, 1) */
1073 /* 802.11g (19.1.1): mandatory: 24, 12, 11, 6, 5.5, 2, 1 optional: 54, 48, 36, 33, 22, 18, 9 */
1075 /* proprietary: 108 */
1077 switch(item->level) {
1080 item->large = FALSE;
1089 item->label = "5.5";
1125 item->label = "108";
1128 item->large = FALSE;
1132 Rates = g_list_append(Rates, item);
1140 /* debugging only */
1142 hex(unsigned char *p, int len) {
1145 g_warning("%u: 0x%x (%u) '%c'", i, *p, *p,
1146 isprint(*p) ? *p : '.');
1156 capture_if_details_802_11_bssid_list(GtkWidget *main_vb, struct ndis_bssid_list *bssid_list)
1158 struct ndis_ssid_item *bssid_item;
1159 unsigned char mac[6];
1160 const gchar *manuf_name;
1164 if(bssid_list->num_items != 0) {
1165 char *titles[] = { "SSID", "MAC", "Vendor", "Privacy", "RSSI" , "Network Type" , "Infra. Mode" , "Ch." , "Rates", "Country" };
1167 gboolean privacy_required;
1168 gboolean privacy_wpa;
1169 gboolean privacy_wpa2;
1171 gchar ssid_buff[DETAILS_STR_MAX];
1172 gchar mac_buff[DETAILS_STR_MAX];
1173 gchar vendor_buff[DETAILS_STR_MAX];
1174 gchar privacy_buff[DETAILS_STR_MAX];
1175 gchar rssi_buff[DETAILS_STR_MAX];
1176 gchar nettype_buff[DETAILS_STR_MAX];
1177 gchar infra_buff[DETAILS_STR_MAX];
1178 gchar freq_buff[DETAILS_STR_MAX];
1179 gchar country_buff[DETAILS_STR_MAX] = "";
1181 list = simple_list_new(10, titles);
1182 gtk_box_pack_start(GTK_BOX(main_vb), list, TRUE /*expand*/, TRUE /*fill*/, 0 /* padding */);
1184 bssid_item = &bssid_list->items[0];
1186 while(bssid_list->num_items--) {
1187 privacy_required = FALSE;
1188 privacy_wpa = FALSE;
1189 privacy_wpa2 = FALSE;
1192 if(bssid_item->ssid.length > DETAILS_STR_MAX-1) {
1193 bssid_item->ssid.length = DETAILS_STR_MAX-1;
1195 memcpy(ssid_buff, bssid_item->ssid.essid, bssid_item->ssid.length);
1196 ssid_buff[bssid_item->ssid.length] = '\0';
1199 memcpy(mac, &bssid_item->mac, sizeof(mac));
1200 g_snprintf(mac_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X",
1201 mac[0], mac[1], mac[2],
1202 mac[3], mac[4], mac[5]);
1205 manuf_name = get_manuf_name_if_known(mac);
1206 if(manuf_name != NULL) {
1207 g_strlcpy(vendor_buff, manuf_name, DETAILS_STR_MAX);
1209 vendor_buff[0] = '\0';
1212 /* Supported Rates */
1213 Rates = rates_details(bssid_item->rates, NDIS_MAX_RATES_EX);
1216 g_snprintf(rssi_buff, DETAILS_STR_MAX, "%d dBm", bssid_item->rssi);
1219 /* (flag is set, if WEP (or higher) privacy is required) */
1220 if(bssid_item->privacy) {
1221 privacy_required = TRUE;
1225 g_snprintf(nettype_buff, sizeof(nettype_buff), "%s",
1226 val_to_str(bssid_item->net_type, win32_802_11_network_type_vals, "(0x%x)"));
1228 /* Infrastructure Mode */
1229 g_snprintf(infra_buff, sizeof(infra_buff), "%s",
1230 val_to_str(bssid_item->mode, win32_802_11_infra_mode_vals, "(0x%x)"));
1233 g_snprintf(freq_buff, sizeof(freq_buff), "%s",
1234 val_to_str(bssid_item->config.ds_config, win32_802_11_channel_vals, "(%u kHz)"));
1236 /* XXX - IE Length is currently not really supported here */
1238 int len = bssid_item->ie_length;
1239 unsigned char *iep = bssid_item->ies;
1242 NDIS_802_11_FIXED_IEs *fixed_ies;
1243 /*#define DEBUG_IE*/
1245 const gchar *manuf_name;
1246 gchar string_buff[DETAILS_STR_MAX];
1250 fixed_ies = (NDIS_802_11_FIXED_IEs *) iep;
1254 USHORT BeaconInterval;
1255 USHORT Capabilities;
1256 } NDIS_802_11_FIXED_IEs, *PNDIS_802_11_FIXED_IEs;
1259 iep += sizeof(NDIS_802_11_FIXED_IEs);
1260 len = bssid_item->ie_length - sizeof(NDIS_802_11_FIXED_IEs);
1270 g_warning("ID: %s (%u) Len: %u",
1271 val_to_str(id, ie_id_vals, "0x%x"), id, el_len);
1275 case(IE_ID_COUNTRY):
1277 g_snprintf(country_buff, sizeof(country_buff), "%c%c: Ch: %u-%u Max: %ddBm",
1278 iep[0], iep[1], iep[3], iep[4], iep[5]);
1281 privacy_wpa2 = TRUE;
1283 case(IE_ID_VENDOR_SPECIFIC): /* WPA */
1287 /* include information from epan/packet-ieee80211.c dissect_vendor_ie_wpawme() */
1288 manuf_name = get_manuf_name_if_known(iep);
1289 if(manuf_name != NULL) {
1290 g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X (%s) Type: %02X",
1291 *(iep), *(iep+1), *(iep+2), manuf_name, *(iep+3));
1293 g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X Type: %02X",
1294 *(iep), *(iep+1), *(iep+2), *(iep+3));
1297 g_warning("%s", string_buff);
1302 g_warning("WPA IE: %u", id);
1308 case(IE_ID_SUPPORTED_RATES):
1309 case(IE_ID_DS_PARAMETER_SET):
1311 case(IE_ID_ERP_INFORMATION):
1312 case(IE_ID_EXTENDED_SUPPORT_RATES):
1313 /* we already have that data, do nothing */
1316 /* unexpected IE_ID, print out hexdump */
1317 g_warning("Unknown IE ID: %u Len: %u", id, el_len);
1326 if(privacy_required) {
1328 /* XXX - how to detect data encryption (TKIP and AES)? */
1329 /* XXX - how to detect authentication (PSK or not)? */
1330 g_snprintf(privacy_buff, DETAILS_STR_MAX, "WPA2");
1333 /* XXX - how to detect data encryption (TKIP and AES)? */
1334 /* XXX - how to detect authentication (PSK or not)? */
1335 g_snprintf(privacy_buff, DETAILS_STR_MAX, "WPA");
1337 /* XXX - how to detect authentication (Open System and Shared Key)? */
1338 g_snprintf(privacy_buff, DETAILS_STR_MAX, "WEP");
1342 g_snprintf(privacy_buff, DETAILS_STR_MAX, "None");
1345 simple_list_append(list,
1358 g_string_free(Rates, TRUE /* free_segment */);
1360 /* the bssid_list isn't an array, but a sequence of variable length items */
1361 bssid_item = (struct ndis_ssid_item *) (((char *) bssid_item) + bssid_item->length);
1367 capture_if_details_802_11(GtkWidget *table, GtkWidget *main_vb, guint *row, LPADAPTER adapter) {
1370 unsigned int uint_value;
1371 unsigned char values[100];
1372 struct ndis_essid ssid;
1374 struct ndis_bssid_list *bssid_list;
1375 struct ndis_configuration *configuration;
1376 gchar string_buff[DETAILS_STR_MAX];
1379 const gchar *manuf_name;
1382 add_string_to_table(table, row, "Current network", "");
1385 length = sizeof(struct ndis_essid);
1386 memset(&ssid, 0, length);
1387 if (wpcap_packet_request(adapter, OID_802_11_SSID, FALSE /* !set */, (char *) &ssid, &length)) {
1388 ssid_details(table, row, &ssid);
1391 add_string_to_table(table, row, "SSID (Service Set IDentifier)", "-");
1395 length = sizeof(values);
1396 memset(values, 0, 6);
1397 if (wpcap_packet_request(adapter, OID_802_11_BSSID, FALSE /* !set */, values, &length)) {
1398 manuf_name = get_manuf_name_if_known(values);
1399 if(manuf_name != NULL) {
1400 g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X (%s)",
1401 values[0], values[1], values[2],
1402 values[3], values[4], values[5],
1405 g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X",
1406 values[0], values[1], values[2],
1407 values[3], values[4], values[5]);
1411 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1413 add_string_to_table(table, row, "BSSID (Basic Service Set IDentifier)", string_buff);
1415 /* Network type in use */
1416 if (wpcap_packet_request_uint(adapter, OID_802_11_NETWORK_TYPE_IN_USE, &uint_value)) {
1417 add_string_to_table(table, row, "Network type used",
1418 val_to_str(uint_value, win32_802_11_network_type_vals, "(0x%x)"));
1421 add_string_to_table(table, row, "Network type used", "-");
1424 /* Infrastructure mode */
1425 if (wpcap_packet_request_ulong(adapter, OID_802_11_INFRASTRUCTURE_MODE, &uint_value)) {
1426 add_string_to_table(table, row, "Infrastructure mode",
1427 val_to_str(uint_value, win32_802_11_infra_mode_vals, "(0x%x)"));
1430 add_string_to_table(table, row, "Infrastructure mode", "-");
1433 /* Authentication mode */
1434 if (wpcap_packet_request_ulong(adapter, OID_802_11_AUTHENTICATION_MODE, &uint_value)) {
1435 add_string_to_table(table, row, "Authentication mode",
1436 val_to_str(uint_value, win32_802_11_auth_mode_vals, "(0x%x)"));
1439 add_string_to_table(table, row, "Authentication mode", "-");
1442 /* Encryption (WEP) status */
1443 if (wpcap_packet_request_ulong(adapter, OID_802_11_ENCRYPTION_STATUS, &uint_value)) {
1444 add_string_to_table(table, row, "Encryption status",
1445 val_to_str(uint_value, win32_802_11_encryption_status_vals, "(0x%x)"));
1448 add_string_to_table(table, row, "Encryption status", "-");
1452 if (wpcap_packet_request_ulong(adapter, OID_802_11_TX_POWER_LEVEL, &ulong_value)) {
1453 g_snprintf(string_buff, DETAILS_STR_MAX, "%ld mW", ulong_value);
1454 add_string_to_table(table, row, "TX power", string_buff);
1457 add_string_to_table(table, row, "TX power", "-");
1461 if (wpcap_packet_request_ulong(adapter, OID_802_11_RSSI, &rssi)) {
1463 GList * scale_items = NULL;
1465 GtkVUMeterScaleItem *item;
1468 for (i = 0; i <= 100; i++) {
1469 item = g_malloc(sizeof(GtkVUMeterScaleItem));
1472 item->large = !(i%5);
1475 switch(item->level) {
1477 item->label = "-100 ";
1480 item->label = "-80 ";
1483 item->label = "-60 ";
1486 item->label = "-40 ";
1489 item->label = "-20 ";
1498 scale_items = g_list_append(scale_items, item);
1504 g_snprintf(string_buff, DETAILS_STR_MAX, "%ld dBm", rssi);
1506 add_meter_to_table(table, row, "RSSI (Received Signal Strength Indication)",
1507 rssi+100 , string_buff, -100+100, 0+100, -80+100, scale_items);
1509 current = scale_items;
1510 while (current != NULL) {
1511 g_free(current->data);
1513 current = g_list_next(current);
1515 g_list_free(scale_items);
1518 add_string_to_table(table, row, "RSSI (Received Signal Strength Indication)", "-");
1521 /* Supported Rates */
1522 length = sizeof(values);
1523 if (!wpcap_packet_request(adapter, OID_802_11_SUPPORTED_RATES, FALSE /* !set */, values, &length)) {
1529 /* if we can get the link speed, show Supported Rates in level meter format */
1530 if (length != 0 && wpcap_packet_request_uint(adapter, OID_GEN_LINK_SPEED, &uint_value)) {
1537 rates_list = rates_vu_list(values, length, &max);
1539 /* if we don't have a signal, we might not have a valid link speed */
1544 uint_value /= 10 * 1000;
1545 g_snprintf(string_buff, DETAILS_STR_MAX, "%u MBits/s", uint_value);
1552 add_meter_to_table(table, row, "Link Speed",
1553 uint_value, string_buff, 0, max, yellow, rates_list);
1555 current = rates_list;
1556 while (current != NULL) {
1557 g_free(current->data);
1559 current = g_list_next(current);
1561 g_list_free(rates_list);
1564 /* Supported Rates in String format */
1565 Rates = rates_details(values, length);
1566 add_string_to_table(table, row, "Supported Rates", Rates->str);
1567 g_string_free(Rates, TRUE /* free_segment */);
1570 length = sizeof(values);
1571 if (!wpcap_packet_request(adapter, OID_802_11_DESIRED_RATES, FALSE /* !set */, values, &length)) {
1577 Rates = rates_details(values, length);
1578 add_string_to_table(table, row, "Desired Rates", Rates->str);
1579 g_string_free(Rates, TRUE /* free_segment */);
1581 /* Configuration (e.g. frequency) */
1582 length = sizeof(values);
1583 if (wpcap_packet_request(adapter, OID_802_11_CONFIGURATION, FALSE /* !set */, (char *) values, &length)) {
1584 configuration = (struct ndis_configuration *) values;
1586 add_string_to_table(table, row, "Channel",
1587 val_to_str(configuration->ds_config, win32_802_11_channel_freq_vals, "(%u kHz)"));
1590 add_string_to_table(table, row, "Channel", "-");
1593 /* BSSID list: first trigger a scan */
1594 length = sizeof(uint_value);
1595 if (wpcap_packet_request(adapter, OID_802_11_BSSID_LIST_SCAN, TRUE /* set */, (char *) &uint_value, &length)) {
1597 g_warning("BSSID list scan done");
1599 g_warning("BSSID list scan failed");
1603 /* BSSID list: get scan results */
1604 /* XXX - we might have to wait up to 7 seconds! */
1605 length = sizeof(ULONG) + sizeof(struct ndis_ssid_item) * 16;
1606 bssid_list = g_malloc(length);
1607 /* some drivers don't set bssid_list->num_items to 0 if
1608 OID_802_11_BSSID_LIST returns no items (prism54 driver, e.g.,) */
1609 memset(bssid_list, 0, length);
1611 if (wpcap_packet_request(adapter, OID_802_11_BSSID_LIST, FALSE /* !set */, (char *) bssid_list, &length)) {
1612 add_string_to_table(table, row, "", "");
1613 add_string_to_table(table, row, "Available networks (BSSID list)", "");
1615 capture_if_details_802_11_bssid_list(main_vb, bssid_list);
1616 entries += bssid_list->num_items;
1618 add_string_to_table(table, row, "Available networks (BSSID list)", "-");
1628 capture_if_details_802_3(GtkWidget *table, GtkWidget *main_vb, guint *row, LPADAPTER adapter) {
1629 unsigned int uint_value;
1630 unsigned char values[100];
1632 gchar string_buff[DETAILS_STR_MAX];
1633 const gchar *manuf_name;
1637 add_string_to_table(table, row, "Characteristics", "");
1639 length = sizeof(values);
1640 if (wpcap_packet_request(adapter, OID_802_3_PERMANENT_ADDRESS, FALSE /* !set */, values, &length)) {
1641 manuf_name = get_manuf_name_if_known(values);
1642 if(manuf_name != NULL) {
1643 g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X (%s)",
1644 values[0], values[1], values[2],
1645 values[3], values[4], values[5],
1648 g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X",
1649 values[0], values[1], values[2],
1650 values[3], values[4], values[5]);
1654 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1656 add_string_to_table(table, row, "Permanent station address", string_buff);
1658 length = sizeof(values);
1659 if (wpcap_packet_request(adapter, OID_802_3_CURRENT_ADDRESS, FALSE /* !set */, values, &length)) {
1660 manuf_name = get_manuf_name_if_known(values);
1661 if(manuf_name != NULL) {
1662 g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X (%s)",
1663 values[0], values[1], values[2],
1664 values[3], values[4], values[5],
1667 g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X",
1668 values[0], values[1], values[2],
1669 values[3], values[4], values[5]);
1673 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1675 add_string_to_table(table, row, "Current station address", string_buff);
1678 add_string_to_table(table, row, "", "");
1679 add_string_to_table(table, row, "Statistics", "");
1681 if (wpcap_packet_request_uint(adapter, OID_802_3_RCV_ERROR_ALIGNMENT, &uint_value)) {
1682 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1685 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1687 add_string_to_table(table, row, "Packets received with alignment error", string_buff);
1689 if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_ONE_COLLISION, &uint_value)) {
1690 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1693 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1695 add_string_to_table(table, row, "Packets transmitted with one collision", string_buff);
1697 if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_MORE_COLLISIONS, &uint_value)) {
1698 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1701 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1703 add_string_to_table(table, row, "Packets transmitted with more than one collision", string_buff);
1705 if (wpcap_packet_request_uint(adapter, OID_802_3_RCV_OVERRUN, &uint_value)) {
1706 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1709 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1711 add_string_to_table(table, row, "Packets not received due to overrun", string_buff);
1713 if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_DEFERRED, &uint_value)) {
1714 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1717 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1719 add_string_to_table(table, row, "Packets transmitted after deferred", string_buff);
1721 if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_MAX_COLLISIONS, &uint_value)) {
1722 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1725 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1727 add_string_to_table(table, row, "Packets not transmitted due to collisions", string_buff);
1729 if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_UNDERRUN, &uint_value)) {
1730 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1733 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1735 add_string_to_table(table, row, "Packets not transmitted due to underrun", string_buff);
1737 if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_HEARTBEAT_FAILURE, &uint_value)) {
1738 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1741 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1743 add_string_to_table(table, row, "Packets transmitted with heartbeat failure", string_buff);
1745 if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_TIMES_CRS_LOST, &uint_value)) {
1746 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1749 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1751 add_string_to_table(table, row, "Times carrier sense signal lost during transmission", string_buff);
1753 if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_LATE_COLLISIONS, &uint_value)) {
1754 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1757 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1759 add_string_to_table(table, row, "Times late collisions detected", string_buff);
1765 capture_if_details_task_offload(GtkWidget *table, GtkWidget *main_vb, guint *row, LPADAPTER adapter) {
1766 NDIS_TASK_OFFLOAD_HEADER *offload;
1767 unsigned char values[10000];
1769 gchar string_buff[DETAILS_STR_MAX];
1771 int TcpIpChecksumSupported = 0;
1772 int IpSecSupported = 0;
1773 int TcpLargeSendSupported = 0;
1777 offload = (NDIS_TASK_OFFLOAD_HEADER *) values;
1778 offload->Version = NDIS_TASK_OFFLOAD_VERSION;
1779 offload->Size = sizeof(NDIS_TASK_OFFLOAD_HEADER);
1780 offload->Reserved = 0;
1781 offload->OffsetFirstTask = 0;
1782 /* the EncapsulationFormat seems to be ignored on a query (using Ethernet values) */
1783 offload->EncapsulationFormat.Encapsulation = IEEE_802_3_Encapsulation;
1784 offload->EncapsulationFormat.Flags.FixedHeaderSize = 1;
1785 offload->EncapsulationFormat.Flags.Reserved = 0;
1786 offload->EncapsulationFormat.EncapsulationHeaderSize = 14; /* sizeof(struct ether_header) */;
1788 length = sizeof(values);
1789 if (wpcap_packet_request(adapter, OID_TCP_TASK_OFFLOAD, FALSE /* !set */, values, &length)) {
1790 NDIS_TASK_OFFLOAD *of;
1791 /* XXX - hmmm, using a tvb for this? */
1792 unsigned char *valuep = values + offload->OffsetFirstTask;
1793 length -= offload->OffsetFirstTask;
1796 of = (NDIS_TASK_OFFLOAD *) valuep;
1799 case TcpIpChecksumNdisTask:
1801 NDIS_TASK_TCP_IP_CHECKSUM *tic = (NDIS_TASK_TCP_IP_CHECKSUM *) (of->TaskBuffer);
1804 TcpIpChecksumSupported++;
1806 add_string_to_table(table, row, "TCP/IP Checksum", "");
1808 g_snprintf(string_buff, DETAILS_STR_MAX, "");
1809 add_string_to_table(table, row, "V4 transmit checksum", "");
1811 g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, UDP: %s, IP: %s",
1812 tic->V4Transmit.TcpChecksum ? "Yes" : "No",
1813 tic->V4Transmit.UdpChecksum ? "Yes" : "No",
1814 tic->V4Transmit.IpChecksum ? "Yes" : "No");
1815 add_string_to_table(table, row, "Calculation supported", string_buff);
1817 g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, IP: %s",
1818 tic->V4Transmit.TcpOptionsSupported ? "Yes" : "No",
1819 tic->V4Transmit.IpOptionsSupported ? "Yes" : "No");
1820 add_string_to_table(table, row, "Options fields supported", string_buff);
1822 g_snprintf(string_buff, DETAILS_STR_MAX, "");
1823 add_string_to_table(table, row, "V4 receive checksum", "");
1825 g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, UDP: %s, IP: %s",
1826 tic->V4Receive.TcpChecksum ? "Yes" : "No",
1827 tic->V4Receive.UdpChecksum ? "Yes" : "No",
1828 tic->V4Receive.IpChecksum ? "Yes" : "No");
1829 add_string_to_table(table, row, "Validation supported", string_buff);
1831 g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, IP: %s",
1832 tic->V4Receive.TcpOptionsSupported ? "Yes" : "No",
1833 tic->V4Receive.IpOptionsSupported ? "Yes" : "No");
1834 add_string_to_table(table, row, "Options fields supported", string_buff);
1836 g_snprintf(string_buff, DETAILS_STR_MAX, "");
1837 add_string_to_table(table, row, "V6 transmit checksum", "");
1839 g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, UDP: %s",
1840 tic->V6Transmit.TcpChecksum ? "Yes" : "No",
1841 tic->V6Transmit.UdpChecksum ? "Yes" : "No");
1842 add_string_to_table(table, row, "Calculation supported", string_buff);
1844 g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, IP: %s",
1845 tic->V6Transmit.TcpOptionsSupported ? "Yes" : "No",
1846 tic->V6Transmit.IpOptionsSupported ? "Yes" : "No");
1847 add_string_to_table(table, row, "Options fields supported", string_buff);
1849 g_snprintf(string_buff, DETAILS_STR_MAX, "");
1850 add_string_to_table(table, row, "V6 receive checksum", "");
1852 g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, UDP: %s",
1853 tic->V6Receive.TcpChecksum ? "Yes" : "No",
1854 tic->V6Receive.UdpChecksum ? "Yes" : "No");
1855 add_string_to_table(table, row, "Validation supported", string_buff);
1857 g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, IP: %s",
1858 tic->V6Receive.TcpOptionsSupported ? "Yes" : "No",
1859 tic->V6Receive.IpOptionsSupported ? "Yes" : "No");
1860 add_string_to_table(table, row, "Options fields supported", string_buff);
1867 add_string_to_table(table, row, "IPSEC", "");
1868 g_snprintf(string_buff, DETAILS_STR_MAX, "IPSEC (TaskID 1) not decoded yet");
1869 add_string_to_table(table, row, "Task", string_buff);
1871 case TcpLargeSendNdisTask:
1873 NDIS_TASK_TCP_LARGE_SEND *tls = (NDIS_TASK_TCP_LARGE_SEND *) (of->TaskBuffer);
1876 TcpLargeSendSupported++;
1878 add_string_to_table(table, row, "TCP large send", "");
1879 /* XXX - while MSDN tells about version 0, we see version 1?!? */
1880 if(tls->Version == 1) {
1881 g_snprintf(string_buff, DETAILS_STR_MAX, "%u", tls->MaxOffLoadSize);
1882 add_string_to_table(table, row, "Max Offload Size", string_buff);
1883 g_snprintf(string_buff, DETAILS_STR_MAX, "%u", tls->MinSegmentCount);
1884 add_string_to_table(table, row, "Min Segment Count", string_buff);
1885 g_snprintf(string_buff, DETAILS_STR_MAX, "%s", tls->TcpOptions ? "Yes" : "No");
1886 add_string_to_table(table, row, "TCP option fields", string_buff);
1887 g_snprintf(string_buff, DETAILS_STR_MAX, "%s", tls->IpOptions ? "Yes" : "No");
1888 add_string_to_table(table, row, "IP option fields", string_buff);
1890 g_snprintf(string_buff, DETAILS_STR_MAX, "%u (unknown)", tls->Version);
1891 add_string_to_table(table, row, "Version", string_buff);
1896 g_snprintf(string_buff, DETAILS_STR_MAX, "Unknown task %u", of->Task);
1897 add_string_to_table(table, row, "Task", string_buff);
1901 add_string_to_table(table, row, "", "");
1903 valuep += of->OffsetNextTask;
1904 length -= of->OffsetNextTask;
1905 } while(of->OffsetNextTask != 0);
1908 if(TcpIpChecksumSupported == 0) {
1909 add_string_to_table(table, row, "TCP/IP Checksum", "");
1910 add_string_to_table(table, row, "Offload not supported", "-");
1913 if(IpSecSupported == 0) {
1914 add_string_to_table(table, row, "IpSec", "");
1915 add_string_to_table(table, row, "Offload not supported", "-");
1918 if(TcpLargeSendSupported == 0) {
1919 add_string_to_table(table, row, "TCP Large Send", "");
1920 add_string_to_table(table, row, "Offload not supported", "-");
1927 capture_if_details_general(GtkWidget *table, GtkWidget *main_vb, guint *row, LPADAPTER adapter, gchar *iface) {
1928 gchar string_buff[DETAILS_STR_MAX];
1929 const gchar *manuf_name;
1930 unsigned int uint_value;
1931 unsigned int uint_array[50];
1932 int uint_array_size;
1933 unsigned int physical_medium;
1935 unsigned char values[100];
1937 unsigned short ushort_value;
1942 add_string_to_table(table, row, "Characteristics", "");
1944 /* Vendor description */
1945 length = sizeof(values);
1946 if (wpcap_packet_request(adapter, OID_GEN_VENDOR_DESCRIPTION, FALSE /* !set */, values, &length)) {
1947 g_snprintf(string_buff, DETAILS_STR_MAX, "%s", values);
1950 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1952 add_string_to_table(table, row, "Vendor description", string_buff);
1955 add_string_to_table(table, row, "Interface", iface);
1957 /* link status (connected/disconnected) */
1958 if (wpcap_packet_request_uint(adapter, OID_GEN_MEDIA_CONNECT_STATUS, &uint_value)) {
1960 if(uint_value == 0) {
1961 add_string_to_table(table, row, "Link status", "Connected");
1963 add_string_to_table(table, row, "Link status", "Disconnected");
1966 add_string_to_table(table, row, "Link status", "-");
1970 if (wpcap_packet_request_uint(adapter, OID_GEN_LINK_SPEED, &uint_value)) {
1973 if(uint_value >= 1000 * 1000) {
1974 g_snprintf(string_buff, DETAILS_STR_MAX, "%d MBits/s", uint_value / 1000 / 1000);
1976 if(uint_value >= 1000) {
1977 g_snprintf(string_buff, DETAILS_STR_MAX, "%d KBits/s", uint_value / 1000);
1979 g_snprintf(string_buff, DETAILS_STR_MAX, "%d Bits/s", uint_value);
1983 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1985 add_string_to_table(table, row, "Link speed", string_buff);
1989 uint_array_size = sizeof(uint_array);
1990 if (wpcap_packet_request(adapter, OID_GEN_MEDIA_SUPPORTED, FALSE /* !set */, (char *) uint_array, &uint_array_size)) {
1992 uint_array_size /= sizeof(unsigned int);
1994 while(uint_array_size--) {
1995 add_string_to_table(table, row, "Media supported",
1996 val_to_str(uint_array[i], win32_802_3_medium_vals, "(0x%x)"));
2000 add_string_to_table(table, row, "Media supported", "-");
2003 uint_array_size = sizeof(uint_array);
2004 if (wpcap_packet_request(adapter, OID_GEN_MEDIA_IN_USE, FALSE /* !set */, (char *) uint_array, &uint_array_size)) {
2006 uint_array_size /= sizeof(unsigned int);
2008 while(uint_array_size--) {
2009 add_string_to_table(table, row, "Medium in use",
2010 val_to_str(uint_array[i], win32_802_3_medium_vals, "(0x%x)"));
2014 add_string_to_table(table, row, "Medium in use", "-");
2017 if (wpcap_packet_request_uint(adapter, OID_GEN_PHYSICAL_MEDIUM, &physical_medium)) {
2019 add_string_to_table(table, row, "Physical medium",
2020 val_to_str(physical_medium, win32_802_3_physical_medium_vals, "(0x%x)"));
2022 add_string_to_table(table, row, "Physical medium", "-");
2025 length = sizeof(ushort_value);
2026 if (wpcap_packet_request(adapter, OID_GEN_DRIVER_VERSION, FALSE /* !set */, (char *) &ushort_value, &length)) {
2028 g_snprintf(string_buff, DETAILS_STR_MAX, "%u.%u", ushort_value / 0x100, ushort_value % 0x100);
2030 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
2032 add_string_to_table(table, row, "NDIS Driver Version", string_buff);
2034 length = sizeof(uint_value);
2035 if (wpcap_packet_request(adapter, OID_GEN_VENDOR_DRIVER_VERSION, FALSE /* !set */, (char *) &uint_value, &length)) {
2037 /* XXX - what's the correct output format? */
2038 g_snprintf(string_buff, DETAILS_STR_MAX, "%u.%u (Hex: %X.%X)",
2039 (uint_value / 0x10000 ) % 0x10000,
2040 uint_value % 0x10000,
2041 (uint_value / 0x10000 ) % 0x10000,
2042 uint_value % 0x10000);
2044 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
2046 add_string_to_table(table, row, "Vendor Driver Version", string_buff);
2048 length = sizeof(values);
2049 if (wpcap_packet_request(adapter, OID_GEN_VENDOR_ID, FALSE /* !set */, values, &length)) {
2051 manuf_name = get_manuf_name_if_known(values);
2052 if(manuf_name != NULL) {
2053 g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X (%s) NIC: %02X",
2054 values[0], values[1], values[2], manuf_name, values[3]);
2056 g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X NIC: %02X",
2057 values[0], values[1], values[2], values[3]);
2060 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
2062 add_string_to_table(table, row, "Vendor ID", string_buff);
2064 if (wpcap_packet_request_uint(adapter, OID_GEN_MAC_OPTIONS, &uint_value)) {
2066 g_snprintf(string_buff, DETAILS_STR_MAX,
2067 "802.1P Priority: %s, 802.1Q VLAN: %s",
2068 (uint_value & NDIS_MAC_OPTION_8021P_PRIORITY) ? "Supported" : "Unsupported",
2069 (uint_value & NDIS_MAC_OPTION_8021Q_VLAN) ? "Supported" : "Unsupported" );
2071 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
2073 add_string_to_table(table, row, "MAC Options", string_buff);
2075 if (wpcap_packet_request_uint(adapter, OID_GEN_VLAN_ID, &uint_value)) {
2077 g_snprintf(string_buff, DETAILS_STR_MAX, "%u", uint_value);
2079 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
2081 add_string_to_table(table, row, "VLAN ID", string_buff);
2084 /* value seems to be constant */
2085 if (wpcap_packet_request_uint(adapter, OID_GEN_CURRENT_PACKET_FILTER, &uint_value)) {
2087 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
2089 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
2091 add_string_to_table(table, row, "Packet filter", string_buff);
2094 if (wpcap_packet_request_uint(adapter, OID_GEN_TRANSMIT_BUFFER_SPACE, &uint_value)) {
2096 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
2098 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
2100 add_string_to_table(table, row, "Transmit Buffer Space", string_buff);
2102 if (wpcap_packet_request_uint(adapter, OID_GEN_RECEIVE_BUFFER_SPACE, &uint_value)) {
2104 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
2106 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
2108 add_string_to_table(table, row, "Receive Buffer Space", string_buff);
2110 if (wpcap_packet_request_uint(adapter, OID_GEN_TRANSMIT_BLOCK_SIZE , &uint_value)) {
2112 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
2114 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
2116 add_string_to_table(table, row, "Transmit Block Size", string_buff);
2118 if (wpcap_packet_request_uint(adapter, OID_GEN_RECEIVE_BLOCK_SIZE, &uint_value)) {
2120 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
2122 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
2124 add_string_to_table(table, row, "Receive Block Size", string_buff);
2126 if (wpcap_packet_request_uint(adapter, OID_GEN_MAXIMUM_TOTAL_SIZE, &uint_value)) {
2128 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
2130 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
2132 add_string_to_table(table, row, "Maximum Packet Size", string_buff);
2139 capture_if_details_stats(GtkWidget *table, GtkWidget *main_vb, guint *row, LPADAPTER adapter) {
2140 gchar string_buff[DETAILS_STR_MAX];
2141 unsigned int uint_value;
2145 add_string_to_table(table, row, "Statistics", "");
2147 if (wpcap_packet_request_uint(adapter, OID_GEN_XMIT_OK, &uint_value)) {
2149 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
2151 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
2153 add_string_to_table(table, row, "Transmit OK", string_buff);
2155 if (wpcap_packet_request_uint(adapter, OID_GEN_XMIT_ERROR, &uint_value)) {
2157 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
2159 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
2161 add_string_to_table(table, row, "Transmit Error", string_buff);
2164 if (wpcap_packet_request_uint(adapter, OID_GEN_RCV_OK, &uint_value)) {
2166 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
2168 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
2170 add_string_to_table(table, row, "Receive OK", string_buff);
2172 if (wpcap_packet_request_uint(adapter, OID_GEN_RCV_ERROR, &uint_value)) {
2174 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
2176 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
2178 add_string_to_table(table, row, "Receive Error", string_buff);
2180 if (wpcap_packet_request_uint(adapter, OID_GEN_RCV_NO_BUFFER, &uint_value)) {
2182 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
2184 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
2186 add_string_to_table(table, row, "Receive but no Buffer", string_buff);
2188 if (wpcap_packet_request_uint(adapter, OID_GEN_DIRECTED_BYTES_XMIT, &uint_value)) {
2190 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
2192 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
2194 add_string_to_table(table, row, "Directed bytes transmitted w/o errors", string_buff);
2196 if (wpcap_packet_request_uint(adapter, OID_GEN_DIRECTED_FRAMES_XMIT, &uint_value)) {
2198 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
2200 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
2202 add_string_to_table(table, row, "Directed packets transmitted w/o errors", string_buff);
2204 if (wpcap_packet_request_uint(adapter, OID_GEN_MULTICAST_BYTES_XMIT, &uint_value)) {
2206 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
2208 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
2210 add_string_to_table(table, row, "Multicast bytes transmitted w/o errors", string_buff);
2212 if (wpcap_packet_request_uint(adapter, OID_GEN_MULTICAST_FRAMES_XMIT, &uint_value)) {
2214 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
2216 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
2218 add_string_to_table(table, row, "Multicast packets transmitted w/o errors", string_buff);
2220 if (wpcap_packet_request_uint(adapter, OID_GEN_BROADCAST_BYTES_XMIT, &uint_value)) {
2222 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
2224 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
2226 add_string_to_table(table, row, "Broadcast bytes transmitted w/o errors", string_buff);
2228 if (wpcap_packet_request_uint(adapter, OID_GEN_BROADCAST_FRAMES_XMIT, &uint_value)) {
2230 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
2232 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
2234 add_string_to_table(table, row, "Broadcast packets transmitted w/o errors", string_buff);
2236 if (wpcap_packet_request_uint(adapter, OID_GEN_DIRECTED_BYTES_RCV, &uint_value)) {
2238 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
2240 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
2242 add_string_to_table(table, row, "Directed bytes received w/o errors", string_buff);
2244 if (wpcap_packet_request_uint(adapter, OID_GEN_DIRECTED_FRAMES_RCV, &uint_value)) {
2246 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
2248 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
2250 add_string_to_table(table, row, "Directed packets received w/o errors", string_buff);
2252 if (wpcap_packet_request_uint(adapter, OID_GEN_MULTICAST_BYTES_RCV, &uint_value)) {
2254 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
2256 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
2258 add_string_to_table(table, row, "Multicast bytes received w/o errors", string_buff);
2260 if (wpcap_packet_request_uint(adapter, OID_GEN_MULTICAST_FRAMES_RCV, &uint_value)) {
2262 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
2264 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
2266 add_string_to_table(table, row, "Multicast packets received w/o errors", string_buff);
2268 if (wpcap_packet_request_uint(adapter, OID_GEN_BROADCAST_BYTES_RCV, &uint_value)) {
2270 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
2272 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
2274 add_string_to_table(table, row, "Broadcast bytes received w/o errors", string_buff);
2276 if (wpcap_packet_request_uint(adapter, OID_GEN_BROADCAST_FRAMES_RCV, &uint_value)) {
2278 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
2280 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
2282 add_string_to_table(table, row, "Broadcast packets received w/o errors", string_buff);
2284 if (wpcap_packet_request_uint(adapter, OID_GEN_RCV_CRC_ERROR, &uint_value)) {
2286 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
2288 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
2290 add_string_to_table(table, row, "Packets received with CRC or FCS errors", string_buff);
2292 if (wpcap_packet_request_uint(adapter, OID_GEN_TRANSMIT_QUEUE_LENGTH, &uint_value)) {
2294 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
2296 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
2298 add_string_to_table(table, row, "Packets queued for transmission", string_buff);
2305 capture_if_details_page_new(GtkWidget **table)
2309 main_vb = gtk_vbox_new(FALSE, 6);
2310 gtk_container_set_border_width(GTK_CONTAINER(main_vb), 12);
2313 *table = gtk_table_new(1, 2, FALSE);
2314 gtk_table_set_col_spacings(GTK_TABLE(*table), 6);
2315 gtk_table_set_row_spacings(GTK_TABLE(*table), 3);
2316 gtk_container_add(GTK_CONTAINER(main_vb), *table);
2323 capture_if_details_open_win(char *iface)
2325 GtkWidget *details_open_w,
2326 *main_vb, *bbox, *close_bt, *help_bt;
2327 GtkWidget *page_general, *page_stats, *page_802_3, *page_802_11, *page_task_offload;
2329 GtkWidget *table, *notebook, *label;
2335 /* open the network adapter */
2336 adapter = wpcap_packet_open(iface);
2337 if(adapter == NULL) {
2339 * We have an adapter that is not exposed through normal APIs (e.g. TurboCap)
2340 * or an adapter that isn't plugged in.
2342 * XXX - We should use the TurboCap API to get info about TurboCap adapters.
2344 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
2345 "%sCould not open adapter %s!%s"
2346 "\n\nHas it been unplugged?",
2347 simple_dialog_primary_start(), iface, simple_dialog_primary_end());
2351 /* open a new window */
2352 details_open_w = dlg_window_new("Wireshark: Interface Details"); /* transient_for top_level */
2353 gtk_window_set_destroy_with_parent (GTK_WINDOW(details_open_w), TRUE);
2355 /* Container for the window contents */
2356 main_vb = gtk_vbox_new(FALSE, 12);
2357 gtk_container_set_border_width(GTK_CONTAINER(main_vb), 12);
2358 gtk_container_add(GTK_CONTAINER(details_open_w), main_vb);
2361 notebook = gtk_notebook_new();
2362 gtk_box_pack_start(GTK_BOX(main_vb), notebook, TRUE /*expand*/, TRUE /*fill*/, 0 /*padding*/);
2365 page_general = capture_if_details_page_new(&table);
2366 page_lb = gtk_label_new("Characteristics");
2367 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page_general, page_lb);
2369 entries = capture_if_details_general(table, page_general, &row, adapter, iface);
2371 gtk_widget_set_sensitive(page_lb, FALSE);
2374 /* Statistics page */
2375 page_stats = capture_if_details_page_new(&table);
2376 page_lb = gtk_label_new("Statistics");
2377 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page_stats, page_lb);
2379 entries = capture_if_details_stats(table, page_stats, &row, adapter);
2381 gtk_widget_set_sensitive(page_lb, FALSE);
2384 /* 802.3 (Ethernet) page */
2385 page_802_3 = capture_if_details_page_new(&table);
2386 page_lb = gtk_label_new("802.3 (Ethernet)");
2387 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page_802_3, page_lb);
2389 entries = capture_if_details_802_3(table, page_802_3, &row, adapter);
2391 gtk_widget_set_sensitive(page_lb, FALSE);
2394 /* 802_11 (WI-FI) page */
2395 page_802_11 = capture_if_details_page_new(&table);
2396 page_lb = gtk_label_new("802.11 (WLAN)");
2397 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page_802_11, page_lb);
2399 entries = capture_if_details_802_11(table, page_802_11, &row, adapter);
2401 gtk_widget_set_sensitive(page_lb, FALSE);
2404 /* Task offload page */
2405 page_task_offload = capture_if_details_page_new(&table);
2406 page_lb = gtk_label_new("Task Offload");
2407 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page_task_offload, page_lb);
2409 entries = capture_if_details_task_offload(table, page_task_offload, &row, adapter);
2411 gtk_widget_set_sensitive(page_lb, FALSE);
2414 wpcap_packet_close(adapter);
2416 label = gtk_label_new("Note: the accuracy of all of these values relies only on the network card driver!");
2417 gtk_box_pack_start(GTK_BOX(main_vb), label, FALSE /*expand*/, FALSE /*fill*/, 0 /*padding*/);
2420 bbox = dlg_button_row_new(GTK_STOCK_CLOSE, GTK_STOCK_HELP, NULL);
2421 gtk_box_pack_start(GTK_BOX(main_vb), bbox, FALSE /*expand*/, FALSE /*fill*/, 0 /*padding*/);
2423 close_bt = g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
2424 window_set_cancel_button(details_open_w, close_bt, window_cancel_button_cb);
2426 help_bt = g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
2427 g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb), (gpointer) (HELP_CAPTURE_INTERFACES_DETAILS_DIALOG));
2429 gtk_widget_grab_focus(close_bt);
2431 g_signal_connect(details_open_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
2433 gtk_widget_show_all(details_open_w);
2434 window_present(details_open_w);
2438 static void capture_if_details_open_answered_cb(gpointer dialog _U_, gint btn, gpointer data)
2442 capture_if_details_open_win(data);
2444 case(ESD_BTN_CANCEL):
2447 g_assert_not_reached();
2453 capture_if_details_open(char *iface)
2456 gboolean version_ok = FALSE;
2460 /* check packet.dll version */
2461 version = wpcap_packet_get_version();
2463 if(version == NULL) {
2464 /* couldn't even get the packet.dll version, must be a very old one or just not existing -> give up */
2465 /* (this seems to be the case for 2.3 beta and all previous releases) */
2466 simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK,
2467 "%sCouldn't obtain WinPcap packet.dll version!%s"
2468 "\n\nThe WinPcap packet.dll is not installed or the version you use seems to be very old!"
2469 "\n\nPlease update/install WinPcap.",
2470 simple_dialog_primary_start(), simple_dialog_primary_end());
2474 /* XXX - add more known DLL versions here */
2475 /* (all versions since the 2.3 release seems to be working (although the 2.3 beta did not) */
2478 * 4.0 version strings:
2479 * 4.0.0.703: 4.0 beta 3
2480 * 4.0.0.655: 4.0 beta 2
2481 * 4.0.0.592: 4.0 beta 1
2483 strcmp(version, "3" ) > 0 || /* 4.0 and above (including betas) */
2484 strcmp(version, "3, 2, 0, 29") == 0 || /* 3.2 beta 1 */
2485 strcmp(version, "3, 1, 0, 27") == 0 || /* 3.1 release */
2486 strcmp(version, "3, 1, 0, 24") == 0 || /* 3.1 beta 4 */
2487 strcmp(version, "3, 1, 0, 23") == 0 || /* 3.1 beta 3 */
2488 strcmp(version, "3, 1, 0, 22") == 0 || /* 3.1 beta 2 */
2489 strcmp(version, "3, 1, 0, 20") == 0 || /* 3.1 beta */
2490 strcmp(version, "3.0 alpha3" ) == 0 || /* 3.0 release or 3.0 beta (yes, both versions report alpha3!) */
2491 strcmp(version, "2.3" ) == 0 /* 2.3 release */
2497 /* packet.dll version not known to us, warn user but try to continue */
2498 dialog = simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK | ESD_BTN_CANCEL,
2499 "%sUnknown WinPcap version might crash or fail!%s"
2500 "\n\nThe WinPcap packet.dll version \"%s\" is unknown if it supports required functions!"
2501 "\n\nOnly WinPcap versions 3.0 and 3.1 are known to work with this feature."
2502 "\n\nCrashes or unexpected behaviour might occur, you have been warned!"
2503 "\n\nContinue anyway?",
2504 simple_dialog_primary_start(), simple_dialog_primary_end(), version);
2505 simple_dialog_set_cb(dialog, capture_if_details_open_answered_cb, iface);
2507 capture_if_details_open_win(iface);
2512 capture_if_has_details(char *iface) {
2519 adapter = wpcap_packet_open(iface);
2521 wpcap_packet_close(adapter);
2528 #endif /* HAVE_LIBPCAP && _WIN32 */