Initial revision
[obnox/wireshark/wip.git] / packet.h
1 /* packet.h
2  * Definitions for packet disassembly structures and routines
3  *
4  * Ethereal - Network traffic analyzer
5  * By Gerald Combs <gerald@zing.org>
6  * Copyright 1998 Gerald Combs
7  *
8  * 
9  * This program is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU General Public License
11  * as published by the Free Software Foundation; either version 2
12  * of the License, or (at your option) any later version.
13  * 
14  * This program is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU General Public License for more details.
18  * 
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, write to the Free Software
21  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
22  */
23
24
25 #ifndef __PACKET_H__
26 #define __PACKET_H__
27
28 /* Pointer versions of ntohs and ntohl.  Given a pointer to a member of a
29  * byte array, returns the value of the two or four bytes at the pointer.
30  * Handy for 
31  */
32
33 #if BYTE_ORDER == LITTLE_ENDIAN
34 #define pntohs(p)        ((guint16)                             \
35                           ((guint16)*((guint8 *)p+0)<<8|        \
36                            (guint16)*((guint8 *)p+1)<<0))
37
38 #define pntohl(p)       ((guint32)*((guint8 *)p+0)<<24|          \
39                          (guint32)*((guint8 *)p+1)<<16|          \
40                          (guint32)*((guint8 *)p+2)<<8|           \
41                          (guint32)*((guint8 *)p+3)<<0)
42 #else /* BIG_ENDIAN */
43 #define pntohs(p)        ((guint16)                             \
44                           ((guint16)*((guint8 *)p+1)<<8|        \
45                            (guint16)*((guint8 *)p+0)<<0))
46
47 #define pntohl(p)       ((guint32)*((guint8 *)p+3)<<24|          \
48                          (guint32)*((guint8 *)p+2)<<16|          \
49                          (guint32)*((guint8 *)p+1)<<8|           \
50                          (guint32)*((guint8 *)p+0)<<0)
51 #endif /* LITTLE_ENDIAN */
52
53 #define IEEE_802_3_MAX_LEN 1500
54 #define BYTE_VIEW_WIDTH    16
55
56 typedef struct _frame_data {
57   guint32  pkt_len;         /* Packet length */
58   guint32  cap_len;         /* Amount actually captured */
59   guint32  secs;            /* Seconds */
60   guint32  usecs;           /* Microseconds */
61   long     file_off;        /* File offset */
62   gchar   *win_info[5];        /* Packet list text */
63 } frame_data;
64
65 /* Many of the structs and definitions below were taken from include files
66  * in the Linux distribution. */
67
68 /* ARP / RARP structs and definitions */
69
70 typedef struct _e_ether_arp {
71   guint16 ar_hrd;
72   guint16 ar_pro;
73   guint8  ar_hln;
74   guint8  ar_pln;
75   guint16 ar_op;
76   guint8  arp_sha[6];
77   guint8  arp_spa[4];
78   guint8  arp_tha[6];
79   guint8  arp_tpa[4];
80 } e_ether_arp;
81
82 #ifndef ARPOP_REQUEST
83 #define ARPOP_REQUEST  1       /* ARP request.  */
84 #endif
85 #ifndef ARPOP_REPLY
86 #define ARPOP_REPLY    2       /* ARP reply.  */
87 #endif
88 /* Some OSes have different names, or don't define these at all */
89 #ifndef ARPOP_RREQUEST
90 #define ARPOP_RREQUEST 3       /* RARP request.  */
91 #endif
92 #ifndef ARPOP_RREPLY
93 #define ARPOP_RREPLY   4       /* RARP reply.  */
94 #endif
95
96 /* ICMP structs and definitions */
97
98 typedef struct _e_icmp {
99   guint8  icmp_type;
100   guint8  icmp_code;
101   guint16 icmp_cksum;
102   union {
103     struct {  /* Address mask request/reply */
104       guint16 id;
105       guint16 seq;
106       guint32 sn_mask;
107     } am;
108     struct {  /* Timestap request/reply */
109       guint16 id;
110       guint16 seq;
111       guint32 orig;
112       guint32 recv;
113       guint32 xmit;
114     } ts;
115     guint32 zero;  /* Unreachable */
116   } opt;
117 } e_icmp;
118
119 #define ICMP_ECHOREPLY     0
120 #define ICMP_UNREACH       3
121 #define ICMP_SOURCEQUENCH  4
122 #define ICMP_REDIRECT      5
123 #define ICMP_ECHO          8
124 #define ICMP_TIMXCEED     11
125 #define ICMP_PARAMPROB    12
126 #define ICMP_TSTAMP       13
127 #define ICMP_TSTAMPREPLY  14
128 #define ICMP_IREQ         15
129 #define ICMP_IREQREPLY    16
130 #define ICMP_MASKREQ      17
131 #define ICMP_MASKREPLY    18
132
133 /* IGMP structs and definitions */
134
135 typedef struct _e_igmp {
136 #if BYTE_ORDER == BIG_ENDIAN
137   guint8  igmp_v:4;
138   guint8  igmp_t:4;
139 #else /* Little endian */
140   guint8  igmp_t:4;
141   guint8  igmp_v:4;
142 #endif
143   guint8  igmp_unused;
144   guint16 igmp_cksum;
145   guint32 igmp_gaddr;
146 } e_igmp;
147
148 #define IGMP_M_QRY     0x01
149 #define IGMP_V1_M_RPT  0x02
150 #define IGMP_V2_LV_GRP 0x07
151 #define IGMP_DVMRP     0x03
152 #define IGMP_PIM       0x04
153 #define IGMP_V2_M_RPT  0x06
154 #define IGMP_MTRC_RESP 0x1e
155 #define IGMP_MTRC      0x1f
156
157 /* IP structs and definitions */
158
159 typedef struct _e_ip {
160 #if BYTE_ORDER == BIG_ENDIAN
161   guint8  ip_v:4;
162   guint8  ip_hl:4;
163 #else /* Little endian */
164   guint8  ip_hl:4;
165   guint8  ip_v:4;
166 #endif
167   guint8  ip_tos;
168   guint16 ip_len;
169   guint16 ip_id;
170   guint16 ip_off;
171   guint8  ip_ttl;
172   guint8  ip_p;
173   guint16 ip_sum;
174   guint32 ip_src;
175   guint32 ip_dst;
176 } e_ip;
177
178 #define IPTOS_TOS_MASK    0x1E
179 #define IPTOS_TOS(tos)    ((tos) & IPTOS_TOS_MASK)
180 #define IPTOS_NONE        0x00
181 #define IPTOS_LOWDELAY    0x10
182 #define IPTOS_THROUGHPUT  0x08
183 #define IPTOS_RELIABILITY 0x04
184 #define IPTOS_LOWCOST     0x02
185
186 #define IP_PROTO_ICMP  1
187 #define IP_PROTO_IGMP  2
188 #define IP_PROTO_TCP   6
189 #define IP_PROTO_UDP  17
190 #define IP_PROTO_OSPF 89
191
192 /* PPP structs and definitions */
193
194 typedef struct _e_ppphdr {
195   guint8  ppp_flag;
196   guint8  ppp_addr;
197   guint8  ppp_ctl;
198   guint16 ppp_prot;
199 } e_ppphdr;
200
201 /* TCP structs and definitions */
202
203 typedef struct _e_tcphdr {
204   guint16 th_sport;
205   guint16 th_dport;
206   guint32 th_seq;
207   guint32 th_ack;
208 #if BYTE_ORDER == LITTLE_ENDIAN
209   guint8  th_x2:4;
210   guint8  th_off:4;
211 #else
212   guint8  th_off:4;
213   guint8  th_x2:4;
214 #endif
215   guint8  th_flags;
216 #define TH_FIN  0x01
217 #define TH_SYN  0x02
218 #define TH_RST  0x04
219 #define TH_PUSH 0x08
220 #define TH_ACK  0x10
221 #define TH_URG  0x20
222   guint16 th_win;
223   guint16 th_sum;
224   guint16 th_urp;
225 } e_tcphdr;
226
227 /* UDP structs and definitions */
228
229 typedef struct _e_udphdr {
230   guint16 uh_sport;
231   guint16 uh_dport;
232   guint16 uh_ulen;
233   guint16 uh_sum;
234 } e_udphdr;
235
236 /* UDP Ports -> should go in packet-udp.h */
237
238 #define UDP_PORT_DNS 53
239 #define UDP_PORT_BOOTPS 67
240 #define UDP_PORT_RIP 520
241
242 /* TCP Ports */
243
244 #define TCP_PORT_PRINTER 515
245
246 /* Tree types.  Each dissect_* routine should have one for each
247    add_subtree() call. */
248
249 #define ETT_IEEE8023      0
250 #define ETT_ETHER2        1
251 #define ETT_LLC           2
252 #define ETT_TOKEN_RING    3
253 #define ETT_TR_IERR_CNT   4
254 #define ETT_TR_NERR_CNT   5
255 #define ETT_TR_MAC        6
256 #define ETT_PPP           7
257 #define ETT_ARP           8
258 #define ETT_IP            9
259 #define ETT_UDP          10
260 #define ETT_TCP          11
261 #define ETT_ICMP         12
262 #define ETT_IGMP         13
263 #define ETT_IPX          14
264 #define ETT_SPX          15
265 #define ETT_NCP          16
266 #define ETT_DNS          17
267 #define ETT_DNS_ANS      18
268 #define ETT_DNS_QRY      19
269 #define ETT_RIP          20
270 #define ETT_RIP_VEC      21
271 #define ETT_OSPF         22
272 #define ETT_OSPF_HDR     23
273 #define ETT_OSPF_HELLO   24
274 #define ETT_OSPF_DESC    25
275 #define ETT_OSPF_LSR     26
276 #define ETT_OSPF_LSA_UPD 27
277 #define ETT_OSPF_LSA     28
278 #define ETT_LPD          29
279 #define ETT_RAW          30
280 #define ETT_BOOTP        31
281 #define ETT_BOOTP_OPTION 32
282 #define ETT_IPv6         33
283
284 /* Should be the last item number plus one */
285 #define NUM_TREE_TYPES 34
286
287 /* The version of pcap.h that comes with some systems is missing these
288  * #defines.
289  */
290
291 #ifndef DLT_RAW
292 #define DLT_RAW 12
293 #endif
294
295 #ifndef DLT_SLIP_BSDOS
296 #define DLT_SLIP_BSDOS 13
297 #endif
298
299 #ifndef DLT_PPP_BSDOS
300 #define DLT_PPP_BSDOS 14
301 #endif
302
303 /* Utility routines used by packet*.c */
304 gchar*     ether_to_str(guint8 *);
305 gchar*     ip_to_str(guint8 *);
306 void       packet_hex_print(GtkText *, guint8 *, gint, gint, gint);
307 GtkWidget* add_item_to_tree(GtkWidget *, gint, gint, gchar *, ...);
308 void       decode_start_len(GtkTreeItem *, gint*, gint*);
309
310 /* Routines in packet.c */
311 void dissect_packet(const u_char *, frame_data *, GtkTree *);
312 void add_subtree(GtkWidget *, GtkWidget*, gint);
313 void expand_tree(GtkWidget *, gpointer);
314 void collapse_tree(GtkWidget *, gpointer);
315
316 /*
317  * Routines in packet-*.c
318  * Routines should take three args: packet data *, frame_data *, tree *
319  * They should never modify the packet data.
320  */
321 void dissect_eth(const u_char *, frame_data *, GtkTree *);
322 void dissect_ppp(const u_char *, frame_data *, GtkTree *);
323 void dissect_raw(const u_char *, frame_data *, GtkTree *);
324 void dissect_tr(const u_char *, frame_data *, GtkTree *);
325
326 /*
327  * Routines in packet-*.c
328  * Routines should take four args: packet data *, offset, frame_data *,
329  * tree *
330  * They should never modify the packet data.
331  */
332 void dissect_arp(const u_char *, int, frame_data *, GtkTree *);
333 void dissect_bootp(const u_char *, int, frame_data *, GtkTree *);
334 void dissect_data(const u_char *, int, frame_data *, GtkTree *);
335 void dissect_dns(const u_char *, int, frame_data *, GtkTree *);
336 void dissect_icmp(const u_char *, int, frame_data *, GtkTree *);
337 void dissect_igmp(const u_char *, int, frame_data *, GtkTree *);
338 void dissect_ip(const u_char *, int, frame_data *, GtkTree *);
339 void dissect_ipv6(const u_char *, int, frame_data *, GtkTree *);
340 void dissect_ipx(const u_char *, int, frame_data *, GtkTree *);
341 void dissect_llc(const u_char *, int, frame_data *, GtkTree *);
342 void dissect_lpd(const u_char *, int, frame_data *, GtkTree *);
343 void dissect_ospf(const u_char *, int, frame_data *, GtkTree *);
344 void dissect_ospf_hello(const u_char *, int, frame_data *, GtkTree *);
345 void dissect_tcp(const u_char *, int, frame_data *, GtkTree *);
346 void dissect_trmac(const u_char *, int, frame_data *, GtkTree *);
347 void dissect_udp(const u_char *, int, frame_data *, GtkTree *);
348
349 /* This function is in ethertype.c */
350 void ethertype(guint16 etype, int offset,
351                 const u_char *pd, frame_data *fd, GtkTree *tree,
352                 GtkWidget *fh_tree);
353
354 #endif /* packet.h */