2000-04-13 21:03:56 +00:00
|
|
|
/* packet-ddtp.c
|
|
|
|
* Routines for DDTP (Dynamic DNS Tools Protocol) packet disassembly
|
|
|
|
* see http://ddt.sourceforge.net/
|
2000-05-28 17:04:47 +00:00
|
|
|
* Olivier Abad <oabad@cybercable.fr>
|
2000-04-13 21:03:56 +00:00
|
|
|
*
|
Convert IPX-and-friend dissectors in packet-ipx.c to use
tvbuffs.
In doing so, I realied that my recommendation for using
tvb_new_subset(pi.compat_top_tvb, -1, -1) was incorrect, because
some dissectors (ethernet!) change pi.len and pi.cap_len. So, I have
to take those two variables into account instead of using -1 and -1.
So, I provide a macro called tvb_create_from_top(offset), where
offset is the name of your offset variable. It is a wrapper around
tvb_new_subset().
I converted the lines that followed my suggestion to use
tvb_create_from_top().
In proto.c I added
proto_tree_add_debug_text(proto_tree*, const char*, ...)
It's much like proto_tree_add_text(), except that it takes no offset
or length; it's soley for temporarily putting debug text into the
proto_tree while debugging a dissector. In making sure that its
use is temporary, the funciton also prints the debug string to stdout
to remind the programmer that the debug code needs to be removed
before shipping the code.
svn path=/trunk/; revision=2068
2000-06-15 03:49:00 +00:00
|
|
|
* $Id: packet-ddtp.c,v 1.8 2000/06/15 03:48:40 gram Exp $
|
2000-04-13 21:03:56 +00:00
|
|
|
*
|
|
|
|
* Ethereal - Network traffic analyzer
|
|
|
|
* By Gerald Combs <gerald@zing.org>
|
|
|
|
* Copyright 2000
|
|
|
|
*
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
#include "config.h"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#ifdef HAVE_SYS_TYPES_H
|
|
|
|
#include <sys/types.h>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/*#include <string.h>
|
|
|
|
#include <ctype.h>
|
|
|
|
#include <time.h>*/
|
|
|
|
|
|
|
|
#include <glib.h>
|
|
|
|
#ifdef HAVE_NETINET_IN_H
|
|
|
|
# include <netinet/in.h>
|
|
|
|
#endif
|
|
|
|
#include "packet.h"
|
|
|
|
#include "dfilter.h"
|
|
|
|
#include "packet-ddtp.h"
|
|
|
|
|
|
|
|
static int proto_ddtp = -1;
|
|
|
|
static int hf_ddtp_version = -1;
|
|
|
|
static int hf_ddtp_encrypt = -1;
|
|
|
|
static int hf_ddtp_hostid = -1;
|
|
|
|
static int hf_ddtp_msgtype = -1;
|
|
|
|
static int hf_ddtp_opcode = -1;
|
|
|
|
static int hf_ddtp_ipaddr = -1;
|
|
|
|
static int hf_ddtp_status = -1;
|
|
|
|
|
|
|
|
static int ett_ddtp = -1;
|
|
|
|
|
2000-06-10 18:08:17 +00:00
|
|
|
#define UDP_PORT_DDTP 1052
|
2000-04-13 21:03:56 +00:00
|
|
|
|
|
|
|
static const value_string vals_ddtp_version[] = {
|
|
|
|
{ DDTP_VERSION_ERROR, "Protocol Error" },
|
|
|
|
{ DDTP_VERSION_4, "4" },
|
|
|
|
{ DDTP_VERSION_5, "5" },
|
|
|
|
{ 0, NULL}
|
|
|
|
};
|
|
|
|
|
|
|
|
static const value_string vals_ddtp_encrypt[] = {
|
|
|
|
{ DDTP_ENCRYPT_ERROR, "Encryption Error" },
|
|
|
|
{ DDTP_ENCRYPT_PLAINTEXT, "Plain text" },
|
|
|
|
{ DDTP_ENCRYPT_BLOWFISH, "Blowfish" },
|
|
|
|
{ 0, NULL}
|
|
|
|
};
|
|
|
|
|
|
|
|
static const value_string vals_ddtp_msgtype[] = {
|
|
|
|
{ DDTP_MESSAGE_ERROR, "Message Error" },
|
|
|
|
{ DDTP_UPDATE_QUERY, "Update Query" },
|
|
|
|
{ DDTP_UPDATE_REPLY, "Update Reply" },
|
|
|
|
{ DDTP_ALIVE_QUERY, "Alive Query" },
|
|
|
|
{ DDTP_ALIVE_REPLY, "Alive Reply" },
|
|
|
|
{ 0, NULL}
|
|
|
|
};
|
|
|
|
|
|
|
|
static const value_string vals_ddtp_opcode[] = {
|
|
|
|
{ DDTP_MARK_ONLINE, "Mark online" },
|
|
|
|
{ DDTP_MARK_OFFLINE, "Mark offline" },
|
|
|
|
{ 0, NULL}
|
|
|
|
};
|
|
|
|
|
|
|
|
static const value_string vals_ddtp_status[] = {
|
|
|
|
{ DDTP_UPDATE_SUCCEEDED, "Update succeeded" },
|
|
|
|
{ DDTP_UPDATE_FAILED, "Update failed" },
|
|
|
|
{ DDTP_INVALID_PASSWORD, "Invalid password" },
|
|
|
|
{ DDTP_INVALID_ACCOUNT, "Invalid account" },
|
|
|
|
{ DDTP_INVALID_OPCODE, "Invalid opcode" },
|
|
|
|
{ 0, NULL}
|
|
|
|
};
|
|
|
|
|
2000-06-12 10:01:54 +00:00
|
|
|
#if 0
|
|
|
|
static void
|
|
|
|
dissect_ddtp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
|
|
|
{
|
|
|
|
proto_tree *ddtp_tree;
|
|
|
|
proto_item *ti;
|
|
|
|
#else
|
2000-04-13 21:03:56 +00:00
|
|
|
static void
|
|
|
|
dissect_ddtp(const u_char *pd, int offset, frame_data *fd, proto_tree *tree)
|
|
|
|
{
|
2000-06-12 10:01:54 +00:00
|
|
|
proto_tree *ddtp_tree;
|
|
|
|
proto_item *ti;
|
|
|
|
packet_info *pinfo = π
|
Convert IPX-and-friend dissectors in packet-ipx.c to use
tvbuffs.
In doing so, I realied that my recommendation for using
tvb_new_subset(pi.compat_top_tvb, -1, -1) was incorrect, because
some dissectors (ethernet!) change pi.len and pi.cap_len. So, I have
to take those two variables into account instead of using -1 and -1.
So, I provide a macro called tvb_create_from_top(offset), where
offset is the name of your offset variable. It is a wrapper around
tvb_new_subset().
I converted the lines that followed my suggestion to use
tvb_create_from_top().
In proto.c I added
proto_tree_add_debug_text(proto_tree*, const char*, ...)
It's much like proto_tree_add_text(), except that it takes no offset
or length; it's soley for temporarily putting debug text into the
proto_tree while debugging a dissector. In making sure that its
use is temporary, the funciton also prints the debug string to stdout
to remind the programmer that the debug code needs to be removed
before shipping the code.
svn path=/trunk/; revision=2068
2000-06-15 03:49:00 +00:00
|
|
|
tvbuff_t *tvb = tvb_create_from_top(offset);
|
2000-06-12 10:01:54 +00:00
|
|
|
#endif
|
2000-04-13 21:03:56 +00:00
|
|
|
|
2000-06-12 10:01:54 +00:00
|
|
|
pinfo->current_proto = "DDTP";
|
|
|
|
if (check_col(pinfo->fd, COL_PROTOCOL)) {
|
2000-04-13 21:03:56 +00:00
|
|
|
/* Indicate what kind of message this is. */
|
2000-06-12 10:01:54 +00:00
|
|
|
col_add_str (pinfo->fd, COL_PROTOCOL, "DDTP");
|
2000-04-13 21:03:56 +00:00
|
|
|
}
|
|
|
|
if (tree) {
|
2000-06-12 10:01:54 +00:00
|
|
|
ti = proto_tree_add_item(tree, proto_ddtp, tvb, 0,
|
2000-05-31 05:09:07 +00:00
|
|
|
END_OF_FRAME - offset, FALSE);
|
2000-04-13 21:03:56 +00:00
|
|
|
ddtp_tree = proto_item_add_subtree(ti, ett_ddtp);
|
|
|
|
|
|
|
|
if (!BYTES_ARE_IN_FRAME(offset, 4)) {
|
2000-06-12 10:01:54 +00:00
|
|
|
proto_tree_add_text(ddtp_tree, NullTVB, offset, tvb_length(tvb),
|
|
|
|
"Frame too short");
|
2000-04-13 21:03:56 +00:00
|
|
|
return;
|
|
|
|
}
|
2000-06-12 10:01:54 +00:00
|
|
|
proto_tree_add_item(ddtp_tree, hf_ddtp_version, tvb, 0, 4, FALSE);
|
|
|
|
proto_tree_add_item(ddtp_tree, hf_ddtp_encrypt, tvb, 4, 4, FALSE);
|
|
|
|
proto_tree_add_item(ddtp_tree, hf_ddtp_hostid, tvb, 8, 4, FALSE);
|
|
|
|
if (tvb_get_ntohl(tvb, 4) == DDTP_ENCRYPT_PLAINTEXT) {
|
|
|
|
proto_tree_add_item(ddtp_tree, hf_ddtp_msgtype, tvb, 12, 4, FALSE);
|
|
|
|
switch (tvb_get_ntohl(tvb, 12)) {
|
2000-04-13 21:03:56 +00:00
|
|
|
case DDTP_MESSAGE_ERROR :
|
2000-06-12 10:01:54 +00:00
|
|
|
if (check_col(pinfo->fd, COL_INFO))
|
|
|
|
col_add_str (pinfo->fd, COL_INFO, "Message Error");
|
2000-04-13 21:03:56 +00:00
|
|
|
break;
|
|
|
|
case DDTP_UPDATE_QUERY :
|
2000-06-12 10:01:54 +00:00
|
|
|
if (check_col(pinfo->fd, COL_INFO))
|
|
|
|
col_add_str (pinfo->fd, COL_INFO, "Update Query");
|
|
|
|
proto_tree_add_item(ddtp_tree, hf_ddtp_opcode, tvb, 16, 4,
|
|
|
|
FALSE);
|
|
|
|
proto_tree_add_item(ddtp_tree, hf_ddtp_ipaddr, tvb, 20, 4,
|
|
|
|
FALSE);
|
2000-04-13 21:03:56 +00:00
|
|
|
break;
|
|
|
|
case DDTP_UPDATE_REPLY :
|
2000-06-12 10:01:54 +00:00
|
|
|
if (check_col(pinfo->fd, COL_INFO))
|
|
|
|
col_add_str (pinfo->fd, COL_INFO, "Update Reply");
|
|
|
|
proto_tree_add_item(ddtp_tree, hf_ddtp_status, tvb, 16, 4,
|
|
|
|
FALSE);
|
2000-04-13 21:03:56 +00:00
|
|
|
break;
|
|
|
|
case DDTP_ALIVE_QUERY :
|
2000-06-12 10:01:54 +00:00
|
|
|
if (check_col(pinfo->fd, COL_INFO))
|
|
|
|
col_add_str (pinfo->fd, COL_INFO, "Alive Query");
|
|
|
|
proto_tree_add_text(ddtp_tree, tvb, 16, 4, "Dummy : %u",
|
|
|
|
tvb_get_ntohl(tvb, 16));
|
2000-04-13 21:03:56 +00:00
|
|
|
break;
|
|
|
|
case DDTP_ALIVE_REPLY :
|
2000-06-12 10:01:54 +00:00
|
|
|
if (check_col(pinfo->fd, COL_INFO))
|
|
|
|
col_add_str (pinfo->fd, COL_INFO, "Alive Reply");
|
|
|
|
proto_tree_add_text(ddtp_tree, tvb, 16, 4, "Dummy : %u",
|
|
|
|
tvb_get_ntohl(tvb, 16));
|
2000-04-13 21:03:56 +00:00
|
|
|
break;
|
|
|
|
default :
|
2000-06-12 10:01:54 +00:00
|
|
|
if (check_col(pinfo->fd, COL_INFO))
|
|
|
|
col_add_str (pinfo->fd, COL_INFO, "Unknwon type");
|
|
|
|
proto_tree_add_text(ddtp_tree, tvb, 12, 4, "Unknown type : %u",
|
|
|
|
tvb_get_ntohl(tvb, 12));
|
2000-04-13 21:03:56 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
proto_register_ddtp(void)
|
|
|
|
{
|
|
|
|
static hf_register_info hf_ddtp[] = {
|
|
|
|
{ &hf_ddtp_version,
|
|
|
|
{ "Version", "ddtp.version", FT_UINT32, BASE_DEC, VALS(vals_ddtp_version), 0x0,
|
|
|
|
"Version" } },
|
|
|
|
{ &hf_ddtp_encrypt,
|
|
|
|
{ "Encryption", "ddtp.encrypt", FT_UINT32, BASE_DEC, VALS(vals_ddtp_encrypt), 0x0,
|
|
|
|
"Encryption type" } },
|
|
|
|
{ &hf_ddtp_hostid,
|
|
|
|
{ "Hostid", "ddtp.hostid", FT_UINT32, BASE_DEC, NULL, 0x0,
|
|
|
|
"Host ID" } },
|
|
|
|
{ &hf_ddtp_msgtype,
|
|
|
|
{ "Message type", "ddtp.msgtype", FT_UINT32, BASE_DEC, VALS(vals_ddtp_msgtype), 0x0,
|
|
|
|
"Message Type" } },
|
|
|
|
{ &hf_ddtp_opcode,
|
|
|
|
{ "Opcode", "ddtp.opcode", FT_UINT32, BASE_DEC, VALS(vals_ddtp_opcode), 0x0,
|
|
|
|
"Update query opcode" } },
|
|
|
|
{ &hf_ddtp_ipaddr,
|
|
|
|
{ "IP addres", "ddtp.ipaddr", FT_IPv4, BASE_NONE, NULL, 0x0,
|
|
|
|
"IP address" } },
|
|
|
|
{ &hf_ddtp_status,
|
2000-04-13 21:16:22 +00:00
|
|
|
{ "Status", "ddtp.status", FT_UINT32, BASE_DEC, VALS(vals_ddtp_status), 0x0,
|
2000-04-13 21:03:56 +00:00
|
|
|
"Update reply status" } }
|
|
|
|
};
|
|
|
|
|
|
|
|
static gint *ett[] = { &ett_ddtp };
|
|
|
|
|
2000-04-13 21:16:22 +00:00
|
|
|
proto_ddtp = proto_register_protocol("Dynamic DNS Tools Protocol", "ddtp");
|
|
|
|
proto_register_field_array(proto_ddtp, hf_ddtp, array_length(hf_ddtp));
|
2000-04-13 21:03:56 +00:00
|
|
|
proto_register_subtree_array(ett, array_length(ett));
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
proto_reg_handoff_ddtp(void)
|
|
|
|
{
|
2000-06-10 18:08:17 +00:00
|
|
|
dissector_add("udp.port", UDP_PORT_DDTP, dissect_ddtp);
|
2000-04-13 21:03:56 +00:00
|
|
|
}
|