1 /* capture_if_details_dlg.c
2 * Routines for capture interface details window (only Win32!)
6 * Ethereal - Network traffic analyzer
7 * By Gerald Combs <gerald@ethereal.com>
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
102 /******************************************************************************************************************************/
103 /* definitions that would usually come from the windows DDK (device driver kit) */
104 /* and are not part of the ntddndis.h file delivered with WinPcap */
106 /* Required OIDs (from ndiswrapper) */
107 #define OID_GEN_VLAN_ID 0x0001021C
109 /* Optional OIDs (from ndiswrapper) */
110 #define OID_GEN_MEDIA_CAPABILITIES 0x00010201
111 #define OID_GEN_PHYSICAL_MEDIUM 0x00010202
113 /* Optional OIDs (from http://www.ndis.com/papers/ieee802_11_log.htm) */
114 #define OID_GEN_NETWORK_LAYER_ADDRESSES 0x00010118
115 #define OID_GEN_TRANSPORT_HEADER_OFFSET 0x00010119
118 /* Physical medium (OID_GEN_PHYSICAL_MEDIUM) (from ndiswrapper) */
119 typedef enum ndis_phys_medium {
120 NdisPhysicalMediumUnspecified,
121 NdisPhysicalMediumWirelessLan,
122 NdisPhysicalMediumCableModem,
123 NdisPhysicalMediumPhoneLine,
124 NdisPhysicalMediumPowerLine,
125 NdisPhysicalMediumDSL,
126 NdisPhysicalMediumFibreChannel,
127 NdisPhysicalMedium1394,
128 NdisPhysicalMediumWirelessWan,
129 NdisPhysicalMediumMax
132 /* flag definitions for OID_GEN_MAC_OPTIONS */
133 #define NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA 0x00000001
134 #define NDIS_MAC_OPTION_RECEIVE_SERIALIZED 0x00000002
135 #define NDIS_MAC_OPTION_TRANSFERS_NOT_PEND 0x00000004
136 #define NDIS_MAC_OPTION_NO_LOOPBACK 0x00000008
137 #define NDIS_MAC_OPTION_FULL_DUPLEX 0x00000010
138 #define NDIS_MAC_OPTION_EOTX_INDICATION 0x00000020
139 #define NDIS_MAC_OPTION_8021P_PRIORITY 0x00000040
140 #define NDIS_MAC_OPTION_8021Q_VLAN 0x00000080
142 /* 802.11 OIDs (from ndiswrapper), see also: */
143 /* http://www.ndis.com/papers/ieee802_11_log.htm */
144 /* http://lists.freebsd.org/pipermail/p4-projects/2004-January/003433.html */
145 #define OID_802_11_BSSID 0x0D010101
146 #define OID_802_11_SSID 0x0D010102
147 #define OID_802_11_NETWORK_TYPES_SUPPORTED 0x0D010203
148 #define OID_802_11_NETWORK_TYPE_IN_USE 0x0D010204
149 #define OID_802_11_TX_POWER_LEVEL 0x0D010205
150 #define OID_802_11_RSSI 0x0D010206
151 #define OID_802_11_RSSI_TRIGGER 0x0D010207
152 #define OID_802_11_INFRASTRUCTURE_MODE 0x0D010108
153 #define OID_802_11_FRAGMENTATION_THRESHOLD 0x0D010209
154 #define OID_802_11_RTS_THRESHOLD 0x0D01020A
155 #define OID_802_11_NUMBER_OF_ANTENNAS 0x0D01020B
156 #define OID_802_11_RX_ANTENNA_SELECTED 0x0D01020C
157 #define OID_802_11_TX_ANTENNA_SELECTED 0x0D01020D
158 #define OID_802_11_SUPPORTED_RATES 0x0D01020E
159 #define OID_802_11_DESIRED_RATES 0x0D010210
160 #define OID_802_11_CONFIGURATION 0x0D010211
161 #define OID_802_11_STATISTICS 0x0D020212
162 #define OID_802_11_ADD_WEP 0x0D010113
163 #define OID_802_11_REMOVE_WEP 0x0D010114
164 #define OID_802_11_DISASSOCIATE 0x0D010115
165 #define OID_802_11_POWER_MODE 0x0D010216
166 #define OID_802_11_BSSID_LIST 0x0D010217
167 #define OID_802_11_AUTHENTICATION_MODE 0x0D010118
168 #define OID_802_11_PRIVACY_FILTER 0x0D010119
169 #define OID_802_11_BSSID_LIST_SCAN 0x0D01011A
170 #define OID_802_11_WEP_STATUS 0x0D01011B
171 #define OID_802_11_ENCRYPTION_STATUS OID_802_11_WEP_STATUS
172 #define OID_802_11_RELOAD_DEFAULTS 0x0D01011C
173 #define OID_802_11_ADD_KEY 0x0D01011D
174 #define OID_802_11_REMOVE_KEY 0x0D01011E
175 #define OID_802_11_ASSOCIATION_INFORMATION 0x0D01011F
176 #define OID_802_11_TEST 0x0D010120
177 #define OID_802_11_CAPABILITY 0x0D010122
178 #define OID_802_11_PMKID 0x0D010123
181 /* PnP and power management OIDs */
182 #define OID_PNP_CAPABILITIES 0xFD010100
183 #define OID_PNP_SET_POWER 0xFD010101
184 #define OID_PNP_QUERY_POWER 0xFD010102
185 #define OID_PNP_ADD_WAKE_UP_PATTERN 0xFD010103
186 #define OID_PNP_REMOVE_WAKE_UP_PATTERN 0xFD010104
187 #define OID_PNP_WAKE_UP_PATTERN_LIST 0xFD010105
188 #define OID_PNP_ENABLE_WAKE_UP 0xFD010106
191 /* Currently associated SSID (OID_802_11_SSID) (from ndiswrapper) */
192 #define NDIS_ESSID_MAX_SIZE 32
195 UCHAR essid[NDIS_ESSID_MAX_SIZE];
198 /* Current infrastructure mode (OID_802_11_INFRASTRUCTURE_MODE) (from ndiswrapper) */
199 enum network_infrastructure {
201 Ndis802_11Infrastructure,
202 Ndis802_11AutoUnknown,
203 Ndis802_11InfrastructureMax
206 /* Current authentication mode (OID_802_11_AUTHENTICATION_MODE) (from ndiswrapper) */
207 enum authentication_mode {
208 Ndis802_11AuthModeOpen,
209 Ndis802_11AuthModeShared,
210 Ndis802_11AuthModeAutoSwitch,
211 Ndis802_11AuthModeWPA,
212 Ndis802_11AuthModeWPAPSK,
213 Ndis802_11AuthModeWPANone,
214 Ndis802_11AuthModeWPA2,
215 Ndis802_11AuthModeWPA2PSK,
216 Ndis802_11AuthModeMax
219 /* Current network type (OID_802_11_NETWORK_TYPES_SUPPORTED / OID_802_11_NETWORK_TYPE_IN_USE) (from ndiswrapper) */
225 /* MSDN site uses Ndis802_11Automode, which is not mentioned
226 * in DDK, so add one and assign it to
227 * Ndis802_11NetworkTypeMax */
229 Ndis802_11NetworkTypeMax = Ndis802_11Automode
232 /* Current encryption status (OID_802_11_ENCRYPTION_STATUS) (from ndiswrapper) */
233 enum encryption_status {
234 Ndis802_11WEPEnabled,
235 Ndis802_11Encryption1Enabled = Ndis802_11WEPEnabled,
236 Ndis802_11WEPDisabled,
237 Ndis802_11EncryptionDisabled = Ndis802_11WEPDisabled,
238 Ndis802_11WEPKeyAbsent,
239 Ndis802_11Encryption1KeyAbsent = Ndis802_11WEPKeyAbsent,
240 Ndis802_11WEPNotSupported,
241 Ndis802_11EncryptionNotSupported = Ndis802_11WEPNotSupported,
242 Ndis802_11Encryption2Enabled,
243 Ndis802_11Encryption2KeyAbsent,
244 Ndis802_11Encryption3Enabled,
245 Ndis802_11Encryption3KeyAbsent
249 /* some definitions needed for the following structs (from ndiswrapper) */
250 #define NDIS_MAX_RATES_EX 16
251 typedef UCHAR mac_address[/* ETH_ALEN */ 6];
252 typedef UCHAR ndis_rates[NDIS_MAX_RATES_EX];
254 /* configuration, e.g. frequency (OID_802_11_CONFIGURATION / OID_802_11_BSSID_LIST) (from ndiswrapper) */
255 struct /*packed*/ ndis_configuration {
260 struct ndis_configuration_fh {
268 /* bssid list item (OID_802_11_BSSID_LIST) (from ndiswrapper) */
269 struct ndis_ssid_item {
273 struct ndis_essid ssid;
277 struct ndis_configuration config;
285 /* bssid list (OID_802_11_BSSID_LIST) (from ndiswrapper) */
286 struct ndis_bssid_list {
288 struct ndis_ssid_item items[1];
292 /******************************************************************************************************************************/
293 /* OID_TCP_TASK_OFFLOAD specific definitions that would usually come from the windows DDK (device driver kit) */
294 /* and are not part of the ntddndis.h file delivered with WinPcap */
296 /* optional OID (from http://www.ndis.com/papers/ieee802_11_log.htm) */
297 #define OID_TCP_TASK_OFFLOAD 0xFC010201
299 /* task id's (from ReactOS) */
300 typedef enum _NDIS_TASK {
301 TcpIpChecksumNdisTask,
303 TcpLargeSendNdisTask,
305 } NDIS_TASK, *PNDIS_TASK;
307 /* TaskBuffer content on TcpIpChecksumNdisTask (from ReactOS) */
308 typedef struct _NDIS_TASK_TCP_IP_CHECKSUM
312 ULONG IpOptionsSupported:1;
313 ULONG TcpOptionsSupported:1;
321 ULONG IpOptionsSupported:1;
322 ULONG TcpOptionsSupported:1;
330 ULONG IpOptionsSupported:1;
331 ULONG TcpOptionsSupported:1;
338 ULONG IpOptionsSupported:1;
339 ULONG TcpOptionsSupported:1;
343 } NDIS_TASK_TCP_IP_CHECKSUM, *PNDIS_TASK_TCP_IP_CHECKSUM;
345 /* TaskBuffer content on TcpLargeSendNdisTask (from ReactOS) */
346 typedef struct _NDIS_TASK_TCP_LARGE_SEND
349 ULONG MaxOffLoadSize;
350 ULONG MinSegmentCount;
353 } NDIS_TASK_TCP_LARGE_SEND, *PNDIS_TASK_TCP_LARGE_SEND;
355 /* Encapsulations (from ReactOs) */
356 typedef enum _NDIS_ENCAPSULATION {
357 UNSPECIFIED_Encapsulation,
359 IEEE_802_3_Encapsulation,
360 IEEE_802_5_Encapsulation,
361 LLC_SNAP_ROUTED_Encapsulation,
362 LLC_SNAP_BRIDGED_Encapsulation
363 } NDIS_ENCAPSULATION;
365 /* Encapsulation format (from ReactOs) */
366 typedef struct _NDIS_ENCAPSULATION_FORMAT {
367 NDIS_ENCAPSULATION Encapsulation;
369 ULONG FixedHeaderSize : 1;
372 ULONG EncapsulationHeaderSize;
373 } NDIS_ENCAPSULATION_FORMAT, *PNDIS_ENCAPSULATION_FORMAT;
375 /* request struct (from http://www.microsoft.com/whdc/archive/netdrv_up.mspx) */
376 typedef struct _NDIS_TASK_OFFLOAD_HEADER
381 UCHAR OffsetFirstTask;
382 NDIS_ENCAPSULATION_FORMAT EncapsulationFormat;
383 } NDIS_TASK_OFFLOAD_HEADER, *PNDIS_TASK_OFFLOAD_HEADER;
385 /* response struct (from ReactOS) */
386 #define NDIS_TASK_OFFLOAD_VERSION 1
387 typedef struct _NDIS_TASK_OFFLOAD
392 ULONG OffsetNextTask;
393 ULONG TaskBufferLength;
395 } NDIS_TASK_OFFLOAD, *PNDIS_TASK_OFFLOAD;
398 /******************************************************************************************************************************/
399 /* value_string's for info functions */
402 /* NDIS driver medium (OID_GEN_MEDIA_SUPPORTED / OID_GEN_MEDIA_IN_USE) */
403 static const value_string win32_802_3_medium_vals[] = {
404 { NdisMedium802_3, "802.3 (Ethernet)" }, /* might as well be WLAN, ... (see NDIS_PHYSICAL_MEDIUM) */
405 { NdisMedium802_5, "802.5 (Token Ring)" },
406 { NdisMediumFddi, "FDDI" },
407 { NdisMediumWan, "WAN" },
408 { NdisMediumLocalTalk, "Local Talk" },
409 { NdisMediumDix, "Dix" },
410 { NdisMediumArcnetRaw, "Arcnet Raw" },
411 { NdisMediumArcnet878_2,"Arcnet 878_2" },
412 { NdisMediumAtm, "ATM" },
413 { NdisMediumWirelessWan,"Wireless WAN" },
414 { NdisMediumIrda, "Irda" },
418 /* NDIS physical driver medium (OID_GEN_PHYSICAL_MEDIUM) */
419 static const value_string win32_802_3_physical_medium_vals[] = {
420 { NdisPhysicalMediumUnspecified, "Unspecified" },
421 { NdisPhysicalMediumWirelessLan, "Wireless LAN" },
422 { NdisPhysicalMediumCableModem, "Cable Modem" },
423 { NdisPhysicalMediumPhoneLine, "Phone Line" },
424 { NdisPhysicalMediumPowerLine, "Power Line" },
425 { NdisPhysicalMediumDSL, "DSL" },
426 { NdisPhysicalMediumFibreChannel, "Fibre Channel" },
427 { NdisPhysicalMedium1394, "IEEE 1394" },
428 { NdisPhysicalMediumWirelessWan, "Wireless WAN" },
432 static const value_string win32_802_11_infra_mode_vals[] = {
433 { Ndis802_11IBSS, "Ad Hoc" },
434 { Ndis802_11Infrastructure, "Access Point" },
435 { Ndis802_11AutoUnknown, "Auto or unknown" },
439 static const value_string win32_802_11_auth_mode_vals[] = {
440 { Ndis802_11AuthModeOpen, "Open System" },
441 { Ndis802_11AuthModeShared, "Shared Key" },
442 { Ndis802_11AuthModeAutoSwitch, "Auto Switch" },
443 { Ndis802_11AuthModeWPA, "WPA" },
444 { Ndis802_11AuthModeWPAPSK, "WPA-PSK (pre shared key)" },
445 { Ndis802_11AuthModeWPANone, "WPA (ad hoc)" },
446 { Ndis802_11AuthModeWPA2, "WPA2" },
447 { Ndis802_11AuthModeWPA2PSK, "WPA2-PSK (pre shared key)" },
451 static const value_string win32_802_11_network_type_vals[] = {
452 { Ndis802_11FH, "FH (frequency-hopping spread-spectrum)" },
453 { Ndis802_11DS, "DS (direct-sequence spread-spectrum)" },
454 { Ndis802_11OFDM5, "5-GHz OFDM" },
455 { Ndis802_11OFDM24, "2.4-GHz OFDM" },
456 { Ndis802_11Automode, "Auto" },
460 /* XXX - add some explanations */
461 static const value_string win32_802_11_encryption_status_vals[] = {
462 { Ndis802_11Encryption1Enabled, "Encryption 1 Enabled (WEP enabled, TKIP & AES disabled, transmit key available)" },
463 { Ndis802_11EncryptionDisabled, "Encryption Disabled (WEP & TKIP & AES disabled, transmit key available)" },
464 { Ndis802_11Encryption1KeyAbsent, "Encryption 1 Key Absent (WEP enabled, TKIP & AES disabled, transmit key unavailable)" },
465 { Ndis802_11EncryptionNotSupported, "Encryption Not Supported (WEP & TKIP & AES not supported)" },
466 { Ndis802_11Encryption2Enabled, "Encryption 2 Enabled (WEP & TKIP enabled, AES disabled, transmit key available)" },
467 { Ndis802_11Encryption2KeyAbsent, "Encryption 2 Key Absent (WEP & TKIP enabled, AES disabled, transmit key unavailable)" },
468 { Ndis802_11Encryption3Enabled, "Encryption 3 Enabled (WEP & TKIP & AES enabled, transmit key available)" },
469 { Ndis802_11Encryption3KeyAbsent, "Encryption 3 Key Absent (WEP & TKIP & AES enabled, transmit key unavailable)" },
473 /* frequency to channel mapping (OID_802_11_CONFIGURATION) */
474 static const value_string win32_802_11_channel_vals[] = {
475 { 2412000, "1 (2412000 kHz)" },
476 { 2417000, "2 (2417000 kHz)" },
477 { 2422000, "3 (2422000 kHz)" },
478 { 2427000, "4 (2427000 kHz)" },
479 { 2432000, "5 (2432000 kHz)" },
480 { 2437000, "6 (2437000 kHz)" },
481 { 2442000, "7 (2442000 kHz)" },
482 { 2447000, "8 (2447000 kHz)" },
483 { 2452000, "9 (2452000 kHz)" },
484 { 2457000, "10 (2457000 kHz)" },
485 { 2462000, "11 (2462000 kHz)" },
486 { 2467000, "12 (2467000 kHz)" },
487 { 2472000, "13 (2472000 kHz)" },
488 { 2484000, "14 (2484000 kHz)" },
492 static const value_string oid_vals[] = {
493 { OID_GEN_SUPPORTED_LIST, "OID_GEN_SUPPORTED_LIST" },
494 { OID_GEN_HARDWARE_STATUS, "OID_GEN_HARDWARE_STATUS (only internally interesting)" },
495 { OID_GEN_MEDIA_SUPPORTED, "OID_GEN_MEDIA_SUPPORTED" },
496 { OID_GEN_MEDIA_IN_USE, "OID_GEN_MEDIA_IN_USE" },
497 { OID_GEN_MAXIMUM_LOOKAHEAD, "OID_GEN_MAXIMUM_LOOKAHEAD (unused)" },
498 { OID_GEN_MAXIMUM_FRAME_SIZE, "OID_GEN_MAXIMUM_FRAME_SIZE (unused)" },
499 { OID_GEN_LINK_SPEED, "OID_GEN_LINK_SPEED" },
500 { OID_GEN_TRANSMIT_BUFFER_SPACE, "OID_GEN_TRANSMIT_BUFFER_SPACE" },
501 { OID_GEN_RECEIVE_BUFFER_SPACE, "OID_GEN_RECEIVE_BUFFER_SPACE" },
502 { OID_GEN_TRANSMIT_BLOCK_SIZE, "OID_GEN_TRANSMIT_BLOCK_SIZE" },
503 { OID_GEN_RECEIVE_BLOCK_SIZE, "OID_GEN_RECEIVE_BLOCK_SIZE" },
504 { OID_GEN_VENDOR_ID, "OID_GEN_VENDOR_ID" },
505 { OID_GEN_VENDOR_DESCRIPTION, "OID_GEN_VENDOR_DESCRIPTION" },
506 { OID_GEN_CURRENT_PACKET_FILTER, "OID_GEN_CURRENT_PACKET_FILTER (info seems to be constant)" },
507 { OID_GEN_CURRENT_LOOKAHEAD, "OID_GEN_CURRENT_LOOKAHEAD (only internally interesting)" },
508 { OID_GEN_DRIVER_VERSION, "OID_GEN_DRIVER_VERSION" },
509 { OID_GEN_MAXIMUM_TOTAL_SIZE, "OID_GEN_MAXIMUM_TOTAL_SIZE" },
510 { OID_GEN_PROTOCOL_OPTIONS, "OID_GEN_PROTOCOL_OPTIONS (info not interesting)" },
511 { OID_GEN_MAC_OPTIONS, "OID_GEN_MAC_OPTIONS" },
512 { OID_GEN_MEDIA_CONNECT_STATUS, "OID_GEN_MEDIA_CONNECT_STATUS" },
513 { OID_GEN_MAXIMUM_SEND_PACKETS, "OID_GEN_MAXIMUM_SEND_PACKETS (only internally interesting)" },
514 { OID_GEN_VENDOR_DRIVER_VERSION, "OID_GEN_VENDOR_DRIVER_VERSION" },
515 { OID_GEN_XMIT_OK, "OID_GEN_XMIT_OK" },
516 { OID_GEN_RCV_OK, "OID_GEN_RCV_OK" },
517 { OID_GEN_XMIT_ERROR, "OID_GEN_XMIT_ERROR" },
518 { OID_GEN_RCV_ERROR, "OID_GEN_RCV_ERROR" },
519 { OID_GEN_RCV_NO_BUFFER, "OID_GEN_RCV_NO_BUFFER" },
520 { OID_GEN_DIRECTED_BYTES_XMIT, "OID_GEN_DIRECTED_BYTES_XMIT" },
521 { OID_GEN_DIRECTED_FRAMES_XMIT, "OID_GEN_DIRECTED_FRAMES_XMIT" },
522 { OID_GEN_MULTICAST_BYTES_XMIT, "OID_GEN_MULTICAST_BYTES_XMIT" },
523 { OID_GEN_MULTICAST_FRAMES_XMIT, "OID_GEN_MULTICAST_FRAMES_XMIT" },
524 { OID_GEN_BROADCAST_BYTES_XMIT, "OID_GEN_BROADCAST_BYTES_XMIT" },
525 { OID_GEN_BROADCAST_FRAMES_XMIT, "OID_GEN_BROADCAST_FRAMES_XMIT" },
526 { OID_GEN_DIRECTED_BYTES_RCV, "OID_GEN_DIRECTED_BYTES_RCV" },
527 { OID_GEN_DIRECTED_FRAMES_RCV, "OID_GEN_DIRECTED_FRAMES_RCV" },
528 { OID_GEN_MULTICAST_BYTES_RCV, "OID_GEN_MULTICAST_BYTES_RCV" },
529 { OID_GEN_MULTICAST_FRAMES_RCV, "OID_GEN_MULTICAST_FRAMES_RCV" },
530 { OID_GEN_BROADCAST_BYTES_RCV, "OID_GEN_BROADCAST_BYTES_RCV" },
531 { OID_GEN_BROADCAST_FRAMES_RCV, "OID_GEN_BROADCAST_FRAMES_RCV" },
532 { OID_GEN_RCV_CRC_ERROR, "OID_GEN_RCV_CRC_ERROR" },
533 { OID_GEN_TRANSMIT_QUEUE_LENGTH, "OID_GEN_TRANSMIT_QUEUE_LENGTH" },
534 { OID_GEN_GET_TIME_CAPS, "OID_GEN_GET_TIME_CAPS (unsupp, unused)" },
535 { OID_GEN_GET_NETCARD_TIME, "OID_GEN_GET_NETCARD_TIME (unsupp, unused)" },
537 { OID_GEN_PHYSICAL_MEDIUM, "OID_GEN_PHYSICAL_MEDIUM" },
538 //{ OID_GEN_MACHINE_NAME, "OID_GEN_MACHINE_NAME (unsupp, unused)" },
539 { OID_GEN_VLAN_ID, "OID_GEN_VLAN_ID" },
540 { OID_GEN_MEDIA_CAPABILITIES, "OID_GEN_MEDIA_CAPABILITIES (unsupp, unused)" },
542 { OID_GEN_NETWORK_LAYER_ADDRESSES, "OID_GEN_NETWORK_LAYER_ADDRESSES (write only)" },
543 { OID_GEN_TRANSPORT_HEADER_OFFSET, "OID_GEN_TRANSPORT_HEADER_OFFSET (write only)" },
545 { OID_802_3_PERMANENT_ADDRESS, "OID_802_3_PERMANENT_ADDRESS" },
546 { OID_802_3_CURRENT_ADDRESS, "OID_802_3_CURRENT_ADDRESS" },
547 { OID_802_3_MAXIMUM_LIST_SIZE, "OID_802_3_MAXIMUM_LIST_SIZE (unused)" },
548 { OID_802_3_MULTICAST_LIST, "OID_802_3_MULTICAST_LIST (unused)" }, // XXX
549 { OID_802_3_MAC_OPTIONS, "OID_802_3_MAC_OPTIONS (unsupp, unused)" },
551 { OID_802_3_RCV_ERROR_ALIGNMENT, "OID_802_3_RCV_ERROR_ALIGNMENT" },
552 { OID_802_3_XMIT_ONE_COLLISION, "OID_802_3_XMIT_ONE_COLLISION" },
553 { OID_802_3_XMIT_MORE_COLLISIONS, "OID_802_3_XMIT_MORE_COLLISIONS" },
554 { OID_802_3_XMIT_DEFERRED, "OID_802_3_XMIT_DEFERRED" },
555 { OID_802_3_XMIT_MAX_COLLISIONS, "OID_802_3_XMIT_MAX_COLLISIONS" },
556 { OID_802_3_RCV_OVERRUN, "OID_802_3_RCV_OVERRUN" },
557 { OID_802_3_XMIT_UNDERRUN, "OID_802_3_XMIT_UNDERRUN" },
558 { OID_802_3_XMIT_HEARTBEAT_FAILURE, "OID_802_3_XMIT_HEARTBEAT_FAILURE (unsupp, used)" },
559 { OID_802_3_XMIT_TIMES_CRS_LOST, "OID_802_3_XMIT_TIMES_CRS_LOST (unsupp, used)" },
560 { OID_802_3_XMIT_LATE_COLLISIONS, "OID_802_3_XMIT_LATE_COLLISIONS" },
562 { OID_802_11_BSSID, "OID_802_11_BSSID" },
563 { OID_802_11_SSID, "OID_802_11_SSID" },
564 { OID_802_11_NETWORK_TYPES_SUPPORTED, "OID_802_11_NETWORK_TYPES_SUPPORTED (info not interesting)" },
565 { OID_802_11_NETWORK_TYPE_IN_USE, "OID_802_11_NETWORK_TYPE_IN_USE" },
566 { OID_802_11_TX_POWER_LEVEL, "OID_802_11_TX_POWER_LEVEL (unsupp, used)" },
567 { OID_802_11_RSSI, "OID_802_11_RSSI" },
568 { OID_802_11_RSSI_TRIGGER, "OID_802_11_RSSI_TRIGGER (unsupp, unused)" },
569 { OID_802_11_INFRASTRUCTURE_MODE, "OID_802_11_INFRASTRUCTURE_MODE" },
570 { OID_802_11_FRAGMENTATION_THRESHOLD, "OID_802_11_FRAGMENTATION_THRESHOLD (unused)" },
571 { OID_802_11_RTS_THRESHOLD, "OID_802_11_RTS_THRESHOLD (unused)" },
572 { OID_802_11_NUMBER_OF_ANTENNAS, "OID_802_11_NUMBER_OF_ANTENNAS (unsupp, unused)" },
573 { OID_802_11_RX_ANTENNA_SELECTED, "OID_802_11_RX_ANTENNA_SELECTED (unsupp, unused)" },
574 { OID_802_11_TX_ANTENNA_SELECTED, "OID_802_11_TX_ANTENNA_SELECTED (unsupp, unused)" },
575 { OID_802_11_SUPPORTED_RATES, "OID_802_11_SUPPORTED_RATES" },
576 { OID_802_11_DESIRED_RATES, "OID_802_11_DESIRED_RATES (unsupp, used)" },
577 { OID_802_11_CONFIGURATION, "OID_802_11_CONFIGURATION" },
578 { OID_802_11_STATISTICS, "OID_802_11_STATISTICS (unsupp, unused)" },
579 { OID_802_11_ADD_WEP, "OID_802_11_ADD_WEP (write only)" },
580 { OID_802_11_REMOVE_WEP, "OID_802_11_REMOVE_WEP (write only)" },
581 { OID_802_11_DISASSOCIATE, "OID_802_11_DISASSOCIATE (write only)" },
582 { OID_802_11_POWER_MODE, "OID_802_11_POWER_MODE (info not interesting)" },
583 { OID_802_11_BSSID_LIST, "OID_802_11_BSSID_LIST" },
584 { OID_802_11_AUTHENTICATION_MODE, "OID_802_11_AUTHENTICATION_MODE" },
585 { OID_802_11_PRIVACY_FILTER, "OID_802_11_PRIVACY_FILTER (info not interesting)" },
586 { OID_802_11_BSSID_LIST_SCAN, "OID_802_11_BSSID_LIST_SCAN" },
587 { OID_802_11_WEP_STATUS, "OID_802_11_WEP_STATUS (info not interesting?)" },
588 { OID_802_11_ENCRYPTION_STATUS, "OID_802_11_ENCRYPTION_STATUS (unsupp, used)" },
589 { OID_802_11_RELOAD_DEFAULTS, "OID_802_11_RELOAD_DEFAULTS (write only)" },
590 { OID_802_11_ADD_KEY, "OID_802_11_ADD_KEY (write only)" },
591 { OID_802_11_REMOVE_KEY, "OID_802_11_REMOVE_KEY (write only)" },
592 { OID_802_11_ASSOCIATION_INFORMATION, "OID_802_11_ASSOCIATION_INFORMATION (unused)" }, // XXX
593 { OID_802_11_TEST, "OID_802_11_TEST (write only)" },
594 { OID_802_11_CAPABILITY, "OID_802_11_CAPABILITY (unsupp, unused)" },
595 { OID_802_11_PMKID, "OID_802_11_PMKID (unsupp, unused)" },
597 /* Token-Ring list is utterly incomplete (contains only the values for MS Loopback Driver) */
598 { OID_802_5_PERMANENT_ADDRESS, "OID_802_5_PERMANENT_ADDRESS (unused)" },
599 { OID_802_5_CURRENT_ADDRESS, "OID_802_5_CURRENT_ADDRESS (unused)" },
600 { OID_802_5_CURRENT_FUNCTIONAL, "OID_802_5_CURRENT_FUNCTIONAL (unused)" },
601 { OID_802_5_CURRENT_GROUP, "OID_802_5_CURRENT_GROUP (unused)" },
602 { OID_802_5_LAST_OPEN_STATUS, "OID_802_5_LAST_OPEN_STATUS (unused)" },
603 { OID_802_5_CURRENT_RING_STATUS, "OID_802_5_CURRENT_RING_STATUS (unused)" },
604 { OID_802_5_CURRENT_RING_STATE, "OID_802_5_CURRENT_RING_STATE (unused)" },
605 { OID_802_5_LINE_ERRORS, "OID_802_5_LINE_ERRORS (unused)" },
606 { OID_802_5_LOST_FRAMES, "OID_802_5_LOST_FRAMES (unused)" },
608 /* FDDI list is utterly incomplete (contains only the values for MS Loopback Driver) */
609 { OID_FDDI_LONG_PERMANENT_ADDR, "OID_FDDI_LONG_PERMANENT_ADDR (unused)" },
610 { OID_FDDI_LONG_CURRENT_ADDR, "OID_FDDI_LONG_CURRENT_ADDR (unused)" },
611 { OID_FDDI_LONG_MULTICAST_LIST, "OID_FDDI_LONG_MULTICAST_LIST (unused)" },
612 { OID_FDDI_LONG_MAX_LIST_SIZE, "OID_FDDI_LONG_MAX_LIST_SIZE (unused)" },
613 { OID_FDDI_SHORT_PERMANENT_ADDR, "OID_FDDI_SHORT_PERMANENT_ADDR (unused)" },
614 { OID_FDDI_SHORT_CURRENT_ADDR, "OID_FDDI_SHORT_CURRENT_ADDR (unused)" },
615 { OID_FDDI_SHORT_MULTICAST_LIST, "OID_FDDI_SHORT_MULTICAST_LIST (unused)" },
616 { OID_FDDI_SHORT_MAX_LIST_SIZE, "OID_FDDI_SHORT_MAX_LIST_SIZE (unused)" },
618 /* LocalTalk list is utterly incomplete (contains only the values for MS Loopback Driver) */
619 { OID_LTALK_CURRENT_NODE_ID, "OID_LTALK_CURRENT_NODE_ID (unused)" },
621 /* Arcnet list is utterly incomplete (contains only the values for MS Loopback Driver) */
622 { OID_ARCNET_PERMANENT_ADDRESS, "OID_ARCNET_PERMANENT_ADDRESS (unused)" },
623 { OID_ARCNET_CURRENT_ADDRESS, "OID_ARCNET_CURRENT_ADDRESS (unused)" },
625 { OID_TCP_TASK_OFFLOAD, "OID_TCP_TASK_OFFLOAD" },
627 /* PnP and power management OIDs */
628 { OID_PNP_CAPABILITIES, "OID_PNP_CAPABILITIES (unused)" },
629 { OID_PNP_SET_POWER, "OID_PNP_SET_POWER (unused)" },
630 { OID_PNP_QUERY_POWER, "OID_PNP_QUERY_POWER (unused)" },
631 { OID_PNP_ADD_WAKE_UP_PATTERN, "OID_PNP_ADD_WAKE_UP_PATTERN (unused)" },
632 { OID_PNP_REMOVE_WAKE_UP_PATTERN, "OID_PNP_REMOVE_WAKE_UP_PATTERN (unused)" },
633 { OID_PNP_WAKE_UP_PATTERN_LIST, "OID_PNP_WAKE_UP_PATTERN_LIST (unused)" },
634 { OID_PNP_ENABLE_WAKE_UP, "OID_PNP_ENABLE_WAKE_UP (unused)" },
636 /* Unknown OID's (seen on an "Intel(R) PRO/Wireless 2200BG" 802.11 interface) */
637 { 0xFF100000, "Unknown 0xFF100000 (unused)" },
638 { 0xFF100002, "Unknown 0xFF100002 (unused)" },
639 { 0xFF100003, "Unknown 0xFF100003 (unused)" },
640 { 0xFF100004, "Unknown 0xFF100004 (unused)" },
641 { 0xFF100005, "Unknown 0xFF100005 (unused)" },
642 { 0xFF100006, "Unknown 0xFF100006 (unused)" },
643 { 0xFF100007, "Unknown 0xFF100007 (unused)" },
644 { 0xFF100009, "Unknown 0xFF100009 (unused)" },
645 { 0xFF10000b, "Unknown 0xFF10000b (unused)" },
646 { 0xFF10000c, "Unknown 0xFF10000c (unused)" },
647 { 0xFF10000e, "Unknown 0xFF10000e (unused)" },
648 { 0xFF10000f, "Unknown 0xFF10000f (unused)" },
649 /* continued by a lot more 0xFF... values */
655 /******************************************************************************************************************************/
656 /* debug functions, query or list supported NDIS OID's */
660 supported_list(LPADAPTER adapter)
662 unsigned char values[10000];
666 g_warning("supported_list_unhandled");
667 length = sizeof(values);
668 if (wpcap_packet_request(adapter, OID_GEN_SUPPORTED_LIST, FALSE /* !set */, values, &length)) {
669 guint32 *value = (guint32 *) values;
672 printf("OID: 0x%08X %s\n", *value, val_to_str(*value, oid_vals, "unknown"));
682 supported_query_oid(LPADAPTER adapter, guint32 oid)
684 unsigned char values[10000];
688 length = sizeof(values);
689 if (wpcap_packet_request(adapter, OID_GEN_SUPPORTED_LIST, FALSE /* !set */, values, &length)) {
690 guint32 *value = (guint32 *) values;
705 /******************************************************************************************************************************/
706 /* info functions, get and display various NDIS driver values */
710 add_row_to_table(GtkWidget *list, guint *row, gchar *title, const gchar *value, gboolean sensitive)
715 if(strlen(value) != 0) {
716 indent = g_strdup_printf(" %s", title);
718 indent = g_strdup(title);
720 label = gtk_label_new(indent);
722 gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
723 gtk_widget_set_sensitive(label, sensitive);
724 gtk_table_attach_defaults(GTK_TABLE(list), label, 0, 1, *row, *row+1);
726 label = gtk_label_new(value);
727 gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
728 gtk_widget_set_sensitive(label, sensitive);
729 gtk_table_attach_defaults(GTK_TABLE(list), label, 1, 2, *row, *row+1);
736 add_string_to_table_sensitive(GtkWidget *list, guint *row, gchar *title, gchar *value, gboolean sensitive)
738 add_row_to_table(list, row, title, value, sensitive);
743 add_string_to_table(GtkWidget *list, guint *row, gchar *title, const gchar *value)
745 add_row_to_table(list, row, title, value, TRUE);
750 ssid_details(GtkWidget *table, guint *row, struct ndis_essid *ssid_in) {
751 struct ndis_essid ssid[2]; /* prevent an off by one error */
755 g_assert(ssid->length <= NDIS_ESSID_MAX_SIZE);
757 if(ssid->length != 0) {
758 ssid->essid[ssid->length] = '\0';
759 add_string_to_table(table, row, "SSID (Service Set IDentifier)", ssid->essid);
761 add_string_to_table(table, row, "SSID (Service Set IDentifier)", "(currently not associated with an SSID)");
767 rates_details(unsigned char *values, int length) {
774 Rates = g_string_new("");
781 g_string_append(Rates, "/");
784 float_value = (float) ((values[i] & 0x7F) / 2);
786 /* reduce the screen estate by showing fractions only where required */
787 int_value = (int)float_value;
788 if(float_value == (float)int_value) {
789 g_string_sprintfa(Rates, "%.0f", float_value);
791 g_string_sprintfa(Rates, "%.1f", float_value);
796 Rates = g_string_append(Rates, " MBits/s");
798 Rates = g_string_append(Rates, "-");
806 capture_if_details_802_11_bssid_list(GtkWidget *main_vb, struct ndis_bssid_list *bssid_list)
808 struct ndis_ssid_item *bssid_item;
809 unsigned char mac[6];
810 const gchar *manuf_name;
814 if(bssid_list->num_items != 0) {
815 char *titles[] = { "SSID", "MAC", "Vendor", "RSSI" , "Network Type" , "Infra. Mode" , "Channel" , "Rates" };
818 gchar ssid_buff[DETAILS_STR_MAX];
819 gchar mac_buff[DETAILS_STR_MAX];
820 gchar vendor_buff[DETAILS_STR_MAX];
821 gchar rssi_buff[DETAILS_STR_MAX];
822 gchar nettype_buff[DETAILS_STR_MAX];
823 gchar infra_buff[DETAILS_STR_MAX];
824 gchar freq_buff[DETAILS_STR_MAX];
826 list = simple_list_new(8, titles);
827 gtk_container_add(GTK_CONTAINER(main_vb), list);
829 bssid_item = &bssid_list->items[0];
831 while(bssid_list->num_items--) {
834 if(bssid_item->ssid.length > DETAILS_STR_MAX-1) {
835 bssid_item->ssid.length = DETAILS_STR_MAX-1;
837 memcpy(ssid_buff, bssid_item->ssid.essid, bssid_item->ssid.length);
838 ssid_buff[bssid_item->ssid.length] = '\0';
841 memcpy(mac, &bssid_item->mac, sizeof(mac));
842 g_snprintf(mac_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X",
843 mac[0], mac[1], mac[2],
844 mac[3], mac[4], mac[5]);
847 manuf_name = get_manuf_name_if_known(mac);
848 if(manuf_name != NULL) {
849 strcpy(vendor_buff, manuf_name);
851 strcpy(vendor_buff, "");
854 /* Supported Rates */
855 Rates = rates_details(bssid_item->rates, NDIS_MAX_RATES_EX);
858 g_snprintf(rssi_buff, DETAILS_STR_MAX, "%d dBm", bssid_item->rssi);
861 g_snprintf(nettype_buff, sizeof(nettype_buff), "%s",
862 val_to_str(bssid_item->net_type, win32_802_11_network_type_vals, "(0x%x)"));
864 /* Infrastructure Mode */
865 g_snprintf(infra_buff, sizeof(infra_buff), "%s",
866 val_to_str(bssid_item->mode, win32_802_11_infra_mode_vals, "(0x%x)"));
869 g_snprintf(freq_buff, sizeof(freq_buff), "%s",
870 val_to_str(bssid_item->config.ds_config, win32_802_11_channel_vals, "(%u kHz)"));
872 /* IE Length (XXX - add decoding) */
873 /* g_warning ("802.11 IE Length : %u", bssid_item->ie_length); */
875 simple_list_append(list,
886 g_string_free(Rates, TRUE /* free_segment */);
888 /* the bssid_list isn't an array, but a sequence of variable length items */
889 bssid_item = (struct ndis_ssid_item *) (((char *) bssid_item) + bssid_item->length);
895 capture_if_details_802_11(GtkWidget *table, GtkWidget *main_vb, guint *row, LPADAPTER adapter) {
898 unsigned int uint_value;
899 unsigned char values[100];
900 struct ndis_essid ssid;
902 struct ndis_bssid_list *bssid_list;
903 struct ndis_configuration *configuration;
904 gchar string_buff[DETAILS_STR_MAX];
909 add_string_to_table(table, row, "Characteristics", "");
912 length = sizeof(values);
913 memset(values, 0, 6);
914 if (wpcap_packet_request(adapter, OID_802_11_BSSID, FALSE /* !set */, values, &length)) {
915 g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X",
916 values[0], values[1], values[2],
917 values[3], values[4], values[5]);
920 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
922 add_string_to_table(table, row, "BSSID (Basic Service Set IDentifier)", string_buff);
925 length = sizeof(struct ndis_essid);
926 memset(&ssid, 0, length);
927 if (wpcap_packet_request(adapter, OID_802_11_SSID, FALSE /* !set */, (char *) &ssid, &length)) {
928 ssid_details(table, row, &ssid);
931 add_string_to_table(table, row, "SSID (Service Set IDentifier)", "-");
934 /* Network type in use */
935 if (wpcap_packet_request_uint(adapter, OID_802_11_NETWORK_TYPE_IN_USE, &uint_value)) {
936 add_string_to_table(table, row, "Network type used",
937 val_to_str(uint_value, win32_802_11_network_type_vals, "(0x%x)"));
940 add_string_to_table(table, row, "Network type used", "-");
943 /* Infrastructure mode */
944 if (wpcap_packet_request_ulong(adapter, OID_802_11_INFRASTRUCTURE_MODE, &uint_value)) {
945 add_string_to_table(table, row, "Infrastructure mode",
946 val_to_str(uint_value, win32_802_11_infra_mode_vals, "(0x%x)"));
949 add_string_to_table(table, row, "Infrastructure mode", "-");
952 /* Authentication mode */
953 if (wpcap_packet_request_ulong(adapter, OID_802_11_AUTHENTICATION_MODE, &uint_value)) {
954 add_string_to_table(table, row, "Authentication mode",
955 val_to_str(uint_value, win32_802_11_auth_mode_vals, "(0x%x)"));
958 add_string_to_table(table, row, "Authentication mode", "-");
961 /* Encryption (WEP) status */
962 if (wpcap_packet_request_ulong(adapter, OID_802_11_ENCRYPTION_STATUS, &uint_value)) {
963 add_string_to_table(table, row, "Encryption status",
964 val_to_str(uint_value, win32_802_11_encryption_status_vals, "(0x%x)"));
967 add_string_to_table(table, row, "Encryption status", "-");
971 if (wpcap_packet_request_ulong(adapter, OID_802_11_TX_POWER_LEVEL, &ulong_value)) {
972 g_snprintf(string_buff, DETAILS_STR_MAX, "%ld mW", ulong_value);
973 add_string_to_table(table, row, "TX power", string_buff);
976 add_string_to_table(table, row, "TX power", "-");
980 if (wpcap_packet_request_ulong(adapter, OID_802_11_RSSI, &long_value)) {
981 g_snprintf(string_buff, DETAILS_STR_MAX, "%ld dBm (typical -10 through -200)", long_value);
982 add_string_to_table(table, row, "RSSI (Received Signal Strength Indication)", string_buff);
985 add_string_to_table(table, row, "RSSI (Received Signal Strength Indication)", "-");
988 /* Supported Rates */
989 length = sizeof(values);
990 if (!wpcap_packet_request(adapter, OID_802_11_SUPPORTED_RATES, FALSE /* !set */, values, &length)) {
996 Rates = rates_details(values, length);
997 add_string_to_table(table, row, "Supported Rates", Rates->str);
998 g_string_free(Rates, TRUE /* free_segment */);
1001 length = sizeof(values);
1002 if (!wpcap_packet_request(adapter, OID_802_11_DESIRED_RATES, FALSE /* !set */, values, &length)) {
1008 Rates = rates_details(values, length);
1009 add_string_to_table(table, row, "Desired Rates", Rates->str);
1010 g_string_free(Rates, TRUE /* free_segment */);
1012 /* Configuration (e.g. frequency) */
1013 length = sizeof(values);
1014 if (wpcap_packet_request(adapter, OID_802_11_CONFIGURATION, FALSE /* !set */, (char *) values, &length)) {
1015 configuration = (struct ndis_configuration *) values;
1017 add_string_to_table(table, row, "Channel",
1018 val_to_str(configuration->ds_config, win32_802_11_channel_vals, "(%u kHz)"));
1021 add_string_to_table(table, row, "Channel", "-");
1024 /* BSSID list: first trigger a scan */
1025 length = sizeof(uint_value);
1026 if (wpcap_packet_request(adapter, OID_802_11_BSSID_LIST_SCAN, TRUE /* set */, (char *) &uint_value, &length)) {
1028 g_warning("BSSID list scan done");
1030 g_warning("BSSID list scan failed");
1034 /* BSSID list: get scan results */
1035 /* XXX - we might have to wait up to 7 seconds! */
1036 length = sizeof(ULONG) + sizeof(struct ndis_ssid_item) * 16;
1037 bssid_list = g_malloc(length);
1038 /* some drivers don't set bssid_list->num_items to 0 if
1039 OID_802_11_BSSID_LIST returns no items (prism54 driver, e.g.,) */
1040 memset(bssid_list, 0, length);
1042 if (wpcap_packet_request(adapter, OID_802_11_BSSID_LIST, FALSE /* !set */, (char *) bssid_list, &length)) {
1043 add_string_to_table(table, row, "", "");
1044 add_string_to_table(table, row, "BSSID list", "");
1046 capture_if_details_802_11_bssid_list(main_vb, bssid_list);
1047 entries += bssid_list->num_items;
1049 add_string_to_table(table, row, "802.11 BSSID list", "-");
1059 capture_if_details_802_3(GtkWidget *table, GtkWidget *main_vb, guint *row, LPADAPTER adapter) {
1060 unsigned int uint_value;
1061 unsigned char values[100];
1063 gchar string_buff[DETAILS_STR_MAX];
1064 const gchar *manuf_name;
1068 add_string_to_table(table, row, "Characteristics", "");
1070 length = sizeof(values);
1071 if (wpcap_packet_request(adapter, OID_802_3_PERMANENT_ADDRESS, FALSE /* !set */, values, &length)) {
1072 manuf_name = get_manuf_name_if_known(values);
1073 if(manuf_name != NULL) {
1074 g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X (%s)",
1075 values[0], values[1], values[2],
1076 values[3], values[4], values[5],
1079 g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X",
1080 values[0], values[1], values[2],
1081 values[3], values[4], values[5]);
1085 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1087 add_string_to_table(table, row, "Permanent station address", string_buff);
1089 length = sizeof(values);
1090 if (wpcap_packet_request(adapter, OID_802_3_CURRENT_ADDRESS, FALSE /* !set */, values, &length)) {
1091 manuf_name = get_manuf_name_if_known(values);
1092 if(manuf_name != NULL) {
1093 g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X (%s)",
1094 values[0], values[1], values[2],
1095 values[3], values[4], values[5],
1098 g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X",
1099 values[0], values[1], values[2],
1100 values[3], values[4], values[5]);
1104 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1106 add_string_to_table(table, row, "Current station address", string_buff);
1109 add_string_to_table(table, row, "", "");
1110 add_string_to_table(table, row, "Statistics", "");
1112 if (wpcap_packet_request_uint(adapter, OID_802_3_RCV_ERROR_ALIGNMENT, &uint_value)) {
1113 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1116 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1118 add_string_to_table(table, row, "Packets received with alignment error", string_buff);
1120 if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_ONE_COLLISION, &uint_value)) {
1121 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1124 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1126 add_string_to_table(table, row, "Packets transmitted with one collision", string_buff);
1128 if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_MORE_COLLISIONS, &uint_value)) {
1129 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1132 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1134 add_string_to_table(table, row, "Packets transmitted with more than one collision", string_buff);
1136 if (wpcap_packet_request_uint(adapter, OID_802_3_RCV_OVERRUN, &uint_value)) {
1137 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1140 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1142 add_string_to_table(table, row, "Packets not received due to overrun", string_buff);
1144 if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_DEFERRED, &uint_value)) {
1145 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1148 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1150 add_string_to_table(table, row, "Packets transmitted after deferred", string_buff);
1152 if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_MAX_COLLISIONS, &uint_value)) {
1153 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1156 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1158 add_string_to_table(table, row, "Packets not transmitted due to collisions", string_buff);
1160 if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_UNDERRUN, &uint_value)) {
1161 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1164 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1166 add_string_to_table(table, row, "Packets not transmitted due to underrun", string_buff);
1168 if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_HEARTBEAT_FAILURE, &uint_value)) {
1169 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1172 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1174 add_string_to_table(table, row, "Packets transmitted with heartbeat failure", string_buff);
1176 if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_TIMES_CRS_LOST, &uint_value)) {
1177 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1180 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1182 add_string_to_table(table, row, "Times carrier sense signal lost during transmission", string_buff);
1184 if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_LATE_COLLISIONS, &uint_value)) {
1185 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1188 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1190 add_string_to_table(table, row, "Times late collisions detected", string_buff);
1196 capture_if_details_task_offload(GtkWidget *table, GtkWidget *main_vb, guint *row, LPADAPTER adapter) {
1197 NDIS_TASK_OFFLOAD_HEADER *offload;
1198 unsigned char values[10000];
1200 gchar string_buff[DETAILS_STR_MAX];
1202 int TcpIpChecksumSupported = 0;
1203 int IpSecSupported = 0;
1204 int TcpLargeSendSupported = 0;
1208 offload = (NDIS_TASK_OFFLOAD_HEADER *) values;
1209 offload->Version = NDIS_TASK_OFFLOAD_VERSION;
1210 offload->Size = sizeof(NDIS_TASK_OFFLOAD_HEADER);
1211 offload->Reserved = 0;
1212 offload->OffsetFirstTask = 0;
1213 /* the EncapsulationFormat seems to be ignored on a query (using Ethernet values) */
1214 offload->EncapsulationFormat.Encapsulation = IEEE_802_3_Encapsulation;
1215 offload->EncapsulationFormat.Flags.FixedHeaderSize = 1;
1216 offload->EncapsulationFormat.Flags.Reserved = 0;
1217 offload->EncapsulationFormat.EncapsulationHeaderSize = 14; /* sizeof(struct ether_header) */;
1219 length = sizeof(values);
1220 if (wpcap_packet_request(adapter, OID_TCP_TASK_OFFLOAD, FALSE /* !set */, values, &length)) {
1221 NDIS_TASK_OFFLOAD *of;
1222 /* XXX - hmmm, using a tvb for this? */
1223 unsigned char *valuep = values + offload->OffsetFirstTask;
1224 length -= offload->OffsetFirstTask;
1227 of = (NDIS_TASK_OFFLOAD *) valuep;
1230 case TcpIpChecksumNdisTask:
1232 NDIS_TASK_TCP_IP_CHECKSUM *tic = (NDIS_TASK_TCP_IP_CHECKSUM *) (of->TaskBuffer);
1235 TcpIpChecksumSupported++;
1237 add_string_to_table(table, row, "TCP/IP Checksum", "");
1239 g_snprintf(string_buff, DETAILS_STR_MAX, "");
1240 add_string_to_table(table, row, "V4 transmit checksum", "");
1242 g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, UDP: %s, IP: %s",
1243 tic->V4Transmit.TcpChecksum ? "Yes" : "No",
1244 tic->V4Transmit.UdpChecksum ? "Yes" : "No",
1245 tic->V4Transmit.IpChecksum ? "Yes" : "No");
1246 add_string_to_table(table, row, "Calculation supported", string_buff);
1248 g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, IP: %s",
1249 tic->V4Transmit.TcpOptionsSupported ? "Yes" : "No",
1250 tic->V4Transmit.IpOptionsSupported ? "Yes" : "No");
1251 add_string_to_table(table, row, "Options fields supported", string_buff);
1253 g_snprintf(string_buff, DETAILS_STR_MAX, "");
1254 add_string_to_table(table, row, "V4 receive checksum", "");
1256 g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, UDP: %s, IP: %s",
1257 tic->V4Receive.TcpChecksum ? "Yes" : "No",
1258 tic->V4Receive.UdpChecksum ? "Yes" : "No",
1259 tic->V4Receive.IpChecksum ? "Yes" : "No");
1260 add_string_to_table(table, row, "Validation supported", string_buff);
1262 g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, IP: %s",
1263 tic->V4Receive.TcpOptionsSupported ? "Yes" : "No",
1264 tic->V4Receive.IpOptionsSupported ? "Yes" : "No");
1265 add_string_to_table(table, row, "Options fields supported", string_buff);
1267 g_snprintf(string_buff, DETAILS_STR_MAX, "");
1268 add_string_to_table(table, row, "V6 transmit checksum", "");
1270 g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, UDP: %s",
1271 tic->V6Transmit.TcpChecksum ? "Yes" : "No",
1272 tic->V6Transmit.UdpChecksum ? "Yes" : "No");
1273 add_string_to_table(table, row, "Calculation supported", string_buff);
1275 g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, IP: %s",
1276 tic->V6Transmit.TcpOptionsSupported ? "Yes" : "No",
1277 tic->V6Transmit.IpOptionsSupported ? "Yes" : "No");
1278 add_string_to_table(table, row, "Options fields supported", string_buff);
1280 g_snprintf(string_buff, DETAILS_STR_MAX, "");
1281 add_string_to_table(table, row, "V6 receive checksum", "");
1283 g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, UDP: %s",
1284 tic->V6Receive.TcpChecksum ? "Yes" : "No",
1285 tic->V6Receive.UdpChecksum ? "Yes" : "No");
1286 add_string_to_table(table, row, "Validation supported", string_buff);
1288 g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, IP: %s",
1289 tic->V6Receive.TcpOptionsSupported ? "Yes" : "No",
1290 tic->V6Receive.IpOptionsSupported ? "Yes" : "No");
1291 add_string_to_table(table, row, "Options fields supported", string_buff);
1298 add_string_to_table(table, row, "IPSEC", "");
1299 g_snprintf(string_buff, DETAILS_STR_MAX, "IPSEC (TaskID 1) not decoded yet");
1300 add_string_to_table(table, row, "Task", string_buff);
1302 case TcpLargeSendNdisTask:
1304 NDIS_TASK_TCP_LARGE_SEND *tls = (NDIS_TASK_TCP_LARGE_SEND *) (of->TaskBuffer);
1307 TcpLargeSendSupported++;
1309 add_string_to_table(table, row, "TCP large send", "");
1310 /* XXX - while MSDN tells about version 0, we see version 1?!? */
1311 if(tls->Version == 1) {
1312 g_snprintf(string_buff, DETAILS_STR_MAX, "%u", tls->MaxOffLoadSize);
1313 add_string_to_table(table, row, "Max Offload Size", string_buff);
1314 g_snprintf(string_buff, DETAILS_STR_MAX, "%u", tls->MinSegmentCount);
1315 add_string_to_table(table, row, "Min Segment Count", string_buff);
1316 g_snprintf(string_buff, DETAILS_STR_MAX, "%s", tls->TcpOptions ? "Yes" : "No");
1317 add_string_to_table(table, row, "TCP option fields", string_buff);
1318 g_snprintf(string_buff, DETAILS_STR_MAX, "%s", tls->IpOptions ? "Yes" : "No");
1319 add_string_to_table(table, row, "IP option fields", string_buff);
1321 g_snprintf(string_buff, DETAILS_STR_MAX, "%u (unknown)", tls->Version);
1322 add_string_to_table(table, row, "Version", string_buff);
1327 g_snprintf(string_buff, DETAILS_STR_MAX, "Unknown task %u", of->Task);
1328 add_string_to_table(table, row, "Task", string_buff);
1332 add_string_to_table(table, row, "", "");
1334 valuep += of->OffsetNextTask;
1335 length -= of->OffsetNextTask;
1336 } while(of->OffsetNextTask != 0);
1339 if(TcpIpChecksumSupported == 0) {
1340 add_string_to_table(table, row, "TCP/IP Checksum", "");
1341 add_string_to_table(table, row, "Offload not supported", "-");
1344 if(IpSecSupported == 0) {
1345 add_string_to_table(table, row, "IpSec", "");
1346 add_string_to_table(table, row, "Offload not supported", "-");
1349 if(TcpLargeSendSupported == 0) {
1350 add_string_to_table(table, row, "TCP Large Send", "");
1351 add_string_to_table(table, row, "Offload not supported", "-");
1358 capture_if_details_general(GtkWidget *table, GtkWidget *main_vb, guint *row, LPADAPTER adapter, gchar *iface) {
1359 gchar string_buff[DETAILS_STR_MAX];
1360 const gchar *manuf_name;
1361 unsigned int uint_value;
1362 unsigned int uint_array[50];
1363 int uint_array_size;
1364 unsigned int physical_medium;
1366 unsigned char values[100];
1368 unsigned short ushort_value;
1373 add_string_to_table(table, row, "Characteristics", "");
1375 /* Vendor description */
1376 length = sizeof(values);
1377 if (wpcap_packet_request(adapter, OID_GEN_VENDOR_DESCRIPTION, FALSE /* !set */, values, &length)) {
1378 g_snprintf(string_buff, DETAILS_STR_MAX, "%s", values);
1381 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1383 add_string_to_table(table, row, "Vendor description", string_buff);
1386 add_string_to_table(table, row, "Interface", iface);
1388 /* link status (connected/disconnected) */
1389 if (wpcap_packet_request_uint(adapter, OID_GEN_MEDIA_CONNECT_STATUS, &uint_value)) {
1391 if(uint_value == 0) {
1392 add_string_to_table(table, row, "Link status", "Connected");
1394 add_string_to_table(table, row, "Link status", "Disconnected");
1397 add_string_to_table(table, row, "Link status", "-");
1401 if (wpcap_packet_request_uint(adapter, OID_GEN_LINK_SPEED, &uint_value)) {
1404 if(uint_value >= 1000 * 1000) {
1405 g_snprintf(string_buff, DETAILS_STR_MAX, "%d MBits/s", uint_value / 1000 / 1000);
1407 if(uint_value >= 1000) {
1408 g_snprintf(string_buff, DETAILS_STR_MAX, "%d KBits/s", uint_value / 1000);
1410 g_snprintf(string_buff, DETAILS_STR_MAX, "%d Bits/s", uint_value);
1414 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1416 add_string_to_table(table, row, "Link speed", string_buff);
1420 uint_array_size = sizeof(uint_array);
1421 if (wpcap_packet_request(adapter, OID_GEN_MEDIA_SUPPORTED, FALSE /* !set */, (char *) uint_array, &uint_array_size)) {
1423 uint_array_size /= sizeof(unsigned int);
1425 while(uint_array_size--) {
1426 add_string_to_table(table, row, "Media supported",
1427 val_to_str(uint_array[i], win32_802_3_medium_vals, "(0x%x)"));
1431 add_string_to_table(table, row, "Media supported", "-");
1434 uint_array_size = sizeof(uint_array);
1435 if (wpcap_packet_request(adapter, OID_GEN_MEDIA_IN_USE, FALSE /* !set */, (char *) uint_array, &uint_array_size)) {
1437 uint_array_size /= sizeof(unsigned int);
1439 while(uint_array_size--) {
1440 add_string_to_table(table, row, "Medium in use",
1441 val_to_str(uint_array[i], win32_802_3_medium_vals, "(0x%x)"));
1445 add_string_to_table(table, row, "Medium in use", "-");
1448 if (wpcap_packet_request_uint(adapter, OID_GEN_PHYSICAL_MEDIUM, &physical_medium)) {
1450 add_string_to_table(table, row, "Physical medium",
1451 val_to_str(physical_medium, win32_802_3_physical_medium_vals, "(0x%x)"));
1453 add_string_to_table(table, row, "Physical medium", "-");
1456 length = sizeof(ushort_value);
1457 if (wpcap_packet_request(adapter, OID_GEN_DRIVER_VERSION, FALSE /* !set */, (char *) &ushort_value, &length)) {
1459 g_snprintf(string_buff, DETAILS_STR_MAX, "%u.%u", ushort_value / 0x100, ushort_value % 0x100);
1461 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1463 add_string_to_table(table, row, "NDIS Driver Version", string_buff);
1465 length = sizeof(uint_value);
1466 if (wpcap_packet_request(adapter, OID_GEN_VENDOR_DRIVER_VERSION, FALSE /* !set */, (char *) &uint_value, &length)) {
1468 /* XXX - what's the correct output format? */
1469 g_snprintf(string_buff, DETAILS_STR_MAX, "%u.%u (Hex: %X.%X)",
1470 (uint_value / 0x10000 ) % 0x10000,
1471 uint_value % 0x10000,
1472 (uint_value / 0x10000 ) % 0x10000,
1473 uint_value % 0x10000);
1475 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1477 add_string_to_table(table, row, "Vendor Driver Version", string_buff);
1479 length = sizeof(values);
1480 if (wpcap_packet_request(adapter, OID_GEN_VENDOR_ID, FALSE /* !set */, values, &length)) {
1482 manuf_name = get_manuf_name_if_known(values);
1483 if(manuf_name != NULL) {
1484 g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X (%s) NIC: %02X",
1485 values[0], values[1], values[2], manuf_name, values[3]);
1487 g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X NIC: %02X",
1488 values[0], values[1], values[2], values[3]);
1491 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1493 add_string_to_table(table, row, "Vendor ID", string_buff);
1495 if (wpcap_packet_request_uint(adapter, OID_GEN_MAC_OPTIONS, &uint_value)) {
1497 g_snprintf(string_buff, DETAILS_STR_MAX,
1498 "802.1P Priority: %s, 802.1Q VLAN: %s",
1499 (uint_value & NDIS_MAC_OPTION_8021P_PRIORITY) ? "Supported" : "Unsupported",
1500 (uint_value & NDIS_MAC_OPTION_8021Q_VLAN) ? "Supported" : "Unsupported" );
1502 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1504 add_string_to_table(table, row, "MAC Options", string_buff);
1506 if (wpcap_packet_request_uint(adapter, OID_GEN_VLAN_ID, &uint_value)) {
1508 g_snprintf(string_buff, DETAILS_STR_MAX, "%u", uint_value);
1510 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1512 add_string_to_table(table, row, "VLAN ID", string_buff);
1515 /* value seems to be constant */
1516 if (wpcap_packet_request_uint(adapter, OID_GEN_CURRENT_PACKET_FILTER, &uint_value)) {
1518 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1520 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1522 add_string_to_table(table, row, "Packet filter", string_buff);
1525 if (wpcap_packet_request_uint(adapter, OID_GEN_TRANSMIT_BUFFER_SPACE, &uint_value)) {
1527 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1529 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1531 add_string_to_table(table, row, "Transmit Buffer Space", string_buff);
1533 if (wpcap_packet_request_uint(adapter, OID_GEN_RECEIVE_BUFFER_SPACE, &uint_value)) {
1535 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1537 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1539 add_string_to_table(table, row, "Receive Buffer Space", string_buff);
1541 if (wpcap_packet_request_uint(adapter, OID_GEN_TRANSMIT_BLOCK_SIZE , &uint_value)) {
1543 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1545 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1547 add_string_to_table(table, row, "Transmit Block Size", string_buff);
1549 if (wpcap_packet_request_uint(adapter, OID_GEN_RECEIVE_BLOCK_SIZE, &uint_value)) {
1551 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1553 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1555 add_string_to_table(table, row, "Receive Block Size", string_buff);
1557 if (wpcap_packet_request_uint(adapter, OID_GEN_MAXIMUM_TOTAL_SIZE, &uint_value)) {
1559 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1561 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1563 add_string_to_table(table, row, "Maximum Packet Size", string_buff);
1570 capture_if_details_stats(GtkWidget *table, GtkWidget *main_vb, guint *row, LPADAPTER adapter) {
1571 gchar string_buff[DETAILS_STR_MAX];
1572 unsigned int uint_value;
1576 add_string_to_table(table, row, "Statistics", "");
1578 if (wpcap_packet_request_uint(adapter, OID_GEN_XMIT_OK, &uint_value)) {
1580 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1582 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1584 add_string_to_table(table, row, "Transmit OK", string_buff);
1586 if (wpcap_packet_request_uint(adapter, OID_GEN_XMIT_ERROR, &uint_value)) {
1588 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1590 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1592 add_string_to_table(table, row, "Transmit Error", string_buff);
1595 if (wpcap_packet_request_uint(adapter, OID_GEN_RCV_OK, &uint_value)) {
1597 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1599 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1601 add_string_to_table(table, row, "Receive OK", string_buff);
1603 if (wpcap_packet_request_uint(adapter, OID_GEN_RCV_ERROR, &uint_value)) {
1605 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1607 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1609 add_string_to_table(table, row, "Receive Error", string_buff);
1611 if (wpcap_packet_request_uint(adapter, OID_GEN_RCV_NO_BUFFER, &uint_value)) {
1613 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1615 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1617 add_string_to_table(table, row, "Receive but no Buffer", string_buff);
1619 if (wpcap_packet_request_uint(adapter, OID_GEN_DIRECTED_BYTES_XMIT, &uint_value)) {
1621 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1623 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1625 add_string_to_table(table, row, "Directed bytes transmitted w/o errors", string_buff);
1627 if (wpcap_packet_request_uint(adapter, OID_GEN_DIRECTED_FRAMES_XMIT, &uint_value)) {
1629 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1631 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1633 add_string_to_table(table, row, "Directed packets transmitted w/o errors", string_buff);
1635 if (wpcap_packet_request_uint(adapter, OID_GEN_MULTICAST_BYTES_XMIT, &uint_value)) {
1637 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1639 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1641 add_string_to_table(table, row, "Multicast bytes transmitted w/o errors", string_buff);
1643 if (wpcap_packet_request_uint(adapter, OID_GEN_MULTICAST_FRAMES_XMIT, &uint_value)) {
1645 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1647 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1649 add_string_to_table(table, row, "Multicast packets transmitted w/o errors", string_buff);
1651 if (wpcap_packet_request_uint(adapter, OID_GEN_BROADCAST_BYTES_XMIT, &uint_value)) {
1653 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1655 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1657 add_string_to_table(table, row, "Broadcast bytes transmitted w/o errors", string_buff);
1659 if (wpcap_packet_request_uint(adapter, OID_GEN_BROADCAST_FRAMES_XMIT, &uint_value)) {
1661 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1663 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1665 add_string_to_table(table, row, "Broadcast packets transmitted w/o errors", string_buff);
1667 if (wpcap_packet_request_uint(adapter, OID_GEN_DIRECTED_BYTES_RCV, &uint_value)) {
1669 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1671 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1673 add_string_to_table(table, row, "Directed bytes received w/o errors", string_buff);
1675 if (wpcap_packet_request_uint(adapter, OID_GEN_DIRECTED_FRAMES_RCV, &uint_value)) {
1677 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1679 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1681 add_string_to_table(table, row, "Directed packets received w/o errors", string_buff);
1683 if (wpcap_packet_request_uint(adapter, OID_GEN_MULTICAST_BYTES_RCV, &uint_value)) {
1685 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1687 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1689 add_string_to_table(table, row, "Multicast bytes received w/o errors", string_buff);
1691 if (wpcap_packet_request_uint(adapter, OID_GEN_MULTICAST_FRAMES_RCV, &uint_value)) {
1693 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1695 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1697 add_string_to_table(table, row, "Multicast packets received w/o errors", string_buff);
1699 if (wpcap_packet_request_uint(adapter, OID_GEN_BROADCAST_BYTES_RCV, &uint_value)) {
1701 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1703 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1705 add_string_to_table(table, row, "Broadcast bytes received w/o errors", string_buff);
1707 if (wpcap_packet_request_uint(adapter, OID_GEN_BROADCAST_FRAMES_RCV, &uint_value)) {
1709 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1711 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1713 add_string_to_table(table, row, "Broadcast packets received w/o errors", string_buff);
1715 if (wpcap_packet_request_uint(adapter, OID_GEN_RCV_CRC_ERROR, &uint_value)) {
1717 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1719 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1721 add_string_to_table(table, row, "Packets received with CRC or FCS errors", string_buff);
1723 if (wpcap_packet_request_uint(adapter, OID_GEN_TRANSMIT_QUEUE_LENGTH, &uint_value)) {
1725 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1727 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1729 add_string_to_table(table, row, "Packets queued for transmission", string_buff);
1736 capture_if_details_page_new(GtkWidget **table)
1740 main_vb = gtk_vbox_new(FALSE, 6);
1741 gtk_container_border_width(GTK_CONTAINER(main_vb), 12);
1744 *table = gtk_table_new(1, 2, FALSE);
1745 gtk_table_set_col_spacings(GTK_TABLE(*table), 6);
1746 gtk_table_set_row_spacings(GTK_TABLE(*table), 3);
1747 gtk_container_add(GTK_CONTAINER(main_vb), *table);
1754 capture_if_details_open_win(char *iface)
1756 GtkWidget *details_open_w,
1757 *main_vb, *bbox, *close_bt, *help_bt;
1758 GtkWidget *page_general, *page_stats, *page_802_3, *page_802_11, *page_task_offload;
1760 GtkWidget *table, *notebook, *label;
1766 /* open the network adapter */
1767 adapter = wpcap_packet_open(iface);
1769 /* open a new window */
1770 details_open_w = window_new(GTK_WINDOW_TOPLEVEL, "Ethereal: Interface Details");
1772 /* Container for the window contents */
1773 main_vb = gtk_vbox_new(FALSE, 12);
1774 gtk_container_border_width(GTK_CONTAINER(main_vb), 12);
1775 gtk_container_add(GTK_CONTAINER(details_open_w), main_vb);
1778 notebook = gtk_notebook_new();
1779 gtk_container_add(GTK_CONTAINER(main_vb), notebook);
1782 page_general = capture_if_details_page_new(&table);
1783 page_lb = gtk_label_new("General");
1784 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page_general, page_lb);
1786 entries = capture_if_details_general(table, page_general, &row, adapter, iface);
1788 gtk_widget_set_sensitive(page_lb, FALSE);
1791 /* Statistics page */
1792 page_stats = capture_if_details_page_new(&table);
1793 page_lb = gtk_label_new("Statistics");
1794 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page_stats, page_lb);
1796 entries = capture_if_details_stats(table, page_stats, &row, adapter);
1798 gtk_widget_set_sensitive(page_lb, FALSE);
1801 /* 802.3 (Ethernet) page */
1802 page_802_3 = capture_if_details_page_new(&table);
1803 page_lb = gtk_label_new("802.3 (Ethernet)");
1804 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page_802_3, page_lb);
1806 entries = capture_if_details_802_3(table, page_802_3, &row, adapter);
1808 gtk_widget_set_sensitive(page_lb, FALSE);
1811 /* 802_11 (WI-FI) page */
1812 page_802_11 = capture_if_details_page_new(&table);
1813 page_lb = gtk_label_new("802.11 (WLAN)");
1814 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page_802_11, page_lb);
1816 entries = capture_if_details_802_11(table, page_802_11, &row, adapter);
1818 gtk_widget_set_sensitive(page_lb, FALSE);
1821 /* Task offload page */
1822 page_task_offload = capture_if_details_page_new(&table);
1823 page_lb = gtk_label_new("Task Offload");
1824 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page_task_offload, page_lb);
1826 entries = capture_if_details_task_offload(table, page_task_offload, &row, adapter);
1828 gtk_widget_set_sensitive(page_lb, FALSE);
1831 wpcap_packet_close(adapter);
1833 label = gtk_label_new("Note: accuracy of all of these values are only relying on the network card driver!");
1834 gtk_container_add(GTK_CONTAINER(main_vb), label);
1837 if(topic_available(HELP_CAPTURE_INTERFACES_DETAILS_DIALOG)) {
1838 bbox = dlg_button_row_new(GTK_STOCK_CLOSE, GTK_STOCK_HELP, NULL);
1840 bbox = dlg_button_row_new(GTK_STOCK_CLOSE, NULL);
1842 gtk_container_add(GTK_CONTAINER(main_vb), bbox);
1844 close_bt = OBJECT_GET_DATA(bbox, GTK_STOCK_CLOSE);
1845 window_set_cancel_button(details_open_w, close_bt, window_cancel_button_cb);
1847 if(topic_available(HELP_CAPTURE_INTERFACES_DETAILS_DIALOG)) {
1848 help_bt = OBJECT_GET_DATA(bbox, GTK_STOCK_HELP);
1849 SIGNAL_CONNECT(help_bt, "clicked", topic_cb, HELP_CAPTURE_INTERFACES_DETAILS_DIALOG);
1852 gtk_widget_grab_focus(close_bt);
1854 SIGNAL_CONNECT(details_open_w, "delete_event", window_delete_event_cb, NULL);
1856 gtk_widget_show_all(details_open_w);
1857 window_present(details_open_w);
1861 static void capture_if_details_open_answered_cb(gpointer dialog _U_, gint btn, gpointer data)
1865 capture_if_details_open_win(data);
1867 case(ESD_BTN_CANCEL):
1870 g_assert_not_reached();
1876 capture_if_details_open(char *iface)
1879 gboolean version_ok = FALSE;
1883 /* check packet.dll version */
1884 version = wpcap_packet_get_version();
1886 if(version == NULL) {
1887 /* couldn't even get the packet.dll version, must be a very old one or just not existing -> give up */
1888 /* (this seems to be the case for 2.3 beta and all previous releases) */
1889 simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK,
1890 PRIMARY_TEXT_START "Couldn't optain WinPcap packet.dll version!" PRIMARY_TEXT_END
1891 "\n\nThe WinPcap packet.dll is not installed or the version you use seems to be very old!"
1892 "\n\nPlease update/install WinPcap.");
1896 /* XXX - add more known DLL versions here */
1897 /* (all versions since the 2.3 release seems to be working (although the 2.3 beta did not) */
1898 if( strcmp(version, "3, 1, 0, 27") == 0 || /* 3.1 release */
1899 strcmp(version, "3, 1, 0, 24") == 0 || /* 3.1 beta 4 */
1900 strcmp(version, "3, 1, 0, 23") == 0 || /* 3.1 beta 3 */
1901 strcmp(version, "3, 1, 0, 22") == 0 || /* 3.1 beta 2 */
1902 strcmp(version, "3, 1, 0, 20") == 0 || /* 3.1 beta */
1903 strcmp(version, "3.0 alpha3" ) == 0 || /* 3.0 release or 3.0 beta (yes, both versions report alpha3!) */
1904 strcmp(version, "2.3" ) == 0 /* 2.3 release */
1910 /* packet.dll version not known to us, warn user but try to continue */
1911 dialog = simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK | ESD_BTN_CANCEL,
1912 PRIMARY_TEXT_START "Unknown WinPcap version might crash or fail!" PRIMARY_TEXT_END
1913 "\n\nThe WinPcap packet.dll version \"%s\" is unknown if it supports required functions!"
1914 "\n\nOnly WinPcap versions 3.0 and 3.1 are known to work with this feature."
1915 "\n\nCrashes or unexpected behaviour might occur, you have been warned!"
1916 "\n\nContinue anyway?",
1918 simple_dialog_set_cb(dialog, capture_if_details_open_answered_cb, iface);
1920 capture_if_details_open_win(iface);
1925 #endif /* HAVE_LIBPCAP && _WIN32 */