Hello,
there is no variable that is stored in the scope of the branch. What you
can use is a hash table and compose the key from callid and branch index
variables with expires that is same as transaction lifetime (max
retransmission timeout).
And indeed you need to 'touch' the r-uri in order to signal to kamailio
that you have a new destination and want to create a new branch. It may
work to just use append_branch(), otherwise reassigning $ru to itself
should do it.
Cheers,
Daniel
On 14/09/16 16:11, Paul Smith wrote:
Hi,
I am struggling to figure out variable scope in branches and
branch_failure_routes. Is there a way to store a variable in a branch
route so that I can then read it from the branch failure route if that
branch fails? Also does writing $ru in branch_failure_route append a
branch?
For example I have multiple SIP devices registered to Kamailio on the
same account credentials. The devices are behind same NAT, so same
public IP. Some devices have SRTP required and some cannot use SRTP
at all, Kamailio does not know in advance of the call whether the call
will use SRTP or RTP.
When I send a call to that user Kamailio correctly parallel forks to
all the registered devices. I use rtpengine offer to send SDP with
RTP/SAVP in the initial invites.
If one of the devices sends a 488 due to not being able to handle the
RTP/SAVP I then want to run rtpengine_offer with RTP/AVP and send
another invite to the same device.
In the branch failure route I seem to have to read the current $ru and
then write it back into $ru before calling t_relay() or I get
Sep 14 14:56:06 registrar-secure /usr/sbin/kamailio[10168]: ERROR: tm
[t_fwd.c:1771]: t_forward_nonack(): ERROR: t_forward_nonack: no
branches for forwarding
This code seems to work, but it feels like I’m doing something very
wrong…. in particular $avp(triedrtpout) is set for the transaction, I
should be setting it separately for each branch.
event_route[tm:branch-failure:SRTP] { # Handle failure response
xlog("L_INFO", "Handling $T_reply_code response to $rm to
ru: <$ru> and du: $du\n");
if(t_check_status("488") && is_method("INVITE"))
{
if ($avp(triedsrtpout)==1) {
# set $ru seems to create a new branch ...
even when we set it to its current value.
# we want to generate a new SIP INVITE to
the same AOR but with different SDP
$avp(buffer)=$ru;
$ru=$avp(buffer);
xlog("L_INFO","488 caught. Resending to
$ru");
# try with unencrypted RTP/AVP
rtpengine_delete();
rtpengine_offer("to-tag trust-address
replace-origin replace-session-connection ICE=force RTP/AVP");
if (!t_relay()) {
sl_reply_error();
}
}
}
}
I am using kamailio 4.2 debian package for this registrar.
Sorry for the rambling question … I don’t understand enough to write
the short version!
Paul
_______________________________________________
SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing list
sr-users(a)lists.sip-router.org
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users
--
Daniel-Constantin Mierla
http://www.asipto.com -
http://www.kamailio.org
http://twitter.com/#!/miconda -
http://www.linkedin.com/in/miconda