]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
update
authorAnthony Minessale <anthony.minessale@gmail.com>
Mon, 21 Jul 2008 16:40:28 +0000 (16:40 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Mon, 21 Jul 2008 16:40:28 +0000 (16:40 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@9122 d0543943-73ff-0310-b7d9-9358b9ac24b2

conf/sip_profiles/internal.xml
src/mod/endpoints/mod_sofia/mod_sofia.c
src/mod/endpoints/mod_sofia/mod_sofia.h
src/mod/endpoints/mod_sofia/sofia.c
src/mod/endpoints/mod_sofia/sofia_glue.c

index b6027f333f7f9a0a5c8447d3dc249f131fab06ed..5563bf0bf1ec047078af28f6297df8817419e247 100644 (file)
     <!--<param name="disable-transfer" value="true"/>-->
     <!--<param name="disable-register" value="true"/>-->
     <!--<param name="enable-3pcc" value="true"/>-->
-
+    <!-- use stun when specified (default is true) -->
+    <!--<param name="stun-enabled" value="true"/>-->
+    <!-- use stun when specified (default is true) -->
+    <!-- set to true to have the profile determine stun is not useful and turn it off globally-->
+    <!--<param name="stun-auto-disable" value="true"/>-->
   </settings>
 </profile>
 
index 9ed49ff392151a47971612ac00150fe57179fec2..9a82cd0574aee18636723c9a5435e33660a6e7ac 100644 (file)
@@ -1201,22 +1201,22 @@ static switch_status_t cmd_status(char **argv, int argc, switch_stream_handle_t
                                switch_assert(gp->state < REG_STATE_LAST);
 
                                stream->write_function(stream, "%s\n", line);
-                               stream->write_function(stream, "Name    \t%s\n", switch_str_nil(gp->name));
-                               stream->write_function(stream, "Scheme  \t%s\n", switch_str_nil(gp->register_scheme));
-                               stream->write_function(stream, "Realm   \t%s\n", switch_str_nil(gp->register_realm));
-                               stream->write_function(stream, "Username\t%s\n", switch_str_nil(gp->register_username));
-                               stream->write_function(stream, "Password\t%s\n", switch_strlen_zero(gp->register_password) ? "no" : "yes");
-                               stream->write_function(stream, "From    \t%s\n", switch_str_nil(gp->register_from));
-                               stream->write_function(stream, "Contact \t%s\n", switch_str_nil(gp->register_contact));
-                               stream->write_function(stream, "To      \t%s\n", switch_str_nil(gp->register_to));
-                               stream->write_function(stream, "Proxy   \t%s\n", switch_str_nil(gp->register_proxy));
-                               stream->write_function(stream, "Context \t%s\n", switch_str_nil(gp->register_context));
-                               stream->write_function(stream, "Expires \t%s\n", switch_str_nil(gp->expires_str));
-                               stream->write_function(stream, "Freq    \t%d\n", gp->freq);
-                               stream->write_function(stream, "Ping    \t%d\n", gp->ping);
-                               stream->write_function(stream, "PingFreq\t%d\n", gp->ping_freq);
-                               stream->write_function(stream, "State   \t%s\n", sofia_state_names[gp->state]);
-                               stream->write_function(stream, "Status  \t%s%s\n", status_names[gp->status], gp->pinging ? " (ping)" : "");
+                               stream->write_function(stream, "Name    \t\t%s\n", switch_str_nil(gp->name));
+                               stream->write_function(stream, "Scheme  \t\t%s\n", switch_str_nil(gp->register_scheme));
+                               stream->write_function(stream, "Realm   \t\t%s\n", switch_str_nil(gp->register_realm));
+                               stream->write_function(stream, "Username\t\t%s\n", switch_str_nil(gp->register_username));
+                               stream->write_function(stream, "Password\t\t%s\n", switch_strlen_zero(gp->register_password) ? "no" : "yes");
+                               stream->write_function(stream, "From    \t\t%s\n", switch_str_nil(gp->register_from));
+                               stream->write_function(stream, "Contact \t\t%s\n", switch_str_nil(gp->register_contact));
+                               stream->write_function(stream, "To      \t\t%s\n", switch_str_nil(gp->register_to));
+                               stream->write_function(stream, "Proxy   \t\t%s\n", switch_str_nil(gp->register_proxy));
+                               stream->write_function(stream, "Context \t\t%s\n", switch_str_nil(gp->register_context));
+                               stream->write_function(stream, "Expires \t\t%s\n", switch_str_nil(gp->expires_str));
+                               stream->write_function(stream, "Freq    \t\t%d\n", gp->freq);
+                               stream->write_function(stream, "Ping    \t\t%d\n", gp->ping);
+                               stream->write_function(stream, "PingFreq\t\t%d\n", gp->ping_freq);
+                               stream->write_function(stream, "State   \t\t%s\n", sofia_state_names[gp->state]);
+                               stream->write_function(stream, "Status  \t\t%s%s\n", status_names[gp->status], gp->pinging ? " (ping)" : "");
                                stream->write_function(stream, "%s\n", line);
                                sofia_reg_release_gateway(gp);
                        } else {
@@ -1227,46 +1227,48 @@ static switch_status_t cmd_status(char **argv, int argc, switch_stream_handle_t
 
                        if ((profile = sofia_glue_find_profile(argv[1]))) {
                                stream->write_function(stream, "%s\n", line);
-                               stream->write_function(stream, "Name          \t%s\n", switch_str_nil(argv[1]));
-                               stream->write_function(stream, "Domain Name   \t%s\n", switch_str_nil(profile->domain_name));
+                               stream->write_function(stream, "Name          \t\t%s\n", switch_str_nil(argv[1]));
+                               stream->write_function(stream, "Domain Name   \t\t%s\n", switch_str_nil(profile->domain_name));
                                if (strcasecmp(argv[1], profile->name)) {
-                                       stream->write_function(stream, "Alias Of      \t%s\n", switch_str_nil(profile->name));
+                                       stream->write_function(stream, "Alias Of      \t\t%s\n", switch_str_nil(profile->name));
                                }
-                               stream->write_function(stream, "DBName        \t%s\n", switch_str_nil(profile->dbname));
-                               stream->write_function(stream, "Dialplan      \t%s\n", switch_str_nil(profile->dialplan));
-                               stream->write_function(stream, "Context       \t%s\n", switch_str_nil(profile->context));
-                               stream->write_function(stream, "RTP-IP        \t%s\n", switch_str_nil(profile->rtpip));
+                               stream->write_function(stream, "DBName        \t\t%s\n", switch_str_nil(profile->dbname));
+                               stream->write_function(stream, "Dialplan      \t\t%s\n", switch_str_nil(profile->dialplan));
+                               stream->write_function(stream, "Context       \t\t%s\n", switch_str_nil(profile->context));
+                               stream->write_function(stream, "RTP-IP        \t\t%s\n", switch_str_nil(profile->rtpip));
                                if (profile->extrtpip) {
-                                       stream->write_function(stream, "Ext-RTP-IP    \t%s\n", profile->extrtpip);
+                                       stream->write_function(stream, "Ext-RTP-IP    \t\t%s\n", profile->extrtpip);
                                }
 
-                               stream->write_function(stream, "SIP-IP        \t%s\n", switch_str_nil(profile->sipip));
+                               stream->write_function(stream, "SIP-IP        \t\t%s\n", switch_str_nil(profile->sipip));
                                if (profile->extsipip) {
-                                       stream->write_function(stream, "Ext-SIP-IP    \t%s\n", profile->extsipip);
+                                       stream->write_function(stream, "Ext-SIP-IP    \t\t%s\n", profile->extsipip);
                                }
-                               stream->write_function(stream, "URL           \t%s\n", switch_str_nil(profile->url));
-                               stream->write_function(stream, "BIND-URL      \t%s\n", switch_str_nil(profile->bindurl));
+                               stream->write_function(stream, "URL           \t\t%s\n", switch_str_nil(profile->url));
+                               stream->write_function(stream, "BIND-URL      \t\t%s\n", switch_str_nil(profile->bindurl));
                                if (sofia_test_pflag(profile, PFLAG_TLS)) {
-                                       stream->write_function(stream, "TLS-URL      \t%s\n", switch_str_nil(profile->tls_url));
-                                       stream->write_function(stream, "TLS-BIND-URL    %s\n", switch_str_nil(profile->tls_bindurl));
+                                       stream->write_function(stream, "TLS-URL      \t\t%s\n", switch_str_nil(profile->tls_url));
+                                       stream->write_function(stream, "TLS-BIND-URL      \t%s\n", switch_str_nil(profile->tls_bindurl));
                                }
-                               stream->write_function(stream, "HOLD-MUSIC    \t%s\n", switch_str_nil(profile->hold_music));
-                               stream->write_function(stream, "CODECS        \t%s\n", switch_str_nil(profile->codec_string));
-                               stream->write_function(stream, "TEL-EVENT     \t%d\n", profile->te);
+                               stream->write_function(stream, "HOLD-MUSIC    \t\t%s\n", switch_strlen_zero(profile->hold_music) ? "NONE" : profile->hold_music);
+                               stream->write_function(stream, "CODECS        \t\t%s\n", switch_str_nil(profile->codec_string));
+                               stream->write_function(stream, "TEL-EVENT     \t\t%d\n", profile->te);
                                if (profile->dtmf_type == DTMF_2833) {
-                                       stream->write_function(stream, "DTMF-MODE     \trfc2833\n");
+                                       stream->write_function(stream, "DTMF-MODE     \t\trfc2833\n");
                                } else if (profile->dtmf_type == DTMF_INFO) {
-                                       stream->write_function(stream, "DTMF-MODE     \tinfo\n");
+                                       stream->write_function(stream, "DTMF-MODE     \t\tinfo\n");
                                } else {
-                                       stream->write_function(stream, "DTMF-MODE     \tnone\n");
+                                       stream->write_function(stream, "DTMF-MODE     \t\tnone\n");
                                }
-                               stream->write_function(stream, "CNG           \t%d\n", profile->cng_pt);
-                               stream->write_function(stream, "SESSION-TO    \t%d\n", profile->session_timeout);
-                               stream->write_function(stream, "MAX-DIALOG    \t%d\n", profile->max_proceeding);
-                               stream->write_function(stream, "NOMEDIA       \t%s\n", switch_test_flag(profile, TFLAG_INB_NOMEDIA) ? "true" : "false");
-                               stream->write_function(stream, "LATE-NEG      \t%s\n", switch_test_flag(profile, TFLAG_LATE_NEGOTIATION) ? "true" : "false");
-                               stream->write_function(stream, "PROXY-MEDIA   \t%s\n", switch_test_flag(profile, TFLAG_PROXY_MEDIA) ? "true" : "false");
-                               stream->write_function(stream, "AGGRESSIVENAT \t%s\n", sofia_test_pflag(profile, PFLAG_AGGRESSIVE_NAT_DETECTION) ? "true" : "false");
+                               stream->write_function(stream, "CNG           \t\t%d\n", profile->cng_pt);
+                               stream->write_function(stream, "SESSION-TO    \t\t%d\n", profile->session_timeout);
+                               stream->write_function(stream, "MAX-DIALOG    \t\t%d\n", profile->max_proceeding);
+                               stream->write_function(stream, "NOMEDIA       \t\t%s\n", switch_test_flag(profile, TFLAG_INB_NOMEDIA) ? "true" : "false");
+                               stream->write_function(stream, "LATE-NEG      \t\t%s\n", switch_test_flag(profile, TFLAG_LATE_NEGOTIATION) ? "true" : "false");
+                               stream->write_function(stream, "PROXY-MEDIA   \t\t%s\n", switch_test_flag(profile, TFLAG_PROXY_MEDIA) ? "true" : "false");
+                               stream->write_function(stream, "AGGRESSIVENAT \t\t%s\n", sofia_test_pflag(profile, PFLAG_AGGRESSIVE_NAT_DETECTION) ? "true" : "false");
+                               stream->write_function(stream, "STUN_ENABLED \t\t%s\n", sofia_test_pflag(profile, PFLAG_STUN_ENABLED) ? "true" : "false");
+                               stream->write_function(stream, "STUN_AUTO_DISABLE \t%s\n", sofia_test_pflag(profile, PFLAG_STUN_AUTO_DISABLE) ? "true" : "false");
                                stream->write_function(stream, "\nRegistrations:\n%s\n", line);
 
                                cb.profile = profile;
@@ -1376,6 +1378,37 @@ static switch_status_t cmd_profile(char **argv, int argc, switch_stream_handle_t
                goto done;
        }
 
+       if (!strcasecmp(argv[1], "stun-auto-disable")) {
+               if (argv[2]) {
+                       int is_true = switch_true(argv[2]);
+                       if (is_true) {
+                               profile->pflags |= PFLAG_STUN_AUTO_DISABLE;
+                       } else {
+                               profile->pflags &= ~PFLAG_STUN_AUTO_DISABLE;
+                       }
+               }
+
+               stream->write_function(stream, "+OK stun-auto-disable=%s", (profile->pflags & PFLAG_STUN_AUTO_DISABLE) ? "true" : "false");
+               
+               goto done;
+       }
+
+       if (!strcasecmp(argv[1], "stun-enabled")) {
+               if (argv[2]) {
+                       int is_true = switch_true(argv[2]);
+                       if (is_true) {
+                               profile->pflags |= PFLAG_STUN_ENABLED;
+                       } else {
+                               profile->pflags &= ~PFLAG_STUN_ENABLED;
+                       }
+               }
+
+               stream->write_function(stream, "+OK stun-enabled=%s", (profile->pflags & PFLAG_STUN_ENABLED) ? "true" : "false");
+               
+               goto done;
+       }
+
+
        if (!strcasecmp(argv[1], "rescan")) {
 
                if (argc > 2 && !strcasecmp(argv[2], "reloadxml")) {
index 48779b0aed494d5462209f5102cc2b30335792d1..3525ed65e52e01ec1e4739237d3ad6c13cf38a17 100644 (file)
@@ -157,7 +157,9 @@ typedef enum {
        PFLAG_3PCC = (1 << 23),
        PFLAG_DISABLE_RTP_AUTOADJ = (1 << 24),
        PFLAG_DISABLE_SRTP_AUTH = (1 << 25),
-       PFLAG_FUNNY_STUN = (1 << 26)
+       PFLAG_FUNNY_STUN = (1 << 26),
+       PFLAG_STUN_ENABLED = (1 << 27),
+       PFLAG_STUN_AUTO_DISABLE = (1 << 28)
 } PFLAGS;
 
 typedef enum {
index 61636a7919789b1841104784eddc5dc771d46100..9fd82ecde8d30be2d3b7236a44d6a32f03821856 100644 (file)
@@ -982,6 +982,8 @@ switch_status_t reconfig_sofia(sofia_profile_t *profile)
 
                        /* you could change profile->foo here if it was a minor change like context or dialplan ... */
                        profile->rport_level = 1; /* default setting */
+                       profile->acl_count = 0;
+                       profile->pflags |= PFLAG_STUN_ENABLED;
 
                        if ((settings = switch_xml_child(xprofile, "settings"))) {
                                for (param = switch_xml_child(settings, "param"); param; param = param->next) {
@@ -1053,6 +1055,36 @@ switch_status_t reconfig_sofia(sofia_profile_t *profile)
                                                } else {
                                                        profile->pflags &= ~PFLAG_FUNNY_STUN; 
                                                }
+                                       } else if (!strcasecmp(var, "stun-enabled")) {
+                                               if (switch_true(val)) {
+                                                       profile->pflags |= PFLAG_STUN_ENABLED;
+                                               } else {
+                                                       profile->pflags &= ~PFLAG_STUN_ENABLED; 
+                                               }
+                                       } else if (!strcasecmp(var, "stun-auto-disable")) {
+                                               if (switch_true(val)) {
+                                                       profile->pflags |= PFLAG_STUN_AUTO_DISABLE;
+                                               } else {
+                                                       profile->pflags &= ~PFLAG_STUN_AUTO_DISABLE; 
+                                               }
+                                       } else if (!strcasecmp(var, "apply-nat-acl")) {
+                                               if (profile->acl_count < SOFIA_MAX_ACL) {
+                                                       profile->nat_acl[profile->nat_acl_count++] = switch_core_strdup(profile->pool, val);
+                                               } else {
+                                                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Max acl records of %d reached\n", SOFIA_MAX_ACL);
+                                               }
+                                       } else if (!strcasecmp(var, "apply-inbound-acl")) {
+                                               if (profile->acl_count < SOFIA_MAX_ACL) {
+                                                       profile->acl[profile->acl_count++] = switch_core_strdup(profile->pool, val);
+                                               } else {
+                                                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Max acl records of %d reached\n", SOFIA_MAX_ACL);
+                                               }
+                                       } else if (!strcasecmp(var, "apply-register-acl")) {
+                                               if (profile->reg_acl_count < SOFIA_MAX_ACL) {
+                                                       profile->reg_acl[profile->reg_acl_count++] = switch_core_strdup(profile->pool, val);
+                                               } else {
+                                                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Max acl records of %d reached\n", SOFIA_MAX_ACL);
+                                               }
                                        } else if (!strcasecmp(var, "rfc2833-pt")) {
                                                profile->te = (switch_payload_t) atoi(val);
                                        } else if (!strcasecmp(var, "cng-pt")) {
@@ -1173,6 +1205,7 @@ switch_status_t reconfig_sofia(sofia_profile_t *profile)
                                }
                        }
                        
+
                        if ((gateways_tag = switch_xml_child(xprofile, "gateways"))) {
                                parse_gateways(profile, gateways_tag);
                        }
@@ -1333,6 +1366,7 @@ switch_status_t config_sofia(int reload, char *profile_name)
                                profile->tls_version = 0;
                                profile->mflags = MFLAG_REFER | MFLAG_REGISTER;
                                profile->rport_level = 1;
+                               profile->pflags |= PFLAG_STUN_ENABLED;
                                
                                for (param = switch_xml_child(settings, "param"); param; param = param->next) {
                                        char *var = (char *) switch_xml_attr_soft(param, "name");
@@ -1392,6 +1426,18 @@ switch_status_t config_sofia(int reload, char *profile_name)
                                                } else {
                                                        profile->pflags &= ~PFLAG_FUNNY_STUN; 
                                                }
+                                       } else if (!strcasecmp(var, "stun-enabled")) {
+                                               if (switch_true(val)) {
+                                                       profile->pflags |= PFLAG_STUN_ENABLED;
+                                               } else {
+                                                       profile->pflags &= ~PFLAG_STUN_ENABLED; 
+                                               }
+                                       } else if (!strcasecmp(var, "stun-auto-disable")) {
+                                               if (switch_true(val)) {
+                                                       profile->pflags |= PFLAG_STUN_AUTO_DISABLE;
+                                               } else {
+                                                       profile->pflags &= ~PFLAG_STUN_AUTO_DISABLE; 
+                                               }
                                        } else if (!strcasecmp(var, "rfc2833-pt")) {
                                                profile->te = (switch_payload_t) atoi(val);
                                        } else if (!strcasecmp(var, "cng-pt")) {
@@ -1680,6 +1726,10 @@ switch_status_t config_sofia(int reload, char *profile_name)
                                        profile->dialplan = switch_core_strdup(profile->pool, "XML");
                                }
 
+                               if (!profile->context) {
+                                       profile->context = switch_core_strdup(profile->pool, "default");
+                               }
+
                                if (!profile->sipdomain) {
                                        profile->sipdomain = switch_core_strdup(profile->pool, profile->sipip);
                                }
index e83f60b6d7c78ceb68e9ebca502a34de980e6b93..38bd7da8dfc66b48bf948cfa6ec1b68e3656cbfb 100644 (file)
@@ -442,6 +442,12 @@ switch_status_t sofia_glue_ext_address_lookup(sofia_profile_t *profile, private_
 
        if (!strncasecmp(sourceip, "stun:", 5)) {
                char *p;
+
+               if (!(profile->pflags & PFLAG_STUN_ENABLED)) {
+                       *ip = switch_core_strdup(pool, tech_pvt->profile->rtpip);
+                       return SWITCH_STATUS_SUCCESS;
+               }
+               
                stun_ip = strdup(sourceip + 5);
 
                if ((p = strchr(stun_ip, ':'))) {
@@ -483,6 +489,10 @@ switch_status_t sofia_glue_ext_address_lookup(sofia_profile_t *profile, private_
                if (tech_pvt) {
                        if (myport == *port && !strcmp(*ip, tech_pvt->profile->rtpip)) {
                                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Stun Not Required ip and port match. [%s]:[%d]\n", *ip, *port);
+                               if (profile->pflags & PFLAG_STUN_AUTO_DISABLE) {
+                                       profile->pflags &= ~PFLAG_STUN_ENABLED;
+                                       switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Stun completely disabled.\n");
+                               }
                        } else {
                                tech_pvt->stun_ip = switch_core_session_strdup(tech_pvt->session, stun_ip);
                                tech_pvt->stun_port = stun_port;