Infrastructure for tcp decoding - nothing done to actually
decode the contents svn path=/trunk/; revision=44683
This commit is contained in:
parent
cbd2a8ff25
commit
df49549abf
|
@ -91,15 +91,15 @@ static int hf_skype_natrequest_dstip = -1;
|
||||||
static int hf_skype_audio_unk1 = -1;
|
static int hf_skype_audio_unk1 = -1;
|
||||||
/* Unknown_f */
|
/* Unknown_f */
|
||||||
static int hf_skype_unknown_f_unk1 = -1;
|
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_SHORT_NAME "SKYPE"
|
||||||
#define PROTO_LONG_NAME "SKYPE"
|
#define PROTO_LONG_NAME "SKYPE"
|
||||||
|
|
||||||
#define PORT_SKYPE_UDP 0
|
#define PORT_SKYPE_UDP 0
|
||||||
#if 0
|
|
||||||
#define PORT_SKYPE_TCP 0
|
#define PORT_SKYPE_TCP 0
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
SKYPE_TYPE_UNKNOWN_0 = 0,
|
SKYPE_TYPE_UNKNOWN_0 = 0,
|
||||||
|
@ -124,6 +124,44 @@ static const value_string skype_type_vals[] = {
|
||||||
{ 0, NULL }
|
{ 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
|
static int
|
||||||
dissect_skype_udp(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
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;
|
offset = packet_length;
|
||||||
break;
|
break;
|
||||||
default:
|
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;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return offset;
|
return offset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if SKYPE_HEUR
|
||||||
static gboolean
|
static gboolean
|
||||||
test_skype_udp(tvbuff_t *tvb)
|
test_skype_udp(tvbuff_t *tvb)
|
||||||
{
|
{
|
||||||
|
@ -260,7 +301,7 @@ test_skype_udp(tvbuff_t *tvb)
|
||||||
guint8 type = tvb_get_guint8(tvb, 2) & 0xF;
|
guint8 type = tvb_get_guint8(tvb, 2) & 0xF;
|
||||||
if ( length >= 3 &&
|
if ( length >= 3 &&
|
||||||
( type == 0 ||
|
( 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 == 2 ||
|
||||||
type == 3 ||
|
type == 3 ||
|
||||||
type == 5 ||
|
type == 5 ||
|
||||||
|
@ -274,25 +315,32 @@ test_skype_udp(tvbuff_t *tvb)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
static gboolean
|
static gboolean
|
||||||
dissect_skype_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
dissect_skype_heur(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
|
||||||
{
|
{
|
||||||
if ( !test_skype(tvb) ) {
|
if (pinfo->ptype == PT_UDP) {
|
||||||
return FALSE;
|
if ( !test_skype_udp(tvb) ) {
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
dissect_skype_udp(tvb, pinfo, tree);
|
||||||
}
|
}
|
||||||
dissect_skype(tvb, pinfo, tree);
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int
|
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
|
void
|
||||||
|
@ -382,6 +430,11 @@ proto_register_skype(void)
|
||||||
{ "Unknown1", "skype.unknown_f.unk1", FT_BYTES, BASE_NONE, NULL,
|
{ "Unknown1", "skype.unknown_f.unk1", FT_BYTES, BASE_NONE, NULL,
|
||||||
0x0, NULL, HFILL }},
|
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[] = {
|
static gint *ett[] = {
|
||||||
&ett_skype,
|
&ett_skype,
|
||||||
|
@ -397,10 +450,11 @@ proto_reg_handoff_skype(void)
|
||||||
{
|
{
|
||||||
dissector_handle_t skype_handle;
|
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);
|
dissector_add_uint("udp.port", PORT_SKYPE_UDP, skype_handle);
|
||||||
#if 0
|
#if SKYPE_HEUR
|
||||||
dissector_add_uint("tcp.port", PORT_SKYPE_TCP, skype_handle);
|
heur_dissector_add("tcp", dissect_skype_heur, proto_skype);
|
||||||
heur_dissector_add("udp", dissect_skype_heur, proto_skype);
|
heur_dissector_add("udp", dissect_skype_heur, proto_skype);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue