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 */
294 /* windows DDK (device driver kit) and are not part of the ntddndis.h file */
295 /* delivered with WinPcap */
297 /* optional OID (from http://www.ndis.com/papers/ieee802_11_log.htm) */
298 #define OID_TCP_TASK_OFFLOAD 0xFC010201
300 /* task id's (from ReactOS) */
301 typedef enum _NDIS_TASK {
302 TcpIpChecksumNdisTask,
304 TcpLargeSendNdisTask,
306 } NDIS_TASK, *PNDIS_TASK;
308 /* TaskBuffer content on TcpIpChecksumNdisTask (from ReactOS) */
309 typedef struct _NDIS_TASK_TCP_IP_CHECKSUM
313 ULONG IpOptionsSupported:1;
314 ULONG TcpOptionsSupported:1;
322 ULONG IpOptionsSupported:1;
323 ULONG TcpOptionsSupported:1;
331 ULONG IpOptionsSupported:1;
332 ULONG TcpOptionsSupported:1;
339 ULONG IpOptionsSupported:1;
340 ULONG TcpOptionsSupported:1;
344 } NDIS_TASK_TCP_IP_CHECKSUM, *PNDIS_TASK_TCP_IP_CHECKSUM;
346 /* TaskBuffer content on TcpLargeSendNdisTask (from ReactOS) */
347 typedef struct _NDIS_TASK_TCP_LARGE_SEND
350 ULONG MaxOffLoadSize;
351 ULONG MinSegmentCount;
354 } NDIS_TASK_TCP_LARGE_SEND, *PNDIS_TASK_TCP_LARGE_SEND;
356 /* Encapsulations (from ReactOs) */
357 typedef enum _NDIS_ENCAPSULATION {
358 UNSPECIFIED_Encapsulation,
360 IEEE_802_3_Encapsulation,
361 IEEE_802_5_Encapsulation,
362 LLC_SNAP_ROUTED_Encapsulation,
363 LLC_SNAP_BRIDGED_Encapsulation
364 } NDIS_ENCAPSULATION;
366 /* Encapsulation format (from ReactOs) */
367 typedef struct _NDIS_ENCAPSULATION_FORMAT {
368 NDIS_ENCAPSULATION Encapsulation;
370 ULONG FixedHeaderSize : 1;
373 ULONG EncapsulationHeaderSize;
374 } NDIS_ENCAPSULATION_FORMAT, *PNDIS_ENCAPSULATION_FORMAT;
376 /* request struct (from http://www.microsoft.com/whdc/archive/netdrv_up.mspx) */
377 typedef struct _NDIS_TASK_OFFLOAD_HEADER
382 UCHAR OffsetFirstTask;
383 NDIS_ENCAPSULATION_FORMAT EncapsulationFormat;
384 } NDIS_TASK_OFFLOAD_HEADER, *PNDIS_TASK_OFFLOAD_HEADER;
386 /* response struct (from ReactOS) */
387 #define NDIS_TASK_OFFLOAD_VERSION 1
388 typedef struct _NDIS_TASK_OFFLOAD
393 ULONG OffsetNextTask;
394 ULONG TaskBufferLength;
396 } NDIS_TASK_OFFLOAD, *PNDIS_TASK_OFFLOAD;
399 /***********************************************************************/
400 /* value_string's for info functions */
403 /* NDIS driver medium (OID_GEN_MEDIA_SUPPORTED / OID_GEN_MEDIA_IN_USE) */
404 static const value_string win32_802_3_medium_vals[] = {
405 { NdisMedium802_3, "802.3 (Ethernet)" }, /* might as well be WLAN, ... (see NDIS_PHYSICAL_MEDIUM) */
406 { NdisMedium802_5, "802.5 (Token Ring)" },
407 { NdisMediumFddi, "FDDI" },
408 { NdisMediumWan, "WAN" },
409 { NdisMediumLocalTalk, "Local Talk" },
410 { NdisMediumDix, "Dix" },
411 { NdisMediumArcnetRaw, "Arcnet Raw" },
412 { NdisMediumArcnet878_2,"Arcnet 878_2" },
413 { NdisMediumAtm, "ATM" },
414 { NdisMediumWirelessWan,"Wireless WAN" },
415 { NdisMediumIrda, "Irda" },
419 /* NDIS physical driver medium (OID_GEN_PHYSICAL_MEDIUM) */
420 static const value_string win32_802_3_physical_medium_vals[] = {
421 { NdisPhysicalMediumUnspecified, "Unspecified" },
422 { NdisPhysicalMediumWirelessLan, "Wireless LAN" },
423 { NdisPhysicalMediumCableModem, "Cable Modem" },
424 { NdisPhysicalMediumPhoneLine, "Phone Line" },
425 { NdisPhysicalMediumPowerLine, "Power Line" },
426 { NdisPhysicalMediumDSL, "DSL" },
427 { NdisPhysicalMediumFibreChannel, "Fibre Channel" },
428 { NdisPhysicalMedium1394, "IEEE 1394" },
429 { NdisPhysicalMediumWirelessWan, "Wireless WAN" },
433 static const value_string win32_802_11_infra_mode_vals[] = {
434 { Ndis802_11IBSS, "Ad Hoc" },
435 { Ndis802_11Infrastructure, "Access Point" },
436 { Ndis802_11AutoUnknown, "Auto or unknown" },
440 static const value_string win32_802_11_auth_mode_vals[] = {
441 { Ndis802_11AuthModeOpen, "Open System" },
442 { Ndis802_11AuthModeShared, "Shared Key" },
443 { Ndis802_11AuthModeAutoSwitch, "Auto Switch" },
444 { Ndis802_11AuthModeWPA, "WPA" },
445 { Ndis802_11AuthModeWPAPSK, "WPA-PSK (pre shared key)" },
446 { Ndis802_11AuthModeWPANone, "WPA (ad hoc)" },
447 { Ndis802_11AuthModeWPA2, "WPA2" },
448 { Ndis802_11AuthModeWPA2PSK, "WPA2-PSK (pre shared key)" },
452 static const value_string win32_802_11_network_type_vals[] = {
453 { Ndis802_11FH, "FH (frequency-hopping spread-spectrum)" },
454 { Ndis802_11DS, "DS (direct-sequence spread-spectrum)" },
455 { Ndis802_11OFDM5, "5-GHz OFDM" },
456 { Ndis802_11OFDM24, "2.4-GHz OFDM" },
457 { Ndis802_11Automode, "Auto" },
461 /* XXX - add some explanations */
462 static const value_string win32_802_11_encryption_status_vals[] = {
463 { Ndis802_11Encryption1Enabled, "Encryption 1 Enabled (WEP enabled, TKIP & AES disabled, transmit key available)" },
464 { Ndis802_11EncryptionDisabled, "Encryption Disabled (WEP & TKIP & AES disabled, transmit key available)" },
465 { Ndis802_11Encryption1KeyAbsent, "Encryption 1 Key Absent (WEP enabled, TKIP & AES disabled, transmit key unavailable)" },
466 { Ndis802_11EncryptionNotSupported, "Encryption Not Supported (WEP & TKIP & AES not supported)" },
467 { Ndis802_11Encryption2Enabled, "Encryption 2 Enabled (WEP & TKIP enabled, AES disabled, transmit key available)" },
468 { Ndis802_11Encryption2KeyAbsent, "Encryption 2 Key Absent (WEP & TKIP enabled, AES disabled, transmit key unavailable)" },
469 { Ndis802_11Encryption3Enabled, "Encryption 3 Enabled (WEP & TKIP & AES enabled, transmit key available)" },
470 { Ndis802_11Encryption3KeyAbsent, "Encryption 3 Key Absent (WEP & TKIP & AES enabled, transmit key unavailable)" },
474 /* frequency to channel mapping (OID_802_11_CONFIGURATION) */
475 static const value_string win32_802_11_channel_vals[] = {
476 { 2412000, "1 (2412000 kHz)" },
477 { 2417000, "2 (2417000 kHz)" },
478 { 2422000, "3 (2422000 kHz)" },
479 { 2427000, "4 (2427000 kHz)" },
480 { 2432000, "5 (2432000 kHz)" },
481 { 2437000, "6 (2437000 kHz)" },
482 { 2442000, "7 (2442000 kHz)" },
483 { 2447000, "8 (2447000 kHz)" },
484 { 2452000, "9 (2452000 kHz)" },
485 { 2457000, "10 (2457000 kHz)" },
486 { 2462000, "11 (2462000 kHz)" },
487 { 2467000, "12 (2467000 kHz)" },
488 { 2472000, "13 (2472000 kHz)" },
489 { 2484000, "14 (2484000 kHz)" },
493 static const value_string oid_vals[] = {
494 { OID_GEN_SUPPORTED_LIST, "OID_GEN_SUPPORTED_LIST" },
495 { OID_GEN_HARDWARE_STATUS, "OID_GEN_HARDWARE_STATUS (only internally interesting)" },
496 { OID_GEN_MEDIA_SUPPORTED, "OID_GEN_MEDIA_SUPPORTED" },
497 { OID_GEN_MEDIA_IN_USE, "OID_GEN_MEDIA_IN_USE" },
498 { OID_GEN_MAXIMUM_LOOKAHEAD, "OID_GEN_MAXIMUM_LOOKAHEAD (unused)" },
499 { OID_GEN_MAXIMUM_FRAME_SIZE, "OID_GEN_MAXIMUM_FRAME_SIZE (unused)" },
500 { OID_GEN_LINK_SPEED, "OID_GEN_LINK_SPEED" },
501 { OID_GEN_TRANSMIT_BUFFER_SPACE, "OID_GEN_TRANSMIT_BUFFER_SPACE" },
502 { OID_GEN_RECEIVE_BUFFER_SPACE, "OID_GEN_RECEIVE_BUFFER_SPACE" },
503 { OID_GEN_TRANSMIT_BLOCK_SIZE, "OID_GEN_TRANSMIT_BLOCK_SIZE" },
504 { OID_GEN_RECEIVE_BLOCK_SIZE, "OID_GEN_RECEIVE_BLOCK_SIZE" },
505 { OID_GEN_VENDOR_ID, "OID_GEN_VENDOR_ID" },
506 { OID_GEN_VENDOR_DESCRIPTION, "OID_GEN_VENDOR_DESCRIPTION" },
507 { OID_GEN_CURRENT_PACKET_FILTER, "OID_GEN_CURRENT_PACKET_FILTER (info seems to be constant)" },
508 { OID_GEN_CURRENT_LOOKAHEAD, "OID_GEN_CURRENT_LOOKAHEAD (only internally interesting)" },
509 { OID_GEN_DRIVER_VERSION, "OID_GEN_DRIVER_VERSION" },
510 { OID_GEN_MAXIMUM_TOTAL_SIZE, "OID_GEN_MAXIMUM_TOTAL_SIZE" },
511 { OID_GEN_PROTOCOL_OPTIONS, "OID_GEN_PROTOCOL_OPTIONS (info not interesting)" },
512 { OID_GEN_MAC_OPTIONS, "OID_GEN_MAC_OPTIONS" },
513 { OID_GEN_MEDIA_CONNECT_STATUS, "OID_GEN_MEDIA_CONNECT_STATUS" },
514 { OID_GEN_MAXIMUM_SEND_PACKETS, "OID_GEN_MAXIMUM_SEND_PACKETS (only internally interesting)" },
515 { OID_GEN_VENDOR_DRIVER_VERSION, "OID_GEN_VENDOR_DRIVER_VERSION" },
516 { OID_GEN_XMIT_OK, "OID_GEN_XMIT_OK" },
517 { OID_GEN_RCV_OK, "OID_GEN_RCV_OK" },
518 { OID_GEN_XMIT_ERROR, "OID_GEN_XMIT_ERROR" },
519 { OID_GEN_RCV_ERROR, "OID_GEN_RCV_ERROR" },
520 { OID_GEN_RCV_NO_BUFFER, "OID_GEN_RCV_NO_BUFFER" },
521 { OID_GEN_DIRECTED_BYTES_XMIT, "OID_GEN_DIRECTED_BYTES_XMIT" },
522 { OID_GEN_DIRECTED_FRAMES_XMIT, "OID_GEN_DIRECTED_FRAMES_XMIT" },
523 { OID_GEN_MULTICAST_BYTES_XMIT, "OID_GEN_MULTICAST_BYTES_XMIT" },
524 { OID_GEN_MULTICAST_FRAMES_XMIT, "OID_GEN_MULTICAST_FRAMES_XMIT" },
525 { OID_GEN_BROADCAST_BYTES_XMIT, "OID_GEN_BROADCAST_BYTES_XMIT" },
526 { OID_GEN_BROADCAST_FRAMES_XMIT, "OID_GEN_BROADCAST_FRAMES_XMIT" },
527 { OID_GEN_DIRECTED_BYTES_RCV, "OID_GEN_DIRECTED_BYTES_RCV" },
528 { OID_GEN_DIRECTED_FRAMES_RCV, "OID_GEN_DIRECTED_FRAMES_RCV" },
529 { OID_GEN_MULTICAST_BYTES_RCV, "OID_GEN_MULTICAST_BYTES_RCV" },
530 { OID_GEN_MULTICAST_FRAMES_RCV, "OID_GEN_MULTICAST_FRAMES_RCV" },
531 { OID_GEN_BROADCAST_BYTES_RCV, "OID_GEN_BROADCAST_BYTES_RCV" },
532 { OID_GEN_BROADCAST_FRAMES_RCV, "OID_GEN_BROADCAST_FRAMES_RCV" },
533 { OID_GEN_RCV_CRC_ERROR, "OID_GEN_RCV_CRC_ERROR" },
534 { OID_GEN_TRANSMIT_QUEUE_LENGTH, "OID_GEN_TRANSMIT_QUEUE_LENGTH" },
535 { OID_GEN_GET_TIME_CAPS, "OID_GEN_GET_TIME_CAPS (unsupp, unused)" },
536 { OID_GEN_GET_NETCARD_TIME, "OID_GEN_GET_NETCARD_TIME (unsupp, unused)" },
538 { OID_GEN_PHYSICAL_MEDIUM, "OID_GEN_PHYSICAL_MEDIUM" },
539 //{ OID_GEN_MACHINE_NAME, "OID_GEN_MACHINE_NAME (unsupp, unused)" },
540 { OID_GEN_VLAN_ID, "OID_GEN_VLAN_ID" },
541 { OID_GEN_MEDIA_CAPABILITIES, "OID_GEN_MEDIA_CAPABILITIES (unsupp, unused)" },
543 { OID_GEN_NETWORK_LAYER_ADDRESSES, "OID_GEN_NETWORK_LAYER_ADDRESSES (write only)" },
544 { OID_GEN_TRANSPORT_HEADER_OFFSET, "OID_GEN_TRANSPORT_HEADER_OFFSET (write only)" },
546 { OID_802_3_PERMANENT_ADDRESS, "OID_802_3_PERMANENT_ADDRESS" },
547 { OID_802_3_CURRENT_ADDRESS, "OID_802_3_CURRENT_ADDRESS" },
548 { OID_802_3_MAXIMUM_LIST_SIZE, "OID_802_3_MAXIMUM_LIST_SIZE (unused)" },
549 { OID_802_3_MULTICAST_LIST, "OID_802_3_MULTICAST_LIST (unused)" }, // XXX
550 { OID_802_3_MAC_OPTIONS, "OID_802_3_MAC_OPTIONS (unsupp, unused)" },
552 { OID_802_3_RCV_ERROR_ALIGNMENT, "OID_802_3_RCV_ERROR_ALIGNMENT" },
553 { OID_802_3_XMIT_ONE_COLLISION, "OID_802_3_XMIT_ONE_COLLISION" },
554 { OID_802_3_XMIT_MORE_COLLISIONS, "OID_802_3_XMIT_MORE_COLLISIONS" },
555 { OID_802_3_XMIT_DEFERRED, "OID_802_3_XMIT_DEFERRED" },
556 { OID_802_3_XMIT_MAX_COLLISIONS, "OID_802_3_XMIT_MAX_COLLISIONS" },
557 { OID_802_3_RCV_OVERRUN, "OID_802_3_RCV_OVERRUN" },
558 { OID_802_3_XMIT_UNDERRUN, "OID_802_3_XMIT_UNDERRUN" },
559 { OID_802_3_XMIT_HEARTBEAT_FAILURE, "OID_802_3_XMIT_HEARTBEAT_FAILURE (unsupp, used)" },
560 { OID_802_3_XMIT_TIMES_CRS_LOST, "OID_802_3_XMIT_TIMES_CRS_LOST (unsupp, used)" },
561 { OID_802_3_XMIT_LATE_COLLISIONS, "OID_802_3_XMIT_LATE_COLLISIONS" },
563 { OID_802_11_BSSID, "OID_802_11_BSSID" },
564 { OID_802_11_SSID, "OID_802_11_SSID" },
565 { OID_802_11_NETWORK_TYPES_SUPPORTED, "OID_802_11_NETWORK_TYPES_SUPPORTED (info not interesting)" },
566 { OID_802_11_NETWORK_TYPE_IN_USE, "OID_802_11_NETWORK_TYPE_IN_USE" },
567 { OID_802_11_TX_POWER_LEVEL, "OID_802_11_TX_POWER_LEVEL (unsupp, used)" },
568 { OID_802_11_RSSI, "OID_802_11_RSSI" },
569 { OID_802_11_RSSI_TRIGGER, "OID_802_11_RSSI_TRIGGER (unsupp, unused)" },
570 { OID_802_11_INFRASTRUCTURE_MODE, "OID_802_11_INFRASTRUCTURE_MODE" },
571 { OID_802_11_FRAGMENTATION_THRESHOLD, "OID_802_11_FRAGMENTATION_THRESHOLD (unused)" },
572 { OID_802_11_RTS_THRESHOLD, "OID_802_11_RTS_THRESHOLD (unused)" },
573 { OID_802_11_NUMBER_OF_ANTENNAS, "OID_802_11_NUMBER_OF_ANTENNAS (unsupp, unused)" },
574 { OID_802_11_RX_ANTENNA_SELECTED, "OID_802_11_RX_ANTENNA_SELECTED (unsupp, unused)" },
575 { OID_802_11_TX_ANTENNA_SELECTED, "OID_802_11_TX_ANTENNA_SELECTED (unsupp, unused)" },
576 { OID_802_11_SUPPORTED_RATES, "OID_802_11_SUPPORTED_RATES" },
577 { OID_802_11_DESIRED_RATES, "OID_802_11_DESIRED_RATES (unsupp, used)" },
578 { OID_802_11_CONFIGURATION, "OID_802_11_CONFIGURATION" },
579 { OID_802_11_STATISTICS, "OID_802_11_STATISTICS (unsupp, unused)" },
580 { OID_802_11_ADD_WEP, "OID_802_11_ADD_WEP (write only)" },
581 { OID_802_11_REMOVE_WEP, "OID_802_11_REMOVE_WEP (write only)" },
582 { OID_802_11_DISASSOCIATE, "OID_802_11_DISASSOCIATE (write only)" },
583 { OID_802_11_POWER_MODE, "OID_802_11_POWER_MODE (info not interesting)" },
584 { OID_802_11_BSSID_LIST, "OID_802_11_BSSID_LIST" },
585 { OID_802_11_AUTHENTICATION_MODE, "OID_802_11_AUTHENTICATION_MODE" },
586 { OID_802_11_PRIVACY_FILTER, "OID_802_11_PRIVACY_FILTER (info not interesting)" },
587 { OID_802_11_BSSID_LIST_SCAN, "OID_802_11_BSSID_LIST_SCAN" },
588 { OID_802_11_WEP_STATUS, "OID_802_11_WEP_STATUS (info not interesting?)" },
589 { OID_802_11_ENCRYPTION_STATUS, "OID_802_11_ENCRYPTION_STATUS (unsupp, used)" },
590 { OID_802_11_RELOAD_DEFAULTS, "OID_802_11_RELOAD_DEFAULTS (write only)" },
591 { OID_802_11_ADD_KEY, "OID_802_11_ADD_KEY (write only)" },
592 { OID_802_11_REMOVE_KEY, "OID_802_11_REMOVE_KEY (write only)" },
593 { OID_802_11_ASSOCIATION_INFORMATION, "OID_802_11_ASSOCIATION_INFORMATION (unused)" }, // XXX
594 { OID_802_11_TEST, "OID_802_11_TEST (write only)" },
595 { OID_802_11_CAPABILITY, "OID_802_11_CAPABILITY (unsupp, unused)" },
596 { OID_802_11_PMKID, "OID_802_11_PMKID (unsupp, unused)" },
598 /* Token-Ring list is utterly incomplete (contains only the values for MS Loopback Driver) */
599 { OID_802_5_PERMANENT_ADDRESS, "OID_802_5_PERMANENT_ADDRESS (unused)" },
600 { OID_802_5_CURRENT_ADDRESS, "OID_802_5_CURRENT_ADDRESS (unused)" },
601 { OID_802_5_CURRENT_FUNCTIONAL, "OID_802_5_CURRENT_FUNCTIONAL (unused)" },
602 { OID_802_5_CURRENT_GROUP, "OID_802_5_CURRENT_GROUP (unused)" },
603 { OID_802_5_LAST_OPEN_STATUS, "OID_802_5_LAST_OPEN_STATUS (unused)" },
604 { OID_802_5_CURRENT_RING_STATUS, "OID_802_5_CURRENT_RING_STATUS (unused)" },
605 { OID_802_5_CURRENT_RING_STATE, "OID_802_5_CURRENT_RING_STATE (unused)" },
606 { OID_802_5_LINE_ERRORS, "OID_802_5_LINE_ERRORS (unused)" },
607 { OID_802_5_LOST_FRAMES, "OID_802_5_LOST_FRAMES (unused)" },
609 /* FDDI list is utterly incomplete (contains only the values for MS Loopback Driver) */
610 { OID_FDDI_LONG_PERMANENT_ADDR, "OID_FDDI_LONG_PERMANENT_ADDR (unused)" },
611 { OID_FDDI_LONG_CURRENT_ADDR, "OID_FDDI_LONG_CURRENT_ADDR (unused)" },
612 { OID_FDDI_LONG_MULTICAST_LIST, "OID_FDDI_LONG_MULTICAST_LIST (unused)" },
613 { OID_FDDI_LONG_MAX_LIST_SIZE, "OID_FDDI_LONG_MAX_LIST_SIZE (unused)" },
614 { OID_FDDI_SHORT_PERMANENT_ADDR, "OID_FDDI_SHORT_PERMANENT_ADDR (unused)" },
615 { OID_FDDI_SHORT_CURRENT_ADDR, "OID_FDDI_SHORT_CURRENT_ADDR (unused)" },
616 { OID_FDDI_SHORT_MULTICAST_LIST, "OID_FDDI_SHORT_MULTICAST_LIST (unused)" },
617 { OID_FDDI_SHORT_MAX_LIST_SIZE, "OID_FDDI_SHORT_MAX_LIST_SIZE (unused)" },
619 /* LocalTalk list is utterly incomplete (contains only the values for MS Loopback Driver) */
620 { OID_LTALK_CURRENT_NODE_ID, "OID_LTALK_CURRENT_NODE_ID (unused)" },
622 /* Arcnet list is utterly incomplete (contains only the values for MS Loopback Driver) */
623 { OID_ARCNET_PERMANENT_ADDRESS, "OID_ARCNET_PERMANENT_ADDRESS (unused)" },
624 { OID_ARCNET_CURRENT_ADDRESS, "OID_ARCNET_CURRENT_ADDRESS (unused)" },
626 { OID_TCP_TASK_OFFLOAD, "OID_TCP_TASK_OFFLOAD" },
628 /* PnP and power management OIDs */
629 { OID_PNP_CAPABILITIES, "OID_PNP_CAPABILITIES (unused)" },
630 { OID_PNP_SET_POWER, "OID_PNP_SET_POWER (unused)" },
631 { OID_PNP_QUERY_POWER, "OID_PNP_QUERY_POWER (unused)" },
632 { OID_PNP_ADD_WAKE_UP_PATTERN, "OID_PNP_ADD_WAKE_UP_PATTERN (unused)" },
633 { OID_PNP_REMOVE_WAKE_UP_PATTERN, "OID_PNP_REMOVE_WAKE_UP_PATTERN (unused)" },
634 { OID_PNP_WAKE_UP_PATTERN_LIST, "OID_PNP_WAKE_UP_PATTERN_LIST (unused)" },
635 { OID_PNP_ENABLE_WAKE_UP, "OID_PNP_ENABLE_WAKE_UP (unused)" },
637 /* Unknown OID's (seen on an "Intel(R) PRO/Wireless 2200BG" 802.11 interface) */
638 { 0xFF100000, "Unknown 0xFF100000 (unused)" },
639 { 0xFF100002, "Unknown 0xFF100002 (unused)" },
640 { 0xFF100003, "Unknown 0xFF100003 (unused)" },
641 { 0xFF100004, "Unknown 0xFF100004 (unused)" },
642 { 0xFF100005, "Unknown 0xFF100005 (unused)" },
643 { 0xFF100006, "Unknown 0xFF100006 (unused)" },
644 { 0xFF100007, "Unknown 0xFF100007 (unused)" },
645 { 0xFF100009, "Unknown 0xFF100009 (unused)" },
646 { 0xFF10000b, "Unknown 0xFF10000b (unused)" },
647 { 0xFF10000c, "Unknown 0xFF10000c (unused)" },
648 { 0xFF10000e, "Unknown 0xFF10000e (unused)" },
649 { 0xFF10000f, "Unknown 0xFF10000f (unused)" },
650 /* continued by a lot more 0xFF... values */
656 /***************************************************************************/
657 /* debug functions, query or list supported NDIS OID's */
661 supported_list(LPADAPTER adapter)
663 unsigned char values[10000];
667 g_warning("supported_list_unhandled");
668 length = sizeof(values);
669 if (wpcap_packet_request(adapter, OID_GEN_SUPPORTED_LIST, FALSE /* !set */, values, &length)) {
670 guint32 *value = (guint32 *) values;
673 printf("OID: 0x%08X %s\n", *value, val_to_str(*value, oid_vals, "unknown"));
683 supported_query_oid(LPADAPTER adapter, guint32 oid)
685 unsigned char values[10000];
689 length = sizeof(values);
690 if (wpcap_packet_request(adapter, OID_GEN_SUPPORTED_LIST, FALSE /* !set */, values, &length)) {
691 guint32 *value = (guint32 *) values;
706 /******************************************************************************/
707 /* info functions, get and display various NDIS driver values */
711 add_row_to_table(GtkWidget *list, guint *row, gchar *title, const gchar *value, gboolean sensitive)
716 if(strlen(value) != 0) {
717 indent = g_strdup_printf(" %s", title);
719 indent = g_strdup(title);
721 label = gtk_label_new(indent);
723 gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
724 gtk_widget_set_sensitive(label, sensitive);
725 gtk_table_attach_defaults(GTK_TABLE(list), label, 0, 1, *row, *row+1);
727 label = gtk_label_new(value);
728 gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
729 gtk_widget_set_sensitive(label, sensitive);
730 gtk_table_attach_defaults(GTK_TABLE(list), label, 1, 2, *row, *row+1);
737 add_string_to_table_sensitive(GtkWidget *list, guint *row, gchar *title, gchar *value, gboolean sensitive)
739 add_row_to_table(list, row, title, value, sensitive);
744 add_string_to_table(GtkWidget *list, guint *row, gchar *title, const gchar *value)
746 add_row_to_table(list, row, title, value, TRUE);
751 ssid_details(GtkWidget *table, guint *row, struct ndis_essid *ssid_in) {
752 struct ndis_essid ssid[2]; /* prevent an off by one error */
756 g_assert(ssid->length <= NDIS_ESSID_MAX_SIZE);
758 if(ssid->length != 0) {
759 ssid->essid[ssid->length] = '\0';
760 add_string_to_table(table, row, "SSID (Service Set IDentifier)", ssid->essid);
762 add_string_to_table(table, row, "SSID (Service Set IDentifier)", "(currently not associated with an SSID)");
768 rates_details(unsigned char *values, int length) {
775 Rates = g_string_new("");
782 g_string_append(Rates, "/");
785 float_value = (float) ((values[i] & 0x7F) / 2);
787 /* reduce the screen estate by showing fractions only where required */
788 int_value = (int)float_value;
789 if(float_value == (float)int_value) {
790 g_string_sprintfa(Rates, "%.0f", float_value);
792 g_string_sprintfa(Rates, "%.1f", float_value);
797 Rates = g_string_append(Rates, " MBits/s");
799 Rates = g_string_append(Rates, "-");
807 capture_if_details_802_11_bssid_list(GtkWidget *main_vb, struct ndis_bssid_list *bssid_list)
809 struct ndis_ssid_item *bssid_item;
810 unsigned char mac[6];
811 const gchar *manuf_name;
815 if(bssid_list->num_items != 0) {
816 char *titles[] = { "SSID", "MAC", "Vendor", "RSSI" , "Network Type" , "Infra. Mode" , "Channel" , "Rates" };
819 gchar ssid_buff[DETAILS_STR_MAX];
820 gchar mac_buff[DETAILS_STR_MAX];
821 gchar vendor_buff[DETAILS_STR_MAX];
822 gchar rssi_buff[DETAILS_STR_MAX];
823 gchar nettype_buff[DETAILS_STR_MAX];
824 gchar infra_buff[DETAILS_STR_MAX];
825 gchar freq_buff[DETAILS_STR_MAX];
827 list = simple_list_new(8, titles);
828 gtk_container_add(GTK_CONTAINER(main_vb), list);
830 bssid_item = &bssid_list->items[0];
832 while(bssid_list->num_items--) {
835 if(bssid_item->ssid.length > DETAILS_STR_MAX-1) {
836 bssid_item->ssid.length = DETAILS_STR_MAX-1;
838 memcpy(ssid_buff, bssid_item->ssid.essid, bssid_item->ssid.length);
839 ssid_buff[bssid_item->ssid.length] = '\0';
842 memcpy(mac, &bssid_item->mac, sizeof(mac));
843 g_snprintf(mac_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X",
844 mac[0], mac[1], mac[2],
845 mac[3], mac[4], mac[5]);
848 manuf_name = get_manuf_name_if_known(mac);
849 if(manuf_name != NULL) {
850 strcpy(vendor_buff, manuf_name);
852 strcpy(vendor_buff, "");
855 /* Supported Rates */
856 Rates = rates_details(bssid_item->rates, NDIS_MAX_RATES_EX);
859 g_snprintf(rssi_buff, DETAILS_STR_MAX, "%d dBm", bssid_item->rssi);
862 g_snprintf(nettype_buff, sizeof(nettype_buff), "%s",
863 val_to_str(bssid_item->net_type, win32_802_11_network_type_vals, "(0x%x)"));
865 /* Infrastructure Mode */
866 g_snprintf(infra_buff, sizeof(infra_buff), "%s",
867 val_to_str(bssid_item->mode, win32_802_11_infra_mode_vals, "(0x%x)"));
870 g_snprintf(freq_buff, sizeof(freq_buff), "%s",
871 val_to_str(bssid_item->config.ds_config, win32_802_11_channel_vals, "(%u kHz)"));
873 /* IE Length (XXX - add decoding) */
874 /* g_warning ("802.11 IE Length : %u", bssid_item->ie_length); */
876 simple_list_append(list,
887 g_string_free(Rates, TRUE /* free_segment */);
889 /* the bssid_list isn't an array, but a sequence of variable length items */
890 bssid_item = (struct ndis_ssid_item *) (((char *) bssid_item) + bssid_item->length);
896 capture_if_details_802_11(GtkWidget *table, GtkWidget *main_vb, guint *row, LPADAPTER adapter) {
899 unsigned int uint_value;
900 unsigned char values[100];
901 struct ndis_essid ssid;
903 struct ndis_bssid_list *bssid_list;
904 struct ndis_configuration *configuration;
905 gchar string_buff[DETAILS_STR_MAX];
910 add_string_to_table(table, row, "Characteristics", "");
913 length = sizeof(values);
914 memset(values, 0, 6);
915 if (wpcap_packet_request(adapter, OID_802_11_BSSID, FALSE /* !set */, values, &length)) {
916 g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X",
917 values[0], values[1], values[2],
918 values[3], values[4], values[5]);
921 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
923 add_string_to_table(table, row, "BSSID (Basic Service Set IDentifier)", string_buff);
926 length = sizeof(struct ndis_essid);
927 memset(&ssid, 0, length);
928 if (wpcap_packet_request(adapter, OID_802_11_SSID, FALSE /* !set */, (char *) &ssid, &length)) {
929 ssid_details(table, row, &ssid);
932 add_string_to_table(table, row, "SSID (Service Set IDentifier)", "-");
935 /* Network type in use */
936 if (wpcap_packet_request_uint(adapter, OID_802_11_NETWORK_TYPE_IN_USE, &uint_value)) {
937 add_string_to_table(table, row, "Network type used",
938 val_to_str(uint_value, win32_802_11_network_type_vals, "(0x%x)"));
941 add_string_to_table(table, row, "Network type used", "-");
944 /* Infrastructure mode */
945 if (wpcap_packet_request_ulong(adapter, OID_802_11_INFRASTRUCTURE_MODE, &uint_value)) {
946 add_string_to_table(table, row, "Infrastructure mode",
947 val_to_str(uint_value, win32_802_11_infra_mode_vals, "(0x%x)"));
950 add_string_to_table(table, row, "Infrastructure mode", "-");
953 /* Authentication mode */
954 if (wpcap_packet_request_ulong(adapter, OID_802_11_AUTHENTICATION_MODE, &uint_value)) {
955 add_string_to_table(table, row, "Authentication mode",
956 val_to_str(uint_value, win32_802_11_auth_mode_vals, "(0x%x)"));
959 add_string_to_table(table, row, "Authentication mode", "-");
962 /* Encryption (WEP) status */
963 if (wpcap_packet_request_ulong(adapter, OID_802_11_ENCRYPTION_STATUS, &uint_value)) {
964 add_string_to_table(table, row, "Encryption status",
965 val_to_str(uint_value, win32_802_11_encryption_status_vals, "(0x%x)"));
968 add_string_to_table(table, row, "Encryption status", "-");
972 if (wpcap_packet_request_ulong(adapter, OID_802_11_TX_POWER_LEVEL, &ulong_value)) {
973 g_snprintf(string_buff, DETAILS_STR_MAX, "%ld mW", ulong_value);
974 add_string_to_table(table, row, "TX power", string_buff);
977 add_string_to_table(table, row, "TX power", "-");
981 if (wpcap_packet_request_ulong(adapter, OID_802_11_RSSI, &long_value)) {
982 g_snprintf(string_buff, DETAILS_STR_MAX, "%ld dBm (typical -10 through -200)", long_value);
983 add_string_to_table(table, row, "RSSI (Received Signal Strength Indication)", string_buff);
986 add_string_to_table(table, row, "RSSI (Received Signal Strength Indication)", "-");
989 /* Supported Rates */
990 length = sizeof(values);
991 if (!wpcap_packet_request(adapter, OID_802_11_SUPPORTED_RATES, FALSE /* !set */, values, &length)) {
997 Rates = rates_details(values, length);
998 add_string_to_table(table, row, "Supported Rates", Rates->str);
999 g_string_free(Rates, TRUE /* free_segment */);
1002 length = sizeof(values);
1003 if (!wpcap_packet_request(adapter, OID_802_11_DESIRED_RATES, FALSE /* !set */, values, &length)) {
1009 Rates = rates_details(values, length);
1010 add_string_to_table(table, row, "Desired Rates", Rates->str);
1011 g_string_free(Rates, TRUE /* free_segment */);
1013 /* Configuration (e.g. frequency) */
1014 length = sizeof(values);
1015 if (wpcap_packet_request(adapter, OID_802_11_CONFIGURATION, FALSE /* !set */, (char *) values, &length)) {
1016 configuration = (struct ndis_configuration *) values;
1018 add_string_to_table(table, row, "Channel",
1019 val_to_str(configuration->ds_config, win32_802_11_channel_vals, "(%u kHz)"));
1022 add_string_to_table(table, row, "Channel", "-");
1025 /* BSSID list: first trigger a scan */
1026 length = sizeof(uint_value);
1027 if (wpcap_packet_request(adapter, OID_802_11_BSSID_LIST_SCAN, TRUE /* set */, (char *) &uint_value, &length)) {
1029 g_warning("BSSID list scan done");
1031 g_warning("BSSID list scan failed");
1035 /* BSSID list: get scan results */
1036 /* XXX - we might have to wait up to 7 seconds! */
1037 length = sizeof(ULONG) + sizeof(struct ndis_ssid_item) * 16;
1038 bssid_list = g_malloc(length);
1039 /* some drivers don't set bssid_list->num_items to 0 if
1040 OID_802_11_BSSID_LIST returns no items (prism54 driver, e.g.,) */
1041 memset(bssid_list, 0, length);
1043 if (wpcap_packet_request(adapter, OID_802_11_BSSID_LIST, FALSE /* !set */, (char *) bssid_list, &length)) {
1044 add_string_to_table(table, row, "", "");
1045 add_string_to_table(table, row, "BSSID list", "");
1047 capture_if_details_802_11_bssid_list(main_vb, bssid_list);
1048 entries += bssid_list->num_items;
1050 add_string_to_table(table, row, "802.11 BSSID list", "-");
1060 capture_if_details_802_3(GtkWidget *table, GtkWidget *main_vb, guint *row, LPADAPTER adapter) {
1061 unsigned int uint_value;
1062 unsigned char values[100];
1064 gchar string_buff[DETAILS_STR_MAX];
1065 const gchar *manuf_name;
1069 add_string_to_table(table, row, "Characteristics", "");
1071 length = sizeof(values);
1072 if (wpcap_packet_request(adapter, OID_802_3_PERMANENT_ADDRESS, FALSE /* !set */, values, &length)) {
1073 manuf_name = get_manuf_name_if_known(values);
1074 if(manuf_name != NULL) {
1075 g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X (%s)",
1076 values[0], values[1], values[2],
1077 values[3], values[4], values[5],
1080 g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X",
1081 values[0], values[1], values[2],
1082 values[3], values[4], values[5]);
1086 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1088 add_string_to_table(table, row, "Permanent station address", string_buff);
1090 length = sizeof(values);
1091 if (wpcap_packet_request(adapter, OID_802_3_CURRENT_ADDRESS, FALSE /* !set */, values, &length)) {
1092 manuf_name = get_manuf_name_if_known(values);
1093 if(manuf_name != NULL) {
1094 g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X (%s)",
1095 values[0], values[1], values[2],
1096 values[3], values[4], values[5],
1099 g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X",
1100 values[0], values[1], values[2],
1101 values[3], values[4], values[5]);
1105 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1107 add_string_to_table(table, row, "Current station address", string_buff);
1110 add_string_to_table(table, row, "", "");
1111 add_string_to_table(table, row, "Statistics", "");
1113 if (wpcap_packet_request_uint(adapter, OID_802_3_RCV_ERROR_ALIGNMENT, &uint_value)) {
1114 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1117 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1119 add_string_to_table(table, row, "Packets received with alignment error", string_buff);
1121 if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_ONE_COLLISION, &uint_value)) {
1122 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1125 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1127 add_string_to_table(table, row, "Packets transmitted with one collision", string_buff);
1129 if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_MORE_COLLISIONS, &uint_value)) {
1130 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1133 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1135 add_string_to_table(table, row, "Packets transmitted with more than one collision", string_buff);
1137 if (wpcap_packet_request_uint(adapter, OID_802_3_RCV_OVERRUN, &uint_value)) {
1138 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1141 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1143 add_string_to_table(table, row, "Packets not received due to overrun", string_buff);
1145 if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_DEFERRED, &uint_value)) {
1146 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1149 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1151 add_string_to_table(table, row, "Packets transmitted after deferred", string_buff);
1153 if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_MAX_COLLISIONS, &uint_value)) {
1154 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1157 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1159 add_string_to_table(table, row, "Packets not transmitted due to collisions", string_buff);
1161 if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_UNDERRUN, &uint_value)) {
1162 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1165 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1167 add_string_to_table(table, row, "Packets not transmitted due to underrun", string_buff);
1169 if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_HEARTBEAT_FAILURE, &uint_value)) {
1170 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1173 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1175 add_string_to_table(table, row, "Packets transmitted with heartbeat failure", string_buff);
1177 if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_TIMES_CRS_LOST, &uint_value)) {
1178 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1181 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1183 add_string_to_table(table, row, "Times carrier sense signal lost during transmission", string_buff);
1185 if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_LATE_COLLISIONS, &uint_value)) {
1186 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1189 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1191 add_string_to_table(table, row, "Times late collisions detected", string_buff);
1197 capture_if_details_task_offload(GtkWidget *table, GtkWidget *main_vb, guint *row, LPADAPTER adapter) {
1198 NDIS_TASK_OFFLOAD_HEADER *offload;
1199 unsigned char values[10000];
1201 gchar string_buff[DETAILS_STR_MAX];
1203 int TcpIpChecksumSupported = 0;
1204 int IpSecSupported = 0;
1205 int TcpLargeSendSupported = 0;
1209 offload = (NDIS_TASK_OFFLOAD_HEADER *) values;
1210 offload->Version = NDIS_TASK_OFFLOAD_VERSION;
1211 offload->Size = sizeof(NDIS_TASK_OFFLOAD_HEADER);
1212 offload->Reserved = 0;
1213 offload->OffsetFirstTask = 0;
1214 /* the EncapsulationFormat seems to be ignored on a query (using Ethernet values) */
1215 offload->EncapsulationFormat.Encapsulation = IEEE_802_3_Encapsulation;
1216 offload->EncapsulationFormat.Flags.FixedHeaderSize = 1;
1217 offload->EncapsulationFormat.Flags.Reserved = 0;
1218 offload->EncapsulationFormat.EncapsulationHeaderSize = 14; /* sizeof(struct ether_header) */;
1220 length = sizeof(values);
1221 if (wpcap_packet_request(adapter, OID_TCP_TASK_OFFLOAD, FALSE /* !set */, values, &length)) {
1222 NDIS_TASK_OFFLOAD *of;
1223 /* XXX - hmmm, using a tvb for this? */
1224 unsigned char *valuep = values + offload->OffsetFirstTask;
1225 length -= offload->OffsetFirstTask;
1228 of = (NDIS_TASK_OFFLOAD *) valuep;
1231 case TcpIpChecksumNdisTask:
1233 NDIS_TASK_TCP_IP_CHECKSUM *tic = (NDIS_TASK_TCP_IP_CHECKSUM *) (of->TaskBuffer);
1236 TcpIpChecksumSupported++;
1238 add_string_to_table(table, row, "TCP/IP Checksum", "");
1240 g_snprintf(string_buff, DETAILS_STR_MAX, "");
1241 add_string_to_table(table, row, "V4 transmit checksum", "");
1243 g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, UDP: %s, IP: %s",
1244 tic->V4Transmit.TcpChecksum ? "Yes" : "No",
1245 tic->V4Transmit.UdpChecksum ? "Yes" : "No",
1246 tic->V4Transmit.IpChecksum ? "Yes" : "No");
1247 add_string_to_table(table, row, "Calculation supported", string_buff);
1249 g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, IP: %s",
1250 tic->V4Transmit.TcpOptionsSupported ? "Yes" : "No",
1251 tic->V4Transmit.IpOptionsSupported ? "Yes" : "No");
1252 add_string_to_table(table, row, "Options fields supported", string_buff);
1254 g_snprintf(string_buff, DETAILS_STR_MAX, "");
1255 add_string_to_table(table, row, "V4 receive checksum", "");
1257 g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, UDP: %s, IP: %s",
1258 tic->V4Receive.TcpChecksum ? "Yes" : "No",
1259 tic->V4Receive.UdpChecksum ? "Yes" : "No",
1260 tic->V4Receive.IpChecksum ? "Yes" : "No");
1261 add_string_to_table(table, row, "Validation supported", string_buff);
1263 g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, IP: %s",
1264 tic->V4Receive.TcpOptionsSupported ? "Yes" : "No",
1265 tic->V4Receive.IpOptionsSupported ? "Yes" : "No");
1266 add_string_to_table(table, row, "Options fields supported", string_buff);
1268 g_snprintf(string_buff, DETAILS_STR_MAX, "");
1269 add_string_to_table(table, row, "V6 transmit checksum", "");
1271 g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, UDP: %s",
1272 tic->V6Transmit.TcpChecksum ? "Yes" : "No",
1273 tic->V6Transmit.UdpChecksum ? "Yes" : "No");
1274 add_string_to_table(table, row, "Calculation supported", string_buff);
1276 g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, IP: %s",
1277 tic->V6Transmit.TcpOptionsSupported ? "Yes" : "No",
1278 tic->V6Transmit.IpOptionsSupported ? "Yes" : "No");
1279 add_string_to_table(table, row, "Options fields supported", string_buff);
1281 g_snprintf(string_buff, DETAILS_STR_MAX, "");
1282 add_string_to_table(table, row, "V6 receive checksum", "");
1284 g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, UDP: %s",
1285 tic->V6Receive.TcpChecksum ? "Yes" : "No",
1286 tic->V6Receive.UdpChecksum ? "Yes" : "No");
1287 add_string_to_table(table, row, "Validation supported", string_buff);
1289 g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, IP: %s",
1290 tic->V6Receive.TcpOptionsSupported ? "Yes" : "No",
1291 tic->V6Receive.IpOptionsSupported ? "Yes" : "No");
1292 add_string_to_table(table, row, "Options fields supported", string_buff);
1299 add_string_to_table(table, row, "IPSEC", "");
1300 g_snprintf(string_buff, DETAILS_STR_MAX, "IPSEC (TaskID 1) not decoded yet");
1301 add_string_to_table(table, row, "Task", string_buff);
1303 case TcpLargeSendNdisTask:
1305 NDIS_TASK_TCP_LARGE_SEND *tls = (NDIS_TASK_TCP_LARGE_SEND *) (of->TaskBuffer);
1308 TcpLargeSendSupported++;
1310 add_string_to_table(table, row, "TCP large send", "");
1311 /* XXX - while MSDN tells about version 0, we see version 1?!? */
1312 if(tls->Version == 1) {
1313 g_snprintf(string_buff, DETAILS_STR_MAX, "%u", tls->MaxOffLoadSize);
1314 add_string_to_table(table, row, "Max Offload Size", string_buff);
1315 g_snprintf(string_buff, DETAILS_STR_MAX, "%u", tls->MinSegmentCount);
1316 add_string_to_table(table, row, "Min Segment Count", string_buff);
1317 g_snprintf(string_buff, DETAILS_STR_MAX, "%s", tls->TcpOptions ? "Yes" : "No");
1318 add_string_to_table(table, row, "TCP option fields", string_buff);
1319 g_snprintf(string_buff, DETAILS_STR_MAX, "%s", tls->IpOptions ? "Yes" : "No");
1320 add_string_to_table(table, row, "IP option fields", string_buff);
1322 g_snprintf(string_buff, DETAILS_STR_MAX, "%u (unknown)", tls->Version);
1323 add_string_to_table(table, row, "Version", string_buff);
1328 g_snprintf(string_buff, DETAILS_STR_MAX, "Unknown task %u", of->Task);
1329 add_string_to_table(table, row, "Task", string_buff);
1333 add_string_to_table(table, row, "", "");
1335 valuep += of->OffsetNextTask;
1336 length -= of->OffsetNextTask;
1337 } while(of->OffsetNextTask != 0);
1340 if(TcpIpChecksumSupported == 0) {
1341 add_string_to_table(table, row, "TCP/IP Checksum", "");
1342 add_string_to_table(table, row, "Offload not supported", "-");
1345 if(IpSecSupported == 0) {
1346 add_string_to_table(table, row, "IpSec", "");
1347 add_string_to_table(table, row, "Offload not supported", "-");
1350 if(TcpLargeSendSupported == 0) {
1351 add_string_to_table(table, row, "TCP Large Send", "");
1352 add_string_to_table(table, row, "Offload not supported", "-");
1359 capture_if_details_general(GtkWidget *table, GtkWidget *main_vb, guint *row, LPADAPTER adapter, gchar *iface) {
1360 gchar string_buff[DETAILS_STR_MAX];
1361 const gchar *manuf_name;
1362 unsigned int uint_value;
1363 unsigned int uint_array[50];
1364 int uint_array_size;
1365 unsigned int physical_medium;
1367 unsigned char values[100];
1369 unsigned short ushort_value;
1374 add_string_to_table(table, row, "Characteristics", "");
1376 /* Vendor description */
1377 length = sizeof(values);
1378 if (wpcap_packet_request(adapter, OID_GEN_VENDOR_DESCRIPTION, FALSE /* !set */, values, &length)) {
1379 g_snprintf(string_buff, DETAILS_STR_MAX, "%s", values);
1382 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1384 add_string_to_table(table, row, "Vendor description", string_buff);
1387 add_string_to_table(table, row, "Interface", iface);
1389 /* link status (connected/disconnected) */
1390 if (wpcap_packet_request_uint(adapter, OID_GEN_MEDIA_CONNECT_STATUS, &uint_value)) {
1392 if(uint_value == 0) {
1393 add_string_to_table(table, row, "Link status", "Connected");
1395 add_string_to_table(table, row, "Link status", "Disconnected");
1398 add_string_to_table(table, row, "Link status", "-");
1402 if (wpcap_packet_request_uint(adapter, OID_GEN_LINK_SPEED, &uint_value)) {
1405 if(uint_value >= 1000 * 1000) {
1406 g_snprintf(string_buff, DETAILS_STR_MAX, "%d MBits/s", uint_value / 1000 / 1000);
1408 if(uint_value >= 1000) {
1409 g_snprintf(string_buff, DETAILS_STR_MAX, "%d KBits/s", uint_value / 1000);
1411 g_snprintf(string_buff, DETAILS_STR_MAX, "%d Bits/s", uint_value);
1415 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1417 add_string_to_table(table, row, "Link speed", string_buff);
1421 uint_array_size = sizeof(uint_array);
1422 if (wpcap_packet_request(adapter, OID_GEN_MEDIA_SUPPORTED, FALSE /* !set */, (char *) uint_array, &uint_array_size)) {
1424 uint_array_size /= sizeof(unsigned int);
1426 while(uint_array_size--) {
1427 add_string_to_table(table, row, "Media supported",
1428 val_to_str(uint_array[i], win32_802_3_medium_vals, "(0x%x)"));
1432 add_string_to_table(table, row, "Media supported", "-");
1435 uint_array_size = sizeof(uint_array);
1436 if (wpcap_packet_request(adapter, OID_GEN_MEDIA_IN_USE, FALSE /* !set */, (char *) uint_array, &uint_array_size)) {
1438 uint_array_size /= sizeof(unsigned int);
1440 while(uint_array_size--) {
1441 add_string_to_table(table, row, "Medium in use",
1442 val_to_str(uint_array[i], win32_802_3_medium_vals, "(0x%x)"));
1446 add_string_to_table(table, row, "Medium in use", "-");
1449 if (wpcap_packet_request_uint(adapter, OID_GEN_PHYSICAL_MEDIUM, &physical_medium)) {
1451 add_string_to_table(table, row, "Physical medium",
1452 val_to_str(physical_medium, win32_802_3_physical_medium_vals, "(0x%x)"));
1454 add_string_to_table(table, row, "Physical medium", "-");
1457 length = sizeof(ushort_value);
1458 if (wpcap_packet_request(adapter, OID_GEN_DRIVER_VERSION, FALSE /* !set */, (char *) &ushort_value, &length)) {
1460 g_snprintf(string_buff, DETAILS_STR_MAX, "%u.%u", ushort_value / 0x100, ushort_value % 0x100);
1462 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1464 add_string_to_table(table, row, "NDIS Driver Version", string_buff);
1466 length = sizeof(uint_value);
1467 if (wpcap_packet_request(adapter, OID_GEN_VENDOR_DRIVER_VERSION, FALSE /* !set */, (char *) &uint_value, &length)) {
1469 /* XXX - what's the correct output format? */
1470 g_snprintf(string_buff, DETAILS_STR_MAX, "%u.%u (Hex: %X.%X)",
1471 (uint_value / 0x10000 ) % 0x10000,
1472 uint_value % 0x10000,
1473 (uint_value / 0x10000 ) % 0x10000,
1474 uint_value % 0x10000);
1476 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1478 add_string_to_table(table, row, "Vendor Driver Version", string_buff);
1480 length = sizeof(values);
1481 if (wpcap_packet_request(adapter, OID_GEN_VENDOR_ID, FALSE /* !set */, values, &length)) {
1483 manuf_name = get_manuf_name_if_known(values);
1484 if(manuf_name != NULL) {
1485 g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X (%s) NIC: %02X",
1486 values[0], values[1], values[2], manuf_name, values[3]);
1488 g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X NIC: %02X",
1489 values[0], values[1], values[2], values[3]);
1492 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1494 add_string_to_table(table, row, "Vendor ID", string_buff);
1496 if (wpcap_packet_request_uint(adapter, OID_GEN_MAC_OPTIONS, &uint_value)) {
1498 g_snprintf(string_buff, DETAILS_STR_MAX,
1499 "802.1P Priority: %s, 802.1Q VLAN: %s",
1500 (uint_value & NDIS_MAC_OPTION_8021P_PRIORITY) ? "Supported" : "Unsupported",
1501 (uint_value & NDIS_MAC_OPTION_8021Q_VLAN) ? "Supported" : "Unsupported" );
1503 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1505 add_string_to_table(table, row, "MAC Options", string_buff);
1507 if (wpcap_packet_request_uint(adapter, OID_GEN_VLAN_ID, &uint_value)) {
1509 g_snprintf(string_buff, DETAILS_STR_MAX, "%u", uint_value);
1511 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1513 add_string_to_table(table, row, "VLAN ID", string_buff);
1516 /* value seems to be constant */
1517 if (wpcap_packet_request_uint(adapter, OID_GEN_CURRENT_PACKET_FILTER, &uint_value)) {
1519 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1521 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1523 add_string_to_table(table, row, "Packet filter", string_buff);
1526 if (wpcap_packet_request_uint(adapter, OID_GEN_TRANSMIT_BUFFER_SPACE, &uint_value)) {
1528 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1530 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1532 add_string_to_table(table, row, "Transmit Buffer Space", string_buff);
1534 if (wpcap_packet_request_uint(adapter, OID_GEN_RECEIVE_BUFFER_SPACE, &uint_value)) {
1536 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1538 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1540 add_string_to_table(table, row, "Receive Buffer Space", string_buff);
1542 if (wpcap_packet_request_uint(adapter, OID_GEN_TRANSMIT_BLOCK_SIZE , &uint_value)) {
1544 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1546 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1548 add_string_to_table(table, row, "Transmit Block Size", string_buff);
1550 if (wpcap_packet_request_uint(adapter, OID_GEN_RECEIVE_BLOCK_SIZE, &uint_value)) {
1552 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1554 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1556 add_string_to_table(table, row, "Receive Block Size", string_buff);
1558 if (wpcap_packet_request_uint(adapter, OID_GEN_MAXIMUM_TOTAL_SIZE, &uint_value)) {
1560 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1562 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1564 add_string_to_table(table, row, "Maximum Packet Size", string_buff);
1571 capture_if_details_stats(GtkWidget *table, GtkWidget *main_vb, guint *row, LPADAPTER adapter) {
1572 gchar string_buff[DETAILS_STR_MAX];
1573 unsigned int uint_value;
1577 add_string_to_table(table, row, "Statistics", "");
1579 if (wpcap_packet_request_uint(adapter, OID_GEN_XMIT_OK, &uint_value)) {
1581 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1583 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1585 add_string_to_table(table, row, "Transmit OK", string_buff);
1587 if (wpcap_packet_request_uint(adapter, OID_GEN_XMIT_ERROR, &uint_value)) {
1589 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1591 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1593 add_string_to_table(table, row, "Transmit Error", string_buff);
1596 if (wpcap_packet_request_uint(adapter, OID_GEN_RCV_OK, &uint_value)) {
1598 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1600 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1602 add_string_to_table(table, row, "Receive OK", string_buff);
1604 if (wpcap_packet_request_uint(adapter, OID_GEN_RCV_ERROR, &uint_value)) {
1606 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1608 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1610 add_string_to_table(table, row, "Receive Error", string_buff);
1612 if (wpcap_packet_request_uint(adapter, OID_GEN_RCV_NO_BUFFER, &uint_value)) {
1614 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1616 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1618 add_string_to_table(table, row, "Receive but no Buffer", string_buff);
1620 if (wpcap_packet_request_uint(adapter, OID_GEN_DIRECTED_BYTES_XMIT, &uint_value)) {
1622 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1624 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1626 add_string_to_table(table, row, "Directed bytes transmitted w/o errors", string_buff);
1628 if (wpcap_packet_request_uint(adapter, OID_GEN_DIRECTED_FRAMES_XMIT, &uint_value)) {
1630 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1632 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1634 add_string_to_table(table, row, "Directed packets transmitted w/o errors", string_buff);
1636 if (wpcap_packet_request_uint(adapter, OID_GEN_MULTICAST_BYTES_XMIT, &uint_value)) {
1638 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1640 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1642 add_string_to_table(table, row, "Multicast bytes transmitted w/o errors", string_buff);
1644 if (wpcap_packet_request_uint(adapter, OID_GEN_MULTICAST_FRAMES_XMIT, &uint_value)) {
1646 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1648 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1650 add_string_to_table(table, row, "Multicast packets transmitted w/o errors", string_buff);
1652 if (wpcap_packet_request_uint(adapter, OID_GEN_BROADCAST_BYTES_XMIT, &uint_value)) {
1654 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1656 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1658 add_string_to_table(table, row, "Broadcast bytes transmitted w/o errors", string_buff);
1660 if (wpcap_packet_request_uint(adapter, OID_GEN_BROADCAST_FRAMES_XMIT, &uint_value)) {
1662 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1664 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1666 add_string_to_table(table, row, "Broadcast packets transmitted w/o errors", string_buff);
1668 if (wpcap_packet_request_uint(adapter, OID_GEN_DIRECTED_BYTES_RCV, &uint_value)) {
1670 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1672 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1674 add_string_to_table(table, row, "Directed bytes received w/o errors", string_buff);
1676 if (wpcap_packet_request_uint(adapter, OID_GEN_DIRECTED_FRAMES_RCV, &uint_value)) {
1678 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1680 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1682 add_string_to_table(table, row, "Directed packets received w/o errors", string_buff);
1684 if (wpcap_packet_request_uint(adapter, OID_GEN_MULTICAST_BYTES_RCV, &uint_value)) {
1686 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1688 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1690 add_string_to_table(table, row, "Multicast bytes received w/o errors", string_buff);
1692 if (wpcap_packet_request_uint(adapter, OID_GEN_MULTICAST_FRAMES_RCV, &uint_value)) {
1694 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1696 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1698 add_string_to_table(table, row, "Multicast packets received w/o errors", string_buff);
1700 if (wpcap_packet_request_uint(adapter, OID_GEN_BROADCAST_BYTES_RCV, &uint_value)) {
1702 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1704 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1706 add_string_to_table(table, row, "Broadcast bytes received w/o errors", string_buff);
1708 if (wpcap_packet_request_uint(adapter, OID_GEN_BROADCAST_FRAMES_RCV, &uint_value)) {
1710 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1712 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1714 add_string_to_table(table, row, "Broadcast packets received w/o errors", string_buff);
1716 if (wpcap_packet_request_uint(adapter, OID_GEN_RCV_CRC_ERROR, &uint_value)) {
1718 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1720 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1722 add_string_to_table(table, row, "Packets received with CRC or FCS errors", string_buff);
1724 if (wpcap_packet_request_uint(adapter, OID_GEN_TRANSMIT_QUEUE_LENGTH, &uint_value)) {
1726 g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
1728 g_snprintf(string_buff, DETAILS_STR_MAX, "-");
1730 add_string_to_table(table, row, "Packets queued for transmission", string_buff);
1737 capture_if_details_page_new(GtkWidget **table)
1741 main_vb = gtk_vbox_new(FALSE, 6);
1742 gtk_container_border_width(GTK_CONTAINER(main_vb), 12);
1745 *table = gtk_table_new(1, 2, FALSE);
1746 gtk_table_set_col_spacings(GTK_TABLE(*table), 6);
1747 gtk_table_set_row_spacings(GTK_TABLE(*table), 3);
1748 gtk_container_add(GTK_CONTAINER(main_vb), *table);
1755 capture_if_details_open_win(char *iface)
1757 GtkWidget *details_open_w,
1758 *main_vb, *bbox, *close_bt, *help_bt;
1759 GtkWidget *page_general, *page_stats, *page_802_3, *page_802_11, *page_task_offload;
1761 GtkWidget *table, *notebook, *label;
1767 /* open the network adapter */
1768 adapter = wpcap_packet_open(iface);
1770 /* open a new window */
1771 details_open_w = window_new(GTK_WINDOW_TOPLEVEL, "Ethereal: Interface Details");
1773 /* Container for the window contents */
1774 main_vb = gtk_vbox_new(FALSE, 12);
1775 gtk_container_border_width(GTK_CONTAINER(main_vb), 12);
1776 gtk_container_add(GTK_CONTAINER(details_open_w), main_vb);
1779 notebook = gtk_notebook_new();
1780 gtk_container_add(GTK_CONTAINER(main_vb), notebook);
1783 page_general = capture_if_details_page_new(&table);
1784 page_lb = gtk_label_new("General");
1785 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page_general, page_lb);
1787 entries = capture_if_details_general(table, page_general, &row, adapter, iface);
1789 gtk_widget_set_sensitive(page_lb, FALSE);
1792 /* Statistics page */
1793 page_stats = capture_if_details_page_new(&table);
1794 page_lb = gtk_label_new("Statistics");
1795 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page_stats, page_lb);
1797 entries = capture_if_details_stats(table, page_stats, &row, adapter);
1799 gtk_widget_set_sensitive(page_lb, FALSE);
1802 /* 802.3 (Ethernet) page */
1803 page_802_3 = capture_if_details_page_new(&table);
1804 page_lb = gtk_label_new("802.3 (Ethernet)");
1805 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page_802_3, page_lb);
1807 entries = capture_if_details_802_3(table, page_802_3, &row, adapter);
1809 gtk_widget_set_sensitive(page_lb, FALSE);
1812 /* 802_11 (WI-FI) page */
1813 page_802_11 = capture_if_details_page_new(&table);
1814 page_lb = gtk_label_new("802.11 (WLAN)");
1815 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page_802_11, page_lb);
1817 entries = capture_if_details_802_11(table, page_802_11, &row, adapter);
1819 gtk_widget_set_sensitive(page_lb, FALSE);
1822 /* Task offload page */
1823 page_task_offload = capture_if_details_page_new(&table);
1824 page_lb = gtk_label_new("Task Offload");
1825 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page_task_offload, page_lb);
1827 entries = capture_if_details_task_offload(table, page_task_offload, &row, adapter);
1829 gtk_widget_set_sensitive(page_lb, FALSE);
1832 wpcap_packet_close(adapter);
1834 label = gtk_label_new("Note: accuracy of all of these values are only relying on the network card driver!");
1835 gtk_container_add(GTK_CONTAINER(main_vb), label);
1838 if(topic_available(HELP_CAPTURE_INTERFACES_DETAILS_DIALOG)) {
1839 bbox = dlg_button_row_new(GTK_STOCK_CLOSE, GTK_STOCK_HELP, NULL);
1841 bbox = dlg_button_row_new(GTK_STOCK_CLOSE, NULL);
1843 gtk_container_add(GTK_CONTAINER(main_vb), bbox);
1845 close_bt = OBJECT_GET_DATA(bbox, GTK_STOCK_CLOSE);
1846 window_set_cancel_button(details_open_w, close_bt, window_cancel_button_cb);
1848 if(topic_available(HELP_CAPTURE_INTERFACES_DETAILS_DIALOG)) {
1849 help_bt = OBJECT_GET_DATA(bbox, GTK_STOCK_HELP);
1850 SIGNAL_CONNECT(help_bt, "clicked", topic_cb, HELP_CAPTURE_INTERFACES_DETAILS_DIALOG);
1853 gtk_widget_grab_focus(close_bt);
1855 SIGNAL_CONNECT(details_open_w, "delete_event", window_delete_event_cb, NULL);
1857 gtk_widget_show_all(details_open_w);
1858 window_present(details_open_w);
1862 static void capture_if_details_open_answered_cb(gpointer dialog _U_, gint btn, gpointer data)
1866 capture_if_details_open_win(data);
1868 case(ESD_BTN_CANCEL):
1871 g_assert_not_reached();
1877 capture_if_details_open(char *iface)
1880 gboolean version_ok = FALSE;
1884 /* check packet.dll version */
1885 version = wpcap_packet_get_version();
1887 if(version == NULL) {
1888 /* couldn't even get the packet.dll version, must be a very old one or just not existing -> give up */
1889 /* (this seems to be the case for 2.3 beta and all previous releases) */
1890 simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK,
1891 PRIMARY_TEXT_START "Couldn't optain WinPcap packet.dll version!" PRIMARY_TEXT_END
1892 "\n\nThe WinPcap packet.dll is not installed or the version you use seems to be very old!"
1893 "\n\nPlease update/install WinPcap.");
1897 /* XXX - add more known DLL versions here */
1898 /* (all versions since the 2.3 release seems to be working (although the 2.3 beta did not) */
1899 if( strcmp(version, "3, 1, 0, 27") == 0 || /* 3.1 release */
1900 strcmp(version, "3, 1, 0, 24") == 0 || /* 3.1 beta 4 */
1901 strcmp(version, "3, 1, 0, 23") == 0 || /* 3.1 beta 3 */
1902 strcmp(version, "3, 1, 0, 22") == 0 || /* 3.1 beta 2 */
1903 strcmp(version, "3, 1, 0, 20") == 0 || /* 3.1 beta */
1904 strcmp(version, "3.0 alpha3" ) == 0 || /* 3.0 release or 3.0 beta (yes, both versions report alpha3!) */
1905 strcmp(version, "2.3" ) == 0 /* 2.3 release */
1911 /* packet.dll version not known to us, warn user but try to continue */
1912 dialog = simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK | ESD_BTN_CANCEL,
1913 PRIMARY_TEXT_START "Unknown WinPcap version might crash or fail!" PRIMARY_TEXT_END
1914 "\n\nThe WinPcap packet.dll version \"%s\" is unknown if it supports required functions!"
1915 "\n\nOnly WinPcap versions 3.0 and 3.1 are known to work with this feature."
1916 "\n\nCrashes or unexpected behaviour might occur, you have been warned!"
1917 "\n\nContinue anyway?",
1919 simple_dialog_set_cb(dialog, capture_if_details_open_answered_cb, iface);
1921 capture_if_details_open_win(iface);
1926 #endif /* HAVE_LIBPCAP && _WIN32 */