aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--packet-udp.c15
-rw-r--r--packet-vines.c513
-rw-r--r--packet-vines.h3
3 files changed, 299 insertions, 232 deletions
diff --git a/packet-udp.c b/packet-udp.c
index b595ebebaf..9782e7d39c 100644
--- a/packet-udp.c
+++ b/packet-udp.c
@@ -1,7 +1,7 @@
/* packet-udp.c
* Routines for UDP packet disassembly
*
- * $Id: packet-udp.c,v 1.81 2001/01/03 06:55:34 guy Exp $
+ * $Id: packet-udp.c,v 1.82 2001/01/06 08:44:03 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@zing.org>
@@ -71,10 +71,6 @@ typedef struct _e_udphdr {
guint16 uh_sum;
} e_udphdr;
-/* UDP Ports -> should go in packet-udp.h */
-
-#define UDP_PORT_VINES 573
-
static dissector_table_t udp_dissector_table;
static heur_dissector_list_t heur_subdissector_list;
@@ -127,14 +123,7 @@ decode_udp_ports(tvbuff_t *tvb, int offset, packet_info *pinfo,
if (dissector_try_heuristic(heur_subdissector_list, next_tvb, pinfo, tree))
return;
- /* XXX - we should do these with the subdissector table as well. */
-#define PORT_IS(port) (uh_sport == port || uh_dport == port)
- if (PORT_IS(UDP_PORT_VINES)) {
- /* FIXME: AFAIK, src and dst port must be the same */
- tvb_compat(next_tvb, &next_pd, &next_offset);
- dissect_vines_frp(next_pd, next_offset, pinfo->fd, tree);
- } else
- dissect_data(next_tvb, 0, pinfo, tree);
+ dissect_data(next_tvb, 0, pinfo, tree);
}
diff --git a/packet-vines.c b/packet-vines.c
index 72325cdb53..5b70badf7e 100644
--- a/packet-vines.c
+++ b/packet-vines.c
@@ -1,7 +1,7 @@
/* packet-vines.c
* Routines for Banyan VINES protocol packet disassembly
*
- * $Id: packet-vines.c,v 1.21 2001/01/03 06:55:34 guy Exp $
+ * $Id: packet-vines.c,v 1.22 2001/01/06 08:44:03 guy Exp $
*
* Don Lafontaine <lafont02@cn.ca>
*
@@ -46,85 +46,129 @@
#include "packet-vines.h"
#include "packet-ip.h"
+#define UDP_PORT_VINES 573
+
static int proto_vines = -1;
static int hf_vines_protocol = -1;
static gint ett_vines = -1;
+
+static int proto_vines_frp = -1;
+
static gint ett_vines_frp = -1;
+
+static int proto_vines_spp = -1;
+
static gint ett_vines_spp = -1;
+static void dissect_vines_frp(tvbuff_t *, packet_info *, proto_tree *);
#if 0
-static void dissect_vines_arp(const u_char *, int, frame_data *, proto_tree *);
-static void dissect_vines_icp(const u_char *, int, frame_data *, proto_tree *);
-static void dissect_vines_ipc(const u_char *, int, frame_data *, proto_tree *);
-static void dissect_vines_rtp(const u_char *, int, frame_data *, proto_tree *);
+static void dissect_vines_arp(tvbuff_t *, packet_info *, proto_tree *);
+static void dissect_vines_icp(tvbuff_t *, packet_info *, proto_tree *);
+static void dissect_vines_ipc(tvbuff_t *, packet_info *, proto_tree *);
+static void dissect_vines_rtp(tvbuff_t *, packet_info *, proto_tree *);
#endif
-static void dissect_vines_spp(const u_char *, int, frame_data *, proto_tree *);
-static void dissect_vines(const u_char *, int, frame_data *, proto_tree *);
+static void dissect_vines_spp(tvbuff_t *, packet_info *, proto_tree *);
+static void dissect_vines(tvbuff_t *, packet_info *, proto_tree *);
void
capture_vines(const u_char *pd, int offset, packet_counts *ld)
{
- ld->vines++;
+ ld->vines++;
}
-/* AFAIK Vines FRP (Fragmentation Protocol) is used on all media except Ethernet
- * and TR (and probably FDDI) - Fragmentation on these media types is not possible
+/* AFAIK Vines FRP (Fragmentation Protocol) is used on all media except
+ * Ethernet and TR (and probably FDDI) - Fragmentation on these media types
+ * is not possible
* FIXME: Do we need to use this header with PPP too?
*/
-void
-dissect_vines_frp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
- guint8 vines_frp_ctrl, vines_frp_seqno;
- proto_tree *vines_frp_tree;
- proto_item *ti;
- gchar frp_flags_str[32];
+static void
+dissect_vines_frp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
+{
+ guint8 vines_frp_ctrl;
+ proto_tree *vines_frp_tree;
+ proto_item *ti;
+ gchar frp_flags_str[32];
+ tvbuff_t *next_tvb;
+
+ CHECK_DISPLAY_AS_DATA(proto_vines_frp, tvb, pinfo, tree);
- /* To do: Check for {cap len,pkt len} < struct len */
+ pinfo->current_proto = "Vines FRP";
- vines_frp_ctrl = pd[offset];
- vines_frp_seqno = pd[offset+1];
+ if (check_col(pinfo->fd, COL_PROTOCOL))
+ col_set_str(pinfo->fd, COL_PROTOCOL, "Vines FRP");
+ if (check_col(pinfo->fd, COL_INFO))
+ col_clear(pinfo->fd, COL_INFO);
+
+ if (tree) {
+ ti = proto_tree_add_item(tree, proto_vines_frp, tvb, 0, 2,
+ FALSE);
+ vines_frp_tree = proto_item_add_subtree(ti, ett_vines_frp);
+
+ vines_frp_ctrl = tvb_get_guint8(tvb, 0);
- if (check_col(fd, COL_PROTOCOL))
- col_set_str(fd, COL_PROTOCOL, "Vines FRP");
- /*
- * 1: first fragment of vines packet
- * 2: last fragment of vines packet
- * 4 ... 80: unused
- */
- switch (vines_frp_ctrl) {
- case 0:
- strcpy(frp_flags_str, "middle");
- break;
- case 1:
- strcpy(frp_flags_str, "first");
- break;
- case 2:
- strcpy(frp_flags_str, "last");
- break;
- case 3:
- strcpy(frp_flags_str, "only");
- break;
- default:
- strcpy(frp_flags_str, "please report: unknown");
- break;
- }
+ /*
+ * 1: first fragment of vines packet
+ * 2: last fragment of vines packet
+ * 4 ... 80: unused
+ */
+ switch (vines_frp_ctrl) {
+
+ case 0:
+ strcpy(frp_flags_str, "middle");
+ break;
+
+ case 1:
+ strcpy(frp_flags_str, "first");
+ break;
+
+ case 2:
+ strcpy(frp_flags_str, "last");
+ break;
+
+ case 3:
+ strcpy(frp_flags_str, "only");
+ break;
+
+ default:
+ strcpy(frp_flags_str, "please report: unknown");
+ break;
+ }
- if (tree) {
- ti = proto_tree_add_text(tree, NullTVB, offset, 2,
- "Vines Fragmentation Protocol");
- vines_frp_tree = proto_item_add_subtree(ti, ett_vines_frp);
- proto_tree_add_text(vines_frp_tree, NullTVB, offset, 1,
- "Control Flags: 0x%02x = %s fragment",
- vines_frp_ctrl, frp_flags_str);
- proto_tree_add_text(vines_frp_tree, NullTVB, offset + 1, 1,
- "Sequence Number: 0x%02x", vines_frp_seqno);
- }
+ proto_tree_add_text(vines_frp_tree, tvb, 0, 1,
+ "Control Flags: 0x%02x = %s fragment",
+ vines_frp_ctrl, frp_flags_str);
- /* Skip over header */
- offset += 2;
+ proto_tree_add_text(vines_frp_tree, tvb, 1, 1,
+ "Sequence Number: 0x%02x",
+ tvb_get_guint8(tvb, 1));
+ }
- /* Decode the "real" Vines now */
- dissect_vines(pd, offset, fd, tree);
+ /* Decode the "real" Vines now */
+ next_tvb = tvb_new_subset(tvb, 2, -1, -1);
+ dissect_vines(tvb, pinfo, tree);
+}
+
+void
+proto_register_vines_frp(void)
+{
+ static gint *ett[] = {
+ &ett_vines_frp,
+ };
+
+ proto_vines_frp = proto_register_protocol(
+ "Banyan Vines Fragmentation Protocol", "Vines FRP", "vines_frp");
+ proto_register_subtree_array(ett, array_length(ett));
+}
+
+void
+proto_reg_handoff_vines_frp(void)
+{
+ dissector_add("ip.proto", IP_PROTO_VINES, dissect_vines_frp);
+
+ /* XXX: AFAIK, src and dst port must be the same; should
+ the dissector check for that? */
+ dissector_add("udp.port", UDP_PORT_VINES, dissect_vines_frp);
}
gchar *
@@ -146,71 +190,84 @@ vines_addr_to_str(const guint8 *addrp)
}
static void
-dissect_vines(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
- e_vip viph;
- proto_tree *vip_tree;
+dissect_vines(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
+{
+ int offset = 0;
+ e_vip viph;
+ proto_tree *vip_tree;
proto_item *ti;
-/* gchar tos_str[32]; */
+/* gchar tos_str[32]; */
+ guint8 *dst_addr, *src_addr;
int is_broadcast = 0;
int hops = 0;
+ tvbuff_t *next_tvb;
- OLD_CHECK_DISPLAY_AS_DATA(proto_vines, pd, offset, fd, tree);
+ CHECK_DISPLAY_AS_DATA(proto_vines, tvb, pinfo, tree);
+
+ pinfo->current_proto = "Vines";
+
+ if (check_col(pinfo->fd, COL_PROTOCOL))
+ col_set_str(pinfo->fd, COL_PROTOCOL, "Vines");
+ if (check_col(pinfo->fd, COL_INFO))
+ col_clear(pinfo->fd, COL_INFO);
/* To do: check for runts, errs, etc. */
/* Avoids alignment problems on many architectures. */
- memcpy(&viph, &pd[offset], sizeof(e_vip));
-
- viph.vip_chksum = pntohs(&pd[offset]);
- viph.vip_pktlen = pntohs(&pd[offset+2]);
- viph.vip_dnet = pntohl(&pd[offset+6]);
- viph.vip_dsub = pntohs(&pd[offset+10]);
- viph.vip_snet = pntohl(&pd[offset+12]);
- viph.vip_ssub = pntohs(&pd[offset+16]);
-
- switch (viph.vip_proto) {
- case VIP_PROTO_IPC:
- if (check_col(fd, COL_PROTOCOL))
- col_set_str(fd, COL_PROTOCOL, "Vines IPC");
- if (check_col(fd, COL_INFO))
- col_add_fstr(fd, COL_INFO, "IPC (%02x)", viph.vip_proto);
+ tvb_memcpy(tvb, (guint8 *)&viph, offset, sizeof(e_vip));
+
+ viph.vip_chksum = ntohs(viph.vip_chksum);
+ viph.vip_pktlen = ntohs(viph.vip_pktlen);
+ viph.vip_dnet = ntohl(viph.vip_dnet);
+ viph.vip_dsub = ntohs(viph.vip_dsub);
+ viph.vip_snet = ntohl(viph.vip_snet);
+ viph.vip_ssub = ntohs(viph.vip_ssub);
+
+ switch (viph.vip_proto) {
+ case VIP_PROTO_IPC:
+ if (check_col(pinfo->fd, COL_PROTOCOL))
+ col_set_str(pinfo->fd, COL_PROTOCOL, "Vines IPC");
+ if (check_col(pinfo->fd, COL_INFO))
+ col_add_fstr(pinfo->fd, COL_INFO, "IPC (%02x)", viph.vip_proto);
break;
- case VIP_PROTO_SPP:
- if (check_col(fd, COL_PROTOCOL))
- col_set_str(fd, COL_PROTOCOL, "Vines SPP");
- if (check_col(fd, COL_INFO))
- col_add_fstr(fd, COL_INFO, "SPP (%02x)", viph.vip_proto);
+ case VIP_PROTO_SPP:
+ if (check_col(pinfo->fd, COL_PROTOCOL))
+ col_set_str(pinfo->fd, COL_PROTOCOL, "Vines SPP");
+ if (check_col(pinfo->fd, COL_INFO))
+ col_add_fstr(pinfo->fd, COL_INFO, "SPP (%02x)", viph.vip_proto);
break;
case VIP_PROTO_ARP:
- if (check_col(fd, COL_PROTOCOL))
- col_set_str(fd, COL_PROTOCOL, "Vines ARP");
- if (check_col(fd, COL_INFO))
- col_add_fstr(fd, COL_INFO, "ARP (%02x)", viph.vip_proto);
+ if (check_col(pinfo->fd, COL_PROTOCOL))
+ col_set_str(pinfo->fd, COL_PROTOCOL, "Vines ARP");
+ if (check_col(pinfo->fd, COL_INFO))
+ col_add_fstr(pinfo->fd, COL_INFO, "ARP (%02x)", viph.vip_proto);
break;
case VIP_PROTO_RTP:
- if (check_col(fd, COL_PROTOCOL))
- col_set_str(fd, COL_PROTOCOL, "Vines RTP");
- if (check_col(fd, COL_INFO))
- col_add_fstr(fd, COL_INFO, "RTP (%02x)", viph.vip_proto);
+ if (check_col(pinfo->fd, COL_PROTOCOL))
+ col_set_str(pinfo->fd, COL_PROTOCOL, "Vines RTP");
+ if (check_col(pinfo->fd, COL_INFO))
+ col_add_fstr(pinfo->fd, COL_INFO, "RTP (%02x)", viph.vip_proto);
break;
case VIP_PROTO_ICP:
- if (check_col(fd, COL_PROTOCOL))
- col_set_str(fd, COL_PROTOCOL, "Vines ICP");
- if (check_col(fd, COL_INFO))
- col_add_fstr(fd, COL_INFO, "ICP (%02x)", viph.vip_proto);
+ if (check_col(pinfo->fd, COL_PROTOCOL))
+ col_set_str(pinfo->fd, COL_PROTOCOL, "Vines ICP");
+ if (check_col(pinfo->fd, COL_INFO))
+ col_add_fstr(pinfo->fd, COL_INFO, "ICP (%02x)", viph.vip_proto);
break;
default:
- if (check_col(fd, COL_PROTOCOL))
- col_set_str(fd, COL_PROTOCOL, "Vines IP");
- if (check_col(fd, COL_INFO))
- col_add_fstr(fd, COL_INFO, "Unknown VIP protocol (%02x)",
+ if (check_col(pinfo->fd, COL_PROTOCOL))
+ col_set_str(pinfo->fd, COL_PROTOCOL, "Vines IP");
+ if (check_col(pinfo->fd, COL_INFO))
+ col_add_fstr(pinfo->fd, COL_INFO, "Unknown VIP protocol (%02x)",
viph.vip_proto);
}
- SET_ADDRESS(&pi.net_src, AT_VINES, VINES_ADDR_LEN, &pd[offset+12]);
- SET_ADDRESS(&pi.src, AT_VINES, VINES_ADDR_LEN, &pd[offset+12]);
- SET_ADDRESS(&pi.net_dst, AT_VINES, VINES_ADDR_LEN, &pd[offset+6]);
- SET_ADDRESS(&pi.dst, AT_VINES, VINES_ADDR_LEN, &pd[offset+6]);
+ src_addr = tvb_get_ptr(tvb, offset+12, VINES_ADDR_LEN);
+ SET_ADDRESS(&pinfo->net_src, AT_VINES, VINES_ADDR_LEN, src_addr);
+ SET_ADDRESS(&pinfo->src, AT_VINES, VINES_ADDR_LEN, src_addr);
+ dst_addr = tvb_get_ptr(tvb, offset+6, VINES_ADDR_LEN);
+ SET_ADDRESS(&pinfo->net_dst, AT_VINES, VINES_ADDR_LEN,dst_addr);
+ SET_ADDRESS(&pinfo->dst, AT_VINES, VINES_ADDR_LEN, dst_addr);
/* helpers to decode flags */
/* FIXME: Not used yet */
@@ -220,108 +277,146 @@ dissect_vines(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
hops = viph.vip_tctl & 0xf;
/*
- viph.ip_tos = IPTOS_TOS(viph.ip_tos);
- switch (viph.ip_tos) {
- case IPTOS_NONE:
- strcpy(tos_str, "None");
- break;
- case IPTOS_LOWDELAY:
- strcpy(tos_str, "Minimize delay");
- break;
- case IPTOS_THROUGHPUT:
- strcpy(tos_str, "Maximize throughput");
- break;
- case IPTOS_RELIABILITY:
- strcpy(tos_str, "Maximize reliability");
- break;
- case IPTOS_LOWCOST:
- strcpy(tos_str, "Minimize cost");
- break;
- default:
- strcpy(tos_str, "Unknon. Malformed?");
- break;
- }
+ viph.ip_tos = IPTOS_TOS(viph.ip_tos);
+ switch (viph.ip_tos) {
+ case IPTOS_NONE:
+ strcpy(tos_str, "None");
+ break;
+ case IPTOS_LOWDELAY:
+ strcpy(tos_str, "Minimize delay");
+ break;
+ case IPTOS_THROUGHPUT:
+ strcpy(tos_str, "Maximize throughput");
+ break;
+ case IPTOS_RELIABILITY:
+ strcpy(tos_str, "Maximize reliability");
+ break;
+ case IPTOS_LOWCOST:
+ strcpy(tos_str, "Minimize cost");
+ break;
+ default:
+ strcpy(tos_str, "Unknon. Malformed?");
+ break;
+ }
*/
- if (tree) {
- ti = proto_tree_add_protocol_format(tree, proto_vines, NullTVB,
+ if (tree) {
+ ti = proto_tree_add_protocol_format(tree, proto_vines, tvb,
offset, (viph.vip_pktlen),
"Vines IP");
vip_tree = proto_item_add_subtree(ti, ett_vines);
- proto_tree_add_text(vip_tree, NullTVB, offset, 2,
+ proto_tree_add_text(vip_tree, tvb, offset, 2,
"Packet checksum: 0x%04x",
viph.vip_chksum);
- proto_tree_add_text(vip_tree, NullTVB, offset + 2, 2,
+ proto_tree_add_text(vip_tree, tvb, offset + 2, 2,
"Packet length: 0x%04x (%d)",
viph.vip_pktlen, viph.vip_pktlen);
- proto_tree_add_text(vip_tree, NullTVB, offset + 4, 1,
+ proto_tree_add_text(vip_tree, tvb, offset + 4, 1,
"Transport control: 0x%02x",
viph.vip_tctl);
- proto_tree_add_uint(vip_tree, hf_vines_protocol, NullTVB,
+ proto_tree_add_uint(vip_tree, hf_vines_protocol, tvb,
offset + 5, 1,
viph.vip_proto);
- proto_tree_add_text(vip_tree, NullTVB, offset + 6,
+ proto_tree_add_text(vip_tree, tvb, offset + 6,
VINES_ADDR_LEN,
"Destination: %s",
- vines_addr_to_str(&pd[offset + 6]));
- proto_tree_add_text(vip_tree, NullTVB, offset + 12,
+ vines_addr_to_str(dst_addr));
+ proto_tree_add_text(vip_tree, tvb, offset + 12,
VINES_ADDR_LEN,
"Source: %s",
- vines_addr_to_str(&pd[offset + 12]));
+ vines_addr_to_str(src_addr));
}
- offset += 18;
+ offset += 18;
switch (viph.vip_proto) {
- case VIP_PROTO_SPP:
- dissect_vines_spp(pd, offset, fd, tree);
- break;
+ case VIP_PROTO_SPP:
+ next_tvb = tvb_new_subset(tvb, offset, -1, -1);
+ dissect_vines_spp(next_tvb, pinfo, tree);
+ break;
default:
- old_dissect_data(pd, offset, fd, tree);
+ dissect_data(tvb, offset, pinfo, tree);
break;
}
}
-void dissect_vines_spp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
+void
+proto_register_vines(void)
+{
+ static gint *ett[] = {
+ &ett_vines,
+ };
+
+ static hf_register_info hf[] = {
+ { &hf_vines_protocol,
+ { "Protocol", "vines.protocol",
+ FT_UINT8, BASE_HEX, NULL, 0x0,
+ "Vines protocol" }}
+ };
+
+ proto_vines = proto_register_protocol("Banyan Vines", "Vines", "vines");
+ proto_register_field_array(proto_vines, hf, array_length(hf));
+ proto_register_subtree_array(ett, array_length(ett));
+}
+
+void
+proto_reg_handoff_vines(void)
+{
+ dissector_add("ethertype", ETHERTYPE_VINES, dissect_vines);
+ dissector_add("ppp.protocol", PPP_VINES, dissect_vines);
+}
+static void
+dissect_vines_spp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
+{
+ int offset = 0;
e_vspp viph;
- proto_tree *vspp_tree;
+ proto_tree *vspp_tree;
proto_item *ti;
+ CHECK_DISPLAY_AS_DATA(proto_vines_spp, tvb, pinfo, tree);
+
+ pinfo->current_proto = "Vines SPP";
+
+ if (check_col(pinfo->fd, COL_PROTOCOL))
+ col_set_str(pinfo->fd, COL_PROTOCOL, "VSPP");
+ if (check_col(pinfo->fd, COL_INFO))
+ col_clear(pinfo->fd, COL_INFO);
+
/* To do: check for runts, errs, etc. */
/* Avoids alignment problems on many architectures. */
- memcpy(&viph, &pd[offset], sizeof(e_vspp));
+ tvb_memcpy(tvb, (guint8 *)&viph, offset, sizeof(e_vspp));
- viph.vspp_sport = ntohs(viph.vspp_sport);
- viph.vspp_dport = ntohs(viph.vspp_dport);
- viph.vspp_lclid = ntohs(viph.vspp_lclid);
- viph.vspp_rmtid = ntohs(viph.vspp_rmtid);
+ viph.vspp_sport = ntohs(viph.vspp_sport);
+ viph.vspp_dport = ntohs(viph.vspp_dport);
+ viph.vspp_lclid = ntohs(viph.vspp_lclid);
+ viph.vspp_rmtid = ntohs(viph.vspp_rmtid);
switch (viph.vspp_pkttype) {
- case VSPP_PKTTYPE_DATA:
- if (check_col(fd, COL_PROTOCOL))
- col_set_str(fd, COL_PROTOCOL, "VSPP Data");
- break;
- case VSPP_PKTTYPE_DISC:
- if (check_col(fd, COL_PROTOCOL))
- col_set_str(fd, COL_PROTOCOL, "VSPP Disconnect");
- break;
- case VSPP_PKTTYPE_PROBE:
- if (check_col(fd, COL_PROTOCOL))
- col_set_str(fd, COL_PROTOCOL, "VSPP Probe");
- break;
- case VSPP_PKTTYPE_ACK:
- if (check_col(fd, COL_PROTOCOL))
- col_set_str(fd, COL_PROTOCOL, "VSPP Ack");
+ case VSPP_PKTTYPE_DATA:
+ if (check_col(pinfo->fd, COL_PROTOCOL))
+ col_set_str(pinfo->fd, COL_PROTOCOL, "VSPP Data");
+ break;
+ case VSPP_PKTTYPE_DISC:
+ if (check_col(pinfo->fd, COL_PROTOCOL))
+ col_set_str(pinfo->fd, COL_PROTOCOL, "VSPP Disconnect");
+ break;
+ case VSPP_PKTTYPE_PROBE:
+ if (check_col(pinfo->fd, COL_PROTOCOL))
+ col_set_str(pinfo->fd, COL_PROTOCOL, "VSPP Probe");
break;
- default:
- if (check_col(fd, COL_PROTOCOL))
- col_set_str(fd, COL_PROTOCOL, "VSPP Unknown");
- }
+ case VSPP_PKTTYPE_ACK:
+ if (check_col(pinfo->fd, COL_PROTOCOL))
+ col_set_str(pinfo->fd, COL_PROTOCOL, "VSPP Ack");
+ break;
+ default:
+ if (check_col(pinfo->fd, COL_PROTOCOL))
+ col_set_str(pinfo->fd, COL_PROTOCOL, "VSPP Unknown");
+ }
- if (check_col(fd, COL_INFO))
- col_add_fstr(fd, COL_INFO,
+ if (check_col(pinfo->fd, COL_INFO))
+ col_add_fstr(pinfo->fd, COL_INFO,
"NS=%04x NR=%04x Window=%04x RID=%04x LID=%04x D=%04x S=%04x",
viph.vspp_seqno, viph.vspp_ack, viph.vspp_win,
viph.vspp_rmtid, viph.vspp_lclid, viph.vspp_dport,
@@ -330,82 +425,66 @@ void dissect_vines_spp(const u_char *pd, int offset, frame_data *fd, proto_tree
/*
iph.ip_tos = IPTOS_TOS(iph.ip_tos);
switch (iph.ip_tos) {
- case IPTOS_NONE:
- strcpy(tos_str, "None");
- break;
- case IPTOS_LOWDELAY:
- strcpy(tos_str, "Minimize delay");
- break;
- case IPTOS_THROUGHPUT:
- strcpy(tos_str, "Maximize throughput");
- break;
- case IPTOS_RELIABILITY:
- strcpy(tos_str, "Maximize reliability");
- break;
- case IPTOS_LOWCOST:
- strcpy(tos_str, "Minimize cost");
- break;
- default:
- strcpy(tos_str, "Unknon. Malformed?");
- break;
- }
+ case IPTOS_NONE:
+ strcpy(tos_str, "None");
+ break;
+ case IPTOS_LOWDELAY:
+ strcpy(tos_str, "Minimize delay");
+ break;
+ case IPTOS_THROUGHPUT:
+ strcpy(tos_str, "Maximize throughput");
+ break;
+ case IPTOS_RELIABILITY:
+ strcpy(tos_str, "Maximize reliability");
+ break;
+ case IPTOS_LOWCOST:
+ strcpy(tos_str, "Minimize cost");
+ break;
+ default:
+ strcpy(tos_str, "Unknon. Malformed?");
+ break;
+ }
*/
- if (tree) {
- ti = proto_tree_add_text(tree, NullTVB, offset, sizeof(viph), "Vines SPP");
+ if (tree) {
+ ti = proto_tree_add_item(tree, proto_vines_spp, tvb, offset,
+ sizeof(viph), FALSE);
vspp_tree = proto_item_add_subtree(ti, ett_vines_spp);
- proto_tree_add_text(vspp_tree, NullTVB, offset, 2,
+ proto_tree_add_text(vspp_tree, tvb, offset, 2,
"Source port: 0x%04x", viph.vspp_sport);
- proto_tree_add_text(vspp_tree, NullTVB, offset+2, 2,
+ proto_tree_add_text(vspp_tree, tvb, offset + 2, 2,
"Destination port: 0x%04x",
viph.vspp_dport);
- proto_tree_add_text(vspp_tree, NullTVB, offset+4, 1,
+ proto_tree_add_text(vspp_tree, tvb, offset + 4, 1,
"Packet type: 0x%02x", viph.vspp_pkttype);
- proto_tree_add_text(vspp_tree, NullTVB, offset+5, 1,
+ proto_tree_add_text(vspp_tree, tvb, offset + 5, 1,
"Control: 0x%02x", viph.vspp_control);
- proto_tree_add_text(vspp_tree, NullTVB, offset+6, 2,
+ proto_tree_add_text(vspp_tree, tvb, offset + 6, 2,
"Local Connection ID: 0x%04x",
viph.vspp_lclid);
- proto_tree_add_text(vspp_tree, NullTVB, offset+8, 2,
+ proto_tree_add_text(vspp_tree, tvb, offset + 8, 2,
"Remote Connection ID: 0x%04x",
viph.vspp_rmtid);
- proto_tree_add_text(vspp_tree, NullTVB, offset+10, 2,
+ proto_tree_add_text(vspp_tree, tvb, offset + 10, 2,
"Sequence number: 0x%04x",
viph.vspp_seqno);
- proto_tree_add_text(vspp_tree, NullTVB, offset+12, 2,
+ proto_tree_add_text(vspp_tree, tvb, offset + 12, 2,
"Ack number: 0x%04x", viph.vspp_ack);
- proto_tree_add_text(vspp_tree, NullTVB, offset+14, 2,
+ proto_tree_add_text(vspp_tree, tvb, offset + 14, 2,
"Window: 0x%04x", viph.vspp_win);
}
offset += 16; /* sizeof SPP */
- old_dissect_data(pd, offset, fd, tree);
+ dissect_data(tvb, offset, pinfo, tree);
}
void
-proto_register_vines(void)
+proto_register_vines_spp(void)
{
static gint *ett[] = {
- &ett_vines,
- &ett_vines_frp,
&ett_vines_spp,
};
- static hf_register_info hf[] = {
- { &hf_vines_protocol,
- { "Protocol", "vines.protocol",
- FT_UINT8, BASE_HEX, NULL, 0x0,
- "Vines protocol" }}
- };
-
- proto_vines = proto_register_protocol("Banyan Vines", "Vines", "vines");
- proto_register_field_array(proto_vines, hf, array_length(hf));
+ proto_vines_spp = proto_register_protocol("Banyan Vines SPP",
+ "Vines SPP", "vines_spp");
proto_register_subtree_array(ett, array_length(ett));
}
-
-void
-proto_reg_handoff_vines(void)
-{
- old_dissector_add("ethertype", ETHERTYPE_VINES, dissect_vines);
- old_dissector_add("ppp.protocol", PPP_VINES, dissect_vines);
- old_dissector_add("ip.proto", IP_PROTO_VINES, dissect_vines_frp);
-}
diff --git a/packet-vines.h b/packet-vines.h
index 504cbac4b9..c4236b2747 100644
--- a/packet-vines.h
+++ b/packet-vines.h
@@ -1,7 +1,7 @@
/* packet-vines.h
* Definitions for packet disassembly structures and routines
*
- * $Id: packet-vines.h,v 1.6 2000/08/25 18:46:11 deniel Exp $
+ * $Id: packet-vines.h,v 1.7 2001/01/06 08:44:03 guy Exp $
*
* Don Lafontaine <lafont02@cn.ca>
*
@@ -108,7 +108,6 @@ typedef struct _e_vsmb {
} e_vsmb;
void capture_vines(const u_char *, int, packet_counts *);
-void dissect_vines_frp(const u_char *, int, frame_data *, proto_tree *);
/*
* Routine to take a Vines address and generate a string.