diff --git a/conf/sip_profiles/internal.xml b/conf/sip_profiles/internal.xml index b6027f333f..5563bf0bf1 100644 --- a/conf/sip_profiles/internal.xml +++ b/conf/sip_profiles/internal.xml @@ -122,7 +122,11 @@ - + + + + + diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.c b/src/mod/endpoints/mod_sofia/mod_sofia.c index 9ed49ff392..9a82cd0574 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.c +++ b/src/mod/endpoints/mod_sofia/mod_sofia.c @@ -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")) { diff --git a/src/mod/endpoints/mod_sofia/mod_sofia.h b/src/mod/endpoints/mod_sofia/mod_sofia.h index 48779b0aed..3525ed65e5 100644 --- a/src/mod/endpoints/mod_sofia/mod_sofia.h +++ b/src/mod/endpoints/mod_sofia/mod_sofia.h @@ -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 { diff --git a/src/mod/endpoints/mod_sofia/sofia.c b/src/mod/endpoints/mod_sofia/sofia.c index 61636a7919..9fd82ecde8 100644 --- a/src/mod/endpoints/mod_sofia/sofia.c +++ b/src/mod/endpoints/mod_sofia/sofia.c @@ -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); } diff --git a/src/mod/endpoints/mod_sofia/sofia_glue.c b/src/mod/endpoints/mod_sofia/sofia_glue.c index e83f60b6d7..38bd7da8df 100644 --- a/src/mod/endpoints/mod_sofia/sofia_glue.c +++ b/src/mod/endpoints/mod_sofia/sofia_glue.c @@ -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;