make rtp bug compensation configurable

git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@11146 d0543943-73ff-0310-b7d9-9358b9ac24b2
This commit is contained in:
Anthony Minessale 2009-01-12 19:36:04 +00:00
parent 4997507dfe
commit e4feb603d8
3 changed files with 50 additions and 12 deletions

View File

@ -433,6 +433,7 @@ struct sofia_profile {
sofia_presence_type_t pres_type; sofia_presence_type_t pres_type;
sofia_media_options_t media_options; sofia_media_options_t media_options;
uint32_t force_subscription_expires; uint32_t force_subscription_expires;
switch_rtp_bug_flag_t auto_rtp_bugs;
}; };
struct private_object { struct private_object {

View File

@ -1208,6 +1208,31 @@ static void parse_domain_tag(sofia_profile_t *profile, switch_xml_t x_domain_tag
} }
} }
static void parse_rtp_bugs(sofia_profile_t *profile, const char *str)
{
if (switch_stristr("clear", str)) {
profile->auto_rtp_bugs = 0;
}
if (switch_stristr("CISCO_SKIP_MARK_BIT_2833", str)) {
profile->auto_rtp_bugs |= RTP_BUG_CISCO_SKIP_MARK_BIT_2833;
}
if (switch_stristr("~CISCO_SKIP_MARK_BIT_2833", str)) {
profile->auto_rtp_bugs &= ~RTP_BUG_CISCO_SKIP_MARK_BIT_2833;
}
if (switch_stristr("SONUS_SEND_INVALID_TIMESTAMP_2833", str)) {
profile->auto_rtp_bugs |= RTP_BUG_SONUS_SEND_INVALID_TIMESTAMP_2833;
}
if (switch_stristr("~SONUS_SEND_INVALID_TIMESTAMP_2833", str)) {
profile->auto_rtp_bugs &= ~RTP_BUG_SONUS_SEND_INVALID_TIMESTAMP_2833;
}
}
switch_status_t reconfig_sofia(sofia_profile_t *profile) switch_status_t reconfig_sofia(sofia_profile_t *profile)
{ {
switch_xml_t cfg, xml = NULL, xprofile, profiles, gateways_tag, domain_tag, domains_tag, aliases_tag, alias_tag, settings, param; switch_xml_t cfg, xml = NULL, xprofile, profiles, gateways_tag, domain_tag, domains_tag, aliases_tag, alias_tag, settings, param;
@ -1250,6 +1275,8 @@ switch_status_t reconfig_sofia(sofia_profile_t *profile)
char *val = (char *) switch_xml_attr_soft(param, "value"); char *val = (char *) switch_xml_attr_soft(param, "value");
if (!strcasecmp(var, "debug")) { if (!strcasecmp(var, "debug")) {
profile->debug = atoi(val); profile->debug = atoi(val);
} else if (!strcasecmp(var, "auto-rtp-bugs")) {
parse_rtp_bugs(profile, val);
} else if (!strcasecmp(var, "user-agent-string")) { } else if (!strcasecmp(var, "user-agent-string")) {
profile->user_agent = switch_core_strdup(profile->pool, val); profile->user_agent = switch_core_strdup(profile->pool, val);
} else if (!strcasecmp(var, "dtmf-type")) { } else if (!strcasecmp(var, "dtmf-type")) {
@ -1639,6 +1666,8 @@ switch_status_t config_sofia(int reload, char *profile_name)
goto done; goto done;
} }
profile->auto_rtp_bugs = RTP_BUG_CISCO_SKIP_MARK_BIT_2833 | RTP_BUG_SONUS_SEND_INVALID_TIMESTAMP_2833;
profile->pool = pool; profile->pool = pool;
profile->user_agent = SOFIA_USER_AGENT; profile->user_agent = SOFIA_USER_AGENT;
@ -1694,6 +1723,8 @@ switch_status_t config_sofia(int reload, char *profile_name)
if (switch_true(val)) { if (switch_true(val)) {
profile->rport_level = 2; profile->rport_level = 2;
} }
} else if (!strcasecmp(var, "auto-rtp-bugs")) {
parse_rtp_bugs(profile, val);
} else if (!strcasecmp(var, "dbname")) { } else if (!strcasecmp(var, "dbname")) {
profile->dbname = switch_core_strdup(profile->pool, val); profile->dbname = switch_core_strdup(profile->pool, val);
} else if (!strcasecmp(var, "presence-hosts")) { } else if (!strcasecmp(var, "presence-hosts")) {

View File

@ -2275,19 +2275,25 @@ uint8_t sofia_glue_negotiate_sdp(switch_core_session_t *session, sdp_session_t *
} }
if ((tech_pvt->origin = switch_core_session_strdup(session, (char *) sdp->sdp_origin->o_username))) { if ((tech_pvt->origin = switch_core_session_strdup(session, (char *) sdp->sdp_origin->o_username))) {
if (strstr(tech_pvt->origin, "CiscoSystemsSIP-GW-UserAgent")) {
tech_pvt->rtp_bugs |= RTP_BUG_CISCO_SKIP_MARK_BIT_2833; if (tech_pvt->profile->auto_rtp_bugs & RTP_BUG_CISCO_SKIP_MARK_BIT_2833) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Activate Buggy RFC2833 Mode!\n");
if (strstr(tech_pvt->origin, "CiscoSystemsSIP-GW-UserAgent")) {
tech_pvt->rtp_bugs |= RTP_BUG_CISCO_SKIP_MARK_BIT_2833;
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Activate Buggy RFC2833 Mode!\n");
}
} }
if (strstr(tech_pvt->origin, "Sonus_UAC")) { if (tech_pvt->profile->auto_rtp_bugs & RTP_BUG_SONUS_SEND_INVALID_TIMESTAMP_2833) {
tech_pvt->rtp_bugs |= RTP_BUG_SONUS_SEND_INVALID_TIMESTAMP_2833; if (strstr(tech_pvt->origin, "Sonus_UAC")) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, tech_pvt->rtp_bugs |= RTP_BUG_SONUS_SEND_INVALID_TIMESTAMP_2833;
"Hello,\nI see you have a Sonus!\n" switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING,
"FYI, Sonus cannot follow the RFC on the proper way to send DTMF.\n" "Hello,\nI see you have a Sonus!\n"
"Sadly, my creator had to spend several hours figuring this out so I thought you'd like to know that!\n" "FYI, Sonus cannot follow the RFC on the proper way to send DTMF.\n"
"Don't worry, DTMF will work but you may want to ask them to fix it......\n" "Sadly, my creator had to spend several hours figuring this out so I thought you'd like to know that!\n"
); "Don't worry, DTMF will work but you may want to ask them to fix it......\n"
);
}
} }
} }