[asterisk-commits] dvossel: branch 1.6.0 r193449 - in /branches/1.6.0: ./ channels/chan_sip.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Fri May 8 16:32:49 CDT 2009


Author: dvossel
Date: Fri May  8 16:32:25 2009
New Revision: 193449

URL: http://svn.asterisk.org/svn-view/asterisk?view=rev&rev=193449
Log:
Merged revisions 193387 via svnmerge from 
https://origsvn.digium.com/svn/asterisk/trunk

........
  r193387 | dvossel | 2009-05-08 15:32:51 -0500 (Fri, 08 May 2009) | 7 lines
  
  TCP not matching valid peer.
  
  find_peer() does not find a valid peer when using pvt->recv as the sockaddr_in argument.  Because of the way TCP works, the port number in pvt->recv is not what we're looking for at all.  There is currently only one place that find_peer searches for a peer using the sockaddr_in argument.  If the peer is not found after using pvt->recv (works for UDP since the port number will be correct), a temp sockaddr_in struct is made using the Contact header in the sip_request.  This has the correct port number in it.
  
  Review: http://reviewboard.digium.com/r/236/
........

Modified:
    branches/1.6.0/   (props changed)
    branches/1.6.0/channels/chan_sip.c

Propchange: branches/1.6.0/
------------------------------------------------------------------------------
Binary property 'trunk-merged' - no diff available.

Modified: branches/1.6.0/channels/chan_sip.c
URL: http://svn.asterisk.org/svn-view/asterisk/branches/1.6.0/channels/chan_sip.c?view=diff&rev=193449&r1=193448&r2=193449
==============================================================================
--- branches/1.6.0/channels/chan_sip.c (original)
+++ branches/1.6.0/channels/chan_sip.c Fri May  8 16:32:25 2009
@@ -11788,6 +11788,21 @@
 	 */
 	peer = (sipmethod == SIP_SUBSCRIBE) ? find_peer(of, NULL, 1, 0) : find_peer(NULL, &p->recv, 1, 0);
 
+	/* If the peer is still not found, try the address and port from the
+	 * contact header.  If the transport type is TCP or TLS it is not possible
+	 * to find the peer using p->recv. Because of the way TCP works, the received
+	 * packet's destination port will not match the one the peer table is
+	 * built with. */
+	if (!peer && (p->socket.type != SIP_TRANSPORT_UDP)) {
+		struct sockaddr_in tmpsin;
+		char contact[SIPBUFSIZE];
+		char *tmp;
+		memcpy(&tmpsin, &p->recv, sizeof(tmpsin));
+		ast_copy_string(contact, get_header(req, "Contact"), sizeof(contact));
+		tmp = get_in_brackets(contact);
+		__set_address_from_contact(tmp, &tmpsin, 1);
+		peer = find_peer(NULL, &tmpsin, 1, 0);
+	}
 	if (!peer) {
 		if (debug)
 			ast_verbose("No matching peer for '%s' from '%s:%d'\n",




More information about the asterisk-commits mailing list