|
|
|
|
@ -299,6 +299,7 @@ struct rtpengine_target {
|
|
|
|
|
atomic_t refcnt;
|
|
|
|
|
uint32_t table;
|
|
|
|
|
struct rtpengine_target_info target;
|
|
|
|
|
unsigned int last_pt; // index into payload_types[]
|
|
|
|
|
|
|
|
|
|
struct rtpengine_stats_a stats;
|
|
|
|
|
struct rtpengine_rtp_stats_a rtp_stats[RTPE_NUM_PAYLOAD_TYPES];
|
|
|
|
|
@ -4184,11 +4185,18 @@ static int rtp_payload_match(const void *a, const void *b) {
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
static inline int rtp_payload_type(const struct rtp_header *hdr, const struct rtpengine_target_info *tg) {
|
|
|
|
|
static inline int rtp_payload_type(const struct rtp_header *hdr, const struct rtpengine_target_info *tg,
|
|
|
|
|
int *last_pt)
|
|
|
|
|
{
|
|
|
|
|
struct rtpengine_payload_type pt;
|
|
|
|
|
const struct rtpengine_payload_type *match;
|
|
|
|
|
|
|
|
|
|
pt.pt_num = hdr->m_pt & 0x7f;
|
|
|
|
|
if (*last_pt < tg->num_payload_types) {
|
|
|
|
|
match = &tg->payload_types[*last_pt];
|
|
|
|
|
if (rtp_payload_match(match, &pt) == 0)
|
|
|
|
|
goto found;
|
|
|
|
|
}
|
|
|
|
|
#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
|
|
|
|
|
@ -4197,11 +4205,12 @@ static inline int rtp_payload_type(const struct rtp_header *hdr, const struct rt
|
|
|
|
|
goto found;
|
|
|
|
|
}
|
|
|
|
|
match = NULL;
|
|
|
|
|
found:
|
|
|
|
|
#endif
|
|
|
|
|
if (!match)
|
|
|
|
|
return -1;
|
|
|
|
|
return match - tg->payload_types;
|
|
|
|
|
found:
|
|
|
|
|
*last_pt = match - tg->payload_types;
|
|
|
|
|
return *last_pt;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static struct sk_buff *intercept_skb_copy(struct sk_buff *oskb, const struct re_address *src) {
|
|
|
|
|
@ -4441,7 +4450,7 @@ src_check_ok:
|
|
|
|
|
goto not_rtp;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
rtp_pt_idx = rtp_payload_type(rtp.header, &g->target);
|
|
|
|
|
rtp_pt_idx = rtp_payload_type(rtp.header, &g->target, &g->last_pt);
|
|
|
|
|
|
|
|
|
|
// Pass to userspace if SSRC has changed.
|
|
|
|
|
errstr = "SSRC mismatch";
|
|
|
|
|
|