On Thursday 08 October 2009 22:54:24 CSB wrote: > CANCEL sip:031234...@domain.com SIP/2.0 > Record-Route: <sip:147.202.001.001;lr=on;ftag=as02736614> > Record-Route: <sip:147.202.001.002;lr=on;ftag=as02736614> > Record-Route: <sip:147.202.001.001;lr=on;ftag=as02736614> > Record-Route: <sip:147.202.001.001;lr=on;ftag=as02736614> > Record-Route: <sip:147.202.001.001;lr=on;ftag=as02736614>
[...] It's obvious that you are looping over yourself. Look more about this inline ... > I have pasted what I think are the relevant parts from the config file. > Could anyone advise where the problem might be? > > route { > > # ----------------------------------------------------------------- > ### SipTrace. > # ----------------------------------------------------------------- > if ! is_method("OPTIONS|SUBSCRIBE|NOTIFY") { > sip_trace(); > setflag(28); > } > > # ----------------------------------------------------------------- > # Sanity Check Section > # ----------------------------------------------------------------- > if (!mf_process_maxfwd_header("10")) { > sl_send_reply("483", "Too Many Hops"); > return; > }; > > if (msg:len > max_len) { > sl_send_reply("513", "Message Overflow"); > return; > }; > > # ----------------------------------------------------------------- > # Record Route Section > # ----------------------------------------------------------------- > #If it's an INVITE & client is NATed, > #xlog("welcome"); > if (method=="INVITE" && client_nat_test("3")) { > #Record-route and specify the record-route header > explicitly record_route_preset("147.202.001.001:5060;nat=yes"); # insert IP > address ^^^^^^^ This is one of your biggest errors. 1º - Don't add that IP manualy, let the record_route function to decide witch IP it's should add. 2º - You are adding a record-route header TO EVERY INVITE you receive, no matter if a "first one" in a dialog or a reinvite, or a retrasmition, or ... so you will allways end with a loop. > xlog("invite and nated so record_route_preset"); > #If not Nated and not REGISTER then normal record-route > } else if (method!="REGISTER") { > record_route(); > xlog("not register and not nated so record_route"); > }; > > # ----------------------------------------------------------------- > # Call Tear Down Section > # ----------------------------------------------------------------- > if (method=="BYE" || method=="CANCEL") { > setflag(1); > #call end_media_session in case we're proxying media > end_media_session(); ^^^^^ So .. directly .. without checking anything more ... close mediasessions ... you are brave !!! ;-) > }; > > # ----------------------------------------------------------------- > # Loose Route Section > # ----------------------------------------------------------------- > if (loose_route()) { > #Ensure we are dealing with a re-INVITE. Only connected > calls have tag= > #entry in the To header. So if it's loose routed and > doesn't have totag > #and it's an invite or reply then something's wrong > xlog("loose_route"); > if ((method=="INVITE" || method=="REFER") && !has_totag()) > { > sl_send_reply("403", "Forbidden"); > xlog("403 in lr"); > return; > }; > > if (method=="INVITE") { > > if (!allow_trusted()) { > xlog("!allow_ trusted for r-uri <$ru>"); > if (!proxy_authorize("","subscriber")) { > proxy_challenge("domain.com","1"); > return; > } else if (!check_from()) { > sl_send_reply("403", "Use > From=ID"); return; > }; > consume_credentials(); > }; > > #check client is nated or that we've already > identified it's nated > xlog("Re-invite. rs $rs si $si rm $rm ru $ru tu $tu > fu $fu fd $fd rr $rr"); > if (client_nat_test("3") || > search("^Route:.*;nat=yes")) { > setbflag(6); > xlog("Recipient is nated so setbflag 6 and > use mediaproxy: r-uri <$ru>"); > use_media_proxy(); ^^^^^^^ So for re-invites you take into account to do mediaproxy handling ... but not for first-time INVITE's ... quite extrange ... ;-) > }; > > }; > > route(1); > return; > }; > > > # ----------------------------------------------------------------- > # Call Type Processing Section > # ----------------------------------------------------------------- > # Processes out-of-dialogue messages i.e. > # 1. new dialogue > # 2. message not destined for us (but we are relaying or proxying) > xlog("Call Type Processing Section"); > if (!is_uri_host_local()) { > xlog("!is_uri_host_local"); > if (is_from_local() || allow_trusted() ) { > xlog("is_from_local() || allow_trusted()"); > route(5); > route(1); > } else { > sl_send_reply("403", "Forbidden"); > xlog("403 in call type processing. rs $rs si $si rm > $rm ru $ru tu $tu fu $fu fd $fd rr $rr"); > }; > return; > }; > > sip_trace(); > > if (method=="ACK") { > route(1); > return; > } else if (method=="CANCEL") { > route(1); ^^^^^ Uff ... another point to having problems ... look ahead. > return; > } else if (method=="INVITE") { > route(3); > return; > } else if (method=="REGISTER") { > route(2); > return; > } else if (method=="SUBSCRIBE") { > route(7); > return; > }; > > route[1] { > > # ----------------------------------------------------------------- > # Default Message Handler > # ----------------------------------------------------------------- > > xlog("hit route(1). rs $rs si $si rm $rm ru $ru tu $tu fu $fu rr > $rr"); > #Call reply_route(1) to intercept response messages heading to the > client > t_on_reply("1"); > #Try to relay the message to its destination > if (!t_relay()) { > #If it can't and it's an INVITE or ACK end the media > proxying > log(1,"route[1] !t_relay"); > if (method=="INVITE" || method=="ACK") { > end_media_session(); ^^^^^^ For and ACK ?? .. sure ??? .. ACK will never arrive here, also INVITE should never arrive here, because you are sending them to route 3 from the main route block. > }; > > sl_reply_error(); > } else { > log(1,"route[1] t_relay"); > }; ^^^^^ So you route CANCEL to route(1) ... but you don't test if that CANCEL belongs to an stablished NATED dialog and close mediaproxy session ... > } > > onreply_route[1] > > #Handles message that are returned to the sender i.e. response to caller's > original request > { > xlog("hit onreply_route(1). rs $rs si $si rm $rm ru $ru tu $tu fu > $fu rr $rr"); > > if (isbflagset(6)) { > xlog("flag(6) is set for $fu . We're currently in > onreply_route(1)"); ^^^^^^ So a reply to a NATED Request and you don't do anything ... quite good ... > }; > if (isbflagset(7)) { > xlog("flag(7) is set for $fu . We're currently in > onreply_route(1)"); > }; > if (status=~"(180)|(183)|2[0-9][0-9]") { > xlog("status matches for $fu . We're currently in > onreply_route(1)"); > }; > if ((isbflagset(6) || isbflagset(7)) && > (status=~"(180)|(183)|2[0-9][0-9]")) { > > #Check the SDP payload length. Assume if we have something > we can call mediaproxy > if (!search("^Content-Length:[ ]*0")) { > log(1,"using media proxy in onreply_route(1)"); > use_media_proxy(); > }; > }; > > if (client_nat_test("1")) { > fix_nated_contact(); > }; ^^^^^ This route-block it's a complete mess .. > } > > > Any advice appreciated. I advice you that your confing should be rewritten, almost from scracht ... take a look at the doc examples, because you are doing things at wild west way .. -- Raúl Alexis Betancor Santana Dimensión Virtual _______________________________________________ Kamailio (OpenSER) - Users mailing list Users@lists.kamailio.org http://lists.kamailio.org/cgi-bin/mailman/listinfo/users http://lists.openser-project.org/cgi-bin/mailman/listinfo/users