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