|
|
|
|
@ -3787,16 +3787,27 @@ static int rtp_payload_match(const void *a, const void *b) {
|
|
|
|
|
return 1;
|
|
|
|
|
return 0;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
static inline int rtp_payload_type(const struct rtp_header *hdr, const struct rtpengine_target_info *tg) {
|
|
|
|
|
unsigned char pt, *match;
|
|
|
|
|
unsigned char pt;
|
|
|
|
|
const unsigned char *match;
|
|
|
|
|
|
|
|
|
|
pt = hdr->m_pt & 0x7f;
|
|
|
|
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0)
|
|
|
|
|
match = bsearch(&pt, tg->payload_types, tg->num_payload_types, sizeof(pt), rtp_payload_match);
|
|
|
|
|
#else
|
|
|
|
|
for (match = tg->payload_types; match < tg->payload_types + tg->num_payload_types; match++) {
|
|
|
|
|
if (*match == pt)
|
|
|
|
|
goto found;
|
|
|
|
|
}
|
|
|
|
|
match = NULL;
|
|
|
|
|
found:
|
|
|
|
|
#endif
|
|
|
|
|
if (!match)
|
|
|
|
|
return -1;
|
|
|
|
|
return match - tg->payload_types;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
static struct sk_buff *intercept_skb_copy(struct sk_buff *oskb, const struct re_address *src) {
|
|
|
|
|
struct sk_buff *ret;
|
|
|
|
|
@ -3933,9 +3944,7 @@ src_check_ok:
|
|
|
|
|
if (g->target.rtcp_mux && is_muxed_rtcp(&rtp))
|
|
|
|
|
goto skip1;
|
|
|
|
|
|
|
|
|
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0)
|
|
|
|
|
rtp_pt_idx = rtp_payload_type(rtp.header, &g->target);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
// Pass to userspace if SSRC has changed.
|
|
|
|
|
errstr = "SSRC mismatch";
|
|
|
|
|
@ -4017,7 +4026,6 @@ no_intercept:
|
|
|
|
|
atomic64_add(datalen, &g->stats.bytes);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0)
|
|
|
|
|
if (rtp_pt_idx >= 0) {
|
|
|
|
|
atomic64_inc(&g->rtp_stats[rtp_pt_idx].packets);
|
|
|
|
|
atomic64_add(datalen, &g->rtp_stats[rtp_pt_idx].bytes);
|
|
|
|
|
@ -4051,7 +4059,6 @@ no_intercept:
|
|
|
|
|
/* not RTP */ ;
|
|
|
|
|
else if (rtp_pt_idx == -1)
|
|
|
|
|
atomic64_inc(&g->stats.errors);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
target_put(g);
|
|
|
|
|
table_put(t);
|
|
|
|
|
|