[pjsip] STUN & local call

logan logan04x at gmail.com
Sat Nov 10 09:43:05 EST 2007


Hello,

I wanted to have two accounts registered with PJSIP, one was local and other 
on the public internet. Thus, I needed STUN and ICE. However, with enabling 
them, my local account would register with the STUN mapped IP and when 
someone on the same local network tried calling me up then the INVITE never 
reached me as it was send on the global IP.

Following are some code snippet with the comments explaining the intent:

//We would need this to modify the pjsua_var structure
#include "pjsua-internal.h"
...
//Set the STUN server
cfg.stun_host = pj_str ("stun.fwdnet.net);
//Enable ICE and other stuff
...
pjsua_init (&cfg, &log_cfg, &media_cfg);

//We create two transports now, one will be used with the local account and 
other
//with the STUN and ICE enabled

pjsua_transport_config local_transport_cfg; //For local account
pjsua_transport_config default_transport_cfg; //For the one on public 
Internet

pjsua_transport_config_default (&local_transport_cfg);
pjsua_transport_config_default (&default_transport_cfg);

//Set up RTP transport, ports, etc

//Create the default transport
pjsua_transport_create (PJSIP_TRANSPORT_UDP,
   &default_transport_cfg,
   &default_transport_id);

//Uptil now we didn't do anything special

//Force the STUN address to be NULL so that it creates a transport without 
using STUN
pjsua_var.ua_cfg.stun_host = pj_str ("");
//Set STUN status to be unknown
pjsua_var.stun_status = PJ_EUNKNOWN;

//Create transport to be used with local account
ret = pjsua_transport_create (PJSIP_TRANSPORT_UDP,
         &local_transport_cfg,
         &local_transport_id);

//We created the transport for local account but we need STUN as well so
//we set them back

//Set back the STUN server
pjsua_var.ua_cfg.stun_host = pj_str ("stun.fwdnet.net");
//Set STUN status to be unknown
pjsua_var.stun_status = PJ_EUNKNOWN;

//Once again resolve the STUN server address
pjsua_resolve_stun_server (PJ_FALSE);

//And while adding accounts I force the account to use
//local or default transport with pjsua_acc_config::transport_id

//In pjsua_resolve_stun_server I added the following *hack*
//Line no: 849

/* Otherwise disable STUN. */

else {

pjsua_var.stun_srv.addr.sa_family = 0;
     //Added by logan
pjsua_var.stun_status = PJ_SUCCESS;

}

That's all and it serves me just fine. Benny, are there any caveats with 
this approach?

In your case, what I guess you can do is, create a local transport and when 
you know that the calling party is on the same network then make your 
account use the local transport through:

pjsua_var.acc[acc_id].cfg.transport_id = local_transport_id;

I have not tried it, but it might work because pjsua_make_call checks for 
the transport ID to use before sending any messages. I hope it helps.

Thanks.

Best Regards,
Hitesh


----- Original Message ----- 
From: "Michael Bradley Jr" <mbradley.jr at gmail.com>
To: "pjsip embedded/DSP SIP discussion" <pjsip at lists.pjsip.org>
Sent: Friday, November 09, 2007 7:50 PM
Subject: Re: [pjsip] STUN & local call


> Hi Logan,
>
> yes the purpose is a B2B call.
> Can you provide the asked hint ;)
> Cheers
> Mike
>
> logan wrote:
>> Hi,
>>
>> Your case is not clear to me, are you trying to make B2B SIP calls? Or
>> your proxy is local but with STUN being enabled you are having
>> problems?
>>
>> Thanks.
>>
>> Best Regards,
>> Hitesh
>>
>> On Nov 4, 2007 5:24 PM, Benny Prijono <bennylp at pjsip.org> wrote:
>>> Michael Bradley Jr wrote:
>>>> Hi,
>>>>
>>>> when STUN is enable, i can't make a successful call to an UA in the 
>>>> same Network
>>>> segment.
>>>>
>>>> Here is call flow
>>>>
>>>> UA1: pjsua 0.7.0
>>>> localIP: 192.168.0.23 publicIP: 88.xx.xx.xx
>>>>
>>>> UA2: Grandstream IP-Phone
>>>> localIP: 192.168.0.32 publicIP: 88.xx.xx.xx
>>>>
>>>>
>>>> UA1 ---> UA2 (192.168.0.23 >> 192.168.0.32)
>>>> INVITE sip:xvc at 192.168.0.32 SIP/2.0
>>>> sdp: c:88.xx.xx.xx
>>>>
>>>> UA2 --> UA1 (192.168.0.32 --> 88.xx.xx.xx)
>>>> 200/2.0/UDP 88.xx.xx.xx:5060
>>>> sdp: c: 192.168.0.32
>>>>
>>>>
>>>> UA1 never get the 200 since it's send to the public Address...
>>>>
>>>> So my question:
>>>> how can i set the IP of the destination of the RTP stream in my initial
>>>> INVITE using pjsua-lib since i can figure out that both UA are behind 
>>>> the same NAT?
>>> Currently you can't. When STUN is used, the public IP will always be
>>> used in the SDP, regardless of where the destination UA is located.
>>> But if only the other UA (UA2) is also pjsua, then there shouldn't
>>> be any problem with media communication since pjsua will switch the
>>> destination RTP/RTCP address to the source address of the packet.
>>>
>>> And when you use pjsua to pjsua, you can enable ICE as well. With
>>> ICE enabled, it will automatically select which media address to use
>>> based on ICE negotiation.
>>>
>>> cheers,
>>>  -benny
>>>
>>>
>>>
>>>> Thanks,
>>>> Michael
>>>
>>>
>>> _______________________________________________
>>> Visit our blog: http://blog.pjsip.org
>>>
>>> pjsip mailing list
>>> pjsip at lists.pjsip.org
>>> http://lists.pjsip.org/mailman/listinfo/pjsip_lists.pjsip.org
>>>
>>
>> _______________________________________________
>> Visit our blog: http://blog.pjsip.org
>>
>> pjsip mailing list
>> pjsip at lists.pjsip.org
>> http://lists.pjsip.org/mailman/listinfo/pjsip_lists.pjsip.org
>>
>
> _______________________________________________
> Visit our blog: http://blog.pjsip.org
>
> pjsip mailing list
> pjsip at lists.pjsip.org
> http://lists.pjsip.org/mailman/listinfo/pjsip_lists.pjsip.org 





More information about the pjsip mailing list