diff --git a/daemon/media_socket.c b/daemon/media_socket.c index 58bc1e411..38bbeb29c 100644 --- a/daemon/media_socket.c +++ b/daemon/media_socket.c @@ -1464,6 +1464,7 @@ static const char *kernelize_one(struct rtpengine_target_info *reti, GQueue *out __re_address_translate_ep(&reti->local, &stream->selected_sfd->socket.local); reti->rtcp_mux = MEDIA_ISSET(media, RTCP_MUX); + reti->rtcp = PS_ISSET(stream, RTCP); reti->dtls = MEDIA_ISSET(media, DTLS); reti->stun = media->ice_agent ? 1 : 0; reti->non_forwarding = non_forwarding ? 1 : 0; diff --git a/kernel-module/xt_RTPENGINE.c b/kernel-module/xt_RTPENGINE.c index d2183d435..58eedc91b 100644 --- a/kernel-module/xt_RTPENGINE.c +++ b/kernel-module/xt_RTPENGINE.c @@ -1740,6 +1740,8 @@ static int proc_list_show(struct seq_file *f, void *v) { seq_printf(f, " PT-filter"); if (g->target.rtp_only) seq_printf(f, " RTP-only"); + if (g->target.rtcp) + seq_printf(f, " RTCP"); if (g->target.rtcp_mux) seq_printf(f, " RTCP-mux"); if (g->target.dtls) @@ -5258,8 +5260,14 @@ static unsigned int rtpengine46(struct sk_buff *skb, struct rtpengine_table *t, // RTP processing rtp.ok = 0; if (g->target.rtp) { - if (g->target.rtcp_mux && is_muxed_rtcp(skb)) - goto out; // pass to userspace + if (g->target.rtcp) { + if (g->target.rtcp_mux) { + if (is_muxed_rtcp(skb)) + goto out; // pass to userspace + } + else + goto out; // RTCP only + } parse_rtp(&rtp, skb); if (!rtp.ok && g->target.rtp_only) diff --git a/kernel-module/xt_RTPENGINE.h b/kernel-module/xt_RTPENGINE.h index b70026b53..01e1eb6c7 100644 --- a/kernel-module/xt_RTPENGINE.h +++ b/kernel-module/xt_RTPENGINE.h @@ -124,6 +124,7 @@ struct rtpengine_target_info { rtp:1, rtp_only:1, track_ssrc:1, + rtcp:1, do_intercept:1, pt_filter:1, non_forwarding:1, // empty src/dst addr