forked from Mirrors/sngrep
rtp: properly dissect RTP and RTCP packets
Do not rely on the incoming port number being even or odd in order to identify data as RTP or RTCP respectively.
This commit is contained in:
parent
7359a48f72
commit
9e8dc05960
47
src/rtp.c
47
src/rtp.c
|
@ -176,16 +176,7 @@ rtp_check_packet(packet_t *packet)
|
||||||
src = packet->src;
|
src = packet->src;
|
||||||
dst = packet->dst;
|
dst = packet->dst;
|
||||||
|
|
||||||
// Check if we have at least RTP type
|
if (data_is_rtp(payload, size) == 0) {
|
||||||
if ((int32_t) size < 2)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
// Check RTP version
|
|
||||||
if (RTP_VERSION(*payload) != RTP_VERSION_RFC1889)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
// RTP: even, RTCP: odd
|
|
||||||
if (((packet->dst.port % 2) == 0)) {
|
|
||||||
|
|
||||||
// Get RTP payload type
|
// Get RTP payload type
|
||||||
format = RTP_PAYLOAD_TYPE(*(payload + 1));
|
format = RTP_PAYLOAD_TYPE(*(payload + 1));
|
||||||
|
@ -221,7 +212,7 @@ rtp_check_packet(packet_t *packet)
|
||||||
|
|
||||||
// Add packet to stream
|
// Add packet to stream
|
||||||
stream_add_packet(stream, packet);
|
stream_add_packet(stream, packet);
|
||||||
} else {
|
} else if (data_is_rtcp(payload, size) == 0) {
|
||||||
// Find the matching stream
|
// Find the matching stream
|
||||||
if ((stream = rtp_find_stream(src, dst))) {
|
if ((stream = rtp_find_stream(src, dst))) {
|
||||||
|
|
||||||
|
@ -294,6 +285,8 @@ rtp_check_packet(packet_t *packet)
|
||||||
stream_complete(stream, src);
|
stream_complete(stream, src);
|
||||||
stream_add_packet(stream, packet);
|
stream_add_packet(stream, packet);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return stream;
|
return stream;
|
||||||
|
@ -428,3 +421,35 @@ stream_is_complete(rtp_stream_t *stream)
|
||||||
{
|
{
|
||||||
return (stream->pktcnt != 0);
|
return (stream->pktcnt != 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
data_is_rtp(u_char *data, uint32_t len)
|
||||||
|
{
|
||||||
|
u_char pt = RTP_PAYLOAD_TYPE(*(data + 1));
|
||||||
|
|
||||||
|
if ((len >= RTP_HDR_LENGTH) &&
|
||||||
|
(RTP_VERSION(*data) == RTP_VERSION_RFC1889) &&
|
||||||
|
(data[0] > 127 && data[0] < 192) &&
|
||||||
|
(pt <= 64 || pt >= 96)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Not a RTP packet
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
data_is_rtcp(u_char *data, uint32_t len)
|
||||||
|
{
|
||||||
|
struct rtcp_hdr_generic *hdr = (struct rtcp_hdr_generic*) data;
|
||||||
|
|
||||||
|
if ((len >= RTCP_HDR_LENGTH) &&
|
||||||
|
(RTP_VERSION(*data) == RTP_VERSION_RFC1889) &&
|
||||||
|
(data[0] > 127 && data[0] < 192) &&
|
||||||
|
(hdr->type >= 192 && hdr->type <= 223)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Not a RTCP packet
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
22
src/rtp.h
22
src/rtp.h
|
@ -44,6 +44,12 @@
|
||||||
// Handled RTP versions
|
// Handled RTP versions
|
||||||
#define RTP_VERSION_RFC1889 2
|
#define RTP_VERSION_RFC1889 2
|
||||||
|
|
||||||
|
// RTP header length
|
||||||
|
#define RTP_HDR_LENGTH 12
|
||||||
|
|
||||||
|
// RTCP common header length
|
||||||
|
#define RTCP_HDR_LENGTH 4
|
||||||
|
|
||||||
// RTCP header types
|
// RTCP header types
|
||||||
//! http://www.iana.org/assignments/rtp-parameters/rtp-parameters.xhtml
|
//! http://www.iana.org/assignments/rtp-parameters/rtp-parameters.xhtml
|
||||||
enum rtcp_header_types
|
enum rtcp_header_types
|
||||||
|
@ -312,4 +318,20 @@ stream_is_older(rtp_stream_t *one, rtp_stream_t *two);
|
||||||
int
|
int
|
||||||
stream_is_complete(rtp_stream_t *stream);
|
stream_is_complete(rtp_stream_t *stream);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Check if the data is a RTP packet
|
||||||
|
* RFC 5761 Section 4. Distinguishable RTP and RTCP Packets
|
||||||
|
* RFC 5764 Section 5.1.2. Reception (packet demultiplexing)
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
data_is_rtp(u_char *data, uint32_t len);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Check if the data is a RTCP packet
|
||||||
|
* RFC 5761 Section 4. Distinguishable RTP and RTCP Packets
|
||||||
|
* RFC 5764 Section 5.1.2. Reception (packet demultiplexing)
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
data_is_rtcp(u_char *data, uint32_t len);
|
||||||
|
|
||||||
#endif /* __SNGREP_RTP_H */
|
#endif /* __SNGREP_RTP_H */
|
||||||
|
|
Loading…
Reference in New Issue