Module: sems
Branch: master
Commit: 3fe1dde8e066024e2f15ef094f23dba9199508b0
URL:    
http://git.sip-router.org/cgi-bin/gitweb.cgi/sems/?a=commit;h=3fe1dde8e066024e2f15ef094f23dba9199508b0

Author: Raphael Coeffic <[email protected]>
Committer: Raphael Coeffic <[email protected]>
Date:   Tue Jan 31 15:16:41 2012 +0100

b/f: fixes timeout issue introduced in 1645a7d3c6.

---

 core/sip/trans_layer.cpp |   40 +++++++++++++++++++++++++++++++++++-----
 1 files changed, 35 insertions(+), 5 deletions(-)

diff --git a/core/sip/trans_layer.cpp b/core/sip/trans_layer.cpp
index 2e8effd..48843c1 100644
--- a/core/sip/trans_layer.cpp
+++ b/core/sip/trans_layer.cpp
@@ -727,14 +727,32 @@ int _trans_layer::set_destination_ip(sip_msg* msg, 
cstring* next_hop, unsigned s
     return 0;
 }
 
+static void translate_string(sip_msg* dst_msg, cstring& dst,
+                            sip_msg* src_msg, cstring& src)
+{
+    dst.s = (char*)src.s + (dst_msg->buf - src_msg->buf);
+    dst.len = src.len;
+}
+
+static void translate_hdr(sip_msg* dst_msg, sip_header*& dst, 
+                         sip_msg* src_msg, sip_header* src)
+{
+    dst = new sip_header();
+    dst_msg->hdrs.push_back(dst);
+    dst->type = src->type;
+    translate_string(dst_msg,dst->name,src_msg,src->name);
+    translate_string(dst_msg,dst->value,src_msg,src->value);
+    dst->p = NULL;
+}
+
 void _trans_layer::timeout(trans_bucket* bucket, sip_trans* t)
 {
     t->reset_all_timers();
     t->state = TS_TERMINATED;
 
     // send 408 to 'ua'
-    sip_msg  msg;
     sip_msg* req = t->msg;
+    sip_msg  msg(req->buf,req->len);
 
     msg.type = SIP_REPLY;
     msg.u.reply = new sip_reply();
@@ -742,10 +760,22 @@ void _trans_layer::timeout(trans_bucket* bucket, 
sip_trans* t)
     msg.u.reply->code = 408;
     msg.u.reply->reason = cstring("Timeout");
 
-    msg.from = req->from;
-    msg.to = req->to;
-    msg.cseq = req->cseq;
-    msg.callid = req->callid;
+    translate_hdr(&msg,msg.from, req,req->from);
+    msg.from->p = new sip_from_to();
+    parse_from_to((sip_from_to*)msg.from->p,
+                 msg.from->value.s,msg.from->value.len);
+
+    translate_hdr(&msg,msg.to, req,req->to);
+    msg.to->p = new sip_from_to();
+    parse_from_to((sip_from_to*)msg.to->p,
+                 msg.to->value.s,msg.to->value.len);
+
+    translate_hdr(&msg,msg.cseq, req,req->cseq);
+    msg.cseq->p = new sip_cseq();
+    parse_cseq((sip_cseq*)msg.cseq->p,
+              msg.cseq->value.s,msg.cseq->value.len);
+
+    translate_hdr(&msg,msg.callid, req,req->callid);
 
     bucket->remove(t);
     bucket->unlock();

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

Reply via email to