diff --git a/daemon/call.c b/daemon/call.c index 028c0573d..ce0e67354 100644 --- a/daemon/call.c +++ b/daemon/call.c @@ -630,7 +630,7 @@ static void call_timer(void *ptr) { atomic64_set(&ps->kernel_stats.errors, ke->stats.errors); for (j = 0; j < ke->target.num_payload_types; j++) { - pt = ke->target.payload_types[j]; + pt = ke->target.payload_types[j].pt_num; rs = g_hash_table_lookup(ps->rtp_stats, GINT_TO_POINTER(pt)); if (!rs) continue; diff --git a/daemon/media_socket.c b/daemon/media_socket.c index c14ba20f8..8ad510aef 100644 --- a/daemon/media_socket.c +++ b/daemon/media_socket.c @@ -1204,7 +1204,7 @@ static const char *kernelize_one(struct rtpengine_target_info *reti, GQueue *out values = g_list_sort(values, __rtp_stats_pt_sort); for (l = values; l; l = l->next) { if (reti->num_payload_types >= G_N_ELEMENTS(reti->payload_types)) { - ilog(LOG_WARNING, "Too many RTP payload types for kernel module"); + ilog(LOG_WARNING | LOG_FLAG_LIMIT, "Too many RTP payload types for kernel module"); break; } rs = l->data; @@ -1224,9 +1224,9 @@ static const char *kernelize_one(struct rtpengine_target_info *reti, GQueue *out } if (!can_kernelize) continue; - reti->payload_types[reti->num_payload_types] = rs->payload_type; - reti->clock_rates[reti->num_payload_types] = clockrate; - reti->num_payload_types++; + struct rtpengine_payload_type *rpt = &reti->payload_types[reti->num_payload_types++]; + rpt->pt_num = rs->payload_type; + rpt->clock_rate = clockrate; } g_list_free(values); } diff --git a/kernel-module/xt_RTPENGINE.c b/kernel-module/xt_RTPENGINE.c index bcbb70f25..5e6723600 100644 --- a/kernel-module/xt_RTPENGINE.c +++ b/kernel-module/xt_RTPENGINE.c @@ -1631,7 +1631,7 @@ static int proc_list_show(struct seq_file *f, void *v) { (unsigned long long) atomic64_read(&g->stats.errors)); for (i = 0; i < g->target.num_payload_types; i++) seq_printf(f, " RTP payload type %3u: %20llu bytes, %20llu packets\n", - g->target.payload_types[i], + g->target.payload_types[i].pt_num, (unsigned long long) atomic64_read(&g->rtp_stats[i].bytes), (unsigned long long) atomic64_read(&g->rtp_stats[i].packets)); if (g->target.ssrc) @@ -4165,26 +4165,26 @@ static inline int is_dtls(struct sk_buff *skb) { #if LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0) static int rtp_payload_match(const void *a, const void *b) { - const unsigned char *A = a, *B = b; + const struct rtpengine_payload_type *A = a, *B = b; - if (*A < *B) + if (A->pt_num < B->pt_num) return -1; - if (*A > *B) + if (A->pt_num > B->pt_num) 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; - const unsigned char *match; + struct rtpengine_payload_type pt; + const struct rtpengine_payload_type *match; - pt = hdr->m_pt & 0x7f; + pt.pt_num = 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) + if (match->pt_num == pt.pt_num) goto found; } match = NULL; @@ -4307,7 +4307,7 @@ static void rtp_stats(struct rtpengine_target *g, struct rtp_parsed *rtp, s64 ar // jitter // RFC 3550 A.8 - clockrate = g->target.clock_rates[pt_idx]; + clockrate = g->target.payload_types[pt_idx].clock_rate; transit = ((uint32_t) (div64_s64(arrival_time, 1000) * clockrate) / 1000) - ts; d = 0; if (s->transit) diff --git a/kernel-module/xt_RTPENGINE.h b/kernel-module/xt_RTPENGINE.h index 297c9ea30..25e471d76 100644 --- a/kernel-module/xt_RTPENGINE.h +++ b/kernel-module/xt_RTPENGINE.h @@ -92,6 +92,11 @@ enum rtpengine_src_mismatch { MSM_PROPAGATE, /* propagate to userspace daemon */ }; +struct rtpengine_payload_type { + unsigned char pt_num; + uint32_t clock_rate; +}; + struct rtpengine_target_info { struct re_address local; struct re_address expected_src; /* for incoming packets */ @@ -102,8 +107,7 @@ struct rtpengine_target_info { struct rtpengine_srtp decrypt; uint32_t ssrc; // Expose the SSRC to userspace when we resync. - unsigned char payload_types[NUM_PAYLOAD_TYPES]; /* must be sorted */ - uint32_t clock_rates[NUM_PAYLOAD_TYPES]; + struct rtpengine_payload_type payload_types[NUM_PAYLOAD_TYPES]; /* must be sorted */ unsigned int num_payload_types; unsigned int rtcp_mux:1,