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
43 #include "dlg_utils.h"
44 #include "gui_utils.h"
45 #include "compat_macros.h"
48 #include <epan/value_string.h>
49 #include <epan/addr_resolv.h>
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;
58 * Desired design of maximum size and alignment
60 #define ETH_SS_MAXSIZE 128 /* Implementation specific max size */
61 #define ETH_SS_ALIGNSIZE (sizeof (gint64 /*int64_t*/))
62 /* Implementation specific desired alignment */
64 * Definitions used for sockaddr_storage structure paddings design.
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))
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 */
84 /* ... copied from RFC2553 */
93 #include "capture_wpcap_packet.h"
94 #include "capture_if_details_dlg.h"
96 #include "simple_dialog.h"
98 #define DETAILS_STR_MAX 1024
101 /* The informations and definitions used here are coming from various places on the web:
103 * ndiswrapper (various NDIS related definitions)
104 * http://cvs.sourceforge.net/viewcvs.py/ndiswrapper/ndiswrapper/driver/
106 * ReactOS (various NDIS related definitions)
107 * http://www.reactos.org/generated/doxygen/d2/d6d/ndis_8h-source.html
109 * IEEE802.11 "Detailed NDIS OID Log for a 802.11b Miniport"
110 * http://www.ndis.com/papers/ieee802_11_log.htm
112 * FreeBSD (various NDIS related definitions)
113 * http://lists.freebsd.org/pipermail/p4-projects/2004-January/003433.html
115 * MS WHDC "Network Drivers and Windows"
116 * http://www.microsoft.com/whdc/archive/netdrv_up.mspx
118 * IEEE "Get IEEE 802" (the various 802.11 docs)
119 * http://standards.ieee.org/getieee802/802.11.html
121 * MS MSDN "Network Devices: Windows Driver Kit"
122 * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/NetXP_r/hh/NetXP_r/netref_4c297a96-2ba5-41ed-ab21-b7a9cfaa9b4d.xml.asp
124 * MS MSDN "Microsoft Windows CE .NET 4.2 Network Driver Reference"
125 * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceddk40/html/cxgrfNetworkDriverReference.asp
127 * MS MSDN (some explanations of a special MS 802.11 Information Element)
128 * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/randz/protocol/securing_public_wi-fi_hotspots.asp
130 * "WLANINFO für Windows XP"
131 * http://www-pc.uni-regensburg.de/systemsw/TOOLS/wlaninfo.htm
134 /********************************************************************************/
135 /* definitions that would usually come from the windows DDK (device driver kit) */
136 /* and are not part of the ntddndis.h file delivered with WinPcap */
139 #define OID_GEN_VLAN_ID 0x0001021C
142 #define OID_GEN_MEDIA_CAPABILITIES 0x00010201
143 #define OID_GEN_PHYSICAL_MEDIUM 0x00010202
146 #define OID_GEN_NETWORK_LAYER_ADDRESSES 0x00010118
147 #define OID_GEN_TRANSPORT_HEADER_OFFSET 0x00010119
150 /* Physical medium (OID_GEN_PHYSICAL_MEDIUM) */
151 typedef enum ndis_phys_medium {
152 NdisPhysicalMediumUnspecified,
153 NdisPhysicalMediumWirelessLan,
154 NdisPhysicalMediumCableModem,
155 NdisPhysicalMediumPhoneLine,
156 NdisPhysicalMediumPowerLine,
157 NdisPhysicalMediumDSL,
158 NdisPhysicalMediumFibreChannel,
159 NdisPhysicalMedium1394,
160 NdisPhysicalMediumWirelessWan,
161 NdisPhysicalMediumMax
164 /* flag definitions for OID_GEN_MAC_OPTIONS */
165 #define NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA 0x00000001
166 #define NDIS_MAC_OPTION_RECEIVE_SERIALIZED 0x00000002
167 #define NDIS_MAC_OPTION_TRANSFERS_NOT_PEND 0x00000004
168 #define NDIS_MAC_OPTION_NO_LOOPBACK 0x00000008
169 #define NDIS_MAC_OPTION_FULL_DUPLEX 0x00000010
170 #define NDIS_MAC_OPTION_EOTX_INDICATION 0x00000020
171 #define NDIS_MAC_OPTION_8021P_PRIORITY 0x00000040
172 #define NDIS_MAC_OPTION_8021Q_VLAN 0x00000080
175 #define OID_802_11_BSSID 0x0D010101
176 #define OID_802_11_SSID 0x0D010102
177 #define OID_802_11_NETWORK_TYPES_SUPPORTED 0x0D010203
178 #define OID_802_11_NETWORK_TYPE_IN_USE 0x0D010204
179 #define OID_802_11_TX_POWER_LEVEL 0x0D010205
180 #define OID_802_11_RSSI 0x0D010206
181 #define OID_802_11_RSSI_TRIGGER 0x0D010207
182 #define OID_802_11_INFRASTRUCTURE_MODE 0x0D010108
183 #define OID_802_11_FRAGMENTATION_THRESHOLD 0x0D010209
184 #define OID_802_11_RTS_THRESHOLD 0x0D01020A
185 #define OID_802_11_NUMBER_OF_ANTENNAS 0x0D01020B
186 #define OID_802_11_RX_ANTENNA_SELECTED 0x0D01020C
187 #define OID_802_11_TX_ANTENNA_SELECTED 0x0D01020D
188 #define OID_802_11_SUPPORTED_RATES 0x0D01020E
189 #define OID_802_11_DESIRED_RATES 0x0D010210
190 #define OID_802_11_CONFIGURATION 0x0D010211
191 #define OID_802_11_STATISTICS 0x0D020212
192 #define OID_802_11_ADD_WEP 0x0D010113
193 #define OID_802_11_REMOVE_WEP 0x0D010114
194 #define OID_802_11_DISASSOCIATE 0x0D010115
195 #define OID_802_11_POWER_MODE 0x0D010216
196 #define OID_802_11_BSSID_LIST 0x0D010217
197 #define OID_802_11_AUTHENTICATION_MODE 0x0D010118
198 #define OID_802_11_PRIVACY_FILTER 0x0D010119
199 #define OID_802_11_BSSID_LIST_SCAN 0x0D01011A
200 #define OID_802_11_WEP_STATUS 0x0D01011B
201 #define OID_802_11_ENCRYPTION_STATUS OID_802_11_WEP_STATUS
202 #define OID_802_11_RELOAD_DEFAULTS 0x0D01011C
203 #define OID_802_11_ADD_KEY 0x0D01011D
204 #define OID_802_11_REMOVE_KEY 0x0D01011E
205 #define OID_802_11_ASSOCIATION_INFORMATION 0x0D01011F
206 #define OID_802_11_TEST 0x0D010120
207 #define OID_802_11_CAPABILITY 0x0D010122
208 #define OID_802_11_PMKID 0x0D010123
211 /* PnP and power management OIDs */
212 #define OID_PNP_CAPABILITIES 0xFD010100
213 #define OID_PNP_SET_POWER 0xFD010101
214 #define OID_PNP_QUERY_POWER 0xFD010102
215 #define OID_PNP_ADD_WAKE_UP_PATTERN 0xFD010103
216 #define OID_PNP_REMOVE_WAKE_UP_PATTERN 0xFD010104
217 #define OID_PNP_WAKE_UP_PATTERN_LIST 0xFD010105
218 #define OID_PNP_ENABLE_WAKE_UP 0xFD010106
221 /* Currently associated SSID (OID_802_11_SSID) */
222 #define NDIS_ESSID_MAX_SIZE 32
225 UCHAR essid[NDIS_ESSID_MAX_SIZE];
228 /* Current infrastructure mode (OID_802_11_INFRASTRUCTURE_MODE) */
229 enum network_infrastructure {
231 Ndis802_11Infrastructure,
232 Ndis802_11AutoUnknown,
233 Ndis802_11InfrastructureMax
236 /* Current authentication mode (OID_802_11_AUTHENTICATION_MODE) */
237 enum authentication_mode {
238 Ndis802_11AuthModeOpen,
239 Ndis802_11AuthModeShared,
240 Ndis802_11AuthModeAutoSwitch,
241 Ndis802_11AuthModeWPA,
242 Ndis802_11AuthModeWPAPSK,
243 Ndis802_11AuthModeWPANone,
244 Ndis802_11AuthModeWPA2,
245 Ndis802_11AuthModeWPA2PSK,
246 Ndis802_11AuthModeMax
249 /* Current network type (OID_802_11_NETWORK_TYPES_SUPPORTED / OID_802_11_NETWORK_TYPE_IN_USE) */
255 /* MSDN site uses Ndis802_11Automode, which is not mentioned
256 * in DDK, so add one and assign it to
257 * Ndis802_11NetworkTypeMax */
259 Ndis802_11NetworkTypeMax = Ndis802_11Automode
262 /* Current encryption status (OID_802_11_ENCRYPTION_STATUS) */
263 enum encryption_status {
264 Ndis802_11WEPEnabled,
265 Ndis802_11Encryption1Enabled = Ndis802_11WEPEnabled,
266 Ndis802_11WEPDisabled,
267 Ndis802_11EncryptionDisabled = Ndis802_11WEPDisabled,
268 Ndis802_11WEPKeyAbsent,
269 Ndis802_11Encryption1KeyAbsent = Ndis802_11WEPKeyAbsent,
270 Ndis802_11WEPNotSupported,
271 Ndis802_11EncryptionNotSupported = Ndis802_11WEPNotSupported,
272 Ndis802_11Encryption2Enabled,
273 Ndis802_11Encryption2KeyAbsent,
274 Ndis802_11Encryption3Enabled,
275 Ndis802_11Encryption3KeyAbsent
279 /* some definitions needed for the following structs */
280 #define NDIS_MAX_RATES_EX 16
281 typedef UCHAR mac_address[/* ETH_ALEN */ 6];
282 typedef UCHAR ndis_rates[NDIS_MAX_RATES_EX];
284 /* configuration, e.g. frequency (OID_802_11_CONFIGURATION / OID_802_11_BSSID_LIST) */
285 struct /*packed*/ ndis_configuration {
290 struct ndis_configuration_fh {
298 /* bssid list item (OID_802_11_BSSID_LIST) */
299 struct ndis_ssid_item {
303 struct ndis_essid ssid;
307 struct ndis_configuration config;
315 typedef struct _NDIS_802_11_FIXED_IEs
318 USHORT BeaconInterval;
320 } NDIS_802_11_FIXED_IEs, *PNDIS_802_11_FIXED_IEs;
323 /* bssid list (OID_802_11_BSSID_LIST) */
324 struct ndis_bssid_list {
326 struct ndis_ssid_item items[1];
330 /******************************************************************************/
331 /* OID_TCP_TASK_OFFLOAD specific definitions that would usually come from the */
332 /* windows DDK (device driver kit) and are not part of the ntddndis.h file */
333 /* delivered with WinPcap */
336 #define OID_TCP_TASK_OFFLOAD 0xFC010201
339 typedef enum _NDIS_TASK {
340 TcpIpChecksumNdisTask,
342 TcpLargeSendNdisTask,
344 } NDIS_TASK, *PNDIS_TASK;
346 /* TaskBuffer content on TcpIpChecksumNdisTask */
347 typedef struct _NDIS_TASK_TCP_IP_CHECKSUM
351 ULONG IpOptionsSupported:1;
352 ULONG TcpOptionsSupported:1;
360 ULONG IpOptionsSupported:1;
361 ULONG TcpOptionsSupported:1;
369 ULONG IpOptionsSupported:1;
370 ULONG TcpOptionsSupported:1;
377 ULONG IpOptionsSupported:1;
378 ULONG TcpOptionsSupported:1;
382 } NDIS_TASK_TCP_IP_CHECKSUM, *PNDIS_TASK_TCP_IP_CHECKSUM;
384 /* TaskBuffer content on TcpLargeSendNdisTask */
385 typedef struct _NDIS_TASK_TCP_LARGE_SEND
388 ULONG MaxOffLoadSize;
389 ULONG MinSegmentCount;
392 } NDIS_TASK_TCP_LARGE_SEND, *PNDIS_TASK_TCP_LARGE_SEND;
395 typedef enum _NDIS_ENCAPSULATION {
396 UNSPECIFIED_Encapsulation,
398 IEEE_802_3_Encapsulation,
399 IEEE_802_5_Encapsulation,
400 LLC_SNAP_ROUTED_Encapsulation,
401 LLC_SNAP_BRIDGED_Encapsulation
402 } NDIS_ENCAPSULATION;
404 /* Encapsulation format */
405 typedef struct _NDIS_ENCAPSULATION_FORMAT {
406 NDIS_ENCAPSULATION Encapsulation;
408 ULONG FixedHeaderSize : 1;
411 ULONG EncapsulationHeaderSize;
412 } NDIS_ENCAPSULATION_FORMAT, *PNDIS_ENCAPSULATION_FORMAT;
415 typedef struct _NDIS_TASK_OFFLOAD_HEADER
420 UCHAR OffsetFirstTask;
421 NDIS_ENCAPSULATION_FORMAT EncapsulationFormat;
422 } NDIS_TASK_OFFLOAD_HEADER, *PNDIS_TASK_OFFLOAD_HEADER;
424 /* response struct */
425 #define NDIS_TASK_OFFLOAD_VERSION 1
426 typedef struct _NDIS_TASK_OFFLOAD
431 ULONG OffsetNextTask;
432 ULONG TaskBufferLength;
434 } NDIS_TASK_OFFLOAD, *PNDIS_TASK_OFFLOAD;
437 /***********************************************************************/
438 /* value_string's for info functions */
441 /* NDIS driver medium (OID_GEN_MEDIA_SUPPORTED / OID_GEN_MEDIA_IN_USE) */
442 static const value_string win32_802_3_medium_vals[] = {
443 { NdisMedium802_3, "802.3 (Ethernet)" }, /* might as well be WLAN, ... (see NDIS_PHYSICAL_MEDIUM) */
444 { NdisMedium802_5, "802.5 (Token Ring)" },
445 { NdisMediumFddi, "FDDI" },
446 { NdisMediumWan, "WAN" },
447 { NdisMediumLocalTalk, "Local Talk" },
448 { NdisMediumDix, "Dix" },
449 { NdisMediumArcnetRaw, "Arcnet Raw" },
450 { NdisMediumArcnet878_2,"Arcnet 878_2" },
451 { NdisMediumAtm, "ATM" },
452 { NdisMediumWirelessWan,"Wireless WAN" },
453 { NdisMediumIrda, "Irda" },
457 /* NDIS physical driver medium (OID_GEN_PHYSICAL_MEDIUM) */
458 static const value_string win32_802_3_physical_medium_vals[] = {
459 { NdisPhysicalMediumUnspecified, "Unspecified" },
460 { NdisPhysicalMediumWirelessLan, "Wireless LAN" },
461 { NdisPhysicalMediumCableModem, "Cable Modem (DOCSIS)" },
462 { NdisPhysicalMediumPhoneLine, "Phone Line" },
463 { NdisPhysicalMediumPowerLine, "Power Line" },
464 { NdisPhysicalMediumDSL, "DSL" },
465 { NdisPhysicalMediumFibreChannel, "Fibre Channel" },
466 { NdisPhysicalMedium1394, "IEEE 1394" },
467 { NdisPhysicalMediumWirelessWan, "Wireless WAN" },
471 static const value_string win32_802_11_infra_mode_vals[] = {
472 { Ndis802_11IBSS, "Ad Hoc" },
473 { Ndis802_11Infrastructure, "Access Point" },
474 { Ndis802_11AutoUnknown, "Auto or unknown" },
478 static const value_string win32_802_11_auth_mode_vals[] = {
479 { Ndis802_11AuthModeOpen, "Open System" },
480 { Ndis802_11AuthModeShared, "Shared Key" },
481 { Ndis802_11AuthModeAutoSwitch, "Auto Switch" },
482 { Ndis802_11AuthModeWPA, "WPA" },
483 { Ndis802_11AuthModeWPAPSK, "WPA-PSK (pre shared key)" },
484 { Ndis802_11AuthModeWPANone, "WPA (ad hoc)" },
485 { Ndis802_11AuthModeWPA2, "WPA2" },
486 { Ndis802_11AuthModeWPA2PSK, "WPA2-PSK (pre shared key)" },
490 static const value_string win32_802_11_network_type_vals[] = {
491 { Ndis802_11FH, "FH (frequency-hopping spread-spectrum)" },
492 { Ndis802_11DS, "DS (direct-sequence spread-spectrum)" },
493 { Ndis802_11OFDM5, "5-GHz OFDM" },
494 { Ndis802_11OFDM24, "2.4-GHz OFDM" },
495 { Ndis802_11Automode, "Auto" },
499 static const value_string win32_802_11_encryption_status_vals[] = {
500 { Ndis802_11Encryption1Enabled, "Encryption 1 Enabled (WEP enabled, TKIP & AES disabled, transmit key available)" },
501 { Ndis802_11EncryptionDisabled, "Encryption Disabled (WEP & TKIP & AES disabled, transmit key available)" },
502 { Ndis802_11Encryption1KeyAbsent, "Encryption 1 Key Absent (WEP enabled, TKIP & AES disabled, transmit key unavailable)" },
503 { Ndis802_11EncryptionNotSupported, "Encryption Not Supported (WEP & TKIP & AES not supported)" },
504 { Ndis802_11Encryption2Enabled, "Encryption 2 Enabled (WEP & TKIP enabled, AES disabled, transmit key available)" },
505 { Ndis802_11Encryption2KeyAbsent, "Encryption 2 Key Absent (WEP & TKIP enabled, AES disabled, transmit key unavailable)" },
506 { Ndis802_11Encryption3Enabled, "Encryption 3 Enabled (WEP & TKIP & AES enabled, transmit key available)" },
507 { Ndis802_11Encryption3KeyAbsent, "Encryption 3 Key Absent (WEP & TKIP & AES enabled, transmit key unavailable)" },
511 /* frequency to channel mapping (OID_802_11_CONFIGURATION) */
512 static const value_string win32_802_11_channel_freq_vals[] = {
513 { 2412000, "1 (2412000 kHz)" },
514 { 2417000, "2 (2417000 kHz)" },
515 { 2422000, "3 (2422000 kHz)" },
516 { 2427000, "4 (2427000 kHz)" },
517 { 2432000, "5 (2432000 kHz)" },
518 { 2437000, "6 (2437000 kHz)" },
519 { 2442000, "7 (2442000 kHz)" },
520 { 2447000, "8 (2447000 kHz)" },
521 { 2452000, "9 (2452000 kHz)" },
522 { 2457000, "10 (2457000 kHz)" },
523 { 2462000, "11 (2462000 kHz)" },
524 { 2467000, "12 (2467000 kHz)" },
525 { 2472000, "13 (2472000 kHz)" },
526 { 2484000, "14 (2484000 kHz)" },
530 /* frequency to channel mapping (OID_802_11_CONFIGURATION) */
531 static const value_string win32_802_11_channel_vals[] = {
550 /* ElementID in NDIS_802_11_VARIABLE_IEs */
551 static const value_string ie_id_vals[] = {
552 { 0, "SSID, 802.11" },
553 { 1, "Supported Rates, 802.11" },
554 { 2, "FH Parameter Set, 802.11" },
555 { 3, "DS Parameter Set, 802.11" },
556 { 4, "CF Parameter Set, 802.11" },
557 { 5, "TIM, 802.11" },
558 { 6, "IBSS Parameter Set, 802.11" },
559 { 7, "Country, 802.11d" },
560 { 8, "Hopping Pattern Parameters, 802.11d" },
561 { 9, "Hopping Pattern Table, 802.11d" },
562 { 10, "Request, 802.11d" },
563 /* 11-15 reserved, 802.11d */
564 { 16, "Challenge text, 802.11" },
565 /* 17-31 reserved, 802.11h */
566 { 32, "Power Constraint, 802.11h" },
567 { 33, "Power Capability, 802.11h" },
568 { 34, "TPC Request, 802.11h" },
569 { 35, "TPC Report, 802.11h" },
570 { 36, "Supported Channels, 802.11h" },
571 { 37, "Channel Switch Announcement, 802.11h" },
572 { 38, "Measurement Request, 802.11h" },
573 { 39, "Measurement Report, 802.11h" },
574 { 40, "Quiet, 802.11h" },
575 { 41, "IBSS DFS, 802.11h" },
576 { 42, "ERP information, 802.11g" },
577 /* 43-47 reserved, 802.11i */
578 { 48, "WPA2/RSN (Robust Secure Network), 802.11i" },
579 /* 49 reserved, 802.11i */
580 { 50, "Extended Supported Rates, 802.11g" },
581 /* 51-255 reserved, 802.11g */
582 { 221, "WPA, (no 802.11!)" },
587 static const value_string oid_vals[] = {
588 { OID_GEN_SUPPORTED_LIST, "OID_GEN_SUPPORTED_LIST" },
589 { OID_GEN_HARDWARE_STATUS, "OID_GEN_HARDWARE_STATUS (only internally interesting)" },
590 { OID_GEN_MEDIA_SUPPORTED, "OID_GEN_MEDIA_SUPPORTED" },
591 { OID_GEN_MEDIA_IN_USE, "OID_GEN_MEDIA_IN_USE" },
592 { OID_GEN_MAXIMUM_LOOKAHEAD, "OID_GEN_MAXIMUM_LOOKAHEAD (unused)" },
593 { OID_GEN_MAXIMUM_FRAME_SIZE, "OID_GEN_MAXIMUM_FRAME_SIZE (unused)" },
594 { OID_GEN_LINK_SPEED, "OID_GEN_LINK_SPEED" },
595 { OID_GEN_TRANSMIT_BUFFER_SPACE, "OID_GEN_TRANSMIT_BUFFER_SPACE" },
596 { OID_GEN_RECEIVE_BUFFER_SPACE, "OID_GEN_RECEIVE_BUFFER_SPACE" },
597 { OID_GEN_TRANSMIT_BLOCK_SIZE, "OID_GEN_TRANSMIT_BLOCK_SIZE" },
598 { OID_GEN_RECEIVE_BLOCK_SIZE, "OID_GEN_RECEIVE_BLOCK_SIZE" },
599 { OID_GEN_VENDOR_ID, "OID_GEN_VENDOR_ID" },
600 { OID_GEN_VENDOR_DESCRIPTION, "OID_GEN_VENDOR_DESCRIPTION" },
601 { OID_GEN_CURRENT_PACKET_FILTER, "OID_GEN_CURRENT_PACKET_FILTER (info seems to be constant)" },
602 { OID_GEN_CURRENT_LOOKAHEAD, "OID_GEN_CURRENT_LOOKAHEAD (only internally interesting)" },
603 { OID_GEN_DRIVER_VERSION, "OID_GEN_DRIVER_VERSION" },
604 { OID_GEN_MAXIMUM_TOTAL_SIZE, "OID_GEN_MAXIMUM_TOTAL_SIZE" },
605 { OID_GEN_PROTOCOL_OPTIONS, "OID_GEN_PROTOCOL_OPTIONS (info not interesting)" },
606 { OID_GEN_MAC_OPTIONS, "OID_GEN_MAC_OPTIONS" },
607 { OID_GEN_MEDIA_CONNECT_STATUS, "OID_GEN_MEDIA_CONNECT_STATUS" },
608 { OID_GEN_MAXIMUM_SEND_PACKETS, "OID_GEN_MAXIMUM_SEND_PACKETS (only internally interesting)" },
609 { OID_GEN_VENDOR_DRIVER_VERSION, "OID_GEN_VENDOR_DRIVER_VERSION" },
610 { OID_GEN_XMIT_OK, "OID_GEN_XMIT_OK" },
611 { OID_GEN_RCV_OK, "OID_GEN_RCV_OK" },
612 { OID_GEN_XMIT_ERROR, "OID_GEN_XMIT_ERROR" },
613 { OID_GEN_RCV_ERROR, "OID_GEN_RCV_ERROR" },
614 { OID_GEN_RCV_NO_BUFFER, "OID_GEN_RCV_NO_BUFFER" },
615 { OID_GEN_DIRECTED_BYTES_XMIT, "OID_GEN_DIRECTED_BYTES_XMIT" },
616 { OID_GEN_DIRECTED_FRAMES_XMIT, "OID_GEN_DIRECTED_FRAMES_XMIT" },
617 { OID_GEN_MULTICAST_BYTES_XMIT, "OID_GEN_MULTICAST_BYTES_XMIT" },
618 { OID_GEN_MULTICAST_FRAMES_XMIT, "OID_GEN_MULTICAST_FRAMES_XMIT" },
619 { OID_GEN_BROADCAST_BYTES_XMIT, "OID_GEN_BROADCAST_BYTES_XMIT" },
620 { OID_GEN_BROADCAST_FRAMES_XMIT, "OID_GEN_BROADCAST_FRAMES_XMIT" },
621 { OID_GEN_DIRECTED_BYTES_RCV, "OID_GEN_DIRECTED_BYTES_RCV" },
622 { OID_GEN_DIRECTED_FRAMES_RCV, "OID_GEN_DIRECTED_FRAMES_RCV" },
623 { OID_GEN_MULTICAST_BYTES_RCV, "OID_GEN_MULTICAST_BYTES_RCV" },
624 { OID_GEN_MULTICAST_FRAMES_RCV, "OID_GEN_MULTICAST_FRAMES_RCV" },
625 { OID_GEN_BROADCAST_BYTES_RCV, "OID_GEN_BROADCAST_BYTES_RCV" },
626 { OID_GEN_BROADCAST_FRAMES_RCV, "OID_GEN_BROADCAST_FRAMES_RCV" },
627 { OID_GEN_RCV_CRC_ERROR, "OID_GEN_RCV_CRC_ERROR" },
628 { OID_GEN_TRANSMIT_QUEUE_LENGTH, "OID_GEN_TRANSMIT_QUEUE_LENGTH" },
629 { OID_GEN_GET_TIME_CAPS, "OID_GEN_GET_TIME_CAPS (unsupp, unused)" },
630 { OID_GEN_GET_NETCARD_TIME, "OID_GEN_GET_NETCARD_TIME (unsupp, unused)" },
632 { OID_GEN_PHYSICAL_MEDIUM, "OID_GEN_PHYSICAL_MEDIUM" },
633 /*{ OID_GEN_MACHINE_NAME, "OID_GEN_MACHINE_NAME (unsupp, unused)" },*/
634 { OID_GEN_VLAN_ID, "OID_GEN_VLAN_ID" },
635 { OID_GEN_MEDIA_CAPABILITIES, "OID_GEN_MEDIA_CAPABILITIES (unsupp, unused)" },
637 { OID_GEN_NETWORK_LAYER_ADDRESSES, "OID_GEN_NETWORK_LAYER_ADDRESSES (write only)" },
638 { OID_GEN_TRANSPORT_HEADER_OFFSET, "OID_GEN_TRANSPORT_HEADER_OFFSET (write only)" },
640 { OID_802_3_PERMANENT_ADDRESS, "OID_802_3_PERMANENT_ADDRESS" },
641 { OID_802_3_CURRENT_ADDRESS, "OID_802_3_CURRENT_ADDRESS" },
642 { OID_802_3_MAXIMUM_LIST_SIZE, "OID_802_3_MAXIMUM_LIST_SIZE (unused)" },
643 { OID_802_3_MULTICAST_LIST, "OID_802_3_MULTICAST_LIST (unused)" }, /* XXX */
644 { OID_802_3_MAC_OPTIONS, "OID_802_3_MAC_OPTIONS (unsupp, unused)" },
646 { OID_802_3_RCV_ERROR_ALIGNMENT, "OID_802_3_RCV_ERROR_ALIGNMENT" },
647 { OID_802_3_XMIT_ONE_COLLISION, "OID_802_3_XMIT_ONE_COLLISION" },
648 { OID_802_3_XMIT_MORE_COLLISIONS, "OID_802_3_XMIT_MORE_COLLISIONS" },
649 { OID_802_3_XMIT_DEFERRED, "OID_802_3_XMIT_DEFERRED" },
650 { OID_802_3_XMIT_MAX_COLLISIONS, "OID_802_3_XMIT_MAX_COLLISIONS" },
651 { OID_802_3_RCV_OVERRUN, "OID_802_3_RCV_OVERRUN" },
652 { OID_802_3_XMIT_UNDERRUN, "OID_802_3_XMIT_UNDERRUN" },
653 { OID_802_3_XMIT_HEARTBEAT_FAILURE, "OID_802_3_XMIT_HEARTBEAT_FAILURE (unsupp, used)" },
654 { OID_802_3_XMIT_TIMES_CRS_LOST, "OID_802_3_XMIT_TIMES_CRS_LOST (unsupp, used)" },
655 { OID_802_3_XMIT_LATE_COLLISIONS, "OID_802_3_XMIT_LATE_COLLISIONS" },
657 { OID_802_11_BSSID, "OID_802_11_BSSID" },
658 { OID_802_11_SSID, "OID_802_11_SSID" },
659 { OID_802_11_NETWORK_TYPES_SUPPORTED, "OID_802_11_NETWORK_TYPES_SUPPORTED (info not interesting)" },
660 { OID_802_11_NETWORK_TYPE_IN_USE, "OID_802_11_NETWORK_TYPE_IN_USE" },
661 { OID_802_11_TX_POWER_LEVEL, "OID_802_11_TX_POWER_LEVEL (unsupp, used)" },
662 { OID_802_11_RSSI, "OID_802_11_RSSI" },
663 { OID_802_11_RSSI_TRIGGER, "OID_802_11_RSSI_TRIGGER (unsupp, unused)" },
664 { OID_802_11_INFRASTRUCTURE_MODE, "OID_802_11_INFRASTRUCTURE_MODE" },
665 { OID_802_11_FRAGMENTATION_THRESHOLD, "OID_802_11_FRAGMENTATION_THRESHOLD (unused)" },
666 { OID_802_11_RTS_THRESHOLD, "OID_802_11_RTS_THRESHOLD (unused)" },
667 { OID_802_11_NUMBER_OF_ANTENNAS, "OID_802_11_NUMBER_OF_ANTENNAS (unsupp, unused)" },
668 { OID_802_11_RX_ANTENNA_SELECTED, "OID_802_11_RX_ANTENNA_SELECTED (unsupp, unused)" },
669 { OID_802_11_TX_ANTENNA_SELECTED, "OID_802_11_TX_ANTENNA_SELECTED (unsupp, unused)" },
670 { OID_802_11_SUPPORTED_RATES, "OID_802_11_SUPPORTED_RATES" },
671 { OID_802_11_DESIRED_RATES, "OID_802_11_DESIRED_RATES (unsupp, used)" },
672 { OID_802_11_CONFIGURATION, "OID_802_11_CONFIGURATION" },
673 { OID_802_11_STATISTICS, "OID_802_11_STATISTICS (unsupp, unused)" },
674 { OID_802_11_ADD_WEP, "OID_802_11_ADD_WEP (write only)" },
675 { OID_802_11_REMOVE_WEP, "OID_802_11_REMOVE_WEP (write only)" },
676 { OID_802_11_DISASSOCIATE, "OID_802_11_DISASSOCIATE (write only)" },
677 { OID_802_11_POWER_MODE, "OID_802_11_POWER_MODE (info not interesting)" },
678 { OID_802_11_BSSID_LIST, "OID_802_11_BSSID_LIST" },
679 { OID_802_11_AUTHENTICATION_MODE, "OID_802_11_AUTHENTICATION_MODE" },
680 { OID_802_11_PRIVACY_FILTER, "OID_802_11_PRIVACY_FILTER (info not interesting)" },
681 { OID_802_11_BSSID_LIST_SCAN, "OID_802_11_BSSID_LIST_SCAN" },
682 { OID_802_11_WEP_STATUS, "OID_802_11_WEP_STATUS (info not interesting?)" },
683 { OID_802_11_ENCRYPTION_STATUS, "OID_802_11_ENCRYPTION_STATUS (unsupp, used)" },
684 { OID_802_11_RELOAD_DEFAULTS, "OID_802_11_RELOAD_DEFAULTS (write only)" },
685 { OID_802_11_ADD_KEY, "OID_802_11_ADD_KEY (write only)" },
686 { OID_802_11_REMOVE_KEY, "OID_802_11_REMOVE_KEY (write only)" },
687 { OID_802_11_ASSOCIATION_INFORMATION, "OID_802_11_ASSOCIATION_INFORMATION (unused)" }, /* XXX */
688 { OID_802_11_TEST, "OID_802_11_TEST (write only)" },
689 { OID_802_11_CAPABILITY, "OID_802_11_CAPABILITY (unsupp, unused)" },
690 { OID_802_11_PMKID, "OID_802_11_PMKID (unsupp, unused)" },
692 /* Token-Ring list is utterly incomplete (contains only the values for MS Loopback Driver) */
693 { OID_802_5_PERMANENT_ADDRESS, "OID_802_5_PERMANENT_ADDRESS (unused)" },
694 { OID_802_5_CURRENT_ADDRESS, "OID_802_5_CURRENT_ADDRESS (unused)" },
695 { OID_802_5_CURRENT_FUNCTIONAL, "OID_802_5_CURRENT_FUNCTIONAL (unused)" },
696 { OID_802_5_CURRENT_GROUP, "OID_802_5_CURRENT_GROUP (unused)" },
697 { OID_802_5_LAST_OPEN_STATUS, "OID_802_5_LAST_OPEN_STATUS (unused)" },
698 { OID_802_5_CURRENT_RING_STATUS, "OID_802_5_CURRENT_RING_STATUS (unused)" },
699 { OID_802_5_CURRENT_RING_STATE, "OID_802_5_CURRENT_RING_STATE (unused)" },
700 { OID_802_5_LINE_ERRORS, "OID_802_5_LINE_ERRORS (unused)" },
701 { OID_802_5_LOST_FRAMES, "OID_802_5_LOST_FRAMES (unused)" },
703 /* FDDI list is utterly incomplete (contains only the values for MS Loopback Driver) */
704 { OID_FDDI_LONG_PERMANENT_ADDR, "OID_FDDI_LONG_PERMANENT_ADDR (unused)" },
705 { OID_FDDI_LONG_CURRENT_ADDR, "OID_FDDI_LONG_CURRENT_ADDR (unused)" },
706 { OID_FDDI_LONG_MULTICAST_LIST, "OID_FDDI_LONG_MULTICAST_LIST (unused)" },
707 { OID_FDDI_LONG_MAX_LIST_SIZE, "OID_FDDI_LONG_MAX_LIST_SIZE (unused)" },
708 { OID_FDDI_SHORT_PERMANENT_ADDR, "OID_FDDI_SHORT_PERMANENT_ADDR (unused)" },
709 { OID_FDDI_SHORT_CURRENT_ADDR, "OID_FDDI_SHORT_CURRENT_ADDR (unused)" },
710 { OID_FDDI_SHORT_MULTICAST_LIST, "OID_FDDI_SHORT_MULTICAST_LIST (unused)" },
711 { OID_FDDI_SHORT_MAX_LIST_SIZE, "OID_FDDI_SHORT_MAX_LIST_SIZE (unused)" },
713 /* LocalTalk list is utterly incomplete (contains only the values for MS Loopback Driver) */
714 { OID_LTALK_CURRENT_NODE_ID, "OID_LTALK_CURRENT_NODE_ID (unused)" },
716 /* Arcnet list is utterly incomplete (contains only the values for MS Loopback Driver) */
717 { OID_ARCNET_PERMANENT_ADDRESS, "OID_ARCNET_PERMANENT_ADDRESS (unused)" },
718 { OID_ARCNET_CURRENT_ADDRESS, "OID_ARCNET_CURRENT_ADDRESS (unused)" },
720 { OID_TCP_TASK_OFFLOAD, "OID_TCP_TASK_OFFLOAD" },
722 /* PnP and power management OIDs */
723 { OID_PNP_CAPABILITIES, "OID_PNP_CAPABILITIES (unused)" },
724 { OID_PNP_SET_POWER, "OID_PNP_SET_POWER (write only)" },
725 { OID_PNP_QUERY_POWER, "OID_PNP_QUERY_POWER (unused)" },
726 { OID_PNP_ADD_WAKE_UP_PATTERN, "OID_PNP_ADD_WAKE_UP_PATTERN (write only)" },
727 { OID_PNP_REMOVE_WAKE_UP_PATTERN, "OID_PNP_REMOVE_WAKE_UP_PATTERN (write only)" },
728 { OID_PNP_WAKE_UP_PATTERN_LIST, "OID_PNP_WAKE_UP_PATTERN_LIST (unused)" },
729 { OID_PNP_ENABLE_WAKE_UP, "OID_PNP_ENABLE_WAKE_UP (unused)" },
731 /* Unknown OID's (seen on an "Intel(R) PRO/Wireless 2200BG" 802.11 interface) */
732 { 0xFF100000, "Unknown 0xFF100000 (unused)" },
733 { 0xFF100002, "Unknown 0xFF100002 (unused)" },
734 { 0xFF100003, "Unknown 0xFF100003 (unused)" },
735 { 0xFF100004, "Unknown 0xFF100004 (unused)" },
736 { 0xFF100005, "Unknown 0xFF100005 (unused)" },
737 { 0xFF100006, "Unknown 0xFF100006 (unused)" },
738 { 0xFF100007, "Unknown 0xFF100007 (unused)" },
739 { 0xFF100009, "Unknown 0xFF100009 (unused)" },
740 { 0xFF10000b, "Unknown 0xFF10000b (unused)" },
741 { 0xFF10000c, "Unknown 0xFF10000c (unused)" },
742 { 0xFF10000e, "Unknown 0xFF10000e (unused)" },
743 { 0xFF10000f, "Unknown 0xFF10000f (unused)" },
744 /* continued by a lot more 0xFF... values */
750 /***************************************************************************/
751 /* debug functions, query or list supported NDIS OID's */
755 supported_list(LPADAPTER adapter)
757 unsigned char values[10000];
761 g_warning("supported_list_unhandled");
762 length = sizeof(values);
763 if (wpcap_packet_request(adapter, OID_GEN_SUPPORTED_LIST, FALSE /* !set */, values, &length)) {
764 guint32 *value = (guint32 *) values;
767 printf("OID: 0x%08X %s\n", *value, val_to_str(*value, oid_vals, "unknown"));
777 supported_query_oid(LPADAPTER adapter, guint32 oid)
779 unsigned char values[10000];
783 length = sizeof(values);
784 if (wpcap_packet_request(adapter, OID_GEN_SUPPORTED_LIST, FALSE /* !set */, values, &length)) {
785 guint32 *value = (guint32 *) values;
800 /******************************************************************************/
801 /* info functions, get and display various NDIS driver values */
805 add_row_to_table(GtkWidget *list, guint *row, gchar *title, const gchar *value, gboolean sensitive)
810 if(strlen(value) != 0) {
811 indent = g_strdup_printf(" %s", title);
813 indent = g_strdup(title);
815 label = gtk_label_new(indent);
817 gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
818 gtk_widget_set_sensitive(label, sensitive);
819 gtk_table_attach_defaults(GTK_TABLE(list), label, 0, 1, *row, *row+1);
821 label = gtk_label_new(value);
822 gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
823 gtk_widget_set_sensitive(label, sensitive);
824 gtk_table_attach_defaults(GTK_TABLE(list), label, 1, 2, *row, *row+1);
831 add_string_to_table_sensitive(GtkWidget *list, guint *row, gchar *title, gchar *value, gboolean sensitive)
833 add_row_to_table(list, row, title, value, sensitive);
838 add_string_to_table(GtkWidget *list, guint *row, gchar *title, const gchar *value)
840 add_row_to_table(list, row, title, value, TRUE);
845 ssid_details(GtkWidget *table, guint *row, struct ndis_essid *ssid_in) {
846 struct ndis_essid ssid[2]; /* prevent an off by one error */
850 g_assert(ssid->length <= NDIS_ESSID_MAX_SIZE);
852 if(ssid->length != 0) {
853 ssid->essid[ssid->length] = '\0';
854 add_string_to_table(table, row, "SSID (Service Set IDentifier)", ssid->essid);
856 add_string_to_table(table, row, "SSID (Service Set IDentifier)", "(currently not associated with an SSID)");
862 rates_details(unsigned char *values, int length) {
869 Rates = g_string_new("");
876 g_string_append(Rates, "/");
879 float_value = (float) ((values[i] & 0x7F) / 2);
881 /* reduce the screen estate by showing fractions only where required */
882 int_value = (int)float_value;
883 if(float_value == (float)int_value) {
884 g_string_sprintfa(Rates, "%.0f", float_value);
886 g_string_sprintfa(Rates, "%.1f", float_value);
891 Rates = g_string_append(Rates, " MBits/s");
893 Rates = g_string_append(Rates, "-");
902 hex(unsigned char *p, int len) {
905 g_warning("%u: 0x%x (%u) '%c'", i, *p, *p,
906 isprint(*p) ? *p : '.');
916 capture_if_details_802_11_bssid_list(GtkWidget *main_vb, struct ndis_bssid_list *bssid_list)
918 struct ndis_ssid_item *bssid_item;
919 unsigned char mac[6];
920 const gchar *manuf_name;
924 if(bssid_list->num_items != 0) {
925 char *titles[] = { "SSID", "MAC", "Vendor", "Privacy", "RSSI" , "Network Type" , "Infra. Mode" , "Ch." , "Rates" };
927 gboolean privacy_required;
928 gboolean privacy_wpa;
929 gboolean privacy_wpa2;
931 gchar ssid_buff[DETAILS_STR_MAX];
932 gchar mac_buff[DETAILS_STR_MAX];
933 gchar vendor_buff[DETAILS_STR_MAX];
934 gchar privacy_buff[DETAILS_STR_MAX];
935 gchar rssi_buff[DETAILS_STR_MAX];
936 gchar nettype_buff[DETAILS_STR_MAX];
937 gchar infra_buff[DETAILS_STR_MAX];
938 gchar freq_buff[DETAILS_STR_MAX];
940 list = simple_list_new(9, titles);
941 gtk_container_add(GTK_CONTAINER(main_vb), list);
943 bssid_item = &bssid_list->items[0];
945 while(bssid_list->num_items--) {
946 privacy_required = FALSE;
948 privacy_wpa2 = FALSE;
951 if(bssid_item->ssid.length > DETAILS_STR_MAX-1) {
952 bssid_item->ssid.length = DETAILS_STR_MAX-1;
954 memcpy(ssid_buff, bssid_item->ssid.essid, bssid_item->ssid.length);
955 ssid_buff[bssid_item->ssid.length] = '\0';
958 memcpy(mac, &bssid_item->mac, sizeof(mac));
959 g_snprintf(mac_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X",
960 mac[0], mac[1], mac[2],
961 mac[3], mac[4], mac[5]);
964 manuf_name = get_manuf_name_if_known(mac);
965 if(manuf_name != NULL) {
966 strcpy(vendor_buff, manuf_name);
968 strcpy(vendor_buff, "");
971 /* Supported Rates */
972 Rates = rates_details(bssid_item->rates, NDIS_MAX_RATES_EX);
975 g_snprintf(rssi_buff, DETAILS_STR_MAX, "%d dBm", bssid_item->rssi);
978 /* (flag is set, if WEP (or higher) privacy is required) */
979 if(bssid_item->privacy) {
980 privacy_required = TRUE;
984 g_snprintf(nettype_buff, sizeof(nettype_buff), "%s",
985 val_to_str(bssid_item->net_type, win32_802_11_network_type_vals, "(0x%x)"));
987 /* Infrastructure Mode */
988 g_snprintf(infra_buff, sizeof(infra_buff), "%s",
989 val_to_str(bssid_item->mode, win32_802_11_infra_mode_vals, "(0x%x)"));
992 g_snprintf(freq_buff, sizeof(freq_buff), "%s",
993 val_to_str(bssid_item->config.ds_config, win32_802_11_channel_vals, "(%u kHz)"));
995 /* XXX - IE Length is currently not really supported here */
997 int len = bssid_item->ie_length;
998 unsigned char *iep = bssid_item->ies;
1001 NDIS_802_11_FIXED_IEs *fixed_ies;
1002 /*#define DEBUG_IE*/
1004 const gchar *manuf_name;
1005 gchar string_buff[DETAILS_STR_MAX];
1009 fixed_ies = (NDIS_802_11_FIXED_IEs *) iep;
1013 USHORT BeaconInterval;
1014 USHORT Capabilities;
1015 } NDIS_802_11_FIXED_IEs, *PNDIS_802_11_FIXED_IEs;
1018 iep += sizeof(NDIS_802_11_FIXED_IEs);
1019 len = bssid_item->ie_length - sizeof(NDIS_802_11_FIXED_IEs);
1029 g_warning("ID: %s (%u) Len: %u",
1030 val_to_str(id, ie_id_vals, "0x%x"), id, el_len);
1033 if (id != 0 && id != 1 && id != 3 && id != 5 && id != 42 && id != 50 && id != 221) {
1039 privacy_wpa2 = TRUE;
1047 /* include information from epan/packet-ieee80211.c dissect_vendor_ie_wpawme() */
1048 manuf_name = get_manuf_name_if_known(iep);
1049 if(manuf_name != NULL) {
1050 g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X (%s) Type: %02X",
1051 *(iep), *(iep+1), *(iep+2), manuf_name, *(iep+3));
1053 g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X Type: %02X",
1054 *(iep), *(iep+1), *(iep+2), *(iep+3));
1057 g_warning("%s", string_buff);
1071 if(privacy_required) {
1073 /* XXX - how to detect data encryption (TKIP and AES)? */
1074 /* XXX - how to detect authentication (PSK or not)? */
1075 g_snprintf(privacy_buff, DETAILS_STR_MAX, "WPA2");
1078 /* XXX - how to detect data encryption (TKIP and AES)? */
1079 /* XXX - how to detect authentication (PSK or not)? */
1080 g_snprintf(privacy_buff, DETAILS_STR_MAX, "WPA");
1082 /* XXX - how to detect authentication (Open System and Shared Key)? */
1083 g_snprintf(privacy_buff, DETAILS_STR_MAX, "WEP");
1087 g_snprintf(privacy_buff, DETAILS_STR_MAX, "None");
1090 simple_list_append(list,
1102 g_string_free(Rates, TRUE /* free_segment */);
1104 /* the bssid_list isn't an array, but a sequence of variable length items */
1105 bssid_item = (struct ndis_ssid_item *) (((char *) bssid_item) + bssid_item->length);
1111 capture_if_details_802_11(GtkWidget *table, GtkWidget *main_vb, guint *row, LPADAPTER adapter) {
1114 unsigned int uint_value;
1115 unsigned char values[100];
1116 struct ndis_essid ssid;
1118 struct ndis_bssid_list *bssid_list;
1119 struct ndis_configuration *configuration;
1120 gchar string_buff[DETAILS_STR_MAX];
1123 const gchar *manuf_name;
1126 add_string_to_table(table, row, "Characteristics", "");
1129 length = sizeof(struct ndis_essid);
1130 memset(&ssid, 0, length);
1131 if (wpcap_packet_request(adapter, OID_802_11_SSID, FALSE /* !set */, (char *) &ssid, &length)) {
1132 ssid_details(table, row, &ssid);
1135 add_string_to_table(table, row, "SSID (Service Set IDentifier)", "-");
1139 length = sizeof(values);
1140 memset(values, 0, 6);
1141 if (wpcap_packet_request(adapter, OID_802_11_BSSID, FALSE /* !set */, values, &length)) {
1142 manuf_name = get_manuf_name_if_known(values);
1143 if(manuf_name != NULL) {
1144 g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X (%s)",
1145 values[0], values[1], values[2],
1146 values[3], values[4], values[5],
1149 g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X",
1150 values[0], values[1], values[2],
1151 values[3], values[4], values[5]);
1155 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1157 add_string_to_table(table, row, "BSSID (Basic Service Set IDentifier)", string_buff);
1159 /* Network type in use */
1160 if (wpcap_packet_request_uint(adapter, OID_802_11_NETWORK_TYPE_IN_USE, &uint_value)) {
1161 add_string_to_table(table, row, "Network type used",
1162 val_to_str(uint_value, win32_802_11_network_type_vals, "(0x%x)"));
1165 add_string_to_table(table, row, "Network type used", "-");
1168 /* Infrastructure mode */
1169 if (wpcap_packet_request_ulong(adapter, OID_802_11_INFRASTRUCTURE_MODE, &uint_value)) {
1170 add_string_to_table(table, row, "Infrastructure mode",
1171 val_to_str(uint_value, win32_802_11_infra_mode_vals, "(0x%x)"));
1174 add_string_to_table(table, row, "Infrastructure mode", "-");
1177 /* Authentication mode */
1178 if (wpcap_packet_request_ulong(adapter, OID_802_11_AUTHENTICATION_MODE, &uint_value)) {
1179 add_string_to_table(table, row, "Authentication mode",
1180 val_to_str(uint_value, win32_802_11_auth_mode_vals, "(0x%x)"));
1183 add_string_to_table(table, row, "Authentication mode", "-");
1186 /* Encryption (WEP) status */
1187 if (wpcap_packet_request_ulong(adapter, OID_802_11_ENCRYPTION_STATUS, &uint_value)) {
1188 add_string_to_table(table, row, "Encryption status",
1189 val_to_str(uint_value, win32_802_11_encryption_status_vals, "(0x%x)"));
1192 add_string_to_table(table, row, "Encryption status", "-");
1196 if (wpcap_packet_request_ulong(adapter, OID_802_11_TX_POWER_LEVEL, &ulong_value)) {
1197 g_snprintf(string_buff, DETAILS_STR_MAX, "%ld mW", ulong_value);
1198 add_string_to_table(table, row, "TX power", string_buff);
1201 add_string_to_table(table, row, "TX power", "-");
1205 if (wpcap_packet_request_ulong(adapter, OID_802_11_RSSI, &long_value)) {
1206 g_snprintf(string_buff, DETAILS_STR_MAX, "%ld dBm (typical -10 through -100)", long_value);
1207 add_string_to_table(table, row, "RSSI (Received Signal Strength Indication)", string_buff);
1210 add_string_to_table(table, row, "RSSI (Received Signal Strength Indication)", "-");
1213 /* Supported Rates */
1214 length = sizeof(values);
1215 if (!wpcap_packet_request(adapter, OID_802_11_SUPPORTED_RATES, FALSE /* !set */, values, &length)) {
1221 Rates = rates_details(values, length);
1222 add_string_to_table(table, row, "Supported Rates", Rates->str);
1223 g_string_free(Rates, TRUE /* free_segment */);
1226 length = sizeof(values);
1227 if (!wpcap_packet_request(adapter, OID_802_11_DESIRED_RATES, FALSE /* !set */, values, &length)) {
1233 Rates = rates_details(values, length);
1234 add_string_to_table(table, row, "Desired Rates", Rates->str);
1235 g_string_free(Rates, TRUE /* free_segment */);
1237 /* Configuration (e.g. frequency) */
1238 length = sizeof(values);
1239 if (wpcap_packet_request(adapter, OID_802_11_CONFIGURATION, FALSE /* !set */, (char *) values, &length)) {
1240 configuration = (struct ndis_configuration *) values;
1242 add_string_to_table(table, row, "Channel",
1243 val_to_str(configuration->ds_config, win32_802_11_channel_freq_vals, "(%u kHz)"));
1246 add_string_to_table(table, row, "Channel", "-");
1249 /* BSSID list: first trigger a scan */
1250 length = sizeof(uint_value);
1251 if (wpcap_packet_request(adapter, OID_802_11_BSSID_LIST_SCAN, TRUE /* set */, (char *) &uint_value, &length)) {
1253 g_warning("BSSID list scan done");
1255 g_warning("BSSID list scan failed");
1259 /* BSSID list: get scan results */
1260 /* XXX - we might have to wait up to 7 seconds! */
1261 length = sizeof(ULONG) + sizeof(struct ndis_ssid_item) * 16;
1262 bssid_list = g_malloc(length);
1263 /* some drivers don't set bssid_list->num_items to 0 if
1264 OID_802_11_BSSID_LIST returns no items (prism54 driver, e.g.,) */
1265 memset(bssid_list, 0, length);
1267 if (wpcap_packet_request(adapter, OID_802_11_BSSID_LIST, FALSE /* !set */, (char *) bssid_list, &length)) {
1268 add_string_to_table(table, row, "", "");
1269 add_string_to_table(table, row, "BSSID list", "");
1271 capture_if_details_802_11_bssid_list(main_vb, bssid_list);
1272 entries += bssid_list->num_items;
1274 add_string_to_table(table, row, "802.11 BSSID list", "-");
1284 capture_if_details_802_3(GtkWidget *table, GtkWidget *main_vb, guint *row, LPADAPTER adapter) {
1285 unsigned int uint_value;
1286 unsigned char values[100];
1288 gchar string_buff[DETAILS_STR_MAX];
1289 const gchar *manuf_name;
1293 add_string_to_table(table, row, "Characteristics", "");
1295 length = sizeof(values);
1296 if (wpcap_packet_request(adapter, OID_802_3_PERMANENT_ADDRESS, FALSE /* !set */, values, &length)) {
1297 manuf_name = get_manuf_name_if_known(values);
1298 if(manuf_name != NULL) {
1299 g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X (%s)",
1300 values[0], values[1], values[2],
1301 values[3], values[4], values[5],
1304 g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X",
1305 values[0], values[1], values[2],
1306 values[3], values[4], values[5]);
1310 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1312 add_string_to_table(table, row, "Permanent station address", string_buff);
1314 length = sizeof(values);
1315 if (wpcap_packet_request(adapter, OID_802_3_CURRENT_ADDRESS, FALSE /* !set */, values, &length)) {
1316 manuf_name = get_manuf_name_if_known(values);
1317 if(manuf_name != NULL) {
1318 g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X (%s)",
1319 values[0], values[1], values[2],
1320 values[3], values[4], values[5],
1323 g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X",
1324 values[0], values[1], values[2],
1325 values[3], values[4], values[5]);
1329 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1331 add_string_to_table(table, row, "Current station address", string_buff);
1334 add_string_to_table(table, row, "", "");
1335 add_string_to_table(table, row, "Statistics", "");
1337 if (wpcap_packet_request_uint(adapter, OID_802_3_RCV_ERROR_ALIGNMENT, &uint_value)) {
1338 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1341 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1343 add_string_to_table(table, row, "Packets received with alignment error", string_buff);
1345 if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_ONE_COLLISION, &uint_value)) {
1346 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1349 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1351 add_string_to_table(table, row, "Packets transmitted with one collision", string_buff);
1353 if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_MORE_COLLISIONS, &uint_value)) {
1354 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1357 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1359 add_string_to_table(table, row, "Packets transmitted with more than one collision", string_buff);
1361 if (wpcap_packet_request_uint(adapter, OID_802_3_RCV_OVERRUN, &uint_value)) {
1362 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1365 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1367 add_string_to_table(table, row, "Packets not received due to overrun", string_buff);
1369 if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_DEFERRED, &uint_value)) {
1370 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1373 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1375 add_string_to_table(table, row, "Packets transmitted after deferred", string_buff);
1377 if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_MAX_COLLISIONS, &uint_value)) {
1378 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1381 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1383 add_string_to_table(table, row, "Packets not transmitted due to collisions", string_buff);
1385 if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_UNDERRUN, &uint_value)) {
1386 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1389 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1391 add_string_to_table(table, row, "Packets not transmitted due to underrun", string_buff);
1393 if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_HEARTBEAT_FAILURE, &uint_value)) {
1394 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1397 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1399 add_string_to_table(table, row, "Packets transmitted with heartbeat failure", string_buff);
1401 if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_TIMES_CRS_LOST, &uint_value)) {
1402 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1405 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1407 add_string_to_table(table, row, "Times carrier sense signal lost during transmission", string_buff);
1409 if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_LATE_COLLISIONS, &uint_value)) {
1410 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1413 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1415 add_string_to_table(table, row, "Times late collisions detected", string_buff);
1421 capture_if_details_task_offload(GtkWidget *table, GtkWidget *main_vb, guint *row, LPADAPTER adapter) {
1422 NDIS_TASK_OFFLOAD_HEADER *offload;
1423 unsigned char values[10000];
1425 gchar string_buff[DETAILS_STR_MAX];
1427 int TcpIpChecksumSupported = 0;
1428 int IpSecSupported = 0;
1429 int TcpLargeSendSupported = 0;
1433 offload = (NDIS_TASK_OFFLOAD_HEADER *) values;
1434 offload->Version = NDIS_TASK_OFFLOAD_VERSION;
1435 offload->Size = sizeof(NDIS_TASK_OFFLOAD_HEADER);
1436 offload->Reserved = 0;
1437 offload->OffsetFirstTask = 0;
1438 /* the EncapsulationFormat seems to be ignored on a query (using Ethernet values) */
1439 offload->EncapsulationFormat.Encapsulation = IEEE_802_3_Encapsulation;
1440 offload->EncapsulationFormat.Flags.FixedHeaderSize = 1;
1441 offload->EncapsulationFormat.Flags.Reserved = 0;
1442 offload->EncapsulationFormat.EncapsulationHeaderSize = 14; /* sizeof(struct ether_header) */;
1444 length = sizeof(values);
1445 if (wpcap_packet_request(adapter, OID_TCP_TASK_OFFLOAD, FALSE /* !set */, values, &length)) {
1446 NDIS_TASK_OFFLOAD *of;
1447 /* XXX - hmmm, using a tvb for this? */
1448 unsigned char *valuep = values + offload->OffsetFirstTask;
1449 length -= offload->OffsetFirstTask;
1452 of = (NDIS_TASK_OFFLOAD *) valuep;
1455 case TcpIpChecksumNdisTask:
1457 NDIS_TASK_TCP_IP_CHECKSUM *tic = (NDIS_TASK_TCP_IP_CHECKSUM *) (of->TaskBuffer);
1460 TcpIpChecksumSupported++;
1462 add_string_to_table(table, row, "TCP/IP Checksum", "");
1464 g_snprintf(string_buff, DETAILS_STR_MAX, "");
1465 add_string_to_table(table, row, "V4 transmit checksum", "");
1467 g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, UDP: %s, IP: %s",
1468 tic->V4Transmit.TcpChecksum ? "Yes" : "No",
1469 tic->V4Transmit.UdpChecksum ? "Yes" : "No",
1470 tic->V4Transmit.IpChecksum ? "Yes" : "No");
1471 add_string_to_table(table, row, "Calculation supported", string_buff);
1473 g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, IP: %s",
1474 tic->V4Transmit.TcpOptionsSupported ? "Yes" : "No",
1475 tic->V4Transmit.IpOptionsSupported ? "Yes" : "No");
1476 add_string_to_table(table, row, "Options fields supported", string_buff);
1478 g_snprintf(string_buff, DETAILS_STR_MAX, "");
1479 add_string_to_table(table, row, "V4 receive checksum", "");
1481 g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, UDP: %s, IP: %s",
1482 tic->V4Receive.TcpChecksum ? "Yes" : "No",
1483 tic->V4Receive.UdpChecksum ? "Yes" : "No",
1484 tic->V4Receive.IpChecksum ? "Yes" : "No");
1485 add_string_to_table(table, row, "Validation supported", string_buff);
1487 g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, IP: %s",
1488 tic->V4Receive.TcpOptionsSupported ? "Yes" : "No",
1489 tic->V4Receive.IpOptionsSupported ? "Yes" : "No");
1490 add_string_to_table(table, row, "Options fields supported", string_buff);
1492 g_snprintf(string_buff, DETAILS_STR_MAX, "");
1493 add_string_to_table(table, row, "V6 transmit checksum", "");
1495 g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, UDP: %s",
1496 tic->V6Transmit.TcpChecksum ? "Yes" : "No",
1497 tic->V6Transmit.UdpChecksum ? "Yes" : "No");
1498 add_string_to_table(table, row, "Calculation supported", string_buff);
1500 g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, IP: %s",
1501 tic->V6Transmit.TcpOptionsSupported ? "Yes" : "No",
1502 tic->V6Transmit.IpOptionsSupported ? "Yes" : "No");
1503 add_string_to_table(table, row, "Options fields supported", string_buff);
1505 g_snprintf(string_buff, DETAILS_STR_MAX, "");
1506 add_string_to_table(table, row, "V6 receive checksum", "");
1508 g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, UDP: %s",
1509 tic->V6Receive.TcpChecksum ? "Yes" : "No",
1510 tic->V6Receive.UdpChecksum ? "Yes" : "No");
1511 add_string_to_table(table, row, "Validation supported", string_buff);
1513 g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, IP: %s",
1514 tic->V6Receive.TcpOptionsSupported ? "Yes" : "No",
1515 tic->V6Receive.IpOptionsSupported ? "Yes" : "No");
1516 add_string_to_table(table, row, "Options fields supported", string_buff);
1523 add_string_to_table(table, row, "IPSEC", "");
1524 g_snprintf(string_buff, DETAILS_STR_MAX, "IPSEC (TaskID 1) not decoded yet");
1525 add_string_to_table(table, row, "Task", string_buff);
1527 case TcpLargeSendNdisTask:
1529 NDIS_TASK_TCP_LARGE_SEND *tls = (NDIS_TASK_TCP_LARGE_SEND *) (of->TaskBuffer);
1532 TcpLargeSendSupported++;
1534 add_string_to_table(table, row, "TCP large send", "");
1535 /* XXX - while MSDN tells about version 0, we see version 1?!? */
1536 if(tls->Version == 1) {
1537 g_snprintf(string_buff, DETAILS_STR_MAX, "%u", tls->MaxOffLoadSize);
1538 add_string_to_table(table, row, "Max Offload Size", string_buff);
1539 g_snprintf(string_buff, DETAILS_STR_MAX, "%u", tls->MinSegmentCount);
1540 add_string_to_table(table, row, "Min Segment Count", string_buff);
1541 g_snprintf(string_buff, DETAILS_STR_MAX, "%s", tls->TcpOptions ? "Yes" : "No");
1542 add_string_to_table(table, row, "TCP option fields", string_buff);
1543 g_snprintf(string_buff, DETAILS_STR_MAX, "%s", tls->IpOptions ? "Yes" : "No");
1544 add_string_to_table(table, row, "IP option fields", string_buff);
1546 g_snprintf(string_buff, DETAILS_STR_MAX, "%u (unknown)", tls->Version);
1547 add_string_to_table(table, row, "Version", string_buff);
1552 g_snprintf(string_buff, DETAILS_STR_MAX, "Unknown task %u", of->Task);
1553 add_string_to_table(table, row, "Task", string_buff);
1557 add_string_to_table(table, row, "", "");
1559 valuep += of->OffsetNextTask;
1560 length -= of->OffsetNextTask;
1561 } while(of->OffsetNextTask != 0);
1564 if(TcpIpChecksumSupported == 0) {
1565 add_string_to_table(table, row, "TCP/IP Checksum", "");
1566 add_string_to_table(table, row, "Offload not supported", "-");
1569 if(IpSecSupported == 0) {
1570 add_string_to_table(table, row, "IpSec", "");
1571 add_string_to_table(table, row, "Offload not supported", "-");
1574 if(TcpLargeSendSupported == 0) {
1575 add_string_to_table(table, row, "TCP Large Send", "");
1576 add_string_to_table(table, row, "Offload not supported", "-");
1583 capture_if_details_general(GtkWidget *table, GtkWidget *main_vb, guint *row, LPADAPTER adapter, gchar *iface) {
1584 gchar string_buff[DETAILS_STR_MAX];
1585 const gchar *manuf_name;
1586 unsigned int uint_value;
1587 unsigned int uint_array[50];
1588 int uint_array_size;
1589 unsigned int physical_medium;
1591 unsigned char values[100];
1593 unsigned short ushort_value;
1598 add_string_to_table(table, row, "Characteristics", "");
1600 /* Vendor description */
1601 length = sizeof(values);
1602 if (wpcap_packet_request(adapter, OID_GEN_VENDOR_DESCRIPTION, FALSE /* !set */, values, &length)) {
1603 g_snprintf(string_buff, DETAILS_STR_MAX, "%s", values);
1606 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1608 add_string_to_table(table, row, "Vendor description", string_buff);
1611 add_string_to_table(table, row, "Interface", iface);
1613 /* link status (connected/disconnected) */
1614 if (wpcap_packet_request_uint(adapter, OID_GEN_MEDIA_CONNECT_STATUS, &uint_value)) {
1616 if(uint_value == 0) {
1617 add_string_to_table(table, row, "Link status", "Connected");
1619 add_string_to_table(table, row, "Link status", "Disconnected");
1622 add_string_to_table(table, row, "Link status", "-");
1626 if (wpcap_packet_request_uint(adapter, OID_GEN_LINK_SPEED, &uint_value)) {
1629 if(uint_value >= 1000 * 1000) {
1630 g_snprintf(string_buff, DETAILS_STR_MAX, "%d MBits/s", uint_value / 1000 / 1000);
1632 if(uint_value >= 1000) {
1633 g_snprintf(string_buff, DETAILS_STR_MAX, "%d KBits/s", uint_value / 1000);
1635 g_snprintf(string_buff, DETAILS_STR_MAX, "%d Bits/s", uint_value);
1639 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1641 add_string_to_table(table, row, "Link speed", string_buff);
1645 uint_array_size = sizeof(uint_array);
1646 if (wpcap_packet_request(adapter, OID_GEN_MEDIA_SUPPORTED, FALSE /* !set */, (char *) uint_array, &uint_array_size)) {
1648 uint_array_size /= sizeof(unsigned int);
1650 while(uint_array_size--) {
1651 add_string_to_table(table, row, "Media supported",
1652 val_to_str(uint_array[i], win32_802_3_medium_vals, "(0x%x)"));
1656 add_string_to_table(table, row, "Media supported", "-");
1659 uint_array_size = sizeof(uint_array);
1660 if (wpcap_packet_request(adapter, OID_GEN_MEDIA_IN_USE, FALSE /* !set */, (char *) uint_array, &uint_array_size)) {
1662 uint_array_size /= sizeof(unsigned int);
1664 while(uint_array_size--) {
1665 add_string_to_table(table, row, "Medium in use",
1666 val_to_str(uint_array[i], win32_802_3_medium_vals, "(0x%x)"));
1670 add_string_to_table(table, row, "Medium in use", "-");
1673 if (wpcap_packet_request_uint(adapter, OID_GEN_PHYSICAL_MEDIUM, &physical_medium)) {
1675 add_string_to_table(table, row, "Physical medium",
1676 val_to_str(physical_medium, win32_802_3_physical_medium_vals, "(0x%x)"));
1678 add_string_to_table(table, row, "Physical medium", "-");
1681 length = sizeof(ushort_value);
1682 if (wpcap_packet_request(adapter, OID_GEN_DRIVER_VERSION, FALSE /* !set */, (char *) &ushort_value, &length)) {
1684 g_snprintf(string_buff, DETAILS_STR_MAX, "%u.%u", ushort_value / 0x100, ushort_value % 0x100);
1686 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1688 add_string_to_table(table, row, "NDIS Driver Version", string_buff);
1690 length = sizeof(uint_value);
1691 if (wpcap_packet_request(adapter, OID_GEN_VENDOR_DRIVER_VERSION, FALSE /* !set */, (char *) &uint_value, &length)) {
1693 /* XXX - what's the correct output format? */
1694 g_snprintf(string_buff, DETAILS_STR_MAX, "%u.%u (Hex: %X.%X)",
1695 (uint_value / 0x10000 ) % 0x10000,
1696 uint_value % 0x10000,
1697 (uint_value / 0x10000 ) % 0x10000,
1698 uint_value % 0x10000);
1700 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1702 add_string_to_table(table, row, "Vendor Driver Version", string_buff);
1704 length = sizeof(values);
1705 if (wpcap_packet_request(adapter, OID_GEN_VENDOR_ID, FALSE /* !set */, values, &length)) {
1707 manuf_name = get_manuf_name_if_known(values);
1708 if(manuf_name != NULL) {
1709 g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X (%s) NIC: %02X",
1710 values[0], values[1], values[2], manuf_name, values[3]);
1712 g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X NIC: %02X",
1713 values[0], values[1], values[2], values[3]);
1716 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1718 add_string_to_table(table, row, "Vendor ID", string_buff);
1720 if (wpcap_packet_request_uint(adapter, OID_GEN_MAC_OPTIONS, &uint_value)) {
1722 g_snprintf(string_buff, DETAILS_STR_MAX,
1723 "802.1P Priority: %s, 802.1Q VLAN: %s",
1724 (uint_value & NDIS_MAC_OPTION_8021P_PRIORITY) ? "Supported" : "Unsupported",
1725 (uint_value & NDIS_MAC_OPTION_8021Q_VLAN) ? "Supported" : "Unsupported" );
1727 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1729 add_string_to_table(table, row, "MAC Options", string_buff);
1731 if (wpcap_packet_request_uint(adapter, OID_GEN_VLAN_ID, &uint_value)) {
1733 g_snprintf(string_buff, DETAILS_STR_MAX, "%u", uint_value);
1735 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1737 add_string_to_table(table, row, "VLAN ID", string_buff);
1740 /* value seems to be constant */
1741 if (wpcap_packet_request_uint(adapter, OID_GEN_CURRENT_PACKET_FILTER, &uint_value)) {
1743 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1745 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1747 add_string_to_table(table, row, "Packet filter", string_buff);
1750 if (wpcap_packet_request_uint(adapter, OID_GEN_TRANSMIT_BUFFER_SPACE, &uint_value)) {
1752 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1754 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1756 add_string_to_table(table, row, "Transmit Buffer Space", string_buff);
1758 if (wpcap_packet_request_uint(adapter, OID_GEN_RECEIVE_BUFFER_SPACE, &uint_value)) {
1760 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1762 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1764 add_string_to_table(table, row, "Receive Buffer Space", string_buff);
1766 if (wpcap_packet_request_uint(adapter, OID_GEN_TRANSMIT_BLOCK_SIZE , &uint_value)) {
1768 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1770 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1772 add_string_to_table(table, row, "Transmit Block Size", string_buff);
1774 if (wpcap_packet_request_uint(adapter, OID_GEN_RECEIVE_BLOCK_SIZE, &uint_value)) {
1776 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1778 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1780 add_string_to_table(table, row, "Receive Block Size", string_buff);
1782 if (wpcap_packet_request_uint(adapter, OID_GEN_MAXIMUM_TOTAL_SIZE, &uint_value)) {
1784 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1786 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1788 add_string_to_table(table, row, "Maximum Packet Size", string_buff);
1795 capture_if_details_stats(GtkWidget *table, GtkWidget *main_vb, guint *row, LPADAPTER adapter) {
1796 gchar string_buff[DETAILS_STR_MAX];
1797 unsigned int uint_value;
1801 add_string_to_table(table, row, "Statistics", "");
1803 if (wpcap_packet_request_uint(adapter, OID_GEN_XMIT_OK, &uint_value)) {
1805 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1807 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1809 add_string_to_table(table, row, "Transmit OK", string_buff);
1811 if (wpcap_packet_request_uint(adapter, OID_GEN_XMIT_ERROR, &uint_value)) {
1813 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1815 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1817 add_string_to_table(table, row, "Transmit Error", string_buff);
1820 if (wpcap_packet_request_uint(adapter, OID_GEN_RCV_OK, &uint_value)) {
1822 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1824 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1826 add_string_to_table(table, row, "Receive OK", string_buff);
1828 if (wpcap_packet_request_uint(adapter, OID_GEN_RCV_ERROR, &uint_value)) {
1830 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1832 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1834 add_string_to_table(table, row, "Receive Error", string_buff);
1836 if (wpcap_packet_request_uint(adapter, OID_GEN_RCV_NO_BUFFER, &uint_value)) {
1838 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1840 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1842 add_string_to_table(table, row, "Receive but no Buffer", string_buff);
1844 if (wpcap_packet_request_uint(adapter, OID_GEN_DIRECTED_BYTES_XMIT, &uint_value)) {
1846 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1848 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1850 add_string_to_table(table, row, "Directed bytes transmitted w/o errors", string_buff);
1852 if (wpcap_packet_request_uint(adapter, OID_GEN_DIRECTED_FRAMES_XMIT, &uint_value)) {
1854 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1856 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1858 add_string_to_table(table, row, "Directed packets transmitted w/o errors", string_buff);
1860 if (wpcap_packet_request_uint(adapter, OID_GEN_MULTICAST_BYTES_XMIT, &uint_value)) {
1862 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1864 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1866 add_string_to_table(table, row, "Multicast bytes transmitted w/o errors", string_buff);
1868 if (wpcap_packet_request_uint(adapter, OID_GEN_MULTICAST_FRAMES_XMIT, &uint_value)) {
1870 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1872 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1874 add_string_to_table(table, row, "Multicast packets transmitted w/o errors", string_buff);
1876 if (wpcap_packet_request_uint(adapter, OID_GEN_BROADCAST_BYTES_XMIT, &uint_value)) {
1878 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1880 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1882 add_string_to_table(table, row, "Broadcast bytes transmitted w/o errors", string_buff);
1884 if (wpcap_packet_request_uint(adapter, OID_GEN_BROADCAST_FRAMES_XMIT, &uint_value)) {
1886 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1888 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1890 add_string_to_table(table, row, "Broadcast packets transmitted w/o errors", string_buff);
1892 if (wpcap_packet_request_uint(adapter, OID_GEN_DIRECTED_BYTES_RCV, &uint_value)) {
1894 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1896 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1898 add_string_to_table(table, row, "Directed bytes received w/o errors", string_buff);
1900 if (wpcap_packet_request_uint(adapter, OID_GEN_DIRECTED_FRAMES_RCV, &uint_value)) {
1902 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1904 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1906 add_string_to_table(table, row, "Directed packets received w/o errors", string_buff);
1908 if (wpcap_packet_request_uint(adapter, OID_GEN_MULTICAST_BYTES_RCV, &uint_value)) {
1910 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1912 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1914 add_string_to_table(table, row, "Multicast bytes received w/o errors", string_buff);
1916 if (wpcap_packet_request_uint(adapter, OID_GEN_MULTICAST_FRAMES_RCV, &uint_value)) {
1918 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1920 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1922 add_string_to_table(table, row, "Multicast packets received w/o errors", string_buff);
1924 if (wpcap_packet_request_uint(adapter, OID_GEN_BROADCAST_BYTES_RCV, &uint_value)) {
1926 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1928 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1930 add_string_to_table(table, row, "Broadcast bytes received w/o errors", string_buff);
1932 if (wpcap_packet_request_uint(adapter, OID_GEN_BROADCAST_FRAMES_RCV, &uint_value)) {
1934 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1936 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1938 add_string_to_table(table, row, "Broadcast packets received w/o errors", string_buff);
1940 if (wpcap_packet_request_uint(adapter, OID_GEN_RCV_CRC_ERROR, &uint_value)) {
1942 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1944 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1946 add_string_to_table(table, row, "Packets received with CRC or FCS errors", string_buff);
1948 if (wpcap_packet_request_uint(adapter, OID_GEN_TRANSMIT_QUEUE_LENGTH, &uint_value)) {
1950 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1952 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1954 add_string_to_table(table, row, "Packets queued for transmission", string_buff);
1961 capture_if_details_page_new(GtkWidget **table)
1965 main_vb = gtk_vbox_new(FALSE, 6);
1966 gtk_container_border_width(GTK_CONTAINER(main_vb), 12);
1969 *table = gtk_table_new(1, 2, FALSE);
1970 gtk_table_set_col_spacings(GTK_TABLE(*table), 6);
1971 gtk_table_set_row_spacings(GTK_TABLE(*table), 3);
1972 gtk_container_add(GTK_CONTAINER(main_vb), *table);
1979 capture_if_details_open_win(char *iface)
1981 GtkWidget *details_open_w,
1982 *main_vb, *bbox, *close_bt, *help_bt;
1983 GtkWidget *page_general, *page_stats, *page_802_3, *page_802_11, *page_task_offload;
1985 GtkWidget *table, *notebook, *label;
1991 /* open the network adapter */
1992 adapter = wpcap_packet_open(iface);
1993 if(adapter == NULL) {
1994 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
1995 PRIMARY_TEXT_START "Could not open adapter: %s!" PRIMARY_TEXT_END
1996 "\n\nThe adapter might be removed from the system in the meantime!", iface);
2000 /* open a new window */
2001 details_open_w = window_new(GTK_WINDOW_TOPLEVEL, "Ethereal: Interface Details");
2003 /* Container for the window contents */
2004 main_vb = gtk_vbox_new(FALSE, 12);
2005 gtk_container_border_width(GTK_CONTAINER(main_vb), 12);
2006 gtk_container_add(GTK_CONTAINER(details_open_w), main_vb);
2009 notebook = gtk_notebook_new();
2010 gtk_container_add(GTK_CONTAINER(main_vb), notebook);
2013 page_general = capture_if_details_page_new(&table);
2014 page_lb = gtk_label_new("Characteristics");
2015 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page_general, page_lb);
2017 entries = capture_if_details_general(table, page_general, &row, adapter, iface);
2019 gtk_widget_set_sensitive(page_lb, FALSE);
2022 /* Statistics page */
2023 page_stats = capture_if_details_page_new(&table);
2024 page_lb = gtk_label_new("Statistics");
2025 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page_stats, page_lb);
2027 entries = capture_if_details_stats(table, page_stats, &row, adapter);
2029 gtk_widget_set_sensitive(page_lb, FALSE);
2032 /* 802.3 (Ethernet) page */
2033 page_802_3 = capture_if_details_page_new(&table);
2034 page_lb = gtk_label_new("802.3 (Ethernet)");
2035 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page_802_3, page_lb);
2037 entries = capture_if_details_802_3(table, page_802_3, &row, adapter);
2039 gtk_widget_set_sensitive(page_lb, FALSE);
2042 /* 802_11 (WI-FI) page */
2043 page_802_11 = capture_if_details_page_new(&table);
2044 page_lb = gtk_label_new("802.11 (WLAN)");
2045 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page_802_11, page_lb);
2047 entries = capture_if_details_802_11(table, page_802_11, &row, adapter);
2049 gtk_widget_set_sensitive(page_lb, FALSE);
2052 /* Task offload page */
2053 page_task_offload = capture_if_details_page_new(&table);
2054 page_lb = gtk_label_new("Task Offload");
2055 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page_task_offload, page_lb);
2057 entries = capture_if_details_task_offload(table, page_task_offload, &row, adapter);
2059 gtk_widget_set_sensitive(page_lb, FALSE);
2062 wpcap_packet_close(adapter);
2064 label = gtk_label_new("Note: accuracy of all of these values are only relying on the network card driver!");
2065 gtk_container_add(GTK_CONTAINER(main_vb), label);
2068 if(topic_available(HELP_CAPTURE_INTERFACES_DETAILS_DIALOG)) {
2069 bbox = dlg_button_row_new(GTK_STOCK_CLOSE, GTK_STOCK_HELP, NULL);
2071 bbox = dlg_button_row_new(GTK_STOCK_CLOSE, NULL);
2073 gtk_container_add(GTK_CONTAINER(main_vb), bbox);
2075 close_bt = OBJECT_GET_DATA(bbox, GTK_STOCK_CLOSE);
2076 window_set_cancel_button(details_open_w, close_bt, window_cancel_button_cb);
2078 if(topic_available(HELP_CAPTURE_INTERFACES_DETAILS_DIALOG)) {
2079 help_bt = OBJECT_GET_DATA(bbox, GTK_STOCK_HELP);
2080 SIGNAL_CONNECT(help_bt, "clicked", topic_cb, HELP_CAPTURE_INTERFACES_DETAILS_DIALOG);
2083 gtk_widget_grab_focus(close_bt);
2085 SIGNAL_CONNECT(details_open_w, "delete_event", window_delete_event_cb, NULL);
2087 gtk_widget_show_all(details_open_w);
2088 window_present(details_open_w);
2092 static void capture_if_details_open_answered_cb(gpointer dialog _U_, gint btn, gpointer data)
2096 capture_if_details_open_win(data);
2098 case(ESD_BTN_CANCEL):
2101 g_assert_not_reached();
2107 capture_if_details_open(char *iface)
2110 gboolean version_ok = FALSE;
2114 /* check packet.dll version */
2115 version = wpcap_packet_get_version();
2117 if(version == NULL) {
2118 /* couldn't even get the packet.dll version, must be a very old one or just not existing -> give up */
2119 /* (this seems to be the case for 2.3 beta and all previous releases) */
2120 simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK,
2121 PRIMARY_TEXT_START "Couldn't optain WinPcap packet.dll version!" PRIMARY_TEXT_END
2122 "\n\nThe WinPcap packet.dll is not installed or the version you use seems to be very old!"
2123 "\n\nPlease update/install WinPcap.");
2127 /* XXX - add more known DLL versions here */
2128 /* (all versions since the 2.3 release seems to be working (although the 2.3 beta did not) */
2129 if( strcmp(version, "3, 2, 0, 29") == 0 || /* 3.2 beta 1 */
2130 strcmp(version, "3, 1, 0, 27") == 0 || /* 3.1 release */
2131 strcmp(version, "3, 1, 0, 24") == 0 || /* 3.1 beta 4 */
2132 strcmp(version, "3, 1, 0, 23") == 0 || /* 3.1 beta 3 */
2133 strcmp(version, "3, 1, 0, 22") == 0 || /* 3.1 beta 2 */
2134 strcmp(version, "3, 1, 0, 20") == 0 || /* 3.1 beta */
2135 strcmp(version, "3.0 alpha3" ) == 0 || /* 3.0 release or 3.0 beta (yes, both versions report alpha3!) */
2136 strcmp(version, "2.3" ) == 0 /* 2.3 release */
2142 /* packet.dll version not known to us, warn user but try to continue */
2143 dialog = simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK | ESD_BTN_CANCEL,
2144 PRIMARY_TEXT_START "Unknown WinPcap version might crash or fail!" PRIMARY_TEXT_END
2145 "\n\nThe WinPcap packet.dll version \"%s\" is unknown if it supports required functions!"
2146 "\n\nOnly WinPcap versions 3.0 and 3.1 are known to work with this feature."
2147 "\n\nCrashes or unexpected behaviour might occur, you have been warned!"
2148 "\n\nContinue anyway?",
2150 simple_dialog_set_cb(dialog, capture_if_details_open_answered_cb, iface);
2152 capture_if_details_open_win(iface);
2157 #endif /* HAVE_LIBPCAP && _WIN32 */