Author: rco
Date: 2008-05-14 09:58:25 +0200 (Wed, 14 May 2008)
New Revision: 941

Modified:
   trunk/core/plug-in/sipctrl/SipCtrlInterface.cpp
   trunk/core/plug-in/sipctrl/sip_trans.cpp
   trunk/core/plug-in/sipctrl/trans_layer.cpp
   trunk/core/plug-in/sipctrl/trans_layer.h
Log:
- fixes Route-Set for in-dialog ACKs where reply does not contain any RR 
headers.


Modified: trunk/core/plug-in/sipctrl/SipCtrlInterface.cpp
===================================================================
--- trunk/core/plug-in/sipctrl/SipCtrlInterface.cpp     2008-05-14 05:51:53 UTC 
(rev 940)
+++ trunk/core/plug-in/sipctrl/SipCtrlInterface.cpp     2008-05-14 07:58:25 UTC 
(rev 941)
@@ -557,18 +557,12 @@
     reply.dstip = get_addr_str(((sockaddr_in*)(&msg->local_ip))->sin_addr); 
//FIXME: IPv6
     reply.port  = int2str(ntohs(((sockaddr_in*)(&msg->local_ip))->sin_port));
 
-    if( (get_cseq(msg)->method == sip_request::INVITE) 
-       && (msg->u.reply->code >= 200) 
-       && (msg->u.reply->code < 300) ){
-       
-       tl->send_200_ack(msg);
-    }
+    //if( (get_cseq(msg)->method == sip_request::INVITE) 
+    //         && (msg->u.reply->code >= 200) 
+    //         && (msg->u.reply->code < 300) ){
+    //         tl->send_200_ack(msg);
+    //}
 
-    //
-    // Will be computed in send_request()
-    //
-    // reply.next_hop;
-
     prepare_routes_uac(msg->record_route, reply.route);
 
     for (list<sip_header*>::iterator it = msg->hdrs.begin(); 

Modified: trunk/core/plug-in/sipctrl/sip_trans.cpp
===================================================================
--- trunk/core/plug-in/sipctrl/sip_trans.cpp    2008-05-14 05:51:53 UTC (rev 
940)
+++ trunk/core/plug-in/sipctrl/sip_trans.cpp    2008-05-14 07:58:25 UTC (rev 
941)
@@ -38,6 +38,9 @@
     reset_all_timers();
     delete msg;
     delete [] retr_buf;
+    if((type == TT_UAC) && to_tag.s){
+       delete [] to_tag.s;
+    }
 }
 
 /**

Modified: trunk/core/plug-in/sipctrl/trans_layer.cpp
===================================================================
--- trunk/core/plug-in/sipctrl/trans_layer.cpp  2008-05-14 05:51:53 UTC (rev 
940)
+++ trunk/core/plug-in/sipctrl/trans_layer.cpp  2008-05-14 07:58:25 UTC (rev 
941)
@@ -876,7 +876,7 @@
            case TS_PROCEEDING:
                
                t->state = TS_COMPLETED;
-               send_non_200_ack(t,msg);
+               send_non_200_ack(msg,t);
                
                // TODO: set D timer if UDP
                t->reset_timer(STIMER_D, D_TIMER, bucket->get_id());
@@ -909,10 +909,35 @@
                //        - (send BYE (check for existing UAC trans)).
                //      - else:
                //        - re-transmit ACK.
-               t->state = TS_TERMINATED;
-               bucket->remove_trans(t);
+
+               t->state  = TS_TERMINATED_200;
+
+               t->to_tag.s = new char[to_tag.len];
+               t->to_tag.len = to_tag.len;
+               memcpy((void*)t->to_tag.s,to_tag.s,to_tag.len);
+               
+               send_200_ack(msg,t);
+
                goto pass_reply;
                
+           case TS_TERMINATED_200:
+               
+               if( (to_tag.len != t->to_tag.len) ||
+                   (memcmp(to_tag.s,t->to_tag.s,to_tag.len) != 0) ){
+
+                   // TODO: 
+                   //   (this should be implemented in the UA)
+                   //   we should send 200 ACK also here,
+                   //   but this would mean that we should
+                   //   also be sending a BYE also to quit
+                   //   this dialog.
+                   //
+                   goto end;
+               }
+
+               retransmit(t);
+               goto end;
+
            default:
                goto end;
            }
@@ -1045,7 +1070,7 @@
     return -1;
 }
 
-void trans_layer::send_non_200_ack(sip_trans* t, sip_msg* reply)
+void trans_layer::send_non_200_ack(sip_msg* reply, sip_trans* t)
 {
     sip_msg* inv = t->msg;
     
@@ -1099,7 +1124,7 @@
     t->retr_len = ack_len;
 }
 
-void trans_layer::send_200_ack(sip_msg* reply)
+void trans_layer::send_200_ack(sip_msg* reply, sip_trans* t)
 {
     // Set request URI
     // TODO: use correct R-URI instead of just 'Contact'
@@ -1118,11 +1143,20 @@
     cstring r_uri = na.addr;
     list<sip_header*> route_hdrs;
 
-    for(list<sip_header*>::reverse_iterator it = reply->record_route.rbegin();
-       it != reply->record_route.rend(); ++it) {
-       
-       route_hdrs.push_back(new sip_header(0,"Route",(*it)->value));
+    if(t && !t->msg->route.empty()){
+       for(list<sip_header*>::iterator it = t->msg->route.begin();
+           it != t->msg->route.end(); ++it) {
+           
+           route_hdrs.push_back(new sip_header(0,"Route",(*it)->value));
+       }
     }
+    else {
+       for(list<sip_header*>::reverse_iterator it = 
reply->record_route.rbegin();
+           it != reply->record_route.rend(); ++it) {
+           
+           route_hdrs.push_back(new sip_header(0,"Route",(*it)->value));
+       }
+    }
 
     sockaddr_storage remote_ip;
     set_next_hop(route_hdrs,r_uri,&remote_ip);
@@ -1163,6 +1197,7 @@
     copy_hdr_wr(&msg,reply->to);
     copy_hdr_wr(&msg,reply->callid);
     copy_hdr_wr(&msg,max_forward);
+    delete max_forward;
     cseq_wr(&msg,get_cseq(reply)->num_str,cstring("ACK",3));
 
     *msg++ = CR;
@@ -1175,10 +1210,14 @@
     int send_err = transport->send(&remote_ip,ack_buf,request_len);
     if(send_err < 0){
        ERROR("Error from transport layer\n");
+       delete [] ack_buf;
     }
-
-    delete [] ack_buf;
-    delete max_forward;
+    else if(t){
+       delete [] t->retr_buf;
+       t->retr_buf = ack_buf;
+       t->retr_len = request_len;
+       memcpy(&t->retr_addr,&remote_ip,sizeof(sockaddr_storage));
+    }
 }
 
 void trans_layer::retransmit(sip_trans* t)
@@ -1239,6 +1278,9 @@
            DBG("Transaction timeout!\n");
            timeout(bucket,tr);
            break;
+       case TS_TERMINATED_200:
+           bucket->remove_trans(tr);
+           break;
        }
        break;
 

Modified: trunk/core/plug-in/sipctrl/trans_layer.h
===================================================================
--- trunk/core/plug-in/sipctrl/trans_layer.h    2008-05-14 05:51:53 UTC (rev 
940)
+++ trunk/core/plug-in/sipctrl/trans_layer.h    2008-05-14 07:58:25 UTC (rev 
941)
@@ -65,7 +65,7 @@
     /**
      * Send ACK coresponding to error replies
      */
-    void send_non_200_ack(sip_trans* t, sip_msg* reply);
+    void send_non_200_ack(sip_msg* reply, sip_trans* t);
     
     /**
      * Fills the address structure passed and modifies 
@@ -137,7 +137,7 @@
      * Sends an end-to-end ACK for the reply
      * passed as a parameter.
      */
-    void send_200_ack(sip_msg* reply);
+    void send_200_ack(sip_msg* reply, sip_trans* t=NULL);
 
 
     /**

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

Reply via email to