Hello,
I am currently developing an ICE implementation
(http://www.ietf.org/internet-drafts/draft-ietf-mmusic-ice-03.txt). ICE uses
STUN on the same port that the RTP media is sent on. The ICE application
demultiplexes STUN/RTP by looking at the first 2 bits of the UDP packet. RTP
will have 0b10 (rtp.version == 2) and a STUN packet will have 0b00. I would
like to have ethereal dissect what looks like a rtp.version == 0 packet as a
STUN packet.
I found in epan/dissectors/packet-rtp.c:dissect_rtp_heur() a check to validate
that rtp.version == 2. I would like to modify this routine to call the STUN
dissector, but I'm not sure how to make this call:
static gboolean
dissect_rtp_heur( tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree )
{
guint8 octet1, octet2;
unsigned int version;
unsigned int payload_type;
unsigned int offset = 0;
/* This is a heuristic dissector, which means we get all the UDP
* traffic not sent to a known dissector and not claimed by
* a heuristic dissector called before us!
*/
if (! global_rtp_heur)
return FALSE;
/* Get the fields in the first octet */
octet1 = tvb_get_guint8( tvb, offset );
version = RTP_VERSION( octet1 );
if (version == 0) {
/******************************************/
/* Call the STUN dissector here, but how? */
/******************************************/
return TRUE;
} else if (version != 2) {
/* Unknown or unsupported version */
return FALSE;
}
/* Get the fields in the second octet */
octet2 = tvb_get_guint8( tvb, offset + 1 );
payload_type = RTP_PAYLOAD_TYPE( octet2 );
/* if (payload_type == PT_PCMU ||
* payload_type == PT_PCMA)
* payload_type == PT_G729)
* */
if (payload_type <= PT_H263) {
dissect_rtp( tvb, pinfo, tree );
return TRUE;
}
else {
return FALSE;
}
}