*
* Richard Sharpe <rsharpe@ns.aus.com>
*
- * $Id: packet-tftp.c,v 1.3 1999/05/13 05:46:04 guy Exp $
+ * $Id: packet-tftp.c,v 1.7 1999/11/16 11:43:00 guy Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@unicom.net>
#include <glib.h>
#include "packet.h"
+static int proto_tftp = -1;
+static int hf_tftp_type = -1;
+static int hf_tftp_error_code = -1;
+
+static gint ett_tftp = -1;
+
#define RRQ 1
#define WRQ 2
#define DATA 3
if (tree) {
- ti = proto_tree_add_item(tree, offset, END_OF_FRAME,
- "Trivial File Transfer Protocol");
- tftp_tree = proto_tree_new();
- proto_item_add_subtree(ti, tftp_tree, ETT_TFTP);
+ ti = proto_tree_add_item(tree, proto_tftp, offset, END_OF_FRAME, NULL);
+ tftp_tree = proto_item_add_subtree(ti, ett_tftp);
- switch (i1 = pntohs(pd+offset)) {
+ i1 = pntohs(pd+offset);
+ proto_tree_add_item_hidden(tftp_tree, hf_tftp_type, offset, 2, i1);
+
+ switch (i1) {
case RRQ:
- proto_tree_add_item(tftp_tree, offset, 2, "Read Request");
+ proto_tree_add_text(tftp_tree, offset, 2, "Read Request");
offset += 2;
i1 = strlen(pd+offset);
- proto_tree_add_item(tftp_tree, offset, i1+1, "Source File: %s", pd+offset);
+ proto_tree_add_text(tftp_tree, offset, i1+1, "Source File: %s", pd+offset);
offset += i1 + 1;
- proto_tree_add_item(tftp_tree, offset, END_OF_FRAME, "Type: %s",pd+offset);
+ proto_tree_add_text(tftp_tree, offset, END_OF_FRAME, "Type: %s",pd+offset);
break;
case WRQ:
- proto_tree_add_item(tftp_tree, offset, 2, "Write Request");
+ proto_tree_add_text(tftp_tree, offset, 2, "Write Request");
offset += 2;
i1 = strlen(pd+offset);
- proto_tree_add_item(tftp_tree, offset, i1+1, "Destination File: %s", pd+offset);
+ proto_tree_add_text(tftp_tree, offset, i1+1, "Destination File: %s", pd+offset);
offset += i1 + 1;
- proto_tree_add_item(tftp_tree, offset+2, END_OF_FRAME, "Type: %s",pd+offset);
+ proto_tree_add_text(tftp_tree, offset+2, END_OF_FRAME, "Type: %s",pd+offset);
break;
case DATA:
- proto_tree_add_item(tftp_tree, offset, 2, "Data Packet");
+ proto_tree_add_text(tftp_tree, offset, 2, "Data Packet");
offset += 2;
i1 = pntohs(pd+offset);
- proto_tree_add_item(tftp_tree, offset, 2, "Block = %u", i1);
+ proto_tree_add_text(tftp_tree, offset, 2, "Block = %u", i1);
offset += 2;
- proto_tree_add_item(tftp_tree, offset, END_OF_FRAME,
+ proto_tree_add_text(tftp_tree, offset, END_OF_FRAME,
"Data (%d bytes)", END_OF_FRAME);
break;
case ACK:
- proto_tree_add_item(tftp_tree, offset, 2, "Acknowledgement");
+ proto_tree_add_text(tftp_tree, offset, 2, "Acknowledgement");
offset += 2;
i1 = pntohs(pd+offset);
- proto_tree_add_item(tftp_tree, offset, END_OF_FRAME, "Block = %u", i1);
+ proto_tree_add_text(tftp_tree, offset, END_OF_FRAME, "Block = %u", i1);
break;
case ERROR:
- proto_tree_add_item(tftp_tree, offset, 2, "Error Code");
+ proto_tree_add_text(tftp_tree, offset, 2, "Error Code");
offset += 2;
i1 = pntohs(pd+offset);
- proto_tree_add_item(tftp_tree, offset, 2, "Code = %s", tftp_errors[i1 % 8]);
+ proto_tree_add_item_hidden(tftp_tree, hf_tftp_error_code, offset, 2, i1);
+ proto_tree_add_text(tftp_tree, offset, 2, "Code = %s", tftp_errors[i1 % 8]);
offset += 2;
- proto_tree_add_item(tftp_tree, offset, END_OF_FRAME, "Error Message: %s", pd + offset);
+ proto_tree_add_text(tftp_tree, offset, END_OF_FRAME, "Error Message: %s", pd + offset);
break;
default:
- proto_tree_add_item(tftp_tree, offset, 2, "Unknown TFTP Request: %0X.", i1);
+ proto_tree_add_text(tftp_tree, offset, 2, "Unknown TFTP Request: %0X.", i1);
offset += 2;
- proto_tree_add_item(tftp_tree, offset, END_OF_FRAME,
+ proto_tree_add_text(tftp_tree, offset, END_OF_FRAME,
"Data (%d bytes)", END_OF_FRAME);
break;
}
}
}
+
+void
+proto_register_tftp(void)
+{
+
+ static hf_register_info hf[] = {
+ { &hf_tftp_type,
+ { "Type", "tftp.type",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "TFTP message type" }},
+
+ { &hf_tftp_error_code,
+ { "Error code", "tftp.error.code",
+ FT_UINT16, BASE_DEC, NULL, 0x0,
+ "Error code in case of TFTP error message" }}
+ };
+ static gint *ett[] = {
+ &ett_tftp,
+ };
+
+ proto_tftp = proto_register_protocol("Trivial File Transfer Protocol", "tftp");
+ proto_register_field_array(proto_tftp, hf, array_length(hf));
+ proto_register_subtree_array(ett, array_length(ett));
+}