From c61d7f129e5ef98785c8f58b63e5c66bfd40e12c Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Fri, 7 Dec 2018 06:11:08 -0500 Subject: [PATCH] add new `full rtcp attribute` flag closes #668 Change-Id: I1ee13d4121d0aa6dff46470327a6caba9b631d7d --- README.md | 5 +++++ daemon/call_interfaces.c | 2 ++ daemon/sdp.c | 38 +++++++++++++++++++------------------- include/call_interfaces.h | 1 + utils/rtpengine-ng-client | 3 ++- 5 files changed, 29 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 332473743..04c5ae32f 100644 --- a/README.md +++ b/README.md @@ -1195,6 +1195,11 @@ Optionally included keys are: Omit the `a=rtcp` line from the outgoing SDP. + - `full rtcp attribute` + + Include the full version of the `a=rtcp` line (complete with network address) instead of + the short version with just the port number. + - `loop protect` Inserts a custom attribute (`a=rtpengine:...`) into the outgoing SDP to prevent *rtpengine* diff --git a/daemon/call_interfaces.c b/daemon/call_interfaces.c index 33bf187b9..2a106d041 100644 --- a/daemon/call_interfaces.c +++ b/daemon/call_interfaces.c @@ -619,6 +619,8 @@ static void call_ng_flags_flags(struct sdp_ng_flags *out, str *s, void *dummy) { out->record_call = 1; else if (!str_cmp(s, "no-rtcp-attribute")) out->no_rtcp_attr = 1; + else if (!str_cmp(s, "full-rtcp-attribute")) + out->full_rtcp_attr = 1; else if (!str_cmp(s, "loop-protect")) out->loop_protect = 1; else if (!str_cmp(s, "always-transcode")) diff --git a/daemon/sdp.c b/daemon/sdp.c index 8f0559e2a..e0ab9e6b0 100644 --- a/daemon/sdp.c +++ b/daemon/sdp.c @@ -1965,6 +1965,20 @@ static void insert_crypto(struct call_media *media, struct sdp_chopper *chop, st for (GList *l = media->sdes_out.head; l; l = l->next) insert_crypto1(media, chop, l->data, flags); } +static void insert_rtcp_attr(struct sdp_chopper *chop, struct packet_stream *ps, + const struct sdp_ng_flags *flags) +{ + if (flags->no_rtcp_attr) + return; + chopper_append_printf(chop, "a=rtcp:%u", ps->selected_sfd->socket.local.port); + if (flags->full_rtcp_attr) { + char buf[64]; + int len; + call_stream_address46(buf, ps, SAF_NG, &len, NULL, 0); + chopper_append_printf(chop, " IN %.*s", len, buf); + } + chopper_append_c(chop, "\r\n"); +} /* called with call->master_lock held in W */ @@ -2100,28 +2114,14 @@ int sdp_replace(struct sdp_chopper *chop, GQueue *sessions, struct call_monologu || (flags->opmode == OP_OFFER && flags->rtcp_mux_require))) { - if (!flags->no_rtcp_attr) { - chopper_append_c(chop, "a=rtcp:"); - chopper_append_printf(chop, "%u", ps->selected_sfd->socket.local.port); - chopper_append_c(chop, "\r\na=rtcp-mux\r\n"); - } - else - chopper_append_c(chop, "a=rtcp-mux\r\n"); + insert_rtcp_attr(chop, ps, flags); + chopper_append_c(chop, "a=rtcp-mux\r\n"); ps_rtcp = NULL; } else if (ps_rtcp && !flags->ice_force_relay) { - if (!flags->no_rtcp_attr) { - chopper_append_c(chop, "a=rtcp:"); - chopper_append_printf(chop, "%u", ps_rtcp->selected_sfd->socket.local.port); - if (!MEDIA_ISSET(call_media, RTCP_MUX)) - chopper_append_c(chop, "\r\n"); - else - chopper_append_c(chop, "\r\na=rtcp-mux\r\n"); - } - else { - if (MEDIA_ISSET(call_media, RTCP_MUX)) - chopper_append_c(chop, "a=rtcp-mux\r\n"); - } + insert_rtcp_attr(chop, ps_rtcp, flags); + if (MEDIA_ISSET(call_media, RTCP_MUX)) + chopper_append_c(chop, "a=rtcp-mux\r\n"); } } else diff --git a/include/call_interfaces.h b/include/call_interfaces.h index f106bb5a3..7c3349304 100644 --- a/include/call_interfaces.h +++ b/include/call_interfaces.h @@ -53,6 +53,7 @@ struct sdp_ng_flags { rtcp_mux_accept:1, rtcp_mux_reject:1, no_rtcp_attr:1, + full_rtcp_attr:1, generate_mid:1, strict_source:1, media_handover:1, diff --git a/utils/rtpengine-ng-client b/utils/rtpengine-ng-client index f1a517759..37f3d58a2 100755 --- a/utils/rtpengine-ng-client +++ b/utils/rtpengine-ng-client @@ -22,6 +22,7 @@ GetOptions( 'trust-address' => \$options{'trust address'}, 'sip-source-address' => \$options{'sip source address'}, 'no-rtcp-attribute' => \$options{'no rtcp attribute'}, + 'full-rtcp-attribute' => \$options{'full rtcp attribute'}, 'symmetric' => \$options{'symmetric'}, 'asymmetric' => \$options{'asymmetric'}, 'replace-origin' => \$options{'replace-origin'}, @@ -75,7 +76,7 @@ for my $x (split(/,/, 'from-tag,to-tag,call-id,transport protocol,media address, for my $x (split(/,/, 'TOS,delete-delay')) { defined($options{$x}) and $packet{$x} = $options{$x}; } -for my $x (split(/,/, 'trust address,symmetric,asymmetric,force,strict source,media handover,sip source address,reset,port latching,no rtcp attribute,loop protect,record call,always transcode,all,pad crypto,generate mid,fragment')) { +for my $x (split(/,/, 'trust address,symmetric,asymmetric,force,strict source,media handover,sip source address,reset,port latching,no rtcp attribute,full rtcp attribute,loop protect,record call,always transcode,all,pad crypto,generate mid,fragment')) { defined($options{$x}) and push(@{$packet{flags}}, $x); } for my $x (split(/,/, 'origin,session connection')) {