It is a bit counterintuitive, though. Like Joel, I would have thought such 
restrictions ultimately should ultimately be based on the type of the toplevel 
action.

Then again, I make use of this a lot from failure_route, calling the same route 
blocks over and over for route-advancing, some of them containing function 
calls which are not strictly possible in failure_route. The only thing one 
really has to be careful of in that scenario is transaction state; can’t send 
stateless replies out of failure_route, so accordingly cannot send them from a 
descendant route either. That’s an excellent use-case for send_reply(), which 
does the right thing (in effect, sl_send_reply() vs t_reply()) depending on 
whether a transaction context exists.

—
Sent from mobile, with due apologies for brevity and errors.

> On Aug 13, 2019, at 3:38 AM, Joel Serrano <j...@textplus.com> wrote:
> 
> Great!!! This is good to know!!
> 
> Thank you Daniel!
> Joel.
> 
>> On Tue, Aug 13, 2019 at 12:36 AM Daniel-Constantin Mierla 
>> <mico...@gmail.com> wrote:
>> Hello,
>> 
>> that is a "known hack" to go around the route block type restrictions for 
>> functions.
>> 
>> The purpose of the restrictions is to limit the usage in the blocks where 
>> the developer intended to allow the function to be used, like she/he tested 
>> for those route blocks or thought it is enough there and didn't analyze the 
>> effects when using in other route block types.
>> 
>> However, many functions are just safe to use in other route block types than 
>> those imposed by the developer.
>> 
>> Probably the unregister() is safe in onreply block, because it doesn't need 
>> to generate a reply or use information from request URI.
>> 
>> Cheers,
>> Daniel
>> 
>>> On 13.08.19 07:28, Joel Serrano wrote:
>>> Forgot to add:
>>> 
>>> root@csbc01:~# kamailio -V
>>> version: kamailio 5.3.0-dev7 (x86_64/linux)
>>> flags: STATS: Off, USE_TCP, USE_TLS, USE_SCTP, TLS_HOOKS, USE_RAW_SOCKS, 
>>> DISABLE_NAGLE, USE_MCAST, DNS_IP_HACK, SHM_MMAP, PKG_MALLOC, Q_MALLOC, 
>>> F_MALLOC, TLSF_MALLOC, DBG_SR_MEMORY, USE_FUTEX, FAST_LOCK-ADAPTIVE_WAIT, 
>>> USE_DNS_CACHE, USE_DNS_FAILOVER, USE_NAPTR, USE_DST_BLACKLIST, 
>>> HAVE_RESOLV_RES
>>> ADAPTIVE_WAIT_LOOPS 1024, MAX_RECV_BUFFER_SIZE 262144, MAX_URI_SIZE 1024, 
>>> BUF_SIZE 65535, DEFAULT PKG_SIZE 8MB
>>> poll method support: poll, epoll_lt, epoll_et, sigio_rt, select.
>>> id: unknown
>>> compiled with gcc 8.3.0
>>> root@csbc01:~#
>>> 
>>> 
>>> 
>>>> On Mon, Aug 12, 2019 at 2:13 PM Joel Serrano <j...@textplus.com> wrote:
>>>> Hello, 
>>>> 
>>>> I'm playing around with the unregister() function from the registrar 
>>>> module:
>>>> 
>>>> https://www.kamailio.org/docs/modules/devel/modules/registrar.html#registrar.f.unregister
>>>> 
>>>> Docs say that that it can be used in REQUEST_ROUTE or FAILURE_ROUTE.
>>>> 
>>>> I needed it in REPLY_ROUTE, and before reading the docs I tried it and got 
>>>> this error:
>>>> 
>>>> Aug 12 15:52:44 csbc01 kamailio: CRITICAL: <core> [core/cfg.y:3526]: 
>>>> yyerror_at(): parse error in config file 
>>>> /etc/kamailio/csbc/reply_routes.cfg, line 27, column 71: Command cannot be 
>>>> used in the block#012
>>>> Aug 12 15:52:44 csbc01 kamailio[12737]: ERROR: bad config file (1 errors)
>>>> 
>>>> But, I have this working on another setup, I compared, and my difference 
>>>> is that I'm running unregister() inside a route, and calling that route 
>>>> from reply_route, and that works (and by works, I mean it also does what 
>>>> it is supposed to do, which is unregister the AoR).
>>>> 
>>>> So this doesn't work:
>>>> 
>>>> ...
>>>> onreply_route[MANAGE_REG_REPLY] {
>>>>      if(status=~"2[0-9][0-9]") {
>>>>          if(($sel(contact.expires)==0) || ($hdr(Expires)==0)){
>>>>             if (unregister("location", "$sht(sipserver=>$fU::contact)")) {
>>>>                 xlog("L_NOTICE", "[usrloc] removed user location\n");
>>>>             }
>>>>             route(DEL_SIPSERVER);
>>>> }
>>>> ...
>>>> 
>>>> But this works:
>>>> 
>>>> ...
>>>> onreply_route[MANAGE_REG_REPLY] {
>>>>      if(status=~"2[0-9][0-9]") {
>>>>          if(($sel(contact.expires)==0) || ($hdr(Expires)==0)){
>>>>             route(UNREG_CUSTOMER);
>>>>             route(DEL_SIPSERVER);
>>>> }
>>>> ...
>>>> 
>>>> ...
>>>> route[UNREG_CUSTOMER] {
>>>>             if (unregister("location", "$sht(sipserver=>$fU::contact)")) {
>>>>                 xlog("L_NOTICE", "[usrloc] removed user location\n");
>>>>             }
>>>> }
>>>> ...
>>>> 
>>>> 
>>>> 
>>>> So I'm in no-mans-land right now, docs say it's not allowed in 
>>>> REPLY_ROUTE, and if I try it it will fail, but if I try it inside a route, 
>>>> it woks (hack?).
>>>> 
>>>> What is the correct approach here? Should unregister() be valid in 
>>>> reply_route (like other similar functions, for example: save()) and 
>>>> therefor docs should be updated and the error in the logs should also be 
>>>> updated, or if it's really not supported, shouldn't Kamailio not let me 
>>>> use it anywhere that a ends up being called from reply_route?
>>>> 
>>>> I hope I have explained myself correctly. As always, please let me know if 
>>>> this should be a GH issue instead and I'll happily create it.
>>>> 
>>>> Thanks, 
>>>> Joel.
>>>> 
>>>> 
>>>> 
>>> 
>>> 
>>> _______________________________________________
>>> 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 (SER) - Users Mailing List
> sr-users@lists.kamailio.org
> https://lists.kamailio.org/cgi-bin/mailman/listinfo/sr-users
_______________________________________________
Kamailio (SER) - Users Mailing List
sr-users@lists.kamailio.org
https://lists.kamailio.org/cgi-bin/mailman/listinfo/sr-users

Reply via email to