2 * Routines for Banyan VINES protocol packet disassembly
4 * $Id: packet-vines.c,v 1.12 2000/01/23 08:55:37 guy Exp $
6 * Don Lafontaine <lafont02@cn.ca>
8 * Ethereal - Network traffic analyzer
9 * By Gerald Combs <gerald@zing.org>
10 * Copyright 1998 Gerald Combs
11 * Joerg Mayer <jmayer@telemation.de>
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.
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.
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.
31 #ifdef HAVE_SYS_TYPES_H
32 #include <sys/types.h>
35 #ifdef HAVE_NETINET_IN_H
36 #include <netinet/in.h>
41 #include "packet-vines.h"
43 static gint ett_vines = -1;
44 static gint ett_vines_frp = -1;
45 static gint ett_vines_spp = -1;
48 capture_vines(const u_char *pd, int offset, packet_counts *ld)
55 /* AFAIK Vines FRP (Fragmentation Protocol) is used on all media except Ethernet
56 * and TR (and probably FDDI) - Fragmentation on these media types is not possible
57 * FIXME: Do we need to use this header with PPP too?
60 dissect_vines_frp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
61 guint8 vines_frp_ctrl, vines_frp_seqno;
62 proto_tree *vines_frp_tree;
64 gchar frp_flags_str[32];
66 /* To do: Check for {cap len,pkt len} < struct len */
67 /* Avoids alignment problems on many architectures. */
68 vines_frp_ctrl = pd[offset];
69 vines_frp_seqno = pd[offset+1];
71 if (check_col(fd, COL_PROTOCOL))
72 col_add_str(fd, COL_PROTOCOL, "Vines FRP");
74 * 1: first fragment of vines packet
75 * 2: last fragment of vines packet
78 switch (vines_frp_ctrl) {
80 strcpy(frp_flags_str, "middle");
83 strcpy(frp_flags_str, "first");
86 strcpy(frp_flags_str, "last");
89 strcpy(frp_flags_str, "only");
92 strcpy(frp_flags_str, "please report: unknown");
97 ti = proto_tree_add_text(tree, offset, 2, "Vines Fragmentation Protocol");
98 vines_frp_tree = proto_item_add_subtree(ti, ett_vines_frp);
99 proto_tree_add_text(vines_frp_tree, offset, 1, "Control Flags: 0x%02x = %s fragment", vines_frp_ctrl, frp_flags_str);
100 proto_tree_add_text(vines_frp_tree, offset + 1, 1, "Sequence Number: 0x%02x", vines_frp_seqno);
103 /* Skip over header */
106 /* Decode the "real" Vines now */
107 dissect_vines(pd, offset, fd, tree);
111 vines_addr_to_str(const guint8 *addrp)
113 static gchar str[3][214];
116 if (cur == &str[0][0]) {
118 } else if (cur == &str[1][0]) {
124 sprintf(cur, "%08x.%04x", pntohl(&addrp[0]), pntohs(&addrp[4]));
129 dissect_vines(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
132 proto_tree *vip_tree;
134 /* gchar tos_str[32]; */
135 int is_broadcast = 0;
138 /* To do: check for runts, errs, etc. */
139 /* Avoids alignment problems on many architectures. */
140 memcpy(&viph, &pd[offset], sizeof(e_vip));
142 viph.vip_chksum = pntohs(&pd[offset]);
143 viph.vip_pktlen = pntohs(&pd[offset+2]);
144 viph.vip_dnet = pntohl(&pd[offset+6]);
145 viph.vip_dsub = pntohs(&pd[offset+10]);
146 viph.vip_snet = pntohl(&pd[offset+12]);
147 viph.vip_ssub = pntohs(&pd[offset+16]);
149 switch (viph.vip_proto) {
151 if (check_col(fd, COL_PROTOCOL))
152 col_add_str(fd, COL_PROTOCOL, "Vines IPC");
153 if (check_col(fd, COL_INFO))
154 col_add_fstr(fd, COL_INFO, "IPC (%02x)", viph.vip_proto);
157 if (check_col(fd, COL_PROTOCOL))
158 col_add_str(fd, COL_PROTOCOL, "Vines SPP");
159 if (check_col(fd, COL_INFO))
160 col_add_fstr(fd, COL_INFO, "SPP (%02x)", viph.vip_proto);
163 if (check_col(fd, COL_PROTOCOL))
164 col_add_str(fd, COL_PROTOCOL, "Vines ARP");
165 if (check_col(fd, COL_INFO))
166 col_add_fstr(fd, COL_INFO, "ARP (%02x)", viph.vip_proto);
169 if (check_col(fd, COL_PROTOCOL))
170 col_add_str(fd, COL_PROTOCOL, "Vines RTP");
171 if (check_col(fd, COL_INFO))
172 col_add_fstr(fd, COL_INFO, "RTP (%02x)", viph.vip_proto);
175 if (check_col(fd, COL_PROTOCOL))
176 col_add_str(fd, COL_PROTOCOL, "Vines ICP");
177 if (check_col(fd, COL_INFO))
178 col_add_fstr(fd, COL_INFO, "ICP (%02x)", viph.vip_proto);
181 if (check_col(fd, COL_PROTOCOL))
182 col_add_str(fd, COL_PROTOCOL, "Vines IP");
183 if (check_col(fd, COL_INFO))
184 col_add_fstr(fd, COL_INFO, "Unknown VIP protocol (%02x)", viph.vip_proto);
187 SET_ADDRESS(&pi.net_src, AT_VINES, 6, &pd[offset+12]);
188 SET_ADDRESS(&pi.src, AT_VINES, 6, &pd[offset+12]);
189 SET_ADDRESS(&pi.net_dst, AT_VINES, 6, &pd[offset+6]);
190 SET_ADDRESS(&pi.dst, AT_VINES, 6, &pd[offset+6]);
192 /* helpers to decode flags */
193 /* FIXME: Not used yet */
194 if ((viph.vip_dnet == 0xffffffff) && (viph.vip_dsub == 0xffff)) {
197 hops = viph.vip_tctl & 0xf;
200 viph.ip_tos = IPTOS_TOS(viph.ip_tos);
204 strcpy(tos_str, "None");
207 strcpy(tos_str, "Minimize delay");
209 case IPTOS_THROUGHPUT:
210 strcpy(tos_str, "Maximize throughput");
212 case IPTOS_RELIABILITY:
213 strcpy(tos_str, "Maximize reliability");
216 strcpy(tos_str, "Minimize cost");
219 strcpy(tos_str, "Unknon. Malformed?");
225 ti = proto_tree_add_text(tree, offset, (viph.vip_pktlen), "Vines IP");
226 vip_tree = proto_item_add_subtree(ti, ett_vines);
227 proto_tree_add_text(vip_tree, offset, 2, "Packet checksum: 0x%04x", viph.vip_chksum);
228 proto_tree_add_text(vip_tree, offset + 2, 2, "Packet length: 0x%04x (%d)", viph.vip_pktlen, viph.vip_pktlen);
229 proto_tree_add_text(vip_tree, offset + 4, 1, "Transport control: 0x%02x",
231 proto_tree_add_text(vip_tree, offset + 5, 1, "Protocol: 0x%02x", viph.vip_proto);
236 switch (viph.vip_proto)
239 dissect_vines_spp(pd, offset, fd, tree);
242 dissect_data(pd, offset, fd, tree);
246 #define VINES_VSPP_DATA 1
247 #define VINES_VSPP_ACK 5
248 void dissect_vines_spp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
251 proto_tree *vspp_tree;
254 /* To do: check for runts, errs, etc. */
255 /* Avoids alignment problems on many architectures. */
256 memcpy(&viph, &pd[offset], sizeof(e_vspp));
258 viph.vspp_sport = ntohs(viph.vspp_sport);
259 viph.vspp_dport = ntohs(viph.vspp_dport);
260 viph.vspp_lclid = ntohs(viph.vspp_lclid);
261 viph.vspp_rmtid = ntohs(viph.vspp_rmtid);
263 switch (viph.vspp_pkttype)
265 case VSPP_PKTTYPE_DATA:
266 if (check_col(fd, COL_PROTOCOL))
267 col_add_str(fd, COL_PROTOCOL, "VSPP Data");
269 case VSPP_PKTTYPE_DISC:
270 if (check_col(fd, COL_PROTOCOL))
271 col_add_str(fd, COL_PROTOCOL, "VSPP Disconnect");
273 case VSPP_PKTTYPE_PROBE:
274 if (check_col(fd, COL_PROTOCOL))
275 col_add_str(fd, COL_PROTOCOL, "VSPP Probe");
277 case VSPP_PKTTYPE_ACK:
278 if (check_col(fd, COL_PROTOCOL))
279 col_add_str(fd, COL_PROTOCOL, "VSPP Ack");
282 if (check_col(fd, COL_PROTOCOL))
283 col_add_str(fd, COL_PROTOCOL, "VSPP Unknown");
285 if (check_col(fd, COL_INFO))
286 col_add_fstr(fd, COL_INFO, "NS=%04x NR=%04x Window=%04x RID=%04x LID=%04x D=%04x S=%04x",
287 viph.vspp_seqno, viph.vspp_ack, viph.vspp_win, viph.vspp_rmtid,
288 viph.vspp_lclid, viph.vspp_dport, viph.vspp_sport);
290 iph.ip_tos = IPTOS_TOS(iph.ip_tos);
294 strcpy(tos_str, "None");
297 strcpy(tos_str, "Minimize delay");
299 case IPTOS_THROUGHPUT:
300 strcpy(tos_str, "Maximize throughput");
302 case IPTOS_RELIABILITY:
303 strcpy(tos_str, "Maximize reliability");
306 strcpy(tos_str, "Minimize cost");
309 strcpy(tos_str, "Unknon. Malformed?");
315 ti = proto_tree_add_text(tree, offset, sizeof(viph), "Vines SPP");
316 vspp_tree = proto_item_add_subtree(ti, ett_vines_spp);
317 proto_tree_add_text(vspp_tree, offset, 2, "Source port: 0x%04x", viph.vspp_sport);
318 proto_tree_add_text(vspp_tree, offset+2, 2, "Destination port: 0x%04x", viph.vspp_dport);
319 proto_tree_add_text(vspp_tree, offset+4, 1, "Packet type: 0x%02x", viph.vspp_pkttype);
320 proto_tree_add_text(vspp_tree, offset+5, 1, "Control: 0x%02x", viph.vspp_control);
321 proto_tree_add_text(vspp_tree, offset+6, 2, "Local Connection ID: 0x%04x", viph.vspp_lclid);
322 proto_tree_add_text(vspp_tree, offset+8, 2, "Remote Connection ID: 0x%04x", viph.vspp_rmtid);
323 proto_tree_add_text(vspp_tree, offset+10, 2, "Sequence number: 0x%04x", viph.vspp_seqno);
324 proto_tree_add_text(vspp_tree, offset+12, 2, "Ack number: 0x%04x", viph.vspp_ack);
325 proto_tree_add_text(vspp_tree, offset+14, 2, "Window: 0x%04x", viph.vspp_win);
327 offset += 16; /* sizeof SPP */
328 dissect_data(pd, offset, fd, tree);
332 proto_register_vines(void)
334 static gint *ett[] = {
340 proto_register_subtree_array(ett, array_length(ett));