]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
make rtp bug compensation configurable
authorAnthony Minessale <anthony.minessale@gmail.com>
Mon, 12 Jan 2009 19:36:04 +0000 (19:36 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Mon, 12 Jan 2009 19:36:04 +0000 (19:36 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@11146 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/mod/endpoints/mod_sofia/mod_sofia.h
src/mod/endpoints/mod_sofia/sofia.c
src/mod/endpoints/mod_sofia/sofia_glue.c

index 0d66ac503457a9489154b3bbf9974e5028fbd182..1ee2d1f86a268b1694586bc3ea200684ecfc26bd 100644 (file)
@@ -433,6 +433,7 @@ struct sofia_profile {
        sofia_presence_type_t pres_type;
        sofia_media_options_t media_options;
        uint32_t force_subscription_expires;
+       switch_rtp_bug_flag_t auto_rtp_bugs;
 };
 
 struct private_object {
index e98a7d602f4e2c1b2b3be22ef8463cdeb922d307..f4c94d00c948c0ea7162085647eaaeef5ac22695 100644 (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_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");
                                        if (!strcasecmp(var, "debug")) {
                                                profile->debug = atoi(val);
+                                       } else if (!strcasecmp(var, "auto-rtp-bugs")) {
+                                               parse_rtp_bugs(profile, val);
                                        } else if (!strcasecmp(var, "user-agent-string")) { 
                                                profile->user_agent = switch_core_strdup(profile->pool, val);
                                        } else if (!strcasecmp(var, "dtmf-type")) {
@@ -1639,6 +1666,8 @@ switch_status_t config_sofia(int reload, char *profile_name)
                                        goto done;
                                }
 
+                               profile->auto_rtp_bugs = RTP_BUG_CISCO_SKIP_MARK_BIT_2833 | RTP_BUG_SONUS_SEND_INVALID_TIMESTAMP_2833;
+
                                profile->pool = pool;
                                profile->user_agent = SOFIA_USER_AGENT;
 
@@ -1694,6 +1723,8 @@ switch_status_t config_sofia(int reload, char *profile_name)
                                                if (switch_true(val)) {
                                                        profile->rport_level = 2;
                                                }
+                                       } else if (!strcasecmp(var, "auto-rtp-bugs")) {
+                                               parse_rtp_bugs(profile, val);
                                        } else if (!strcasecmp(var, "dbname")) {
                                                profile->dbname = switch_core_strdup(profile->pool, val);
                                        } else if (!strcasecmp(var, "presence-hosts")) {
index 4b097409e47f476d3c6aa7831e6bc4a34afcd0bf..617558995772f6af6b7d79d17493518126b0ca2f 100644 (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 (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")) {
-                       tech_pvt->rtp_bugs |= RTP_BUG_SONUS_SEND_INVALID_TIMESTAMP_2833;
-                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, 
-                                                         "Hello,\nI see you have a Sonus!\n"
-                                                         "FYI, Sonus cannot follow the RFC on the proper way to send DTMF.\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"
-                                                         );
+
+               if (tech_pvt->profile->auto_rtp_bugs & RTP_BUG_CISCO_SKIP_MARK_BIT_2833) {
+
+                       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 (tech_pvt->profile->auto_rtp_bugs & RTP_BUG_SONUS_SEND_INVALID_TIMESTAMP_2833) {
+                       if (strstr(tech_pvt->origin, "Sonus_UAC")) {
+                               tech_pvt->rtp_bugs |= RTP_BUG_SONUS_SEND_INVALID_TIMESTAMP_2833;
+                               switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_WARNING, 
+                                                                 "Hello,\nI see you have a Sonus!\n"
+                                                                 "FYI, Sonus cannot follow the RFC on the proper way to send DTMF.\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"
+                                                                 );
+                       }
                }
        }