Don't do SIP contact/route DNS if we're not using the result.
authorWalter Doekes <walter+asterisk@wjd.nu>
Tue, 16 Oct 2012 21:38:00 +0000 (21:38 +0000)
committerWalter Doekes <walter+asterisk@wjd.nu>
Tue, 16 Oct 2012 21:38:00 +0000 (21:38 +0000)
In many cases (for peers behind NAT or for TCP sockets) we do not need
to look up any hostname in the Contact (or Route) when sending an
in-dialog request. This should reduce netsock2.c: getaddrinfo errors in
certain scenarios.

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

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

channels/chan_sip.c

index 7227ddd..03f0de6 100644 (file)
@@ -11811,7 +11811,16 @@ static int reqprep(struct sip_request *req, struct sip_pvt *p, int sipmethod, ui
        if (p->route &&
                        !(sipmethod == SIP_CANCEL ||
                                (sipmethod == SIP_ACK && (p->invitestate == INV_COMPLETED || p->invitestate == INV_CANCELLED)))) {
-               set_destination(p, p->route->hop);
+               if (p->socket.type != SIP_TRANSPORT_UDP && p->socket.tcptls_session) {
+                       /* For TCP/TLS sockets that are connected we won't need
+                        * to do any hostname/IP lookups */
+               } else if (ast_test_flag(&p->flags[0], SIP_NAT_FORCE_RPORT)) {
+                       /* For NATed traffic, we ignore the contact/route and
+                        * simply send to the received-from address. No need
+                        * for lookups. */
+               } else {
+                       set_destination(p, p->route->hop);
+               }
                add_route(req, is_strict ? p->route->next : p->route);
        }
        add_max_forwards(p, req);