Export libwiretap symbols using WS_DLL_PUBLIC define
[metze/wireshark/wip.git] / wiretap / network_instruments.h
1 /*
2  * $Id$
3  */
4
5 /***************************************************************************
6                           network_instruments.h  -  description
7                              -------------------
8     begin                : Wed Oct 29 2003
9     copyright            : (C) 2003 by root
10     email                : scotte[AT}netinst.com
11  ***************************************************************************/
12
13 /***************************************************************************
14  *                                                                         *
15  *   This program is free software; you can redistribute it and/or modify  *
16  *   it under the terms of the GNU General Public License as published by  *
17  *   the Free Software Foundation; either version 2 of the License, or     *
18  *   (at your option) any later version.                                   *
19  *                                                                         *
20  ***************************************************************************/
21
22 #ifndef __NETWORK_INSTRUMENTS_H__
23 #define __NETWORK_INSTRUMENTS_H__
24
25 #include <glib.h>
26 #include <wtap.h>
27
28 WS_DLL_LOCAL
29 int network_instruments_open(wtap *wth, int *err, gchar **err_info);
30 WS_DLL_LOCAL
31 int network_instruments_dump_can_write_encap(int encap);
32 WS_DLL_LOCAL
33 gboolean network_instruments_dump_open(wtap_dumper *wdh, int *err);
34
35 /*
36  * In v15 the high_byte was added to allow a larger offset This was done by 
37  * reducing the size of observer_version by 1 byte.  Since version strings are
38  * only 30 characters the high_byte will always be 0 in previous versions.
39  */
40 typedef struct capture_file_header
41 {
42     char    observer_version[31];
43     guint8  offset_to_first_packet_high_byte; /* allows to extend the offset to the first packet to 256*0x10000 = 16 MB */
44     guint16 offset_to_first_packet;
45     char    probe_instance;
46     guint8  number_of_information_elements;   /* number of TLVs in the header */
47 } capture_file_header;
48
49 #define CAPTURE_FILE_HEADER_FROM_LE_IN_PLACE(_capture_file_header) \
50     _capture_file_header.offset_to_first_packet = GUINT16_FROM_LE((_capture_file_header).offset_to_first_packet)
51
52 #define CAPTURE_FILE_HEADER_TO_LE_IN_PLACE(_capture_file_header) \
53     _capture_file_header.offset_to_first_packet = GUINT16_TO_LE((_capture_file_header).offset_to_first_packet)
54
55 typedef struct tlv_header
56 {
57     guint16 type;
58     guint16 length;        /* includes the length of the TLV header */
59 } tlv_header;
60
61 #define TLV_HEADER_FROM_LE_IN_PLACE(_tlv_header) \
62     (_tlv_header).type   = GUINT16_FROM_LE((_tlv_header).type); \
63     (_tlv_header).length = GUINT16_FROM_LE((_tlv_header).length)
64
65 #define TLV_HEADER_TO_LE_IN_PLACE(_tlv_header) \
66     (_tlv_header).type   = GUINT16_TO_LE((_tlv_header).type); \
67     (_tlv_header).length = GUINT16_TO_LE((_tlv_header).length)
68
69 typedef struct tlv_time_info {
70     guint16 type;
71     guint16 length;
72     guint32 time_format;
73 } tlv_time_info;
74
75 #define TLV_TIME_INFO_FROM_LE_IN_PLACE(_tlv_time_info) \
76     (_tlv_time_info).type   = GUINT16_FROM_LE((_tlv_time_info).type); \
77     (_tlv_time_info).length = GUINT16_FROM_LE((_tlv_time_info).length); \
78     (_tlv_time_info).time_format = GUINT32_FROM_LE((_tlv_time_info).time_format)
79
80 #define TLV_TIME_INFO_TO_LE_IN_PLACE(_tlv_time_info) \
81     (_tlv_time_info).type   = GUINT16_TO_LE((_tlv_time_info).type); \
82     (_tlv_time_info).length = GUINT16_TO_LE((_tlv_time_info).length); \
83     (_tlv_time_info).time_format = GUINT32_FROM_LE((_tlv_time_info).time_format)
84
85 typedef struct tlv_wireless_info {
86     guint8 quality;
87     guint8 signalStrength;
88     guint8 rate;
89     guint8 frequency;
90     guint8 qualityPercent;
91     guint8 strengthPercent;
92     guint8 conditions;
93     guint8 reserved;
94 } tlv_wireless_info;
95
96 /*
97  * Wireless conditions
98  */
99 #define WIRELESS_WEP_SUCCESS            0x80
100
101 /*
102  * TLV type values.
103  */
104 #define INFORMATION_TYPE_ALIAS_LIST 0x01
105 #define INFORMATION_TYPE_COMMENT    0x02 /* ASCII text */
106 #define INFORMATION_TYPE_TIME_INFO  0x04
107 #define INFORMATION_TYPE_WIRELESS   0x101
108
109 /*
110  * TVL TIME_INFO values.
111  */
112 #define TIME_INFO_LOCAL 0
113 #define TIME_INFO_GMT   1
114
115 typedef struct packet_entry_header
116 {
117     guint32 packet_magic;
118     guint32 network_speed;
119     guint16 captured_size;
120     guint16 network_size;
121     guint16 offset_to_frame;
122     guint16 offset_to_next_packet;
123     guint8 network_type;
124     guint8 flags;
125     guint8 number_of_information_elements;    /* number of TLVs in the header */
126     guint8 packet_type;
127     guint16 errors;
128     guint16 reserved;
129     guint64 packet_number;
130     guint64 original_packet_number;
131     guint64 nano_seconds_since_2000;
132 } packet_entry_header;
133
134 #define PACKET_ENTRY_HEADER_FROM_LE_IN_PLACE(_packet_entry_header) \
135     (_packet_entry_header).packet_magic            = GUINT32_FROM_LE((_packet_entry_header).packet_magic); \
136     (_packet_entry_header).network_speed           = GUINT32_FROM_LE((_packet_entry_header).network_speed); \
137     (_packet_entry_header).captured_size           = GUINT16_FROM_LE((_packet_entry_header).captured_size); \
138     (_packet_entry_header).network_size            = GUINT16_FROM_LE((_packet_entry_header).network_size); \
139     (_packet_entry_header).offset_to_frame         = GUINT16_FROM_LE((_packet_entry_header).offset_to_frame); \
140     (_packet_entry_header).offset_to_next_packet   = GUINT16_FROM_LE((_packet_entry_header).offset_to_next_packet); \
141     (_packet_entry_header).errors                  = GUINT16_FROM_LE((_packet_entry_header).errors); \
142     (_packet_entry_header).reserved                = GUINT16_FROM_LE((_packet_entry_header).reserved); \
143     (_packet_entry_header).packet_number           = GUINT64_FROM_LE((_packet_entry_header).packet_number); \
144     (_packet_entry_header).original_packet_number  = GUINT64_FROM_LE((_packet_entry_header).original_packet_number); \
145     (_packet_entry_header).nano_seconds_since_2000 = GUINT64_FROM_LE((_packet_entry_header).nano_seconds_since_2000)
146
147 #define PACKET_ENTRY_HEADER_TO_LE_IN_PLACE(_packet_entry_header) \
148     (_packet_entry_header).packet_magic            = GUINT32_TO_LE((_packet_entry_header).packet_magic); \
149     (_packet_entry_header).network_speed           = GUINT32_TO_LE((_packet_entry_header).network_speed); \
150     (_packet_entry_header).captured_size           = GUINT16_TO_LE((_packet_entry_header).captured_size); \
151     (_packet_entry_header).network_size            = GUINT16_TO_LE((_packet_entry_header).network_size); \
152     (_packet_entry_header).offset_to_frame         = GUINT16_TO_LE((_packet_entry_header).offset_to_frame); \
153     (_packet_entry_header).offset_to_next_packet   = GUINT16_TO_LE((_packet_entry_header).offset_to_next_packet); \
154     (_packet_entry_header).errors                  = GUINT16_TO_LE((_packet_entry_header).errors); \
155     (_packet_entry_header).reserved                = GUINT16_TO_LE((_packet_entry_header).reserved); \
156     (_packet_entry_header).packet_number           = GUINT64_TO_LE((_packet_entry_header).packet_number); \
157     (_packet_entry_header).original_packet_number  = GUINT64_TO_LE((_packet_entry_header).original_packet_number); \
158     (_packet_entry_header).nano_seconds_since_2000 = GUINT64_TO_LE((_packet_entry_header).nano_seconds_since_2000)
159
160 /*
161  * Network type values.
162  */
163 #define OBSERVER_UNDEFINED       0xFF
164 #define OBSERVER_ETHERNET        0x00
165 #define OBSERVER_TOKENRING       0x01
166 #define OBSERVER_FIBRE_CHANNEL   0x08
167 #define OBSERVER_WIRELESS_802_11 0x09
168
169 /*
170  * Packet type values.
171  */
172 #define PACKET_TYPE_DATA_PACKET               0
173 #define PACKET_TYPE_EXPERT_INFORMATION_PACKET 1
174
175 /*
176  * The Observer document indicates that the types of expert information
177  * packets are:
178  *
179  *    Network Load (markers used by Expert Time Interval and What If
180  *    analysis modes)
181  *
182  *    Start/Stop Packet Capture marker frames (with time stamps when
183  *    captures start and stop)
184  *
185  *    Wireless Channel Change (markers showing what channel was being
186  *    currently listened to)
187  *
188  * That information appears to be contained in TLVs.
189  */
190
191 /*
192  * TLV type values.
193  */
194 #define INFORMATION_TYPE_NETWORK_LOAD       0x0100
195 #define INFORMATION_TYPE_CAPTURE_START_STOP 0x0104
196
197 /*
198  * Might some of these be broadcast and multicast packet counts?
199  */
200 typedef struct tlv_network_load
201 {
202     guint32 utilization;        /* network utilization, in .1% units */
203     guint32 unknown1;
204     guint32 unknown2;
205     guint32 packets_per_second;
206     guint32 unknown3;
207     guint32 bytes_per_second;
208     guint32 unknown4;
209 } tlv_network_load;
210
211 typedef struct tlv_capture_start_stop
212 {
213     guint32 start_stop;
214 } tlv_capture_start_stop;
215
216 #define START_STOP_TYPE_STOP   0
217 #define START_STOP_TYPE_START  1
218
219 #endif
220