"const"ifty some function arguments and structure members, and "#if 0"
[obnox/wireshark/wip.git] / packet-vines.c
1 /* packet-vines.c
2  * Routines for Banyan VINES protocol packet disassembly
3  *
4  * $Id: packet-vines.c,v 1.7 1999/07/07 22:51:57 gram Exp $
5  *
6  * Don Lafontaine <lafont02@cn.ca>
7  *
8  * Ethereal - Network traffic analyzer
9  * By Gerald Combs <gerald@zing.org>
10  * Copyright 1998 Gerald Combs
11  * Joerg Mayer <jmayer@telemation.de>
12  *
13  * 
14  * This program is free software; you can redistribute it and/or
15  * modify it under the terms of the GNU General Public License
16  * as published by the Free Software Foundation; either version 2
17  * of the License, or (at your option) any later version.
18  * 
19  * This program is distributed in the hope that it will be useful,
20  * but WITHOUT ANY WARRANTY; without even the implied warranty of
21  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22  * GNU General Public License for more details.
23  * 
24  * You should have received a copy of the GNU General Public License
25  * along with this program; if not, write to the Free Software
26  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
27  */
28
29 #include "config.h"
30
31 #ifdef HAVE_SYS_TYPES_H
32 #include <sys/types.h>
33 #endif
34
35 #ifdef HAVE_NETINET_IN_H
36 #include <netinet/in.h>
37 #endif
38
39 #include <glib.h>
40 #include "packet.h"
41 #include "packet-vines.h"
42
43
44 /* AFAIK Vines FRP (Fragmentation Protocol) is used on all media except Ethernet
45  * and TR (and probably FDDI) - Fragmentation on these media types is not possible
46  * FIXME: Do we need to use this header with PPP too?
47  */
48
49 void
50 dissect_vines_frp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
51   guint8   vines_frp_ctrl, vines_frp_seqno; 
52   proto_tree *vines_frp_tree;
53   proto_item *ti;
54   gchar frp_flags_str[32];
55
56   /* To do: Check for {cap len,pkt len} < struct len */
57   /* Avoids alignment problems on many architectures. */
58   vines_frp_ctrl = pd[offset];
59   vines_frp_seqno = pd[offset+1];
60   
61   if (check_col(fd, COL_PROTOCOL))
62     col_add_str(fd, COL_PROTOCOL, "Vines FRP");
63   /*
64    * 1: first fragment of vines packet
65    * 2: last fragment of vines packet
66    * 4 ... 80: unused
67    */
68   switch (vines_frp_ctrl) {
69   case 0:
70     strcpy(frp_flags_str, "middle");
71     break;
72   case 1:
73     strcpy(frp_flags_str, "first");
74     break;
75   case 2:
76     strcpy(frp_flags_str, "last");
77     break;
78   case 3:
79     strcpy(frp_flags_str, "only");
80     break;
81   default:
82     strcpy(frp_flags_str, "please report: unknown");
83     break;
84   }
85   
86   if (tree) {
87     ti = proto_tree_add_text(tree, offset, 2, "Vines Fragmentation Protocol");
88     vines_frp_tree = proto_item_add_subtree(ti, ETT_VINES_FRP);
89     proto_tree_add_text(vines_frp_tree, offset,     1, "Control Flags: 0x%02x = %s fragment", vines_frp_ctrl, frp_flags_str);
90     proto_tree_add_text(vines_frp_tree, offset + 1, 1, "Sequence Number: 0x%02x", vines_frp_seqno);
91   }
92
93   /* Skip over header */
94   offset += 2;
95
96   /* Decode the "real" Vines now */
97   dissect_vines(pd, offset, fd, tree);
98 }
99
100 void
101 dissect_vines(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) 
102         {
103         e_vip       viph;
104         proto_tree *vip_tree;
105         proto_item *ti;
106 /*      gchar      tos_str[32]; */
107         int  is_broadcast = 0;
108         int  hops = 0;
109
110   /* To do: check for runts, errs, etc. */
111   /* Avoids alignment problems on many architectures. */
112         memcpy(&viph, &pd[offset], sizeof(e_vip));
113
114         viph.vip_chksum = pntohs(&pd[offset]);
115         viph.vip_pktlen = pntohs(&pd[offset+2]);
116         viph.vip_dnet = pntohl(&pd[offset+6]);
117         viph.vip_snet = pntohl(&pd[offset+12]);
118         viph.vip_dsub = pntohs(&pd[offset+10]);
119         viph.vip_ssub = pntohs(&pd[offset+16]);
120
121         switch (viph.vip_proto) {
122         case VIP_PROTO_IPC:
123                 if (check_col(fd, COL_PROTOCOL))
124                         col_add_str(fd, COL_PROTOCOL, "Vines IPC");
125                 if (check_col(fd, COL_INFO))
126                         col_add_fstr(fd, COL_INFO, "IPC (%02x)", viph.vip_proto);
127                 break;
128         case VIP_PROTO_SPP:      
129                 if (check_col(fd, COL_PROTOCOL))
130                         col_add_str(fd, COL_PROTOCOL, "Vines SPP");
131                 if (check_col(fd, COL_INFO))
132                         col_add_fstr(fd, COL_INFO, "SPP (%02x)", viph.vip_proto);
133                 break;
134         case VIP_PROTO_ARP:
135                 if (check_col(fd, COL_PROTOCOL))
136                         col_add_str(fd, COL_PROTOCOL, "Vines ARP");
137                 if (check_col(fd, COL_INFO))
138                         col_add_fstr(fd, COL_INFO, "ARP (%02x)", viph.vip_proto);
139                 break;
140         case VIP_PROTO_RTP:
141                 if (check_col(fd, COL_PROTOCOL))
142                         col_add_str(fd, COL_PROTOCOL, "Vines RTP");
143                 if (check_col(fd, COL_INFO))
144                         col_add_fstr(fd, COL_INFO, "RTP (%02x)", viph.vip_proto);
145                 break;
146         case VIP_PROTO_ICP:
147                 if (check_col(fd, COL_PROTOCOL))
148                         col_add_str(fd, COL_PROTOCOL, "Vines ICP");
149                 if (check_col(fd, COL_INFO))
150                         col_add_fstr(fd, COL_INFO, "ICP (%02x)", viph.vip_proto);
151                 break;
152         default:
153                 if (check_col(fd, COL_PROTOCOL))
154                         col_add_str(fd, COL_PROTOCOL, "Vines IP");
155                 if (check_col(fd, COL_INFO))
156                         col_add_fstr(fd, COL_INFO, "Unknown VIP protocol (%02x)", viph.vip_proto);
157         }
158
159                         if (check_col(fd, COL_RES_NET_SRC))
160                 col_add_fstr(fd, COL_RES_NET_SRC, "%08x.%04x", viph.vip_snet, viph.vip_ssub);
161                         if (check_col(fd, COL_RES_NET_DST))
162                 col_add_fstr(fd, COL_RES_NET_DST, "%08x.%04x", viph.vip_dnet, viph.vip_dsub);
163
164         /* helpers to decode flags */
165         /* FIXME: Not used yet */
166         if ((viph.vip_dnet == 0xffffffff) && (viph.vip_dsub == 0xffff)) {
167                 is_broadcast = 1;
168         }
169         hops = viph.vip_tctl & 0xf; 
170  
171   /*
172         viph.ip_tos = IPTOS_TOS(viph.ip_tos);
173         switch (viph.ip_tos) 
174                 {
175         case IPTOS_NONE:
176                 strcpy(tos_str, "None");
177                 break;
178         case IPTOS_LOWDELAY:
179                 strcpy(tos_str, "Minimize delay");
180                 break;
181         case IPTOS_THROUGHPUT:
182                 strcpy(tos_str, "Maximize throughput");
183                 break;
184         case IPTOS_RELIABILITY:
185                 strcpy(tos_str, "Maximize reliability");
186                 break;
187         case IPTOS_LOWCOST:
188                 strcpy(tos_str, "Minimize cost");
189                 break;
190         default:
191                 strcpy(tos_str, "Unknon.  Malformed?");
192                 break;
193                 }
194   */
195         if (tree) 
196                 {
197         ti = proto_tree_add_text(tree, offset, (viph.vip_pktlen), "Vines IP");
198         vip_tree = proto_item_add_subtree(ti, ETT_VINES);
199         proto_tree_add_text(vip_tree, offset,      2, "Packet checksum: 0x%04x", viph.vip_chksum);
200         proto_tree_add_text(vip_tree, offset +  2, 2, "Packet length: 0x%04x (%d)", viph.vip_pktlen, viph.vip_pktlen); 
201         proto_tree_add_text(vip_tree, offset +  4, 1, "Transport control: 0x%02x",
202                 viph.vip_tctl);
203         proto_tree_add_text(vip_tree, offset +  5, 1, "Protocol: 0x%02x", viph.vip_proto);
204                 }
205
206
207         offset += 18;
208         switch (viph.vip_proto) 
209                 {
210         case VIP_PROTO_SPP:
211                 dissect_vines_spp(pd, offset, fd, tree);
212                 break;
213                 }
214         }
215 #define VINES_VSPP_DATA 1
216 #define VINES_VSPP_ACK 5
217 void dissect_vines_spp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) 
218         {
219         e_vspp       viph;
220         proto_tree *vspp_tree;
221         proto_item *ti;
222
223   /* To do: check for runts, errs, etc. */
224   /* Avoids alignment problems on many architectures. */
225         memcpy(&viph, &pd[offset], sizeof(e_vspp));
226
227         viph.vspp_sport = ntohs(viph.vspp_sport);
228         viph.vspp_dport = ntohs(viph.vspp_dport);
229         viph.vspp_lclid = ntohs(viph.vspp_lclid);
230         viph.vspp_rmtid = ntohs(viph.vspp_rmtid);
231
232     switch (viph.vspp_pkttype) 
233         {
234         case VSPP_PKTTYPE_DATA:      
235                                         if (check_col(fd, COL_PROTOCOL))
236                         col_add_str(fd, COL_PROTOCOL, "VSPP Data");
237                 break;
238         case VSPP_PKTTYPE_DISC:      
239                                         if (check_col(fd, COL_PROTOCOL))
240                         col_add_str(fd, COL_PROTOCOL, "VSPP Disconnect");
241                 break;
242         case VSPP_PKTTYPE_PROBE:      
243                                         if (check_col(fd, COL_PROTOCOL))
244                         col_add_str(fd, COL_PROTOCOL, "VSPP Probe");
245                 break;
246         case VSPP_PKTTYPE_ACK:
247                                         if (check_col(fd, COL_PROTOCOL))
248                         col_add_str(fd, COL_PROTOCOL, "VSPP Ack");
249                 break;
250         default:
251                                         if (check_col(fd, COL_PROTOCOL))
252                         col_add_str(fd, COL_PROTOCOL, "VSPP Unknown");
253         }
254         if (check_col(fd, COL_INFO))
255                 col_add_fstr(fd, COL_INFO, "NS=%04x NR=%04x Window=%04x RID=%04x LID=%04x D=%04x S=%04x", 
256                         viph.vspp_seqno, viph.vspp_ack, viph.vspp_win, viph.vspp_rmtid,
257                         viph.vspp_lclid, viph.vspp_dport, viph.vspp_sport);
258   /*
259         iph.ip_tos = IPTOS_TOS(iph.ip_tos);
260         switch (iph.ip_tos)
261                 {
262         case IPTOS_NONE:
263                 strcpy(tos_str, "None");
264                 break;
265         case IPTOS_LOWDELAY:
266                 strcpy(tos_str, "Minimize delay");
267                 break;
268         case IPTOS_THROUGHPUT:
269                 strcpy(tos_str, "Maximize throughput");
270                 break;
271         case IPTOS_RELIABILITY:
272                 strcpy(tos_str, "Maximize reliability");
273                 break;
274         case IPTOS_LOWCOST:
275                 strcpy(tos_str, "Minimize cost");
276                 break;
277         default:
278                 strcpy(tos_str, "Unknon.  Malformed?");
279                 break;
280                 }
281 */ 
282         if (tree) 
283                 {
284         ti = proto_tree_add_text(tree, offset, sizeof(viph), "Vines SPP");
285         vspp_tree = proto_item_add_subtree(ti, ETT_VINES_SPP);
286         proto_tree_add_text(vspp_tree, offset,      2, "Source port: 0x%04x", viph.vspp_sport);
287         proto_tree_add_text(vspp_tree, offset+2,    2, "Destination port: 0x%04x", viph.vspp_dport); 
288         proto_tree_add_text(vspp_tree, offset+4,    1, "Packet type: 0x%02x", viph.vspp_pkttype);
289         proto_tree_add_text(vspp_tree, offset+5,    1, "Control: 0x%02x", viph.vspp_control);
290         proto_tree_add_text(vspp_tree, offset+6,    2, "Local Connection ID: 0x%04x", viph.vspp_lclid);
291         proto_tree_add_text(vspp_tree, offset+8,    2, "Remote Connection ID: 0x%04x", viph.vspp_rmtid);
292         proto_tree_add_text(vspp_tree, offset+10,   2, "Sequence number: 0x%04x", viph.vspp_seqno);
293         proto_tree_add_text(vspp_tree, offset+12,   2, "Ack number: 0x%04x", viph.vspp_ack);
294         proto_tree_add_text(vspp_tree, offset+14,   2, "Window: 0x%04x", viph.vspp_win);
295                 }
296
297         }