]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Merged revisions 333836 via svnmerge from
authorTerry Wilson <twilson@digium.com>
Mon, 29 Aug 2011 21:41:13 +0000 (21:41 +0000)
committerTerry Wilson <twilson@digium.com>
Mon, 29 Aug 2011 21:41:13 +0000 (21:41 +0000)
https://origsvn.digium.com/svn/asterisk/branches/1.8

........
  r333836 | twilson | 2011-08-29 16:38:31 -0500 (Mon, 29 Aug 2011) | 15 lines

  Refresh peer address if DNS unavailable at peer creation

  If Asterisk starts and no DNS is available, outbound registrations will fail
  indefinitely. This patch copies the address from the sip_registry struct, which
  will be updated, to the peer->addr when necessary.

  If dnsmgr is enabled, the registration fails without the patch because even
  though the address on the registry is updated via dnsmgr, the address is just
  copied on the first try. Since we use ast_sockaddr_copy, dnsmgr can't update
  the address that is copied to the sip_pvt or peers.

  Closes issue ASTERISK-18000

  Review: https://reviewboard.asterisk.org/r/1335/
........

git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/10@333837 65c4cc65-6c06-0410-ace0-fbb531ad65f3

channels/chan_sip.c

index ee482112e7bc912b9b265edfc9e373c2945ba1bd..67931356d364ca273deef9261ec60a32970d3eaf 100644 (file)
@@ -12899,8 +12899,17 @@ static int sip_reg_timeout(const void *data)
        }
 
        if (r->dnsmgr) {
+               struct sip_peer *peer;
                /* If the registration has timed out, maybe the IP changed.  Force a refresh. */
                ast_dnsmgr_refresh(r->dnsmgr);
+               /* If we are resolving a peer, we have to make sure the refreshed address gets copied */
+               if ((peer = find_peer(r->hostname, NULL, TRUE, FINDPEERS, FALSE, 0))) {
+                       ast_sockaddr_copy(&peer->addr, &r->us);
+                       if (r->portno) {
+                               ast_sockaddr_set_port(&peer->addr, r->portno);
+                       }
+                       peer = unref_peer(peer, "unref after find_peer");
+               }
        }
 
        /* If the initial tranmission failed, we may not have an existing dialog,
@@ -13019,6 +13028,16 @@ static int transmit_register(struct sip_registry *r, int sipmethod, const char *
                        ast_sockaddr_set_port(&r->us, r->portno);
                }
 
+               /* It is possible that DNS is unavailable at the time the peer is created. Here, if
+                * we've updated the address in the registry, we copy it to the peer so that
+                * create_addr() can copy it to the dialog via create_addr_from_peer */
+               if ((peer = find_peer(r->hostname, NULL, TRUE, FINDPEERS, FALSE, 0))) {
+                       if (ast_sockaddr_isnull(&peer->addr) && !(ast_sockaddr_isnull(&r->us))) {
+                               ast_sockaddr_copy(&peer->addr, &r->us);
+                       }
+                       peer = unref_peer(peer, "unref after find_peer");
+               }
+
                /* Find address to hostname */
                if (create_addr(p, S_OR(r->peername, r->hostname), &r->us, 0, NULL)) {
                        /* we have what we hope is a temporary network error,