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