aboutsummaryrefslogtreecommitdiffstats
path: root/packet-atalk.c
diff options
context:
space:
mode:
authorLaurent Deniel <laurent.deniel@free.fr>1999-10-07 17:11:11 +0000
committerLaurent Deniel <laurent.deniel@free.fr>1999-10-07 17:11:11 +0000
commit728ec33cb9ae4f76c54760911054966c7b873eff (patch)
tree3f572b433901fc493f706168ced0a30fdbaf4015 /packet-atalk.c
parentc6e161e7dfffd713684e24162a9687090b7e2095 (diff)
- add display filters
- check for truncated header svn path=/trunk/; revision=782
Diffstat (limited to 'packet-atalk.c')
-rw-r--r--packet-atalk.c74
1 files changed, 55 insertions, 19 deletions
diff --git a/packet-atalk.c b/packet-atalk.c
index 3e6a16e9c8..c8b83c8f72 100644
--- a/packet-atalk.c
+++ b/packet-atalk.c
@@ -1,7 +1,7 @@
/* packet-ddp.c
* Routines for DDP packet disassembly.
*
- * $Id: packet-atalk.c,v 1.13 1999/09/23 05:22:12 guy Exp $
+ * $Id: packet-atalk.c,v 1.14 1999/10/07 17:11:11 deniel Exp $
*
* Simon Wilkinson <sxw@dcs.ed.ac.uk>
*
@@ -37,6 +37,16 @@
#endif
static int proto_ddp = -1;
+static int hf_ddp_hopcount = -1;
+static int hf_ddp_len = -1;
+static int hf_ddp_checksum = -1;
+static int hf_ddp_dst_net = -1;
+static int hf_ddp_src_net = -1;
+static int hf_ddp_dst_node = -1;
+static int hf_ddp_src_node = -1;
+static int hf_ddp_dst_socket = -1;
+static int hf_ddp_src_socket = -1;
+static int hf_ddp_type = -1;
/* P = Padding, H = Hops, L = Len */
#if BYTE_ORDER == BIG_ENDIAN
@@ -63,6 +73,7 @@ typedef struct _e_ddp {
#define DDP_RTMPREQ 0x05
#define DDP_ZIP 0x06
#define DDP_ADSP 0x07
+#define DDP_HEADER_SIZE 13
void
dissect_ddp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
@@ -78,6 +89,11 @@ dissect_ddp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
{DDP_ADSP, "AppleTalk Data Stream Protocol"},
{0, NULL} };
+ if (!BYTES_ARE_IN_FRAME(offset, DDP_HEADER_SIZE)) {
+ dissect_data(pd, offset, fd, tree);
+ return;
+ }
+
memcpy(&ddp, &pd[offset], sizeof(e_ddp));
ddp.dnet=ntohs(ddp.dnet);
ddp.snet=ntohs(ddp.snet);
@@ -94,32 +110,52 @@ dissect_ddp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) {
val_to_str(ddp.type, op_vals, "Unknown DDP protocol (%02x)"));
if (tree) {
- ti = proto_tree_add_item(tree, proto_ddp, offset, 13, NULL);
+ ti = proto_tree_add_item(tree, proto_ddp, offset, DDP_HEADER_SIZE, NULL);
ddp_tree = proto_item_add_subtree(ti, ETT_IP);
- proto_tree_add_text(ddp_tree, offset, 1, "Hop count: %d", ddp_hops(ddp.hops_len));
- proto_tree_add_text(ddp_tree, offset, 2, "Datagram length: %d", ddp_len(ddp.hops_len));
- proto_tree_add_text(ddp_tree, offset + 2, 2, "Checksum: %d",ddp.sum);
- proto_tree_add_text(ddp_tree, offset + 4, 2, "Destination Net: %d",ddp.dnet);
- proto_tree_add_text(ddp_tree, offset + 6, 2, "Source Net: %d",ddp.snet);
- proto_tree_add_text(ddp_tree, offset + 8, 1, "Destination Node: %d",ddp.dnode);
- proto_tree_add_text(ddp_tree, offset + 9, 1, "Source Node: %d",ddp.snode);
- proto_tree_add_text(ddp_tree, offset + 10, 1, "Destination Socket: %d",ddp.dport);
- proto_tree_add_text(ddp_tree, offset + 11, 1, "Source Socket: %d",ddp.sport);
- proto_tree_add_text(ddp_tree, offset + 12, 1, "Type: %d",ddp.type);
+ proto_tree_add_item(ddp_tree, hf_ddp_hopcount, offset, 1,
+ ddp_hops(ddp.hops_len));
+ proto_tree_add_item(ddp_tree, hf_ddp_len, offset, 2,
+ ddp_len(ddp.hops_len));
+ proto_tree_add_item(ddp_tree, hf_ddp_checksum, offset + 2, 2, ddp.sum);
+ proto_tree_add_item(ddp_tree, hf_ddp_dst_net, offset + 4, 2, ddp.dnet);
+ proto_tree_add_item(ddp_tree, hf_ddp_src_net, offset + 6, 2, ddp.snet);
+ proto_tree_add_item(ddp_tree, hf_ddp_dst_node, offset + 8, 1, ddp.dnode);
+ proto_tree_add_item(ddp_tree, hf_ddp_src_node, offset + 9, 1, ddp.snode);
+ proto_tree_add_item(ddp_tree, hf_ddp_dst_socket, offset + 10, 1, ddp.dport);
+ proto_tree_add_item(ddp_tree, hf_ddp_src_socket, offset + 11, 1, ddp.sport);
+ proto_tree_add_item(ddp_tree, hf_ddp_type, offset + 12, 1, ddp.type);
}
- offset += 13;
+ offset += DDP_HEADER_SIZE;
}
void
proto_register_atalk(void)
{
-/* static hf_register_info hf[] = {
- { &variable,
- { "Name", "ddp.abbreviation", TYPE, VALS_POINTER }},
- };*/
+ static hf_register_info hf[] = {
+ { &hf_ddp_hopcount,
+ { "Hop count", "ddp.hopcount", FT_UINT8, NULL }},
+ { &hf_ddp_len,
+ { "Datagram length", "ddp.len", FT_UINT16, NULL }},
+ { &hf_ddp_checksum,
+ { "Checksum", "ddp.checksum", FT_UINT16, NULL }},
+ { &hf_ddp_dst_net,
+ { "Destination Net", "ddp.dst.net", FT_UINT16, NULL }},
+ { &hf_ddp_src_net,
+ { "Source Net", "ddp.src.net", FT_UINT16, NULL }},
+ { &hf_ddp_dst_node,
+ { "Destination Node", "ddp.dst.node", FT_UINT8, NULL }},
+ { &hf_ddp_src_node,
+ { "Source Node", "ddp.src.node", FT_UINT8, NULL }},
+ { &hf_ddp_dst_socket,
+ { "Destination Socket", "ddp.dst.socket", FT_UINT8, NULL }},
+ { &hf_ddp_src_socket,
+ { "Source Socket", "ddp.src.socket", FT_UINT8, NULL }},
+ { &hf_ddp_type,
+ { "Protocol type", "ddp.type", FT_UINT8, NULL }}
+ };
- proto_ddp = proto_register_protocol("Datagram Delivery Protocol", "ddp");
- /* proto_register_field_array(proto_ddp, hf, array_length(hf));*/
+ proto_ddp = proto_register_protocol("Datagram Delivery Protocol", "ddp");
+ proto_register_field_array(proto_ddp, hf, array_length(hf));
}