[Kamailio-Users] 513 Message too big

Klaus Darilion klaus.mailinglists at pernau.at
Thu Apr 9 19:11:56 CEST 2009


Joao Gomes Pereira wrote:
> Hello
> Here is the most important part of my configuration.
> What could be creating the loops? My t_relay is in the ENUM lookup... 

Before analyzing the config we have to find out if there is really a 
loop. Have you verified with ngrep that the proxy loops the message to 
itself?

> but It should work this way.
> Do I need t_relay in route[2] after forwarding to the PSTN gateway?

yes.

regards
klaus

PS: often seen errors:
- missing "exit" causes the message is t_relayed twice
- uri == myself fails: proxy does not detect that the RURI domain is itself

> Thanks
> Joao Pereira
> 
> 
> route{
> 
>         if (!mf_process_maxfwd_header("10")) {
>                 sl_send_reply("483","Too Many Hops");
>                 exit;
>         };
> 
>         if (msg:len >=  2048 ) {
>                 sl_send_reply("513", "Message too big");
>                 exit;
>         };
> 
> 
> 
> 
>         # --------------------------------------------------
>         # PRESENCE Section
>         # --------------------------------------------------
>         if (has_totag()) {
>                 log(3, "LOG - has_totag \n");
>        
>                 # sequential request withing a dialog should
>                 # take the path determined by record-routing
>                 if (loose_route()) {
>                     
>                         if (is_method("BYE")) {
>                                 setflag(1); # do accounting ...
>                                 setflag(3); # ... even if the 
> transaction fails
>                         }
>                         route(1);
>                 } else {
>                         if (is_method("SUBSCRIBE") && uri == myself) {
>                      
>                         # in-dialog subscribe requests
>                                 route(6);
>                                 exit;
>                         }
>                         if ( is_method("ACK") ) {
>                                 if ( t_check_trans() ) {
>                                         # non loose-route, but stateful 
> ACK; must be an A
>                                         t_relay();
>                                         exit;
>                                 } else {
>                                         # ACK without matching 
> transaction ... ignore and
>                                         exit;
>                                 }
>                         }
>                         sl_send_reply("404","Not here");
>                 }
>                 exit;
>         }
> 
> 
> 
>        if( is_method("PUBLISH|SUBSCRIBE"))
>                        route(6);
> 
>      
>         if (!method=="REGISTER")
>                 record_route();
> 
>      
>         if (loose_route()) {
>                 # mark routing logic in request
>                 append_hf("P-hint: rr-enforced\r\n");
>                 route(1);
>         };
> 
> 
> 
>         # --------------------------------------------------
>         # OPTIONS Section
>         # --------------------------------------------------
>         if (method=="OPTIONS") {
>                 options_reply();
>                 return;
>         };
> 
> 
> 
> 
>         if (!uri==myself) {
>                 append_hf("P-hint: outbound\r\n");
>                 route(1);
>         };
> 
> 
> 
>         # --------------------------------------------------
>         # Users Registration
>         # --------------------------------------------------
> 
>         # if the request is for other domain use UsrLoc
>         # (in case, it does not work, use the following command
>         # with proper names and addresses in it)
>         if (uri==myself) {
> 
>                 if (method=="REGISTER") {
> 
>                         # Uncomment this if you want to use digest 
> authentication
>                         if (!www_authorize("mydomain.pt", "subscriber")) {
>                                 www_challenge("mydomain.pt", "0");
>                                 exit;
>                         };
> 
>                         save("location");
>                         exit;
>                 };
> 
> 
>    
>  
>         # --------------------------------------------------
>         # Call Routing Section
>         # --------------------------------------------------  
> 
>         if (!lookup("location")) {
> 
>         if (is_method("INVITE")) {
>            log(3, "LOG: CALL ROUTING - method = invite\n");
> 
>         # ENUM
>         if ( method=="INVITE" &&  uri=~"sip:\+[1-9][0-9]*@mydomain.pt") {
> 
>                 if(!enum_query("e164.org.")) {
>                         log(1, "LOG: ENUM: failed!!! :( \n");
>                 }else{
>                         log(1, "LOG: ENUM: query exists!!! :) \n");
> 
>                         if (!method=="REGISTER") record_route();
>                         t_relay();
>                         return;
>                 }
> 
>           }
> 
> 
>         # Route E.164 numbers to PSTN Gateway
>         if (uri=~"sip:\+[1-9][0-9]*@mydomain.pt" ) {
> 
>                 if (isflagset(29)){
>                 # gateway 1
>                route(2);
>                 return; 
>                 } else{ 
>                 #gateway 2
>                 route(3);
>                 return;  
>                 }
> 
>         }
> 
> 
> 
>        }
>     }
> 
>         route(1);
> }
> 
> route[1] {
> xlog("LOG: route 1 $ru/$du\n");
> 
>         if (check_route_param("nat=yes")) {
>                 setbflag(6);
>         }
>         if (isflagset(5) || isbflagset(6)) {
>                 route(5);
>         }
> 
>         t_on_reply("1");
> 
>         # send it out now; use stateful forwarding as it works reliably
>         # even for UDP2TCP
>         if (!t_relay()) {
>                 sl_reply_error();
>         };
>         exit;
> 
> }
> 
> 
>  
> # PSTN Gateway
> route[2]
> {
> log(3, "LOG: route 2 \n");
> 
>         if (check_route_param("nat=yes")) {
>                 setbflag(6);
>         }
>         if (isflagset(5) || isbflagset(6)) {
>                 route(5);
>         }
> 
>         t_on_reply("1");
> 
>         # forward to PSTN gateway
>          rewritehostport("gateway_IP:5060");
> 
>         if (!t_relay()) {
>                 sl_reply_error();
>         };
> }
>  
> 
> 
> 
> # Caller NAT detection route
> route[4]{
> log(3, "LOG: route 4 \n");
>         force_rport();
>         if (nat_uac_test("19")) {
>                 if (method=="REGISTER") {
>                         fix_nated_register();
>                 } else {
>                         fix_nated_contact();
>                 }
>                 setflag(5);
>         }
> 
>         return;
> }
>  
> # RTPProxy control
> route[5] {
> 
> 
>         if (is_method("BYE")) {
>                 unforce_rtp_proxy();
>         } else if (is_method("INVITE")){
>                 force_rtp_proxy();
>         }
>         if (!has_totag()) add_rr_param(";nat=yes");
> 
>         return;
> }
>  
>  
>  
> 
> 
> 
> 
> onreply_route[1] {
>         xdbg("incoming reply\n"); 
> 
>         if ((isflagset(5) || isbflagset(6)) && 
> status=~"(183)|(2[0-9][0-9])") {
>                 force_rtp_proxy();
>         }
>         if (isbflagset(6)) {
>                 fix_nated_contact();
>         }
> 
> 
> }
> 
> 
> 
> failure_route[1] {
> 
>         if (is_method("INVITE")
>                         && (isbflagset(6) || isflagset(5))) {
>                 unforce_rtp_proxy();
>         }
> 
>         if (t_was_cancelled()) {
>                 exit;
>         }
>  
> }
> 
> 
> 
> 
> 
> 
> 
> 
> 
> 
> Iñaki Baz Castillo wrote:
>> 2009/4/9 Joao Gomes Pereira <gomespereira at startel.pt>:
>>   
>>> Hello
>>> I did ngrep -d lo port 5060
>>>
>>> And there are loops, because the message "513 Message too big " appears lots
>>> of times, and always from my IP to my IP
>>>
>>> What parts of the configuration could be creating these loops?
>>>     
>> Obviously we don't know your configuration.
>> But tipically, a loop occurs when Kamailio does t_relay() and the
>> request leaves the proxy with the RURI unchanged (so pointed to
>> itself).
>>
>> You must inspect the ngrep capture and determine why the request is
>> looped. A very basic example of looping:
>>
>> route {
>>    t_relay();
>> }
>>
>>   
> 
> 





More information about the sr-users mailing list