[SR-Users] RLS issue

"Andrés S. García Ruiz" asgarcia at um.es
Wed Dec 22 13:03:02 CET 2010



Thanks a lot for your response!

I've been thinking about it and there's something abnormal. Firs, the 
RLS is suppose to send the initial SUBSCRIBE to the S-CSCF instead of 
sending it to the I-CSCF. Then, I don't know why the S-CSCF translates 
the SUBSCRIBE URI (sip:testuser02 at open-ims.test) to 
"sip:testuser01 at 155.54.190.245:8060;rinstance=9b7761b4bcaa4bd0". All the 
routing is the default configuration of both cscfs and rls.

How can I change the routing of the RLS in order it to send the 
SUBSCRIBE messages to the S-CSCF?

Here's the configuration file:
/
route {

     # per request initial checks
     route(REQINIT);

     # NAT detection
     route(NAT);

     # handle requests within SIP dialogs
     route(WITHINDLG);

     ### only initial requests (no To tag)

     # CANCEL processing
     if (is_method("CANCEL"))
     {
         if (t_check_trans())
             t_relay();
         exit;
     }

     t_check_trans();

     # authentication
     route(AUTH);

     # record routing for dialog forming requests (in case they are routed)
     # - remove preloaded route headers
     remove_hf("Route");
     if (is_method("INVITE|SUBSCRIBE"))
         record_route();

     # account only INVITEs
     if (is_method("INVITE"))
     {
         setflag(FLT_ACC); # do accounting
     }

     # dispatch requests to foreign domains
     route(SIPOUT);

     ### requests for my local domains

     # handle presence related requests
     route(PRESENCE);

     # handle registrations
     route(REGISTRAR);

     if ($rU==$null)
     {
         # request with no Username in RURI
         sl_send_reply("484","Address Incomplete");
         exit;
     }

     # dispatch destinations to PSTN
     route(PSTN);

     # user location service
     route(LOCATION);

     route(RELAY);
}


route[RELAY] {
#!ifdef WITH_NAT
     if (check_route_param("nat=yes")) {
         setbflag(FLB_NATB);
     }
     if (isflagset(FLT_NATS) || isbflagset(FLB_NATB)) {
         route(RTPPROXY);
     }
#!endif

     /* example how to enable some additional event routes */
     if (is_method("INVITE")) {
         #t_on_branch("BRANCH_ONE");
         t_on_reply("REPLY_ONE");
         t_on_failure("FAIL_ONE");
     }

     if (!t_relay()) {
         sl_reply_error();
     }
     exit;
}

# Per SIP request initial checks
route[REQINIT] {
#!ifdef WITH_ANTIFLOOD
     if(src_ip!=myself)
     {
         if($sht(ipban=>$si)!=$null)
         {
             # ip is already blocked
             xdbg("request from blocked IP - $rm from $fu (IP:$si:$sp)\n");
             exit;
         }
         if (!pike_check_req())
         {
             xlog("L_ALERT","ALERT: pike blocking $rm from $fu 
(IP:$si:$sp)\n");
             $sht(ipban=>$si) = 1;
             exit;
         }
     }
#!endif

     if (!mf_process_maxfwd_header("10")) {
         sl_send_reply("483","Too Many Hops");
         exit;
     }

     if(!sanity_check("1511", "7"))
     {
         xlog("Malformed SIP message from $si:$sp\n");
         exit;
     }
}

# Handle requests within SIP dialogs
route[WITHINDLG] {
     if (has_totag()) {
         # sequential request withing a dialog should
         # take the path determined by record-routing
         if (loose_route()) {
             if (is_method("BYE")) {
                 setflag(FLT_ACC); # do accounting ...
                 setflag(FLT_ACCFAILED); # ... even if the transaction fails
             }
             route(RELAY);
         } else {
             if (is_method("SUBSCRIBE") && uri == myself) {
                 # in-dialog subscribe requests
                 route(PRESENCE);
                 exit;
             }
             if ( is_method("ACK") ) {
                 if ( t_check_trans() ) {
                     # no loose-route, but stateful ACK;
                     # must be an ACK after a 487
                     # or e.g. 404 from upstream server
                     t_relay();
                     exit;
                 } else {
                     # ACK without matching transaction ... ignore and 
discard
                     exit;
                 }
             }
             sl_send_reply("404","Not here");
         }
         exit;
     }
}

# Handle SIP registrations
route[REGISTRAR] {
     if (is_method("REGISTER"))
     {
         if(isflagset(FLT_NATS))
         {
             setbflag(FLB_NATB);
             # uncomment next line to do SIP NAT pinging
             ## setbflag(FLB_NATSIPPING);
         }
         if (!save("location"))
             sl_reply_error();

         exit;
     }
}

# USER location service
route[LOCATION] {

#!ifdef WITH_ALIASDB
     # search in DB-based aliases
     alias_db_lookup("dbaliases");
#!endif

     if (!lookup("location")) {
         switch ($rc) {
             case -1:
             case -3:
                 t_newtran();
                 t_reply("404", "Not Found");
                 exit;
             case -2:
                 sl_send_reply("405", "Method Not Allowed");
                 exit;
         }
     }

     # when routing via usrloc, log the missed calls also
     if (is_method("INVITE"))
     {
         setflag(FLT_ACCMISSED);
     }
}

# Presence server route
route[PRESENCE] {

     if(!is_method("PUBLISH|SUBSCRIBE"))
         return;

#!ifdef WITH_PRESENCE

     if (!t_newtran())
     {
         sl_reply_error();
         exit;
     };

     if(is_method("PUBLISH"))
     {
                 handle_publish();
                 t_release();
     }
     else if( is_method("SUBSCRIBE"))
     {
         $var(ret_code)= rls_handle_subscribe();

         if($var(ret_code)== 10) {
             handle_subscribe();
         }
         t_release();

     }else if(method=="NOTIFY")
     {
         rls_handle_notify();
     }

     exit;
#!endif
     # if presence enabled, this part will not be executed
     if (is_method("PUBLISH") || $rU==$null)
     {
         sl_send_reply("404", "Not here");
         exit;
     }
     return;
}

# Authentication route
route[AUTH] {
return;
#!ifdef WITH_AUTH
     if (is_method("REGISTER"))
     {
         # authenticate the REGISTER requests (uncomment to enable auth)
         if (!www_authorize("$td", "subscriber"))
         {
             www_challenge("$td", "0");
             exit;
         }

         if ($au!=$tU)
         {
             sl_send_reply("403","Forbidden auth ID");
             exit;
         }
     } else {

#!ifdef WITH_IPAUTH
         if(allow_source_address())
         {
             # source IP allowed
             return;
         }
#!endif
         # authenticate if from local subscriber
         if (from_uri==myself)
         {
             if (!proxy_authorize("$fd", "subscriber")) {
                 proxy_challenge("$fd", "0");
                 exit;
             }
             if (is_method("PUBLISH"))
             {
                 if ($au!=$tU) {
                     sl_send_reply("403","Forbidden auth ID");
                     exit;
                 }
             } else {
                 if ($au!=$fU) {
                     sl_send_reply("403","Forbidden auth ID");
                     exit;
                 }
             }

             consume_credentials();
             # caller authenticated
         } else {
             # caller is not local subscriber, then check if it calls
             # a local destination, otherwise deny, not an open relay here
             if (!uri==myself)
             {
                 sl_send_reply("403","Not relaying");
                 exit;
             }
         }
     }
#!endif
     return;
}

# Caller NAT detection route
route[NAT] {
#!ifdef WITH_NAT
     force_rport();
     if (nat_uac_test("19")) {
         if (method=="REGISTER") {
             fix_nated_register();
         } else {
             fix_nated_contact();
         }
         setflag(FLT_NATS);
     }
#!endif
     return;
}

# RTPProxy control
route[RTPPROXY] {
#!ifdef WITH_NAT
     if (is_method("BYE")) {
         unforce_rtp_proxy();
     } else if (is_method("INVITE")){
         force_rtp_proxy();
     }
     if (!has_totag()) add_rr_param(";nat=yes");
#!endif
     return;
}

# Routing to foreign domains
route[SIPOUT] {
     if (!uri==myself)
     {
         append_hf("P-hint: outbound\r\n");
         route(RELAY);
     }
}

# PSTN GW routing
route[PSTN] {
#!ifdef WITH_PSTN
     # check if PSTN GW IP is defined
     if (strempty($sel(cfg_get.pstn.gw_ip))) {
         xlog("SCRIPT: PSTN rotuing enabled but pstn.gw_ip not defined\n");
         return;
     }

     # route to PSTN dialed numbers starting with '+' or '00'
     #     (international format)
     # - update the condition to match your dialing rules for PSTN routing
     if(!($rU=~"^(\+|00)[1-9][0-9]{3,20}$"))
         return;

     # only local users allowed to call
     if(from_uri!=myself) {
         sl_send_reply("403", "Not Allowed");
         exit;
     }

     $ru = "sip:" + $rU + "@" + $sel(cfg_get.pstn.gw_ip);

     route(RELAY);
     exit;
#!endif

     return;
}

# XMLRPC routing
#!ifdef WITH_XMLRPC
route[XMLRPC]
{
     # allow XMLRPC from localhost
     if ((method=="POST" || method=="GET")
&& (src_ip==127.0.0.1)) {
         # close connection only for xmlrpclib user agents (there is a 
bug in
         # xmlrpclib: it waits for EOF before interpreting the response).
         if ($hdr(User-Agent) =~ "xmlrpclib")
             set_reply_close();
         set_reply_no_connect();
         dispatch_rpc();
         exit;
     }
     send_reply("403", "Forbidden");
     exit;
}
#!endif

# Sample branch router
branch_route[BRANCH_ONE] {
     xdbg("new branch at $ru\n");
}

# Sample onreply route
onreply_route[REPLY_ONE] {
     xdbg("incoming reply\n");
#!ifdef WITH_NAT
     if ((isflagset(FLT_NATS) || isbflagset(FLB_NATB))
&& status=~"(183)|(2[0-9][0-9])") {
         force_rtp_proxy();
     }
     if (isbflagset("6")) {
         fix_nated_contact();
     }
#!endif
}

# Sample failure route
failure_route[FAIL_ONE] {
#!ifdef WITH_NAT
     if (is_method("INVITE")
&& (isbflagset(FLB_NATB) || isflagset(FLT_NATS))) {
         unforce_rtp_proxy();
     }
#!endif

     if (t_is_canceled()) {
         exit;
     }
}
/

Regards,
   Andrés.



El 21/12/10 10:22, Klaus Darilion escribió:
> Am 16.12.2010 13:36, schrieb "Andrés S. García Ruiz":
>>
>> B.5) P-CSCF ---- SUBSCRIBE ----> Presentity???
>>
>> SUBSCRIBE sip:testuser01 at 155.54.190.245:8060;rinstance=9b7761b4bcaa4bd0
>> SIP/2.0
>> Record-Route: <sip:mt at pcscf.open-ims.test:4060;lr>
>> Record-Route: <sip:mt at scscf.open-ims.test:6060;lr>
>> Via: SIP/2.0/TCP 155.54.210.134:4060;branch=z9hG4bK07df.baa7cf24.0
>> Via: SIP/2.0/UDP
>> 155.54.210.135:6060;received=155.54.210.135;rport=6060;branch=z9hG4bK07df.8a35e4f3.0 
>>
>>
>> Via: SIP/2.0/UDP 155.54.210.136;branch=z9hG4bK07df.3688b985.0
>> Via: SIP/2.0/UDP 155.54.190.245;branch=z9hG4bK07df.964e0ba7.0
>> To: sip:testuser01 at open-ims.test
>> From:
>> sip:restricted_areas at open-ims.test;tag=533cb9e91f4b999cf76861cbb9ed54ed-32d5 
>>
>>
>> CSeq: 10 SUBSCRIBE
>> Call-ID: 7fd8dfdd-21694 at 127.0.0.1
>> Content-Length: 0
>> User-Agent: kamailio (3.2.0-dev1 (i386/linux))
>> Max-Forwards: 14
>> Event: presence
>> Contact: <sip:155.54.190.245:5060;transport=udp>
>> Expires: 10810
>> Max-Forwards: 70
>> Support: eventlist
>> P-Called-Party-ID: <sip:testuser01 at open-ims.test>
>>
>>
>> The step B.5 is sent directly to the presentity testuser01. Instead of
>> that, I thought that message was suppose to be sent to the presence
>> server in the URI that is shown in Contact header.
>
>
> If the P-CSCF is not forwarding the request as supposed, I guess you 
> have to fix the routing on the P-CSCF.
>
> klaus

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.sip-router.org/pipermail/sr-users/attachments/20101222/c096c81e/attachment-0001.htm>


More information about the sr-users mailing list