r2944 - in trunk/libmsip: include/libmsip source

erik at minisip.org erik at minisip.org
Mon Nov 20 14:42:25 CET 2006


Author: erik
Date: 2006-11-20 14:42:24 +0100 (Mon, 20 Nov 2006)
New Revision: 2944

Modified:
   trunk/libmsip/include/libmsip/SipLayerTransport.h
   trunk/libmsip/source/SipLayerTransport.cxx
Log:

 - If UDP had not been started, and the stack only ran TCP,
   the default was still to try to send the message using UDP which resulted
   in a transport error.

   This fix makes "getDestination" aware of what servers have been
   started. By default, UDP is preferred over TCP, and TCP
   over TLS.

   I moved "getDestination" from being a static function to a
   private member of SipLayerTransport so that it can ask what
   servers are running.



Modified: trunk/libmsip/include/libmsip/SipLayerTransport.h
===================================================================
--- trunk/libmsip/include/libmsip/SipLayerTransport.h	2006-11-19 21:51:02 UTC (rev 2943)
+++ trunk/libmsip/include/libmsip/SipLayerTransport.h	2006-11-20 13:42:24 UTC (rev 2944)
@@ -49,10 +49,8 @@
 
 class SipLayerTransport : public SipSMCommandReceiver {
 	public:
-		SipLayerTransport(
-							MRef<certificate_chain *> cchain=NULL,
-							MRef<ca_db *> cert_db =
-NULL
+		SipLayerTransport( MRef<certificate_chain *> cchain=NULL,
+				   MRef<ca_db *> cert_db = NULL
 		);
 
 		virtual ~SipLayerTransport();
@@ -92,6 +90,8 @@
 		virtual MRef<Socket *> findServerSocket( int32_t type, bool ipv6);
 
 	private:
+		bool getDestination(MRef<SipMessage*> pack, string &destAddr,
+				int32_t &destPort, string &destTransport);
 		void addViaHeader( MRef<SipMessage*> pack, MRef<SipSocketServer*> server, MRef<Socket *> socket, std::string branch );
 		MRef<StreamSocket *> findStreamSocket(IPAddress&, uint16_t);
 		bool findSocket(const std::string &transport,

Modified: trunk/libmsip/source/SipLayerTransport.cxx
===================================================================
--- trunk/libmsip/source/SipLayerTransport.cxx	2006-11-19 21:51:02 UTC (rev 2943)
+++ trunk/libmsip/source/SipLayerTransport.cxx	2006-11-20 13:42:24 UTC (rev 2944)
@@ -560,7 +560,7 @@
 
 
 // Impl RFC 3263 (partly)
-static bool getDestination(MRef<SipMessage*> pack, /*MRef<IPAddress*>*/ string &destAddr,
+bool SipLayerTransport::getDestination(MRef<SipMessage*> pack, string &destAddr,
 			   int32_t &destPort, string &destTransport)
 {
 	if( pack->getType() == SipResponse::type ){
@@ -628,8 +628,20 @@
 				if( destTransport.length() == 0 ){
 					if( uri.getProtocolId() == "sips" )
 						destTransport = "TLS";
-					else
-						destTransport = "UDP";
+					else{
+						if (findServerSocket(SOCKET_TYPE_UDP, false)){
+							destTransport="UDP";
+						}else
+						if (findServerSocket(SOCKET_TYPE_TCP, false)){
+							destTransport="TCP";
+						}else
+						if (findServerSocket(SOCKET_TYPE_TLS, false)){
+							destTransport = "TLS";
+						}else{
+							merr << "SipMessateTransport: Warning: could not find any supported transport - trying UDP"<<endl;
+							destTransport = "UDP"; // this should not happen
+						}
+					}
 				}
 				return lookupDestIpPort(uri, destTransport, 
 							destAddr, destPort);



More information about the Minisip-devel mailing list