diff options
author | Guy Harris <guy@alum.mit.edu> | 2000-01-27 07:09:45 +0000 |
---|---|---|
committer | Guy Harris <guy@alum.mit.edu> | 2000-01-27 07:09:45 +0000 |
commit | 4410e4274cfd9f14f0fb852429bb402c61e0c226 (patch) | |
tree | 6fed42517d381263243d5ecb311339e4ba874955 /packet-tftp.c | |
parent | ba520e3c93a706c717ccd4f3a0da663ca86999de (diff) |
TFTP Option Extension (RFC 2347) support, from Craig Newell.
svn path=/trunk/; revision=1573
Diffstat (limited to 'packet-tftp.c')
-rw-r--r-- | packet-tftp.c | 48 |
1 files changed, 43 insertions, 5 deletions
diff --git a/packet-tftp.c b/packet-tftp.c index a5ba1faf8c..02ac06d4c9 100644 --- a/packet-tftp.c +++ b/packet-tftp.c @@ -2,8 +2,10 @@ * Routines for tftp packet dissection * * Richard Sharpe <rsharpe@ns.aus.com> + * Craig Newell <CraigN@cheque.uq.edu.au> + * RFC2347 TFTP Option Extension * - * $Id: packet-tftp.c,v 1.8 2000/01/07 22:05:41 guy Exp $ + * $Id: packet-tftp.c,v 1.9 2000/01/27 07:09:15 guy Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@zing.org> @@ -52,6 +54,7 @@ static gint ett_tftp = -1; #define DATA 3 #define ACK 4 #define ERROR 5 +#define OACK 6 char *tftp_opcodes[8] = { "Unknown Request", @@ -60,7 +63,7 @@ char *tftp_opcodes[8] = { "Data Packet", "Acknowledgement", "Error Code", - "Unknown Request", + "Option Acknowledgement", "Unknown Request" }; @@ -88,7 +91,7 @@ dissect_tftp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) if (check_col(fd, COL_INFO)) { i1 = pntohs(&pd[offset]); - col_add_fstr(fd, COL_INFO, "TFTP %s", i1 <= ERROR ? tftp_opcodes[i1 % 8] : "Unknown Request"); + col_add_fstr(fd, COL_INFO, "TFTP %s", i1 <= OACK ? tftp_opcodes[i1 % 8] : "Unknown Request"); } @@ -107,7 +110,17 @@ dissect_tftp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) i1 = strlen(pd+offset); proto_tree_add_text(tftp_tree, offset, i1+1, "Source File: %s", pd+offset); offset += i1 + 1; - proto_tree_add_text(tftp_tree, offset, END_OF_FRAME, "Type: %s",pd+offset); + i1 = strlen(pd+offset); + proto_tree_add_text(tftp_tree, offset, i1+1, "Type: %s",pd+offset); + offset += i1 + 1; + while (offset < pi.captured_len) { + int i2; + i1 = strlen(pd+offset); /* length of option */ + i2 = strlen(pd+offset+i1+1); /* length of value */ + proto_tree_add_text(tftp_tree, offset, i1+i2+2, "Option: %s = %s", + pd+offset, pd+offset+i1+1); + offset += i1 + i2 + 2; + } break; case WRQ: proto_tree_add_text(tftp_tree, offset, 2, "Write Request"); @@ -115,7 +128,17 @@ dissect_tftp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) i1 = strlen(pd+offset); proto_tree_add_text(tftp_tree, offset, i1+1, "Destination File: %s", pd+offset); offset += i1 + 1; - proto_tree_add_text(tftp_tree, offset+2, END_OF_FRAME, "Type: %s",pd+offset); + i1 = strlen(pd+offset); + proto_tree_add_text(tftp_tree, offset, i1+1, "Type: %s",pd+offset); + offset += i1 + 1; + while (offset < pi.captured_len) { + int i2; + i1 = strlen(pd+offset); /* length of option */ + i2 = strlen(pd+offset+i1+1); /* length of value */ + proto_tree_add_text(tftp_tree, offset, i1+i2+2, "Option: %s = %s", + pd+offset, pd+offset+i1+1); + offset += i1 + i2 + 2; + } break; case DATA: proto_tree_add_text(tftp_tree, offset, 2, "Data Packet"); @@ -141,6 +164,21 @@ dissect_tftp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree) offset += 2; proto_tree_add_text(tftp_tree, offset, END_OF_FRAME, "Error Message: %s", pd + offset); break; + case OACK: + proto_tree_add_text(tftp_tree, offset, 2, "Option Acknowledgement"); + offset += 2; + i1 = pntohs(pd+offset); + proto_tree_add_text(tftp_tree, offset, 2, "Block = %u", i1); + offset += 2; + while (offset < pi.captured_len) { + int i2; + i1 = strlen(pd+offset); /* length of option */ + i2 = strlen(pd+offset+i1+1); /* length of value */ + proto_tree_add_text(tftp_tree, offset, i1+i2+2, "Option: %s = %s", + pd+offset, pd+offset+i1+1); + offset += i1 + i2 + 2; + } + break; default: proto_tree_add_text(tftp_tree, offset, 2, "Unknown TFTP Request: %0X.", i1); offset += 2; |