*
* $Id$
*
- * Ethereal - Network traffic analyzer
- * By Gerald Combs <gerald@ethereal.com>
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
* Copyright 1998 Gerald Combs
*
* This program is free software; you can redistribute it and/or
#include <epan/value_string.h>
#include <epan/addr_resolv.h>
-#ifndef HAVE_SOCKADDR_STORAGE
-/* packet32.h requires sockaddr_storage (usually defined in Platform SDK)
+#if GTK_MAJOR_VERSION >= 2
+#include "gtkvumeter.h"
+#endif
+
+/* packet32.h requires sockaddr_storage
+ * wether sockaddr_storage is defined or not depends on the Platform SDK
+ * version installed. The only one not defining it is the SDK that comes
+ * with MSVC 6.0 (WINVER 0x0400).
+ *
* copied from RFC2553 (and slightly modified because of datatypes) ...
* XXX - defined more than once, move this to a header file */
+#if (WINVER <= 0x0400) && defined(_MSC_VER)
typedef unsigned short eth_sa_family_t;
/*
/* __ss_pad1, __ss_align fields is 112 */
};
/* ... copied from RFC2553 */
-#endif
-
+#endif /* WINVER */
#include <Packet32.h>
#include <windows.h>
#define DETAILS_STR_MAX 1024
+/* The informations and definitions used here are coming from various places on the web:
+ *
+ * ndiswrapper (various NDIS related definitions)
+ * http://cvs.sourceforge.net/viewcvs.py/ndiswrapper/ndiswrapper/driver/
+ *
+ * ReactOS (various NDIS related definitions)
+ * http://www.reactos.org/generated/doxygen/d2/d6d/ndis_8h-source.html
+ *
+ * IEEE802.11 "Detailed NDIS OID Log for a 802.11b Miniport"
+ * http://www.ndis.com/papers/ieee802_11_log.htm
+ *
+ * FreeBSD (various NDIS related definitions)
+ * http://lists.freebsd.org/pipermail/p4-projects/2004-January/003433.html
+ *
+ * MS WHDC "Network Drivers and Windows"
+ * http://www.microsoft.com/whdc/archive/netdrv_up.mspx
+ *
+ * IEEE "Get IEEE 802" (the various 802.11 docs)
+ * http://standards.ieee.org/getieee802/802.11.html
+ *
+ * MS MSDN "Network Devices: Windows Driver Kit"
+ * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/NetXP_r/hh/NetXP_r/netref_4c297a96-2ba5-41ed-ab21-b7a9cfaa9b4d.xml.asp
+ *
+ * MS MSDN "Microsoft Windows CE .NET 4.2 Network Driver Reference"
+ * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceddk40/html/cxgrfNetworkDriverReference.asp
+ *
+ * MS MSDN (some explanations of a special MS 802.11 Information Element)
+ * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/randz/protocol/securing_public_wi-fi_hotspots.asp
+ *
+ * "WLANINFO für Windows XP"
+ * http://www-pc.uni-regensburg.de/systemsw/TOOLS/wlaninfo.htm
+ */
-/******************************************************************************************************************************/
+/********************************************************************************/
/* definitions that would usually come from the windows DDK (device driver kit) */
/* and are not part of the ntddndis.h file delivered with WinPcap */
-/* Required OIDs (from ndiswrapper) */
+/* Required OIDs */
#define OID_GEN_VLAN_ID 0x0001021C
-/* Optional OIDs (from ndiswrapper) */
+/* Optional OIDs */
#define OID_GEN_MEDIA_CAPABILITIES 0x00010201
#define OID_GEN_PHYSICAL_MEDIUM 0x00010202
+/* Optional OIDs */
+#define OID_GEN_NETWORK_LAYER_ADDRESSES 0x00010118
+#define OID_GEN_TRANSPORT_HEADER_OFFSET 0x00010119
+
-/* Physical medium (OID_GEN_PHYSICAL_MEDIUM) (from ndiswrapper) */
+/* Physical medium (OID_GEN_PHYSICAL_MEDIUM) */
typedef enum ndis_phys_medium {
NdisPhysicalMediumUnspecified,
NdisPhysicalMediumWirelessLan,
NdisPhysicalMediumMax
};
-
-/* 802.11 OIDs (from ndiswrapper), see also: */
-/* http://www.ndis.com/papers/ieee802_11_log.htm */
-/* http://lists.freebsd.org/pipermail/p4-projects/2004-January/003433.html */
+/* flag definitions for OID_GEN_MAC_OPTIONS */
+#define NDIS_MAC_OPTION_COPY_LOOKAHEAD_DATA 0x00000001
+#define NDIS_MAC_OPTION_RECEIVE_SERIALIZED 0x00000002
+#define NDIS_MAC_OPTION_TRANSFERS_NOT_PEND 0x00000004
+#define NDIS_MAC_OPTION_NO_LOOPBACK 0x00000008
+#define NDIS_MAC_OPTION_FULL_DUPLEX 0x00000010
+#define NDIS_MAC_OPTION_EOTX_INDICATION 0x00000020
+#define NDIS_MAC_OPTION_8021P_PRIORITY 0x00000040
+#define NDIS_MAC_OPTION_8021Q_VLAN 0x00000080
+
+/* 802.11 OIDs */
#define OID_802_11_BSSID 0x0D010101
#define OID_802_11_SSID 0x0D010102
#define OID_802_11_NETWORK_TYPES_SUPPORTED 0x0D010203
#define OID_802_11_CAPABILITY 0x0D010122
#define OID_802_11_PMKID 0x0D010123
-/* Currently associated SSID (OID_802_11_SSID) (from ndiswrapper) */
+
+/* PnP and power management OIDs */
+#define OID_PNP_CAPABILITIES 0xFD010100
+#define OID_PNP_SET_POWER 0xFD010101
+#define OID_PNP_QUERY_POWER 0xFD010102
+#define OID_PNP_ADD_WAKE_UP_PATTERN 0xFD010103
+#define OID_PNP_REMOVE_WAKE_UP_PATTERN 0xFD010104
+#define OID_PNP_WAKE_UP_PATTERN_LIST 0xFD010105
+#define OID_PNP_ENABLE_WAKE_UP 0xFD010106
+
+
+/* Currently associated SSID (OID_802_11_SSID) */
#define NDIS_ESSID_MAX_SIZE 32
struct ndis_essid {
ULONG length;
UCHAR essid[NDIS_ESSID_MAX_SIZE];
};
-/* Current infrastructure mode (OID_802_11_INFRASTRUCTURE_MODE) (from ndiswrapper) */
+/* Current infrastructure mode (OID_802_11_INFRASTRUCTURE_MODE) */
enum network_infrastructure {
Ndis802_11IBSS,
Ndis802_11Infrastructure,
Ndis802_11InfrastructureMax
};
-/* Current authentication mode (OID_802_11_AUTHENTICATION_MODE) (from ndiswrapper) */
+/* Current authentication mode (OID_802_11_AUTHENTICATION_MODE) */
enum authentication_mode {
Ndis802_11AuthModeOpen,
Ndis802_11AuthModeShared,
Ndis802_11AuthModeMax
};
-/* Current network type (OID_802_11_NETWORK_TYPES_SUPPORTED / OID_802_11_NETWORK_TYPE_IN_USE) (from ndiswrapper) */
+/* Current network type (OID_802_11_NETWORK_TYPES_SUPPORTED / OID_802_11_NETWORK_TYPE_IN_USE) */
enum network_type {
Ndis802_11FH,
Ndis802_11DS,
Ndis802_11NetworkTypeMax = Ndis802_11Automode
};
-/* Current encryption status (OID_802_11_ENCRYPTION_STATUS) (from ndiswrapper) */
+/* Current encryption status (OID_802_11_ENCRYPTION_STATUS) */
enum encryption_status {
Ndis802_11WEPEnabled,
Ndis802_11Encryption1Enabled = Ndis802_11WEPEnabled,
};
-/* some definitions needed for the following structs (from ndiswrapper) */
+/* some definitions needed for the following structs */
#define NDIS_MAX_RATES_EX 16
typedef UCHAR mac_address[/* ETH_ALEN */ 6];
typedef UCHAR ndis_rates[NDIS_MAX_RATES_EX];
-/* configuration, e.g. frequency (OID_802_11_CONFIGURATION / OID_802_11_BSSID_LIST) (from ndiswrapper) */
+/* configuration, e.g. frequency (OID_802_11_CONFIGURATION / OID_802_11_BSSID_LIST) */
struct /*packed*/ ndis_configuration {
ULONG length;
ULONG beacon_period;
} fh_config;
};
-/* bssid list item (OID_802_11_BSSID_LIST) (from ndiswrapper) */
+/* bssid list item (OID_802_11_BSSID_LIST) */
struct ndis_ssid_item {
ULONG length;
mac_address mac;
};
-/* bssid list (OID_802_11_BSSID_LIST) (from ndiswrapper) */
+typedef struct _NDIS_802_11_FIXED_IEs
+{
+ UCHAR Timestamp[8];
+ USHORT BeaconInterval;
+ USHORT Capabilities;
+} NDIS_802_11_FIXED_IEs, *PNDIS_802_11_FIXED_IEs;
+
+
+/* bssid list (OID_802_11_BSSID_LIST) */
struct ndis_bssid_list {
ULONG num_items;
struct ndis_ssid_item items[1];
};
-/******************************************************************************************************************************/
-/* OID_TCP_TASK_OFFLOAD specific definitions that would usually come from the windows DDK (device driver kit) */
-/* and are not part of the ntddndis.h file delivered with WinPcap */
+/******************************************************************************/
+/* OID_TCP_TASK_OFFLOAD specific definitions that would usually come from the */
+/* windows DDK (device driver kit) and are not part of the ntddndis.h file */
+/* delivered with WinPcap */
-/* optional OID (from http://www.ndis.com/papers/ieee802_11_log.htm) */
+/* optional OID */
#define OID_TCP_TASK_OFFLOAD 0xFC010201
-/* task id's (from ReactOS) */
+/* task id's */
typedef enum _NDIS_TASK {
TcpIpChecksumNdisTask,
IpSecNdisTask,
MaxNdisTask
} NDIS_TASK, *PNDIS_TASK;
-/* TaskBuffer content on TcpIpChecksumNdisTask (from ReactOS) */
+/* TaskBuffer content on TcpIpChecksumNdisTask */
typedef struct _NDIS_TASK_TCP_IP_CHECKSUM
{
struct
ULONG UdpChecksum:1;
ULONG IpChecksum:1;
} V4Transmit;
-
+
struct
{
ULONG IpOptionsSupported:1;
ULONG UdpChecksum:1;
ULONG IpChecksum:1;
} V4Receive;
-
+
struct
{
ULONG IpOptionsSupported:1;
ULONG TcpChecksum:1;
ULONG UdpChecksum:1;
} V6Transmit;
-
+
struct
{
ULONG IpOptionsSupported:1;
} V6Receive;
} NDIS_TASK_TCP_IP_CHECKSUM, *PNDIS_TASK_TCP_IP_CHECKSUM;
-/* TaskBuffer content on TcpLargeSendNdisTask (from ReactOS) */
+/* TaskBuffer content on TcpLargeSendNdisTask */
typedef struct _NDIS_TASK_TCP_LARGE_SEND
{
ULONG Version;
BOOLEAN IpOptions;
} NDIS_TASK_TCP_LARGE_SEND, *PNDIS_TASK_TCP_LARGE_SEND;
-/* Encapsulations (from ReactOs) */
+/* Encapsulations */
typedef enum _NDIS_ENCAPSULATION {
UNSPECIFIED_Encapsulation,
NULL_Encapsulation,
LLC_SNAP_BRIDGED_Encapsulation
} NDIS_ENCAPSULATION;
-/* Encapsulation format (from ReactOs) */
+/* Encapsulation format */
typedef struct _NDIS_ENCAPSULATION_FORMAT {
NDIS_ENCAPSULATION Encapsulation;
struct {
ULONG EncapsulationHeaderSize;
} NDIS_ENCAPSULATION_FORMAT, *PNDIS_ENCAPSULATION_FORMAT;
-/* request struct (from http://www.microsoft.com/whdc/archive/netdrv_up.mspx) */
+/* request struct */
typedef struct _NDIS_TASK_OFFLOAD_HEADER
{
ULONG Version;
NDIS_ENCAPSULATION_FORMAT EncapsulationFormat;
} NDIS_TASK_OFFLOAD_HEADER, *PNDIS_TASK_OFFLOAD_HEADER;
-/* response struct (from ReactOS) */
+/* response struct */
#define NDIS_TASK_OFFLOAD_VERSION 1
typedef struct _NDIS_TASK_OFFLOAD
{
} NDIS_TASK_OFFLOAD, *PNDIS_TASK_OFFLOAD;
-/******************************************************************************************************************************/
+/***********************************************************************/
/* value_string's for info functions */
static const value_string win32_802_3_physical_medium_vals[] = {
{ NdisPhysicalMediumUnspecified, "Unspecified" },
{ NdisPhysicalMediumWirelessLan, "Wireless LAN" },
- { NdisPhysicalMediumCableModem, "Cable Modem" },
+ { NdisPhysicalMediumCableModem, "Cable Modem (DOCSIS)" },
{ NdisPhysicalMediumPhoneLine, "Phone Line" },
{ NdisPhysicalMediumPowerLine, "Power Line" },
{ NdisPhysicalMediumDSL, "DSL" },
{ Ndis802_11AuthModeShared, "Shared Key" },
{ Ndis802_11AuthModeAutoSwitch, "Auto Switch" },
{ Ndis802_11AuthModeWPA, "WPA" },
- { Ndis802_11AuthModeWPAPSK, "WPA (pre shared key)" },
+ { Ndis802_11AuthModeWPAPSK, "WPA-PSK (pre shared key)" },
{ Ndis802_11AuthModeWPANone, "WPA (ad hoc)" },
{ Ndis802_11AuthModeWPA2, "WPA2" },
- { Ndis802_11AuthModeWPA2PSK, "WPA2 (pre shared key)" },
+ { Ndis802_11AuthModeWPA2PSK, "WPA2-PSK (pre shared key)" },
{ 0, NULL }
};
{ 0, NULL }
};
-/* XXX - add some explanations */
static const value_string win32_802_11_encryption_status_vals[] = {
- { Ndis802_11Encryption1Enabled, "Encryption 1 Enabled" },
- { Ndis802_11EncryptionDisabled, "Encryption Disabled" },
- { Ndis802_11Encryption1KeyAbsent, "Encryption 1 Key Absent" },
- { Ndis802_11EncryptionNotSupported, "Encryption Not Supported" },
- { Ndis802_11Encryption2Enabled, "Encryption 2 Enabled" },
- { Ndis802_11Encryption2KeyAbsent, "Encryption 2 Key Absent" },
- { Ndis802_11Encryption3Enabled, "Encryption 3 Enabled" },
- { Ndis802_11Encryption3KeyAbsent, "Encryption 3 Key Absent" },
+ { Ndis802_11Encryption1Enabled, "WEP enabled, TKIP & AES disabled, transmit key available" },
+ { Ndis802_11EncryptionDisabled, "WEP & TKIP & AES disabled, transmit key available" },
+ { Ndis802_11Encryption1KeyAbsent, "WEP enabled, TKIP & AES disabled, transmit key unavailable" },
+ { Ndis802_11EncryptionNotSupported, "WEP & TKIP & AES not supported" },
+ { Ndis802_11Encryption2Enabled, "WEP & TKIP enabled, AES disabled, transmit key available" },
+ { Ndis802_11Encryption2KeyAbsent, "WEP & TKIP enabled, AES disabled, transmit key unavailable" },
+ { Ndis802_11Encryption3Enabled, "WEP & TKIP & AES enabled, transmit key available" },
+ { Ndis802_11Encryption3KeyAbsent, "WEP & TKIP & AES enabled, transmit key unavailable" },
+ { 0, NULL }
+};
+
+/* frequency to channel mapping (OID_802_11_CONFIGURATION) */
+static const value_string win32_802_11_channel_freq_vals[] = {
+ { 2412000, "1 (2412 MHz)" },
+ { 2417000, "2 (2417 MHz)" },
+ { 2422000, "3 (2422 MHz)" },
+ { 2427000, "4 (2427 MHz)" },
+ { 2432000, "5 (2432 MHz)" },
+ { 2437000, "6 (2437 MHz)" },
+ { 2442000, "7 (2442 MHz)" },
+ { 2447000, "8 (2447 MHz)" },
+ { 2452000, "9 (2452 MHz)" },
+ { 2457000, "10 (2457 MHz)" },
+ { 2462000, "11 (2462 MHz)" },
+ { 2467000, "12 (2467 MHz)" },
+ { 2472000, "13 (2472 MHz)" },
+ { 2484000, "14 (2484 MHz)" },
{ 0, NULL }
};
/* frequency to channel mapping (OID_802_11_CONFIGURATION) */
static const value_string win32_802_11_channel_vals[] = {
- { 2412000, "1 (2412000 kHz)" },
- { 2417000, "2 (2417000 kHz)" },
- { 2422000, "3 (2422000 kHz)" },
- { 2427000, "4 (2427000 kHz)" },
- { 2432000, "5 (2432000 kHz)" },
- { 2437000, "6 (2437000 kHz)" },
- { 2442000, "7 (2442000 kHz)" },
- { 2447000, "8 (2447000 kHz)" },
- { 2452000, "9 (2452000 kHz)" },
- { 2457000, "10 (2457000 kHz)" },
- { 2462000, "11 (2462000 kHz)" },
- { 2467000, "12 (2467000 kHz)" },
- { 2472000, "13 (2472000 kHz)" },
- { 2484000, "14 (2484000 kHz)" },
+ { 2412000, "1" },
+ { 2417000, "2" },
+ { 2422000, "3" },
+ { 2427000, "4" },
+ { 2432000, "5" },
+ { 2437000, "6" },
+ { 2442000, "7" },
+ { 2447000, "8" },
+ { 2452000, "9" },
+ { 2457000, "10" },
+ { 2462000, "11" },
+ { 2467000, "12" },
+ { 2472000, "13" },
+ { 2484000, "14" },
+ { 0, NULL }
+};
+
+
+/* ElementID in NDIS_802_11_VARIABLE_IEs */
+static const value_string ie_id_vals[] = {
+ { 0, "SSID, 802.11" },
+ { 1, "Supported Rates, 802.11" },
+ { 2, "FH Parameter Set, 802.11" },
+ { 3, "DS Parameter Set, 802.11" },
+ { 4, "CF Parameter Set, 802.11" },
+ { 5, "TIM, 802.11" },
+ { 6, "IBSS Parameter Set, 802.11" },
+ { 7, "Country, 802.11d" },
+ { 8, "Hopping Pattern Parameters, 802.11d" },
+ { 9, "Hopping Pattern Table, 802.11d" },
+ { 10, "Request, 802.11d" },
+ /* 11-15 reserved, 802.11d */
+ { 16, "Challenge text, 802.11" },
+ /* 17-31 reserved, 802.11h */
+ { 32, "Power Constraint, 802.11h" },
+ { 33, "Power Capability, 802.11h" },
+ { 34, "TPC Request, 802.11h" },
+ { 35, "TPC Report, 802.11h" },
+ { 36, "Supported Channels, 802.11h" },
+ { 37, "Channel Switch Announcement, 802.11h" },
+ { 38, "Measurement Request, 802.11h" },
+ { 39, "Measurement Report, 802.11h" },
+ { 40, "Quiet, 802.11h" },
+ { 41, "IBSS DFS, 802.11h" },
+ { 42, "ERP information, 802.11g" },
+ /* 43-47 reserved, 802.11i */
+ { 48, "WPA2/RSN (Robust Secure Network), 802.11i" },
+ /* 49 reserved, 802.11i */
+ { 50, "Extended Supported Rates, 802.11g" },
+ /* 51-255 reserved, 802.11g */
+ { 221, "WPA, (no 802.11!)" },
{ 0, NULL }
};
+static const value_string oid_vals[] = {
+ { OID_GEN_SUPPORTED_LIST, "OID_GEN_SUPPORTED_LIST" },
+ { OID_GEN_HARDWARE_STATUS, "OID_GEN_HARDWARE_STATUS (only internally interesting)" },
+ { OID_GEN_MEDIA_SUPPORTED, "OID_GEN_MEDIA_SUPPORTED" },
+ { OID_GEN_MEDIA_IN_USE, "OID_GEN_MEDIA_IN_USE" },
+ { OID_GEN_MAXIMUM_LOOKAHEAD, "OID_GEN_MAXIMUM_LOOKAHEAD (unused)" },
+ { OID_GEN_MAXIMUM_FRAME_SIZE, "OID_GEN_MAXIMUM_FRAME_SIZE (unused)" },
+ { OID_GEN_LINK_SPEED, "OID_GEN_LINK_SPEED" },
+ { OID_GEN_TRANSMIT_BUFFER_SPACE, "OID_GEN_TRANSMIT_BUFFER_SPACE" },
+ { OID_GEN_RECEIVE_BUFFER_SPACE, "OID_GEN_RECEIVE_BUFFER_SPACE" },
+ { OID_GEN_TRANSMIT_BLOCK_SIZE, "OID_GEN_TRANSMIT_BLOCK_SIZE" },
+ { OID_GEN_RECEIVE_BLOCK_SIZE, "OID_GEN_RECEIVE_BLOCK_SIZE" },
+ { OID_GEN_VENDOR_ID, "OID_GEN_VENDOR_ID" },
+ { OID_GEN_VENDOR_DESCRIPTION, "OID_GEN_VENDOR_DESCRIPTION" },
+ { OID_GEN_CURRENT_PACKET_FILTER, "OID_GEN_CURRENT_PACKET_FILTER (info seems to be constant)" },
+ { OID_GEN_CURRENT_LOOKAHEAD, "OID_GEN_CURRENT_LOOKAHEAD (only internally interesting)" },
+ { OID_GEN_DRIVER_VERSION, "OID_GEN_DRIVER_VERSION" },
+ { OID_GEN_MAXIMUM_TOTAL_SIZE, "OID_GEN_MAXIMUM_TOTAL_SIZE" },
+ { OID_GEN_PROTOCOL_OPTIONS, "OID_GEN_PROTOCOL_OPTIONS (info not interesting)" },
+ { OID_GEN_MAC_OPTIONS, "OID_GEN_MAC_OPTIONS" },
+ { OID_GEN_MEDIA_CONNECT_STATUS, "OID_GEN_MEDIA_CONNECT_STATUS" },
+ { OID_GEN_MAXIMUM_SEND_PACKETS, "OID_GEN_MAXIMUM_SEND_PACKETS (only internally interesting)" },
+ { OID_GEN_VENDOR_DRIVER_VERSION, "OID_GEN_VENDOR_DRIVER_VERSION" },
+ { OID_GEN_XMIT_OK, "OID_GEN_XMIT_OK" },
+ { OID_GEN_RCV_OK, "OID_GEN_RCV_OK" },
+ { OID_GEN_XMIT_ERROR, "OID_GEN_XMIT_ERROR" },
+ { OID_GEN_RCV_ERROR, "OID_GEN_RCV_ERROR" },
+ { OID_GEN_RCV_NO_BUFFER, "OID_GEN_RCV_NO_BUFFER" },
+ { OID_GEN_DIRECTED_BYTES_XMIT, "OID_GEN_DIRECTED_BYTES_XMIT" },
+ { OID_GEN_DIRECTED_FRAMES_XMIT, "OID_GEN_DIRECTED_FRAMES_XMIT" },
+ { OID_GEN_MULTICAST_BYTES_XMIT, "OID_GEN_MULTICAST_BYTES_XMIT" },
+ { OID_GEN_MULTICAST_FRAMES_XMIT, "OID_GEN_MULTICAST_FRAMES_XMIT" },
+ { OID_GEN_BROADCAST_BYTES_XMIT, "OID_GEN_BROADCAST_BYTES_XMIT" },
+ { OID_GEN_BROADCAST_FRAMES_XMIT, "OID_GEN_BROADCAST_FRAMES_XMIT" },
+ { OID_GEN_DIRECTED_BYTES_RCV, "OID_GEN_DIRECTED_BYTES_RCV" },
+ { OID_GEN_DIRECTED_FRAMES_RCV, "OID_GEN_DIRECTED_FRAMES_RCV" },
+ { OID_GEN_MULTICAST_BYTES_RCV, "OID_GEN_MULTICAST_BYTES_RCV" },
+ { OID_GEN_MULTICAST_FRAMES_RCV, "OID_GEN_MULTICAST_FRAMES_RCV" },
+ { OID_GEN_BROADCAST_BYTES_RCV, "OID_GEN_BROADCAST_BYTES_RCV" },
+ { OID_GEN_BROADCAST_FRAMES_RCV, "OID_GEN_BROADCAST_FRAMES_RCV" },
+ { OID_GEN_RCV_CRC_ERROR, "OID_GEN_RCV_CRC_ERROR" },
+ { OID_GEN_TRANSMIT_QUEUE_LENGTH, "OID_GEN_TRANSMIT_QUEUE_LENGTH" },
+ { OID_GEN_GET_TIME_CAPS, "OID_GEN_GET_TIME_CAPS (unsupp, unused)" },
+ { OID_GEN_GET_NETCARD_TIME, "OID_GEN_GET_NETCARD_TIME (unsupp, unused)" },
+
+ { OID_GEN_PHYSICAL_MEDIUM, "OID_GEN_PHYSICAL_MEDIUM" },
+ /*{ OID_GEN_MACHINE_NAME, "OID_GEN_MACHINE_NAME (unsupp, unused)" },*/
+ { OID_GEN_VLAN_ID, "OID_GEN_VLAN_ID" },
+ { OID_GEN_MEDIA_CAPABILITIES, "OID_GEN_MEDIA_CAPABILITIES (unsupp, unused)" },
+
+ { OID_GEN_NETWORK_LAYER_ADDRESSES, "OID_GEN_NETWORK_LAYER_ADDRESSES (write only)" },
+ { OID_GEN_TRANSPORT_HEADER_OFFSET, "OID_GEN_TRANSPORT_HEADER_OFFSET (write only)" },
+
+ { OID_802_3_PERMANENT_ADDRESS, "OID_802_3_PERMANENT_ADDRESS" },
+ { OID_802_3_CURRENT_ADDRESS, "OID_802_3_CURRENT_ADDRESS" },
+ { OID_802_3_MAXIMUM_LIST_SIZE, "OID_802_3_MAXIMUM_LIST_SIZE (unused)" },
+ { OID_802_3_MULTICAST_LIST, "OID_802_3_MULTICAST_LIST (unused)" }, /* XXX */
+ { OID_802_3_MAC_OPTIONS, "OID_802_3_MAC_OPTIONS (unsupp, unused)" },
+
+ { OID_802_3_RCV_ERROR_ALIGNMENT, "OID_802_3_RCV_ERROR_ALIGNMENT" },
+ { OID_802_3_XMIT_ONE_COLLISION, "OID_802_3_XMIT_ONE_COLLISION" },
+ { OID_802_3_XMIT_MORE_COLLISIONS, "OID_802_3_XMIT_MORE_COLLISIONS" },
+ { OID_802_3_XMIT_DEFERRED, "OID_802_3_XMIT_DEFERRED" },
+ { OID_802_3_XMIT_MAX_COLLISIONS, "OID_802_3_XMIT_MAX_COLLISIONS" },
+ { OID_802_3_RCV_OVERRUN, "OID_802_3_RCV_OVERRUN" },
+ { OID_802_3_XMIT_UNDERRUN, "OID_802_3_XMIT_UNDERRUN" },
+ { OID_802_3_XMIT_HEARTBEAT_FAILURE, "OID_802_3_XMIT_HEARTBEAT_FAILURE (unsupp, used)" },
+ { OID_802_3_XMIT_TIMES_CRS_LOST, "OID_802_3_XMIT_TIMES_CRS_LOST (unsupp, used)" },
+ { OID_802_3_XMIT_LATE_COLLISIONS, "OID_802_3_XMIT_LATE_COLLISIONS" },
+
+ { OID_802_11_BSSID, "OID_802_11_BSSID" },
+ { OID_802_11_SSID, "OID_802_11_SSID" },
+ { OID_802_11_NETWORK_TYPES_SUPPORTED, "OID_802_11_NETWORK_TYPES_SUPPORTED (info not interesting)" },
+ { OID_802_11_NETWORK_TYPE_IN_USE, "OID_802_11_NETWORK_TYPE_IN_USE" },
+ { OID_802_11_TX_POWER_LEVEL, "OID_802_11_TX_POWER_LEVEL (unsupp, used)" },
+ { OID_802_11_RSSI, "OID_802_11_RSSI" },
+ { OID_802_11_RSSI_TRIGGER, "OID_802_11_RSSI_TRIGGER (unsupp, unused)" },
+ { OID_802_11_INFRASTRUCTURE_MODE, "OID_802_11_INFRASTRUCTURE_MODE" },
+ { OID_802_11_FRAGMENTATION_THRESHOLD, "OID_802_11_FRAGMENTATION_THRESHOLD (unused)" },
+ { OID_802_11_RTS_THRESHOLD, "OID_802_11_RTS_THRESHOLD (unused)" },
+ { OID_802_11_NUMBER_OF_ANTENNAS, "OID_802_11_NUMBER_OF_ANTENNAS (unsupp, unused)" },
+ { OID_802_11_RX_ANTENNA_SELECTED, "OID_802_11_RX_ANTENNA_SELECTED (unsupp, unused)" },
+ { OID_802_11_TX_ANTENNA_SELECTED, "OID_802_11_TX_ANTENNA_SELECTED (unsupp, unused)" },
+ { OID_802_11_SUPPORTED_RATES, "OID_802_11_SUPPORTED_RATES" },
+ { OID_802_11_DESIRED_RATES, "OID_802_11_DESIRED_RATES (unsupp, used)" },
+ { OID_802_11_CONFIGURATION, "OID_802_11_CONFIGURATION" },
+ { OID_802_11_STATISTICS, "OID_802_11_STATISTICS (unsupp, unused)" },
+ { OID_802_11_ADD_WEP, "OID_802_11_ADD_WEP (write only)" },
+ { OID_802_11_REMOVE_WEP, "OID_802_11_REMOVE_WEP (write only)" },
+ { OID_802_11_DISASSOCIATE, "OID_802_11_DISASSOCIATE (write only)" },
+ { OID_802_11_POWER_MODE, "OID_802_11_POWER_MODE (info not interesting)" },
+ { OID_802_11_BSSID_LIST, "OID_802_11_BSSID_LIST" },
+ { OID_802_11_AUTHENTICATION_MODE, "OID_802_11_AUTHENTICATION_MODE" },
+ { OID_802_11_PRIVACY_FILTER, "OID_802_11_PRIVACY_FILTER (info not interesting)" },
+ { OID_802_11_BSSID_LIST_SCAN, "OID_802_11_BSSID_LIST_SCAN" },
+ { OID_802_11_WEP_STATUS, "OID_802_11_WEP_STATUS (info not interesting?)" },
+ { OID_802_11_ENCRYPTION_STATUS, "OID_802_11_ENCRYPTION_STATUS (unsupp, used)" },
+ { OID_802_11_RELOAD_DEFAULTS, "OID_802_11_RELOAD_DEFAULTS (write only)" },
+ { OID_802_11_ADD_KEY, "OID_802_11_ADD_KEY (write only)" },
+ { OID_802_11_REMOVE_KEY, "OID_802_11_REMOVE_KEY (write only)" },
+ { OID_802_11_ASSOCIATION_INFORMATION, "OID_802_11_ASSOCIATION_INFORMATION (unused)" }, /* XXX */
+ { OID_802_11_TEST, "OID_802_11_TEST (write only)" },
+ { OID_802_11_CAPABILITY, "OID_802_11_CAPABILITY (unsupp, unused)" },
+ { OID_802_11_PMKID, "OID_802_11_PMKID (unsupp, unused)" },
+
+ /* Token-Ring list is utterly incomplete (contains only the values for MS Loopback Driver) */
+ { OID_802_5_PERMANENT_ADDRESS, "OID_802_5_PERMANENT_ADDRESS (unused)" },
+ { OID_802_5_CURRENT_ADDRESS, "OID_802_5_CURRENT_ADDRESS (unused)" },
+ { OID_802_5_CURRENT_FUNCTIONAL, "OID_802_5_CURRENT_FUNCTIONAL (unused)" },
+ { OID_802_5_CURRENT_GROUP, "OID_802_5_CURRENT_GROUP (unused)" },
+ { OID_802_5_LAST_OPEN_STATUS, "OID_802_5_LAST_OPEN_STATUS (unused)" },
+ { OID_802_5_CURRENT_RING_STATUS, "OID_802_5_CURRENT_RING_STATUS (unused)" },
+ { OID_802_5_CURRENT_RING_STATE, "OID_802_5_CURRENT_RING_STATE (unused)" },
+ { OID_802_5_LINE_ERRORS, "OID_802_5_LINE_ERRORS (unused)" },
+ { OID_802_5_LOST_FRAMES, "OID_802_5_LOST_FRAMES (unused)" },
+
+ /* FDDI list is utterly incomplete (contains only the values for MS Loopback Driver) */
+ { OID_FDDI_LONG_PERMANENT_ADDR, "OID_FDDI_LONG_PERMANENT_ADDR (unused)" },
+ { OID_FDDI_LONG_CURRENT_ADDR, "OID_FDDI_LONG_CURRENT_ADDR (unused)" },
+ { OID_FDDI_LONG_MULTICAST_LIST, "OID_FDDI_LONG_MULTICAST_LIST (unused)" },
+ { OID_FDDI_LONG_MAX_LIST_SIZE, "OID_FDDI_LONG_MAX_LIST_SIZE (unused)" },
+ { OID_FDDI_SHORT_PERMANENT_ADDR, "OID_FDDI_SHORT_PERMANENT_ADDR (unused)" },
+ { OID_FDDI_SHORT_CURRENT_ADDR, "OID_FDDI_SHORT_CURRENT_ADDR (unused)" },
+ { OID_FDDI_SHORT_MULTICAST_LIST, "OID_FDDI_SHORT_MULTICAST_LIST (unused)" },
+ { OID_FDDI_SHORT_MAX_LIST_SIZE, "OID_FDDI_SHORT_MAX_LIST_SIZE (unused)" },
+
+ /* LocalTalk list is utterly incomplete (contains only the values for MS Loopback Driver) */
+ { OID_LTALK_CURRENT_NODE_ID, "OID_LTALK_CURRENT_NODE_ID (unused)" },
+
+ /* Arcnet list is utterly incomplete (contains only the values for MS Loopback Driver) */
+ { OID_ARCNET_PERMANENT_ADDRESS, "OID_ARCNET_PERMANENT_ADDRESS (unused)" },
+ { OID_ARCNET_CURRENT_ADDRESS, "OID_ARCNET_CURRENT_ADDRESS (unused)" },
+
+ { OID_TCP_TASK_OFFLOAD, "OID_TCP_TASK_OFFLOAD" },
+
+ /* PnP and power management OIDs */
+ { OID_PNP_CAPABILITIES, "OID_PNP_CAPABILITIES (unused)" },
+ { OID_PNP_SET_POWER, "OID_PNP_SET_POWER (write only)" },
+ { OID_PNP_QUERY_POWER, "OID_PNP_QUERY_POWER (unused)" },
+ { OID_PNP_ADD_WAKE_UP_PATTERN, "OID_PNP_ADD_WAKE_UP_PATTERN (write only)" },
+ { OID_PNP_REMOVE_WAKE_UP_PATTERN, "OID_PNP_REMOVE_WAKE_UP_PATTERN (write only)" },
+ { OID_PNP_WAKE_UP_PATTERN_LIST, "OID_PNP_WAKE_UP_PATTERN_LIST (unused)" },
+ { OID_PNP_ENABLE_WAKE_UP, "OID_PNP_ENABLE_WAKE_UP (unused)" },
+
+ /* Unknown OID's (seen on an "Intel(R) PRO/Wireless 2200BG" 802.11 interface) */
+ { 0xFF100000, "Unknown 0xFF100000 (unused)" },
+ { 0xFF100002, "Unknown 0xFF100002 (unused)" },
+ { 0xFF100003, "Unknown 0xFF100003 (unused)" },
+ { 0xFF100004, "Unknown 0xFF100004 (unused)" },
+ { 0xFF100005, "Unknown 0xFF100005 (unused)" },
+ { 0xFF100006, "Unknown 0xFF100006 (unused)" },
+ { 0xFF100007, "Unknown 0xFF100007 (unused)" },
+ { 0xFF100009, "Unknown 0xFF100009 (unused)" },
+ { 0xFF10000b, "Unknown 0xFF10000b (unused)" },
+ { 0xFF10000c, "Unknown 0xFF10000c (unused)" },
+ { 0xFF10000e, "Unknown 0xFF10000e (unused)" },
+ { 0xFF10000f, "Unknown 0xFF10000f (unused)" },
+ /* continued by a lot more 0xFF... values */
-/******************************************************************************************************************************/
+ { 0, NULL }
+};
+
+
+/***************************************************************************/
/* debug functions, query or list supported NDIS OID's */
static void
-supported_list(LPADAPTER adapter)
+supported_list(LPADAPTER adapter)
{
unsigned char values[10000];
int length;
-
+
+ g_warning("supported_list_unhandled");
length = sizeof(values);
if (wpcap_packet_request(adapter, OID_GEN_SUPPORTED_LIST, FALSE /* !set */, values, &length)) {
guint32 *value = (guint32 *) values;
while (length>=4) {
- g_warning("OID: 0x%08X", *value);
+ printf("OID: 0x%08X %s\n", *value, val_to_str(*value, oid_vals, "unknown"));
value++;
length-=4;
static gboolean
-supported_query_oid(LPADAPTER adapter, guint32 oid)
+supported_query_oid(LPADAPTER adapter, guint32 oid)
{
unsigned char values[10000];
int length;
-
+
length = sizeof(values);
if (wpcap_packet_request(adapter, OID_GEN_SUPPORTED_LIST, FALSE /* !set */, values, &length)) {
guint32 *value = (guint32 *) values;
}
-/******************************************************************************************************************************/
+/******************************************************************************/
/* info functions, get and display various NDIS driver values */
+#if GTK_MAJOR_VERSION >= 2
+
+ GtkWidget *meter;
+ GtkWidget *val_lb;
+
+static GtkWidget *
+add_meter_to_table(GtkWidget *list, guint *row, gchar *title,
+ int value, gchar *value_title,
+ int min, int max,
+ int yellow_level,
+ GList *scale)
+{
+ GtkWidget *label;
+ gchar *indent;
+ GtkWidget *main_hb;
+
+
+ /* the label */
+ indent = g_strdup_printf(" %s", title);
+ label = gtk_label_new(indent);
+ g_free(indent);
+ gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
+ gtk_table_attach(GTK_TABLE(list), label, 0, 1, *row, *row+1, GTK_EXPAND|GTK_FILL, 0, 0,0);
+
+ /* the level meter */
+ main_hb = gtk_hbox_new(FALSE, 6);
+
+ meter = gtk_vumeter_new ();
+
+ gtk_vumeter_set_orientation(GTK_VUMETER(meter), GTK_VUMETER_LEFT_TO_RIGHT);
+
+ gtk_vumeter_set_min_max(GTK_VUMETER(meter), &min, &max);
+ gtk_vumeter_set_yellow_level (GTK_VUMETER(meter), yellow_level);
+ gtk_vumeter_set_thickness (GTK_VUMETER(meter), 10);
+ gtk_vumeter_set_thickness_reduction (GTK_VUMETER(meter), 2);
+ gtk_vumeter_set_scale_hole_size (GTK_VUMETER(meter), 2);
+ gtk_vumeter_set_colors_inverted (GTK_VUMETER(meter), TRUE);
+
+ if(scale) {
+ gtk_vumeter_set_scale_items(GTK_VUMETER(meter), scale);
+ }
+
+ gtk_vumeter_set_level(GTK_VUMETER(meter), value);
+
+ gtk_box_pack_start (GTK_BOX(main_hb),
+ meter,
+ TRUE /*expand*/,
+ TRUE /*fill*/,
+ 0 /* padding */);
+
+ val_lb = gtk_label_new(value_title);
+ WIDGET_SET_SIZE(val_lb, 50, -1);
+ gtk_misc_set_alignment(GTK_MISC(val_lb), 1.0, 0.5);
+
+ gtk_box_pack_start (GTK_BOX(main_hb),
+ val_lb,
+ FALSE /*expand*/,
+ FALSE /*fill*/,
+ 0 /* padding */);
+
+ gtk_table_attach(GTK_TABLE(list), main_hb, 1, 2, *row, *row+1, GTK_EXPAND|GTK_FILL, 0, 0,0);
+
+ *row = *row + 1;
+
+ return meter;
+}
+#endif
+
+
+
static void
add_row_to_table(GtkWidget *list, guint *row, gchar *title, const gchar *value, gboolean sensitive)
{
g_free(indent);
gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
gtk_widget_set_sensitive(label, sensitive);
- gtk_table_attach_defaults(GTK_TABLE(list), label, 0, 1, *row, *row+1);
+ gtk_table_attach(GTK_TABLE(list), label, 0, 1, *row, *row+1, GTK_EXPAND | GTK_FILL, 0, 0,0);
label = gtk_label_new(value);
gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
gtk_widget_set_sensitive(label, sensitive);
- gtk_table_attach_defaults(GTK_TABLE(list), label, 1, 2, *row, *row+1);
+ gtk_table_attach(GTK_TABLE(list), label, 1, 2, *row, *row+1, GTK_EXPAND | GTK_FILL, 0, 0,0);
*row = *row + 1;
}
int i;
GString *Rates;
float float_value;
+ int int_value;
Rates = g_string_new("");
i = 0;
while(length--) {
if(values[i]) {
- float_value = (float) ((values[i] & 0x7F) / 2);
- if(i == 0) {
- g_string_sprintfa(Rates, "%.1f", float_value);
+ if(i != 0) {
+ g_string_append(Rates, "/");
+ }
+
+ float_value = ((float) (values[i] & 0x7F)) / 2;
+
+ /* reduce the screen estate by showing fractions only where required */
+ int_value = (int)float_value;
+ if(float_value == (float)int_value) {
+ g_string_sprintfa(Rates, "%.0f", float_value);
} else {
- g_string_sprintfa(Rates, " / %.1f", float_value);
+ g_string_sprintfa(Rates, "%.1f", float_value);
}
}
i++;
}
+
+#if GTK_MAJOR_VERSION >= 2
+static GList *
+rates_vu_list(unsigned char *values, int length, int *max)
+{
+ int i;
+ GList *Rates = NULL;
+ GtkVUMeterScaleItem * item;
+
+
+ *max = 0;
+
+ if(length == 0) {
+ return NULL;
+ }
+
+ /* add a zero scale point */
+ item = g_malloc(sizeof(GtkVUMeterScaleItem));
+ item->level = 0;
+ item->large = TRUE;
+ item->label = "0";
+ Rates = g_list_append(Rates, item);
+
+ /* get the maximum rate */
+ for(i=0; i<length; i++) {
+ gint level;
+
+ if(values[i]) {
+ level = (values[i] & 0x7F) / 2;
+
+ if(level > *max) {
+ *max = level;
+ }
+ }
+ }
+
+#if 0
+ /* debug: fake the 108MBit entry (I don't own one :-) */
+ *max = 108;
+
+ item = g_malloc(sizeof(GtkVUMeterScaleItem));
+ item->level = 108;
+ item->large = TRUE;
+ item->label = "108";
+ Rates = g_list_append(Rates, item);
+#endif
+
+ for(i=0; i<length; i++) {
+ if(values[i]) {
+ /* reduce the screen estate by showing fractions only where required */
+ item = g_malloc(sizeof(GtkVUMeterScaleItem));
+
+ item->level = (values[i] & 0x7F) / 2;
+
+ /* common data rates: */
+ /* 802.11 (15.1) : mandatory: 2, 1 */
+ /* 802.11a (17.1) : mandatory: 24, 12, 6 optional: 54, 48, 36, 18, 9 */
+ /* 802.11b (18.1) : mandatory: 11, 5.5 (+ 2, 1) */
+ /* 802.11g (19.1.1): mandatory: 24, 12, 11, 6, 5.5, 2, 1 optional: 54, 48, 36, 33, 22, 18, 9 */
+ /* 802.11n: ? */
+ /* proprietary: 108 */
+
+ switch(item->level) {
+ case 2:
+ if(*max >= 108) {
+ item->large = FALSE;
+ item->label = NULL;
+ } else {
+ item->large = TRUE;
+ item->label = "2";
+ }
+ break;
+ case 5:
+ item->large = TRUE;
+ item->label = "5.5";
+ break;
+ case 11:
+ item->large = TRUE;
+ item->label = "11";
+ break;
+ case 18:
+ item->large = TRUE;
+ item->label = "18";
+ break;
+ case 24:
+ item->large = TRUE;
+ item->label = "24";
+ break;
+ case 36:
+ item->large = TRUE;
+ item->label = "36";
+ break;
+ case 48:
+ item->large = TRUE;
+ item->label = "48";
+ break;
+ case 54:
+ item->large = TRUE;
+ item->label = "54";
+ break;
+ case 72: /* XXX */
+ item->large = TRUE;
+ item->label = "72";
+ break;
+ case 96: /* XXX */
+ item->large = TRUE;
+ item->label = "96";
+ break;
+ case 108:
+ item->large = TRUE;
+ item->label = "108";
+ break;
+ default:
+ item->large = FALSE;
+ item->label = NULL;
+ }
+
+ Rates = g_list_append(Rates, item);
+ }
+ }
+
+ return Rates;
+}
+#endif
+
+
+/* debugging only */
+static void
+hex(unsigned char *p, int len) {
+ int i = 0;
+ while(len) {
+ g_warning("%u: 0x%x (%u) '%c'", i, *p, *p,
+ isprint(*p) ? *p : '.');
+
+ i++;
+ p++;
+ len--;
+ }
+}
+
+
static void
capture_if_details_802_11_bssid_list(GtkWidget *main_vb, struct ndis_bssid_list *bssid_list)
{
if(bssid_list->num_items != 0) {
- char *titles[] = { "SSID", "MAC", "Vendor", "RSSI" , "Network Type" , "Infra. Mode" , "Channel" , "Rates" };
- GtkWidget *list;
+ char *titles[] = { "SSID", "MAC", "Vendor", "Privacy", "RSSI" , "Network Type" , "Infra. Mode" , "Ch." , "Rates" };
+ GtkWidget *list;
+ gboolean privacy_required;
+ gboolean privacy_wpa;
+ gboolean privacy_wpa2;
gchar ssid_buff[DETAILS_STR_MAX];
gchar mac_buff[DETAILS_STR_MAX];
gchar vendor_buff[DETAILS_STR_MAX];
+ gchar privacy_buff[DETAILS_STR_MAX];
gchar rssi_buff[DETAILS_STR_MAX];
gchar nettype_buff[DETAILS_STR_MAX];
gchar infra_buff[DETAILS_STR_MAX];
gchar freq_buff[DETAILS_STR_MAX];
- list = simple_list_new(8, titles);
- gtk_container_add(GTK_CONTAINER(main_vb), list);
+ list = simple_list_new(9, titles);
+ gtk_box_pack_start(GTK_BOX(main_vb), list, TRUE /*expand*/, TRUE /*fill*/, 0 /* padding */);
bssid_item = &bssid_list->items[0];
while(bssid_list->num_items--) {
+ privacy_required = FALSE;
+ privacy_wpa = FALSE;
+ privacy_wpa2 = FALSE;
/* SSID */
if(bssid_item->ssid.length > DETAILS_STR_MAX-1) {
/* MAC */
memcpy(mac, &bssid_item->mac, sizeof(mac));
g_snprintf(mac_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X",
- mac[0], mac[1], mac[2],
+ mac[0], mac[1], mac[2],
mac[3], mac[4], mac[5]);
/* Vendor */
/* RSSI */
g_snprintf(rssi_buff, DETAILS_STR_MAX, "%d dBm", bssid_item->rssi);
+ /* Privacy */
+ /* (flag is set, if WEP (or higher) privacy is required) */
+ if(bssid_item->privacy) {
+ privacy_required = TRUE;
+ }
+
/* Network Type */
g_snprintf(nettype_buff, sizeof(nettype_buff), "%s",
val_to_str(bssid_item->net_type, win32_802_11_network_type_vals, "(0x%x)"));
g_snprintf(freq_buff, sizeof(freq_buff), "%s",
val_to_str(bssid_item->config.ds_config, win32_802_11_channel_vals, "(%u kHz)"));
- /* IE Length (XXX - add decoding) */
- /* g_warning ("802.11 IE Length : %u", bssid_item->ie_length); */
+ /* XXX - IE Length is currently not really supported here */
+ {
+ int len = bssid_item->ie_length;
+ unsigned char *iep = bssid_item->ies;
+ unsigned char id;
+ unsigned el_len;
+ NDIS_802_11_FIXED_IEs *fixed_ies;
+/*#define DEBUG_IE*/
+#ifdef DEBUG_IE
+ const gchar *manuf_name;
+ gchar string_buff[DETAILS_STR_MAX];
+#endif
+
+
+ fixed_ies = (NDIS_802_11_FIXED_IEs *) iep;
+
+#if 0
+ UCHAR Timestamp[8];
+ USHORT BeaconInterval;
+ USHORT Capabilities;
+} NDIS_802_11_FIXED_IEs, *PNDIS_802_11_FIXED_IEs;
+#endif
+
+ iep += sizeof(NDIS_802_11_FIXED_IEs);
+ len = bssid_item->ie_length - sizeof(NDIS_802_11_FIXED_IEs);
- simple_list_append(list,
+ while(len >= 2) {
+ id = *iep;
+ iep++;
+ el_len = *iep;
+ iep++;
+ len-=2;
+
+#ifdef DEBUG_IE
+ g_warning("ID: %s (%u) Len: %u",
+ val_to_str(id, ie_id_vals, "0x%x"), id, el_len);
+#endif
+
+ if (id != 0 && id != 1 && id != 3 && id != 5 && id != 42 && id != 50 && id != 221) {
+ hex(iep, el_len);
+ }
+
+ /* WPA2 (RSN) */
+ if (id == 48) {
+ privacy_wpa2 = TRUE;
+ }
+
+ /* WPA */
+ if (id == 221) {
+ privacy_wpa = TRUE;
+
+#ifdef DEBUG_IE
+ /* include information from epan/packet-ieee80211.c dissect_vendor_ie_wpawme() */
+ manuf_name = get_manuf_name_if_known(iep);
+ if(manuf_name != NULL) {
+ g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X (%s) Type: %02X",
+ *(iep), *(iep+1), *(iep+2), manuf_name, *(iep+3));
+ } else {
+ g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X Type: %02X",
+ *(iep), *(iep+1), *(iep+2), *(iep+3));
+ }
+
+ g_warning("%s", string_buff);
+ iep += 4;
+ el_len-= 4;
+ len -= 4;
+
+ hex(iep, el_len);
+#endif
+ }
+
+ iep += el_len;
+ len -= el_len;
+ }
+ }
+
+ if(privacy_required) {
+ if(privacy_wpa2) {
+ /* XXX - how to detect data encryption (TKIP and AES)? */
+ /* XXX - how to detect authentication (PSK or not)? */
+ g_snprintf(privacy_buff, DETAILS_STR_MAX, "WPA2");
+ } else {
+ if(privacy_wpa) {
+ /* XXX - how to detect data encryption (TKIP and AES)? */
+ /* XXX - how to detect authentication (PSK or not)? */
+ g_snprintf(privacy_buff, DETAILS_STR_MAX, "WPA");
+ } else {
+ /* XXX - how to detect authentication (Open System and Shared Key)? */
+ g_snprintf(privacy_buff, DETAILS_STR_MAX, "WEP");
+ }
+ }
+ } else {
+ g_snprintf(privacy_buff, DETAILS_STR_MAX, "None");
+ }
+
+ simple_list_append(list,
0, ssid_buff,
1, mac_buff,
2, vendor_buff,
- 3, rssi_buff,
- 4, nettype_buff,
- 5, infra_buff,
- 6, freq_buff,
- 7, Rates->str,
+ 3, privacy_buff,
+ 4, rssi_buff,
+ 5, nettype_buff,
+ 6, infra_buff,
+ 7, freq_buff,
+ 8, Rates->str,
-1);
g_string_free(Rates, TRUE /* free_segment */);
static int
capture_if_details_802_11(GtkWidget *table, GtkWidget *main_vb, guint *row, LPADAPTER adapter) {
ULONG ulong_value;
- LONG long_value;
+ LONG rssi = -100;
unsigned int uint_value;
unsigned char values[100];
struct ndis_essid ssid;
gchar string_buff[DETAILS_STR_MAX];
GString *Rates;
int entries = 0;
+ const gchar *manuf_name;
- add_string_to_table(table, row, "Characteristics", "");
-
- /* BSSID */
- length = sizeof(values);
- memset(values, 0, 6);
- if (wpcap_packet_request(adapter, OID_802_11_BSSID, FALSE /* !set */, values, &length)) {
- g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X",
- values[0], values[1], values[2],
- values[3], values[4], values[5]);
- entries++;
- } else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "-");
- }
- add_string_to_table(table, row, "BSSID (Basic Service Set IDentifier)", string_buff);
+ add_string_to_table(table, row, "Current network", "");
/* SSID */
length = sizeof(struct ndis_essid);
add_string_to_table(table, row, "SSID (Service Set IDentifier)", "-");
}
+ /* BSSID */
+ length = sizeof(values);
+ memset(values, 0, 6);
+ if (wpcap_packet_request(adapter, OID_802_11_BSSID, FALSE /* !set */, values, &length)) {
+ manuf_name = get_manuf_name_if_known(values);
+ if(manuf_name != NULL) {
+ g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X (%s)",
+ values[0], values[1], values[2],
+ values[3], values[4], values[5],
+ manuf_name);
+ } else {
+ g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X",
+ values[0], values[1], values[2],
+ values[3], values[4], values[5]);
+ }
+ entries++;
+ } else {
+ g_snprintf(string_buff, DETAILS_STR_MAX, "-");
+ }
+ add_string_to_table(table, row, "BSSID (Basic Service Set IDentifier)", string_buff);
+
/* Network type in use */
if (wpcap_packet_request_uint(adapter, OID_802_11_NETWORK_TYPE_IN_USE, &uint_value)) {
- add_string_to_table(table, row, "Network type used",
+ add_string_to_table(table, row, "Network type used",
val_to_str(uint_value, win32_802_11_network_type_vals, "(0x%x)"));
entries++;
} else {
/* Infrastructure mode */
if (wpcap_packet_request_ulong(adapter, OID_802_11_INFRASTRUCTURE_MODE, &uint_value)) {
- add_string_to_table(table, row, "Infrastructure mode",
+ add_string_to_table(table, row, "Infrastructure mode",
val_to_str(uint_value, win32_802_11_infra_mode_vals, "(0x%x)"));
entries++;
} else {
/* Authentication mode */
if (wpcap_packet_request_ulong(adapter, OID_802_11_AUTHENTICATION_MODE, &uint_value)) {
- add_string_to_table(table, row, "Authentication mode",
+ add_string_to_table(table, row, "Authentication mode",
val_to_str(uint_value, win32_802_11_auth_mode_vals, "(0x%x)"));
entries++;
} else {
/* Encryption (WEP) status */
if (wpcap_packet_request_ulong(adapter, OID_802_11_ENCRYPTION_STATUS, &uint_value)) {
- add_string_to_table(table, row, "Encryption status",
+ add_string_to_table(table, row, "Encryption status",
val_to_str(uint_value, win32_802_11_encryption_status_vals, "(0x%x)"));
entries++;
} else {
}
/* RSSI */
- if (wpcap_packet_request_ulong(adapter, OID_802_11_RSSI, &long_value)) {
- g_snprintf(string_buff, DETAILS_STR_MAX, "%ld dBm (typical -10 through -200)", long_value);
+ if (wpcap_packet_request_ulong(adapter, OID_802_11_RSSI, &rssi)) {
+#if GTK_MAJOR_VERSION >= 2
+ int i;
+ GList * scale_items = NULL;
+ GList * current;
+ GtkVUMeterScaleItem *item;
+
+
+ for (i = 0; i <= 100; i++) {
+ item = g_malloc(sizeof(GtkVUMeterScaleItem));
+
+ item->level = i;
+ item->large = !(i%5);
+ item->label = NULL;
+
+ switch(item->level) {
+ case 0:
+ item->label = "-100 ";
+ break;
+ case 20:
+ item->label = "-80 ";
+ break;
+ case 40:
+ item->label = "-60 ";
+ break;
+ case 60:
+ item->label = "-40 ";
+ break;
+ case 80:
+ item->label = "-20 ";
+ break;
+ case 100:
+ item->label = "0";
+ break;
+ default:
+ item->label = NULL;
+ }
+
+ scale_items = g_list_append(scale_items, item);
+ }
+
+ if(rssi < -100) {
+ rssi = -100;
+ }
+ g_snprintf(string_buff, DETAILS_STR_MAX, "%ld dBm", rssi);
+
+ add_meter_to_table(table, row, "RSSI (Received Signal Strength Indication)",
+ rssi+100 , string_buff, -100+100, 0+100, -80+100, scale_items);
+
+ current = scale_items;
+ while (current != NULL) {
+ g_free(current->data);
+
+ current = g_list_next(current);
+ }
+ g_list_free(scale_items);
+#else
+ g_snprintf(string_buff, DETAILS_STR_MAX, "%ld dBm (typical -10 through -100)", rssi);
add_string_to_table(table, row, "RSSI (Received Signal Strength Indication)", string_buff);
+#endif
entries++;
} else {
add_string_to_table(table, row, "RSSI (Received Signal Strength Indication)", "-");
entries++;
}
+#if GTK_MAJOR_VERSION >= 2
+ /* if we can get the link speed, show Supported Rates in level meter format */
+ if (length != 0 && wpcap_packet_request_uint(adapter, OID_GEN_LINK_SPEED, &uint_value)) {
+ int max;
+ int yellow;
+ GList *rates_list;
+ GList * current;
+
+
+ rates_list = rates_vu_list(values, length, &max);
+
+ /* if we don't have a signal, we might not have a valid link speed */
+ if(rssi == -100) {
+ uint_value = 0;
+ }
+
+ uint_value /= 10 * 1000;
+ g_snprintf(string_buff, DETAILS_STR_MAX, "%u MBits/s", uint_value);
+
+ if(max >= 54) {
+ yellow = 2;
+ } else {
+ yellow = 1;
+ }
+ add_meter_to_table(table, row, "Link Speed",
+ uint_value, string_buff, 0, max, yellow, rates_list);
+
+ current = rates_list;
+ while (current != NULL) {
+ g_free(current->data);
+
+ current = g_list_next(current);
+ }
+ g_list_free(rates_list);
+ }
+#endif
+
+ /* Supported Rates in String format */
Rates = rates_details(values, length);
add_string_to_table(table, row, "Supported Rates", Rates->str);
g_string_free(Rates, TRUE /* free_segment */);
configuration = (struct ndis_configuration *) values;
add_string_to_table(table, row, "Channel",
- val_to_str(configuration->ds_config, win32_802_11_channel_vals, "(%u kHz)"));
+ val_to_str(configuration->ds_config, win32_802_11_channel_freq_vals, "(%u kHz)"));
entries++;
} else {
add_string_to_table(table, row, "Channel", "-");
if (wpcap_packet_request(adapter, OID_802_11_BSSID_LIST, FALSE /* !set */, (char *) bssid_list, &length)) {
add_string_to_table(table, row, "", "");
- add_string_to_table(table, row, "BSSID list", "");
+ add_string_to_table(table, row, "Available networks (BSSID list)", "");
capture_if_details_802_11_bssid_list(main_vb, bssid_list);
entries += bssid_list->num_items;
} else {
- add_string_to_table(table, row, "802.11 BSSID list", "-");
+ add_string_to_table(table, row, "Available networks (BSSID list)", "-");
}
g_free(bssid_list);
manuf_name = get_manuf_name_if_known(values);
if(manuf_name != NULL) {
g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X (%s)",
- values[0], values[1], values[2],
+ values[0], values[1], values[2],
values[3], values[4], values[5],
manuf_name);
} else {
g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X",
- values[0], values[1], values[2],
+ values[0], values[1], values[2],
values[3], values[4], values[5]);
}
entries++;
manuf_name = get_manuf_name_if_known(values);
if(manuf_name != NULL) {
g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X (%s)",
- values[0], values[1], values[2],
+ values[0], values[1], values[2],
values[3], values[4], values[5],
manuf_name);
} else {
g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X",
- values[0], values[1], values[2],
+ values[0], values[1], values[2],
values[3], values[4], values[5]);
}
entries++;
}
static int
-task_offload(GtkWidget *table, GtkWidget *main_vb, guint *row, LPADAPTER adapter) {
+capture_if_details_task_offload(GtkWidget *table, GtkWidget *main_vb, guint *row, LPADAPTER adapter) {
NDIS_TASK_OFFLOAD_HEADER *offload;
unsigned char values[10000];
int length;
offload->EncapsulationFormat.Flags.FixedHeaderSize = 1;
offload->EncapsulationFormat.Flags.Reserved = 0;
offload->EncapsulationFormat.EncapsulationHeaderSize = 14; /* sizeof(struct ether_header) */;
-
+
length = sizeof(values);
if (wpcap_packet_request(adapter, OID_TCP_TASK_OFFLOAD, FALSE /* !set */, values, &length)) {
NDIS_TASK_OFFLOAD *of;
add_string_to_table(table, row, "Task", string_buff);
}
-
+
add_string_to_table(table, row, "", "");
valuep += of->OffsetNextTask;
length -= of->OffsetNextTask;
} while(of->OffsetNextTask != 0);
- }
+ }
if(TcpIpChecksumSupported == 0) {
add_string_to_table(table, row, "TCP/IP Checksum", "");
add_string_to_table(table, row, "IpSec", "");
add_string_to_table(table, row, "Offload not supported", "-");
}
-
+
if(TcpLargeSendSupported == 0) {
add_string_to_table(table, row, "TCP Large Send", "");
add_string_to_table(table, row, "Offload not supported", "-");
uint_array_size /= sizeof(unsigned int);
i=0;
while(uint_array_size--) {
- add_string_to_table(table, row, "Media supported",
+ add_string_to_table(table, row, "Media supported",
val_to_str(uint_array[i], win32_802_3_medium_vals, "(0x%x)"));
i++;
}
uint_array_size /= sizeof(unsigned int);
i=0;
while(uint_array_size--) {
- add_string_to_table(table, row, "Medium in use",
+ add_string_to_table(table, row, "Medium in use",
val_to_str(uint_array[i], win32_802_3_medium_vals, "(0x%x)"));
i++;
}
if (wpcap_packet_request_uint(adapter, OID_GEN_PHYSICAL_MEDIUM, &physical_medium)) {
entries++;
- add_string_to_table(table, row, "Physical medium",
+ add_string_to_table(table, row, "Physical medium",
val_to_str(physical_medium, win32_802_3_physical_medium_vals, "(0x%x)"));
} else {
add_string_to_table(table, row, "Physical medium", "-");
if (wpcap_packet_request(adapter, OID_GEN_VENDOR_DRIVER_VERSION, FALSE /* !set */, (char *) &uint_value, &length)) {
entries++;
/* XXX - what's the correct output format? */
- g_snprintf(string_buff, DETAILS_STR_MAX, "%u.%u (Hex: %X.%X)",
+ g_snprintf(string_buff, DETAILS_STR_MAX, "%u.%u (Hex: %X.%X)",
(uint_value / 0x10000 ) % 0x10000,
uint_value % 0x10000,
(uint_value / 0x10000 ) % 0x10000,
entries++;
manuf_name = get_manuf_name_if_known(values);
if(manuf_name != NULL) {
- g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X (%s) NIC: %02X",
+ g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X (%s) NIC: %02X",
values[0], values[1], values[2], manuf_name, values[3]);
} else {
- g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X NIC: %02X",
+ g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X NIC: %02X",
values[0], values[1], values[2], values[3]);
}
} else {
}
add_string_to_table(table, row, "Vendor ID", string_buff);
+ if (wpcap_packet_request_uint(adapter, OID_GEN_MAC_OPTIONS, &uint_value)) {
+ entries++;
+ g_snprintf(string_buff, DETAILS_STR_MAX,
+ "802.1P Priority: %s, 802.1Q VLAN: %s",
+ (uint_value & NDIS_MAC_OPTION_8021P_PRIORITY) ? "Supported" : "Unsupported",
+ (uint_value & NDIS_MAC_OPTION_8021Q_VLAN) ? "Supported" : "Unsupported" );
+ } else {
+ g_snprintf(string_buff, DETAILS_STR_MAX, "-");
+ }
+ add_string_to_table(table, row, "MAC Options", string_buff);
+
if (wpcap_packet_request_uint(adapter, OID_GEN_VLAN_ID, &uint_value)) {
entries++;
g_snprintf(string_buff, DETAILS_STR_MAX, "%u", uint_value);
}
add_string_to_table(table, row, "VLAN ID", string_buff);
+#if 0
+ /* value seems to be constant */
+ if (wpcap_packet_request_uint(adapter, OID_GEN_CURRENT_PACKET_FILTER, &uint_value)) {
+ entries++;
+ g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
+ } else {
+ g_snprintf(string_buff, DETAILS_STR_MAX, "-");
+ }
+ add_string_to_table(table, row, "Packet filter", string_buff);
+#endif
- /* XXX - OID_GEN_MAC_OPTIONS (bitfield, VLAN, ...) */
-
if (wpcap_packet_request_uint(adapter, OID_GEN_TRANSMIT_BUFFER_SPACE, &uint_value)) {
entries++;
g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
/* open the network adapter */
adapter = wpcap_packet_open(iface);
+ if(adapter == NULL) {
+ simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
+ PRIMARY_TEXT_START "Could not open adapter: %s!" PRIMARY_TEXT_END
+ "\n\nThe adapter might be removed from the system in the meantime!", iface);
+ return;
+ }
/* open a new window */
- details_open_w = window_new(GTK_WINDOW_TOPLEVEL, "Ethereal: Interface Details");
+ details_open_w = window_new(GTK_WINDOW_TOPLEVEL, "Wireshark: Interface Details");
/* Container for the window contents */
main_vb = gtk_vbox_new(FALSE, 12);
/* notebook */
notebook = gtk_notebook_new();
- gtk_container_add(GTK_CONTAINER(main_vb), notebook);
+ gtk_box_pack_start(GTK_BOX(main_vb), notebook, TRUE /*expand*/, TRUE /*fill*/, 0 /*padding*/);
/* General page */
page_general = capture_if_details_page_new(&table);
- page_lb = gtk_label_new("General");
+ page_lb = gtk_label_new("Characteristics");
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page_general, page_lb);
row = 0;
entries = capture_if_details_general(table, page_general, &row, adapter, iface);
gtk_widget_set_sensitive(page_lb, FALSE);
}
- /* task offload page */
+ /* Task offload page */
page_task_offload = capture_if_details_page_new(&table);
page_lb = gtk_label_new("Task Offload");
gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page_task_offload, page_lb);
row = 0;
- entries = task_offload(table, page_task_offload, &row, adapter);
+ entries = capture_if_details_task_offload(table, page_task_offload, &row, adapter);
if(entries == 0) {
gtk_widget_set_sensitive(page_lb, FALSE);
}
wpcap_packet_close(adapter);
label = gtk_label_new("Note: accuracy of all of these values are only relying on the network card driver!");
- gtk_container_add(GTK_CONTAINER(main_vb), label);
+ gtk_box_pack_start(GTK_BOX(main_vb), label, FALSE /*expand*/, FALSE /*fill*/, 0 /*padding*/);
/* Button row. */
if(topic_available(HELP_CAPTURE_INTERFACES_DETAILS_DIALOG)) {
} else {
bbox = dlg_button_row_new(GTK_STOCK_CLOSE, NULL);
}
- gtk_container_add(GTK_CONTAINER(main_vb), bbox);
+ gtk_box_pack_start(GTK_BOX(main_vb), bbox, FALSE /*expand*/, FALSE /*fill*/, 0 /*padding*/);
close_bt = OBJECT_GET_DATA(bbox, GTK_STOCK_CLOSE);
window_set_cancel_button(details_open_w, close_bt, window_cancel_button_cb);
if(version == NULL) {
/* couldn't even get the packet.dll version, must be a very old one or just not existing -> give up */
/* (this seems to be the case for 2.3 beta and all previous releases) */
- simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK,
- PRIMARY_TEXT_START "Couldn't optain WinPcap packet.dll version!" PRIMARY_TEXT_END
+ simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK,
+ PRIMARY_TEXT_START "Couldn't obtain WinPcap packet.dll version!" PRIMARY_TEXT_END
"\n\nThe WinPcap packet.dll is not installed or the version you use seems to be very old!"
"\n\nPlease update/install WinPcap.");
return;
/* XXX - add more known DLL versions here */
/* (all versions since the 2.3 release seems to be working (although the 2.3 beta did not) */
- if( strcmp(version, "3, 1, 0, 27") == 0 || /* 3.1 release */
+ if(
+ /*
+ * 4.0 version strings:
+ * 4.0.0.703: 4.0 beta 3
+ * 4.0.0.655: 4.0 beta 2
+ * 4.0.0.592: 4.0 beta 1
+ */
+ strcmp(version, "3" ) > 0 || /* 4.0 and above (including betas) */
+ strcmp(version, "3, 2, 0, 29") == 0 || /* 3.2 beta 1 */
+ strcmp(version, "3, 1, 0, 27") == 0 || /* 3.1 release */
strcmp(version, "3, 1, 0, 24") == 0 || /* 3.1 beta 4 */
strcmp(version, "3, 1, 0, 23") == 0 || /* 3.1 beta 3 */
strcmp(version, "3, 1, 0, 22") == 0 || /* 3.1 beta 2 */
strcmp(version, "3, 1, 0, 20") == 0 || /* 3.1 beta */
strcmp(version, "3.0 alpha3" ) == 0 || /* 3.0 release or 3.0 beta (yes, both versions report alpha3!) */
strcmp(version, "2.3" ) == 0 /* 2.3 release */
- ) {
+ ) {
version_ok = TRUE;
}
if(!version_ok) {
/* packet.dll version not known to us, warn user but try to continue */
- dialog = simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK | ESD_BTN_CANCEL,
+ dialog = simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK | ESD_BTN_CANCEL,
PRIMARY_TEXT_START "Unknown WinPcap version might crash or fail!" PRIMARY_TEXT_END
"\n\nThe WinPcap packet.dll version \"%s\" is unknown if it supports required functions!"
"\n\nOnly WinPcap versions 3.0 and 3.1 are known to work with this feature."