This patch does it for me:

---

--- modules/rr/record.c.ori     2010-05-25 13:10:48.000000000 +0200

+++ modules/rr/record.c 2010-05-25 13:37:26.000000000 +0200

@@ -41,6 +41,7 @@

 #include "../../data_lump.h"

 #include "record.h"

 #include "rr_mod.h"

+#include "loose.h"

 

 

 #define RR_PREFIX "Record-Route: <sip:"

@@ -291,12 +292,20 @@

        }

 

        if (append_fromtag) {

-               if (parse_from_header(_m) < 0) {

-                       LM_ERR("From parsing failed\n");

-                       return -2;

+               if (is_direction(_m, RR_FLOW_UPSTREAM)==0) {

+                       /* use to-tag in script! */

+

+                       LM_DBG("from-tag not added on upstream request (it’s wrong anyway)! Must be done manually using record_route(\";ftag=$tt\");");

+

+                       tag = 0;

+               } else {

+                       if (parse_from_header(_m) < 0) {

+                               LM_ERR("From parsing failed\n");

+                               return -2;

+                       }

+                       from = (struct to_body*)_m->from->parsed;

+                       tag = &from->tag_value;

                }

-               from = (struct to_body*)_m->from->parsed;

-               tag = &from->tag_value;

        } else {

                tag = 0;

        }

---

 

 

Plus in script after loose_route():

                                        if (check_route_param("vsf=")) {

                                                # fix broken UAC not sending initial route-set

                                                $(var(vsf)) = $(hdr(Route)[0]{s.select,0,,}{param.value,vsf}{s.select,0,>});

                                                xlog("L_INFO", ">> Stored UAC param vsf=$(var(vsf))");

                                                if (is_direction("upstream")) {

                                                        record_route(";ftag=$tt;vsf=$(var(vsf))");

                                                } else {

                                                        record_route(";vsf=$(var(vsf))");

                                                }

                                        } else {

                                                if (is_direction("upstream")) {

                                                        record_route(";ftag=$tt");

                                                } else {

                                                        record_route();

                                                }

                                        }

 

 

Br

Walter

 

 

 

 

Von: sr-dev-bounces@lists.sip-router.org [mailto:sr-dev-bounces@lists.sip-router.org] Im Auftrag von NeoTel Lists
Gesendet: Dienstag, 25. Mai 2010 13:04
An: sr-dev@lists.sip-router.org
Betreff: [sr-dev] direction check missing in record_route()

 

Hi!

 

Can someone of the experts pls help me with a fix in record.c/record_route() please?

 

IMHO in append_fromtag=1 mode the direction check is missing, if record_route() is called in loose_route block.

 

(Sure, I know, there is no need to call record_route() there, but since nearly all of the UA out there don’t use first record set on reInvites, I must do record routing on reInvites, too!)

(And I really do need the vsf parameter in subsequent messages J)

 

So I would do the following:

        if (append_fromtag) {

                if (is_direction(_m, RR_FLOW_UPSTREAM)) {  /* if not in dialog, would return 0 anyway, e.g. no Route param ftag present */

                        /* use to-tag! */

 

Unfortunately there is no “parse_to_header”, bec. then it would be simple….

How to access the to-tag, if any?

 

                } else {

                        if (parse_from_header(_m) < 0) {

                                LM_ERR("From parsing failed\n");

                                return -2;

                        }

                        from = (struct to_body*)_m->from->parsed;

                        tag = &from->tag_value;

                }

        } else {

                tag = 0;

        }

 

 

--

What I do now is not nice: I set modparam("rr", "append_fromtag", 0) and patched rr_mod.c and uac.c not to return an Error, if append_fromtag is 0 J

 

[root@p01-1 rr]# more ../../../rr_mod.c.patch

--- modules/rr/rr_mod.c.ori     2010-05-25 11:03:29.000000000 +0200

+++ modules/rr/rr_mod.c 2010-05-25 12:08:34.000000000 +0200

@@ -172,9 +172,10 @@

        int n;

 

        if (!append_fromtag) {

-               LM_ERR("usage of \"is_direction\" function requires parameter"

-                               "\"append_fromtag\" enabled!!");

-               return E_CFG;

+               LM_WARN("usage of \"is_direction\" function requires parameter"

+                               "\"append_fromtag\" enabled!!"

+                               " - must be done manually to work correctly!");

+               /* return E_CFG; */

        }

        if (param_no==1) {

                n = 0;

[root@p01-1 rr]# more ../../../uac.c.patch

--- modules/uac/uac.c.orig      2010-05-25 10:57:59.000000000 +0200

+++ modules/uac/uac.c   2010-05-25 11:00:40.000000000 +0200

@@ -206,9 +206,13 @@

                if (from_restore_mode==FROM_AUTO_RESTORE) {

                        /* we need the append_fromtag on in RR */

                        if (!uac_rrb.append_fromtag) {

-                               LM_ERR("'append_fromtag' RR param is not enabled!"

-                                       " - required by AUTO restore mode\n");

-                               goto error;

+                               LM_WARN("'append_fromtag' RR param is not enabled!"

+                                       " - required by AUTO restore mode"

+                                       " - make sure it's done manually!\n");

+                               /* normally ERR, but just remind script writer, that she has to do ;ftag=$ft/$tt manually

+                                  normally this would be OK, but record_route() add $ft in upsteam request

+                                  should be fixed in rr module!

+                               goto error; */

                        }

                        /* get all requests doing loose route */

                        if (uac_rrb.register_rrcb( rr_checker, 0)!=0) {

--

 

 

Many thanks!

Walter

 

 

---------------------------------------

NeoTel Telefonservice GmbH & Co KG

Esterhazygasse 18a/15

A-1060 Wien

 

T: +43 1 4094181 - 81

M: +43 660 88866 - 81

F: +43 1 4094181 - 981