PageRenderTime 134ms CodeModel.GetById 30ms RepoModel.GetById 1ms app.codeStats 1ms

/ui/gtk/capture_if_details_dlg_win32.c

https://github.com/labx-technologies-llc/wireshark
C | 2412 lines | 1814 code | 354 blank | 244 comment | 265 complexity | c43c4441ad633341e913381afaaed41e MD5 | raw file
Possible License(s): GPL-2.0, BSD-3-Clause
  1. /* capture_if_details_dlg.c
  2. * Routines for capture interface details window (only Win32!)
  3. *
  4. * $Id$
  5. *
  6. * Wireshark - Network traffic analyzer
  7. * By Gerald Combs <gerald@wireshark.org>
  8. * Copyright 1998 Gerald Combs
  9. *
  10. * This program is free software; you can redistribute it and/or
  11. * modify it under the terms of the GNU General Public License
  12. * as published by the Free Software Foundation; either version 2
  13. * of the License, or (at your option) any later version.
  14. *
  15. * This program is distributed in the hope that it will be useful,
  16. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  18. * GNU General Public License for more details.
  19. *
  20. * You should have received a copy of the GNU General Public License
  21. * along with this program; if not, write to the Free Software
  22. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  23. */
  24. #include "config.h"
  25. #if defined HAVE_LIBPCAP && defined _WIN32
  26. #include <time.h>
  27. #include <string.h>
  28. #include <gtk/gtk.h>
  29. #include <epan/value_string.h>
  30. #include <epan/addr_resolv.h>
  31. #include <wsutil/str_util.h>
  32. #include "../file.h"
  33. #include "../capture.h"
  34. #include "ui/simple_dialog.h"
  35. #include "ui/gtk/main.h"
  36. #include "ui/gtk/dlg_utils.h"
  37. #include "ui/gtk/gui_utils.h"
  38. #include "ui/gtk/help_dlg.h"
  39. #include "ui/gtk/capture_if_details_dlg_win32.h"
  40. #include <winsock2.h> /* Needed here to force a definition of WINVER */
  41. /* for some (all ?) Microsoft compilers newer than vc6. */
  42. /* (If windows.h were used instead, there might be */
  43. /* issues re winsock.h included before winsock2.h ) */
  44. #include <windowsx.h>
  45. #ifdef HAVE_NTDDNDIS_H
  46. #include <Ntddndis.h>
  47. #endif
  48. #include "capture_win_ifnames.h"
  49. #include "../capture_wpcap_packet.h"
  50. /* packet32.h requires sockaddr_storage
  51. * whether sockaddr_storage is defined or not depends on the Platform SDK
  52. * version installed. The only one not defining it is the SDK that comes
  53. * with MSVC 6.0 (WINVER 0x0400).
  54. *
  55. * copied from RFC2553 (and slightly modified because of datatypes) ...
  56. * XXX - defined more than once, move this to a header file */
  57. #ifndef WINVER
  58. #error WINVER not defined ...
  59. #endif
  60. #if (WINVER <= 0x0400) && defined(_MSC_VER)
  61. typedef unsigned short eth_sa_family_t;
  62. /*
  63. * Desired design of maximum size and alignment
  64. */
  65. #define ETH_SS_MAXSIZE 128 /* Implementation specific max size */
  66. #define ETH_SS_ALIGNSIZE (sizeof (gint64 /*int64_t*/))
  67. /* Implementation specific desired alignment */
  68. /*
  69. * Definitions used for sockaddr_storage structure paddings design.
  70. */
  71. #define ETH_SS_PAD1SIZE (ETH_SS_ALIGNSIZE - sizeof (eth_sa_family_t))
  72. #define ETH_SS_PAD2SIZE (ETH_SS_MAXSIZE - (sizeof (eth_sa_family_t) + \
  73. ETH_SS_PAD1SIZE + ETH_SS_ALIGNSIZE))
  74. struct sockaddr_storage {
  75. eth_sa_family_t __ss_family; /* address family */
  76. /* Following fields are implementation specific */
  77. char __ss_pad1[ETH_SS_PAD1SIZE];
  78. /* 6 byte pad, this is to make implementation */
  79. /* specific pad up to alignment field that */
  80. /* follows explicit in the data structure */
  81. gint64 /*int64_t*/ __ss_align; /* field to force desired structure */
  82. /* storage alignment */
  83. char __ss_pad2[ETH_SS_PAD2SIZE];
  84. /* 112 byte pad to achieve desired size, */
  85. /* _SS_MAXSIZE value minus size of ss_family */
  86. /* __ss_pad1, __ss_align fields is 112 */
  87. };
  88. /* ... copied from RFC2553 */
  89. #endif /* WINVER */
  90. #include <Packet32.h>
  91. #define DETAILS_STR_MAX 1024
  92. /* The informations and definitions used here are coming from various places on the web:
  93. *
  94. * ndiswrapper (various NDIS related definitions)
  95. * http://cvs.sourceforge.net/viewcvs.py/ndiswrapper/ndiswrapper/driver/
  96. *
  97. * ReactOS (various NDIS related definitions)
  98. * http://www.reactos.org/generated/doxygen/d2/d6d/ndis_8h-source.html
  99. *
  100. * IEEE802.11 "Detailed NDIS OID Log for a 802.11b Miniport"
  101. * http://www.ndis.com/papers/ieee802_11_log.htm
  102. *
  103. * FreeBSD (various NDIS related definitions)
  104. * http://lists.freebsd.org/pipermail/p4-projects/2004-January/003433.html
  105. *
  106. * MS WHDC "Network Drivers and Windows"
  107. * http://www.microsoft.com/whdc/archive/netdrv_up.mspx
  108. *
  109. * IEEE "Get IEEE 802" (the various 802.11 docs)
  110. * http://standards.ieee.org/getieee802/802.11.html
  111. *
  112. * MS MSDN "Network Devices: Windows Driver Kit"
  113. * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/NetXP_r/hh/NetXP_r/netref_4c297a96-2ba5-41ed-ab21-b7a9cfaa9b4d.xml.asp
  114. *
  115. * MS MSDN "Microsoft Windows CE .NET 4.2 Network Driver Reference"
  116. * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceddk40/html/cxgrfNetworkDriverReference.asp
  117. *
  118. * MS MSDN (some explanations of a special MS 802.11 Information Element)
  119. * http://msdn.microsoft.com/library/default.asp?url=/library/en-us/randz/protocol/securing_public_wi-fi_hotspots.asp
  120. *
  121. * "WLANINFO fuer Windows XP"
  122. * http://www-pc.uni-regensburg.de/systemsw/TOOLS/wlaninfo.htm
  123. */
  124. /********************************************************************************/
  125. /* definitions that would usually come from the windows DDK (device driver kit) */
  126. /* and are not part of the ntddndis.h file delivered with WinPcap */
  127. /* Required OIDs */
  128. #define OID_GEN_VLAN_ID 0x0001021C
  129. /* Optional OIDs */
  130. #define OID_GEN_MEDIA_CAPABILITIES 0x00010201
  131. #define OID_GEN_PHYSICAL_MEDIUM 0x00010202
  132. /* Optional OIDs */
  133. #define OID_GEN_NETWORK_LAYER_ADDRESSES 0x00010118
  134. #define OID_GEN_TRANSPORT_HEADER_OFFSET 0x00010119
  135. /* Currently associated SSID (OID_802_11_SSID) */
  136. #define NDIS_ESSID_MAX_SIZE 32
  137. struct ndis_essid {
  138. ULONG length;
  139. UCHAR essid[NDIS_ESSID_MAX_SIZE+1];
  140. };
  141. /* some definitions needed for the following structs */
  142. #define NDIS_MAX_RATES_EX 16
  143. typedef UCHAR mac_address[/* ETH_ALEN */ 6];
  144. typedef UCHAR ndis_rates[NDIS_MAX_RATES_EX];
  145. /* configuration, e.g. frequency (OID_802_11_CONFIGURATION / OID_802_11_BSSID_LIST) */
  146. struct /*packed*/ ndis_configuration {
  147. ULONG length;
  148. ULONG beacon_period;
  149. ULONG atim_window;
  150. ULONG ds_config;
  151. struct ndis_configuration_fh {
  152. ULONG length;
  153. ULONG hop_pattern;
  154. ULONG hop_set;
  155. ULONG dwell_time;
  156. } fh_config;
  157. };
  158. /* bssid list item (OID_802_11_BSSID_LIST) */
  159. struct ndis_ssid_item {
  160. ULONG length;
  161. mac_address mac;
  162. UCHAR reserved[2];
  163. struct ndis_essid ssid;
  164. ULONG privacy;
  165. LONG rssi;
  166. UINT net_type;
  167. struct ndis_configuration config;
  168. UINT mode;
  169. ndis_rates rates;
  170. ULONG ie_length;
  171. UCHAR ies[1];
  172. };
  173. /* bssid list (OID_802_11_BSSID_LIST) */
  174. struct ndis_bssid_list {
  175. ULONG num_items;
  176. struct ndis_ssid_item items[1];
  177. };
  178. /******************************************************************************/
  179. /* OID_TCP_TASK_OFFLOAD specific definitions that would usually come from the */
  180. /* windows DDK (device driver kit) and are not part of the ntddndis.h file */
  181. /* delivered with WinPcap */
  182. /* optional OID */
  183. #define OID_TCP_TASK_OFFLOAD 0xFC010201
  184. /* task id's */
  185. typedef enum _NDIS_TASK {
  186. TcpIpChecksumNdisTask,
  187. IpSecNdisTask,
  188. TcpLargeSendNdisTask,
  189. MaxNdisTask
  190. } NDIS_TASK, *PNDIS_TASK;
  191. /* TaskBuffer content on TcpIpChecksumNdisTask */
  192. typedef struct _NDIS_TASK_TCP_IP_CHECKSUM
  193. {
  194. struct
  195. {
  196. ULONG IpOptionsSupported:1;
  197. ULONG TcpOptionsSupported:1;
  198. ULONG TcpChecksum:1;
  199. ULONG UdpChecksum:1;
  200. ULONG IpChecksum:1;
  201. } V4Transmit;
  202. struct
  203. {
  204. ULONG IpOptionsSupported:1;
  205. ULONG TcpOptionsSupported:1;
  206. ULONG TcpChecksum:1;
  207. ULONG UdpChecksum:1;
  208. ULONG IpChecksum:1;
  209. } V4Receive;
  210. struct
  211. {
  212. ULONG IpOptionsSupported:1;
  213. ULONG TcpOptionsSupported:1;
  214. ULONG TcpChecksum:1;
  215. ULONG UdpChecksum:1;
  216. } V6Transmit;
  217. struct
  218. {
  219. ULONG IpOptionsSupported:1;
  220. ULONG TcpOptionsSupported:1;
  221. ULONG TcpChecksum:1;
  222. ULONG UdpChecksum:1;
  223. } V6Receive;
  224. } NDIS_TASK_TCP_IP_CHECKSUM, *PNDIS_TASK_TCP_IP_CHECKSUM;
  225. /* TaskBuffer content on TcpLargeSendNdisTask */
  226. typedef struct _NDIS_TASK_TCP_LARGE_SEND
  227. {
  228. ULONG Version;
  229. ULONG MaxOffLoadSize;
  230. ULONG MinSegmentCount;
  231. BOOLEAN TcpOptions;
  232. BOOLEAN IpOptions;
  233. } NDIS_TASK_TCP_LARGE_SEND, *PNDIS_TASK_TCP_LARGE_SEND;
  234. /* Encapsulations */
  235. typedef enum _NDIS_ENCAPSULATION {
  236. UNSPECIFIED_Encapsulation,
  237. NULL_Encapsulation,
  238. IEEE_802_3_Encapsulation,
  239. IEEE_802_5_Encapsulation,
  240. LLC_SNAP_ROUTED_Encapsulation,
  241. LLC_SNAP_BRIDGED_Encapsulation
  242. } NDIS_ENCAPSULATION;
  243. /* Encapsulation format */
  244. typedef struct _NDIS_ENCAPSULATION_FORMAT {
  245. NDIS_ENCAPSULATION Encapsulation;
  246. struct {
  247. ULONG FixedHeaderSize : 1;
  248. ULONG Reserved : 31;
  249. } Flags;
  250. ULONG EncapsulationHeaderSize;
  251. } NDIS_ENCAPSULATION_FORMAT, *PNDIS_ENCAPSULATION_FORMAT;
  252. /* request struct */
  253. typedef struct _NDIS_TASK_OFFLOAD_HEADER
  254. {
  255. ULONG Version;
  256. ULONG Size;
  257. ULONG Reserved;
  258. UCHAR OffsetFirstTask;
  259. NDIS_ENCAPSULATION_FORMAT EncapsulationFormat;
  260. } NDIS_TASK_OFFLOAD_HEADER, *PNDIS_TASK_OFFLOAD_HEADER;
  261. /* response struct */
  262. #define NDIS_TASK_OFFLOAD_VERSION 1
  263. typedef struct _NDIS_TASK_OFFLOAD
  264. {
  265. ULONG Version;
  266. ULONG Size;
  267. NDIS_TASK Task;
  268. ULONG OffsetNextTask;
  269. ULONG TaskBufferLength;
  270. UCHAR TaskBuffer[1];
  271. } NDIS_TASK_OFFLOAD, *PNDIS_TASK_OFFLOAD;
  272. /***********************************************************************/
  273. /* value_string's for info functions */
  274. /* NDIS driver medium (OID_GEN_MEDIA_SUPPORTED / OID_GEN_MEDIA_IN_USE) */
  275. static const value_string win32_802_3_medium_vals[] = {
  276. { NdisMedium802_3, "802.3 (Ethernet)" }, /* might as well be WLAN,... (see NDIS_PHYSICAL_MEDIUM)*/
  277. { NdisMedium802_5, "802.5 (Token Ring)" },
  278. { NdisMediumFddi, "FDDI" },
  279. { NdisMediumWan, "WAN" },
  280. { NdisMediumLocalTalk, "Local Talk" },
  281. { NdisMediumDix, "Dix" },
  282. { NdisMediumArcnetRaw, "Arcnet Raw" },
  283. { NdisMediumArcnet878_2, "Arcnet 878_2" },
  284. { NdisMediumAtm, "ATM" },
  285. { NdisMediumWirelessWan, "Wireless WAN" },
  286. { NdisMediumIrda, "Irda" },
  287. { 0, NULL }
  288. };
  289. /* NDIS physical driver medium (OID_GEN_PHYSICAL_MEDIUM) */
  290. static const value_string win32_802_3_physical_medium_vals[] = {
  291. { NdisPhysicalMediumUnspecified, "Unspecified" },
  292. { NdisPhysicalMediumWirelessLan, "Wireless LAN" },
  293. { NdisPhysicalMediumCableModem, "Cable Modem (DOCSIS)" },
  294. { NdisPhysicalMediumPhoneLine, "Phone Line" },
  295. { NdisPhysicalMediumPowerLine, "Power Line" },
  296. { NdisPhysicalMediumDSL, "DSL" },
  297. { NdisPhysicalMediumFibreChannel, "Fibre Channel" },
  298. { NdisPhysicalMedium1394, "IEEE 1394" },
  299. { NdisPhysicalMediumWirelessWan, "Wireless WAN" },
  300. { 0, NULL }
  301. };
  302. static const value_string win32_802_11_infra_mode_vals[] = {
  303. { Ndis802_11IBSS, "Ad Hoc" },
  304. { Ndis802_11Infrastructure, "Access Point" },
  305. { Ndis802_11AutoUnknown, "Auto or unknown" },
  306. { 0, NULL }
  307. };
  308. static const value_string win32_802_11_auth_mode_vals[] = {
  309. { Ndis802_11AuthModeOpen, "Open System" },
  310. { Ndis802_11AuthModeShared, "Shared Key" },
  311. { Ndis802_11AuthModeAutoSwitch, "Auto Switch" },
  312. { Ndis802_11AuthModeWPA, "WPA" },
  313. { Ndis802_11AuthModeWPAPSK, "WPA-PSK (pre shared key)" },
  314. { Ndis802_11AuthModeWPANone, "WPA (ad hoc)" },
  315. #if (_MSC_VER != 1400) /* These are not defined in Ntddndis.h in MSVC2005/MSVC2005EE PSDK */
  316. { Ndis802_11AuthModeWPA2, "WPA2" },
  317. { Ndis802_11AuthModeWPA2PSK, "WPA2-PSK (pre shared key)" },
  318. #endif
  319. { 0, NULL }
  320. };
  321. static const value_string win32_802_11_network_type_vals[] = {
  322. { Ndis802_11FH, "FH (frequency-hopping spread-spectrum)" },
  323. { Ndis802_11DS, "DS (direct-sequence spread-spectrum)" },
  324. { Ndis802_11OFDM5, "5-GHz OFDM" },
  325. { Ndis802_11OFDM24, "2.4-GHz OFDM" },
  326. #if (_MSC_VER != 1400) /* These are not defined in Ntddndis.h in MSVC2005/MSVC2005EE PSDK */
  327. { Ndis802_11Automode, "Auto" },
  328. #endif
  329. { 0, NULL }
  330. };
  331. static const value_string win32_802_11_encryption_status_vals[] = {
  332. { Ndis802_11Encryption1Enabled, "WEP enabled, TKIP & AES disabled, transmit key available" },
  333. { Ndis802_11EncryptionDisabled, "WEP & TKIP & AES disabled, transmit key available" },
  334. { Ndis802_11Encryption1KeyAbsent, "WEP enabled, TKIP & AES disabled, transmit key unavailable" },
  335. { Ndis802_11EncryptionNotSupported, "WEP & TKIP & AES not supported" },
  336. { Ndis802_11Encryption2Enabled, "WEP & TKIP enabled, AES disabled, transmit key available" },
  337. { Ndis802_11Encryption2KeyAbsent, "WEP & TKIP enabled, AES disabled, transmit key unavailable" },
  338. { Ndis802_11Encryption3Enabled, "WEP & TKIP & AES enabled, transmit key available" },
  339. { Ndis802_11Encryption3KeyAbsent, "WEP & TKIP & AES enabled, transmit key unavailable" },
  340. { 0, NULL }
  341. };
  342. /* frequency to channel mapping (OID_802_11_CONFIGURATION) */
  343. static const value_string win32_802_11_channel_freq_vals[] = {
  344. { 2412000, "1 (2412 MHz)" },
  345. { 2417000, "2 (2417 MHz)" },
  346. { 2422000, "3 (2422 MHz)" },
  347. { 2427000, "4 (2427 MHz)" },
  348. { 2432000, "5 (2432 MHz)" },
  349. { 2437000, "6 (2437 MHz)" },
  350. { 2442000, "7 (2442 MHz)" },
  351. { 2447000, "8 (2447 MHz)" },
  352. { 2452000, "9 (2452 MHz)" },
  353. { 2457000, "10 (2457 MHz)" },
  354. { 2462000, "11 (2462 MHz)" },
  355. { 2467000, "12 (2467 MHz)" },
  356. { 2472000, "13 (2472 MHz)" },
  357. { 2484000, "14 (2484 MHz)" },
  358. { 0, NULL }
  359. };
  360. /* frequency to channel mapping (OID_802_11_CONFIGURATION) */
  361. static const value_string win32_802_11_channel_vals[] = {
  362. { 2412000, "1" },
  363. { 2417000, "2" },
  364. { 2422000, "3" },
  365. { 2427000, "4" },
  366. { 2432000, "5" },
  367. { 2437000, "6" },
  368. { 2442000, "7" },
  369. { 2447000, "8" },
  370. { 2452000, "9" },
  371. { 2457000, "10" },
  372. { 2462000, "11" },
  373. { 2467000, "12" },
  374. { 2472000, "13" },
  375. { 2484000, "14" },
  376. { 0, NULL }
  377. };
  378. /* Information Element IDs (802.11 Spec: "7.3.2 Information elements") */
  379. #define IE_ID_SSID 0
  380. #define IE_ID_SUPPORTED_RATES 1
  381. #define IE_ID_DS_PARAMETER_SET 3
  382. #define IE_ID_TIM 5
  383. #define IE_ID_COUNTRY 7
  384. #define IE_ID_ERP_INFORMATION 42
  385. #define IE_ID_WPA2 48
  386. #define IE_ID_EXTENDED_SUPPORT_RATES 50
  387. #define IE_ID_VENDOR_SPECIFIC 221
  388. #ifdef DEBUG_IE
  389. /* ElementID in NDIS_802_11_VARIABLE_IEs */
  390. static const value_string ie_id_vals[] = {
  391. { IE_ID_SSID, "SSID, 802.11" },
  392. { IE_ID_SUPPORTED_RATES, "Supported Rates, 802.11" },
  393. { 2, "FH Parameter Set, 802.11" },
  394. { IE_ID_DS_PARAMETER_SET, "DS Parameter Set, 802.11" },
  395. { 4, "CF Parameter Set, 802.11" },
  396. { IE_ID_TIM, "TIM, 802.11" },
  397. { 6, "IBSS Parameter Set, 802.11" },
  398. { IE_ID_COUNTRY, "Country, 802.11d" },
  399. { 8, "Hopping Pattern Parameters, 802.11d" },
  400. { 9, "Hopping Pattern Table, 802.11d" },
  401. { 10, "Request, 802.11d" },
  402. /* 11-15 reserved, 802.11d */
  403. { 16, "Challenge text, 802.11" },
  404. /* 17-31 reserved, 802.11h */
  405. { 32, "Power Constraint, 802.11h" },
  406. { 33, "Power Capability, 802.11h" },
  407. { 34, "TPC Request, 802.11h" },
  408. { 35, "TPC Report, 802.11h" },
  409. { 36, "Supported Channels, 802.11h" },
  410. { 37, "Channel Switch Announcement, 802.11h" },
  411. { 38, "Measurement Request, 802.11h" },
  412. { 39, "Measurement Report, 802.11h" },
  413. { 40, "Quiet, 802.11h" },
  414. { 41, "IBSS DFS, 802.11h" },
  415. { IE_ID_ERP_INFORMATION, "ERP information, 802.11g" },
  416. /* 43-47 reserved, 802.11i */
  417. { IE_ID_WPA2, "WPA2/RSN (Robust Secure Network), 802.11i" },
  418. /* 49 reserved, 802.11i */
  419. { IE_ID_EXTENDED_SUPPORT_RATES, "Extended Supported Rates, 802.11g" },
  420. /* 51-255 reserved, 802.11g */
  421. { IE_ID_VENDOR_SPECIFIC, "WPA, (not 802.11!)" },
  422. { 0, NULL }
  423. };
  424. #endif
  425. #if 0
  426. static const value_string oid_vals[] = {
  427. { OID_GEN_SUPPORTED_LIST, "OID_GEN_SUPPORTED_LIST" },
  428. { OID_GEN_HARDWARE_STATUS, "OID_GEN_HARDWARE_STATUS (only internally interesting)" },
  429. { OID_GEN_MEDIA_SUPPORTED, "OID_GEN_MEDIA_SUPPORTED" },
  430. { OID_GEN_MEDIA_IN_USE, "OID_GEN_MEDIA_IN_USE" },
  431. { OID_GEN_MAXIMUM_LOOKAHEAD, "OID_GEN_MAXIMUM_LOOKAHEAD (unused)" },
  432. { OID_GEN_MAXIMUM_FRAME_SIZE, "OID_GEN_MAXIMUM_FRAME_SIZE (unused)" },
  433. { OID_GEN_LINK_SPEED, "OID_GEN_LINK_SPEED" },
  434. { OID_GEN_TRANSMIT_BUFFER_SPACE, "OID_GEN_TRANSMIT_BUFFER_SPACE" },
  435. { OID_GEN_RECEIVE_BUFFER_SPACE, "OID_GEN_RECEIVE_BUFFER_SPACE" },
  436. { OID_GEN_TRANSMIT_BLOCK_SIZE, "OID_GEN_TRANSMIT_BLOCK_SIZE" },
  437. { OID_GEN_RECEIVE_BLOCK_SIZE, "OID_GEN_RECEIVE_BLOCK_SIZE" },
  438. { OID_GEN_VENDOR_ID, "OID_GEN_VENDOR_ID" },
  439. { OID_GEN_VENDOR_DESCRIPTION, "OID_GEN_VENDOR_DESCRIPTION" },
  440. { OID_GEN_CURRENT_PACKET_FILTER, "OID_GEN_CURRENT_PACKET_FILTER (info seems to be constant)" },
  441. { OID_GEN_CURRENT_LOOKAHEAD, "OID_GEN_CURRENT_LOOKAHEAD (only internally interesting)" },
  442. { OID_GEN_DRIVER_VERSION, "OID_GEN_DRIVER_VERSION" },
  443. { OID_GEN_MAXIMUM_TOTAL_SIZE, "OID_GEN_MAXIMUM_TOTAL_SIZE" },
  444. { OID_GEN_PROTOCOL_OPTIONS, "OID_GEN_PROTOCOL_OPTIONS (info not interesting)" },
  445. { OID_GEN_MAC_OPTIONS, "OID_GEN_MAC_OPTIONS" },
  446. { OID_GEN_MEDIA_CONNECT_STATUS, "OID_GEN_MEDIA_CONNECT_STATUS" },
  447. { OID_GEN_MAXIMUM_SEND_PACKETS, "OID_GEN_MAXIMUM_SEND_PACKETS (only internally interesting)" },
  448. { OID_GEN_VENDOR_DRIVER_VERSION, "OID_GEN_VENDOR_DRIVER_VERSION" },
  449. { OID_GEN_XMIT_OK, "OID_GEN_XMIT_OK" },
  450. { OID_GEN_RCV_OK, "OID_GEN_RCV_OK" },
  451. { OID_GEN_XMIT_ERROR, "OID_GEN_XMIT_ERROR" },
  452. { OID_GEN_RCV_ERROR, "OID_GEN_RCV_ERROR" },
  453. { OID_GEN_RCV_NO_BUFFER, "OID_GEN_RCV_NO_BUFFER" },
  454. { OID_GEN_DIRECTED_BYTES_XMIT, "OID_GEN_DIRECTED_BYTES_XMIT" },
  455. { OID_GEN_DIRECTED_FRAMES_XMIT, "OID_GEN_DIRECTED_FRAMES_XMIT" },
  456. { OID_GEN_MULTICAST_BYTES_XMIT, "OID_GEN_MULTICAST_BYTES_XMIT" },
  457. { OID_GEN_MULTICAST_FRAMES_XMIT, "OID_GEN_MULTICAST_FRAMES_XMIT" },
  458. { OID_GEN_BROADCAST_BYTES_XMIT, "OID_GEN_BROADCAST_BYTES_XMIT" },
  459. { OID_GEN_BROADCAST_FRAMES_XMIT, "OID_GEN_BROADCAST_FRAMES_XMIT" },
  460. { OID_GEN_DIRECTED_BYTES_RCV, "OID_GEN_DIRECTED_BYTES_RCV" },
  461. { OID_GEN_DIRECTED_FRAMES_RCV, "OID_GEN_DIRECTED_FRAMES_RCV" },
  462. { OID_GEN_MULTICAST_BYTES_RCV, "OID_GEN_MULTICAST_BYTES_RCV" },
  463. { OID_GEN_MULTICAST_FRAMES_RCV, "OID_GEN_MULTICAST_FRAMES_RCV" },
  464. { OID_GEN_BROADCAST_BYTES_RCV, "OID_GEN_BROADCAST_BYTES_RCV" },
  465. { OID_GEN_BROADCAST_FRAMES_RCV, "OID_GEN_BROADCAST_FRAMES_RCV" },
  466. { OID_GEN_RCV_CRC_ERROR, "OID_GEN_RCV_CRC_ERROR" },
  467. { OID_GEN_TRANSMIT_QUEUE_LENGTH, "OID_GEN_TRANSMIT_QUEUE_LENGTH" },
  468. { OID_GEN_GET_TIME_CAPS, "OID_GEN_GET_TIME_CAPS (unsupp, unused)" },
  469. { OID_GEN_GET_NETCARD_TIME, "OID_GEN_GET_NETCARD_TIME (unsupp, unused)" },
  470. { OID_GEN_PHYSICAL_MEDIUM, "OID_GEN_PHYSICAL_MEDIUM" },
  471. /*{ OID_GEN_MACHINE_NAME, "OID_GEN_MACHINE_NAME (unsupp, unused)" },*/
  472. { OID_GEN_VLAN_ID, "OID_GEN_VLAN_ID" },
  473. { OID_GEN_MEDIA_CAPABILITIES, "OID_GEN_MEDIA_CAPABILITIES (unsupp, unused)" },
  474. { OID_GEN_NETWORK_LAYER_ADDRESSES, "OID_GEN_NETWORK_LAYER_ADDRESSES (write only)" },
  475. { OID_GEN_TRANSPORT_HEADER_OFFSET, "OID_GEN_TRANSPORT_HEADER_OFFSET (write only)" },
  476. { OID_802_3_PERMANENT_ADDRESS, "OID_802_3_PERMANENT_ADDRESS" },
  477. { OID_802_3_CURRENT_ADDRESS, "OID_802_3_CURRENT_ADDRESS" },
  478. { OID_802_3_MAXIMUM_LIST_SIZE, "OID_802_3_MAXIMUM_LIST_SIZE (unused)" },
  479. { OID_802_3_MULTICAST_LIST, "OID_802_3_MULTICAST_LIST (unused)" }, /* XXX */
  480. { OID_802_3_MAC_OPTIONS, "OID_802_3_MAC_OPTIONS (unsupp, unused)" },
  481. { OID_802_3_RCV_ERROR_ALIGNMENT, "OID_802_3_RCV_ERROR_ALIGNMENT" },
  482. { OID_802_3_XMIT_ONE_COLLISION, "OID_802_3_XMIT_ONE_COLLISION" },
  483. { OID_802_3_XMIT_MORE_COLLISIONS, "OID_802_3_XMIT_MORE_COLLISIONS" },
  484. { OID_802_3_XMIT_DEFERRED, "OID_802_3_XMIT_DEFERRED" },
  485. { OID_802_3_XMIT_MAX_COLLISIONS, "OID_802_3_XMIT_MAX_COLLISIONS" },
  486. { OID_802_3_RCV_OVERRUN, "OID_802_3_RCV_OVERRUN" },
  487. { OID_802_3_XMIT_UNDERRUN, "OID_802_3_XMIT_UNDERRUN" },
  488. { OID_802_3_XMIT_HEARTBEAT_FAILURE, "OID_802_3_XMIT_HEARTBEAT_FAILURE (unsupp, used)" },
  489. { OID_802_3_XMIT_TIMES_CRS_LOST, "OID_802_3_XMIT_TIMES_CRS_LOST (unsupp, used)" },
  490. { OID_802_3_XMIT_LATE_COLLISIONS, "OID_802_3_XMIT_LATE_COLLISIONS" },
  491. { OID_802_11_BSSID, "OID_802_11_BSSID" },
  492. { OID_802_11_SSID, "OID_802_11_SSID" },
  493. { OID_802_11_NETWORK_TYPES_SUPPORTED, "OID_802_11_NETWORK_TYPES_SUPPORTED (info not interesting)" },
  494. { OID_802_11_NETWORK_TYPE_IN_USE, "OID_802_11_NETWORK_TYPE_IN_USE" },
  495. { OID_802_11_TX_POWER_LEVEL, "OID_802_11_TX_POWER_LEVEL (unsupp, used)" },
  496. { OID_802_11_RSSI, "OID_802_11_RSSI" },
  497. { OID_802_11_RSSI_TRIGGER, "OID_802_11_RSSI_TRIGGER (unsupp, unused)" },
  498. { OID_802_11_INFRASTRUCTURE_MODE, "OID_802_11_INFRASTRUCTURE_MODE" },
  499. { OID_802_11_FRAGMENTATION_THRESHOLD, "OID_802_11_FRAGMENTATION_THRESHOLD (unused)" },
  500. { OID_802_11_RTS_THRESHOLD, "OID_802_11_RTS_THRESHOLD (unused)" },
  501. { OID_802_11_NUMBER_OF_ANTENNAS, "OID_802_11_NUMBER_OF_ANTENNAS (unsupp, unused)" },
  502. { OID_802_11_RX_ANTENNA_SELECTED, "OID_802_11_RX_ANTENNA_SELECTED (unsupp, unused)" },
  503. { OID_802_11_TX_ANTENNA_SELECTED, "OID_802_11_TX_ANTENNA_SELECTED (unsupp, unused)" },
  504. { OID_802_11_SUPPORTED_RATES, "OID_802_11_SUPPORTED_RATES" },
  505. { OID_802_11_DESIRED_RATES, "OID_802_11_DESIRED_RATES (unsupp, used)" },
  506. { OID_802_11_CONFIGURATION, "OID_802_11_CONFIGURATION" },
  507. { OID_802_11_STATISTICS, "OID_802_11_STATISTICS (unsupp, unused)" },
  508. { OID_802_11_ADD_WEP, "OID_802_11_ADD_WEP (write only)" },
  509. { OID_802_11_REMOVE_WEP, "OID_802_11_REMOVE_WEP (write only)" },
  510. { OID_802_11_DISASSOCIATE, "OID_802_11_DISASSOCIATE (write only)" },
  511. { OID_802_11_POWER_MODE, "OID_802_11_POWER_MODE (info not interesting)" },
  512. { OID_802_11_BSSID_LIST, "OID_802_11_BSSID_LIST" },
  513. { OID_802_11_AUTHENTICATION_MODE, "OID_802_11_AUTHENTICATION_MODE" },
  514. { OID_802_11_PRIVACY_FILTER, "OID_802_11_PRIVACY_FILTER (info not interesting)" },
  515. { OID_802_11_BSSID_LIST_SCAN, "OID_802_11_BSSID_LIST_SCAN" },
  516. { OID_802_11_WEP_STATUS, "OID_802_11_WEP_STATUS (info not interesting?)" },
  517. { OID_802_11_ENCRYPTION_STATUS, "OID_802_11_ENCRYPTION_STATUS (unsupp, used)" },
  518. { OID_802_11_RELOAD_DEFAULTS, "OID_802_11_RELOAD_DEFAULTS (write only)" },
  519. { OID_802_11_ADD_KEY, "OID_802_11_ADD_KEY (write only)" },
  520. { OID_802_11_REMOVE_KEY, "OID_802_11_REMOVE_KEY (write only)" },
  521. { OID_802_11_ASSOCIATION_INFORMATION, "OID_802_11_ASSOCIATION_INFORMATION (unused)" }, /* XXX */
  522. { OID_802_11_TEST, "OID_802_11_TEST (write only)" },
  523. #if (_MSC_VER != 1400) /* These are not defined in Ntddndis.h in MSVC2005/MSVC2005EE PSDK */
  524. { OID_802_11_CAPABILITY, "OID_802_11_CAPABILITY (unsupp, unused)" },
  525. { OID_802_11_PMKID, "OID_802_11_PMKID (unsupp, unused)" },
  526. #endif
  527. /* Token-Ring list is utterly incomplete (contains only the values for MS Loopback Driver) */
  528. { OID_802_5_PERMANENT_ADDRESS, "OID_802_5_PERMANENT_ADDRESS (unused)" },
  529. { OID_802_5_CURRENT_ADDRESS, "OID_802_5_CURRENT_ADDRESS (unused)" },
  530. { OID_802_5_CURRENT_FUNCTIONAL, "OID_802_5_CURRENT_FUNCTIONAL (unused)" },
  531. { OID_802_5_CURRENT_GROUP, "OID_802_5_CURRENT_GROUP (unused)" },
  532. { OID_802_5_LAST_OPEN_STATUS, "OID_802_5_LAST_OPEN_STATUS (unused)" },
  533. { OID_802_5_CURRENT_RING_STATUS, "OID_802_5_CURRENT_RING_STATUS (unused)" },
  534. { OID_802_5_CURRENT_RING_STATE, "OID_802_5_CURRENT_RING_STATE (unused)" },
  535. { OID_802_5_LINE_ERRORS, "OID_802_5_LINE_ERRORS (unused)" },
  536. { OID_802_5_LOST_FRAMES, "OID_802_5_LOST_FRAMES (unused)" },
  537. /* FDDI list is utterly incomplete (contains only the values for MS Loopback Driver) */
  538. { OID_FDDI_LONG_PERMANENT_ADDR, "OID_FDDI_LONG_PERMANENT_ADDR (unused)" },
  539. { OID_FDDI_LONG_CURRENT_ADDR, "OID_FDDI_LONG_CURRENT_ADDR (unused)" },
  540. { OID_FDDI_LONG_MULTICAST_LIST, "OID_FDDI_LONG_MULTICAST_LIST (unused)" },
  541. { OID_FDDI_LONG_MAX_LIST_SIZE, "OID_FDDI_LONG_MAX_LIST_SIZE (unused)" },
  542. { OID_FDDI_SHORT_PERMANENT_ADDR, "OID_FDDI_SHORT_PERMANENT_ADDR (unused)" },
  543. { OID_FDDI_SHORT_CURRENT_ADDR, "OID_FDDI_SHORT_CURRENT_ADDR (unused)" },
  544. { OID_FDDI_SHORT_MULTICAST_LIST, "OID_FDDI_SHORT_MULTICAST_LIST (unused)" },
  545. { OID_FDDI_SHORT_MAX_LIST_SIZE, "OID_FDDI_SHORT_MAX_LIST_SIZE (unused)" },
  546. /* LocalTalk list is utterly incomplete (contains only the values for MS Loopback Driver) */
  547. { OID_LTALK_CURRENT_NODE_ID, "OID_LTALK_CURRENT_NODE_ID (unused)" },
  548. /* Arcnet list is utterly incomplete (contains only the values for MS Loopback Driver) */
  549. { OID_ARCNET_PERMANENT_ADDRESS, "OID_ARCNET_PERMANENT_ADDRESS (unused)" },
  550. { OID_ARCNET_CURRENT_ADDRESS, "OID_ARCNET_CURRENT_ADDRESS (unused)" },
  551. { OID_TCP_TASK_OFFLOAD, "OID_TCP_TASK_OFFLOAD" },
  552. /* PnP and power management OIDs */
  553. { OID_PNP_CAPABILITIES, "OID_PNP_CAPABILITIES (unused)" },
  554. { OID_PNP_SET_POWER, "OID_PNP_SET_POWER (write only)" },
  555. { OID_PNP_QUERY_POWER, "OID_PNP_QUERY_POWER (unused)" },
  556. { OID_PNP_ADD_WAKE_UP_PATTERN, "OID_PNP_ADD_WAKE_UP_PATTERN (write only)" },
  557. { OID_PNP_REMOVE_WAKE_UP_PATTERN, "OID_PNP_REMOVE_WAKE_UP_PATTERN (write only)" },
  558. { OID_PNP_WAKE_UP_PATTERN_LIST, "OID_PNP_WAKE_UP_PATTERN_LIST (unused)" },
  559. { OID_PNP_ENABLE_WAKE_UP, "OID_PNP_ENABLE_WAKE_UP (unused)" },
  560. /* Unknown OID's (seen on an "Intel(R) PRO/Wireless 2200BG" 802.11 interface) */
  561. { 0xFF100000, "Unknown 0xFF100000 (unused)" },
  562. { 0xFF100002, "Unknown 0xFF100002 (unused)" },
  563. { 0xFF100003, "Unknown 0xFF100003 (unused)" },
  564. { 0xFF100004, "Unknown 0xFF100004 (unused)" },
  565. { 0xFF100005, "Unknown 0xFF100005 (unused)" },
  566. { 0xFF100006, "Unknown 0xFF100006 (unused)" },
  567. { 0xFF100007, "Unknown 0xFF100007 (unused)" },
  568. { 0xFF100009, "Unknown 0xFF100009 (unused)" },
  569. { 0xFF10000b, "Unknown 0xFF10000b (unused)" },
  570. { 0xFF10000c, "Unknown 0xFF10000c (unused)" },
  571. { 0xFF10000e, "Unknown 0xFF10000e (unused)" },
  572. { 0xFF10000f, "Unknown 0xFF10000f (unused)" },
  573. /* continued by a lot more 0xFF... values */
  574. { 0, NULL }
  575. };
  576. #endif
  577. /***************************************************************************/
  578. /* debug functions, query or list supported NDIS OID's */
  579. #if 0
  580. static void
  581. supported_list(LPADAPTER adapter)
  582. {
  583. unsigned char values[10000];
  584. int length;
  585. g_warning("supported_list_unhandled");
  586. length = sizeof(values);
  587. if (wpcap_packet_request(adapter, OID_GEN_SUPPORTED_LIST, FALSE /* !set */, values, &length)) {
  588. guint32 *value = (guint32 *)values;
  589. while (length >= 4) {
  590. printf("OID: 0x%08X %s\n", *value, val_to_str(*value, oid_vals, "unknown"));
  591. value++;
  592. length -= 4;
  593. }
  594. }
  595. }
  596. static gboolean
  597. supported_query_oid(LPADAPTER adapter, guint32 oid)
  598. {
  599. unsigned char values[10000];
  600. int length;
  601. length = sizeof(values);
  602. if (wpcap_packet_request(adapter, OID_GEN_SUPPORTED_LIST, FALSE /* !set */, values, &length)) {
  603. guint32 *value = (guint32 *) values;
  604. while (length >= 4) {
  605. if (*value == oid) {
  606. return TRUE;
  607. }
  608. value++;
  609. length -= 4;
  610. }
  611. }
  612. return FALSE;
  613. }
  614. #endif
  615. /******************************************************************************/
  616. /* info functions, get and display various NDIS driver values */
  617. #if 0
  618. GtkWidget *meter;
  619. GtkWidget *val_lb;
  620. static GtkWidget *
  621. add_meter_to_grid(GtkWidget *grid, guint *row, gchar *title,
  622. int value, gchar *value_title,
  623. int min, int max,
  624. int yellow_level,
  625. GList *scale)
  626. {
  627. GtkWidget *label;
  628. gchar *indent;
  629. GtkWidget *main_hb;
  630. /* the label */
  631. indent = g_strdup_printf(" %s", title);
  632. label = gtk_label_new(indent);
  633. g_free(indent);
  634. gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
  635. ws_gtk_grid_attach_extended(GTK_GRID(grid), label, 0, *row, 1, 1, GTK_EXPAND|GTK_FILL, 0, 0,0);
  636. /* the level meter */
  637. main_hb = ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 6, FALSE);
  638. meter = gtk_vumeter_new ();
  639. gtk_vumeter_set_orientation(GTK_VUMETER(meter), GTK_VUMETER_LEFT_TO_RIGHT);
  640. gtk_vumeter_set_min_max(GTK_VUMETER(meter), &min, &max);
  641. gtk_vumeter_set_yellow_level (GTK_VUMETER(meter), yellow_level);
  642. gtk_vumeter_set_thickness (GTK_VUMETER(meter), 10);
  643. gtk_vumeter_set_thickness_reduction (GTK_VUMETER(meter), 2);
  644. gtk_vumeter_set_scale_hole_size (GTK_VUMETER(meter), 2);
  645. gtk_vumeter_set_colors_inverted (GTK_VUMETER(meter), TRUE);
  646. if (scale) {
  647. gtk_vumeter_set_scale_items(GTK_VUMETER(meter), scale);
  648. }
  649. gtk_vumeter_set_level(GTK_VUMETER(meter), value);
  650. gtk_box_pack_start (GTK_BOX(main_hb),
  651. meter,
  652. TRUE /*expand*/,
  653. TRUE /*fill*/,
  654. 0 /* padding */);
  655. val_lb = gtk_label_new(value_title);
  656. gtk_widget_set_size_request(val_lb, 50, -1);
  657. gtk_misc_set_alignment(GTK_MISC(val_lb), 1.0, 0.5);
  658. gtk_box_pack_start (GTK_BOX(main_hb),
  659. val_lb,
  660. FALSE /*expand*/,
  661. FALSE /*fill*/,
  662. 0 /* padding */);
  663. ws_gtk_grid_attach_extended(GTK_GRID(grid), main_hb, 1, *row, 1, 1, GTK_EXPAND|GTK_FILL, 0, 0,0);
  664. *row += 1;
  665. return meter;
  666. }
  667. #endif
  668. static void
  669. add_row_to_grid(GtkWidget *grid, guint *row, gchar *title, const gchar *value, gboolean sensitive)
  670. {
  671. GtkWidget *label;
  672. gchar *indent;
  673. if (strlen(value) != 0) {
  674. indent = g_strdup_printf(" %s", title);
  675. } else {
  676. indent = g_strdup(title);
  677. }
  678. label = gtk_label_new(indent);
  679. g_free(indent);
  680. gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
  681. gtk_widget_set_sensitive(label, sensitive);
  682. ws_gtk_grid_attach_extended(GTK_GRID(grid), label, 0, *row, 1, 1, GTK_EXPAND | GTK_FILL, 0, 0,0);
  683. label = gtk_label_new(value);
  684. gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5);
  685. gtk_widget_set_sensitive(label, sensitive);
  686. ws_gtk_grid_attach_extended(GTK_GRID(grid), label, 1, *row, 1, 1, GTK_EXPAND | GTK_FILL, 0, 0,0);
  687. *row += 1;
  688. }
  689. #if 0
  690. static void
  691. add_string_to_grid_sensitive(GtkWidget *grid, guint *row, gchar *title, gchar *value, gboolean sensitive)
  692. {
  693. add_row_to_grid(grid, row, title, value, sensitive);
  694. }
  695. #endif
  696. static void
  697. add_string_to_grid(GtkWidget *grid, guint *row, gchar *title, const gchar *value)
  698. {
  699. add_row_to_grid(grid, row, title, value, TRUE);
  700. }
  701. static void
  702. ssid_details(GtkWidget *grid, guint *row, struct ndis_essid *ssid_in) {
  703. struct ndis_essid ssid[2]; /* prevent an off by one error */
  704. ssid[0] = *ssid_in;
  705. g_assert(ssid->length <= NDIS_ESSID_MAX_SIZE);
  706. if (ssid->length != 0) {
  707. ssid->essid[ssid->length] = '\0';
  708. add_string_to_grid(grid, row, "SSID (Service Set IDentifier)", ssid->essid);
  709. } else {
  710. add_string_to_grid(grid, row, "SSID (Service Set IDentifier)", "(currently not associated with an SSID)");
  711. }
  712. }
  713. static GString *
  714. rates_details(unsigned char *values, int length) {
  715. int i;
  716. GString *Rates;
  717. float float_value;
  718. int int_value;
  719. Rates = g_string_new("");
  720. if (length != 0) {
  721. i = 0;
  722. while (length--) {
  723. if (values[i]) {
  724. if (i != 0) {
  725. g_string_append(Rates, "/");
  726. }
  727. float_value = ((float) (values[i] & 0x7F)) / 2;
  728. /* reduce the screen estate by showing fractions only where required */
  729. int_value = (int)float_value;
  730. if (float_value == (float)int_value) {
  731. g_string_append_printf(Rates, "%.0f", float_value);
  732. } else {
  733. g_string_append_printf(Rates, "%.1f", float_value);
  734. }
  735. }
  736. i++;
  737. }
  738. Rates = g_string_append(Rates, " MBits/s");
  739. } else {
  740. Rates = g_string_append(Rates, "-");
  741. }
  742. return Rates;
  743. }
  744. #if 0
  745. static GList *
  746. rates_vu_list(unsigned char *values, int length, int *max)
  747. {
  748. int i;
  749. GList *Rates = NULL;
  750. GtkVUMeterScaleItem *item;
  751. *max = 0;
  752. if (length == 0) {
  753. return NULL;
  754. }
  755. /* add a zero scale point */
  756. item = g_malloc(sizeof(GtkVUMeterScaleItem));
  757. item->level = 0;
  758. item->large = TRUE;
  759. item->label = "0";
  760. Rates = g_list_append(Rates, item);
  761. /* get the maximum rate */
  762. for(i=0; i<length; i++) {
  763. gint level;
  764. if (values[i]) {
  765. level = (values[i] & 0x7F) / 2;
  766. if (level > *max) {
  767. *max = level;
  768. }
  769. }
  770. }
  771. /* debug: fake the 108MBit entry (I don't own one :-) */
  772. *max = 108;
  773. item = g_malloc(sizeof(GtkVUMeterScaleItem));
  774. item->level = 108;
  775. item->large = TRUE;
  776. item->label = "108";
  777. Rates = g_list_append(Rates, item);
  778. for(i=0; i<length; i++) {
  779. if (values[i]) {
  780. /* reduce the screen estate by showing fractions only where required */
  781. item = g_malloc(sizeof(GtkVUMeterScaleItem));
  782. item->level = (values[i] & 0x7F) / 2;
  783. /* common data rates: */
  784. /* 802.11 (15.1) : mandatory: 2, 1 */
  785. /* 802.11a (17.1) : mandatory: 24, 12, 6 optional: 54, 48, 36, 18, 9 */
  786. /* 802.11b (18.1) : mandatory: 11, 5.5 (+ 2, 1) */
  787. /* 802.11g (19.1.1): mandatory: 24, 12, 11, 6, 5.5, 2, 1 optional: 54, 48, 36, 33, 22, 18, 9 */
  788. /* 802.11n: ? */
  789. /* proprietary: 108 */
  790. switch (item->level) {
  791. case 2:
  792. if (*max >= 108) {
  793. item->large = FALSE;
  794. item->label = NULL;
  795. } else {
  796. item->large = TRUE;
  797. item->label = "2";
  798. }
  799. break;
  800. case 5:
  801. item->large = TRUE;
  802. item->label = "5.5";
  803. break;
  804. case 11:
  805. item->large = TRUE;
  806. item->label = "11";
  807. break;
  808. case 18:
  809. item->large = TRUE;
  810. item->label = "18";
  811. break;
  812. case 24:
  813. item->large = TRUE;
  814. item->label = "24";
  815. break;
  816. case 36:
  817. item->large = TRUE;
  818. item->label = "36";
  819. break;
  820. case 48:
  821. item->large = TRUE;
  822. item->label = "48";
  823. break;
  824. case 54:
  825. item->large = TRUE;
  826. item->label = "54";
  827. break;
  828. case 72: /* XXX */
  829. item->large = TRUE;
  830. item->label = "72";
  831. break;
  832. case 96: /* XXX */
  833. item->large = TRUE;
  834. item->label = "96";
  835. break;
  836. case 108:
  837. item->large = TRUE;
  838. item->label = "108";
  839. break;
  840. default:
  841. item->large = FALSE;
  842. item->label = NULL;
  843. }
  844. Rates = g_list_append(Rates, item);
  845. }
  846. }
  847. return Rates;
  848. }
  849. #endif
  850. /* debugging only */
  851. static void
  852. hex(unsigned char *p, int len) {
  853. int i = 0;
  854. while (len) {
  855. g_warning("%u: 0x%x (%u) '%c'", i, *p, *p,
  856. isprint(*p) ? *p : '.');
  857. i++;
  858. p++;
  859. len--;
  860. }
  861. }
  862. static void
  863. capture_if_details_802_11_bssid_list(GtkWidget *main_vb, struct ndis_bssid_list *bssid_list)
  864. {
  865. struct ndis_ssid_item *bssid_item;
  866. unsigned char mac[6];
  867. const gchar *manuf_name;
  868. GString *Rates;
  869. if (bssid_list->num_items != 0) {
  870. static const char *titles[] = { "SSID", "MAC", "Vendor", "Privacy", "RSSI" , "Network Type" ,
  871. "Infra. Mode" , "Ch." , "Rates", "Country" };
  872. GtkWidget *list;
  873. gboolean privacy_required;
  874. gboolean privacy_wpa;
  875. gboolean privacy_wpa2;
  876. gchar ssid_buff [DETAILS_STR_MAX];
  877. gchar mac_buff [DETAILS_STR_MAX];
  878. gchar vendor_buff [DETAILS_STR_MAX];
  879. gchar privacy_buff [DETAILS_STR_MAX];
  880. gchar rssi_buff [DETAILS_STR_MAX];
  881. gchar nettype_buff [DETAILS_STR_MAX];
  882. gchar infra_buff [DETAILS_STR_MAX];
  883. gchar freq_buff [DETAILS_STR_MAX];
  884. gchar country_buff [DETAILS_STR_MAX] = "";
  885. list = simple_list_new(10, titles);
  886. gtk_box_pack_start(GTK_BOX(main_vb), list, TRUE /*expand*/, TRUE /*fill*/, 0 /* padding */);
  887. bssid_item = &bssid_list->items[0];
  888. while (bssid_list->num_items--) {
  889. privacy_required = FALSE;
  890. privacy_wpa = FALSE;
  891. privacy_wpa2 = FALSE;
  892. /* SSID */
  893. if (bssid_item->ssid.length > DETAILS_STR_MAX-1) {
  894. bssid_item->ssid.length = DETAILS_STR_MAX-1;
  895. }
  896. memcpy(ssid_buff, bssid_item->ssid.essid, bssid_item->ssid.length);
  897. ssid_buff[bssid_item->ssid.length] = '\0';
  898. /* MAC */
  899. memcpy(mac, &bssid_item->mac, sizeof(mac));
  900. g_snprintf(mac_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X",
  901. mac[0], mac[1], mac[2],
  902. mac[3], mac[4], mac[5]);
  903. /* Vendor */
  904. manuf_name = get_manuf_name_if_known(mac);
  905. if (manuf_name != NULL) {
  906. g_strlcpy(vendor_buff, manuf_name, DETAILS_STR_MAX);
  907. } else {
  908. vendor_buff[0] = '\0';
  909. }
  910. /* Supported Rates */
  911. Rates = rates_details(bssid_item->rates, NDIS_MAX_RATES_EX);
  912. /* RSSI */
  913. g_snprintf(rssi_buff, DETAILS_STR_MAX, "%d dBm", bssid_item->rssi);
  914. /* Privacy */
  915. /* (flag is set, if WEP (or higher) privacy is required) */
  916. if (bssid_item->privacy) {
  917. privacy_required = TRUE;
  918. }
  919. /* Network Type */
  920. g_snprintf(nettype_buff, sizeof(nettype_buff), "%s",
  921. val_to_str(bssid_item->net_type, win32_802_11_network_type_vals, "(0x%x)"));
  922. /* Infrastructure Mode */
  923. g_snprintf(infra_buff, sizeof(infra_buff), "%s",
  924. val_to_str(bssid_item->mode, win32_802_11_infra_mode_vals, "(0x%x)"));
  925. /* Channel */
  926. g_snprintf(freq_buff, sizeof(freq_buff), "%s",
  927. val_to_str(bssid_item->config.ds_config, win32_802_11_channel_vals, "(%u kHz)"));
  928. /* XXX - IE Length is currently not really supported here */
  929. {
  930. int len = bssid_item->ie_length;
  931. unsigned char *iep = bssid_item->ies;
  932. unsigned char id;
  933. guint el_len;
  934. NDIS_802_11_FIXED_IEs *fixed_ies;
  935. /*#define DEBUG_IE*/
  936. #ifdef DEBUG_IE
  937. const gchar *manuf_name;
  938. gchar string_buff[DETAILS_STR_MAX];
  939. #endif
  940. fixed_ies = (NDIS_802_11_FIXED_IEs *)iep;
  941. /**
  942. UCHAR Timestamp[8];
  943. USHORT BeaconInterval;
  944. USHORT Capabilities;
  945. } NDIS_802_11_FIXED_IEs, *PNDIS_802_11_FIXED_IEs;
  946. **/
  947. iep += sizeof(NDIS_802_11_FIXED_IEs);
  948. len = bssid_item->ie_length - sizeof(NDIS_802_11_FIXED_IEs);
  949. while (len >= 2) {
  950. id = *iep;
  951. iep++;
  952. el_len = *iep;
  953. iep++;
  954. len -= 2;
  955. #ifdef DEBUG_IE
  956. g_warning("ID: %s (%u) Len: %u",
  957. val_to_str(id, ie_id_vals, "0x%x"), id, el_len);
  958. #endif
  959. switch (id) {
  960. case(IE_ID_COUNTRY):
  961. if (el_len >= 6)
  962. g_snprintf(country_buff, sizeof(country_buff), "%c%c: Ch: %u-%u Max: %ddBm",
  963. iep[0], iep[1], iep[3], iep[4], iep[5]);
  964. break;
  965. case(IE_ID_WPA2):
  966. privacy_wpa2 = TRUE;
  967. break;
  968. case(IE_ID_VENDOR_SPECIFIC): /* WPA */
  969. privacy_wpa = TRUE;
  970. #ifdef DEBUG_IE
  971. /* include information from epan/packet-ieee80211.c dissect_vendor_ie_wpawme() */
  972. manuf_name = get_manuf_name_if_known(iep);
  973. if (manuf_name != NULL) {
  974. g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X (%s) Type: %02X",
  975. *(iep), *(iep+1), *(iep+2), manuf_name, *(iep+3));
  976. } else {
  977. g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X Type: %02X",
  978. *(iep), *(iep+1), *(iep+2), *(iep+3));
  979. }
  980. g_warning("%s", string_buff);
  981. iep += 4;
  982. el_len-= 4;
  983. len -= 4;
  984. g_warning("WPA IE: %u", id);
  985. hex(iep, el_len);
  986. #endif
  987. break;
  988. case(IE_ID_SSID):
  989. case(IE_ID_SUPPORTED_RATES):
  990. case(IE_ID_DS_PARAMETER_SET):
  991. case(IE_ID_TIM):
  992. case(IE_ID_ERP_INFORMATION):
  993. case(IE_ID_EXTENDED_SUPPORT_RATES):
  994. /* we already have that data, do nothing */
  995. break;
  996. default:
  997. /* unexpected IE_ID, print out hexdump */
  998. g_warning("Unknown IE ID: %u Len: %u", id, el_len);
  999. hex(iep, el_len);
  1000. }
  1001. iep += el_len;
  1002. len -= el_len;
  1003. }
  1004. }
  1005. if (privacy_required) {
  1006. if (privacy_wpa2) {
  1007. /* XXX - how to detect data encryption (TKIP and AES)? */
  1008. /* XXX - how to detect authentication (PSK or not)? */
  1009. g_snprintf(privacy_buff, DETAILS_STR_MAX, "WPA2");
  1010. } else {
  1011. if (privacy_wpa) {
  1012. /* XXX - how to detect data encryption (TKIP and AES)? */
  1013. /* XXX - how to detect authentication (PSK or not)? */
  1014. g_snprintf(privacy_buff, DETAILS_STR_MAX, "WPA");
  1015. } else {
  1016. /* XXX - how to detect authentication (Open System and Shared Key)? */
  1017. g_snprintf(privacy_buff, DETAILS_STR_MAX, "WEP");
  1018. }
  1019. }
  1020. } else {
  1021. g_snprintf(privacy_buff, DETAILS_STR_MAX, "None");
  1022. }
  1023. simple_list_append(list,
  1024. 0, ssid_buff,
  1025. 1, mac_buff,
  1026. 2, vendor_buff,
  1027. 3, privacy_buff,
  1028. 4, rssi_buff,
  1029. 5, nettype_buff,
  1030. 6, infra_buff,
  1031. 7, freq_buff,
  1032. 8, Rates->str,
  1033. 9, country_buff,
  1034. -1);
  1035. g_string_free(Rates, TRUE /* free_segment */);
  1036. /* the bssid_list isn't an array, but a sequence of variable length items */
  1037. bssid_item = (struct ndis_ssid_item *) (((char *) bssid_item) + bssid_item->length);
  1038. }
  1039. }
  1040. }
  1041. static int
  1042. capture_if_details_802_11(GtkWidget *grid, GtkWidget *main_vb, guint *row, LPADAPTER adapter) {
  1043. ULONG ulong_value;
  1044. LONG rssi = -100;
  1045. unsigned int uint_value;
  1046. unsigned char values[100];
  1047. struct ndis_essid ssid;
  1048. int length;
  1049. gchar string_buff[DETAILS_STR_MAX];
  1050. GString *Rates;
  1051. int entries = 0;
  1052. const gchar *manuf_name;
  1053. struct ndis_bssid_list *bssid_list;
  1054. struct ndis_configuration *configuration;
  1055. add_string_to_grid(grid, row, "Current network", "");
  1056. /* SSID */
  1057. length = sizeof(struct ndis_essid);
  1058. memset(&ssid, 0, length);
  1059. if (wpcap_packet_request(adapter, OID_802_11_SSID, FALSE /* !set */, (char *) &ssid, &length)) {
  1060. ssid_details(grid, row, &ssid);
  1061. entries++;
  1062. } else {
  1063. add_string_to_grid(grid, row, "SSID (Service Set IDentifier)", "-");
  1064. }
  1065. /* BSSID */
  1066. length = sizeof(values);
  1067. memset(values, 0, 6);
  1068. if (wpcap_packet_request(adapter, OID_802_11_BSSID, FALSE /* !set */, values, &length)) {
  1069. manuf_name = get_manuf_name_if_known(values);
  1070. if (manuf_name != NULL) {
  1071. g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X (%s)",
  1072. values[0], values[1], values[2],
  1073. values[3], values[4], values[5],
  1074. manuf_name);
  1075. } else {
  1076. g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X",
  1077. values[0], values[1], values[2],
  1078. values[3], values[4], values[5]);
  1079. }
  1080. entries++;
  1081. } else {
  1082. g_snprintf(string_buff, DETAILS_STR_MAX, "-");
  1083. }
  1084. add_string_to_grid(grid, row, "BSSID (Basic Service Set IDentifier)", string_buff);
  1085. /* Network type in use */
  1086. if (wpcap_packet_request_uint(adapter, OID_802_11_NETWORK_TYPE_IN_USE, &uint_value)) {
  1087. add_string_to_grid(grid, row, "Network type used",
  1088. val_to_str(uint_value, win32_802_11_network_type_vals, "(0x%x)"));
  1089. entries++;
  1090. } else {
  1091. add_string_to_grid(grid, row, "Network type used", "-");
  1092. }
  1093. /* Infrastructure mode */
  1094. if (wpcap_packet_request_ulong(adapter, OID_802_11_INFRASTRUCTURE_MODE, &uint_value)) {
  1095. add_string_to_grid(grid, row, "Infrastructure mode",
  1096. val_to_str(uint_value, win32_802_11_infra_mode_vals, "(0x%x)"));
  1097. entries++;
  1098. } else {
  1099. add_string_to_grid(grid, row, "Infrastructure mode", "-");
  1100. }
  1101. /* Authentication mode */
  1102. if (wpcap_packet_request_ulong(adapter, OID_802_11_AUTHENTICATION_MODE, &uint_value)) {
  1103. add_string_to_grid(grid, row, "Authentication mode",
  1104. val_to_str(uint_value, win32_802_11_auth_mode_vals, "(0x%x)"));
  1105. entries++;
  1106. } else {
  1107. add_string_to_grid(grid, row, "Authentication mode", "-");
  1108. }
  1109. /* Encryption (WEP) status */
  1110. if (wpcap_packet_request_ulong(adapter, OID_802_11_ENCRYPTION_STATUS, &uint_value)) {
  1111. add_string_to_grid(grid, row, "Encryption status",
  1112. val_to_str(uint_value, win32_802_11_encryption_status_vals, "(0x%x)"));
  1113. entries++;
  1114. } else {
  1115. add_string_to_grid(grid, row, "Encryption status", "-");
  1116. }
  1117. /* TX power */
  1118. if (wpcap_packet_request_ulong(adapter, OID_802_11_TX_POWER_LEVEL, &ulong_value)) {
  1119. g_snprintf(string_buff, DETAILS_STR_MAX, "%ld mW", ulong_value);
  1120. add_string_to_grid(grid, row, "TX power", string_buff);
  1121. entries++;
  1122. } else {
  1123. add_string_to_grid(grid, row, "TX power", "-");
  1124. }
  1125. /* RSSI */
  1126. if (wpcap_packet_request_ulong(adapter, OID_802_11_RSSI, &rssi)) {
  1127. #if 0
  1128. int i;
  1129. GList * scale_items = NULL;
  1130. GList * current;
  1131. GtkVUMeterScaleItem *item;
  1132. for (i = 0; i <= 100; i++) {
  1133. item = g_malloc(sizeof(GtkVUMeterScaleItem));
  1134. item->level = i;
  1135. item->large = !(i%5);
  1136. item->label = NULL;
  1137. switch (item->level) {
  1138. case 0:
  1139. item->label = "-100 ";
  1140. break;
  1141. case 20:
  1142. item->label = "-80 ";
  1143. break;
  1144. case 40:
  1145. item->label = "-60 ";
  1146. break;
  1147. case 60:
  1148. item->label = "-40 ";
  1149. break;
  1150. case 80:
  1151. item->label = "-20 ";
  1152. break;
  1153. case 100:
  1154. item->label = "0";
  1155. break;
  1156. default:
  1157. item->label = NULL;
  1158. }
  1159. scale_items = g_list_append(scale_items, item);
  1160. }
  1161. if (rssi < -100) {
  1162. rssi = -100;
  1163. }
  1164. g_snprintf(string_buff, DETAILS_STR_MAX, "%ld dBm", rssi);
  1165. add_meter_to_grid(grid, row, "RSSI (Received Signal Strength Indication)",
  1166. rssi+100 , string_buff, -100+100, 0+100, -80+100, scale_items);
  1167. current = scale_items;
  1168. while (current != NULL) {
  1169. g_free(current->data);
  1170. current = g_list_next(current);
  1171. }
  1172. g_list_free(scale_items);
  1173. entries++;
  1174. #endif
  1175. } else {
  1176. add_string_to_grid(grid, row, "RSSI (Received Signal Strength Indication)", "-");
  1177. }
  1178. /* Supported Rates */
  1179. length = sizeof(values);
  1180. if (!wpcap_packet_request(adapter, OID_802_11_SUPPORTED_RATES, FALSE /* !set */, values, &length)) {
  1181. length = 0;
  1182. } else {
  1183. entries++;
  1184. }
  1185. /* if we can get the link speed, show Supported Rates in level meter format */
  1186. if (length != 0 && wpcap_packet_request_uint(adapter, OID_GEN_LINK_SPEED, &uint_value)) {
  1187. #if 0
  1188. int max;
  1189. int yellow;
  1190. GList *rates_list;
  1191. GList * current;
  1192. rates_list = rates_vu_list(values, length, &max);
  1193. /* if we don't have a signal, we might not have a valid link speed */
  1194. if (rssi == -100) {
  1195. uint_value = 0;
  1196. }
  1197. uint_value /= 10 * 1000;
  1198. g_snprintf(string_buff, DETAILS_STR_MAX, "%u MBits/s", uint_value);
  1199. if (max >= 54) {
  1200. yellow = 2;
  1201. } else {
  1202. yellow = 1;
  1203. }
  1204. add_meter_to_grid(grid, row, "Link Speed",
  1205. uint_value, string_buff, 0, max, yellow, rates_list);
  1206. current = rates_list;
  1207. while (current != NULL) {
  1208. g_free(current->data);
  1209. current = g_list_next(current);
  1210. }
  1211. g_list_free(rates_list);
  1212. #endif
  1213. }
  1214. /* Supported Rates in String format */
  1215. Rates = rates_details(values, length);
  1216. add_string_to_grid(grid, row, "Supported Rates", Rates->str);
  1217. g_string_free(Rates, TRUE /* free_segment */);
  1218. /* Desired Rates */
  1219. length = sizeof(values);
  1220. if (!wpcap_packet_request(adapter, OID_802_11_DESIRED_RATES, FALSE /* !set */, values, &length)) {
  1221. length = 0;
  1222. } else {
  1223. entries++;
  1224. }
  1225. Rates = rates_details(values, length);
  1226. add_string_to_grid(grid, row, "Desired Rates", Rates->str);
  1227. g_string_free(Rates, TRUE /* free_segment */);
  1228. /* Configuration (e.g. frequency) */
  1229. length = sizeof(values);
  1230. if (wpcap_packet_request(adapter, OID_802_11_CONFIGURATION, FALSE /* !set */, (char *) values, &length)) {
  1231. configuration = (struct ndis_configuration *) values;
  1232. add_string_to_grid(grid, row, "Channel",
  1233. val_to_str(configuration->ds_config, win32_802_11_channel_freq_vals, "(%u kHz)"));
  1234. entries++;
  1235. } else {
  1236. add_string_to_grid(grid, row, "Channel", "-");
  1237. }
  1238. /* BSSID list: first trigger a scan */
  1239. length = sizeof(uint_value);
  1240. if (wpcap_packet_request(adapter, OID_802_11_BSSID_LIST_SCAN, TRUE /* set */, (char *) &uint_value, &length)) {
  1241. #if 0
  1242. g_warning("BSSID list scan done");
  1243. } else {
  1244. g_warning("BSSID list scan failed");
  1245. #endif
  1246. }
  1247. /* BSSID list: get scan results */
  1248. /* XXX - we might have to wait up to 7 seconds! */
  1249. length = sizeof(ULONG) + sizeof(struct ndis_ssid_item) * 16;
  1250. bssid_list = g_malloc(length);
  1251. /* some drivers don't set bssid_list->num_items to 0 if
  1252. OID_802_11_BSSID_LIST returns no items (prism54 driver, e.g.,) */
  1253. memset(bssid_list, 0, length);
  1254. if (wpcap_packet_request(adapter, OID_802_11_BSSID_LIST, FALSE /* !set */, (char *) bssid_list, &length)) {
  1255. add_string_to_grid(grid, row, "", "");
  1256. add_string_to_grid(grid, row, "Available networks (BSSID list)", "");
  1257. capture_if_details_802_11_bssid_list(main_vb, bssid_list);
  1258. entries += bssid_list->num_items;
  1259. } else {
  1260. add_string_to_grid(grid, row, "Available networks (BSSID list)", "-");
  1261. }
  1262. g_free(bssid_list);
  1263. return entries;
  1264. }
  1265. static int
  1266. capture_if_details_802_3(GtkWidget *grid, GtkWidget *main_vb, guint *row, LPADAPTER adapter) {
  1267. unsigned int uint_value;
  1268. unsigned char values[100];
  1269. int length;
  1270. gchar string_buff[DETAILS_STR_MAX];
  1271. const gchar *manuf_name;
  1272. int entries = 0;
  1273. add_string_to_grid(grid, row, "Characteristics", "");
  1274. length = sizeof(values);
  1275. if (wpcap_packet_request(adapter, OID_802_3_PERMANENT_ADDRESS, FALSE /* !set */, values, &length)) {
  1276. manuf_name = get_manuf_name_if_known(values);
  1277. if (manuf_name != NULL) {
  1278. g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X (%s)",
  1279. values[0], values[1], values[2],
  1280. values[3], values[4], values[5],
  1281. manuf_name);
  1282. } else {
  1283. g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X",
  1284. values[0], values[1], values[2],
  1285. values[3], values[4], values[5]);
  1286. }
  1287. entries++;
  1288. } else {
  1289. g_snprintf(string_buff, DETAILS_STR_MAX, "-");
  1290. }
  1291. add_string_to_grid(grid, row, "Permanent station address", string_buff);
  1292. length = sizeof(values);
  1293. if (wpcap_packet_request(adapter, OID_802_3_CURRENT_ADDRESS, FALSE /* !set */, values, &length)) {
  1294. manuf_name = get_manuf_name_if_known(values);
  1295. if (manuf_name != NULL) {
  1296. g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X (%s)",
  1297. values[0], values[1], values[2],
  1298. values[3], values[4], values[5],
  1299. manuf_name);
  1300. } else {
  1301. g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X:%02X:%02X:%02X",
  1302. values[0], values[1], values[2],
  1303. values[3], values[4], values[5]);
  1304. }
  1305. entries++;
  1306. } else {
  1307. g_snprintf(string_buff, DETAILS_STR_MAX, "-");
  1308. }
  1309. add_string_to_grid(grid, row, "Current station address", string_buff);
  1310. add_string_to_grid(grid, row, "", "");
  1311. add_string_to_grid(grid, row, "Statistics", "");
  1312. if (wpcap_packet_request_uint(adapter, OID_802_3_RCV_ERROR_ALIGNMENT, &uint_value)) {
  1313. g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
  1314. entries++;
  1315. } else {
  1316. g_snprintf(string_buff, DETAILS_STR_MAX, "-");
  1317. }
  1318. add_string_to_grid(grid, row, "Packets received with alignment error", string_buff);
  1319. if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_ONE_COLLISION, &uint_value)) {
  1320. g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
  1321. entries++;
  1322. } else {
  1323. g_snprintf(string_buff, DETAILS_STR_MAX, "-");
  1324. }
  1325. add_string_to_grid(grid, row, "Packets transmitted with one collision", string_buff);
  1326. if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_MORE_COLLISIONS, &uint_value)) {
  1327. g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
  1328. entries++;
  1329. } else {
  1330. g_snprintf(string_buff, DETAILS_STR_MAX, "-");
  1331. }
  1332. add_string_to_grid(grid, row, "Packets transmitted with more than one collision", string_buff);
  1333. if (wpcap_packet_request_uint(adapter, OID_802_3_RCV_OVERRUN, &uint_value)) {
  1334. g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
  1335. entries++;
  1336. } else {
  1337. g_snprintf(string_buff, DETAILS_STR_MAX, "-");
  1338. }
  1339. add_string_to_grid(grid, row, "Packets not received due to overrun", string_buff);
  1340. if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_DEFERRED, &uint_value)) {
  1341. g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
  1342. entries++;
  1343. } else {
  1344. g_snprintf(string_buff, DETAILS_STR_MAX, "-");
  1345. }
  1346. add_string_to_grid(grid, row, "Packets transmitted after deferred", string_buff);
  1347. if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_MAX_COLLISIONS, &uint_value)) {
  1348. g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
  1349. entries++;
  1350. } else {
  1351. g_snprintf(string_buff, DETAILS_STR_MAX, "-");
  1352. }
  1353. add_string_to_grid(grid, row, "Packets not transmitted due to collisions", string_buff);
  1354. if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_UNDERRUN, &uint_value)) {
  1355. g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
  1356. entries++;
  1357. } else {
  1358. g_snprintf(string_buff, DETAILS_STR_MAX, "-");
  1359. }
  1360. add_string_to_grid(grid, row, "Packets not transmitted due to underrun", string_buff);
  1361. if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_HEARTBEAT_FAILURE, &uint_value)) {
  1362. g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
  1363. entries++;
  1364. } else {
  1365. g_snprintf(string_buff, DETAILS_STR_MAX, "-");
  1366. }
  1367. add_string_to_grid(grid, row, "Packets transmitted with heartbeat failure", string_buff);
  1368. if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_TIMES_CRS_LOST, &uint_value)) {
  1369. g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
  1370. entries++;
  1371. } else {
  1372. g_snprintf(string_buff, DETAILS_STR_MAX, "-");
  1373. }
  1374. add_string_to_grid(grid, row, "Times carrier sense signal lost during transmission", string_buff);
  1375. if (wpcap_packet_request_uint(adapter, OID_802_3_XMIT_LATE_COLLISIONS, &uint_value)) {
  1376. g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
  1377. entries++;
  1378. } else {
  1379. g_snprintf(string_buff, DETAILS_STR_MAX, "-");
  1380. }
  1381. add_string_to_grid(grid, row, "Times late collisions detected", string_buff);
  1382. return entries;
  1383. }
  1384. static int
  1385. capture_if_details_task_offload(GtkWidget *table, GtkWidget *main_vb, guint *row, LPADAPTER adapter) {
  1386. NDIS_TASK_OFFLOAD_HEADER *offload;
  1387. unsigned char values[10000];
  1388. int length;
  1389. gchar string_buff[DETAILS_STR_MAX];
  1390. int entries = 0;
  1391. int TcpIpChecksumSupported = 0;
  1392. int IpSecSupported = 0;
  1393. int TcpLargeSendSupported = 0;
  1394. /* Task Offload */
  1395. offload = (NDIS_TASK_OFFLOAD_HEADER *) values;
  1396. offload->Version = NDIS_TASK_OFFLOAD_VERSION;
  1397. offload->Size = sizeof(NDIS_TASK_OFFLOAD_HEADER);
  1398. offload->Reserved = 0;
  1399. offload->OffsetFirstTask = 0;
  1400. /* the EncapsulationFormat seems to be ignored on a query (using Ethernet values) */
  1401. offload->EncapsulationFormat.Encapsulation = IEEE_802_3_Encapsulation;
  1402. offload->EncapsulationFormat.Flags.FixedHeaderSize = 1;
  1403. offload->EncapsulationFormat.Flags.Reserved = 0;
  1404. offload->EncapsulationFormat.EncapsulationHeaderSize = 14; /* sizeof(struct ether_header) */;
  1405. length = sizeof(values);
  1406. if (wpcap_packet_request(adapter, OID_TCP_TASK_OFFLOAD, FALSE /* !set */, values, &length)) {
  1407. NDIS_TASK_OFFLOAD *of;
  1408. /* XXX - hmmm, using a tvb for this? */
  1409. unsigned char *valuep = values + offload->OffsetFirstTask;
  1410. length -= offload->OffsetFirstTask;
  1411. do {
  1412. of = (NDIS_TASK_OFFLOAD *) valuep;
  1413. switch (of->Task) {
  1414. case TcpIpChecksumNdisTask:
  1415. {
  1416. NDIS_TASK_TCP_IP_CHECKSUM *tic = (NDIS_TASK_TCP_IP_CHECKSUM *) (of->TaskBuffer);
  1417. entries++;
  1418. TcpIpChecksumSupported++;
  1419. add_string_to_grid(table, row, "TCP/IP Checksum", "");
  1420. g_snprintf(string_buff, DETAILS_STR_MAX, "");
  1421. add_string_to_grid(table, row, "V4 transmit checksum", "");
  1422. g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, UDP: %s, IP: %s",
  1423. tic->V4Transmit.TcpChecksum ? "Yes" : "No",
  1424. tic->V4Transmit.UdpChecksum ? "Yes" : "No",
  1425. tic->V4Transmit.IpChecksum ? "Yes" : "No");
  1426. add_string_to_grid(table, row, "Calculation supported", string_buff);
  1427. g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, IP: %s",
  1428. tic->V4Transmit.TcpOptionsSupported ? "Yes" : "No",
  1429. tic->V4Transmit.IpOptionsSupported ? "Yes" : "No");
  1430. add_string_to_grid(table, row, "Options fields supported", string_buff);
  1431. g_snprintf(string_buff, DETAILS_STR_MAX, "");
  1432. add_string_to_grid(table, row, "V4 receive checksum", "");
  1433. g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, UDP: %s, IP: %s",
  1434. tic->V4Receive.TcpChecksum ? "Yes" : "No",
  1435. tic->V4Receive.UdpChecksum ? "Yes" : "No",
  1436. tic->V4Receive.IpChecksum ? "Yes" : "No");
  1437. add_string_to_grid(table, row, "Validation supported", string_buff);
  1438. g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, IP: %s",
  1439. tic->V4Receive.TcpOptionsSupported ? "Yes" : "No",
  1440. tic->V4Receive.IpOptionsSupported ? "Yes" : "No");
  1441. add_string_to_grid(table, row, "Options fields supported", string_buff);
  1442. g_snprintf(string_buff, DETAILS_STR_MAX, "");
  1443. add_string_to_grid(table, row, "V6 transmit checksum", "");
  1444. g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, UDP: %s",
  1445. tic->V6Transmit.TcpChecksum ? "Yes" : "No",
  1446. tic->V6Transmit.UdpChecksum ? "Yes" : "No");
  1447. add_string_to_grid(table, row, "Calculation supported", string_buff);
  1448. g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, IP: %s",
  1449. tic->V6Transmit.TcpOptionsSupported ? "Yes" : "No",
  1450. tic->V6Transmit.IpOptionsSupported ? "Yes" : "No");
  1451. add_string_to_grid(table, row, "Options fields supported", string_buff);
  1452. g_snprintf(string_buff, DETAILS_STR_MAX, "");
  1453. add_string_to_grid(table, row, "V6 receive checksum", "");
  1454. g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, UDP: %s",
  1455. tic->V6Receive.TcpChecksum ? "Yes" : "No",
  1456. tic->V6Receive.UdpChecksum ? "Yes" : "No");
  1457. add_string_to_grid(table, row, "Validation supported", string_buff);
  1458. g_snprintf(string_buff, DETAILS_STR_MAX, "TCP: %s, IP: %s",
  1459. tic->V6Receive.TcpOptionsSupported ? "Yes" : "No",
  1460. tic->V6Receive.IpOptionsSupported ? "Yes" : "No");
  1461. add_string_to_grid(table, row, "Options fields supported", string_buff);
  1462. }
  1463. break;
  1464. case IpSecNdisTask:
  1465. entries++;
  1466. IpSecSupported++;
  1467. add_string_to_grid(table, row, "IPSEC", "");
  1468. g_snprintf(string_buff, DETAILS_STR_MAX, "IPSEC (TaskID 1) not decoded yet");
  1469. add_string_to_grid(table, row, "Task", string_buff);
  1470. break;
  1471. case TcpLargeSendNdisTask:
  1472. {
  1473. NDIS_TASK_TCP_LARGE_SEND *tls = (NDIS_TASK_TCP_LARGE_SEND *) (of->TaskBuffer);
  1474. entries++;
  1475. TcpLargeSendSupported++;
  1476. add_string_to_grid(table, row, "TCP large send", "");
  1477. /* XXX - while MSDN tells about version 0, we see version 1?!? */
  1478. if (tls->Version == 1) {
  1479. g_snprintf(string_buff, DETAILS_STR_MAX, "%u", tls->MaxOffLoadSize);
  1480. add_string_to_grid(table, row, "Max Offload Size", string_buff);
  1481. g_snprintf(string_buff, DETAILS_STR_MAX, "%u", tls->MinSegmentCount);
  1482. add_string_to_grid(table, row, "Min Segment Count", string_buff);
  1483. g_snprintf(string_buff, DETAILS_STR_MAX, "%s", tls->TcpOptions ? "Yes" : "No");
  1484. add_string_to_grid(table, row, "TCP option fields", string_buff);
  1485. g_snprintf(string_buff, DETAILS_STR_MAX, "%s", tls->IpOptions ? "Yes" : "No");
  1486. add_string_to_grid(table, row, "IP option fields", string_buff);
  1487. } else {
  1488. g_snprintf(string_buff, DETAILS_STR_MAX, "%u (unknown)", tls->Version);
  1489. add_string_to_grid(table, row, "Version", string_buff);
  1490. }
  1491. }
  1492. break;
  1493. default:
  1494. g_snprintf(string_buff, DETAILS_STR_MAX, "Unknown task %u", of->Task);
  1495. add_string_to_grid(table, row, "Task", string_buff);
  1496. }
  1497. add_string_to_grid(table, row, "", "");
  1498. valuep += of->OffsetNextTask;
  1499. length -= of->OffsetNextTask;
  1500. } while (of->OffsetNextTask != 0);
  1501. }
  1502. if (TcpIpChecksumSupported == 0) {
  1503. add_string_to_grid(table, row, "TCP/IP Checksum", "");
  1504. add_string_to_grid(table, row, "Offload not supported", "-");
  1505. }
  1506. if (IpSecSupported == 0) {
  1507. add_string_to_grid(table, row, "IpSec", "");
  1508. add_string_to_grid(table, row, "Offload not supported", "-");
  1509. }
  1510. if (TcpLargeSendSupported == 0) {
  1511. add_string_to_grid(table, row, "TCP Large Send", "");
  1512. add_string_to_grid(table, row, "Offload not supported", "-");
  1513. }
  1514. return entries;
  1515. }
  1516. static int
  1517. capture_if_details_general(GtkWidget *grid, GtkWidget *main_vb, guint *row, LPADAPTER adapter, gchar *iface) {
  1518. gchar *interface_friendly_name;
  1519. gchar string_buff[DETAILS_STR_MAX];
  1520. const gchar *manuf_name;
  1521. unsigned int uint_value;
  1522. unsigned int uint_array[50];
  1523. int uint_array_size;
  1524. unsigned int physical_medium;
  1525. int i;
  1526. unsigned char values[100];
  1527. guint16 wvalues[100];
  1528. char *utf8value;
  1529. int length;
  1530. unsigned short ushort_value;
  1531. int entries = 0;
  1532. gchar *size_str;
  1533. /* general */
  1534. add_string_to_grid(grid, row, "Characteristics", "");
  1535. /* OS friendly name - look it up from iface ("\Device\NPF_{11111111-2222-3333-4444-555555555555}") */
  1536. interface_friendly_name = get_windows_interface_friendly_name(/* IN */ iface);
  1537. if (interface_friendly_name != NULL){
  1538. add_string_to_grid(grid, row, "OS Friendly name", interface_friendly_name);
  1539. g_free(interface_friendly_name);
  1540. }
  1541. /* Vendor description */
  1542. length = sizeof(values);
  1543. if (wpcap_packet_request(adapter, OID_GEN_VENDOR_DESCRIPTION, FALSE /* !set */, values, &length)) {
  1544. g_snprintf(string_buff, DETAILS_STR_MAX, "%s", values);
  1545. entries++;
  1546. } else {
  1547. g_snprintf(string_buff, DETAILS_STR_MAX, "-");
  1548. }
  1549. add_string_to_grid(grid, row, "Vendor description", string_buff);
  1550. /* NDIS's "Friendly name" */
  1551. length = sizeof(wvalues);
  1552. if (wpcap_packet_request(adapter, OID_GEN_FRIENDLY_NAME, FALSE /* !set */, (char *)wvalues, &length)) {
  1553. utf8value = g_utf16_to_utf8(wvalues, -1, NULL, NULL, NULL);
  1554. g_snprintf(string_buff, DETAILS_STR_MAX, "%s", utf8value);
  1555. g_free(utf8value);
  1556. entries++;
  1557. } else {
  1558. g_snprintf(string_buff, DETAILS_STR_MAX, "-");
  1559. }
  1560. add_string_to_grid(grid, row, "NDIS Friendly name", string_buff);
  1561. /* Interface */
  1562. add_string_to_grid(grid, row, "Interface", iface);
  1563. /* link status (connected/disconnected) */
  1564. if (wpcap_packet_request_uint(adapter, OID_GEN_MEDIA_CONNECT_STATUS, &uint_value)) {
  1565. entries++;
  1566. if (uint_value == 0) {
  1567. add_string_to_grid(grid, row, "Link status", "Connected");
  1568. } else {
  1569. add_string_to_grid(grid, row, "Link status", "Disconnected");
  1570. }
  1571. } else {
  1572. add_string_to_grid(grid, row, "Link status", "-");
  1573. }
  1574. /* link speed */
  1575. if (wpcap_packet_request_uint(adapter, OID_GEN_LINK_SPEED, &uint_value)) {
  1576. entries++;
  1577. uint_value *= 100;
  1578. size_str = format_size(uint_value, format_size_unit_bits_s|format_size_prefix_si);
  1579. g_strlcpy(string_buff, size_str, DETAILS_STR_MAX);
  1580. g_free(size_str);
  1581. } else {
  1582. g_snprintf(string_buff, DETAILS_STR_MAX, "-");
  1583. }
  1584. add_string_to_grid(grid, row, "Link speed", string_buff);
  1585. uint_array_size = sizeof(uint_array);
  1586. if (wpcap_packet_request(adapter, OID_GEN_MEDIA_SUPPORTED, FALSE /* !set */, (char *) uint_array, &uint_array_size)) {
  1587. entries++;
  1588. uint_array_size /= sizeof(unsigned int);
  1589. i = 0;
  1590. while (uint_array_size--) {
  1591. add_string_to_grid(grid, row, "Media supported",
  1592. val_to_str(uint_array[i], win32_802_3_medium_vals, "(0x%x)"));
  1593. i++;
  1594. }
  1595. } else {
  1596. add_string_to_grid(grid, row, "Media supported", "-");
  1597. }
  1598. uint_array_size = sizeof(uint_array);
  1599. if (wpcap_packet_request(adapter, OID_GEN_MEDIA_IN_USE, FALSE /* !set */, (char *) uint_array, &uint_array_size)) {
  1600. entries++;
  1601. uint_array_size /= sizeof(unsigned int);
  1602. i = 0;
  1603. while (uint_array_size--) {
  1604. add_string_to_grid(grid, row, "Medium in use",
  1605. val_to_str(uint_array[i], win32_802_3_medium_vals, "(0x%x)"));
  1606. i++;
  1607. }
  1608. } else {
  1609. add_string_to_grid(grid, row, "Medium in use", "-");
  1610. }
  1611. if (wpcap_packet_request_uint(adapter, OID_GEN_PHYSICAL_MEDIUM, &physical_medium)) {
  1612. entries++;
  1613. add_string_to_grid(grid, row, "Physical medium",
  1614. val_to_str(physical_medium, win32_802_3_physical_medium_vals, "(0x%x)"));
  1615. } else {
  1616. add_string_to_grid(grid, row, "Physical medium", "-");
  1617. }
  1618. length = sizeof(ushort_value);
  1619. if (wpcap_packet_request(adapter, OID_GEN_DRIVER_VERSION, FALSE /* !set */, (char *) &ushort_value, &length)) {
  1620. entries++;
  1621. g_snprintf(string_buff, DETAILS_STR_MAX, "%u.%u", ushort_value / 0x100, ushort_value % 0x100);
  1622. } else {
  1623. g_snprintf(string_buff, DETAILS_STR_MAX, "-");
  1624. }
  1625. add_string_to_grid(grid, row, "NDIS Driver Version", string_buff);
  1626. length = sizeof(uint_value);
  1627. if (wpcap_packet_request(adapter, OID_GEN_VENDOR_DRIVER_VERSION, FALSE /* !set */, (char *) &uint_value, &length)) {
  1628. entries++;
  1629. /* XXX - what's the correct output format? */
  1630. g_snprintf(string_buff, DETAILS_STR_MAX, "%u.%u (Hex: %X.%X)",
  1631. (uint_value / 0x10000 ) % 0x10000,
  1632. uint_value % 0x10000,
  1633. (uint_value / 0x10000 ) % 0x10000,
  1634. uint_value % 0x10000);
  1635. } else {
  1636. g_snprintf(string_buff, DETAILS_STR_MAX, "-");
  1637. }
  1638. add_string_to_grid(grid, row, "Vendor Driver Version", string_buff);
  1639. length = sizeof(values);
  1640. if (wpcap_packet_request(adapter, OID_GEN_VENDOR_ID, FALSE /* !set */, values, &length)) {
  1641. entries++;
  1642. manuf_name = get_manuf_name_if_known(values);
  1643. if (manuf_name != NULL) {
  1644. g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X (%s) NIC: %02X",
  1645. values[0], values[1], values[2], manuf_name, values[3]);
  1646. } else {
  1647. g_snprintf(string_buff, DETAILS_STR_MAX, "%02X:%02X:%02X NIC: %02X",
  1648. values[0], values[1], values[2], values[3]);
  1649. }
  1650. } else {
  1651. g_snprintf(string_buff, DETAILS_STR_MAX, "-");
  1652. }
  1653. add_string_to_grid(grid, row, "Vendor ID", string_buff);
  1654. if (wpcap_packet_request_uint(adapter, OID_GEN_MAC_OPTIONS, &uint_value)) {
  1655. entries++;
  1656. g_snprintf(string_buff, DETAILS_STR_MAX,
  1657. "802.1P Priority: %s, 802.1Q VLAN: %s",
  1658. (uint_value & NDIS_MAC_OPTION_8021P_PRIORITY) ? "Supported" : "Unsupported",
  1659. (uint_value & NDIS_MAC_OPTION_8021Q_VLAN) ? "Supported" : "Unsupported" );
  1660. } else {
  1661. g_snprintf(string_buff, DETAILS_STR_MAX, "-");
  1662. }
  1663. add_string_to_grid(grid, row, "MAC Options", string_buff);
  1664. if (wpcap_packet_request_uint(adapter, OID_GEN_VLAN_ID, &uint_value)) {
  1665. entries++;
  1666. g_snprintf(string_buff, DETAILS_STR_MAX, "%u", uint_value);
  1667. } else {
  1668. g_snprintf(string_buff, DETAILS_STR_MAX, "-");
  1669. }
  1670. add_string_to_grid(grid, row, "VLAN ID", string_buff);
  1671. #if 0
  1672. /* value seems to be constant */
  1673. if (wpcap_packet_request_uint(adapter, OID_GEN_CURRENT_PACKET_FILTER, &uint_value)) {
  1674. entries++;
  1675. g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
  1676. } else {
  1677. g_snprintf(string_buff, DETAILS_STR_MAX, "-");
  1678. }
  1679. add_string_to_grid(grid, row, "Packet filter", string_buff);
  1680. #endif
  1681. if (wpcap_packet_request_uint(adapter, OID_GEN_TRANSMIT_BUFFER_SPACE, &uint_value)) {
  1682. entries++;
  1683. g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
  1684. } else {
  1685. g_snprintf(string_buff, DETAILS_STR_MAX, "-");
  1686. }
  1687. add_string_to_grid(grid, row, "Transmit Buffer Space", string_buff);
  1688. if (wpcap_packet_request_uint(adapter, OID_GEN_RECEIVE_BUFFER_SPACE, &uint_value)) {
  1689. entries++;
  1690. g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
  1691. } else {
  1692. g_snprintf(string_buff, DETAILS_STR_MAX, "-");
  1693. }
  1694. add_string_to_grid(grid, row, "Receive Buffer Space", string_buff);
  1695. if (wpcap_packet_request_uint(adapter, OID_GEN_TRANSMIT_BLOCK_SIZE , &uint_value)) {
  1696. entries++;
  1697. g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
  1698. } else {
  1699. g_snprintf(string_buff, DETAILS_STR_MAX, "-");
  1700. }
  1701. add_string_to_grid(grid, row, "Transmit Block Size", string_buff);
  1702. if (wpcap_packet_request_uint(adapter, OID_GEN_RECEIVE_BLOCK_SIZE, &uint_value)) {
  1703. entries++;
  1704. g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
  1705. } else {
  1706. g_snprintf(string_buff, DETAILS_STR_MAX, "-");
  1707. }
  1708. add_string_to_grid(grid, row, "Receive Block Size", string_buff);
  1709. if (wpcap_packet_request_uint(adapter, OID_GEN_MAXIMUM_TOTAL_SIZE, &uint_value)) {
  1710. entries++;
  1711. g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
  1712. } else {
  1713. g_snprintf(string_buff, DETAILS_STR_MAX, "-");
  1714. }
  1715. add_string_to_grid(grid, row, "Maximum Packet Size", string_buff);
  1716. return entries;
  1717. }
  1718. static int
  1719. capture_if_details_stats(GtkWidget *table, GtkWidget *main_vb, guint *row, LPADAPTER adapter) {
  1720. gchar string_buff[DETAILS_STR_MAX];
  1721. unsigned int uint_value;
  1722. int entries = 0;
  1723. add_string_to_grid(table, row, "Statistics", "");
  1724. if (wpcap_packet_request_uint(adapter, OID_GEN_XMIT_OK, &uint_value)) {
  1725. entries++;
  1726. g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
  1727. } else {
  1728. g_snprintf(string_buff, DETAILS_STR_MAX, "-");
  1729. }
  1730. add_string_to_grid(table, row, "Transmit OK", string_buff);
  1731. if (wpcap_packet_request_uint(adapter, OID_GEN_XMIT_ERROR, &uint_value)) {
  1732. entries++;
  1733. g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
  1734. } else {
  1735. g_snprintf(string_buff, DETAILS_STR_MAX, "-");
  1736. }
  1737. add_string_to_grid(table, row, "Transmit Error", string_buff);
  1738. if (wpcap_packet_request_uint(adapter, OID_GEN_RCV_OK, &uint_value)) {
  1739. entries++;
  1740. g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
  1741. } else {
  1742. g_snprintf(string_buff, DETAILS_STR_MAX, "-");
  1743. }
  1744. add_string_to_grid(table, row, "Receive OK", string_buff);
  1745. if (wpcap_packet_request_uint(adapter, OID_GEN_RCV_ERROR, &uint_value)) {
  1746. entries++;
  1747. g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
  1748. } else {
  1749. g_snprintf(string_buff, DETAILS_STR_MAX, "-");
  1750. }
  1751. add_string_to_grid(table, row, "Receive Error", string_buff);
  1752. if (wpcap_packet_request_uint(adapter, OID_GEN_RCV_NO_BUFFER, &uint_value)) {
  1753. entries++;
  1754. g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
  1755. } else {
  1756. g_snprintf(string_buff, DETAILS_STR_MAX, "-");
  1757. }
  1758. add_string_to_grid(table, row, "Receive but no Buffer", string_buff);
  1759. if (wpcap_packet_request_uint(adapter, OID_GEN_DIRECTED_BYTES_XMIT, &uint_value)) {
  1760. entries++;
  1761. g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
  1762. } else {
  1763. g_snprintf(string_buff, DETAILS_STR_MAX, "-");
  1764. }
  1765. add_string_to_grid(table, row, "Directed bytes transmitted w/o errors", string_buff);
  1766. if (wpcap_packet_request_uint(adapter, OID_GEN_DIRECTED_FRAMES_XMIT, &uint_value)) {
  1767. entries++;
  1768. g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
  1769. } else {
  1770. g_snprintf(string_buff, DETAILS_STR_MAX, "-");
  1771. }
  1772. add_string_to_grid(table, row, "Directed packets transmitted w/o errors", string_buff);
  1773. if (wpcap_packet_request_uint(adapter, OID_GEN_MULTICAST_BYTES_XMIT, &uint_value)) {
  1774. entries++;
  1775. g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
  1776. } else {
  1777. g_snprintf(string_buff, DETAILS_STR_MAX, "-");
  1778. }
  1779. add_string_to_grid(table, row, "Multicast bytes transmitted w/o errors", string_buff);
  1780. if (wpcap_packet_request_uint(adapter, OID_GEN_MULTICAST_FRAMES_XMIT, &uint_value)) {
  1781. entries++;
  1782. g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
  1783. } else {
  1784. g_snprintf(string_buff, DETAILS_STR_MAX, "-");
  1785. }
  1786. add_string_to_grid(table, row, "Multicast packets transmitted w/o errors", string_buff);
  1787. if (wpcap_packet_request_uint(adapter, OID_GEN_BROADCAST_BYTES_XMIT, &uint_value)) {
  1788. entries++;
  1789. g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
  1790. } else {
  1791. g_snprintf(string_buff, DETAILS_STR_MAX, "-");
  1792. }
  1793. add_string_to_grid(table, row, "Broadcast bytes transmitted w/o errors", string_buff);
  1794. if (wpcap_packet_request_uint(adapter, OID_GEN_BROADCAST_FRAMES_XMIT, &uint_value)) {
  1795. entries++;
  1796. g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
  1797. } else {
  1798. g_snprintf(string_buff, DETAILS_STR_MAX, "-");
  1799. }
  1800. add_string_to_grid(table, row, "Broadcast packets transmitted w/o errors", string_buff);
  1801. if (wpcap_packet_request_uint(adapter, OID_GEN_DIRECTED_BYTES_RCV, &uint_value)) {
  1802. entries++;
  1803. g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
  1804. } else {
  1805. g_snprintf(string_buff, DETAILS_STR_MAX, "-");
  1806. }
  1807. add_string_to_grid(table, row, "Directed bytes received w/o errors", string_buff);
  1808. if (wpcap_packet_request_uint(adapter, OID_GEN_DIRECTED_FRAMES_RCV, &uint_value)) {
  1809. entries++;
  1810. g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
  1811. } else {
  1812. g_snprintf(string_buff, DETAILS_STR_MAX, "-");
  1813. }
  1814. add_string_to_grid(table, row, "Directed packets received w/o errors", string_buff);
  1815. if (wpcap_packet_request_uint(adapter, OID_GEN_MULTICAST_BYTES_RCV, &uint_value)) {
  1816. entries++;
  1817. g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
  1818. } else {
  1819. g_snprintf(string_buff, DETAILS_STR_MAX, "-");
  1820. }
  1821. add_string_to_grid(table, row, "Multicast bytes received w/o errors", string_buff);
  1822. if (wpcap_packet_request_uint(adapter, OID_GEN_MULTICAST_FRAMES_RCV, &uint_value)) {
  1823. entries++;
  1824. g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
  1825. } else {
  1826. g_snprintf(string_buff, DETAILS_STR_MAX, "-");
  1827. }
  1828. add_string_to_grid(table, row, "Multicast packets received w/o errors", string_buff);
  1829. if (wpcap_packet_request_uint(adapter, OID_GEN_BROADCAST_BYTES_RCV, &uint_value)) {
  1830. entries++;
  1831. g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
  1832. } else {
  1833. g_snprintf(string_buff, DETAILS_STR_MAX, "-");
  1834. }
  1835. add_string_to_grid(table, row, "Broadcast bytes received w/o errors", string_buff);
  1836. if (wpcap_packet_request_uint(adapter, OID_GEN_BROADCAST_FRAMES_RCV, &uint_value)) {
  1837. entries++;
  1838. g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
  1839. } else {
  1840. g_snprintf(string_buff, DETAILS_STR_MAX, "-");
  1841. }
  1842. add_string_to_grid(table, row, "Broadcast packets received w/o errors", string_buff);
  1843. if (wpcap_packet_request_uint(adapter, OID_GEN_RCV_CRC_ERROR, &uint_value)) {
  1844. entries++;
  1845. g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
  1846. } else {
  1847. g_snprintf(string_buff, DETAILS_STR_MAX, "-");
  1848. }
  1849. add_string_to_grid(table, row, "Packets received with CRC or FCS errors", string_buff);
  1850. if (wpcap_packet_request_uint(adapter, OID_GEN_TRANSMIT_QUEUE_LENGTH, &uint_value)) {
  1851. entries++;
  1852. g_snprintf(string_buff, DETAILS_STR_MAX, "%d", uint_value);
  1853. } else {
  1854. g_snprintf(string_buff, DETAILS_STR_MAX, "-");
  1855. }
  1856. add_string_to_grid(table, row, "Packets queued for transmission", string_buff);
  1857. return entries;
  1858. }
  1859. static GtkWidget *
  1860. capture_if_details_page_new(GtkWidget **grid)
  1861. {
  1862. GtkWidget *main_vb;
  1863. main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 6, FALSE);
  1864. gtk_container_set_border_width(GTK_CONTAINER(main_vb), 12);
  1865. /* grid */
  1866. *grid = ws_gtk_grid_new();
  1867. ws_gtk_grid_set_column_spacing(GTK_GRID(*grid), 6);
  1868. ws_gtk_grid_set_row_spacing(GTK_GRID(*grid), 3);
  1869. gtk_box_pack_start(GTK_BOX (main_vb), *grid, TRUE, TRUE, 0);
  1870. return main_vb;
  1871. }
  1872. static void
  1873. capture_if_details_open_win(char *iface)
  1874. {
  1875. GtkWidget *details_open_w,
  1876. *main_vb, *bbox, *close_bt, *help_bt;
  1877. GtkWidget *page_general, *page_stats, *page_802_3, *page_802_11, *page_task_offload;
  1878. GtkWidget *page_lb;
  1879. GtkWidget *grid, *notebook, *label;
  1880. guint row;
  1881. LPADAPTER adapter;
  1882. int entries;
  1883. /* open the network adapter */
  1884. adapter = wpcap_packet_open(iface);
  1885. if (adapter == NULL) {
  1886. /*
  1887. * We have an adapter that is not exposed through normal APIs (e.g. TurboCap)
  1888. * or an adapter that isn't plugged in.
  1889. *
  1890. * XXX - We should use the TurboCap API to get info about TurboCap adapters.
  1891. */
  1892. simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
  1893. "%sCould not open adapter %s!%s"
  1894. "\n\nHas it been unplugged?",
  1895. simple_dialog_primary_start(), iface, simple_dialog_primary_end());
  1896. return;
  1897. }
  1898. /* open a new window */
  1899. details_open_w = dlg_window_new("Wireshark: Interface Details"); /* transient_for top_level */
  1900. gtk_window_set_destroy_with_parent (GTK_WINDOW(details_open_w), TRUE);
  1901. /* Container for the window contents */
  1902. main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 12, FALSE);
  1903. gtk_container_set_border_width(GTK_CONTAINER(main_vb), 12);
  1904. gtk_container_add(GTK_CONTAINER(details_open_w), main_vb);
  1905. /* notebook */
  1906. notebook = gtk_notebook_new();
  1907. gtk_box_pack_start(GTK_BOX(main_vb), notebook, TRUE /*expand*/, TRUE /*fill*/, 0 /*padding*/);
  1908. /* General page */
  1909. page_general = capture_if_details_page_new(&grid);
  1910. page_lb = gtk_label_new("Characteristics");
  1911. gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page_general, page_lb);
  1912. row = 0;
  1913. entries = capture_if_details_general(grid, page_general, &row, adapter, iface);
  1914. if (entries == 0) {
  1915. gtk_widget_set_sensitive(page_lb, FALSE);
  1916. }
  1917. /* Statistics page */
  1918. page_stats = capture_if_details_page_new(&grid);
  1919. page_lb = gtk_label_new("Statistics");
  1920. gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page_stats, page_lb);
  1921. row = 0;
  1922. entries = capture_if_details_stats(grid, page_stats, &row, adapter);
  1923. if (entries == 0) {
  1924. gtk_widget_set_sensitive(page_lb, FALSE);
  1925. }
  1926. /* 802.3 (Ethernet) page */
  1927. page_802_3 = capture_if_details_page_new(&grid);
  1928. page_lb = gtk_label_new("802.3 (Ethernet)");
  1929. gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page_802_3, page_lb);
  1930. row = 0;
  1931. entries = capture_if_details_802_3(grid, page_802_3, &row, adapter);
  1932. if (entries == 0) {
  1933. gtk_widget_set_sensitive(page_lb, FALSE);
  1934. }
  1935. /* 802_11 (WI-FI) page */
  1936. page_802_11 = capture_if_details_page_new(&grid);
  1937. page_lb = gtk_label_new("802.11 (WLAN)");
  1938. gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page_802_11, page_lb);
  1939. row = 0;
  1940. entries = capture_if_details_802_11(grid, page_802_11, &row, adapter);
  1941. if (entries == 0) {
  1942. gtk_widget_set_sensitive(page_lb, FALSE);
  1943. }
  1944. /* Task offload page */
  1945. page_task_offload = capture_if_details_page_new(&grid);
  1946. page_lb = gtk_label_new("Task Offload");
  1947. gtk_notebook_append_page(GTK_NOTEBOOK(notebook), page_task_offload, page_lb);
  1948. row = 0;
  1949. entries = capture_if_details_task_offload(grid, page_task_offload, &row, adapter);
  1950. if (entries == 0) {
  1951. gtk_widget_set_sensitive(page_lb, FALSE);
  1952. }
  1953. wpcap_packet_close(adapter);
  1954. label = gtk_label_new("Some drivers may not provide accurate values.");
  1955. gtk_box_pack_start(GTK_BOX(main_vb), label, FALSE /*expand*/, FALSE /*fill*/, 0 /*padding*/);
  1956. /* Button row. */
  1957. bbox = dlg_button_row_new(GTK_STOCK_CLOSE, GTK_STOCK_HELP, NULL);
  1958. gtk_box_pack_start(GTK_BOX(main_vb), bbox, FALSE /*expand*/, FALSE /*fill*/, 0 /*padding*/);
  1959. close_bt = g_object_get_data(G_OBJECT(bbox), GTK_STOCK_CLOSE);
  1960. window_set_cancel_button(details_open_w, close_bt, window_cancel_button_cb);
  1961. help_bt = g_object_get_data(G_OBJECT(bbox), GTK_STOCK_HELP);
  1962. g_signal_connect(help_bt, "clicked", G_CALLBACK(topic_cb), (gpointer) (HELP_CAPTURE_INTERFACES_DETAILS_DIALOG));
  1963. gtk_widget_grab_focus(close_bt);
  1964. g_signal_connect(details_open_w, "delete_event", G_CALLBACK(window_delete_event_cb), NULL);
  1965. gtk_widget_show_all(details_open_w);
  1966. window_present(details_open_w);
  1967. }
  1968. static void
  1969. capture_if_details_open_answered_cb(gpointer dialog _U_, gint btn, gpointer data)
  1970. {
  1971. switch (btn) {
  1972. case(ESD_BTN_OK):
  1973. capture_if_details_open_win(data);
  1974. break;
  1975. case(ESD_BTN_CANCEL):
  1976. break;
  1977. default:
  1978. g_assert_not_reached();
  1979. }
  1980. }
  1981. void
  1982. capture_if_details_open(char *iface)
  1983. {
  1984. char *version;
  1985. gboolean version_ok = FALSE;
  1986. gpointer dialog;
  1987. /* check packet.dll version */
  1988. version = wpcap_packet_get_version();
  1989. if (version == NULL) {
  1990. /* couldn't even get the packet.dll version, must be a very old one or just not existing -> give up */
  1991. /* (this seems to be the case for 2.3 beta and all previous releases) */
  1992. simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK,
  1993. "%sCouldn't obtain WinPcap packet.dll version.%s"
  1994. "\n\nThe WinPcap packet.dll is not installed or the version you use seems to be very old."
  1995. "\n\nPlease update or install WinPcap.",
  1996. simple_dialog_primary_start(), simple_dialog_primary_end());
  1997. return;
  1998. }
  1999. /* XXX - add more known DLL versions here */
  2000. /* (all versions since the 2.3 release seems to be working (although the 2.3 beta did not) */
  2001. if (
  2002. /*
  2003. * 4.0 version strings:
  2004. * 4.0.0.703: 4.0 beta 3
  2005. * 4.0.0.655: 4.0 beta 2
  2006. * 4.0.0.592: 4.0 beta 1
  2007. */
  2008. (strcmp(version, "3" ) > 0) || /* 4.0 and above (including betas) */
  2009. (strcmp(version, "3, 2, 0, 29") == 0) || /* 3.2 beta 1 */
  2010. (strcmp(version, "3, 1, 0, 27") == 0) || /* 3.1 release */
  2011. (strcmp(version, "3, 1, 0, 24") == 0) || /* 3.1 beta 4 */
  2012. (strcmp(version, "3, 1, 0, 23") == 0) || /* 3.1 beta 3 */
  2013. (strcmp(version, "3, 1, 0, 22") == 0) || /* 3.1 beta 2 */
  2014. (strcmp(version, "3, 1, 0, 20") == 0) || /* 3.1 beta */
  2015. (strcmp(version, "3.0 alpha3" ) == 0) || /* 3.0 release or 3.0 beta (yes, both versions report alpha3!) */
  2016. (strcmp(version, "2.3" ) == 0) /* 2.3 release */
  2017. ) {
  2018. version_ok = TRUE;
  2019. }
  2020. if (!version_ok) {
  2021. /* packet.dll version not known to us, warn user but try to continue */
  2022. dialog = simple_dialog(ESD_TYPE_WARN, ESD_BTN_OK | ESD_BTN_CANCEL,
  2023. "%sUnknown WinPcap version.%s"
  2024. "\n\nThe WinPcap packet.dll version \"%s\" is unknown. It may not"
  2025. "\nprovide functions that we need and might even crash."
  2026. "\n\nContinue anyway?",
  2027. simple_dialog_primary_start(), simple_dialog_primary_end(), version);
  2028. simple_dialog_set_cb(dialog, capture_if_details_open_answered_cb, iface);
  2029. } else {
  2030. capture_if_details_open_win(iface);
  2031. }
  2032. }
  2033. gboolean
  2034. capture_if_has_details(char *iface) {
  2035. LPADAPTER adapter;
  2036. if (!iface) {
  2037. return FALSE;
  2038. }
  2039. adapter = wpcap_packet_open(iface);
  2040. if (adapter) {
  2041. wpcap_packet_close(adapter);
  2042. return TRUE;
  2043. }
  2044. return FALSE;
  2045. }
  2046. #endif /* HAVE_LIBPCAP && _WIN32 */
  2047. /*
  2048. * Editor modelines - http://www.wireshark.org/tools/modelines.html
  2049. *
  2050. * Local variables:
  2051. * c-basic-offset: 4
  2052. * tab-width: 8
  2053. * indent-tabs-mode: nil
  2054. * End:
  2055. *
  2056. * vi: set shiftwidth=4 tabstop=8 expandtab:
  2057. * :indentSize=4:tabSize=8:noTabs=true:
  2058. */