]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
update
authorAnthony Minessale <anthony.minessale@gmail.com>
Fri, 18 Jul 2008 20:25:39 +0000 (20:25 +0000)
committerAnthony Minessale <anthony.minessale@gmail.com>
Fri, 18 Jul 2008 20:25:39 +0000 (20:25 +0000)
git-svn-id: http://svn.freeswitch.org/svn/freeswitch/trunk@9096 d0543943-73ff-0310-b7d9-9358b9ac24b2

src/include/switch_rtp.h
src/mod/endpoints/mod_sofia/mod_sofia.h
src/mod/endpoints/mod_sofia/sofia_glue.c
src/switch_rtp.c

index 7b017edab6e0a8368cd747cf51e1f5c9ab082e41..a30c8b5d07152b4694dfb3b1daa35d5d61ed2f8f 100644 (file)
@@ -418,7 +418,8 @@ SWITCH_DECLARE(void) switch_rtp_set_cng_pt(switch_rtp_t *rtp_session, switch_pay
 */
 SWITCH_DECLARE(void *) switch_rtp_get_private(switch_rtp_t *rtp_session);
 
-SWITCH_DECLARE(switch_status_t) switch_rtp_activate_stun_ping(switch_rtp_t *rtp_session, const char *stun_ip, uint32_t packet_count, switch_bool_t funny);
+SWITCH_DECLARE(switch_status_t) switch_rtp_activate_stun_ping(switch_rtp_t *rtp_session, const char *stun_ip, switch_port_t stun_port,
+                                                                                                                         uint32_t packet_count, switch_bool_t funny);
 
 /*!
   \}
index 024b9f6077e3f0c42e0318c5c452933bf2927289..48779b0aed494d5462209f5102cc2b30335792d1 100644 (file)
@@ -426,6 +426,7 @@ struct private_object {
        char *record_route;
        char *extrtpip;
        char *stun_ip;
+       switch_port_t stun_port;
        uint32_t stun_flags;
        int crypto_tag;
        unsigned char local_raw_key[SWITCH_RTP_MAX_CRYPTO_LEN];
index f8cf923382382bb831ca11c435a6a352e8354d13..880e3e7f2b58d93e89bb20de66a26cf966acf387 100644 (file)
@@ -433,24 +433,38 @@ switch_status_t sofia_glue_ext_address_lookup(sofia_profile_t *profile, private_
        switch_port_t myport = *port;
        const char *var;
        int funny = 0;
+       switch_port_t stun_port = SWITCH_STUN_DEFAULT_PORT;
+       char *stun_ip = NULL;
 
        if (!sourceip) {
                return status;
        }
 
        if (!strncasecmp(sourceip, "stun:", 5)) {
-               char *stun_ip = sourceip + 5;
-               if (!stun_ip) {
+               char *p;
+               stun_ip = strdup(sourceip + 5);
+
+               if ((p = strchr(stun_ip, ':'))) {
+                       int iport;
+                       *p++ = '\0';
+                       iport = atoi(p);
+                       if (iport > 0) {
+                               stun_port = iport;
+                       }
+               }
+
+               if (switch_strlen_zero(stun_ip)) {
                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Stun Failed! NO STUN SERVER\n");
-                       return status;
+                       goto out;
                }
+
                for (x = 0; x < 5; x++) {
                        if ((profile->pflags & PFLAG_FUNNY_STUN) || 
                                (tech_pvt && (var = switch_channel_get_variable(tech_pvt->channel, "funny_stun")) && switch_true(var))) {
                                error = "funny";
                                funny++;
                        }
-                       if ((status = switch_stun_lookup(ip, port, stun_ip, SWITCH_STUN_DEFAULT_PORT, &error, pool)) != SWITCH_STATUS_SUCCESS) {
+                       if ((status = switch_stun_lookup(ip, port, stun_ip, stun_port, &error, pool)) != SWITCH_STATUS_SUCCESS) {
                                switch_yield(100000);
                        } else {
                                break;
@@ -458,18 +472,20 @@ switch_status_t sofia_glue_ext_address_lookup(sofia_profile_t *profile, private_
                }
                if (status != SWITCH_STATUS_SUCCESS) {
                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Stun Failed! %s:%d [%s]\n", stun_ip, SWITCH_STUN_DEFAULT_PORT, error);
-                       return status;
+                       goto out;
                }
                if (!*ip) {
                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Stun Failed! No IP returned\n");
-                       return SWITCH_STATUS_FALSE;
+                       goto out;
                }
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Stun Success [%s]:[%d]\n", *ip, *port);
+               status = SWITCH_STATUS_SUCCESS;
                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);
                        } else {
                                tech_pvt->stun_ip = switch_core_session_strdup(tech_pvt->session, stun_ip);
+                               tech_pvt->stun_port = stun_port;
                                tech_pvt->stun_flags |= STUN_FLAG_SET;
                                if (funny) {
                                        tech_pvt->stun_flags |= STUN_FLAG_FUNNY;
@@ -478,8 +494,14 @@ switch_status_t sofia_glue_ext_address_lookup(sofia_profile_t *profile, private_
                }
        } else {
                *ip = sourceip;
+               status = SWITCH_STATUS_SUCCESS;
        }
-       return SWITCH_STATUS_SUCCESS;
+
+ out:
+
+       switch_safe_free(stun_ip);
+
+       return status;
 }
 
 
@@ -1804,7 +1826,8 @@ switch_status_t sofia_glue_activate_rtp(private_object_t *tech_pvt, switch_rtp_f
 
                if (stun_ping) {
                        switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "Setting stun ping to %s:%d\n", tech_pvt->stun_ip, stun_ping);
-                       switch_rtp_activate_stun_ping(tech_pvt->rtp_session, tech_pvt->stun_ip, stun_ping, (tech_pvt->stun_flags & STUN_FLAG_FUNNY) ? 1 : 0);
+                       switch_rtp_activate_stun_ping(tech_pvt->rtp_session, tech_pvt->stun_ip, tech_pvt->stun_port, 
+                                                                                 stun_ping, (tech_pvt->stun_flags & STUN_FLAG_FUNNY) ? 1 : 0);
                }
 
                if ((val = switch_channel_get_variable(tech_pvt->channel, "jitterbuffer_msec"))) {
index 6243d75110221d9f3cc5112621bd48cce26bf86d..a59f96d4c6f97d636693ce7a6595d89e6f439922 100644 (file)
@@ -194,6 +194,7 @@ struct switch_rtp {
        int reading;
        int writing;
        char *stun_ip;
+       switch_port_t stun_port;
 };
 
 static int global_init = 0;
@@ -890,11 +891,12 @@ SWITCH_DECLARE(void) switch_rtp_set_cng_pt(switch_rtp_t *rtp_session, switch_pay
        rtp_session->cng_pt = pt;
 }
 
-SWITCH_DECLARE(switch_status_t) switch_rtp_activate_stun_ping(switch_rtp_t *rtp_session, const char *stun_ip, uint32_t packet_count, switch_bool_t funny)
+SWITCH_DECLARE(switch_status_t) switch_rtp_activate_stun_ping(switch_rtp_t *rtp_session, const char *stun_ip, switch_port_t stun_port,
+                                                                                                                         uint32_t packet_count, switch_bool_t funny)
 {
        
        if (switch_sockaddr_info_get(&rtp_session->remote_stun_addr, stun_ip, SWITCH_UNSPEC, 
-                                                                SWITCH_STUN_DEFAULT_PORT, 0, rtp_session->pool) != SWITCH_STATUS_SUCCESS || !rtp_session->remote_stun_addr) {
+                                                                rtp_session->stun_port, 0, rtp_session->pool) != SWITCH_STATUS_SUCCESS || !rtp_session->remote_stun_addr) {
                
                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Error resolving stun ping addr\n");
                return SWITCH_STATUS_FALSE;
@@ -904,6 +906,8 @@ SWITCH_DECLARE(switch_status_t) switch_rtp_activate_stun_ping(switch_rtp_t *rtp_
                rtp_session->funny_stun++;
        }
 
+       rtp_session->stun_port = stun_port;
+
        rtp_session->default_stuncount = packet_count;
 
        rtp_session->stun_ip = switch_core_strdup(rtp_session->pool, stun_ip);