diff options
-rw-r--r-- | packet-udp.c | 15 | ||||
-rw-r--r-- | packet-vines.c | 513 | ||||
-rw-r--r-- | packet-vines.h | 3 |
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. |