Immediately quit routines if fwrite() fails - further writes will
[obnox/wireshark/wip.git] / gtk / capture_if_details_dlg.c
index 949e3aa46e627b0436d51da1f2b7ca9bea7077c6..4984ce50b0167dfb1f7fb32ad283b7d3cb5c3d50 100644 (file)
@@ -3,8 +3,8 @@
  *
  * $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;
 
 /*
@@ -82,8 +90,7 @@ struct sockaddr_storage {
               /* __ss_pad1, __ss_align fields is 112 */
 };
 /* ... copied from RFC2553 */
-#endif
-
+#endif /* WINVER */
 
 #include <Packet32.h>
 #include <windows.h>
@@ -98,20 +105,56 @@ struct sockaddr_storage {
 #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,
@@ -125,10 +168,17 @@ typedef enum ndis_phys_medium {
        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
@@ -164,14 +214,25 @@ typedef enum ndis_phys_medium {
 #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,
@@ -179,7 +240,7 @@ enum network_infrastructure {
        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,
@@ -192,7 +253,7 @@ enum authentication_mode {
        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,
@@ -205,7 +266,7 @@ enum network_type {
        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,
@@ -222,12 +283,12 @@ enum encryption_status {
 };
 
 
-/* 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;
@@ -241,7 +302,7 @@ struct /*packed*/ ndis_configuration {
        } 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;
@@ -258,21 +319,30 @@ struct ndis_ssid_item {
 };
 
 
-/* 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,
@@ -280,7 +350,7 @@ typedef enum _NDIS_TASK {
   MaxNdisTask
 } NDIS_TASK, *PNDIS_TASK;
 
-/* TaskBuffer content on TcpIpChecksumNdisTask (from ReactOS) */
+/* TaskBuffer content on TcpIpChecksumNdisTask */
 typedef struct _NDIS_TASK_TCP_IP_CHECKSUM
 {
   struct
@@ -291,7 +361,7 @@ typedef struct _NDIS_TASK_TCP_IP_CHECKSUM
     ULONG    UdpChecksum:1;
     ULONG    IpChecksum:1;
   } V4Transmit;
+
   struct
   {
     ULONG    IpOptionsSupported:1;
@@ -300,7 +370,7 @@ typedef struct _NDIS_TASK_TCP_IP_CHECKSUM
     ULONG    UdpChecksum:1;
     ULONG    IpChecksum:1;
   } V4Receive;
+
   struct
   {
     ULONG    IpOptionsSupported:1;
@@ -308,7 +378,7 @@ typedef struct _NDIS_TASK_TCP_IP_CHECKSUM
     ULONG    TcpChecksum:1;
     ULONG    UdpChecksum:1;
   } V6Transmit;
+
   struct
   {
     ULONG    IpOptionsSupported:1;
@@ -318,7 +388,7 @@ typedef struct _NDIS_TASK_TCP_IP_CHECKSUM
   } 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;
@@ -328,7 +398,7 @@ typedef struct _NDIS_TASK_TCP_LARGE_SEND
   BOOLEAN  IpOptions;
 } NDIS_TASK_TCP_LARGE_SEND, *PNDIS_TASK_TCP_LARGE_SEND;
 
-/* Encapsulations (from ReactOs) */
+/* Encapsulations */
 typedef enum _NDIS_ENCAPSULATION {
   UNSPECIFIED_Encapsulation,
   NULL_Encapsulation,
@@ -338,7 +408,7 @@ typedef enum _NDIS_ENCAPSULATION {
   LLC_SNAP_BRIDGED_Encapsulation
 } NDIS_ENCAPSULATION;
 
-/* Encapsulation format (from ReactOs) */
+/* Encapsulation format */
 typedef struct _NDIS_ENCAPSULATION_FORMAT {
   NDIS_ENCAPSULATION  Encapsulation;
   struct {
@@ -348,7 +418,7 @@ typedef struct _NDIS_ENCAPSULATION_FORMAT {
   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;
@@ -358,7 +428,7 @@ typedef struct _NDIS_TASK_OFFLOAD_HEADER
   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
 {
@@ -371,7 +441,7 @@ typedef struct _NDIS_TASK_OFFLOAD
 } NDIS_TASK_OFFLOAD, *PNDIS_TASK_OFFLOAD;
 
 
-/******************************************************************************************************************************/
+/***********************************************************************/
 /* value_string's for info functions */
 
 
@@ -395,7 +465,7 @@ static const value_string win32_802_3_medium_vals[] = {
 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" },
@@ -417,10 +487,10 @@ static const value_string win32_802_11_auth_mode_vals[] = {
        { 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 }
 };
 
@@ -433,57 +503,275 @@ static const value_string win32_802_11_network_type_vals[] = {
     { 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;
@@ -493,12 +781,12 @@ supported_list(LPADAPTER adapter)
 
 
 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;
@@ -516,10 +804,80 @@ supported_query_oid(LPADAPTER adapter, guint32 oid)
 }
 
 
-/******************************************************************************************************************************/
+/******************************************************************************/
 /* 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)
 {
@@ -535,12 +893,12 @@ add_row_to_table(GtkWidget *list, guint *row, gchar *title, const gchar *value,
     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;
 }
@@ -582,6 +940,7 @@ rates_details(unsigned char *values, int length) {
     int                 i;
     GString             *Rates;
     float               float_value;
+    int                 int_value;
 
 
     Rates = g_string_new("");
@@ -590,11 +949,18 @@ rates_details(unsigned char *values, int length) {
         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++;
@@ -608,6 +974,147 @@ rates_details(unsigned char *values, int length) {
 }
 
 
+
+#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)
 {
@@ -618,23 +1125,30 @@ capture_if_details_802_11_bssid_list(GtkWidget *main_vb, struct ndis_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) {
@@ -646,7 +1160,7 @@ capture_if_details_802_11_bssid_list(GtkWidget *main_vb, struct ndis_bssid_list
             /* 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 */
@@ -663,6 +1177,12 @@ capture_if_details_802_11_bssid_list(GtkWidget *main_vb, struct ndis_bssid_list
             /* 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)"));
@@ -675,18 +1195,111 @@ capture_if_details_802_11_bssid_list(GtkWidget *main_vb, struct ndis_bssid_list
             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 */);
@@ -700,7 +1313,7 @@ capture_if_details_802_11_bssid_list(GtkWidget *main_vb, struct ndis_bssid_list
 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;
@@ -710,22 +1323,10 @@ capture_if_details_802_11(GtkWidget *table, GtkWidget *main_vb, guint *row, LPAD
     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);
@@ -737,9 +1338,30 @@ capture_if_details_802_11(GtkWidget *table, GtkWidget *main_vb, guint *row, LPAD
         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 {
@@ -748,7 +1370,7 @@ capture_if_details_802_11(GtkWidget *table, GtkWidget *main_vb, guint *row, LPAD
 
     /* 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 {
@@ -757,7 +1379,7 @@ capture_if_details_802_11(GtkWidget *table, GtkWidget *main_vb, guint *row, LPAD
 
     /* 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 {
@@ -766,7 +1388,7 @@ capture_if_details_802_11(GtkWidget *table, GtkWidget *main_vb, guint *row, LPAD
 
     /* 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 {
@@ -783,9 +1405,66 @@ capture_if_details_802_11(GtkWidget *table, GtkWidget *main_vb, guint *row, LPAD
     }
 
     /* 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)", "-");
@@ -799,6 +1478,44 @@ capture_if_details_802_11(GtkWidget *table, GtkWidget *main_vb, guint *row, LPAD
         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 */);
@@ -821,7 +1538,7 @@ capture_if_details_802_11(GtkWidget *table, GtkWidget *main_vb, guint *row, LPAD
         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", "-");
@@ -847,12 +1564,12 @@ capture_if_details_802_11(GtkWidget *table, GtkWidget *main_vb, guint *row, LPAD
 
     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);
@@ -878,12 +1595,12 @@ capture_if_details_802_3(GtkWidget *table, GtkWidget *main_vb, guint *row, LPADA
         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++;
@@ -897,12 +1614,12 @@ capture_if_details_802_3(GtkWidget *table, GtkWidget *main_vb, guint *row, LPADA
         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++;
@@ -999,7 +1716,7 @@ capture_if_details_802_3(GtkWidget *table, GtkWidget *main_vb, guint *row, LPADA
 }
 
 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;
@@ -1021,7 +1738,7 @@ task_offload(GtkWidget *table, GtkWidget *main_vb, guint *row, LPADAPTER adapter
     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;
@@ -1134,13 +1851,13 @@ task_offload(GtkWidget *table, GtkWidget *main_vb, guint *row, LPADAPTER adapter
                 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", "");
@@ -1151,7 +1868,7 @@ task_offload(GtkWidget *table, GtkWidget *main_vb, guint *row, LPADAPTER adapter
         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", "-");
@@ -1229,7 +1946,7 @@ capture_if_details_general(GtkWidget *table, GtkWidget *main_vb, guint *row, LPA
         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++;
         }
@@ -1243,7 +1960,7 @@ capture_if_details_general(GtkWidget *table, GtkWidget *main_vb, guint *row, LPA
         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++;
         }
@@ -1253,7 +1970,7 @@ capture_if_details_general(GtkWidget *table, GtkWidget *main_vb, guint *row, LPA
 
     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", "-");
@@ -1272,7 +1989,7 @@ capture_if_details_general(GtkWidget *table, GtkWidget *main_vb, guint *row, LPA
     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,
@@ -1287,10 +2004,10 @@ capture_if_details_general(GtkWidget *table, GtkWidget *main_vb, guint *row, LPA
         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 {
@@ -1298,6 +2015,17 @@ capture_if_details_general(GtkWidget *table, GtkWidget *main_vb, guint *row, LPA
     }
     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);
@@ -1306,9 +2034,17 @@ capture_if_details_general(GtkWidget *table, GtkWidget *main_vb, guint *row, LPA
     }
     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);
@@ -1552,9 +2288,15 @@ capture_if_details_open_win(char *iface)
 
     /* 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);
@@ -1563,11 +2305,11 @@ capture_if_details_open_win(char *iface)
 
     /* 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);
@@ -1605,12 +2347,12 @@ capture_if_details_open_win(char *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);
     }
@@ -1618,7 +2360,7 @@ capture_if_details_open_win(char *iface)
     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)) {
@@ -1626,7 +2368,7 @@ capture_if_details_open_win(char *iface)
     } 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);
@@ -1673,8 +2415,8 @@ capture_if_details_open(char *iface)
     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;
@@ -1682,20 +2424,29 @@ capture_if_details_open(char *iface)
 
     /* 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."