Module: kamailio
Branch: master
Commit: 0219d5a9090366292671eedc5e25f6c8434989c8
URL: 
https://github.com/kamailio/kamailio/commit/0219d5a9090366292671eedc5e25f6c8434989c8

Author: Daniel-Constantin Mierla <[email protected]>
Committer: Daniel-Constantin Mierla <[email protected]>
Date: 2015-01-04T23:54:23+01:00

topoh: discover local request direction from th cookie

- l can be used to mark local requests for topoh handling

---

Modified: modules/topoh/th_msg.c
Modified: modules/topoh/topoh_mod.c

---

Diff:  
https://github.com/kamailio/kamailio/commit/0219d5a9090366292671eedc5e25f6c8434989c8.diff
Patch: 
https://github.com/kamailio/kamailio/commit/0219d5a9090366292671eedc5e25f6c8434989c8.patch

---

diff --git a/modules/topoh/th_msg.c b/modules/topoh/th_msg.c
index 3a68f3f..098510e 100644
--- a/modules/topoh/th_msg.c
+++ b/modules/topoh/th_msg.c
@@ -1002,6 +1002,15 @@ int th_del_cookie(sip_msg_t *msg)
 }
 
 
+/**
+ * return the special topoh cookie
+ * - TH header of TH Via parame
+ * - value is 3 chars
+ *   [0] - direction:    d - downstream; u - upstream
+ *   [1] - request type: i - initial; c - in-dialog; l - local in-dialog
+ *   [2] - location:     h - header; v - via param
+ * - if not found, returns 'xxx'
+ */
 char* th_get_cookie(sip_msg_t *msg, int *clen)
 {
        hdr_field_t *hf;
diff --git a/modules/topoh/topoh_mod.c b/modules/topoh/topoh_mod.c
index ff64b6c..a8d9b63 100644
--- a/modules/topoh/topoh_mod.c
+++ b/modules/topoh/topoh_mod.c
@@ -401,13 +401,24 @@ int th_msg_sent(void *data)
        {
                direction = (th_cookie_value.s[0]=='u')?1:0; /* 
upstream/downstram */
                dialog = (get_to(&msg)->tag_value.len>0)?1:0;
-               local = 
(th_cookie_value.s[0]!='d'&&th_cookie_value.s[0]!='u')?1:0;
+
+               if(msg.via2==0) {
+                       local = 1;
+                       if(direction==0 && th_cookie_value.s[1]=='l') {
+                               /* downstream local request (e.g., dlg bye) */
+                               local = 2;
+                       }
+               } else {
+                       /* more than one Via, but no received th cookie */
+                       local = (th_cookie_value.s[0]!='d' && 
th_cookie_value.s[0]!='u')?1:0;
+               }
                /* local generated requests */
                if(local)
                {
                        /* ACK and CANCEL go downstream */
                        if(get_cseq(&msg)->method_id==METHOD_ACK
-                                       || 
get_cseq(&msg)->method_id==METHOD_CANCEL)
+                                       || 
get_cseq(&msg)->method_id==METHOD_CANCEL
+                                       || local==2)
                        {
                                th_mask_callid(&msg);
                                goto ready;


_______________________________________________
sr-dev mailing list
[email protected]
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev

Reply via email to