<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        margin-bottom:.0001pt;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:blue;
        text-decoration:underline;}
span.EmailStyle18
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
--></style>
</head>
<body lang="EN-US" link="blue" vlink="purple">
<div class="WordSection1">
<p class="MsoNormal">Unfortunately I don’t think I can provide any further assistance. As far as I know Server A is still operating out of spec. The receipt of the 183 with To tag does establish an *<b>early</b>* dialog, but nowhere does that mandate that the
 server must stop receiving responses from any other dialog. Servers must be tolerant of downstream forking of SIP calls by proxies (like OpenSIPS) and until the final response is received they must be able to receive multiple provisional responses potentially
 with different To tags.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">As I said before, on the OpenSIPS side there really is no way to solve this well. If OpenSIPS forks a call and receives multiple provisional responses from different downstream servers, how would it choose one to send back upstream? How
 could it know that is the one that will eventually answer? It can’t, so it sends them upstream as is and the UAC must handle it. When it needs to send a message it is operating per the RFC which recommends creating your own tag rather than randomly choosing
 a downstream tag which may or may not be the final responder.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">I suppose some enhancements could be made to make it work in your specific case, where you do not have multiple downstream legs, but personally I don’t feel it would be worth the added complication. But that would be up to the OpenSIPS
 maintainers.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">The only thing I can think that you could do to workaround the issue with Server A is to drop all provisional responses and only provide the final response, because you can’t guarantee until the final response what the final To tag will
 be.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">Also, I will say that we do failover just like this in our OpenSIPS. We relay provisional responses as they come and we relay final responses, sometimes coming from different downstream servers due to failover. And sometimes we send the
 response ourselves. We’ve never had an issue with an upstream server complaining about the tag changing.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><span style="color:black">Ben Newlin </span><o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<div style="border:none;border-top:solid #B5C4DF 1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b><span style="font-size:12.0pt;color:black">From: </span></b><span style="font-size:12.0pt;color:black">Users <users-bounces@lists.opensips.org> on behalf of Yury Kirsanov <y.kirsanov@gmail.com><br>
<b>Reply-To: </b>OpenSIPS users mailling list <users@lists.opensips.org><br>
<b>Date: </b>Monday, April 6, 2020 at 12:05 AM<br>
<b>To: </b>OpenSIPS users mailling list <users@lists.opensips.org><br>
<b>Subject: </b>Re: [OpenSIPS-Users] Issue with 'To' tag and t_reply<o:p></o:p></span></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Hi Ben, <o:p></o:p></p>
<div>
<p class="MsoNormal">The problem we're facing now is that according to RFC3261 dialog is established after 183 Session Progress with a To tag, so Server A can't continue to receive out-of-dialog SIP messages. In this case we're unable to send a OpenSIPS-generated
 message with different To tag which occurs in my situation. Is there any way to resolve this situation? It looks to me that behaviour of Server A is correct as OpenSIPS acts as a proxy and passes messages from Server B and then suddenly injects a SIP message
 originated by itself. Looks like there has to be two 'legs' of the call, one between Server A and OpenSIPS and another one between OpenSIPS and multiple servers it tries to reach in order to establish the call, but in this case OpenSIPS can't act as a pure
 proxy. Please advise?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Thanks!.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">P.S. For some reason I'm not receiving your responses in my mailbox?<o:p></o:p></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal">пт, 27 мар. 2020 г. в 01:56, Yury Kirsanov <<a href="mailto:y.kirsanov@gmail.com">y.kirsanov@gmail.com</a>>:<o:p></o:p></p>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<div>
<p class="MsoNormal">Thanks a lot for your explanation, Ben! I thought that there can be an issue with Server A not accepting  my new SIP response, it looks like they're doing matching only based on SIP To tag and completely ignoring any Call-ID or DID matching
 as well as From tag matching, in my case From tag is always the same. <o:p></o:p></p>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">One more question, how do you think, can there be anything related with topology hiding I'm using? I really doubt that but just in case...As far as I understand my issue is not because I'm using topology hiding, but because OpenSIPS first
 passes To tag from remote server and then generates one by itself when I'm using a 't_reply' and Server A is just not accepting such behaviour, trying to match any SIP responses to To tag passed in 183 Session Progress. I tried to change topology_hiding()
 to loose_route() and nothing changed in my chain except for Server A now being able to see all RRs and Vias inside my network.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Regards,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Yury.<o:p></o:p></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal">пт, 27 мар. 2020 г. в 01:37, Yury Kirsanov <<a href="mailto:y.kirsanov@gmail.com" target="_blank">y.kirsanov@gmail.com</a>>:<o:p></o:p></p>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<div>
<p class="MsoNormal">But the question is still here - how can I send a different t_reply code from failure_route? And then stop processing any further SIP messages?<o:p></o:p></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal">пт, 27 мар. 2020 г. в 01:23, Yury Kirsanov <<a href="mailto:y.kirsanov@gmail.com" target="_blank">y.kirsanov@gmail.com</a>>:<o:p></o:p></p>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<div>
<p class="MsoNormal">The problem is that I need to go through a list of SIP servers, analyze response of each of them and if it's an error like 4XX, 5XX or 6XX I need to send appropriate response to originating server. Let's say I'm not only adding a Reason
 field but upon receipt of 404 Not Found I want to respond with 480 Temporarily Unavailable with Reason: Q.850;Cause=41 for example? But Server B first replied with 183 Session Progress playing back a message 'Sorry, you need to top up your account' and then
 replied with SIP 402 Payment Required. I had to proxy 183 Session Progress back to Server A so its SIP client could hear that message and then I'd like to signal 480 Temporarily Unavailable - but I can't as OpenSIPS is using completely different To tag.
<o:p></o:p></p>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">I can't do this in onreply_route as I'm going through a list of SIP servers (upstreams or downstreams), so it definitely needs to be done from failure route, as far as I understand, and yes, I'm matching against 4XX, 5XX and 6XX codes and
 I need to reply with 480 Temporarily Unavailable in most cases so Server A would have a possibility to do failover to any other server in that case. I don't want to just proxy 4XX, 5XX or 6XX response to it.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">I've figured out why I have two 404 responses in my original call log - I was using sl_send_reply instead of t_reply and it was using original To tag but only on second attempt.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Regards,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Yury.<o:p></o:p></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal">пт, 27 мар. 2020 г. в 01:02, Yury Kirsanov <<a href="mailto:y.kirsanov@gmail.com" target="_blank">y.kirsanov@gmail.com</a>>:<o:p></o:p></p>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<div>
<p class="MsoNormal">Hi, <o:p></o:p></p>
<div>
<p class="MsoNormal">As per my original email:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">1. I was doing exactly as you suggested, in failure_route I'm using t_reply("404","Not Found") and it comes out with a wrong To: tag.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">2. I don't need to proxy response from server B, I need to analyze its response and send a response to server A according to my needs.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Currently it seems that t_reply is not using same To tag if 183 Session Progress has been proxied, which is strange as I have dialog running.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Regards,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Yury.<o:p></o:p></p>
</div>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div>
<p class="MsoNormal">чт, 26 мар. 2020 г. в 19:13, Yury Kirsanov <<a href="mailto:y.kirsanov@gmail.com" target="_blank">y.kirsanov@gmail.com</a>>:<o:p></o:p></p>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<div>
<p class="MsoNormal">Hi, <o:p></o:p></p>
<div>
<p class="MsoNormal">I'm using an OpenSIPS as a proxy between two servers. First one is sending SIP INVITE to OpenSIPS, then OpenSIPS forwards request to second server. I'm creating a dialog on initial INVITE. Second server then replies with SIP 183 Session
 Progress, plays back a message and then responds with 4XX code, for example SIP 404 Not Found (indicating that number dialed is disconnected). In OpenSIPS I'm receiving that reply and in failure_route I'd like to change that code to a bit different SIP 404,
 so I'm using following code:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">append_to_reply("Reason: Q.850;cause=1");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">t_reply("404","Not Found");<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">exit;<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">But in this case I can see that OpenSIPS generates additional branch (??? not sure here) with different "To" tag and pushes it out and then forwards original reply SIP packet even though I have an exit statement in my failure_route. I tried
 to do sl_send_reply and behavior is pretty much the same. Can someone let me know what I may be doing wrong? I need correct "To" tag to be used (based on 183 Session Progress message from server B and passed to server A previously) and second 404 shouldn't
 be forwarded out.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Here's an example of a call with my explanations<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Initial invite from server A, no 'to tag' as expected:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">INVITE sip:XXXXXXXXX@B.B.B.B SIP/2.0<br>
Max-Forwards: 67<br>
To: "XXXXXXXXX" <sip:XXXXXXXXX@B.B.B.B><br>
Call-ID: 469A5568-E092-4038-B1B8-13AC9B9571CA<br>
Via: SIP/2.0/UDP A.A.A.A:5060;rport;branch=z9hG4bK773616538<br>
From: "YYYYYYYYY" <sip:YYYYYYYYY@A.A.A.A>;tag=117583367<br>
CSeq: 1741310 INVITE<br>
User-Agent: User Agent<br>
Contact: <sip:YYYYYYYYY@A.A.A.A:5060><br>
Allow: ACK, INVITE, BYE, CANCEL, REGISTER, REFER, OPTIONS, INFO, SUBSCRIBE, NOTIFY<br>
Date: Thu, 26 Mar 2020 07:54:55 GMT<br>
Content-Type: application/sdp<br>
Content-Length: 250<br>
<br>
v=0<br>
o=dcom 1585209295 1585209295 IN IP4 A.A.A.A<br>
s=SIP Call<br>
c=IN IP4 A.A.A.A<br>
t=0 0<br>
m=audio 15340 RTP/AVP 8 0 18 101<br>
a=rtpmap:8 PCMA/8000<br>
a=rtpmap:0 PCMU/8000<br>
a=rtpmap:18 G729/8000<br>
a=fmtp:18 annexb=no<br>
a=rtpmap:101 telephone-event/8000<br>
<br>
Response from OpenSIPS:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><br>
SIP/2.0 100 Giving a try<br>
To: "XXXXXXXXX" <sip:XXXXXXXXX@B.B.B.B><br>
Call-ID: 469A5568-E092-4038-B1B8-13AC9B9571CA<br>
Via: SIP/2.0/UDP A.A.A.A:5060;received=A.A.A.A;rport=5060;branch=z9hG4bK773616538<br>
From: "YYYYYYYYY" <sip:YYYYYYYYY@A.A.A.A>;tag=117583367<br>
CSeq: 1741310 INVITE<br>
Server: Server Signature<br>
Content-Length: 0<br>
<br>
OpenSIPS has forwarded packet to Server B and Server B responded with 183 and assigned a 'To' tag:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><br>
SIP/2.0 183 Session Progress<br>
Via: SIP/2.0/UDP A.A.A.A:5060;received=A.A.A.A;rport=5060;branch=z9hG4bK773616538<br>
Call-ID: 469A5568-E092-4038-B1B8-13AC9B9571CA<br>
From: "YYYYYYYYY" <sip:YYYYYYYYY@A.A.A.A>;tag=117583367<br>
To: "XXXXXXXXX" <sip:XXXXXXXXX@B.B.B.B>;<b><span style="font-size:13.5pt;color:red">tag=0b49dc32-2c4b-413e-a349-c781a23d53b9</span></b><br>
CSeq: 1741310 INVITE<br>
Server: PBX<br>
Contact: <sip:B.B.B.B;did=d0a.99678f73><br>
Allow: OPTIONS, REGISTER, SUBSCRIBE, NOTIFY, PUBLISH, INVITE, ACK, BYE, CANCEL, UPDATE, PRACK, REFER<br>
Content-Type: application/sdp<br>
Content-Length: 354<br>
<br>
v=0<br>
o=- 1585209295 1585209297 IN IP4 B.B.B.B<br>
s=Asterisk<br>
c=IN IP4 B.B.B.B<br>
t=0 0<br>
a=rtpengine:673f999268ae<br>
m=audio 32386 RTP/AVP 0 8 18 101<br>
a=maxptime:150<br>
a=rtpmap:0 PCMU/8000<br>
a=rtpmap:8 PCMA/8000<br>
a=rtpmap:18 G729/8000<br>
a=rtpmap:101 telephone-event/8000<br>
a=fmtp:18 annexb=no<br>
a=fmtp:101 0-16<br>
a=sendrecv<br>
a=rtcp:32387<br>
a=ptime:20<br>
<br>
Server B responds with SIP 404 after playing back message that number is disconnected and I'm trying to reply to server A with custom Reason message. To_tag is completely different from the To tag that has been passed to server A after initial 183!!!<br>
<br>
SIP/2.0 404 Not Found<br>
To: "XXXXXXXXX" <sip:XXXXXXXXX@B.B.B.B>;<b><span style="font-size:13.5pt;color:blue">tag=a976.21514595b467be41a9b712a6b0b621d9</span></b><br>
Call-ID: 469A5568-E092-4038-B1B8-13AC9B9571CA<br>
Via: SIP/2.0/UDP A.A.A.A:5060;received=A.A.A.A;rport=5060;branch=z9hG4bK773616538<br>
From: "YYYYYYYYY" <sip:YYYYYYYYY@A.A.A.A>;tag=117583367<br>
CSeq: 1741310 INVITE<br>
Reason: Q.850;cause=1;text="Number is disconnected"<br>
Server: Server Signature<br>
Content-Length: 0<br>
<br>
Of course, server A just ignores this message as it can't match 'To' tag to its transaction. Now, for some reason, OpenSIPS forwards original reply from Server B to Server A with the same 'To' tag as in 183 Session Progress:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">SIP/2.0 404 Not Found<br>
Via: SIP/2.0/UDP A.A.A.A:5060;received=A.A.A.A;rport=5060;branch=z9hG4bK773616538<br>
Call-ID: 469A5568-E092-4038-B1B8-13AC9B9571CA<br>
From: "YYYYYYYYY" <sip:YYYYYYYYY@A.A.A.A>;tag=117583367<br>
To: "XXXXXXXXX" <sip:XXXXXXXXX@B.B.B.B>;<b><span style="font-size:13.5pt;color:red">tag=0b49dc32-2c4b-413e-a349-c781a23d53b9</span></b><br>
CSeq: 1741310 INVITE<br>
Server: PBX<br>
Allow: OPTIONS, REGISTER, SUBSCRIBE, NOTIFY, PUBLISH, INVITE, ACK, BYE, CANCEL, UPDATE, PRACK, REFER<br>
Reason: Q.850;cause=1<br>
Content-Length:  0<br>
<br>
And at this point Server A can match this reply and responds with an ACK:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><br>
ACK sip:XXXXXXXXX@B.B.B.B SIP/2.0<br>
Via: SIP/2.0/UDP A.A.A.A:5060;rport;branch=z9hG4bK773616538<br>
From: "YYYYYYYYY" <sip:YYYYYYYYY@A.A.A.A>;tag=117583367<br>
To: "XXXXXXXXX" <sip:XXXXXXXXX@B.B.B.B>;<b><span style="font-size:13.5pt;color:red">tag=0b49dc32-2c4b-413e-a349-c781a23d53b9</span></b><br>
Call-ID: 469A5568-E092-4038-B1B8-13AC9B9571CA<br>
CSeq: 1741310 ACK<br>
Max-Forwards: 67<br>
Contact: <sip:YYYYYYYYY@A.A.A.A:5060><br>
User-Agent: User Agent<br>
Content-Length: 0<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">I think that t_reply is creating a new transaction instead of using existing one, but I'm not sure why and how to fix this?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Thanks!<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"><o:p> </o:p></p>
</div>
<div>
<p class="MsoNormal">Best regards,<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Yury.<o:p></o:p></p>
</div>
</div>
</blockquote>
</div>
</blockquote>
</div>
</blockquote>
</div>
</blockquote>
</div>
</blockquote>
</div>
</div>
</body>
</html>