diff --git a/channels/chan_sip.c b/channels/chan_sip.c index 332aeb3ca3..ce96344d6d 100644 --- a/channels/chan_sip.c +++ b/channels/chan_sip.c @@ -27013,6 +27013,10 @@ static int handle_common_options(struct ast_flags *flags, struct ast_flags *mask } else if (!strcasecmp(word, "nonat")) { ast_set_flag(&flags[0], SIP_DIRECT_MEDIA); ast_clear_flag(&flags[0], SIP_DIRECT_MEDIA_NAT); + } else if (!strcasecmp(word, "outgoing")) { + ast_set_flag(&flags[0], SIP_DIRECT_MEDIA); + ast_set_flag(&mask[2], SIP_PAGE3_DIRECT_MEDIA_OUTGOING); + ast_set_flag(&flags[2], SIP_PAGE3_DIRECT_MEDIA_OUTGOING); } else { ast_log(LOG_WARNING, "Unknown directmedia mode '%s' on line %d\n", v->value, v->lineno); } @@ -29541,6 +29545,18 @@ static int sip_set_rtp_peer(struct ast_channel *chan, struct ast_rtp_instance *i p->redircodecs = codecs; changed = 1; } + + if (ast_test_flag(&p->flags[2], SIP_PAGE3_DIRECT_MEDIA_OUTGOING) && !p->outgoing_call) { + /* We only wish to withhold sending the initial direct media reinvite on the incoming dialog. + * Further direct media reinvites beyond the initial should be sent. In order to allow further + * direct media reinvites to be sent, we clear this flag. + */ + ast_clear_flag(&p->flags[2], SIP_PAGE3_DIRECT_MEDIA_OUTGOING); + sip_pvt_unlock(p); + ast_channel_unlock(chan); + return 0; + } + if (changed && !ast_test_flag(&p->flags[0], SIP_GOTREFER) && !ast_test_flag(&p->flags[0], SIP_DEFER_BYE_ON_TRANSFER)) { if (chan->_state != AST_STATE_UP) { /* We are in early state */ if (p->do_history) diff --git a/channels/sip/include/sip.h b/channels/sip/include/sip.h index 4ef73f9ffb..55da5d0650 100644 --- a/channels/sip/include/sip.h +++ b/channels/sip/include/sip.h @@ -357,9 +357,10 @@ #define SIP_PAGE3_SNOM_AOC (1 << 0) /*!< DPG: Allow snom aoc messages */ +#define SIP_PAGE3_DIRECT_MEDIA_OUTGOING (1 << 1) /*!< DP: Only send direct media reinvites on outgoing calls */ #define SIP_PAGE3_FLAGS_TO_COPY \ - (SIP_PAGE3_SNOM_AOC) + (SIP_PAGE3_SNOM_AOC | SIP_PAGE3_DIRECT_MEDIA_OUTGOING) /*@}*/ diff --git a/configs/sip.conf.sample b/configs/sip.conf.sample index 7901be3635..f48d168b19 100644 --- a/configs/sip.conf.sample +++ b/configs/sip.conf.sample @@ -877,6 +877,13 @@ srvlookup=yes ; Enable DNS SRV lookups on outbound calls ; instead of INVITE. This can be combined with 'nonat', as ; 'directmedia=update,nonat'. It implies 'yes'. +;directmedia=outgoing ; When sending directmedia reinvites, do not send an immediate + ; reinvite on an incoming call leg. This option is useful when + ; peered with another SIP user agent that is known to send + ; immediate direct media reinvites upon call establishment. Setting + ; the option in this situation helps to prevent potential glares. + ; Setting this option implies 'yes'. + ;directrtpsetup=yes ; Enable the new experimental direct RTP setup. This sets up ; the call directly with media peer-2-peer without re-invites. ; Will not work for video and cases where the callee sends