Hi Stefano,

I suppose that you have the nat traversal handled also on opensips, 
right? ( since the host part of the clients registration in asterisk 
points to opensips). Then in this case it is normal that the flow of the 
invite is the following:
sip client -> opensips -> asterisk -> opensips (again)
So you must take care when the Invite arrives the second time at 
opensips not to send it again to asterisk. For this do a filter after 
the source ip and port, so you should have:

if (is_method("INVITE")) {
        if (!ds_is_in_list("$si", "$sp")) ) /* if it's not from asterisk */
                if (!ds_select_dst("1", "5")) {
            ....
                
        } else
                route(1); /* send it out */


Regards,

-- 
Anca Vamanu
www.voice-system.ro



On 09/27/2010 12:01 PM, Stefano Sasso wrote:
> Hello,
>    I started testing OpenSIPS with my asterisk cluster.
> For this testing configuration I'm using only one asterisk server of
> the pool. (the registration is done on asterisk server)
>
> The OpenSIPS configuration routing part is:
>
> route{
>
>       if (!mf_process_maxfwd_header("10")) {
>               sl_send_reply("483","Too Many Hops");
>               exit;
>       }
>
>       xlog("SIP route info: [$fu/$tu/$ru/$ci]");
>       xlog("SIP method: $rm");
>
>       if (!has_totag()) {
>               # initial request
>               record_route();
>       }
>       else {
>               # sequential request - obey the indicated route
>               loose_route();
>               t_relay();
>               exit;
>       }
>
>       # CANCEL processing
>       if (is_method("CANCEL"))
>       {
>               if (t_check_trans())
>                       t_relay();
>               exit;
>       }
>
>       if (is_method("OPTIONS")) {
>               t_relay();
>               xlog("OPTIONS for: [$fu/$tu/$ru/$ci]");
>               exit;
>       }
>
>       # from now on we have only the initial request
>       # select the node that'll handle the call
>       # different method is used for INVITE/REGISTER requests
>       # unknown methods are rejected here
>
>       xlog("First route:
> [USER:$au/CALL-ID:$ci/FROM-TAG:$ft/FROM-URI:$fu/FROM-URI-USER:$fU/METHOD:$rm]");
>
>       if (is_method("INVITE")) {
>               if (!ds_select_dst("1", "5")) {
>                       xlog("Service unavailable for ds_select_dst[INVITE]");
>                       send_reply("503","Service Unavailable");
>                       exit;
>               }
>       }
>       else if (is_method("REGISTER")) {
>               if (!ds_select_dst("1", "5")) {
>                       xlog("Service unavailable for ds_select_dst[REGISTER]");
>                       send_reply("503","Service Unavailable");
>                       exit;
>               }
>       }
>       else {
>               send_reply("405","Method Not Allowed");
>               exit;
>       }
>
>       # route the request
>       if (!t_relay()) {
>               sl_reply_error();
>       }
> }
>
>
> the dispatcher.list is simple:
> 1 sip:192.168.6.131:5060
>
>
> the registration part, on asterisk seems OK (I think), but for every
> SIP phone in 'sip show peers' I saw only the openSIPS IP address:
> Name/username              Host            Dyn Nat ACL Port     Status
> 2001/2001                  192.168.6.130    D   N      5060     OK (1342 ms)
> 2002/2002                  192.168.6.130    D   N      5060     OK (1403 ms)
>
> My asterisk dialplan is simple:
> exten =>  101,1,Answer()
> exten =>  101,n,Playback(demo-congrats)
> exten =>  101,n,Hangup()
>
> exten =>  _XXXX,2,NoOp(internal context called on Server A to ${EXTEN},
> CALLERID_num ${CALLERID(num)}, CALLERID_num_f2 ${CALLERID(num):0:2})
> exten =>  _XXXX,3,Dial(SIP/${EXTEN},15)
>
>
> when, from phone 2001 or 2002 I place a call to 101 everything works
> fine, but when I call 2001 from 2002 (and vice-versa) I can't place
> the call, and in asterisk log I found:
>
>      -- Executing [2...@internal:1] NoOp("SIP/2001-0000000f", "2002")
> in new stack
>      -- Executing [2...@internal:2] NoOp("SIP/2001-0000000f", "internal
> context called on Server A to 2002, CALLERID_num 2001, CALLERID_num_f2
> 20") in new stack
>      -- Executing [2...@internal:3] Dial("SIP/2001-0000000f",
> "SIP/2002,15") in new stack
>    == Using SIP RTP CoS mark 5
>      -- Called 2002
>      -- Got SIP response 482 "Loop Detected" back from 192.168.6.130
>      -- Now forwarding SIP/2001-0000000f to 'Local/2...@internal'
> (thanks to SIP/2002-00000010)
>      -- Executing [2...@internal:1] NoOp("Local/2...@internal-187c;2",
> "2002") in new stack
>      -- Executing [2...@internal:2] NoOp("Local/2...@internal-187c;2",
> "internal context called on Server A to 2002, CALLERID_num 2001,
> CALLERID_num_f2 20") in new stack
>      -- Executing [2...@internal:3] Dial("Local/2...@internal-187c;2",
> "SIP/2002,15") in new stack
>    == Spawn extension (internal, 2002, 3) exited non-zero on
> 'Local/2...@internal-187c;2'
>    == Everyone is busy/congested at this time (1:0/0/1)
>      -- Executing [2...@internal:4] Hangup("SIP/2001-0000000f", "") in new 
> stack
>    == Spawn extension (internal, 2002, 4) exited non-zero on 
> 'SIP/2001-0000000f'
>
> Could you please give me some hints on where I am wrong?
> registering directly on asterisk box, bypassing OpenSIPS, the call
> works correctly.
>
> thanks so much
>    

_______________________________________________
Users mailing list
[email protected]
http://lists.opensips.org/cgi-bin/mailman/listinfo/users

Reply via email to