r3481 - in trunk/libmsip/source: . transports

mikma at minisip.org mikma at minisip.org
Sun Nov 18 11:10:15 CET 2007


Author: mikma
Date: 2007-11-18 11:10:14 +0100 (Sun, 18 Nov 2007)
New Revision: 3481

Modified:
   trunk/libmsip/source/SipLayerTransport.cxx
   trunk/libmsip/source/SipLayerTransport.h
   trunk/libmsip/source/transports/SipTransport.cxx
   trunk/libmsip/source/transports/SipTransport.h
   trunk/libmsip/source/transports/SipTransportTcp.h
   trunk/libmsip/source/transports/SipTransportTls.h
   trunk/libmsip/source/transports/SipTransportUdp.h
Log:
Implement SipTransport::getViaProtocol
Return SipTransport in SipLayerTransport::getDestination


Modified: trunk/libmsip/source/SipLayerTransport.cxx
===================================================================
--- trunk/libmsip/source/SipLayerTransport.cxx	2007-11-18 09:27:05 UTC (rev 3480)
+++ trunk/libmsip/source/SipLayerTransport.cxx	2007-11-18 10:10:14 UTC (rev 3481)
@@ -597,8 +597,11 @@
 
 // Impl RFC 3263 (partly)
 bool SipLayerTransport::getDestination(MRef<SipMessage*> pack, string &destAddr,
-			   int32_t &destPort, string &destTransport)
+			   int32_t &destPort, MRef<SipTransport*> &destTransport)
 {
+	MRef<SipTransportRegistry *> registry =
+		SipTransportRegistry::getInstance();
+
 	if( pack->getType() == SipResponse::type ){
 		// RFC 3263, 5 Server Usage
 		// Send responses to sent by address in top via.
@@ -624,7 +627,8 @@
 				if( !destPort ){
 					destPort = 5060;
 				}
-				destTransport = via->getProtocol();
+				destTransport =
+					registry->findViaTransport( via->getProtocol() );
 				return true;
 			}
 		}
@@ -660,26 +664,43 @@
 			destAddr = uri.getIp();
 			
 			if( /*destAddr*/ destAddr.size()>0 ){
-				destTransport = uri.getTransport();
-				if( destTransport.length() == 0 ){
-					if( uri.getProtocolId() == "sips" )
-						destTransport = "TLS";
+				bool secure = uri.getProtocolId() == "sips";
+				string protocol = uri.getTransport();
+				if( protocol.length() == 0 ){
+					if( secure )
+						destTransport = registry->findTransport( "tcp", true );
 					else{
 						if (findServerSocket(SOCKET_TYPE_UDP, false)){
-							destTransport="UDP";
+							destTransport = registry->findTransport( "udp" );
 						}else
 						if (findServerSocket(SOCKET_TYPE_TCP, false)){
-							destTransport="TCP";
+							destTransport = registry->findTransport( "tcp" );
 						}else
 						if (findServerSocket(SOCKET_TYPE_TLS, false)){
-							destTransport = "TLS";
+							destTransport = registry->findTransport( "tcp", true );
 						}else{
+							// this should not happen
 							merr << "SipMessateTransport: Warning: could not find any supported transport - trying UDP"<<endl;
-							destTransport = "UDP"; // this should not happen
+							destTransport = registry->findTransport( "udp" );
 						}
 					}
 				}
-				return lookupDestIpPort(uri, destTransport, 
+				else{
+					destTransport = registry->findTransport( protocol, secure );
+					// TODO using TLS in transport parameter is deprecated
+					if( !destTransport ){
+						// Second, try Via protocol
+						// For example TLS
+						destTransport = registry->findViaTransport( protocol );
+					}
+				}
+
+				if( !destTransport ){
+					mdbg("signaling/sip") << "SipLayerTransport: Unsupported transport " << protocol << " secure:" << secure << endl;
+					return false;
+				}
+
+				return lookupDestIpPort(uri, destTransport->getName(), 
 							destAddr, destPort);
 			}
 		}
@@ -698,7 +719,7 @@
 	//MRef<IPAddress*> destAddr;
 	string destAddr;
 	int32_t destPort = 0;
-	string destTransport;
+	MRef<SipTransport*> destTransport;
 
 	if( !getDestination( pack, destAddr, destPort, destTransport) ){
 #ifdef DEBUG_OUTPUT
@@ -707,11 +728,8 @@
 		return;
 	}
 
-	transform( destTransport.begin(), destTransport.end(),
-		   destTransport.begin(), (int(*)(int))toupper );
-
 	sendMessage( pack, /* **destAddr */ destAddr, destPort,
-		     branch, destTransport, addVia );
+		     branch, destTransport->getName(), addVia );
 }
 
 

Modified: trunk/libmsip/source/SipLayerTransport.h
===================================================================
--- trunk/libmsip/source/SipLayerTransport.h	2007-11-18 09:27:05 UTC (rev 3480)
+++ trunk/libmsip/source/SipLayerTransport.h	2007-11-18 10:10:14 UTC (rev 3481)
@@ -46,6 +46,7 @@
 
 class SipLayerTransport;
 class SipCommandDispatcher;
+class SipTransport;
 class StreamThreadData;
 class StreamThreadServer;
 
@@ -115,7 +116,7 @@
 		bool validateIncoming(MRef<SipMessage *> msg);
 
 		bool getDestination(MRef<SipMessage*> pack, std::string &destAddr,
-				    int32_t &destPort, std::string &destTransport);
+				    int32_t &destPort, MRef<SipTransport*> &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/transports/SipTransport.cxx
===================================================================
--- trunk/libmsip/source/transports/SipTransport.cxx	2007-11-18 09:27:05 UTC (rev 3480)
+++ trunk/libmsip/source/transports/SipTransport.cxx	2007-11-18 10:10:14 UTC (rev 3481)
@@ -46,7 +46,7 @@
 	registerPlugin( new SipTransportTls( NULL ) );
 }
 
-MRef<SipTransport*> SipTransportRegistry::findTransport( string protocol, bool secure ) const{
+MRef<SipTransport*> SipTransportRegistry::findTransport( const string &protocol, bool secure ) const{
 	string lcProt = protocol;
 	list< MRef<MPlugin*> >::const_iterator iter;
 	list< MRef<MPlugin*> >::const_iterator stop = plugins.end();
@@ -75,3 +75,32 @@
 
 	return NULL;
 }
+
+MRef<SipTransport*> SipTransportRegistry::findViaTransport( const string &protocol ) const{
+	string ucProt = protocol;
+	list< MRef<MPlugin*> >::const_iterator iter;
+	list< MRef<MPlugin*> >::const_iterator stop = plugins.end();
+
+	transform( ucProt.begin(), ucProt.end(),
+		   ucProt.begin(), (int(*)(int))toupper );
+
+	for( iter = plugins.begin(); iter != stop; iter++ ){
+		MRef<MPlugin*> plugin = *iter;
+
+		if( !plugin )
+			continue;
+
+		MRef<SipTransport*> transport =
+			dynamic_cast<SipTransport*>( *plugin );
+
+		if( !transport )
+			continue;
+
+		if( transport->getViaProtocol() == ucProt ){
+			mdbg << "SipTransport: Via transport found!!! =  " << ucProt << endl;
+			return transport;
+		}
+	}
+
+	return NULL;
+}

Modified: trunk/libmsip/source/transports/SipTransport.h
===================================================================
--- trunk/libmsip/source/transports/SipTransport.h	2007-11-18 09:27:05 UTC (rev 3480)
+++ trunk/libmsip/source/transports/SipTransport.h	2007-11-18 10:10:14 UTC (rev 3481)
@@ -47,6 +47,12 @@
 		/** @return transport protocol id in lower case, such as udp */
 		virtual std::string getProtocol() const=0;
 
+		/**
+		 * @return Via header transport protocol in upper case,
+		 * for example DTLS-UDP
+		 */
+		virtual std::string getViaProtocol() const=0;
+
 		/** Setup a new listening socket */
 		virtual MRef<SipSocketServer *> createServer( MRef<SipLayerTransport*> receiver, bool ipv6, const std::string &ipString, int32_t prefPort, MRef<CertificateSet *> cert_db = NULL, MRef<CertificateChain *> certChain = NULL ) = 0;
 		/**
@@ -68,8 +74,10 @@
 	public:
 		virtual std::string getPluginType(){ return "SipTransport"; }
 
-		MRef<SipTransport*> findTransport( std::string protocol, bool secure=false ) const;
+		MRef<SipTransport*> findTransport( const std::string &protocol, bool secure=false ) const;
 
+		MRef<SipTransport*> findViaTransport( const std::string &protocol ) const;
+
 	protected:
 		SipTransportRegistry();
 

Modified: trunk/libmsip/source/transports/SipTransportTcp.h
===================================================================
--- trunk/libmsip/source/transports/SipTransportTcp.h	2007-11-18 09:27:05 UTC (rev 3480)
+++ trunk/libmsip/source/transports/SipTransportTcp.h	2007-11-18 10:10:14 UTC (rev 3481)
@@ -38,6 +38,8 @@
 
 		virtual std::string getProtocol() const { return "tcp"; }
 
+		virtual std::string getViaProtocol() const { return "TCP"; }
+
 		virtual MRef<SipSocketServer *> createServer( MRef<SipLayerTransport*> receiver, bool ipv6, const std::string &ipString, int32_t prefPort, MRef<CertificateSet *> cert_db = NULL, MRef<CertificateChain *> certChain = NULL );
 
 		virtual MRef<StreamSocket *> connect( const IPAddress &addr, uint16_t port, MRef<CertificateSet *> cert_db = NULL, MRef<CertificateChain *> certChain = NULL );

Modified: trunk/libmsip/source/transports/SipTransportTls.h
===================================================================
--- trunk/libmsip/source/transports/SipTransportTls.h	2007-11-18 09:27:05 UTC (rev 3480)
+++ trunk/libmsip/source/transports/SipTransportTls.h	2007-11-18 10:10:14 UTC (rev 3481)
@@ -38,6 +38,8 @@
 
 		virtual std::string getProtocol() const { return "tcp"; }
 
+		virtual std::string getViaProtocol() const { return "TLS"; }
+
 		virtual MRef<SipSocketServer *> createServer( MRef<SipLayerTransport*> receiver, bool ipv6, const std::string &ipString, int32_t prefPort, MRef<CertificateSet *> cert_db = NULL, MRef<CertificateChain *> certChain = NULL );
 
 		virtual MRef<StreamSocket *> connect( const IPAddress &addr, uint16_t port, MRef<CertificateSet *> cert_db = NULL, MRef<CertificateChain *> certChain = NULL );

Modified: trunk/libmsip/source/transports/SipTransportUdp.h
===================================================================
--- trunk/libmsip/source/transports/SipTransportUdp.h	2007-11-18 09:27:05 UTC (rev 3480)
+++ trunk/libmsip/source/transports/SipTransportUdp.h	2007-11-18 10:10:14 UTC (rev 3481)
@@ -38,6 +38,8 @@
 
 		virtual std::string getProtocol() const { return "udp"; }
 
+		virtual std::string getViaProtocol() const { return "UDP"; }
+
 		virtual MRef<SipSocketServer *> createServer( MRef<SipLayerTransport*> receiver, bool ipv6, const std::string &ipString, int32_t prefPort, MRef<CertificateSet *> cert_db = NULL, MRef<CertificateChain *> certChain = NULL );
 
 		// MPlugin



More information about the Minisip-devel mailing list