Hello,

the uac_replace_from()/_to() require that the From/To headers are not changed by the end points. The purpose is RFC3261 requirement saying that From/To must not be changed in order to be backward compatible with RFC2543 (previous sip specs). If the endpoints change them, then they are not used for backward compatibility so you can changed them without automatic restore -- just change them as you need.

If one of the endpoints still require not to have the From/To changed, but the other endpoint in changing them, then you have to use uac module together with dialog and store the From/To values in dialog variables instead of the default behaviour that uses RR params -- see the readme of uac module.

Cheers,
Daniel

On 04.10.19 20:42, Duarte Rocha wrote:
Greetings,

 

This is a repeated problem, but i have more info now. Please help understand if there is a problem on my code or if there is any kind of Kamailio bug.

 

On the first INVITE of every call i apply uac_replace_from() and uac_replace_to() in order to normalize numeration. I have the restore_mode set as "auto".

 

The original numeration is :

                To : 351250000000

                From : 351211455000

 

The INVITE is sent to the client with To and From like this and with the Record-Route headers (Kamailio has 2 Ips and inserts 2  Record-Routes) containing vsf and vst parameters to help the future restores :

               

        To: <sip:+351250000000@111.111.111.111>

        From: <sip:+351211455000@111.111.111.111>;tag=BD583030373631320511EAE6

                               Record-Route: <sip:111.111.111.111;r2=on;lr;ftag=BD583030373631320511EAE6;tbk_i=2_2_Y;tbk_o=128_11_Y;vsf=AAAAABgGBAMDAAUBBQAJCnNyAwMcHwIdHQsWHwUMOA--;vst=AAAAABgGBAMHDQgJDQECA3RyAwMcHwIdGgQeHAIFOQ--;did=18e.5d62>

        Record-Route: <sip:111.111.111.111;r2=on;lr;ftag=BD583030373631320511EAE6;tbk_i=2_2_Y;tbk_o=128_11_Y;vsf=AAAAABgGBAMDAAUBBQAJCnNyAwMcHwIdHQsWHwUMOA--;vst=AAAAABgGBAMHDQgJDQECA3RyAwMcHwIdGgQeHAIFOQ--;did=18e.5d62>

                              

My client, upon receiving the INVITE, also does some changes in the numeration and sends a 183 reply with the following headers :

 

                               Record-Route: <sip:111.111.111.111;r2=on;lr;ftag=BD583030373631320511EAE6;tbk_i=2_2_Y;tbk_o=128_11_Y;vsf=AAAAABgGBAMDAAUBBQAJCnNyAwMcHwIdHQsWHwUMOA--;vst=AAAAABgGBAMHDQgJDQECA3RyAwMcHwIdGgQeHAIFOQ--;did=18e.5d62>

        Record-Route: <sip:111.111.111.111;r2=on;lr;ftag=BD583030373631320511EAE6;tbk_i=2_2_Y;tbk_o=128_11_Y;vsf=AAAAABgGBAMDAAUBBQAJCnNyAwMcHwIdHQsWHwUMOA--;vst=AAAAABgGBAMHDQgJDQECA3RyAwMcHwIdGgQeHAIFOQ--;did=18e.5d62>

        From: "+351211455000" <sip:I2116446I_500@111.111.111.111>;tag=BD583030373631320511EAE6

        To: <sip:+351250000000@111.111.111.111>;tag=as3e46f684

                              

                               After Kamailio processes the reply, To and From are restored to it's original values and the reply is relayed :

                              

                               From: <sip:351211455000@111.111.111.111>;tag=BD583030373631320511EAE6

        To: <sip:351250000000@111.111.111.111>;tag=as3e46f684

                              

                               Here, the restore works perfectly.

                              

By the end of the call the client sends me a BYE request with Route, From and To like this :

 

                               Route: <sip:111.111.111.111;r2=on;lr;ftag=BD583030373631320511EAE6;tbk_i=2_2_Y;tbk_o=128_11_Y;vsf=AAAAABgGBAMDAAUBBQAJCnNyAwMcHwIdHQsWHwUMOA--;vst=AAAAABgGBAMHDQgJDQECA3RyAwMcHwIdGgQeHAIFOQ--;did=18e.5d62>,<sip:212.13.40.205;r2=on;lr;ftag=BD583030373631320511EAE6;tbk_i=2_2_Y;tbk_o=128_11_Y;vsf=AAAAABgGBAMDAAUBBQAJCnNyAwMcHwIdHQsWHwUMOA--;vst=AAAAABgGBAMHDQgJDQECA3RyAwMcHwIdGgQeHAIFOQ--;did=18e.5d62>

                               From: <sip:+351250000000@111.111.111.111>;tag=as3e46f684

        To: "+351211455000" <sip:I2116446I_500@111.111.111.111>;tag=BD583030373631320511EAE6

                              

                               Here, the difference between 183 and BYE seems to be only in the Route\Record-Route are built (2 Headers or one header with 2 uri).

                              

                               Now, there are a couple of problems relaying the BYE that seem to me to be related to auto replace.

                              

                               This BYE message isn't logged on the onsend-route and it logs a couple of errors :

                                               ERROR: <core> [core/parser/msg_parser.c:164]: get_hdr_field(): bad to header

                                               ERROR: <core> [core/parser/msg_parser.c:337]: parse_headers(): bad header field [To: "+351211455000" <sip:Q4525417L_<:C212.13.38.148>;tag=3DC130303736313205201F18#015#012Call-ID: 020FAAC7]

                                               ERROR: dialog [dlg_handlers.c:666]: pre_match_parse(): bad request or missing CALLID/TO hdr :-/

                                               ERROR: <core> [core/parser/parse_addr_spec.c:719]: parse_addr_spec(): unexpected char [<] in status 6: ["+351211455000" <sip:Q4525417L_] .

 

                               Despite not being logged on onsend_route and creating some errors, the BYE is still relayed like this :

                                               From: <sip:351250000000@111.111.111.111>;tag=as3e46f684

                                               To: "+351211455000" <sip:Q4525417L_<:C111.111.111.111>;tag=BD583030373631320511EAE6

                              

                               This, naturally, generates a "400 Bad Request" reply from the next equipment.

                              

                               I've also logged the $tU values along the code for BYE requests and it always logs the "I2116446I_500", so i don't know if my code can be the cause of this.

                              

                              

A couple of questions and comments

                               - What can i do to better debug this issue? I want to be sure if the problem comes from my code of if it is a Kamailio issue. Right now i'm not sure where to look.

                               - Can a request be sent without passing on onsend_route ? I have used this code to "catch" the BYE, which works for other BYEs - if( $rm == "BYE") {xerr("On send : To User = $tU");}

                              

                              

 

               

               

 

 


_______________________________________________
Kamailio (SER) - Users Mailing List
sr-users@lists.kamailio.org
https://lists.kamailio.org/cgi-bin/mailman/listinfo/sr-users
-- 
Daniel-Constantin Mierla -- www.asipto.com
www.twitter.com/miconda -- www.linkedin.com/in/miconda
Kamailio Advanced Training, Oct 21-23, 2019, Berlin, Germany -- https://asipto.com/u/kat