Hi Timo

No we don't have a solution, we looked into it and it needs major changes so we 
left it.

Regards 




________________________________
 From: Timo Bruhn <voip_v...@web.de>
To: nauman762-h...@yahoo.co.uk 
Cc: sofia-sip-devel@lists.sourceforge.net 
Sent: Wednesday, 14 March 2012, 11:04
Subject: Re: [Sofia-sip-devel] PRACK and 200 OK(INVITE) forking issue
 
Hi Nauman,

did you find a solution for the problem when forking is combined with PRACK?
Currently we are running into same problems with sofia-sip connecting to a 
server that uses forking.

Seems that disabling PRACK and soa engine works. But what if PRACK is required?

Thanks,
Timo


> Hi,
>
> Got a bit further with this, reason that the 200OK  ( to INVITE) is being 
> discarded is because of this code :
>
> static int nua_invite_client_preliminary(nua_client_request_t *cr,
>                      int status, char const *phrase,
>                      sip_t const *sip)
> {
>   nua_handle_t *nh = cr->cr_owner;
>   nua_dialog_usage_t *du = cr->cr_usage;
>   nua_session_usage_t *ss = nua_dialog_usage_private(du);
>
>   assert(sip);
>
>   if (ss && sip && sip->sip_rseq) {
>     /* Handle 100rel responses */
>     sip_rseq_t *rseq = sip->sip_rseq;
>
>     /* Establish early dialog - we should fork here */
>     if (!nua_dialog_is_established(nh->nh_ds)) {
>       nta_outgoing_t *tagged;
>
>       nua_dialog_uac_route(nh, nh->nh_ds, sip, 1, 1);
>       nua_dialog_store_peer_info(nh, nh->nh_ds, sip);
>
>      /* Tag the INVITE request */
>      tagged = nta_outgoing_tagged(cr->cr_orq,
>                    nua_client_orq_response, cr,
>                    sip->sip_to->a_tag, sip->sip_rseq);
>       if (tagged) {
>     nta_outgoing_destroy(cr->cr_orq), cr->cr_orq = tagged;
>       }
>       else {
>     cr->cr_graceful = 1;
>     ss->ss_reason = "SIP;cause=500;text=\"Cannot Create Early Dialog\"";
>       }
>     }
>
>
> When we get a 183 reliable response Sofia creates an early dialog and creates 
> a new tagged INVITE request
>
> if (tagged) {
>     nta_outgoing_destroy(cr->cr_orq)
>
> It looks like it marks the original request for destruction, the problem is 
> when a 200OK comes in with a different tag, it looks as if its matched 
> against the original transaction which is marked for > destruction and so is 
> discarded by the code I posted initially in outgoing_recv in nta.c
>
>
> We are handling all media (SDP) ourselves and have set PRACK to be one of the 
> methods our app handles. We are using the nua API.
>
> Can Pekka or someone say whether PRACK and forking is supported with the way  
> we are using the Stack. We've seen some posts saying there are various bugs.
>
> When PRACK is not used the first 200OK received is passed to the application 
> with cancel sent to the others. This is the behaviour we would like even when 
> PRACK is used. However it seems > that when the first 183 reliable is 
> received this results in subsequent 200OK from other forks to be discarded. 
> We just want the first 200OK final response to be passed to our application > 
> irrespective of which fork its from and are happy for CANCEL to be sent to 
> others.
>
> Any comments most appreciated.
> Thanks
>

___________________________________________________________
Ihr WEB.DE Postfach immer dabei: die kostenlose WEB.DE Mail App für iPhone und 
Android.
https://produkte.web.de/freemail_mobile_startseite/
------------------------------------------------------------------------------
This SF email is sponsosred by:
Try Windows Azure free for 90 days Click Here 
http://p.sf.net/sfu/sfd2d-msazure
_______________________________________________
Sofia-sip-devel mailing list
Sofia-sip-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/sofia-sip-devel

Reply via email to