diff --git a/src/include/switch_types.h b/src/include/switch_types.h index 312e0bd342..eb4de9ade7 100644 --- a/src/include/switch_types.h +++ b/src/include/switch_types.h @@ -680,6 +680,16 @@ typedef enum { This flag will treat every dtmf as if it were 50ms and queue it on recipt of the leading packet rather than at the end. */ + + RTP_BUG_ACCEPT_ANY_PACKETS = (1 << 7) + + /* + Oracle's Contact Center Anywhere (CCA) likes to use a single RTP socket to send all its outbound audio. + This messes up our ability to auto adjust to NATTED RTP and causes us to ignore its audio packets. + This flag will allow compatibility with this dying product. + */ + + } switch_rtp_bug_flag_t; #ifdef _MSC_VER diff --git a/src/mod/endpoints/mod_sofia/sofia_glue.c b/src/mod/endpoints/mod_sofia/sofia_glue.c index adc0c5347f..77c1842832 100644 --- a/src/mod/endpoints/mod_sofia/sofia_glue.c +++ b/src/mod/endpoints/mod_sofia/sofia_glue.c @@ -6553,6 +6553,14 @@ void sofia_glue_parse_rtp_bugs(switch_rtp_bug_flag_t *flag_pole, const char *str if (switch_stristr("~IGNORE_DTMF_DURATION", str)) { *flag_pole &= ~RTP_BUG_IGNORE_DTMF_DURATION; } + + if (switch_stristr("ACCEPT_ANY_PACKETS", str)) { + *flag_pole |= RTP_BUG_ACCEPT_ANY_PACKETS; + } + + if (switch_stristr("~ACCEPT_ANY_PACKETS", str)) { + *flag_pole &= ~RTP_BUG_ACCEPT_ANY_PACKETS; + } } char *sofia_glue_gen_contact_str(sofia_profile_t *profile, sip_t const *sip, sofia_dispatch_event_t *de, sofia_nat_parse_t *np) diff --git a/src/switch_rtp.c b/src/switch_rtp.c index 6d51bf2963..02c440ca6f 100644 --- a/src/switch_rtp.c +++ b/src/switch_rtp.c @@ -3135,7 +3135,7 @@ static int rtp_common_read(switch_rtp_t *rtp_session, switch_payload_t *payload_ goto recvfrom; } - } else if (!switch_cmp_addr(rtp_session->from_addr, rtp_session->remote_addr)) { + } else if (!(rtp_session->rtp_bugs & RTP_BUG_ACCEPT_ANY_PACKETS) && !switch_cmp_addr(rtp_session->from_addr, rtp_session->remote_addr)) { goto recvfrom; }