5e40eee77527d85c13ab67be9d87edc244f5c019
[obnox/wireshark/wip.git] / packet-null.c
1 /* packet-null.c
2  * Routines for null packet disassembly
3  *
4  * $Id: packet-null.c,v 1.6 1999/02/09 00:35:38 guy Exp $
5  *
6  * Ethereal - Network traffic analyzer
7  * By Gerald Combs <gerald@zing.org>
8  *
9  * This file created and by Mike Hall <mlh@io.com>
10  * Copyright 1998
11  * 
12  * This program is free software; you can redistribute it and/or
13  * modify it under the terms of the GNU General Public License
14  * as published by the Free Software Foundation; either version 2
15  * of the License, or (at your option) any later version.
16  * 
17  * This program is distributed in the hope that it will be useful,
18  * but WITHOUT ANY WARRANTY; without even the implied warranty of
19  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20  * GNU General Public License for more details.
21  * 
22  * You should have received a copy of the GNU General Public License
23  * along with this program; if not, write to the Free Software
24  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
25  */
26
27 #ifdef HAVE_CONFIG_H
28 # include "config.h"
29 #endif
30
31 #ifdef HAVE_SYS_TYPES_H
32 #include <sys/types.h>
33 #endif
34
35 #include <gtk/gtk.h>
36 #include <stdio.h>
37 #include <sys/socket.h>
38
39 #include "ethereal.h"
40 #include "packet.h"
41
42 void
43 capture_null( const u_char *pd, guint32 cap_len, packet_counts *ld ) {
44   e_nullhdr  nh;
45
46   memcpy((char *)&nh.null_family, (char *)&pd[2], sizeof(nh.null_family));
47
48   /* 
49   From what I've read in various sources, this is supposed to be an
50   address family, e.g. AF_INET.  However, a FreeBSD ISDN PPP dump that
51   Andreas Klemm sent to ethereal-dev has a packet type of DLT_NULL, and
52   the family bits look like PPP's protocol field.  A dump of the loopback
53   interface on my Linux box also has a link type of DLT_NULL (as it should
54   be), but the family bits look like ethernet's protocol type.  To
55   further  confuse matters, nobody seems to be paying attention to byte
56   order.
57   - gcc
58   */  
59    
60   switch (nh.null_family) {
61     case 0x0008:
62     case 0x0800:
63     case 0x0021:
64     case 0x2100:
65       capture_ip(pd, 4, cap_len, ld);
66       break;
67     default:
68       ld->other++;
69       break;
70   }
71 }
72
73 void
74 dissect_null( const u_char *pd, frame_data *fd, GtkTree *tree ) {
75   e_nullhdr  nh;
76   GtkWidget *ti, *fh_tree;
77
78   nh.null_next   = pd[0];
79   nh.null_len    = pd[1];
80   memcpy((char *)&nh.null_family, (char *)&pd[2], sizeof(nh.null_family));
81
82   /* load the top pane info. This should be overwritten by
83      the next protocol in the stack */
84   if(check_col(fd, COL_RES_DL_SRC))
85     col_add_str(fd, COL_RES_DL_SRC, "N/A" );
86   if(check_col(fd, COL_RES_DL_DST))
87     col_add_str(fd, COL_RES_DL_DST, "N/A" );
88   if(check_col(fd, COL_PROTOCOL))
89     col_add_str(fd, COL_PROTOCOL, "N/A" );
90   if(check_col(fd, COL_INFO))
91     col_add_str(fd, COL_INFO, "Null/Loopback" );
92
93   /* populate a tree in the second pane with the status of the link
94      layer (ie none) */
95   if(tree) {
96     ti = add_item_to_tree( GTK_WIDGET(tree), 0, 4,
97       "Null/Loopback" );
98     fh_tree = gtk_tree_new();
99     add_subtree(ti, fh_tree, ETT_NULL);
100     add_item_to_tree(fh_tree, 0, 1, "Next: %02x", nh.null_next);
101     add_item_to_tree(fh_tree, 1, 1, "Length: %02x", nh.null_len);
102     add_item_to_tree(fh_tree, 2, 2, "Family: %04x", nh.null_family);
103   }
104
105   /* 
106   From what I've read in various sources, this is supposed to be an
107   address family, e.g. AF_INET.  However, a FreeBSD ISDN PPP dump that
108   Andreas Klemm sent to ethereal-dev has a packet type of DLT_NULL, and
109   the family bits look like PPP's protocol field.  A dump of the loopback
110   interface on my Linux box also has a link type of DLT_NULL (as it should
111   be), but the family bits look like ethernet's protocol type.  To
112   further  confuse matters, nobody seems to be paying attention to byte
113   order.
114   - gcc
115   */  
116    
117   switch (nh.null_family) {
118     case 0x0008:
119     case 0x0800:
120     case 0x0021:
121     case 0x2100:
122       dissect_ip(pd, 4, fd, tree);
123       break;
124     default:
125       dissect_data(pd, 4, fd, tree);
126       break;
127   }
128 }