[OpenSIPS-Users] Nested reply_routes

Ben Newlin Ben.Newlin at genesys.com
Fri Apr 10 14:12:41 UTC 2026


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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.opensips.org/pipermail/users/attachments/20260410/1077b831/attachment-0001.html>


More information about the Users mailing list