Infrastructure for tcp decoding - nothing done to actually

decode the contents

svn path=/trunk/; revision=44683
This commit is contained in:
Jörg Mayer 2012-08-27 07:46:23 +00:00
parent cbd2a8ff25
commit df49549abf
1 changed files with 69 additions and 15 deletions

View File

@ -91,15 +91,15 @@ static int hf_skype_natrequest_dstip = -1;
static int hf_skype_audio_unk1 = -1;
/* Unknown_f */
static int hf_skype_unknown_f_unk1 = -1;
/* Unknown packet type */
static int hf_skype_unknown_packet = -1;
#define PROTO_SHORT_NAME "SKYPE"
#define PROTO_LONG_NAME "SKYPE"
#define PORT_SKYPE_UDP 0
#if 0
#define PORT_SKYPE_TCP 0
#endif
typedef enum {
SKYPE_TYPE_UNKNOWN_0 = 0,
@ -124,6 +124,44 @@ static const value_string skype_type_vals[] = {
{ 0, NULL }
};
static int
dissect_skype_tcp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
proto_item *ti;
proto_tree *skype_tree = NULL;
guint32 offset = 0;
guint32 packet_length;
guint8 packet_type;
/* XXX: Just until we know how to decode skype over tcp */
packet_type = 255;
packet_length = tvb_length(tvb);
col_set_str(pinfo->cinfo, COL_PROTOCOL, PROTO_SHORT_NAME);
col_add_str(pinfo->cinfo, COL_INFO, val_to_str(packet_type,
skype_type_vals, "Type 0x%1x"));
if (tree) {
/* Start of message dissection */
ti = proto_tree_add_item(tree, proto_skype, tvb, offset, -1,
ENC_NA);
skype_tree = proto_item_add_subtree(ti, ett_skype);
/* Body dissection */
switch (packet_type) {
default:
proto_tree_add_item(skype_tree, hf_skype_unknown_packet, tvb, offset, -1,
ENC_NA);
offset = packet_length;
break;
}
}
return offset;
}
static int
dissect_skype_udp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
@ -245,13 +283,16 @@ dissect_skype_udp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
offset = packet_length;
break;
default:
/* Should not happen: Unkown types filtered in test_skype */
proto_tree_add_item(skype_tree, hf_skype_unknown_packet, tvb, offset, -1,
ENC_NA);
offset = packet_length;
break;
}
}
return offset;
}
#if SKYPE_HEUR
static gboolean
test_skype_udp(tvbuff_t *tvb)
{
@ -260,7 +301,7 @@ test_skype_udp(tvbuff_t *tvb)
guint8 type = tvb_get_guint8(tvb, 2) & 0xF;
if ( length >= 3 &&
( type == 0 ||
/* FIXME: Extend this by minimum length per message type */
/* FIXME: Extend this by minimum or exact length per message type */
type == 2 ||
type == 3 ||
type == 5 ||
@ -274,25 +315,32 @@ test_skype_udp(tvbuff_t *tvb)
return FALSE;
}
#if 0
static gboolean
dissect_skype_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
if ( !test_skype(tvb) ) {
return FALSE;
if (pinfo->ptype == PT_UDP) {
if ( !test_skype_udp(tvb) ) {
return FALSE;
}
dissect_skype_udp(tvb, pinfo, tree);
}
dissect_skype(tvb, pinfo, tree);
return TRUE;
}
#endif
static int
dissect_skype_udp_static(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
dissect_skype_static(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
if ( !test_skype_udp(tvb) ) {
return 0;
/*
* Don't test for valid packet - we only end here when
* the user did a decode-as.
*/
if (pinfo->ptype == PT_UDP) {
return dissect_skype_udp(tvb, pinfo, tree);
} else if (pinfo->ptype == PT_UDP) {
return dissect_skype_tcp(tvb, pinfo, tree);
}
return dissect_skype_udp(tvb, pinfo, tree);
return 0;
}
void
@ -382,6 +430,11 @@ proto_register_skype(void)
{ "Unknown1", "skype.unknown_f.unk1", FT_BYTES, BASE_NONE, NULL,
0x0, NULL, HFILL }},
/* Unknown packet */
{ &hf_skype_unknown_packet,
{ "Unknown Packet", "skype.unknown_packet", FT_BYTES, BASE_NONE, NULL,
0x0, NULL, HFILL }},
};
static gint *ett[] = {
&ett_skype,
@ -397,10 +450,11 @@ proto_reg_handoff_skype(void)
{
dissector_handle_t skype_handle;
skype_handle = new_create_dissector_handle(dissect_skype_udp_static, proto_skype);
skype_handle = new_create_dissector_handle(dissect_skype_static, proto_skype);
dissector_add_uint("tcp.port", PORT_SKYPE_UDP, skype_handle);
dissector_add_uint("udp.port", PORT_SKYPE_UDP, skype_handle);
#if 0
dissector_add_uint("tcp.port", PORT_SKYPE_TCP, skype_handle);
#if SKYPE_HEUR
heur_dissector_add("tcp", dissect_skype_heur, proto_skype);
heur_dissector_add("udp", dissect_skype_heur, proto_skype);
#endif