From fb3ba90ed24c2040bef6d82e4f54e8cb72e40bd5 Mon Sep 17 00:00:00 2001
From: Tristan Matthews <le.businessman@gmail.com>
Date: Thu, 19 Apr 2012 01:20:35 -0400
Subject: [PATCH] Revert "#9871: Fallback on normal upd transport when stun
 resolution fails"

This reverts commit 06a9efeef50d61ab4492dd6fa051ed119d3bdac8.
---
 daemon/src/sip/siptransport.cpp | 55 +++++++++++++++++----------------
 1 file changed, 28 insertions(+), 27 deletions(-)

diff --git a/daemon/src/sip/siptransport.cpp b/daemon/src/sip/siptransport.cpp
index 55f91e7878..e45e8c6e7e 100644
--- a/daemon/src/sip/siptransport.cpp
+++ b/daemon/src/sip/siptransport.cpp
@@ -141,12 +141,7 @@ std::vector<std::string> SipTransport::getAllIpInterface()
 }
 
 SipTransport::SipTransport(pjsip_endpoint *endpt, pj_caching_pool *cp, pj_pool_t *pool) : transportMap_(), stunSocketMap_(), cp_(cp), pool_(pool), endpt_(endpt)
-{
-}
-
-SipTransport::~SipTransport()
-{
-}
+{}
 
 pj_bool_t
 stun_sock_on_status_cb(pj_stun_sock * /*stun_sock*/, pj_stun_sock_op op,
@@ -192,10 +187,15 @@ stun_sock_on_rx_data_cb(pj_stun_sock * /*stun_sock*/, void * /*pkt*/,
 
 pj_status_t SipTransport::createStunResolver(pj_str_t serverName, pj_uint16_t port)
 {
-    pj_stun_config stunCfg;
-    pj_stun_config_init(&stunCfg, &cp_->factory, 0, pjsip_endpt_get_ioqueue(endpt_), pjsip_endpt_get_timer_heap(endpt_));
+    std::string stunResolverName(serverName.ptr, serverName.slen);
+    if (stunSocketMap_.find(stunResolverName) != stunSocketMap_.end()) {
+        DEBUG("SipTransport: %s already added", stunResolverName.c_str());
+        return PJ_SUCCESS;
+    }
 
-    DEBUG("***************** Create Stun Resolver *********************");
+    pj_stun_config stunCfg;
+    pj_stun_config_init(&stunCfg, &cp_->factory, 0,
+            pjsip_endpt_get_ioqueue(endpt_), pjsip_endpt_get_timer_heap(endpt_));
 
     static const pj_stun_sock_cb stun_sock_cb = {
         stun_sock_on_rx_data_cb,
@@ -203,27 +203,30 @@ pj_status_t SipTransport::createStunResolver(pj_str_t serverName, pj_uint16_t po
         stun_sock_on_status_cb
     };
 
-    pj_stun_sock *stun_sock;
-    std::string stunResolverName(serverName.ptr, serverName.slen);
-    pj_status_t status = pj_stun_sock_create(&stunCfg, stunResolverName.c_str(), pj_AF_INET(), &stun_sock_cb, NULL, NULL, &stun_sock);
-
-    // store socket inside list
-    DEBUG("     insert %s resolver in map", stunResolverName.c_str());
-    stunSocketMap_.insert(std::pair<std::string, pj_stun_sock *>(stunResolverName, stun_sock));
+    pj_stun_sock *stun_sock = NULL;
+    pj_status_t status = pj_stun_sock_create(&stunCfg,
+            stunResolverName.c_str(), pj_AF_INET(), &stun_sock_cb, NULL, NULL,
+            &stun_sock);
 
     if (status != PJ_SUCCESS) {
         char errmsg[PJ_ERR_MSG_SIZE];
         pj_strerror(status, errmsg, sizeof(errmsg));
-        ERROR("SipTransport: Error creating STUN socket for %.*s: %s", (int) serverName.slen, serverName.ptr, errmsg);
+        ERROR("SipTransport: Error creating STUN socket for %.*s: %s",
+                (int) serverName.slen, serverName.ptr, errmsg);
         return status;
     }
 
     status = pj_stun_sock_start(stun_sock, &serverName, port, NULL);
 
-    if (status != PJ_SUCCESS) {
+    // store socket inside list
+    if (status == PJ_SUCCESS) {
+        DEBUG("SipTransport: Adding %s resolver", stunResolverName.c_str());
+        stunSocketMap_[stunResolverName] = stun_sock;
+    } else {
         char errmsg[PJ_ERR_MSG_SIZE];
         pj_strerror(status, errmsg, sizeof(errmsg));
-        DEBUG("SipTransport: Error starting STUN socket for %.*s: %s", (int) serverName.slen, serverName.ptr, errmsg);
+        DEBUG("SipTransport: Error starting STUN socket for %.*s: %s",
+                (int) serverName.slen, serverName.ptr, errmsg);
         pj_stun_sock_destroy(stun_sock);
     }
 
@@ -237,13 +240,10 @@ pj_status_t SipTransport::destroyStunResolver(const std::string &serverName)
 
     DEBUG("***************** Destroy Stun Resolver *********************");
 
-    std::map<std::string, pj_stun_sock *>::iterator iter;
-    for(iter = stunSocketMap_.begin(); iter != stunSocketMap_.end(); iter++)
-        DEBUG("stun reslover: %s", iter->first.c_str());
-
     if (it != stunSocketMap_.end()) {
         DEBUG("SipTransport: Deleting stun resolver %s", it->first.c_str());
-        pj_stun_sock_destroy(it->second);
+        if (it->second)
+            pj_stun_sock_destroy(it->second);
         stunSocketMap_.erase(it);
     }
 
@@ -355,8 +355,6 @@ void SipTransport::createSipTransport(SIPAccount *account)
         account->transport_ = transport;
     } else if (account->isStunEnabled()) {
         pjsip_transport *transport = createStunTransport(account->getStunServerName(), account->getStunPort());
-        if(transport == NULL)
-            transport = createUdpTransport(account->getLocalInterface(), account->getLocalPort());
         account->transport_ = transport;
     }
     else {
@@ -472,7 +470,10 @@ SipTransport::createUdpTransport(const std::string &interface, unsigned int port
 
 pjsip_tpselector *SipTransport::initTransportSelector(pjsip_transport *transport, pj_pool_t *tp_pool) const
 {
-    assert(transport);
+    if (!transport) {
+        ERROR("SipTransport: transport is not initialized");
+        return NULL;
+    }
     pjsip_tpselector *tp = (pjsip_tpselector *) pj_pool_zalloc(tp_pool, sizeof(pjsip_tpselector));
     tp->type = PJSIP_TPSELECTOR_TRANSPORT;
     tp->u.transport = transport;
-- 
GitLab