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