On Wednesday, September 14, 2016 3:11:08 PM CDT 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
Paul, I had worked a while back on the exact same thing. Unfortunately for me, most of my clients are using Zoiper which doesn't seem to handle the re- invite properly. However, the following worked for me with other clients. I was already using hash tables to store variables since I have the first rtpengine_offer in the branch_route. I use t_reuse_branch() and setbflag(FLB_RTPENGINE_FAILURE), catching the branch flag when it loops around again in manage_branch so I don't offer again from there. I'm not sure all of the below is necessary, but it worked. I'll also be studying your method as it seems simpler ;) #!ifdef WITH_RTPENGINE # Handle branch failure cases event_route[tm:branch-failure:rtpengine] { if(t_check_status("415|488")) { # Ok, this all works, except that Zoiper doesn't recognize the change in # Via header (branch) in the updated re-offer branch as an update, and # replies with 482 Merged Request -- which fails. t_reuse_branch(); setbflag(FLB_RTPENGINE_FAILURE); if($sht(rtpengine=>$ci::$T_branch_idx::offer)=~"RTP/AVP") { $sht(rtpengine=>$ci::$T_branch_idx::offer)="via- branch=extra replace-origin replace-session-connection reset RTP/SAVP"; } else if($sht(rtpengine=>$ci::$T_branch_idx::offer)=~"RTP/ SAVP") { $sht(rtpengine=>$ci::$T_branch_idx::offer)="via- branch=extra replace-origin replace-session-connection reset RTP/AVP"; } xlog("L_INFO", "event_route[branch-failure:rtpengine]: NEW: $sht(rtpengine=>$ci::$T_branch_idx::offer)\n"); rtpengine_offer($sht(rtpengine=>$ci::$T_branch_idx::offer)); # Reset destination URI and sending socket $du=$sht(rtpengine=>$ci::$T_branch_idx::du); $fs=$null; route(RELAY); exit; } } #!endif On a side note, a lot of this could be mitigated if I could get $xavp(ulattrs) to work after a call to alias_db_lookup() followed by lookup_branches("location") -- the branch indexes get out of sync with those in the $xavp :( -- Anthony - https://messinet.com/ - https://messinet.com/~amessina/gallery F9B6 560E 68EA 037D 8C3D D1C9 FF31 3BDB D9D8 99B6
signature.asc
Description: This is a digitally signed message part.
_______________________________________________ SIP Express Router (SER) and Kamailio (OpenSER) - sr-users mailing list sr-users@lists.sip-router.org http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-users