[OpenSIPS-Users] Nested reply_routes
Richard Robson
richard at rikrobson.co.uk
Mon Apr 13 13:38:04 UTC 2026
If you just want the reply_route to read more easily for collegues, then
just make sure its documented and you have comments where appropriate.
Personally I think jumping to a route block form a reply block is going
to be more confusing then having a flowing script inside a single
onpely_route.
is the use case requiring the UAC to receive a 181 instead of a 180?
regards,
Richard
On 13/04/2026 13:42, Malte wrote:
>
> I get what you say. I can map my custom logic into request route
> blocks, as long as there is no function which requires execution from
> a specific (non-request) route type. Therefore I have to make sure
> that every function which requires to be executed in a specific
> (non-request) route is still being called in the respective section.
>
> For example if I want to shorten my MAIN onreply_route by moving a
> part of it to another block and referencing it from the main block, I
> have to make sure that reply specific functions do not migrate from
> the onreply route.
>
> This could be done by adjust the logic so it only checks the
> conditions for a operation using non route specific functions, move
> that code to a new route block, refer to that route block from the
> onreply route, wait for the new route block to finish and return to
> the onreply route block and then calling the route specific functions
> when a certain flag was set inside the aforementioned new route block.
>
> incoming reply
>
> -> onreply_route[MAIN]
>
> -> route[CUST_FUNCT]
>
> - if t_check_status("180") && hdr(xyz) then avp(180xyz) = 1;
>
> -> back to onreply_route[MAIN]
>
> - if avp(180xyz) then change_reply_status(181, "test");
>
>
> My initial idea was to shorten my onreply_route to make it more easily
> understandable by my colleagues. Although I like this reinterpretation
> of the route block - how it’s used and how it can be used - I think
> its hard to explain why some reply operations are done in a request
> route and some not. Therefore I for now just keep my block as long as
> it is, but keep the possibilities in mind.
>
>
> Thank you all for your suggestions!
>
>
> On 10/04/2026 16:12, Ben Newlin via Users wrote:
>> The solution proposed by Richard works and it is working in your
>> case, in the sense that the called route is being executed.
>>
>> However, this method does not remove any conditions of specific
>> functions on which routes they can be called from, and the called
>> route is not a reply route it is a basic route. So the error is valid.
>>
>> This mechanism can be used generally to break up processing in large
>> routes, but any functions which require execution from a specific
>> route type cannot be moved to the nested route. What you need is
>> something like this:
>>
>>
>> route[reply_processing_1] {
>> # do general reply processing step 1
>> }
>>
>> route[reply_processing_2] {
>> # do general reply processing step 2
>> }
>>
>> onreply_route[MAIN] {
>> route(reply_processing_1);
>> # Perform reply_route specific processing here
>> change_reply_status(181, "test”);
>>
>> route(reply_processing_2);
>> }
>>
>> Ben Newlin
>>
>>
>> *From: *Users <users-bounces at lists.opensips.org> on behalf of Malte
>> <spce at lard.at>
>> *Date: *Friday, April 10, 2026 at 5:33 AM
>> *To: *users at lists.opensips.org <users at lists.opensips.org>
>> *Subject: *Re: [OpenSIPS-Users] Nested reply_routes
>>
>> ------------------------------------------------------------------------
>>
>> Hi,
>>
>> this approach unfortunately doesn't work. Does somebody else know of
>> a solution to neaten up big reply routes?
>>
>> My code and the following error:
>>
>> 367 route[test] {
>> 368 xlog("now in test route");
>> 369 change_reply_status(181, "test");
>> 370 }
>> 371
>> 372 onreply_route[MAIN] {
>> 373 # For fr_inv_timeout handling
>> 374 if (t_check_status("180")) {
>> 375 $var(180_in_trans)=1;
>> 376 route(test);
>> 377 xlog("back to reply route");
>> 378 }
>>
>> *CRITICAL:core:yyerror: parse error in
>> /etc/opensips/opensips.cfg:369:29-30: Command <change_reply_status>
>> cannot be used in the block*
>>
>> Doing it in a reply route:
>>
>> 367 onreply_route[test] {
>> 368 xlog("now in test route");
>> 369 change_reply_status(181, "test");
>> 370 }
>> 371
>> 372 onreply_route[MAIN] {
>> 373 # For fr_inv_timeout handling
>> 374 if (t_check_status("180")) {
>> 375 $var(180_in_trans)=1;
>> 376 t_on_reply("test");
>> 377 xlog("back to MAIN reply route");
>> 378 }
>>
>> *ERROR:sipmsgops:change_reply_status_f: the class of provisional or
>> positive final replies cannot be changed*
>>
>> Jump to secondary reply route via proxy route:
>>
>> 367 route[test] {
>> 368 xlog("now in test route");
>> 369 t_on_reply("test");
>> 370 }
>> 371
>> 372 onreply_route[test] {
>> 373 xlog("now in test reply route");
>> 374 change_reply_status(181, "test");
>> 375 }
>> 376
>> 377 onreply_route[MAIN] {
>> 378 # For fr_inv_timeout handling
>> 379 if (t_check_status("180")) {
>> 380 $var(180_in_trans)=1;
>> 381 route(test);
>> 382 xlog("back to MAIN reply route");
>> 383 }
>>
>> *ERROR:sipmsgops:change_reply_status_f: the class of provisional or
>> positive final replies cannot be changed*
>>
>> I must note that change_reply_status works flawlessly when executing
>> directly in MAIN reply route.
>>
>>
>> Thanks,
>>
>> Malte
>>
>>
>> _______________________________________________
>> Users mailing list
>> Users at lists.opensips.org
>> http://lists.opensips.org/cgi-bin/mailman/listinfo/users
>
> _______________________________________________
> Users mailing list
> Users at lists.opensips.org
> http://lists.opensips.org/cgi-bin/mailman/listinfo/users
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.opensips.org/pipermail/users/attachments/20260413/48e66fce/attachment-0001.html>
More information about the Users
mailing list