<div dir="ltr"><div>Hi,</div><div>I've been following this discussion as I have a similar use case.</div><div>I have created a PR offering a new function t_reply_by_callid for the module tm to simplify this:</div><div> <a href="https://github.com/OpenSIPS/opensips/pull/2937">https://github.com/OpenSIPS/opensips/pull/2937</a><br></div><div><br></div><div>Regards,</div><div>Takeshi</div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Oct 20, 2022 at 4:04 PM Bogdan-Andrei Iancu <<a href="mailto:bogdan@opensips.org">bogdan@opensips.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div>
<font face="monospace">Ivan,<br>
<br>
Actually a simpler approach will be to use
t_wait_for_new_branches() instead of that t_write function, it
should do the same trick (postponing the deletion of the
transaction), but without any side effects.<br>
<br>
Regards,<br>
</font>
<pre cols="72">Bogdan-Andrei Iancu
OpenSIPS Founder and Developer
<a href="https://www.opensips-solutions.com" target="_blank">https://www.opensips-solutions.com</a>
OpenSIPS Bootcamp 5-16 Dec 2022, online
<a href="https://www.opensips.org/training/OpenSIPS_eBootcamp_2022/" target="_blank">https://www.opensips.org/training/OpenSIPS_eBootcamp_2022/</a></pre>
<div>On 10/19/22 10:21 AM, Ryzhik Ivan
wrote:<br>
</div>
<blockquote type="cite">
<div dir="ltr">Sorry, I mean no sleep, i mean async(
sleep($var(wait_time)), after_sleep );
<div>Regards, Ivan.</div>
</div>
<br>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">вт, 18 окт. 2022 г. в 14:42,
Bogdan-Andrei Iancu <<a href="mailto:bogdan@opensips.org" target="_blank">bogdan@opensips.org</a>>:<br>
</div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div> <font face="monospace">Hi,<br>
<br>
yes, call it before ending the REQUEST route. I'm 100% the
transaction is not deleted before the end of the route.
And try to use the unix sock flavor for the function, not
the fifo one.<br>
<br>
DO NOT use the sleep, you will block your whole opensips.<br>
<br>
Regards, <br>
</font>
<pre cols="72">Bogdan-Andrei Iancu
OpenSIPS Founder and Developer
<a href="https://www.opensips-solutions.com" target="_blank">https://www.opensips-solutions.com</a>
OpenSIPS Bootcamp 5-16 Dec 2022, online
<a href="https://www.opensips.org/training/OpenSIPS_eBootcamp_2022/" target="_blank">https://www.opensips.org/training/OpenSIPS_eBootcamp_2022/</a></pre>
<div>On 10/17/22 11:56 AM, Ryzhik Ivan wrote:<br>
</div>
<blockquote type="cite">
<div dir="ltr">Hi, did you mean that i must call
t_write_req once before <span style="color:rgb(0,0,0);font-family:Helvetica,Arial;font-size:12px;text-align:justify">REQUEST_ROUTE
is finished? In this case the transaction was removed.</span>
<div><span style="font-family:Helvetica,Arial;font-size:12px;text-align:justify">"</span><span style="font-family:monospace">even if you do not
have to actually write anything to outer world -
just fake it.</span><span style="font-family:Helvetica,Arial;font-size:12px;text-align:justify">"
- i must use fifo and i must read data from it, in
else we got:<br>
</span>ERROR:tm:write_to_fifo: nobody listening on
[/tmp/moh.fifo] fifo for reading!<br>
ERROR:tm:t_write_req: write_to_fifo failed<br>
</div>
<div>And last question is may I use sleep(20) at the end
of route to keep transaction? or can i use
modparam("tm", "wt_timer", 20)?</div>
<div>Regards, Ivan</div>
</div>
<br>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">пн, 17 окт. 2022 г. в
09:38, Bogdan-Andrei Iancu <<a href="mailto:bogdan@opensips.org" target="_blank">bogdan@opensips.org</a>>:<br>
</div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div> <font face="monospace">Hi Ryzhik,<br>
<br>
Right, the transaction must be forced to stay
until you are done with a final reply.
Unfortunately there is no clear way to do this
from script (this may be subject of further small
improvements), but you can try taking advantage of
the `t_write_req` [1] for this purpose, even if
you do not have to actually write anything to
outer world - just fake it.<br>
<br>
<br>
[1] <a href="https://opensips.org/html/docs/modules/3.2.x/tm.html#func_t_write_req" target="_blank">https://opensips.org/html/docs/modules/3.2.x/tm.html#func_t_write_req</a><br>
<br>
Regards,<br>
</font>
<pre cols="72">Bogdan-Andrei Iancu
OpenSIPS Founder and Developer
<a href="https://www.opensips-solutions.com" target="_blank">https://www.opensips-solutions.com</a>
OpenSIPS Summit 27-30 Sept 2022, Athens
<a href="https://www.opensips.org/events/Summit-2022Athens/" target="_blank">https://www.opensips.org/events/Summit-2022Athens/</a></pre>
<div>On 10/13/22 2:45 PM, Ryzhik Ivan wrote:<br>
</div>
<blockquote type="cite">
<div dir="ltr">Hi.
<div>One more question.</div>
<div>Everything works fine except the
transaction was deleted after 15 sec after the
initial route was finished.</div>
<div>on INVITE i last do t_reply_with_body(183,
"Session progress", ...) and than exit;</div>
<div><br>
</div>
<div>on end route log :</div>
<div><br>
</div>
<div>2022-10-13T10:58:01.994598+00:00
DBG:tm:_reply_light: reply sent out.
buf=0x7f558a087d98: SIP/2.0 1...,
shmem=0x7f5549797470: SIP/2.0 1<br>
2022-10-13T10:58:01.994676+00:00
DBG:tm:_reply_light: finished<br>
</div>
<div><br>
</div>
<div>2022-10-13T10:58:01.995835+00:00
DBG:tm:do_t_cleanup: transaction
0x7f5549793b18 already updated! Skipping
update!<br>
2022-10-13T10:58:01.996020+00:00
DBG:tm:cleanup_uac_timers: RETR/FR timers
reset<br>
2022-10-13T10:58:01.996202+00:00 <b>DBG:tm:insert_timer_unsafe:
[2]: 0x7f5549793b98 (12)</b><br>
2022-10-13T10:58:01.996317+00:00 <b> DBG:tm:t_unref:
UNREF_UNSAFE: [0x7f5549793b18] after is 0</b><br>
2022-10-13T10:58:01.996488+00:00
DBG:core:destroy_avp_list: destroying list
(nil)<br>
2022-10-13T10:58:01.996673+00:00
DBG:core:receive_msg: cleaning up<br>
<br>
2022-10-13T10:58:07.651091+00:00<b>
DBG:tm:timer_routine: timer
routine:2,tl=0x7f5549793b98 next=(nil),
timeout=12</b><br>
2022-10-13T10:58:07.651332+00:00
DBG:tm:wait_handler: removing 0x7f5549793b18
from table<br>
2022-10-13T10:58:07.651425+00:00
DBG:tm:delete_ce<b>ll: delete transaction
0x7f5549793b18</b><br>
2022-10-13T10:58:07.651513+00:00
DBG:tm:wait_handler: done<br>
<br>
</div>
<div>Can you tell me how I can i fix this?
Transaction marked safe for deletion...</div>
<div>Regards, Ivan</div>
</div>
<br>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">ср, 12 окт.
2022 г. в 13:11, Bogdan-Andrei Iancu <<a href="mailto:bogdan@opensips.org" target="_blank">bogdan@opensips.org</a>>:<br>
</div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div> <font face="monospace">Perfect !!!</font><br>
<pre cols="72">Bogdan-Andrei Iancu
OpenSIPS Founder and Developer
<a href="https://www.opensips-solutions.com" target="_blank">https://www.opensips-solutions.com</a>
OpenSIPS Summit 27-30 Sept 2022, Athens
<a href="https://www.opensips.org/events/Summit-2022Athens/" target="_blank">https://www.opensips.org/events/Summit-2022Athens/</a></pre>
<div>On 10/12/22 1:09 PM, Ryzhik Ivan wrote:<br>
</div>
<blockquote type="cite">
<div dir="ltr">I found a solution. hex
strings are reversed).
<div>Thank you very much!</div>
</div>
<br>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">ср, 12
окт. 2022 г. в 12:59, Ryzhik Ivan <<a href="mailto:ryzhik.ivan@gmail.com" target="_blank">ryzhik.ivan@gmail.com</a>>:<br>
</div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div dir="ltr">and one more research:
$T_id returns hex encoded
label.hashid
<div>but my attempts failed:</div>
<div>got $T_id = 6545e285.3fe4</div>
<div>Send: {"jsonrpc": "2.0",
"method": "t_reply", "id": 1,
"params": {"code": "487",
"reason": "Terminating",
"trans_id": "16356:1699078789",
"to_tag": "<null>"}}</div>
<div>Got:
b'{"jsonrpc":"2.0","error":{"code":404,"message":"Transaction
not found"},"id":1}'<br>
<br>
</div>
</div>
<br>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">ср,
12 окт. 2022 г. в 11:13, Ryzhik
Ivan <<a href="mailto:ryzhik.ivan@gmail.com" target="_blank">ryzhik.ivan@gmail.com</a>>:<br>
</div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div dir="ltr">Thank you, Bogdan.
<div>I got stuck with tm
documentation. </div>
<div> 1) MI t_reply command has
named parameters, ok, no
problem. </div>
<div> 2) trans_id - transaction
identifier (has the
hash_entry:label format) -
what is this? if i use $T_id i
got reply "Invalid trans_id".</div>
<div> 3) Where can I get to_tag
from script level on initial
invite?</div>
<div> ...</div>
<div>
t_reply_with_body(183,
"Session progress",
$(var(body){re.subst,$var(re)})
);<br>
avp_db_query("insert
into moh (callid, timeout,
tid,totag) values ('$ci',
$var(wait_time), '$T_id',
'??????')"); <br>
...</div>
<div><br>
</div>
<div>Regards, Ivan.</div>
</div>
<br>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">вт, 11 окт.
2022 г. в 12:35, Bogdan-Andrei
Iancu <<a href="mailto:bogdan@opensips.org" target="_blank">bogdan@opensips.org</a>>:<br>
</div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div> <font face="monospace">Hi
Ivan,<br>
<br>
you can use timer_route,
but as there is no way to
send a reply for a
particular transaction
from script level (only to
the currently processed
request), you will have to
trigger the MI cmds from
the timer route, which is
a bit hackish ....<br>
<br>
Regards,<br>
</font>
<pre cols="72">Bogdan-Andrei Iancu
OpenSIPS Founder and Developer
<a href="https://www.opensips-solutions.com" target="_blank">https://www.opensips-solutions.com</a>
OpenSIPS Summit 27-30 Sept 2022, Athens
<a href="https://www.opensips.org/events/Summit-2022Athens/" target="_blank">https://www.opensips.org/events/Summit-2022Athens/</a></pre>
<div>On 10/11/22 11:47 AM,
Ryzhik Ivan wrote:<br>
</div>
<blockquote type="cite">
<div dir="ltr">Hi, Bogdan!
<div>What d' you think,
can we use timer_route
instead of an external
script?</div>
<div>Regards, Ivan.</div>
</div>
<br>
<div class="gmail_quote">
<div dir="ltr" class="gmail_attr">пн,
10 окт. 2022 г. в
17:04, Bogdan-Andrei
Iancu <<a href="mailto:bogdan@opensips.org" target="_blank">bogdan@opensips.org</a>>:<br>
</div>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<div> <font face="monospace">Hi
Ryzhik,<br>
<br>
Without a
t_relay() it makes
not much sense to
have an dialog
structure at all -
the dialog module
in opensips is
actually design
for proxied calls,
not for UAC calls.<br>
<br>
IMO, you should
keep it a
transaction level,
by sending replies
back only. When
getting the
INVITE, put its
call-id into a DB
table (to keep
only the "active"
session) together
with a lifetime /
expiration time.
When getting a
CANCEL, update the
table (set
lifetime to 0), to
know it is
terminated. And
use an simple
external script
that keeps
scanning the DB
for (1) sending
487 Terminated via
MI if the record
has 0 lifetime or
(2) send a 408
Timeout via MI if
the lifetime
exceeded.<br>
In a similar way
you can handle the
BYE - send back
200OK for the BYE
and set 0 in
lifetime, to send
a 487 canceled
back <br>
<br>
Regards,<br>
</font>
<pre cols="72">Bogdan-Andrei Iancu
OpenSIPS Founder and Developer
<a href="https://www.opensips-solutions.com" target="_blank">https://www.opensips-solutions.com</a>
OpenSIPS Summit 27-30 Sept 2022, Athens
<a href="https://www.opensips.org/events/Summit-2022Athens/" target="_blank">https://www.opensips.org/events/Summit-2022Athens/</a></pre>
<div>On 10/10/22
4:33 PM, Ryzhik
Ivan wrote:<br>
</div>
<blockquote type="cite">
<div dir="ltr">Hello!
<div>My opensips
version is 3.1
with tm,dialog
and rtpengine
modules.</div>
<div>On incoming
INVITE i'm
creating an
early dialog
with 183
replies and
i'm playing
audio to
caller with
rtpengine, no
t_relay() on
this step, OS
is acting as
UAS endpoint.<br>
If the caller
cancels the
invite with a
CANCEL message
- all works
great.<br>
But some users
terminate
dialog with
BYE message.<br>
1) on BYE with
to-tag OS
can't find
dialog with
match_dialog(),
because to-tag
presents.<br>
2) if i use
load_dialog_ctx($ci)
- it is
possible to
handle BYE.<br>
3) in early
dialog
termination
with BYE we
also need to
send final
response to
the INVITE
transaction. <br>
<br>
Maybe I did
something
wrong, but I
can't handle
the final
response to
INVITE in this
case.<br>
</div>
</div>
<br>
<fieldset></fieldset>
<pre>_______________________________________________
Users mailing list
<a href="mailto:Users@lists.opensips.org" target="_blank">Users@lists.opensips.org</a>
<a href="http://lists.opensips.org/cgi-bin/mailman/listinfo/users" target="_blank">http://lists.opensips.org/cgi-bin/mailman/listinfo/users</a>
</pre>
</blockquote>
<br>
</div>
</blockquote>
</div>
</blockquote>
<br>
</div>
</blockquote>
</div>
</blockquote>
</div>
</blockquote>
</div>
</blockquote>
<br>
</div>
</blockquote>
</div>
</blockquote>
<br>
</div>
</blockquote>
</div>
</blockquote>
<br>
</div>
</blockquote>
</div>
</blockquote>
<br>
</div>
_______________________________________________<br>
Users mailing list<br>
<a href="mailto:Users@lists.opensips.org" target="_blank">Users@lists.opensips.org</a><br>
<a href="http://lists.opensips.org/cgi-bin/mailman/listinfo/users" rel="noreferrer" target="_blank">http://lists.opensips.org/cgi-bin/mailman/listinfo/users</a><br>
</blockquote></div></div>