Author: rco
Date: 2010-04-16 17:33:37 +0200 (Fri, 16 Apr 2010)
New Revision: 1804

Modified:
   trunk/core/AmConfig.cpp
   trunk/core/AmConfig.h
   trunk/core/AmSipDialog.cpp
   trunk/core/AmSipDialog.h
   trunk/core/AmSipDispatcher.cpp
   trunk/core/SipCtrlInterface.cpp
   trunk/core/log.cpp
   trunk/core/sems.cpp
   trunk/core/sems.h
   trunk/core/sip/trans_layer.cpp
   trunk/core/sip/trans_layer.h
   trunk/core/sip/transport.cpp
   trunk/core/sip/transport.h
   trunk/core/sip/udp_trsp.cpp
   trunk/core/sip/udp_trsp.h
Log:
- added support for multiple SIP/UDP receivers.
- some cleanups.


Modified: trunk/core/AmConfig.cpp
===================================================================
--- trunk/core/AmConfig.cpp     2010-04-16 10:09:02 UTC (rev 1803)
+++ trunk/core/AmConfig.cpp     2010-04-16 15:33:37 UTC (rev 1804)
@@ -53,6 +53,7 @@
 int          AmConfig::RtpHighPort             = RTP_HIGHPORT;
 int          AmConfig::SessionProcessorThreads = NUM_SESSION_PROCESSORS;
 int          AmConfig::MediaProcessorThreads   = NUM_MEDIA_PROCESSORS;
+int          AmConfig::SIPServerThreads        = NUM_SIP_SERVERS;
 int          AmConfig::LocalSIPPort            = 5060;
 string       AmConfig::LocalSIPIP              = "";
 string       AmConfig::OutboundProxy           = "";
@@ -150,6 +151,14 @@
   return 1;
 }
 
+int AmConfig::setSIPServerThreads(const string& th){
+  if(sscanf(th.c_str(),"%u",&SIPServerThreads) != 1) {
+    return 0;
+  }
+  return 1;
+}
+
+
 int AmConfig::setDeadRtpTime(const string& drt)
 {
   if(sscanf(drt.c_str(),"%u",&AmConfig::DeadRtpTime) != 1) {

Modified: trunk/core/AmConfig.h
===================================================================
--- trunk/core/AmConfig.h       2010-04-16 10:09:02 UTC (rev 1803)
+++ trunk/core/AmConfig.h       2010-04-16 15:33:37 UTC (rev 1804)
@@ -79,6 +79,8 @@
   static int SessionProcessorThreads;
   /** number of media processor threads */
   static int MediaProcessorThreads;
+  /** number of SIP server threads */
+  static int SIPServerThreads;
   /** the interface SIP requests are sent from - needed for registrar_client */
   static string LocalSIPIP;
   /** the port SIP requests are sent from - optional (default 5060) */
@@ -159,6 +161,8 @@
   static int setSessionProcessorThreads(const string& th);
   /** Setter for parameter MediaProcessorThreads, returns 0 on invalid value */
   static int setMediaProcessorThreads(const string& th);
+  /** Setter for parameter SIPServerThreads, returns 0 on invalid value */
+  static int setSIPServerThreads(const string& th);
   /** Setter for parameter DeadRtpTime, returns 0 on invalid value */
   static int setDeadRtpTime(const string& drt);
 };

Modified: trunk/core/AmSipDialog.cpp
===================================================================
--- trunk/core/AmSipDialog.cpp  2010-04-16 10:09:02 UTC (rev 1803)
+++ trunk/core/AmSipDialog.cpp  2010-04-16 15:33:37 UTC (rev 1804)
@@ -69,13 +69,19 @@
 
 void AmSipDialog::updateStatus(const AmSipRequest& req)
 {
-  if (req.method == "ACK")
+  if (req.method == "ACK") {
+    // || (req.method == "CANCEL")
     return;
+  }
 
   if(uas_trans.find(req.cseq) == uas_trans.end()){
       DBG("req.tt = {%p,%p}\n",req.tt._bucket, req.tt._t);
       uas_trans[req.cseq] = AmSipTransaction(req.method,req.cseq,req.tt);
   }
+  // else {
+  //   // shouldn't we drop those requests?
+  //   // (CANCEL requests should have been handled before)
+  // }
 
   // target refresh requests
   if (req.from_uri.length() && 
@@ -334,7 +340,12 @@
   if(updateStatusReply(req,code))
     return -1;
 
-  return SipCtrlInterface::send(reply);
+  int ret = SipCtrlInterface::send(reply);
+  if(ret){
+    ERROR("Could not send reply: code=%i; reason='%s'; method=%s; call-id=%s; 
cseq=%i\n",
+         
reply.code,reply.reason.c_str(),req.method.c_str(),req.callid.c_str(),req.cseq);
+  }
+  return ret;
 }
 
 /* static */
@@ -353,7 +364,12 @@
   if (AmConfig::Signature.length())
     reply.hdrs += SIP_HDR_COLSP(SIP_HDR_SERVER) + AmConfig::Signature + CRLF;
 
-  return SipCtrlInterface::send(reply);
+  int ret = SipCtrlInterface::send(reply);
+  if(ret){
+    ERROR("Could not send reply: code=%i; reason='%s'; method=%s; call-id=%s; 
cseq=%i\n",
+         
reply.code,reply.reason.c_str(),req.method.c_str(),req.callid.c_str(),req.cseq);
+  }
+  return ret;
 }
 
 
@@ -609,15 +625,15 @@
 }
 
 
-bool AmSipDialog::match_cancel(const AmSipRequest& cancel_req)
-{
-  TransMap::iterator t = uas_trans.find(cancel_req.cseq);
+// bool AmSipDialog::match_cancel(const AmSipRequest& cancel_req)
+// {
+//   TransMap::iterator t = uas_trans.find(cancel_req.cseq);
 
-  if((t != uas_trans.end()) && (t->second.method == "INVITE"))
-    return true;
+//   if((t != uas_trans.end()) && (t->second.method == "INVITE"))
+//     return true;
 
-  return false;
-}
+//   return false;
+// }
 
 string AmSipDialog::get_uac_trans_method(unsigned int cseq)
 {

Modified: trunk/core/AmSipDialog.h
===================================================================
--- trunk/core/AmSipDialog.h    2010-04-16 10:09:02 UTC (rev 1803)
+++ trunk/core/AmSipDialog.h    2010-04-16 15:33:37 UTC (rev 1804)
@@ -193,7 +193,7 @@
    * @return true if a transaction could be found that
    *              matches the CANCEL's one.
    */
-  bool match_cancel(const AmSipRequest& cancel_req);
+  //bool match_cancel(const AmSipRequest& cancel_req);
 
   /**
    * @return the method of the corresponding uac request

Modified: trunk/core/AmSipDispatcher.cpp
===================================================================
--- trunk/core/AmSipDispatcher.cpp      2010-04-16 10:09:02 UTC (rev 1803)
+++ trunk/core/AmSipDispatcher.cpp      2010-04-16 15:33:37 UTC (rev 1804)
@@ -70,9 +70,14 @@
       if(!ev_disp->post(local_tag,ev)) {
 
          delete ev;
-         
-         AmSipDialog::reply_error(req,481,
-             "Call leg/Transaction does not exist");
+         if(req.method != "ACK") {
+           AmSipDialog::reply_error(req,481,
+                                    "Call leg/Transaction does not exist");
+         }
+         else {
+           ERROR("received ACK for non-existing dialog 
(callid=%s;remote_tag=%s;local_tag=%s)\n",
+                 callid.c_str(),remote_tag.c_str(),local_tag.c_str());
+         }
       }
 
       return;
@@ -84,7 +89,6 @@
   }
   
   DBG("method: `%s' [%zd].\n", req.method.c_str(), req.method.length());
-  
   if(req.method == "INVITE"){
       
       AmSessionContainer::instance()->startSessionUAS(req);

Modified: trunk/core/SipCtrlInterface.cpp
===================================================================
--- trunk/core/SipCtrlInterface.cpp     2010-04-16 10:09:02 UTC (rev 1803)
+++ trunk/core/SipCtrlInterface.cpp     2010-04-16 15:33:37 UTC (rev 1804)
@@ -288,15 +288,27 @@
 {
     INFO("Starting SIP control interface\n");
 
-    udp_trsp* udp_server =  new udp_trsp(trans_layer::instance());
+    udp_trsp_socket* udp_socket = new udp_trsp_socket;
+    udp_socket->bind(bind_addr,bind_port);
 
-    trans_layer::instance()->register_transport(udp_server);
-    udp_server->bind(bind_addr,bind_port);
-    
+    trans_layer::instance()->register_transport(udp_socket);
+
+    udp_trsp** udp_servers = new udp_trsp*[AmConfig::SIPServerThreads];
+
     wheeltimer::instance()->start();
 
-    udp_server->start();
-    udp_server->join();
+    for(int i=0; i<AmConfig::SIPServerThreads;i++){
+       udp_servers[i] = new udp_trsp(udp_socket);
+       udp_servers[i]->start();
+    }
+
+    for(int i=0; i<AmConfig::SIPServerThreads;i++){
+       udp_servers[i]->join();
+       delete udp_servers[i];
+    }
+
+    delete [] udp_servers;
+    delete udp_socket;
 }
 
 int SipCtrlInterface::send(const AmSipReply &rep)

Modified: trunk/core/log.cpp
===================================================================
--- trunk/core/log.cpp  2010-04-16 10:09:02 UTC (rev 1803)
+++ trunk/core/log.cpp  2010-04-16 15:33:37 UTC (rev 1804)
@@ -93,8 +93,12 @@
   }
 }
 
+AmMutex dprint_mut;
+
 void dprint(int level, const char* fct, const char* file, int line, const 
char* fmt, ...)
 {
+  dprint_mut.lock();
+
   va_list ap;
 
 #ifndef _DEBUG
@@ -106,6 +110,8 @@
   vfprintf(stderr,fmt,ap);
   fflush(stderr);
   va_end(ap);
+
+  dprint_mut.unlock();
 }
 
 void log_print (int level, const char* fmt, ...)

Modified: trunk/core/sems.cpp
===================================================================
--- trunk/core/sems.cpp 2010-04-16 10:09:02 UTC (rev 1803)
+++ trunk/core/sems.cpp 2010-04-16 15:33:37 UTC (rev 1804)
@@ -98,22 +98,24 @@
     static AmCondition<bool>  need_clean(true);
 
     clean_up_mut.lock();
+
     if(need_clean.get()) {
+
       need_clean.set(false);
+      clean_up_mut.unlock();
 
       AmSessionContainer::dispose();
 
       AmRtpReceiver::dispose();
 
-      //AmServer::dispose();
-
       AmMediaProcessor::dispose();
 
       AmEventDispatcher::dispose();
     } 
+    else {
+      clean_up_mut.unlock();
+    }
 
-    clean_up_mut.unlock();
-
     INFO("Finished.\n");
 
     unlink(pid_file.c_str());

Modified: trunk/core/sems.h
===================================================================
--- trunk/core/sems.h   2010-04-16 10:09:02 UTC (rev 1803)
+++ trunk/core/sems.h   2010-04-16 15:33:37 UTC (rev 1804)
@@ -56,6 +56,8 @@
 #define NUM_SESSION_PROCESSORS 10    
 // threads to start for RTP processing
 #define NUM_MEDIA_PROCESSORS 1
+// number of SIP servers to start
+#define NUM_SIP_SERVERS 4
 
 #define MAX_NET_DEVICES     32
 

Modified: trunk/core/sip/trans_layer.cpp
===================================================================
--- trunk/core/sip/trans_layer.cpp      2010-04-16 10:09:02 UTC (rev 1803)
+++ trunk/core/sip/trans_layer.cpp      2010-04-16 15:33:37 UTC (rev 1804)
@@ -82,7 +82,7 @@
     this->ua = ua;
 }
 
-void trans_layer::register_transport(udp_trsp* trsp)
+void trans_layer::register_transport(trsp_socket* trsp)
 {
     transport = trsp;
 }
@@ -123,7 +123,7 @@
     bucket->lock();
     if(!bucket->exist(t)){
        bucket->unlock();
-       ERROR("Invalid transaction key: transaction does not exist\n");
+       ERROR("Invalid transaction key: transaction does not exist 
(%p;%p)\n",bucket,t);
        return -1;
     }
 
@@ -744,9 +744,9 @@
     compute_branch(branch_buf,msg->callid->value,msg->cseq->value);
     cstring branch(branch_buf,BRANCH_BUF_LEN);
     
-    string via(transport->get_local_ip());
-    if(transport->get_local_port() != 5060)
-       via += ":" + int2str(transport->get_local_port());
+    string via(transport->get_ip());
+    if(transport->get_port() != 5060)
+       via += ":" + int2str(transport->get_port());
 
     // add 'rport' parameter defaultwise? yes, for now
     request_len += via_len(stl2cstr(via),branch,true);
@@ -877,9 +877,9 @@
     compute_branch(branch_buf,req->callid->value,get_cseq(req)->num_str);
     cstring branch(branch_buf,BRANCH_BUF_LEN);
     
-    string via(transport->get_local_ip());
-    if(transport->get_local_port() != 5060)
-       via += ":" + int2str(transport->get_local_port());
+    string via(transport->get_ip());
+    if(transport->get_port() != 5060)
+       via += ":" + int2str(transport->get_port());
 
     //TODO: add 'rport' parameter by default?
 

Modified: trunk/core/sip/trans_layer.h
===================================================================
--- trunk/core/sip/trans_layer.h        2010-04-16 10:09:02 UTC (rev 1803)
+++ trunk/core/sip/trans_layer.h        2010-04-16 15:33:37 UTC (rev 1804)
@@ -41,7 +41,7 @@
 struct sockaddr_storage;
 
 class trans_bucket;
-class udp_trsp;
+class trsp_socket;
 class sip_ua;
 class timer;
 
@@ -72,8 +72,8 @@
      */
     static trans_layer* _instance;
 
-    sip_ua*   ua;
-    udp_trsp* transport;
+    sip_ua*      ua;
+    trsp_socket* transport;
     
     
     /** Avoid external instantiation. @see instance(). */
@@ -143,7 +143,7 @@
      * Register a transport instance.
      * This method MUST be called ONCE.
      */
-    void register_transport(udp_trsp* trsp);
+    void register_transport(trsp_socket* trsp);
 
     /**
      * Sends a UAS reply.

Modified: trunk/core/sip/transport.cpp
===================================================================
--- trunk/core/sip/transport.cpp        2010-04-16 10:09:02 UTC (rev 1803)
+++ trunk/core/sip/transport.cpp        2010-04-16 15:33:37 UTC (rev 1804)
@@ -25,19 +25,78 @@
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 #include "transport.h"
+#include "../SipCtrlInterface.h"
+#include "../log.h"
+
 #include <assert.h>
+#include <netinet/in.h>
 
-transport::transport(trans_layer* tl)
-    : tl(tl)
+trsp_socket::trsp_socket()
+    : sd(0), ip(), port(0)
 {
-    assert(tl);
+    memset(&addr,0,sizeof(sockaddr_storage));
 }
 
-transport::~transport()
+trsp_socket::~trsp_socket()
 {
+}
 
+const char* trsp_socket::get_ip()
+{
+    return ip.c_str();
 }
 
+unsigned short trsp_socket::get_port()
+{
+    return port;
+}
+
+void trsp_socket::copy_addr_to(sockaddr_storage* sa)
+{
+    memcpy(sa,&addr,sizeof(sockaddr_storage));
+}
+
+int trsp_socket::get_sd()
+{
+    return sd;
+}
+
+int trsp_socket::send(const sockaddr_storage* sa, const char* msg, const int 
msg_len)
+{
+    if ((SipCtrlInterface::log_raw_messages >= 0)
+       && (SipCtrlInterface::log_raw_messages <= log_level)) {
+       _LOG(SipCtrlInterface::log_raw_messages, 
+            "send  msg\n--++--\n%.*s--++--\n", msg_len, msg);
+    }
+
+  int err;
+#ifdef SUPPORT_IPV6
+  if (sa->ss_family == AF_INET6) {
+    err = sendto(sd, msg, msg_len, 0, (const struct sockaddr*)sa, 
sizeof(sockaddr_in6));
+  }
+  else {
+#endif
+    err = sendto(sd, msg, msg_len, 0, (const struct sockaddr*)sa, 
sizeof(sockaddr_in));
+#ifdef SUPPORT_IPV6
+  }
+#endif
+
+  if (err < 0) {
+    ERROR("sendto: %s\n",strerror(errno));
+    return err;
+  }
+  else if (err != msg_len) {
+    ERROR("sendto: sent %i instead of %i bytes\n", err, msg_len);
+    return -1;
+  }
+
+  return 0;
+}
+
+transport::~transport()
+{
+}
+
 /** EMACS **
  * Local variables:
  * mode: c++

Modified: trunk/core/sip/transport.h
===================================================================
--- trunk/core/sip/transport.h  2010-04-16 10:09:02 UTC (rev 1803)
+++ trunk/core/sip/transport.h  2010-04-16 15:33:37 UTC (rev 1804)
@@ -28,46 +28,77 @@
 #define _transport_h_
 
 #include "../AmThread.h"
+#include <sys/socket.h>
+
 #include <string>
-
 using std::string;
 
-class trans_layer;
-struct sockaddr_storage;
-
 #define SAv4(addr) \
             ((struct sockaddr_in*)addr)
 
+#define SAv6(addr) \
+            ((struct sockaddr_in6*)addr)
 
-class transport: public AmThread
+class trsp_socket
 {
- protected:
-    /**
-     * Transaction layer pointer.
-     * This is used for received messages.
-     */
-    trans_layer* tl;
+protected:
+    // socket descriptor
+    int sd;
 
- public:
-    transport(trans_layer* tl);
+    // bound address
+    sockaddr_storage addr;
 
-    virtual ~transport();
-    
+    // bound IP
+    string           ip;
+
+    // bound port number
+    unsigned short   port;
+
+public:
+    trsp_socket();
+    virtual ~trsp_socket();
+
     /**
-     * Binds the transport server to an address
+     * Binds the transport socket to an address
      * @return -1 if error(s) occured.
      */
     virtual int bind(const string& address, unsigned short port)=0;
 
     /**
+     * Getter for IP address
+     */
+    const char* get_ip();
+    
+    /**
+     * Getter for the port number
+     */
+    unsigned short get_port();
+
+    /**
+     *  Getter for the socket descriptor
+     */
+    int get_sd();
+
+    /**
+     * Copy the internal address into the given one (sa).
+     */
+    void copy_addr_to(sockaddr_storage* sa);
+
+    /**
      * Sends a message.
      * @return -1 if error(s) occured.
      */
-    virtual int send(const sockaddr_storage* sa, const char* msg, const int 
msg_len)=0;
+    virtual int send(const sockaddr_storage* sa, const char* msg, const int 
msg_len);
+};
 
-    virtual const char* get_local_ip()=0;
-    virtual unsigned short get_local_port()=0;
-    virtual void copy_local_addr(sockaddr_storage* sa)=0;
+class transport: public AmThread
+{
+protected:
+    trsp_socket* sock;
+
+public:
+    transport(trsp_socket* sock): sock(sock) {}
+    virtual ~transport();
 };
 
 #endif

Modified: trunk/core/sip/udp_trsp.cpp
===================================================================
--- trunk/core/sip/udp_trsp.cpp 2010-04-16 10:09:02 UTC (rev 1803)
+++ trunk/core/sip/udp_trsp.cpp 2010-04-16 15:33:37 UTC (rev 1804)
@@ -58,33 +58,108 @@
 //     u_char          data[DSTADDR_DATASIZE];
 // };
 
-
-udp_trsp::udp_trsp(trans_layer* tl)
-    : transport(tl), sd(0)
+/** @see trsp_socket */
+int udp_trsp_socket::bind(const string& bind_ip, unsigned short bind_port)
 {
-    tl->register_transport(this);
-}
+    if(sd){
+       WARN("re-binding socket\n");
+       close(sd);
+    }
+    
+    memset(&addr,0,sizeof(addr));
 
-udp_trsp::~udp_trsp()
-{
-}
+    addr.ss_family = AF_INET;
+#if defined(BSD44SOCKETS)
+    addr.ss_len = sizeof(struct sockaddr_in);
+#endif
+    SAv4(&addr)->sin_port = htons(bind_port);
 
+    if(inet_aton(bind_ip.c_str(),&SAv4(&addr)->sin_addr)<0){
+       
+       ERROR("inet_aton: %s\n",strerror(errno));
+       return -1;
+    }
 
-const char* udp_trsp::get_local_ip()
-{
-    return local_ip.c_str();
+    if(SAv4(&addr)->sin_addr.s_addr == INADDR_ANY){
+       ERROR("Sorry, we cannot bind 'ANY' address\n");
+       return -1;
+    }
+
+    if((sd = socket(PF_INET,SOCK_DGRAM,0)) == -1){
+       ERROR("socket: %s\n",strerror(errno));
+       return -1;
+    } 
+    
+
+    if(::bind(sd,(const struct sockaddr*)&addr,
+            sizeof(struct sockaddr_in))) {
+
+       ERROR("bind: %s\n",strerror(errno));
+       close(sd);
+       return -1;
+    }
+    
+    int true_opt = 1;
+    if(setsockopt(sd, SOL_SOCKET, SO_REUSEADDR,
+                 (void*)&true_opt, sizeof (true_opt)) == -1) {
+       
+       ERROR("%s\n",strerror(errno));
+       close(sd);
+       return -1;
+    }
+
+    if(setsockopt(sd, IPPROTO_IP, DSTADDR_SOCKOPT,
+                 (void*)&true_opt, sizeof (true_opt)) == -1) {
+       
+       ERROR("%s\n",strerror(errno));
+       close(sd);
+       return -1;
+    }
+
+    if (SipCtrlInterface::udp_rcvbuf > 0) {
+       DBG("trying to set SIP UDP socket buffer to %d\n",
+           SipCtrlInterface::udp_rcvbuf);
+       if(setsockopt(sd, SOL_SOCKET, SO_RCVBUF,
+                     (void*)&SipCtrlInterface::udp_rcvbuf,
+                     sizeof (SipCtrlInterface::udp_rcvbuf)) == -1) {
+           WARN("could not set SIP UDP socket buffer: '%s'\n",
+                strerror(errno));
+       } else {
+           socklen_t optlen;
+           int set_rcvbuf_size=0;
+           if (getsockopt(sd, SOL_SOCKET, SO_RCVBUF,
+                          &set_rcvbuf_size, &optlen) == -1) {
+               WARN("could not read back SIP UDP socket buffer length: '%s'\n",
+                    strerror(errno));
+           } else {
+               if (set_rcvbuf_size != SipCtrlInterface::udp_rcvbuf) {
+                   WARN("failed to set SIP UDP RCVBUF size (wanted %d, got 
%d)\n",
+                        SipCtrlInterface::udp_rcvbuf, set_rcvbuf_size);
+               }
+           }
+       }
+    }
+
+    port = bind_port;
+    ip   = bind_ip;
+
+    DBG("UDP transport bound to %s:%i\n",ip.c_str(),port);
+
+    return 0;
 }
 
-unsigned short udp_trsp::get_local_port()
+/** @see trsp_socket */
+
+udp_trsp::udp_trsp(udp_trsp_socket* sock)
+    : transport(sock)
 {
-    return local_port;
 }
 
-void udp_trsp::copy_local_addr(sockaddr_storage* sa)
+udp_trsp::~udp_trsp()
 {
-    memcpy(sa,&local_addr,sizeof(sockaddr_storage));
 }
 
+
 /** @see AmThread */
 void udp_trsp::run()
 {
@@ -107,16 +182,18 @@
     msg.msg_control    = new u_char[DSTADDR_DATASIZE];
     msg.msg_controllen = DSTADDR_DATASIZE;
 
-    if(sd<=0){
+    if(sock->get_sd()<=0){
        ERROR("Transport instance not bound\n");
        return;
     }
 
+    DBG("Started UDP server listening to 
%s:%i\n",sock->get_ip(),sock->get_port());
+
     while(true){
 
-       DBG("before recvmsg (%s:%i)\n",local_ip.c_str(),local_port);
+       //DBG("before recvmsg (%s:%i)\n",sock->get_ip(),sock->get_port());
 
-       buf_len = recvmsg(sd,&msg,0);
+       buf_len = recvmsg(sock->get_sd(),&msg,0);
        if(buf_len <= 0){
            ERROR("recvfrom returned %d: %s\n",buf_len,strerror(errno));
            switch(errno){
@@ -148,13 +225,13 @@
                 cmsgptr->cmsg_type == DSTADDR_SOCKOPT) {
                
                s_msg->local_ip.ss_family = AF_INET;
-               ((sockaddr_in*)(&s_msg->local_ip))->sin_port   = 
htons(local_port);
+               ((sockaddr_in*)(&s_msg->local_ip))->sin_port   = 
htons(sock->get_port());
                 
memcpy(&((sockaddr_in*)(&s_msg->local_ip))->sin_addr,dstaddr(cmsgptr),sizeof(in_addr));
             }
         } 
 
        // pass message to the parser / transaction layer
-       tl->received_msg(s_msg);
+       trans_layer::instance()->received_msg(s_msg);
     }
 }
 
@@ -165,128 +242,7 @@
 }
 
     
-/** @see transport */
-int udp_trsp::bind(const string& address, unsigned short port)
-{
-    if(sd){
-       WARN("re-binding socket\n");
-       close(sd);
-    }
-    
-    memset(&local_addr,0,sizeof(local_addr));
-    local_addr.ss_family = AF_INET;
-#if defined(BSD44SOCKETS)
-    local_addr.ss_len = sizeof(struct sockaddr_in);
-#endif
-    SAv4(&local_addr)->sin_port = htons(port);
 
-    if(inet_aton(address.c_str(),&SAv4(&local_addr)->sin_addr)<0){
-       
-       ERROR("inet_aton: %s\n",strerror(errno));
-       return -1;
-    }
-
-    if(SAv4(&local_addr)->sin_addr.s_addr == INADDR_ANY){
-       ERROR("Sorry, we cannot bind 'ANY' address\n");
-       return -1;
-    }
-
-    if((sd = socket(PF_INET,SOCK_DGRAM,0)) == -1){
-       ERROR("socket: %s\n",strerror(errno));
-       return -1;
-    } 
-    
-
-    if(::bind(sd,(const struct sockaddr*)&local_addr,
-            sizeof(struct sockaddr_in))) {
-
-       ERROR("bind: %s\n",strerror(errno));
-       close(sd);
-       return -1;
-    }
-    
-    int true_opt = 1;
-    if(setsockopt(sd, SOL_SOCKET, SO_REUSEADDR,
-                 (void*)&true_opt, sizeof (true_opt)) == -1) {
-       
-       ERROR("%s\n",strerror(errno));
-       close(sd);
-       return -1;
-    }
-
-    if(setsockopt(sd, IPPROTO_IP, DSTADDR_SOCKOPT,
-                 (void*)&true_opt, sizeof (true_opt)) == -1) {
-       
-       ERROR("%s\n",strerror(errno));
-       close(sd);
-       return -1;
-    }
-
-    if (SipCtrlInterface::udp_rcvbuf > 0) {
-       DBG("trying to set SIP UDP socket buffer to %d\n",
-           SipCtrlInterface::udp_rcvbuf);
-       if(setsockopt(sd, SOL_SOCKET, SO_RCVBUF,
-                     (void*)&SipCtrlInterface::udp_rcvbuf,
-                     sizeof (SipCtrlInterface::udp_rcvbuf)) == -1) {
-           WARN("could not set SIP UDP socket buffer: '%s'\n",
-                strerror(errno));
-       } else {
-           socklen_t optlen;
-           int set_rcvbuf_size=0;
-           if (getsockopt(sd, SOL_SOCKET, SO_RCVBUF,
-                          &set_rcvbuf_size, &optlen) == -1) {
-               WARN("could not read back SIP UDP socket buffer length: '%s'\n",
-                    strerror(errno));
-           } else {
-               if (set_rcvbuf_size != SipCtrlInterface::udp_rcvbuf) {
-                   WARN("failed to set SIP UDP RCVBUF size (wanted %d, got 
%d)\n",
-                        SipCtrlInterface::udp_rcvbuf, set_rcvbuf_size);
-               }
-           }
-       }
-    }
-
-    local_port = port;
-    local_ip   = address;
-
-    DBG("UDP transport bound to %s:%i\n",address.c_str(),port);
-
-    return 0;
-}
-
-/** @see transport */
-int udp_trsp::send(const sockaddr_storage* sa, const char* msg, const int 
msg_len)
-{
-    if ((SipCtrlInterface::log_raw_messages >= 0)
-       && (SipCtrlInterface::log_raw_messages <=log_level)) {
-       _LOG(SipCtrlInterface::log_raw_messages, 
-            "send  msg\n--++--\n%.*s--++--\n", msg_len, msg);
-    }
-
-  int err;
-#ifdef SUPPORT_IPV6
-  if (sa->ss_family == AF_INET6) {
-    err = sendto(sd, msg, msg_len, 0, (const struct sockaddr*)sa, 
sizeof(sockaddr_in6));
-  }
-  else {
-#endif
-    err = sendto(sd, msg, msg_len, 0, (const struct sockaddr*)sa, 
sizeof(sockaddr_in));
-#ifdef SUPPORT_IPV6
-  }
-#endif
-
-  if (err < 0) {
-    ERROR("sendto: %s\n",strerror(errno));
-    return err;
-  }
-  else if (err != msg_len) {
-    ERROR("sendto: sent %i instead of %i bytes\n", err, msg_len);
-    return -1;
-  }
-
-  return 0;
-}
-
 /** EMACS **
  * Local variables:
  * mode: c++

Modified: trunk/core/sip/udp_trsp.h
===================================================================
--- trunk/core/sip/udp_trsp.h   2010-04-16 10:09:02 UTC (rev 1803)
+++ trunk/core/sip/udp_trsp.h   2010-04-16 15:33:37 UTC (rev 1804)
@@ -40,40 +40,31 @@
 #include <string>
 using std::string;
 
-class udp_trsp: public transport
+class udp_trsp_socket: public trsp_socket
 {
-    // socket descriptor
-    int sd;
+public:
+    udp_trsp_socket() : trsp_socket() {}
+    ~udp_trsp_socket() {}
 
-    // bound port number
-    unsigned short local_port;
+    /**
+     * Binds the transport socket to an address
+     * @return -1 if error(s) occured.
+     */
+    virtual int bind(const string& address, unsigned short port);
+};
 
-    // bound IP
-    string local_ip;
-
-    // bound address
-    sockaddr_storage local_addr;
-
- protected:
+class udp_trsp: public transport
+{
+protected:
     /** @see AmThread */
     void run();
     /** @see AmThread */
     void on_stop();
-
- public:
+    
+public:
     /** @see transport */
-    udp_trsp(trans_layer* tl);
+    udp_trsp(udp_trsp_socket* sock);
     ~udp_trsp();
-
-    /** @see transport */
-    int bind(const string& address, unsigned short port);
-
-    /** @see transport */
-    int send(const sockaddr_storage* sa, const char* msg, const int msg_len);
-
-    const char* get_local_ip();
-    unsigned short get_local_port();
-    void copy_local_addr(sockaddr_storage* sa);
 };
 
 #endif

_______________________________________________
Semsdev mailing list
[email protected]
http://lists.iptel.org/mailman/listinfo/semsdev

Reply via email to