Author: oej
Date: Thu Aug 21 08:23:04 2014
New Revision: 421670

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=421670
Log:
Failing. Over.

Modified:
    team/oej/pgtips-srv-and-outbound-stuff-1.8/channels/chan_sip.c
    team/oej/pgtips-srv-and-outbound-stuff-1.8/channels/sip/include/sip.h

Modified: team/oej/pgtips-srv-and-outbound-stuff-1.8/channels/chan_sip.c
URL: 
http://svnview.digium.com/svn/asterisk/team/oej/pgtips-srv-and-outbound-stuff-1.8/channels/chan_sip.c?view=diff&rev=421670&r1=421669&r2=421670
==============================================================================
--- team/oej/pgtips-srv-and-outbound-stuff-1.8/channels/chan_sip.c (original)
+++ team/oej/pgtips-srv-and-outbound-stuff-1.8/channels/chan_sip.c Thu Aug 21 
08:23:04 2014
@@ -3763,6 +3763,7 @@
         * check in case the scheduler gets behind or the clock is changed. */
        if ((diff <= 0) || (diff > pkt->retrans_stop_time)) {
                pkt->retrans_stop = 1;
+               ast_debug(4, "--- Retransmission stops here and now. Time limit 
exceeded\n");
        }
 
        /* Lock channel PVT */
@@ -6079,6 +6080,11 @@
 {
        /* Really delete */
        ast_debug(3, "Destroying registry entry for %s@%s\n", reg->username, 
reg->hostname);
+
+       if (reg->srvcontext) {          /* Free the list of SRV entries used by 
this registration */
+               ast_srv_context_free_list(reg->srvcontext);
+               ast_free(reg->srvcontext);
+       }
 
        if (reg->call) {
                /* Clear registry before destroying to ensure
@@ -13776,6 +13782,7 @@
         * Otherwise destroy it, as we have a timeout so we don't want it.
         */
        if (r->call) {
+               ast_debug(3, "  -- Removing dialog from registry entry %s\n", 
r->hostname);
                /* Unlink us, destroy old call.  Locking is not relevant here 
because all this happens
                   in the single SIP manager thread. */
                p = r->call;
@@ -13783,6 +13790,9 @@
                pvt_set_needdestroy(p, "registration timeout");
                /* Pretend to ACK anything just in case */
                __sip_pretend_ack(p);
+               /* Save away the DNS srv list so we don't forget where we are */
+               r->srvcontext = p->srvcontext;
+               p->srvcontext = NULL;
                sip_pvt_unlock(p);
 
                /* decouple the two objects */
@@ -13802,8 +13812,8 @@
                r->regstate = REG_STATE_FAILED;
        } else {
                r->regstate = REG_STATE_UNREGISTERED;
+               ast_log(LOG_NOTICE, "   -- Registration for '%s@%s' timed out, 
trying again (Attempt #%d)\n", r->username, r->hostname, r->regattempts);
                transmit_register(r, SIP_REGISTER, NULL, NULL);
-               ast_log(LOG_NOTICE, "   -- Registration for '%s@%s' timed out, 
trying again (Attempt #%d)\n", r->username, r->hostname, r->regattempts);
        }
        manager_event(EVENT_FLAG_SYSTEM, "Registry", "ChannelType: 
SIP\r\nUsername: %s\r\nDomain: %s\r\nStatus: %s\r\n", r->username, r->hostname, 
regstate2str(r->regstate));
        registry_unref(r, "unreffing registry_unref r");
@@ -13898,6 +13908,31 @@
                if (!(p = sip_alloc( r->callid, NULL, 0, SIP_REGISTER, NULL))) {
                        ast_log(LOG_WARNING, "Unable to allocate registration 
transaction (memory or socket error)\n");
                        return 0;
+               }
+               if (r->srvcontext) {
+                       char hostname[MAXHOSTNAMELEN];
+                       const char *host = &hostname[0];
+                       unsigned short port, prio, weight;
+
+                       /* We have an existing SRV list from a previously 
failed attempt. Let's reuse that one */
+                       /* This time we test the next SRV entry. */
+                       if(ast_srv_get_next_record(p->srvcontext, &host, &port, 
&prio, &weight)) {
+                               /* No more hosts to try. Let's give up and 
retry DNS again. */
+                               ast_srv_context_free_list(r->srvcontext);
+                               ast_free(r->srvcontext);
+                               dialog_unlink_all(p);
+                               p = dialog_unref(p, "unref dialog after 
unlink_all");
+                               ast_debug(3, " ---> No more SRV entries to play 
with. Giving up on REGISTER\n");
+                               return 0;
+                       } else {
+                               /* Let's try with another host */
+                               ast_string_field_set(p, hostname, host);
+                               dosrvlookup = FALSE;
+                               ast_sockaddr_set_port(&p->sa, port);
+                               ast_debug(3, "  ---> REGISTER SRV failover on 
domain %s to host %s port %d \n", r->hostname, host, port);
+                       }
+                       //p->srvcontext = r->srvcontext;
+                       //r->srvcontext = NULL;
                }
 
                /* reset tag to consistent value from registry */
@@ -29160,7 +29195,7 @@
                if (!ast_strlen_zero(peer->srvdomain)) {
                        if (peer->srvcontext) {
                                ast_srv_context_free_list(peer->srvcontext);
-                               free(peer->srvcontext);
+                               ast_free(peer->srvcontext);
                        }
                        peer->srvcontext = ast_srv_context_new();
                        if (peer->srvcontext == NULL) {

Modified: team/oej/pgtips-srv-and-outbound-stuff-1.8/channels/sip/include/sip.h
URL: 
http://svnview.digium.com/svn/asterisk/team/oej/pgtips-srv-and-outbound-stuff-1.8/channels/sip/include/sip.h?view=diff&rev=421670&r1=421669&r2=421670
==============================================================================
--- team/oej/pgtips-srv-and-outbound-stuff-1.8/channels/sip/include/sip.h 
(original)
+++ team/oej/pgtips-srv-and-outbound-stuff-1.8/channels/sip/include/sip.h Thu 
Aug 21 08:23:04 2014
@@ -1369,6 +1369,7 @@
        struct ast_sockaddr us;  /*!< Who the server thinks we are */
        int noncecount;         /*!< Nonce-count */
        char lastmsg[256];      /*!< Last Message sent/received */
+       struct srv_context *srvcontext;         /*!< SRV record list */
 };
 
 struct tcptls_packet {


-- 
_____________________________________________________________________
-- Bandwidth and Colocation Provided by http://www.api-digital.com --

svn-commits mailing list
To UNSUBSCRIBE or update options visit:
   http://lists.digium.com/mailman/listinfo/svn-commits

Reply via email to