Hello,
I'm attempting to load test a simple dispatcher script in OpenSER 1.3.x using SIPp (built-in UAC and UAS scenarios). My dispatcher.list only has one address 8.XX.XX.12 (a SIPp instance, UAS). SIPp on 8.XX.XX.10 sends the INVITE messages to 63.XXX.XXX.110. Everything goes well until the UAC sends ACK and BYE in quick sequence. OpenSER tries to t_relay() it to itself, which results in a "too many hops" error:
2008-08-18 11:16:56:708 1219072616.708649: Aborting call on unexpected message for Call-Id '1-3548@8.XX.XX.10': while expecting '200' (index 8), received 'SIP/2.0 483 To Many Hops Via: SIP/2.0/UDP 8.XX.XX.10:5061;branch=z9hG4bK-3548-1-7 From: sipp sip:sipp@8.XX.XX.10:5061;tag=3548SIPpTag001 To: sut sip:service@63.XXX.XXX.110:5060;tag=2148SIPpTag011 Call-ID: 1-3548@8.XX.XX.10 CSeq: 2 BYE Server: OpenSER (1.3.2-notls (x86_64/linux)) Content-Length: 0
I have tried modifying the SIPp UAC script to re-use the Contact: header from the SIP 200 OK message in the R-URI of the SIP ACK and SIP BYE, to no avail. I have loaded the TM module but I suppose that since the SIP 200 OK is the final message of the transaction, SIP ACK and SIP BYE won't automatically be relayed to 8.XX.XX.12.
Is this an OpenSER issue or a SIPp scripting issue? Any advice would be appreciated. Please find below some relevant lines from my openser.cfg:
route{ xlog("TRACE:ROUTE: src($si:$sp) dst($Ri:$Rp) msg($mb)\n");
# initial checkings if ( !mf_process_maxfwd_header("10") ) { xlog("SCRIPT:ERROR: $rm (from $si:$sp) too many hops\n"); sl_send_reply("483","To Many Hops"); exit; };
if (method==CANCEL) { if (t_check_trans()) t_relay(); exit; }
# routing if (has_totag()) { xlog("SCRIPT0:INFO: $rm RURI=[$ru] - routing to dst-uri [$du] cnt [$avp(i:273)] dst set [$avp(i:271)]\n"); loose_route(); if (method=="INVITE") record_route(); route(1); exit; }
The SIP ACK and SIP BYE follow the route defined in the above if {} statement. The SIP INVITE follows the dispatcher route shown below:
record_route();
# perform load balancing
# set algorithm (4 = round robin) $avp(alg) = 4; # set the group $avp(grp) = 2;
if (method=="INVITE") xlog("CALL_START: RURI=[$ru] group=[$avp(grp)] callid=$ci\n");
# do balancing if(!ds_select_dst("$avp(grp)", "$avp(alg)")) { xlog("CALL_DROP:INTERNAL: no destinations for [$ru] group=[$avp(grp)], callid=$ci\n"); sl_send_reply("404", "no dst"); exit; }
if(avp_check("$avp(i:273)", "eq/i:1")) { if(!avp_pushto("$ruri","$avp(i:271)")) { xlog("CALL_DROP:INTERNAL: cannot push to ruri [$avp(i:271)], group=[$avp(grp)], callid=$ci\n"); sl_send_reply("500", "cannot get dst"); exit; } } else { # redundancy t_on_failure("1"); }
xlog("SCRIPT:INFO: $rm RURI=[$ru] - routing to dst-uri [$du] cnt [$avp(i:273)] dst set [$avp(i:271)]\n");
# do forward route(1); exit;