[SR-Users] Implicit branch creation and private variables questions - (Second Post)

George Diamantopoulos georgediam at gmail.com
Wed Jan 22 15:18:42 CET 2020


Hello Daniel,

Thanks for the input. That clears it up.

@Ben Merrills: Glad to hear my rants are useful to other people as well
:-). Branches are indeed among the more complicated concepts in kamailio
scripting. I've always found resources that explain how things work much
more useful than "how-to/examples" approaches to documentation when it
comes to producing real-world configurations (Daniel and Ramona's kamailio
ebook is a good starting point if you're struggling with grasping the
larger picture). Maybe in part because I can't settle with something just
working the way a set of requirements expect it to unless I also understand
the why.

BR,
George

On Wed, 22 Jan 2020 at 10:35, Daniel-Constantin Mierla <miconda at gmail.com>
wrote:

> Hello,
>
> a new branch is created every time a request is sent out to a new
> destination or resent to same destination after additional processing in a
> failure route. append_branch() should not be needed, unless you want to
> create more branches for parallel forking. Updating $ru or $du and doing
> t_relay() in failure route should be all what is needed to send to a new
> branch.
>
> To have branch route execution, be sure you set it before t_relay(), also
> in failure route, even if you set it previously in request_route for first
> branch -- in other words, t_on_branch() must be used for each step of
> serial forking.
>
> The branch route block is executed inside t_relay(), so it is in the same
> process that sends out the request, but in case of failure routing, further
> branches are not created in the same process as the first branch. The best
> is to use $xavp/$avp if you are not sure where and when those branch
> processing happen.
>
> Cheers,
> Daniel
> On 21.01.20 23:22, George Diamantopoulos wrote:
>
> Hello all,
>
> Some keyboard shortcut resulted in gmail previously sending the message
> out before I had finished writing it, sorry about that. This is the
> complete message.
>
> I'm trying to accomplish the following scenario, and some questions have
> arisen during testing: I'd like to be able to fork serially to a number of
> downstream destinations in case of failure, but also try several hosts
> which are available per destination network (via dispatcher module) before
> failing over to the next one (e.g. try two gateways for provider A and if
> both fail, then try two more gateways for provider B etc). I also need to
> perform some network-specific handling per destination group (=provider),
> which I thought I'd perform in respective branch routes. To that end, I'm
> using something similar to the config pasted toward the end of the message.
>
> Here's some points that have troubled me, if anyone can provide some
> insight:
>
>    1. After exhausting dispatcher group entries for first_provider, the
>    request is indeed forwarded to last_provider with this configuration. I've
>    noticed a new branch is created. I'm assuming this happens because there's
>    some RURI manipulation taking place in branch_route? I recall reading
>    somewhere that even doing $ru = $ru will result in a new branch being
>    created. Is my assumption correct here, or is the new branch created for
>    some other reason? I mean if I did t_on_branch in a failure route following
>    a t_relay which failed, but without manipulating the RURI in the new
>    branch_route, would that still create an implicit new branch or would one
>    have to use append_branch() or similar in this case?
>       - I'm asking because several implicit or explicit branch creation
>       mechanisms are documented in various places (e.g. usrloc, lcr, alias_db,
>       corex) but it's there's no comprehensive list for reference.
>       2. If there are two destinations in the destination group for
>    first_provider, and the first one fails, then the second destination will
>    be tried out in tm:branch-failure:DISPATCH_FIRST_PROV_FAILOVER. Now the Via
>    branch parameter for this INVITE is different than the original (.1 instead
>    of .0), which one can verify by capturing the traffic on-net. However, in
>    the logs, the respective branch route is only run once, and there's no
>    reference to the ".1" Via, even with cfg script debugging enabled. I'm
>    assuming this means that kamailio's definition of "branch" in the context
>    of the configuration file is different to the notion of branch as a
>    transaction identifier in SIP signalling in general? In simpler language,
>    distinct branch identifiers in Via headers between two requests does not
>    mean that these two requests were treated as separate branches in kamailio
>    config: true or false?
>    3. This is causing the most problems for me right now: the $vn PVs
>    seem to be available for the first (main?) branch, but not for subsequent
>    branches which are generated if the first branch fails. I was under the
>    impression that branch_routes are handled by the same process as the
>    request_route for a message, and as a consequence I was expecting private
>    variables to be available there. This doesn't seem to be the case with the
>    example configuration below. $vn(some_var) in
>    branch_route[LAST_PROV_BRANCH] evaluates to NULL. Any insight as to why
>    this happens? And if I need these vars to be available in serial forking,
>    is the recommended solution to use shared variables or is my approach here
>    problematic in other ways?
>
> Thanks!
> George
>
> request_route {
> ...
> $vn(some_var) = "some_value";
> $vn(some_other_var) = "some_other_value";
> ...
> $avp(provider_order) = "last_provider";
> $avp(provider_order) = "first_provider";
> ...
> t_set_fr(120000, 2000);
> route(PROVIDER_SELECTION);
> }
>
> route[PROVIDER_SELECTION] {
> if ( is_avp_set("$avp(provider_order)") ) {
> t_on_failure("PROVIDER_SERIAL");
> if ( $avp(provider_order) == "first_provider" ) {
> $avp(provider_order) = $null;
> route(DISPATCH_FIRST_PROV);
> } else if ( $avp(provider_order) == "last_provider" ) {
> $avp(provider_order) = $null;
> route(DISPATCH_LAST_PROV);
> }
> }
> }
>
> route[DISPATCH_FIRST_PROV] {
> if ( !ds_select_dst("1", "4") ) {
> if ( is_avp_set("$avp(provider_order)") ) {
> route(PROVIDER_SELECTION);
> } else {
> t_send_reply("503", "Downstream carrier unavailable");
> }
> }
>
> t_on_branch_failure("DISPATCH_FIRST_PROV_FAILOVER");
> t_on_branch("FIRST_PROV_BRANCH");
>
> route(RELAY);
> exit;
> }
>
> route[DISPATCH_LAST_PROV] {
> //Similar to First Prov
> }
>
> event_route[tm:branch-failure:DISPATCH_FIRST_PROV_FAILOVER] {
> if (t_is_canceled()) exit;
>
> # next DST - only for 5xx or local timeout
> if ( t_check_status("5[[:digit:]]+") || (t_branch_timeout() &&
> !t_branch_replied()) ) {
> if ( ds_next_dst() ) {
> t_on_branch_failure("DISPATCH_FIRST_PROV_FAILOVER");
> route(RELAY);
> exit;
> } else {
> xlog("L_ERR", "--- SCRIPT_DISPATCH_FIRST_PROV_FAILOVER: Failed to route
> request to first prov.\n");
> }
> }
> }
>
> event_route[tm:branch-failure:DISPATCH_LAST_PROV_FAILOVER] {
> //Similar to First Prov
> }
>
> branch_route[FIRST_PROV_BRANCH] {
> uac_replace_to("$vn(some_var)");
> $ru = $vn(some_other_var);
> }
>
> branch_route[LAST_PROV_BRANCH] {
> uac_replace_to("$vn(some_var)");
> $ru = $vn(some_other_var);
> }
>
> failure_route[PROVIDER_SERIAL] {
> if (t_is_canceled()) exit;
>
> # next Provider - only for 5xx or local timeout
> if ( (t_check_status("5[[:digit:]]+") || (t_branch_timeout() &&
> !t_branch_replied())) && is_avp_set("$avp(provider_order)") ) {
> xlog("L_NOTICE", "--- SCRIPT_PROVIDER_SERIAL: A failover provider was
> selected: Forwarding to $avp(provider_order)\n");
> route(PROVIDER_SELECTION);
> route(RELAY);
> exit;
> } else if ( t_check_status("5[[:digit:]]+") || (t_branch_timeout() &&
> !t_branch_replied()) ) {
> xlog("L_NOTICE", "--- SCRIPT_PROVIDER_SERIAL: No more provider options,
> giving up\n");
> exit;
> } else {
> xlog("L_NOTICE", "--- SCRIPT_PROVIDER_SERIAL: Non-5xx error received,
> relaying\n");
> }
> }
>
> route[RELAY] {
> // Mostly identical to the sample config file
> }
>
>
> _______________________________________________
> Kamailio (SER) - Users Mailing Listsr-users at lists.kamailio.orghttps://lists.kamailio.org/cgi-bin/mailman/listinfo/sr-users
>
> --
> Daniel-Constantin Mierla -- www.asipto.comwww.twitter.com/miconda -- www.linkedin.com/in/miconda
> Kamailio Advanced Training - March 9-11, 2020, Berlin - www.asipto.com
> Kamailio World Conference - April 27-29, 2020, in Berlin -- www.kamailioworld.com
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.kamailio.org/pipermail/sr-users/attachments/20200122/c0797a42/attachment.html>


More information about the sr-users mailing list