Hi Daniel,

I've actually been spending a lot of time with the dispatcher readme to try to 
figure this out. If there are restrictions in usage as you indicate, then it is 
not documented.

>From the dispatcher readme:

ds_next_dst
Takes the next destination address from the corresponding XAVPs and sets the 
dst_uri (outbound proxy address).
This function can be used from REQUEST_ROUTE, FAILURE_ROUTE.

ds_select_dst
If the bit 2 in 'flags' parameter is set, the rest of the addresses from the 
destination set are stored in XAVP list (limited with an optional 'limit' 
parameter). You can use 'ds_next_dst()' to use next address in order to achieve 
serial forking to all possible destinations.
This function can be used from REQUEST_ROUTE, FAILURE_ROUTE.

My issue is that I want to select from a new group of destinations only when a 
particular failure status has been received, so I can't simply only call 
ds_next_dst() in failure_route.

Anyways, the problem is not in the initial group selection, but rather in the 
subsequent calls to ds_next_dst(). I changed the logic to how you recommended, 
with ds_select_dst() being called only in request_route, and ds_next_dst() only 
called by failure_route. The problem is exactly the same: ds_next_dst() starts 
selecting destinations that are not in the group that was initially selected 
with ds_select_dst().

You can see it happening here:

dispatcher [dispatch.c:2097]: ds_manage_routes(): set [2]
dispatcher [dispatch.c:2213]: ds_manage_routes(): using alg [8] hash [0]
dispatcher [dispatch.c:2260]: ds_manage_routes(): selected [8-2-0/0] 
<sip:127.0.0.1:5072;transport=udp>
dispatcher [dispatch.c:2281]: ds_manage_routes(): using first entry [2/0]
dispatcher [dispatch.c:2057]: ds_select_dst_limit(): selected target 
destinations: 1
<script>: REQUEST ROUTE: Relayed to [sip:127.0.0.1:5072;transport=udp] via 
forced socket [udp:127.0.0.1:5074]
<script>: FAILURE ROUTE: 400 Bad Request, trying next available gateway...
<script>: FAILURE ROUTE: Selecting next destination from: 
[grp=2;uri=sip:127.0.0.1:5072;transport=udp;]
dispatcher [dispatch.c:2357]: ds_update_dst(): updating dst
dispatcher [dispatch.c:2373]: ds_update_dst(): updating dst with next record
dispatcher [dispatch.c:2403]: ds_update_dst(): using next dst uri 
[sip:127.0.0.1:5072;transport=udp]
<script>: FAILURE ROUTE: Next destination selected: 
[sip:127.0.0.1:5072;transport=udp] from 
[grp=2;uri=sip:127.0.0.1:5072;transport=udp;]
<script>: FAILURE ROUTE: 400 Bad Request, trying next available gateway...
<script>: FAILURE ROUTE: Selecting next destination from: 
[grp=2;uri=sip:127.0.0.1:5072;transport=udp;]
dispatcher [dispatch.c:2357]: ds_update_dst(): updating dst
dispatcher [dispatch.c:2373]: ds_update_dst(): updating dst with next record
dispatcher [dispatch.c:2403]: ds_update_dst(): using next dst uri 
[sip:127.0.0.1:5071;transport=udp]
<script>: FAILURE ROUTE: Next destination selected: 
[sip:127.0.0.1:5071;transport=udp] from 
[grp=1;uri=sip:127.0.0.1:5071;transport=udp;]

It happens in this order:

1. Request_route ds_select_dst() selects group=2 
destination=sip:127.0.0.1:5072;transport=udp
2. Failure_route ds_next_dst() selects group=2 
destination=sip:127.0.0.1:5072;transport=udp (again?)
3. Failure_route ds_next_dst() selects group=1 
destination=sip:127.0.0.1:5071;transport=udp

I don't understand what I'm doing incorrectly for it to select a destination 
from group 1.

One thing that is standing out to me is the log line showing 
"ds_select_dst_limit(): selected target destinations: 1" when ds_select_dst() 
is called. Based on the readme for ds_select_dst(), all addresses from the 
group are stored in the XAVP if bit 2 of the 'flags' parameter is set (which it 
is) unless otherwise limited by the 'limit' parameter (it is not). However, 
when I print out the XAVP with xavp_params_implode, the XAVP only ever contains 
a single destination.

Thanks,

________________________________
From: Daniel-Constantin Mierla <mico...@gmail.com>
Sent: Wednesday, September 27, 2023 01:58
To: Kamailio (SER) - Users Mailing List <sr-users@lists.kamailio.org>
Cc: Geoff Goas <geoff.g...@interoptechnologies.com>
Subject: Re: [SR-Users] What is the expected behavior for dispatcher's 
ds_next_dst?

Hello,

normally ds_select_dst() should be used inside request_route and
ds_next_dst() in the failure_route. As you do the former also in the
failure_route, you keep selecting the destination from the group and add
them to the list of possible next hops.

Look at the readme of dispatcher module, it has a complete sample config
how to use the two functions.

Cheers,
Daniel

On 26.09.23 22:02, geoff.goas--- via sr-users wrote:
> Hello,
>
> I have some questions about dispatcher's behavior. I noticed that when I 
> first ds_select_dst() a specific dispatcher group ID, ds_next_dst() will 
> cycle through the active destinations in that group. When it reaches the end 
> of the destinations in the group, it does not return "false", instead it 
> starts to return destinations that are not a part of that group, ie. those 
> destinations which are listed prior to the selected group in the 
> dispatcher.list file. Is this the expected behavior? I've observed it on 
> kamailio 5.3 and 5.5 releases.
>
> My dispatcher.list:
>
> # Group 1
> 1 sip:127.0.0.1:5071;transport=udp 8 0
> # Group 2
> 2 sip:127.0.0.1:5072;transport=udp 8 0
> # Group 3
> 3 sip:127.0.0.1:7010;transport=udp 8 0
> 3 sip:127.0.0.1:7011;transport=udp 8 0
> 3 sip:127.0.0.1:7012;transport=udp 8 0
> # Group 4
> 4 sip:127.0.0.1:5071;transport=udp 8 0
> 4 sip:127.0.0.1:5072;transport=udp 8 0
>
> I have the following in failure_route (excerpt):
>
>                     $var(dsFoundDestination) = 0;
>
>                         if (t_any_replied())
>                         {
>                             xavp_params_implode("_dsdst_", 
> "$var(dsDestinations)");
>                             xlog("L_INFO", "FAILURE ROUTE: Already have 
> replies on this transaction. Selecting next destination from: 
> [$var(dsDestinations)]");
>                             if (ds_next_dst())
>                             {
>                                 xavp_params_implode("_dsdst_", 
> "$var(dsDestinations)");
>                                 xlog("L_INFO", "FAILURE ROUTE: Next 
> destination selected: [$du] from [$var(dsDestinations)]");
>                                 $var(dsFoundDestination) = 1;
>                             }
>                         }
>                         else if (ds_select_dst("3", "8")) // Dispatcher Group 
> 3
>                         {
>                             xlog("L_INFO", "FAILURE ROUTE: Did not find any 
> replies on this transaction. Selected destination: [$du]");
>                             $var(dsFoundDestination) = 1;
>                         }
>                         if ($var(dsFoundDestination))
>                         {
>                             $var(logString) = "FAILURE ROUTE: Relayed to [" + 
> $du + "]";
>                             if (t_relay())
>                             {
>                                 xlog("L_INFO", "$var(logString)");
>                             }
>                         }
>
> Produces the following logs:
>
> FAILURE ROUTE: Did not find any replies on this transaction. Selected 
> destination: [sip:127.0.0.1:7012;transport=udp]
> FAILURE ROUTE: Relayed to [sip:127.0.0.1:7012;transport=udp]
> FAILURE ROUTE: Already have replies on this transaction. Selecting next 
> destination from: [grp=3;uri=sip:127.0.0.1:7012;transport=udp;]
> FAILURE ROUTE: Next destination selected: [sip:127.0.0.1:7011;transport=udp] 
> from [grp=3;uri=sip:127.0.0.1:7011;transport=udp;]
> FAILURE ROUTE: Relayed to [sip:127.0.0.1:7011;transport=udp]
> FAILURE ROUTE: Already have replies on this transaction. Selecting next 
> destination from: [grp=3;uri=sip:127.0.0.1:7011;transport=udp;]
> FAILURE ROUTE: Next destination selected: [sip:127.0.0.1:7010;transport=udp] 
> from [grp=3;uri=sip:127.0.0.1:7010;transport=udp;]
> FAILURE ROUTE: Relayed to [sip:127.0.0.1:7010;transport=udp]
> FAILURE ROUTE: Already have replies on this transaction. Selecting next 
> destination from: [grp=3;uri=sip:127.0.0.1:7010;transport=udp;]
> FAILURE ROUTE: Next destination selected: [sip:127.0.0.1:5072;transport=udp] 
> from [grp=2;uri=sip:127.0.0.1:5072;transport=udp;]
> FAILURE ROUTE: Relayed to [sip:127.0.0.1:5072;transport=udp]
> FAILURE ROUTE: Already have replies on this transaction. Selecting next 
> destination from: [grp=2;uri=sip:127.0.0.1:5072;transport=udp;]
> FAILURE ROUTE: Next destination selected: [sip:127.0.0.1:5072;transport=udp] 
> from [grp=2;uri=sip:127.0.0.1:5072;transport=udp;]
> FAILURE ROUTE: Relayed to [sip:127.0.0.1:5072;transport=udp]
> FAILURE ROUTE: Already have replies on this transaction. Selecting next 
> destination from: [grp=2;uri=sip:127.0.0.1:5072;transport=udp;]
> FAILURE ROUTE: Next destination selected: [sip:127.0.0.1:5071;transport=udp] 
> from [grp=1;uri=sip:127.0.0.1:5071;transport=udp;]
> FAILURE ROUTE: Relayed to [sip:127.0.0.1:5071;transport=udp]
>
> I want to stop the loop once there are no more active destinations in group 
> 3. Is the solution simply to check that the selected destination is part of 
> the desired group and stop processing if it is not?
>
> Thanks for your time.
> __________________________________________________________
> Kamailio - Users Mailing List - Non Commercial Discussions
> To unsubscribe send an email to sr-users-le...@lists.kamailio.org
> Important: keep the mailing list in the recipients, do not reply only to the 
> sender!
> Edit mailing list options or unsubscribe:


--
Daniel-Constantin Mierla (@ asipto.com)
twitter.com/miconda -- linkedin.com/in/miconda
Kamailio Consultancy - Training Services -- asipto.com
Kamailio World Conference - kamailioworld.com

CAUTION: This email originated from outside of the organization. Do not click 
links or open attachments unless you recognize the sender and know the content 
is safe.
__________________________________________________________
Kamailio - Users Mailing List - Non Commercial Discussions
To unsubscribe send an email to sr-users-le...@lists.kamailio.org
Important: keep the mailing list in the recipients, do not reply only to the 
sender!
Edit mailing list options or unsubscribe:

Reply via email to