Author: oej Date: Thu Aug 21 06:52:49 2014 New Revision: 421668 URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=421668 Log: Adding a touch of failover
Modified: team/oej/pgtips-srv-and-outbound-stuff-1.8/channels/chan_sip.c team/oej/pgtips-srv-and-outbound-stuff-1.8/main/srv.c 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=421668&r1=421667&r2=421668 ============================================================================== --- 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 06:52:49 2014 @@ -4445,7 +4445,6 @@ if (p->outboundproxy) { p->sa = p->outboundproxy->ip; /* We need the SRV context as well */ - } finalize_content(req); @@ -4464,12 +4463,14 @@ deinit_req(&tmp); } if (p->srvcontext) { + int tryagain = TRUE; /* We have an SRV record set. If we get transmit errors, retry on the next directly. */ - while (res != -1 && res != XMIT_ERROR) { + while (tryagain) { res = (reliable) ? __sip_reliable_xmit(p, seqno, 0, req->data, (reliable == XMIT_CRITICAL), req->method) : __sip_xmit(p, req->data); if (res == -1 || res == XMIT_ERROR) { + ast_debug(3, "====>> SRV failover loop. Looking for next host \n"); char hostname[MAXHOSTNAMELEN]; const char *host = &hostname[0]; unsigned short port, prio, weight; @@ -4479,10 +4480,18 @@ ast_log(LOG_WARNING, "No more hosts: %s\n", p->srvdomain); res = -1; } else { + if (!ast_sockaddr_resolve_first_transport(&p->sa, hostname, 0, p->socket.type ? p->socket.type : SIP_TRANSPORT_UDP)) { + /* We found a host to try on */ + break; + } + /* Make sure we set the port */ + ast_sockaddr_set_port(&dialog->sa, port); ast_debug(3, "====>> SRV failover. Changing to host %s port %d\n", hostname, port); - /* Select IP address */ - /* Change IP in p */ + res = 0; /* Fail over */ } + } else { + ast_debug(3, "====>> sip_xmit success \n"); + tryagain = FALSE; } } } else { @@ -5756,6 +5765,7 @@ if (hostport.port) { dialog->portinuri = TRUE; } + ast_debug(4, "Going to find something with the name %s \n", peername); dialog->timer_t1 = global_t1; /* Default SIP retransmission timer T1 (RFC 3261) */ dialog->timer_b = global_timer_b; /* Default SIP transaction timer B (RFC 3261) */ @@ -5824,9 +5834,9 @@ unsigned short port, prio, weight; const char *srvhost; - ast_debug(3, " ==> DNS lookup of %s returned %d entries. First %s \n", service, ast_srv_get_record_count(dialog->srvcontext), hostn); + ast_debug(3, " ==> DNS lookup of %s returned %d entries. \n", service, ast_srv_get_record_count(dialog->srvcontext)); hostn = host; - for (rec = 0; rec < ast_srv_get_record_count(dialog->srvcontext); rec++) { + for (rec = 1; rec <= ast_srv_get_record_count(dialog->srvcontext); rec++) { if(ast_srv_get_nth_record(dialog->srvcontext, rec, &srvhost, &port, &prio, &weight)) { ast_log(LOG_WARNING, "No more SRV records for: %s\n", peername); return -1; @@ -5840,10 +5850,12 @@ /* We found a host to try on */ break; } + /* Make sure we set the port */ + ast_sockaddr_set_port(&dialog->sa, port); } - ast_debug(3, " ==> Settling with SRV entry %d: %s\n", rec, hostn); + ast_debug(3, " ==> Settling with SRV entry %d: %s Port %d\n", rec, hostn, port); } } else { @@ -5851,10 +5863,6 @@ ast_log(LOG_WARNING, "No such host: %s\n", peername); return -1; } - } - - if (srv_ret > 0) { - ast_sockaddr_set_port(&dialog->sa, tportno); } } Modified: team/oej/pgtips-srv-and-outbound-stuff-1.8/main/srv.c URL: http://svnview.digium.com/svn/asterisk/team/oej/pgtips-srv-and-outbound-stuff-1.8/main/srv.c?view=diff&rev=421668&r1=421667&r2=421668 ============================================================================== --- team/oej/pgtips-srv-and-outbound-stuff-1.8/main/srv.c (original) +++ team/oej/pgtips-srv-and-outbound-stuff-1.8/main/srv.c Thu Aug 21 06:52:49 2014 @@ -149,7 +149,9 @@ ast_debug(3, " ==> Callback received ttl= %u\n", ttl); expiry.tv_sec = (long) ttl; - expiry = ast_tvadd(expiry, ast_tvnow()); + if (ttl > 0) { + expiry = ast_tvadd(expiry, ast_tvnow()); + } if (c == NULL) { ast_debug(3, " ==> Callback with no context ?? \n"); -- _____________________________________________________________________ -- 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