r2919 - in trunk: libminisip/include/libminisip/sip libminisip/source libminisip/source/sip libminisip/source/soundcard libmsip libmsip/include libmsip/include/libmsip libmsip/source libmsip/source/transactions

mikma at minisip.org mikma at minisip.org
Fri Nov 17 20:14:49 CET 2006


Author: mikma
Date: 2006-11-17 20:14:48 +0100 (Fri, 17 Nov 2006)
New Revision: 2919

Added:
   trunk/libmsip/include/libmsip/SipSocketServer.h
   trunk/libmsip/source/SipSocketServer.cxx
Modified:
   trunk/libminisip/include/libminisip/sip/Sip.h
   trunk/libminisip/source/Minisip.cxx
   trunk/libminisip/source/sip/Sip.cxx
   trunk/libminisip/source/soundcard/SoundDriverRegistry.cxx
   trunk/libmsip/Makefile.am
   trunk/libmsip/include/Makefile.am
   trunk/libmsip/include/libmsip/SipLayerTransport.h
   trunk/libmsip/include/libmsip/SipStack.h
   trunk/libmsip/include/libmsip/SipStackInternal.h
   trunk/libmsip/source/SipLayerTransport.cxx
   trunk/libmsip/source/SipStack.cxx
   trunk/libmsip/source/SipStackInternal.cxx
   trunk/libmsip/source/transactions/SipTransactionNonInviteClient.cxx
Log:
Add IPv6 support to the transport layer.

* Add IPv6 address and certificate properties to stack config.
* Clean up several constructors, removing address, port and certificate
  arguments  which are found in stack config.
* Rename SocketServer to SipSocketServer and move to separate source files,
  it implements both reliable streams and datagram.
* Add SipStack::startUdpServer.



Modified: trunk/libminisip/include/libminisip/sip/Sip.h
===================================================================
--- trunk/libminisip/include/libminisip/sip/Sip.h	2006-11-17 17:41:43 UTC (rev 2918)
+++ trunk/libminisip/include/libminisip/sip/Sip.h	2006-11-17 19:14:48 UTC (rev 2919)
@@ -45,17 +45,7 @@
 
 	public:
 		Sip(MRef<SipSoftPhoneConfiguration*> phoneconfig,
-				MRef<MediaHandler*> mediaHandler,
-				std::string localIpString,
-				std::string externalContactIP,
-				int32_t localUdpPort=5060,
-				int32_t localTcpPort=5060,
-				int32_t externalContactUdpPort=5060,
-				int32_t localTlsPort=5061,
-				MRef<certificate_chain *> cert=NULL,    //The certificate chain is used by TLS
-				//TODO: TLS should use the whole chain instead of only the f$
-				MRef<ca_db *> cert_db = NULL
-		    );
+		    MRef<MediaHandler*> mediaHandler);
 
 		virtual ~Sip();
 

Modified: trunk/libminisip/source/Minisip.cxx
===================================================================
--- trunk/libminisip/source/Minisip.cxx	2006-11-17 17:41:43 UTC (rev 2918)
+++ trunk/libminisip/source/Minisip.cxx	2006-11-17 19:14:48 UTC (rev 2919)
@@ -294,6 +294,8 @@
 		mout << BOLD << "init 4/9: Creating IP provider" << PLAIN << end;
 #endif
 		MRef<IpProvider *> ipProvider = IpProvider::create( phoneConf );
+		MRef<IpProvider *> ip6Provider;
+		ip6Provider = IpProvider::create( phoneConf, true );
 //#ifdef DEBUG_OUTPUT
 //                mout << BOLD << "init 5/9: Creating SIP transport layer" << PLAIN << end;
 //#endif
@@ -308,6 +310,8 @@
 		phoneConf->inherited->localUdpPort = ipProvider->getExternalPort( udpSocket );
 		phoneConf->inherited->localIpString = externalContactIP;
 		phoneConf->inherited->externalContactIP = externalContactIP;
+		if( ip6Provider )
+			phoneConf->inherited->localIp6String = ip6Provider->getExternalIp();
 		udpSocket=NULL;
 
 #ifdef DEBUG_OUTPUT
@@ -332,24 +336,13 @@
 #endif
 
 		MRef<SipSim*> sim = phoneConf->defaultIdentity->getSim();
-		MRef<certificate_chain *> certChain;
-		MRef<ca_db *> certDb;
 		if (sim){
-			certChain = sim->getCertificateChain();
-			certDb = sim->getCAs();
+			phoneConf->inherited->cert = sim->getCertificateChain();
+			phoneConf->inherited->cert_db = sim->getCAs();
 		}
 
 		//save Sip object in Minisip::sip ...
-		this->sip=new Sip(phoneConf,mediaHandler,
-				localIpString,
-				externalContactIP,
-				phoneConf->inherited->localUdpPort,
-				phoneConf->inherited->localTcpPort,
-				phoneConf->inherited->externalContactUdpPort,
-				phoneConf->inherited->localTlsPort,
-				certChain,
-				certDb
-				);
+		this->sip=new Sip(phoneConf,mediaHandler);
 		//sip->init();
 
 		phoneConf->sip = sip;

Modified: trunk/libminisip/source/sip/Sip.cxx
===================================================================
--- trunk/libminisip/source/sip/Sip.cxx	2006-11-17 17:41:43 UTC (rev 2918)
+++ trunk/libminisip/source/sip/Sip.cxx	2006-11-17 19:14:48 UTC (rev 2919)
@@ -55,30 +55,18 @@
 
 using namespace std;
 
-Sip::Sip(MRef<SipSoftPhoneConfiguration*> pconfig, MRef<MediaHandler*>mediaHandler,
-		string localIpString, 
-		string externalContactIP, 
-		int32_t localUdpPort,
-		int32_t localTcpPort,
-		int32_t externalContactUdpPort,
-		int32_t localTlsPort,
-		MRef<certificate_chain *> cert_chain,
-		MRef<ca_db *> cert_db
-		){
+Sip::Sip(MRef<SipSoftPhoneConfiguration*> pconfig,
+	 MRef<MediaHandler*>mediaHandler){
 
 	this->phoneconfig = pconfig;
 	this->mediaHandler = mediaHandler;
 
-	MRef<SipStackConfig *> stackConfig = new SipStackConfig;
-	stackConfig->localIpString = localIpString;
-	stackConfig->externalContactIP= externalContactIP;
-	stackConfig->localUdpPort=localUdpPort;
-	stackConfig->localTcpPort=localTcpPort;
-	stackConfig->externalContactUdpPort= externalContactUdpPort;
-	stackConfig->localTlsPort= localTlsPort;
-	
-	sipstack = new SipStack(stackConfig, cert_chain,cert_db);
+	MRef<SipStackConfig *> stackConfig = new SipStackConfig();
+	// Deep copy
+	**stackConfig = **(pconfig->inherited);
 
+	sipstack = new SipStack(stackConfig);
+
 	MRef<DefaultDialogHandler*> defaultDialogHandler = 
 			new DefaultDialogHandler(sipstack,
 						phoneconfig,
@@ -427,6 +415,11 @@
 void Sip::run(){
 
 	try{
+#ifdef DEBUG_OUTPUT
+		mout << BOLD << "init 8.1/9: Starting UDP transport worker thread" << PLAIN << end;
+#endif
+		sipstack->startUdpServer();
+
 		if (phoneconfig->tcp_server){
 #ifdef DEBUG_OUTPUT
 			mout << BOLD << "init 8.2/9: Starting TCP transport worker thread" << PLAIN << end;

Modified: trunk/libminisip/source/soundcard/SoundDriverRegistry.cxx
===================================================================
--- trunk/libminisip/source/soundcard/SoundDriverRegistry.cxx	2006-11-17 17:41:43 UTC (rev 2918)
+++ trunk/libminisip/source/soundcard/SoundDriverRegistry.cxx	2006-11-17 19:14:48 UTC (rev 2919)
@@ -102,7 +102,7 @@
 		MRef<SoundDriver*> driver = *iter;
 
 		if( driver->getId() == driverId ){
-			merr << "SoundDriverRegistry: device id found!!! =  " << deviceId << ::end;
+			mdbg << "SoundDriverRegistry: device id found!!! =  " << deviceId << ::end;
 			return driver->createDevice( deviceId );
 		}
 	}

Modified: trunk/libmsip/Makefile.am
===================================================================
--- trunk/libmsip/Makefile.am	2006-11-17 17:41:43 UTC (rev 2918)
+++ trunk/libmsip/Makefile.am	2006-11-17 19:14:48 UTC (rev 2919)
@@ -33,6 +33,7 @@
 		     source/SipUtils.cxx \
 		     source/SipCommandDispatcher.cxx \
 		     source/SipLayerTransport.cxx \
+		     source/SipSocketServer.cxx \
 		     source/SipSMCommand.cxx \
 		     source/SipCommandString.cxx \
 		     source/SipUri.cxx \

Modified: trunk/libmsip/include/Makefile.am
===================================================================
--- trunk/libmsip/include/Makefile.am	2006-11-17 17:41:43 UTC (rev 2918)
+++ trunk/libmsip/include/Makefile.am	2006-11-17 19:14:48 UTC (rev 2919)
@@ -40,6 +40,7 @@
 		     libmsip/SipMessageContentIM.h \
 		     libmsip/SipMessageContentFactory.h \
 		     libmsip/SipLayerTransport.h \
+		     libmsip/SipSocketServer.h \
 		     libmsip/SipMessageContentMime.h \
 		     libmsip/SipSMCommand.h \
 		     libmsip/SipCommandString.h \

Modified: trunk/libmsip/include/libmsip/SipLayerTransport.h
===================================================================
--- trunk/libmsip/include/libmsip/SipLayerTransport.h	2006-11-17 17:41:43 UTC (rev 2918)
+++ trunk/libmsip/include/libmsip/SipLayerTransport.h	2006-11-17 19:14:48 UTC (rev 2919)
@@ -1,5 +1,6 @@
 /*
   Copyright (C) 2005, 2004 Erik Eliasson, Johan Bilien
+  Copyright (C) 2006 Mikael Magnusson
   
   This library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
@@ -19,6 +20,7 @@
 /*
  * Authors: Erik Eliasson <eliasson at it.kth.se>
  *          Johan Bilien <jobi at via.ecp.fr>
+ *          Mikael Magnusson <mikma at users.sourceforge.net>
 */
 
 
@@ -27,16 +29,16 @@
 
 #include<libmsip/libmsip_config.h>
 
-#include<libmnetutil/UDPSocket.h>
-#include<libmnetutil/TCPSocket.h>
-#include<libmnetutil/TLSSocket.h>
-#include<libmnetutil/ServerSocket.h>
+#include<libmnetutil/DatagramSocket.h>
+#include<libmnetutil/StreamSocket.h>
 #include<libmutil/Mutex.h>
 #include<libmutil/Thread.h>
 #include<libmutil/Semaphore.h>
 #include<libmutil/MemObject.h>
+#include<libmcrypto/cert.h>
 #include<libmsip/SipSMCommand.h>
 #include<libmsip/SipMessage.h>
+#include<libmsip/SipSocketServer.h>
 
 #include<list>
 
@@ -45,44 +47,18 @@
 class SipLayerTransport;
 class SipCommandDispatcher;
 
-/**
- * Purpose: Listens on a TCP or TLS server socket and reports
- * when a client connects to it.
- *
- */
-class SocketServer : public Runnable{
-	public:
-		SocketServer(MRef<ServerSocket*> sock, MRef<SipLayerTransport*> r);
-		std::string getMemObjectType() const {return "SocketServer";}
-		void run();
-		void start();
-		void stop();
-
-	private:
-		MRef<ServerSocket *> ssock;
-		MRef<SipLayerTransport *> receiver;
-		bool doStop;
-};
-
-
 class SipLayerTransport : public SipSMCommandReceiver {
 	public:
-		SipLayerTransport(std::string local_ip, 
-							std::string contactIP,
-							int32_t externalContactUdpPort=5060, 
-							int32_t local_udp_port=5060, 
-							int32_t local_tcp_port=5060 
-							,int32_t local_tls_port=5061,
-							MRef<certificate_chain *> cchain=NULL, 
-							MRef<ca_db *> cert_db = NULL
+		SipLayerTransport(
+							MRef<certificate_chain *> cchain=NULL,
+							MRef<ca_db *> cert_db =
+NULL
 		);
 
-		void startTcpServer();
-		void stopTcpServer();
+		virtual ~SipLayerTransport();
+  
+		virtual void stop();
 
-		void startTlsServer();
-		void stopTlsServer();
-
 		bool handleCommand(const SipSMCommand& cmd);
 		
 		
@@ -95,50 +71,44 @@
 
 		void addSocket(MRef<StreamSocket *> sock);
 
-		std::string getLocalIP();
+		void addServer(MRef<SipSocketServer *> server);
 
-		int32_t getLocalUDPPort();
-		int32_t getLocalTCPPort();
-		int32_t getLocalTLSPort();
-
 		MRef<certificate_chain *> getCertificateChain();
 		MRef<certificate*> getMyCertificate();
 		MRef<ca_db *> getCA_db ();
 
-		void udpSocketRead();
+		void datagramSocketRead(MRef<DatagramSocket *> sock);
 
 	protected:
 		void sendMessage(MRef<SipMessage*> pack, 
-				std::string toaddr, 
+				 const std::string &toaddr,
 				int32_t port, 
 				std::string branch,
 				std::string preferredTransport,
 				bool addVia
 				);
-			
+
+		virtual MRef<SipSocketServer *> findServer( int32_t type, bool ipv6);
+		virtual MRef<Socket *> findServerSocket( int32_t type, bool ipv6);
+
 	private:
-		void addViaHeader( MRef<SipMessage*> pack, MRef<Socket *> socket, std::string branch );
-		MRef<StreamSocket *> findStreamSocket( std::string, uint16_t);
-		MRef<Socket*> findSocket(const std::string &transport,
-					 std::string addr,
-					 uint16_t port);
+		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,
+					 IPAddress &addr,
+					 uint16_t port,
+					 MRef<SipSocketServer*> &server,
+					 MRef<Socket*> &socket);
 		
-		MRef<UDPSocket*> udpsock;
-		MRef<SocketServer*> tcpSocketServer;
-		MRef<SocketServer*> tlsSocketServer;
                 
+		Mutex serversLock;
+		std::list<MRef<SipSocketServer *> > servers;
+
 		Mutex socksLock;
 		std::list<MRef<StreamSocket *> > socks;
 		Mutex socksPendingLock;
 		std::list<MRef<StreamSocket *> > socksPending;
 
-		std::string localIP;
-		std::string contactIP;
-		int32_t externalContactUdpPort;
-		int32_t localUDPPort;
-		int32_t localTCPPort;
-		int32_t localTLSPort;
-		
 		MRef<certificate_chain *> cert_chain;
 		MRef<ca_db *> cert_db;
 		void * tls_ctx;
@@ -151,9 +121,6 @@
 
 };
 
-#include<libmsip/SipMessage.h>
-
-
 void set_debug_print_packets(bool);
 bool get_debug_print_packets();
 

Added: trunk/libmsip/include/libmsip/SipSocketServer.h
===================================================================
--- trunk/libmsip/include/libmsip/SipSocketServer.h	2006-11-17 17:41:43 UTC (rev 2918)
+++ trunk/libmsip/include/libmsip/SipSocketServer.h	2006-11-17 19:14:48 UTC (rev 2919)
@@ -0,0 +1,100 @@
+/*
+  Copyright (C) 2005, 2004 Erik Eliasson, Johan Bilien
+  Copyright (C) 2006 Mikael Magnusson
+  
+  This library is free software; you can redistribute it and/or
+  modify it under the terms of the GNU Lesser General Public
+  License as published by the Free Software Foundation; either
+  version 2.1 of the License, or (at your option) any later version.
+
+  This library is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  Lesser General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public
+  License along with this library; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+/*
+ * Authors: Erik Eliasson <eliasson at it.kth.se>
+ *          Johan Bilien <jobi at via.ecp.fr>
+ *          Mikael Magnusson <mikma at users.sourceforge.net>
+*/
+
+
+#ifndef SipSocketServer_H
+#define SipSocketServer_H
+
+#include<libmsip/libmsip_config.h>
+
+#include<libmnetutil/Socket.h>
+#include<libmnetutil/ServerSocket.h>
+#include<libmutil/Thread.h>
+
+class SipLayerTransport;
+
+/**
+ * Purpose: Listens on a TCP or TLS server socket and reports
+ * when a client connects to it.
+ *
+ */
+class SipSocketServer : public Runnable{
+	public:
+		SipSocketServer(MRef<SipLayerTransport*> r, MRef<Socket*> sock );
+		virtual ~SipSocketServer();
+		std::string getMemObjectType() const {return "SipSocketServer";}
+
+		MRef<Socket *> getSocket() const;
+		MRef<SipLayerTransport *> getReceiver() const;
+
+		bool isIpv6() const;
+		int32_t getType() const;
+
+		const std::string &getExternalIp() const { return externalIp; }
+		void setExternalIp( const std::string &ip ) { externalIp = ip; }
+
+		/** Override server port  */
+		void setExternalPort(int32_t port) { externalPort = port; }
+		int32_t getExternalPort() const { return externalPort; }
+
+		void run();
+		void start();
+		void stop();
+
+		virtual void inputReady();
+
+	private:
+		MRef<Socket *> ssock;
+		MRef<SipLayerTransport *> receiver;
+		bool doStop;
+		std::string externalIp;
+		int32_t externalPort;
+};
+
+
+// 
+// StreamSocketServer
+// 
+
+class StreamSocketServer : public SipSocketServer{
+	public:
+		StreamSocketServer(MRef<SipLayerTransport*> r, MRef<ServerSocket*> sock );
+		std::string getMemObjectType(){return "StreamSocketServer";}
+		virtual void inputReady();
+};
+
+
+// 
+// DatagramSocketServer
+// 
+class DatagramSocketServer : public SipSocketServer{
+	public:
+		DatagramSocketServer(MRef<SipLayerTransport*> r, MRef<DatagramSocket*> sock );
+		std::string getMemObjectType(){return "DatagramSocketServer";}
+		virtual void inputReady();
+};
+
+
+#endif


Property changes on: trunk/libmsip/include/libmsip/SipSocketServer.h
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:eol-style
   + native

Modified: trunk/libmsip/include/libmsip/SipStack.h
===================================================================
--- trunk/libmsip/include/libmsip/SipStack.h	2006-11-17 17:41:43 UTC (rev 2918)
+++ trunk/libmsip/include/libmsip/SipStack.h	2006-11-17 19:14:48 UTC (rev 2919)
@@ -103,6 +103,7 @@
 		
 		//shared with Dialog config
 		std::string localIpString; //GEneral->Network Interface
+		std::string localIp6String;
 		std::string externalContactIP;
 		int32_t externalContactUdpPort;
                 
@@ -127,6 +128,15 @@
                  */
                 bool use100Rel;
 
+		/**
+		 * The certificate chain is used by TLS
+		 */
+		MRef<certificate_chain *> cert;
+
+		/**
+		* TODO: TLS should use the whole chain instead of only the first certificate --EE
+		*/
+		MRef<ca_db *> cert_db;
 };
 
 
@@ -168,11 +178,7 @@
 */
 class LIBMSIP_API SipStack : public Runnable{
 	public:
-		SipStack( MRef<SipStackConfig*> stackConfig,
-				MRef<certificate_chain *> cert=NULL,	//The certificate chain is used by TLS 
-								//TODO: TLS should use the whole chain instead of only the first certificate --EE
-				MRef<ca_db *> cert_db = NULL
-			  );
+		SipStack( MRef<SipStackConfig*> stackConfig );
 
 		~SipStack();
 		
@@ -200,6 +206,7 @@
 
 		std::list<MRef<SipDialog *> > getDialogs();
 
+		void startUdpServer();
 		void startTcpServer();
 		void startTlsServer();
 

Modified: trunk/libmsip/include/libmsip/SipStackInternal.h
===================================================================
--- trunk/libmsip/include/libmsip/SipStackInternal.h	2006-11-17 17:41:43 UTC (rev 2918)
+++ trunk/libmsip/include/libmsip/SipStackInternal.h	2006-11-17 19:14:48 UTC (rev 2919)
@@ -42,11 +42,7 @@
 class SipStackInternal : public SipSMCommandReceiver, public Runnable{
 
 	public:
-		SipStackInternal( MRef<SipStackConfig*> stackConfig,
-				MRef<certificate_chain *> cert=NULL,	//The certificate chain is used by TLS 
-								//TODO: TLS should use the whole chain instead of only the first certificate --EE
-				MRef<ca_db *> cert_db = NULL
-			  );
+		SipStackInternal( MRef<SipStackConfig*> stackConfig );
 
 		void setTransactionHandlesAck(bool transHandleAck);
 
@@ -89,6 +85,14 @@
                 
 		std::string getStackStatusDebugString();
 
+		MRef<SipSocketServer *> createUdpServer( bool ipv6, const std::string &ipString );
+		MRef<SipSocketServer *> createTcpServer( bool ipv6, const std::string &ipString );
+		MRef<SipSocketServer *> createTlsServer( bool ipv6, const std::string &ipString );
+
+		void startUdpServer();
+		void startTcpServer();
+		void startTlsServer();
+
 	private:
 
 //		std::string getDialogDebugString(MRef<SipDialog*> d, list<MRef<SipTransaction*> > &trans,

Modified: trunk/libmsip/source/SipLayerTransport.cxx
===================================================================
--- trunk/libmsip/source/SipLayerTransport.cxx	2006-11-17 17:41:43 UTC (rev 2918)
+++ trunk/libmsip/source/SipLayerTransport.cxx	2006-11-17 19:14:48 UTC (rev 2919)
@@ -1,5 +1,6 @@
 /*
   Copyright (C) 2005, 2004 Erik Eliasson, Johan Bilien
+  Copyright (C) 2005-2006  Mikael Magnusson
   
   This library is free software; you can redistribute it and/or
   modify it under the terms of the GNU Lesser General Public
@@ -19,6 +20,7 @@
 /*
  * Authors: Erik Eliasson <eliasson at it.kth.se>
  *          Johan Bilien <jobi at via.ecp.fr>
+ *          Mikael Magnusson <mikma at users.sourceforge.net>
 */
 
 
@@ -39,10 +41,9 @@
 #include<libmsip/SipException.h>
 #include<libmsip/SipHeaderVia.h>
 #include<libmsip/SipHeaderRoute.h>
+#include<libmsip/SipHeaderContact.h>
 
-#include<libmnetutil/IP4Address.h>
-#include<libmnetutil/IP4ServerSocket.h>
-#include<libmnetutil/TLSServerSocket.h>
+#include<libmnetutil/TLSSocket.h>
 #include<libmnetutil/ServerSocket.h>
 #include<libmnetutil/NetworkException.h>
 #include<libmnetutil/NetworkFunctions.h>
@@ -70,65 +71,10 @@
 #endif
 
 
-SocketServer::SocketServer(MRef<ServerSocket*> sock, MRef<SipLayerTransport*> r): ssock(sock), receiver(r),doStop(false){
+// 
+// SipMessageParser
+// 
 
-}
-
-
-void SocketServer::run(){
-	struct timeval timeout;
-	fd_set set;
-	int fd = ssock->getFd();
-	while (!doStop){
-
-		int avail;
-		do{
-			FD_ZERO(&set);
-			#ifdef WIN32
-			FD_SET( (uint32_t) fd, &set);
-			#else
-			FD_SET(fd, &set);
-			#endif
-			
-			timeout.tv_sec = 5;
-			timeout.tv_usec= 0;
-			avail = select(fd+1,&set,NULL,NULL,&timeout );
-			if (avail<0){
-				Thread::msleep(500);
-			}
-		} while( avail < 0 );
-		//if (avail==0){
-		//	cerr<< "SocketServer::run(): Timeout"<< endl;
-		//}
-		MRef<SipLayerTransport *> r = receiver;
-		if (avail && !doStop && r){
-			MRef<StreamSocket *> ss;
-
-			try{
-				ss = ssock->accept();
-			} catch( NetworkException &){
-			}
-
-			if (ss){
-				r->addSocket(ss);
-			}else{
-				cerr << "Warning: Failed to accept client"<< endl;
-			}
-		}
-
-	}
-
-} // "myself" will be freed here and the object can be freed.
-
-void SocketServer::start(){
-	Thread t(this);
-}
-
-void SocketServer::stop(){
-	doStop=true;
-}
-
-
 class SipMessageParser{
 	public:
 		SipMessageParser();
@@ -324,42 +270,19 @@
 }
 #endif
 
-static void * udpThread( void * arg );
 static void * streamThread( void * arg );
 
-SipLayerTransport::SipLayerTransport(
-						string local_ip, 
-						string contactIP, 
-						int32_t externalContactUdpPort, 
-						int32_t local_udp_port, 
-						int32_t local_tcp_port,
-						int32_t local_tls_port,
-						MRef<certificate_chain *> cchain, 
-						MRef<ca_db *> cert_db
-			):
-			//udpsock(false,local_udp_port),
-			localIP(local_ip),
-			contactIP(contactIP),
-			externalContactUdpPort(externalContactUdpPort),
-			localUDPPort(local_udp_port),
-			localTCPPort(local_tcp_port),
-			localTLSPort(local_tls_port),
-			cert_chain(cchain), 
-			cert_db(cert_db),
-			tls_ctx(NULL)
+SipLayerTransport::SipLayerTransport(MRef<certificate_chain *> cchain,
+				     MRef<ca_db *> cert_db):
+		cert_chain(cchain), cert_db(cert_db), tls_ctx(NULL)
 {
-	udpsock = new UDPSocket(local_udp_port, false );
-	
-	Thread::createThread(udpThread, this);
-	
 	int i;
+
 	for( i=0; i < NB_THREADS ; i++ ){
             Thread::createThread(streamThread, new StreamThreadData(this));
 	}
 }
 
-//void SipLayerTransport::startUdpServer(){ }
-//void SipLayerTransport::stopUdpServer(){ }
 
 bool SipLayerTransport::handleCommand(const SipSMCommand& command ){
 	if( command.getType()==SipSMCommand::COMMAND_PACKET ){
@@ -379,46 +302,63 @@
 	return 0;
 }
 
-void SipLayerTransport::startTcpServer(){
-	try{
-		tcpSocketServer = new SocketServer(new IP4ServerSocket(localTCPPort),this);
-		tcpSocketServer->start();
-	}catch( NetworkException & exc ){
-		cerr << exc.what() << endl;
-		return;
+SipLayerTransport::~SipLayerTransport() {
+}
+  
+void SipLayerTransport::stop(){
+	serversLock.lock();
+	list<MRef<SipSocketServer *> >::iterator i;
+
+	for( i=servers.begin(); i != servers.end(); i++ ){
+		MRef<SipSocketServer *> server = *i;
+
+		server->stop();
 	}
+	serversLock.unlock();
 }
 
-void SipLayerTransport::stopTcpServer(){
-	tcpSocketServer->stop();
-	tcpSocketServer=NULL;
+void SipLayerTransport::addServer( MRef<SipSocketServer *> server )
+{
+	serversLock.lock();
+	server->start();
+	servers.push_back( server );
+	serversLock.unlock();
 }
+  
+MRef<SipSocketServer *> SipLayerTransport::findServer(int32_t type, bool ipv6)
+{
+	list<MRef<SipSocketServer *> >::iterator i;
 
-void SipLayerTransport::startTlsServer(){
-	if( getMyCertificate().isNull() ){
-		merr << "You need a personal certificate to run "
-			"a TLS server. Please specify one in "
-			"the certificate settings. minisip will "
-			"now disable the TLS server." << end;
-		return;
+	for( i=servers.begin(); i != servers.end(); i++ ){
+		MRef<SipSocketServer *> server = *i;
+
+		if( server->isIpv6() == ipv6 &&
+		    server->getType() == type ){
+			return server;
+		}
 	}
+#ifdef DEBUG_OUTPUT
+	cerr << "SipLayerTransport::findServer not found type=" << type << " ipv6=" << ipv6 << endl;
+#endif
+	return NULL;
+}
 
-	try{
-		tlsSocketServer = new SocketServer(new TLSServerSocket(localTLSPort, getMyCertificate(), getCA_db() ),this);
-		tlsSocketServer->start();
-	}catch( NetworkException & exc ){
-		cerr << "Exception caught when creating TCP server." << endl;
-		cerr << exc.what() << endl;
-		return;
+MRef<Socket *> SipLayerTransport::findServerSocket(int32_t type, bool ipv6)
+{
+	MRef<SipSocketServer *> server;
+	serversLock.lock();
+	server = findServer(type, ipv6);
+	serversLock.unlock();
+
+	if( !server ){
+		return NULL;
 	}
 
+	MRef<Socket *> sock = server->getSocket();
 
+	return sock;
 }
 
-void SipLayerTransport::stopTlsServer(){
-	tlsSocketServer->stop();
-	tlsSocketServer=NULL;
-}
 
 /*
 void SipLayerTransport::setSipSMCommandReceiver(MRef<SipSMCommandReceiver*> rec){
@@ -426,38 +366,56 @@
 }
 */
 
-void SipLayerTransport::addViaHeader( MRef<SipMessage*> pack,
-									MRef<Socket *> socket,
-									string branch ){
-	string transport;
-	uint16_t port;
-
-	if( !socket )
-		return;
-	
+string getSocketTransport( MRef<Socket*> socket )
+{
 	switch( socket->getType() ){
 		case SOCKET_TYPE_TLS:
-			transport = "TLS";
-			port = (uint16_t)localTLSPort;
-			break;
-			
+			return "TLS";
+
 		case SOCKET_TYPE_TCP:
-			transport = "TCP";
-			port = (uint16_t)localTCPPort;
-			break;
+			return "TCP";
 			
 		case SOCKET_TYPE_UDP:
-			transport = "UDP";
-			port = (uint16_t)externalContactUdpPort;
-			break;
+			return "UDP";
 
 		default:
 			mdbg<< "SipLayerTransport: Unknown transport protocol " + socket->getType() <<end;
-			return;
+			// TODO more describing exception and message
+			throw NetworkException();
 	}
+}
+
+void getIpPort( MRef<SipSocketServer*> server, MRef<Socket*> socket,
+		string &ip, uint16_t &port )
+{
+	if( server ){
+		port = server->getExternalPort();
+		ip = server->getExternalIp();
+	}
+	else {
+		port = socket->getPort();
+		ip = socket->getLocalAddress()->getString();
+	}
+}
+
+
+void SipLayerTransport::addViaHeader( MRef<SipMessage*> pack,
+									MRef<SipSocketServer *> server,
+									MRef<Socket *> socket,
+									string branch ){
+	string transport;
+	uint16_t port;
+	string ip;
+
+	if( !socket )
+		return;
+
+	transport = getSocketTransport( socket );
+
+	getIpPort( server, socket, ip, port );
 	
 	MRef<SipHeaderValue*> hdrVal = 
-		new SipHeaderValueVia(transport, localIP, port);
+		new SipHeaderValueVia(transport, ip, port);
 
 	// Add rport parameter, defined in RFC 3581
 	hdrVal->addParameter(new SipHeaderParameter("rport", "", false));
@@ -660,16 +618,32 @@
 }
 
 
-MRef<Socket*> SipLayerTransport::findSocket(const string &transport,
-					      /*IPAddress &*/ string destAddr,
-					      uint16_t port)
+bool SipLayerTransport::findSocket(const string &transport,
+				   IPAddress &destAddr,
+				   uint16_t port,
+				   MRef<SipSocketServer*> &server,
+				   MRef<Socket*> &socket)
 {
-	MRef<Socket*> socket;
+	bool ipv6 = false;
+	int32_t type = 0;
 
+	ipv6 = (destAddr.getType() == IP_ADDRESS_TYPE_V6);
+
 	if( transport == "UDP" ){
-		socket = (Socket*)*udpsock;
+		type = SOCKET_TYPE_UDP;
 	}
-	else{
+	else if( transport == "TCP" ){
+		type = SOCKET_TYPE_TCP;
+	}
+	else if( transport == "TLS" ){
+		type = SOCKET_TYPE_TLS;
+	}
+
+	serversLock.lock();
+	server = findServer(type, ipv6);
+	serversLock.unlock();
+
+	if( type & SOCKET_TYPE_STREAM ){
 		MRef<StreamSocket*> ssocket = findStreamSocket(destAddr, port);
 		if( ssocket.isNull() ) {
 			/* No existing StreamSocket to that host,
@@ -688,13 +662,47 @@
 		} else cerr << "SipLayerTransport: sendMessage: reusing old socket" << endl;
 		socket = *ssocket;
 	}
+	else{
+		if( server ){
+			socket = server->getSocket();
+		}
+	}
 
-	return socket;
+	if( !socket ){
+		throw NetworkException();
+	}
+
+	return !socket.isNull();
 }
 
 
+// Set contact uri host and port to external ip and port configured
+// on the server or local address and port of the socket
+void updateContact(MRef<SipMessage*> pack,
+		   MRef<SipSocketServer *> server,
+		   MRef<Socket *> socket)
+{
+	MRef<SipHeaderValueContact*> contactp = pack->getHeaderValueContact();
+	uint16_t port;
+	string ip;
+	string transport;
+
+	if( !contactp )
+		return;
+
+	transport = getSocketTransport( socket );
+	getIpPort( server, socket, ip, port );
+
+	SipUri contactUri = contactp->getUri();
+
+	contactUri.setIp( ip );
+	contactUri.setPort( port );
+	contactUri.setTransport( transport );
+	contactp->setUri( contactUri );
+}
+
 void SipLayerTransport::sendMessage(MRef<SipMessage*> pack, 
-				      /*IPAddress &*/ string ip_addr, 
+				    /* IPAddress &*/ const string &ip_addr,
 				      int32_t port, 
 				      string branch,
 				      string preferredTransport,
@@ -702,8 +710,8 @@
 {
 	MRef<Socket *> socket;
 	MRef<IPAddress *> tempAddr;
-	//IPAddress *destAddr = &ip_addr;
-
+	MRef<IPAddress *> destAddr;
+	MRef<SipSocketServer *> server;
 #ifdef DEBUG_OUTPUT
 	cerr << "SipLayerTransport:  sendMessage addr=" << ip_addr << ", port=" << port << endl;
 #endif
@@ -711,22 +719,41 @@
 				
 	try{
 		socket = pack->getSocket();
+		MRef<IPAddress *>destAddr;
 
 		if( !socket ){
-			socket = findSocket(preferredTransport, ip_addr, (uint16_t)port);
+			// Lookup IPv4 or IPv6 address
+			destAddr = IPAddress::create(ip_addr);
+		}
+		else{
+			// Lookup IPv4 or IPv6 depending on open socket
+			int32_t type = socket->getLocalAddress()->getType();
+			destAddr = IPAddress::create(ip_addr, type == IP_ADDRESS_TYPE_V6);
+		}
+
+		if( !destAddr ){
+			throw HostNotFound( ip_addr );
+		}
+
+		if( !socket ){
+			findSocket(preferredTransport, **destAddr, (uint16_t)port, server, socket);
 			pack->setSocket( socket );
+
+			if( !socket ){
+				// TODO add sensible message
+				throw NetworkException();
+			}
+
+			updateContact( pack, server, socket );
 		}
 
 		if (addVia){
-			addViaHeader( pack, socket, branch );
+			addViaHeader( pack, server, socket, branch );
 		}
 
 		string packetString = pack->getString();
-		if (!socket){
-			cerr << "EE: NO SOCKET"<<endl<<endl;;
-		}
 
-		MRef<UDPSocket *> dsocket = dynamic_cast<UDPSocket*>(*socket);
+		MRef<DatagramSocket *> dsocket = dynamic_cast<DatagramSocket*>(*socket);
 		MRef<StreamSocket *> ssocket = dynamic_cast<StreamSocket*>(*socket);
 		
 		if( ssocket ){
@@ -758,10 +785,9 @@
 			ts.save( tmp );
 
 #endif
-			MRef<IPAddress *>destAddr = IPAddress::create(ip_addr);
+// 			MRef<IPAddress *>destAddr = IPAddress::create(ip_addr);
 
 			
-			if (destAddr){
 				if( dsocket->sendTo( **destAddr, port, 
 							(const void*)packetString.c_str(),
 							(int32_t)packetString.length() ) == -1 ){
@@ -769,21 +795,6 @@
 					throw SendFailed( errno );
 
 				}
-			}else{
-				CommandString transportError( pack->getCallId(), 
-						SipCommandString::transport_error,
-						"SipLayerTransport: host could not be resolved: "+ip_addr);
-				SipSMCommand transportErrorCommand(
-						transportError, 
-						SipSMCommand::transport_layer, 
-						SipSMCommand::transaction_layer);
-
-				if (dispatcher)
-					dispatcher->enqueueCommand( transportErrorCommand, LOW_PRIO_QUEUE );
-				else
-					mdbg<< "SipLayerTransport: ERROR: NO SIP COMMAND RECEIVER - DROPPING COMMAND"<<end;
-
-			}
 		}
 		else{
 			cerr << "No valid socket!" << endl;
@@ -826,7 +837,7 @@
         semaphore.inc();
 }
 
-MRef<StreamSocket *> SipLayerTransport::findStreamSocket( /*IPAddress &*/ string address, uint16_t port ){
+MRef<StreamSocket *> SipLayerTransport::findStreamSocket( IPAddress &address, uint16_t port ){
 	list<MRef<StreamSocket *> >::iterator i;
 
 	socksLock.lock();
@@ -863,22 +874,6 @@
 	}
 }
 
-std::string SipLayerTransport::getLocalIP(){
-	return localIP;
-}
-
-int32_t SipLayerTransport::getLocalUDPPort(){
-	return localUDPPort;
-}
-
-int32_t SipLayerTransport::getLocalTCPPort(){
-	return localTCPPort;
-}
-
-int32_t SipLayerTransport::getLocalTLSPort(){
-	return localTLSPort;
-}
-
 MRef<certificate_chain *> SipLayerTransport::getCertificateChain(){ 
 	return cert_chain; 
 }
@@ -895,48 +890,30 @@
 
 #define UDP_MAX_SIZE 65536
 
-void SipLayerTransport::udpSocketRead(){
+void SipLayerTransport::datagramSocketRead(MRef<DatagramSocket *> sock){
 	char buffer[UDP_MAX_SIZE];
 
-	for (int i=0; i<UDP_MAX_SIZE; i++){
-		buffer[i]=0;
-	}
-	
-	int avail;
 	MRef<SipMessage*> pack;
 	int32_t nread;
-    fd_set set;
 	
-	while( true ){
-		FD_ZERO(&set);
-		#ifdef WIN32
-		FD_SET( (uint32_t) udpsock->getFd(), &set);
-		#else
-		FD_SET(udpsock->getFd(), &set);
-		#endif
-
-		do{
-			avail = select(udpsock->getFd()+1,&set,NULL,NULL,NULL );
-		} while( avail < 0 );
-
-		if( FD_ISSET( udpsock->getFd(), &set )){
+	if( sock ){
 			MRef<IPAddress *> from;
 			int32_t port = 0;
 
-			nread = udpsock->recvFrom((void *)buffer, UDP_MAX_SIZE, from, port);
+			nread = sock->recvFrom((void *)buffer, UDP_MAX_SIZE, from, port);
 			
 			if (nread == -1){
 				mdbg << "Some error occured while reading from UdpSocket"<<end;
-				continue;
+				return;
 			}
 
 			if ( nread == 0){
 				// Connection was closed
-				break;
+				return; // FIXME
 			}
 
 			if (nread < (int)strlen("SIP/2.0")){
-				continue;
+				return;
 			}
 
 			try{
@@ -954,7 +931,7 @@
 #endif
 				pack = SipMessage::createMessage( data );
 				
-				pack->setSocket( *udpsock );
+				pack->setSocket( *sock );
 				updateVia(pack, from, (uint16_t)port);
 				
 				SipSMCommand cmd(pack, 
@@ -974,8 +951,7 @@
 #ifdef DEBUG_OUTPUT
 				mdbg << "Invalid data on UDP socket, discarded" << end;
 #endif
-				cerr<< "Invalid data on UDP socket, discarded" << endl;
-				continue;
+				return;
 			}
 			
 			catch(SipExceptionInvalidStart & ){
@@ -985,10 +961,9 @@
 #ifdef DEBUG_OUTPUT
 				mdbg << "Invalid data on UDP socket, discarded" << end;
 #endif
-				continue;
+				return;
 			}
 		} // if event
-	}// while true
 }
 
 void StreamThreadData::run(){
@@ -1030,7 +1005,7 @@
 	int32_t nread;
 	fd_set set;
 
-	
+
 	while( true ){
 		FD_ZERO(&set);
 		#ifdef WIN32
@@ -1065,6 +1040,7 @@
 
 			if ( nread == 0){
 				// Connection was closed
+				mdbg << "Connection was closed" << end;
 				break;
 			}
 #ifdef ENABLE_TS
@@ -1118,6 +1094,7 @@
 				// This does not look like a SIP
 				// packet, close the connection
 				
+				mdbg << "This does not look like a SIP packet, close the connection" << endl;
 				break;
 			}
 		} // if event
@@ -1132,12 +1109,3 @@
 	return NULL;
 }
 
-static void * udpThread( void * arg ){
-	MRef<SipLayerTransport*>  trans( (SipLayerTransport *)arg);
-
-	trans->udpSocketRead();
-	return NULL;
-}
-
-
-

Added: trunk/libmsip/source/SipSocketServer.cxx
===================================================================
--- trunk/libmsip/source/SipSocketServer.cxx	2006-11-17 17:41:43 UTC (rev 2918)
+++ trunk/libmsip/source/SipSocketServer.cxx	2006-11-17 19:14:48 UTC (rev 2919)
@@ -0,0 +1,152 @@
+/*
+  Copyright (C) 2005, 2004 Erik Eliasson, Johan Bilien
+  Copyright (C) 2005  Mikael Magnusson
+  
+  This library is free software; you can redistribute it and/or
+  modify it under the terms of the GNU Lesser General Public
+  License as published by the Free Software Foundation; either
+  version 2.1 of the License, or (at your option) any later version.
+
+  This library is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+  Lesser General Public License for more details.
+
+  You should have received a copy of the GNU Lesser General Public
+  License along with this library; if not, write to the Free Software
+  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+*/
+
+/*
+ * Authors: Erik Eliasson <eliasson at it.kth.se>
+ *          Johan Bilien <jobi at via.ecp.fr>
+ *          Mikael Magnusson <mikma at users.sourceforge.net>
+*/
+
+
+#include<config.h>
+
+#include<libmnetutil/NetworkException.h>
+#include<libmnetutil/DatagramSocket.h>
+#include<libmsip/SipSocketServer.h>
+#include<libmsip/SipLayerTransport.h>
+
+using namespace std;
+
+// 
+// SipSocketServer
+// 
+
+SipSocketServer::SipSocketServer(MRef<SipLayerTransport*> r, MRef<Socket*> sock): ssock(sock), receiver(r),doStop(false){
+	externalPort = ssock->getPort();
+}
+
+SipSocketServer::~SipSocketServer(){
+}
+
+bool SipSocketServer::isIpv6() const{
+	return ssock->getLocalAddress()->getType() == IP_ADDRESS_TYPE_V6;
+}
+
+int32_t SipSocketServer::getType() const{
+	return ssock->getType();
+}
+
+MRef<Socket *> SipSocketServer::getSocket() const {
+	return ssock;
+}
+
+MRef<SipLayerTransport *> SipSocketServer::getReceiver() const {
+	return receiver;
+}
+
+void SipSocketServer::run(){
+	struct timeval timeout;
+	fd_set set;
+	int fd = ssock->getFd();
+	while (!doStop){
+
+		int avail;
+		do{
+			FD_ZERO(&set);
+			#ifdef WIN32
+			FD_SET( (uint32_t) fd, &set);
+			#else
+			FD_SET(fd, &set);
+			#endif
+			
+			timeout.tv_sec = 5;
+			timeout.tv_usec= 0;
+			avail = select(fd+1,&set,NULL,NULL,&timeout );
+			if (avail<0){
+				Thread::msleep(500);
+			}
+		} while( avail < 0 );
+		if (avail==0){
+// 			cerr<< "SipSocketServer::run(): Timeout"<< endl;
+		}
+		MRef<SipLayerTransport *> r = receiver;
+		if (avail && !doStop && r){
+			inputReady();
+		}
+
+	}
+
+	cerr << "SipSocketServer stopped" << endl;
+} // "myself" will be freed here and the object can be freed.
+
+void SipSocketServer::start(){
+	Thread t(this);
+}
+
+void SipSocketServer::stop(){
+	doStop=true;
+}
+
+void SipSocketServer::inputReady(){
+}
+
+
+// 
+// StreamSocketServer
+// 
+StreamSocketServer::StreamSocketServer(MRef<SipLayerTransport*> r, MRef<ServerSocket*> sock): SipSocketServer(r, *sock){
+}
+
+void StreamSocketServer::inputReady(){
+	MRef<SipLayerTransport *> r = getReceiver();
+	MRef<Socket *> sock = getSocket();
+	if (r && sock){
+		MRef<ServerSocket *> ssock = (ServerSocket*)*sock;
+		MRef<StreamSocket *> ss;
+
+		try{
+			ss = ssock->accept();
+		} catch( NetworkException &){
+		}
+
+		if (ss){
+			r->addSocket(ss);
+		}else{
+			cerr << "Warning: Failed to accept client"<< endl;
+		}
+	}
+}
+
+
+// 
+// DatagramSocketServer
+// 
+
+DatagramSocketServer::DatagramSocketServer(MRef<SipLayerTransport*> r, MRef<DatagramSocket*> sock): SipSocketServer(r, *sock){
+}
+
+void DatagramSocketServer::inputReady(){
+	MRef<SipLayerTransport *> transport = getReceiver();
+	MRef<Socket *> sock = getSocket();
+	if (transport && sock){
+		MRef<DatagramSocket *> dsock = (DatagramSocket*)*sock;
+
+		transport->datagramSocketRead(dsock);
+	}
+}


Property changes on: trunk/libmsip/source/SipSocketServer.cxx
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:eol-style
   + native

Modified: trunk/libmsip/source/SipStack.cxx
===================================================================
--- trunk/libmsip/source/SipStack.cxx	2006-11-17 17:41:43 UTC (rev 2918)
+++ trunk/libmsip/source/SipStack.cxx	2006-11-17 19:14:48 UTC (rev 2919)
@@ -71,11 +71,8 @@
 
 #define STACK (*(MRef<SipStackInternal*> *) sipStackInternal)
 
-SipStack::SipStack( MRef<SipStackConfig *> stackConfig,
-		MRef<certificate_chain *> cert_chain,
-		MRef<ca_db *> cert_db){
-	
-	SipStackInternal *istack = new SipStackInternal(stackConfig, cert_chain, cert_db);
+SipStack::SipStack( MRef<SipStackConfig *> stackConfig ){
+	SipStackInternal *istack = new SipStackInternal(stackConfig);
 
 	sipStackInternal = new MRef<SipStackInternal*>(istack);
 }
@@ -173,12 +170,16 @@
 	STACK->getDispatcher()->setDialogManagement(mgmt);
 }
 
+void SipStack::startUdpServer(){
+	STACK->startUdpServer();
+}
+
 void SipStack::startTcpServer(){
-	STACK->getDispatcher()->getLayerTransport()->startTcpServer();
+	STACK->startTcpServer();
 }
 
 void SipStack::startTlsServer(){
-	STACK->getDispatcher()->getLayerTransport()->startTlsServer();
+	STACK->startTlsServer();
 }
 
 void SipStack::setDebugPrintPackets(bool enable){

Modified: trunk/libmsip/source/SipStackInternal.cxx
===================================================================
--- trunk/libmsip/source/SipStackInternal.cxx	2006-11-17 17:41:43 UTC (rev 2918)
+++ trunk/libmsip/source/SipStackInternal.cxx	2006-11-17 19:14:48 UTC (rev 2919)
@@ -14,11 +14,12 @@
  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  */
 
-/* Copyright (C) 2004 
+/* Copyright (C) 2004-2006
  *
  * Authors: Erik Eliasson <eliasson at it.kth.se>
  *          Johan Bilien <jobi at via.ecp.fr>
  *	    Joachim Orrblad <joachim[at]orrblad.com>
+ *          Mikael Magnusson <mikma at users.sourceforge.net>
 */
 #include<config.h>
 #include<libmsip/SipStackInternal.h>
@@ -60,6 +61,8 @@
 #include<libmsip/SipHeaderTo.h>
 #include<libmsip/SipHeaderWWWAuthenticate.h>
 #include<libmsip/SipCommandString.h>
+#include<libmnetutil/UDPSocket.h>
+#include<libmnetutil/TLSServerSocket.h>
 
 #include<libmutil/massert.h>
 
@@ -68,10 +71,7 @@
 
 using namespace std;
 
-SipStackInternal::SipStackInternal( MRef<SipStackConfig *> stackConfig,
-		MRef<certificate_chain *> cert_chain,
-		MRef<ca_db *> cert_db
-		)
+SipStackInternal::SipStackInternal( MRef<SipStackConfig *> stackConfig )
 {
 	timers = new SipTimers;
 	this->config = stackConfig;
@@ -117,19 +117,11 @@
 	SipHeader::headerFactories.addFactory("WWW-Authenticate", sipHeaderWWWAuthenticateFactory);
 
 	addSupportedExtension("100rel");
+	addSupportedExtension("sdp-anat");
 
 	MRef<SipLayerTransport*> transp = MRef<SipLayerTransport*>(new
-			SipLayerTransport(
-				stackConfig->localIpString,
-				stackConfig->externalContactIP,
-				stackConfig->externalContactUdpPort,
-				stackConfig->localUdpPort,
-				stackConfig->localTcpPort,
-				stackConfig->localTlsPort,
-				cert_chain,
-				cert_db
-				)
-			);
+			   SipLayerTransport(stackConfig->cert,
+					     stackConfig->cert_db));
 
 	// Here we need to really know what we are doing since
 	// we are "breaking the law" of not passing this
@@ -361,4 +353,106 @@
 }
 
 
+MRef<SipSocketServer *> SipStackInternal::createUdpServer( bool ipv6, const string &ipString )
+{
+	int32_t port = config->localUdpPort;
 
+	MRef<DatagramSocket *> sock = new UDPSocket( port, ipv6 );
+	MRef<SipSocketServer *> server;
+
+	server = new DatagramSocketServer( dispatcher->getLayerTransport(), sock );
+	// IPv6 doesn't need different external udp port
+	// since it never is NATed.
+	if( !ipv6 && config->externalContactUdpPort ){
+		server->setExternalPort( config->externalContactUdpPort );
+	}
+	server->setExternalIp( ipString );
+
+	return server;
+}
+
+MRef<SipSocketServer *> SipStackInternal::createTcpServer( bool ipv6, const string &ipString )
+{
+	MRef<ServerSocket *> sock;
+	MRef<SipSocketServer *> server;
+	int32_t port = config->localTcpPort;
+
+	sock = ServerSocket::create( port, ipv6 );
+	server = new StreamSocketServer( dispatcher->getLayerTransport(), sock );
+	server->setExternalIp( ipString );
+
+	return server;
+}
+
+MRef<SipSocketServer *> SipStackInternal::createTlsServer( bool ipv6, const string &ipString )
+{
+	MRef<ServerSocket *> sock;
+	MRef<SipSocketServer *> server;
+	int32_t port = config->localTlsPort;
+
+	sock = new TLSServerSocket( ipv6, port, config->cert->get_first(),
+				    config->cert_db );
+	server = new StreamSocketServer( dispatcher->getLayerTransport(), sock );
+	server->setExternalIp( ipString );
+
+	return server;
+}
+
+void SipStackInternal::startUdpServer()
+{
+	MRef<SipSocketServer *> server;
+	string ipString;
+
+	if( config->externalContactIP.size()>0 )
+		ipString = config->externalContactIP;
+	else
+		ipString = config->localIpString;
+
+	server = createUdpServer( false, ipString );
+	dispatcher->getLayerTransport()->addServer( server );
+
+	if( config->localIp6String != "" ){
+		MRef<SipSocketServer *> server6;
+
+		server6 = createUdpServer( true, config->localIp6String );
+		dispatcher->getLayerTransport()->addServer( server6 );
+	}
+}
+
+
+void SipStackInternal::startTcpServer()
+{
+	MRef<SipSocketServer *> server;
+
+	server = createTcpServer( false, config->localIpString);
+	dispatcher->getLayerTransport()->addServer( server );
+
+	if( config->localIp6String != "" ){
+		MRef<SipSocketServer *> server6;
+
+		server6 = createTcpServer( true, config->localIp6String );
+		dispatcher->getLayerTransport()->addServer( server6 );
+	}
+}
+
+void SipStackInternal::startTlsServer(){
+	MRef<SipSocketServer *> server;
+
+	if( config->cert->get_first().isNull() ){
+		merr << "You need a personal certificate to run "
+			"a TLS server. Please specify one in "
+			"the certificate settings. minisip will "
+			"now disable the TLS server." << end;
+		return;
+	}
+
+	server = createTlsServer( false, config->localIpString );
+	dispatcher->getLayerTransport()->addServer( server );
+
+	if( config->localIp6String != "" ){
+		MRef<SipSocketServer *> server6;
+
+		server6 = createTlsServer( true, config->localIp6String );
+		dispatcher->getLayerTransport()->addServer( server6 );
+	}
+}

Modified: trunk/libmsip/source/transactions/SipTransactionNonInviteClient.cxx
===================================================================
--- trunk/libmsip/source/transactions/SipTransactionNonInviteClient.cxx	2006-11-17 17:41:43 UTC (rev 2918)
+++ trunk/libmsip/source/transactions/SipTransactionNonInviteClient.cxx	2006-11-17 19:14:48 UTC (rev 2919)
@@ -243,8 +243,7 @@
 		massert(!lastRequest.isNull());
 		timerE = sipStackInternal->getTimers()->getT2();
 		requestTimeout(timerE,"timerE");
-		lastRequest->removeAllViaHeaders();
-		send( *lastRequest, true);	//add via, we have removed all from previous request
+		send( *lastRequest, false);
 		
 		return true;
 	}else{
@@ -354,8 +353,7 @@
 		requestTimeout(timerE,"timerE");
 		
 		massert( !lastRequest.isNull());
-		lastRequest->removeAllViaHeaders();
-		send( *lastRequest, true);	// add via header because we have removed all previous ones
+		send( *lastRequest, false);
 		
 		return true;
 	}else{



More information about the Minisip-devel mailing list