< Previous by Date Date Index Next by Date >
  Thread Index Next in Thread >

[reSIProcate] PRACK issue


Hi,
We have been testing out the UAS PRACK implementation and have problems with queued provisionals.
An answer provided before the second provisional is not included in the body. This patch solves the issue for us.

Regards,
Björn A.

*** ServerInviteSession.cxx	2014-04-08 13:52:38.000000000 +0200
--- ServerInviteSession.cxx.orig	2014-04-08 13:50:19.000000000 +0200
*************** ServerInviteSession::prackCheckQueue()
*** 1368,1380 ****
     if(mQueuedResponses.size() > 0 && mQueuedResponses.front().first < 200)
     {
        InfoLog (<< "Sending queued provisional" );
!       if(sendProvisional(mQueuedResponses.front().first, mQueuedResponses.front().second))
!       {
!          if (mState == UAS_NoAnswerReliable)
!          {
!             transition(UAS_NoAnswerReliableWaitingPrack);
!          }
!       }
        mQueuedResponses.pop_front();
     }
     else if(mQueuedResponses.size() > 0 && mQueuedResponses.front().first < 300)
--- 1368,1374 ----
     if(mQueuedResponses.size() > 0 && mQueuedResponses.front().first < 200)
     {
        InfoLog (<< "Sending queued provisional" );
!       sendProvisional(mQueuedResponses.front().first, mQueuedResponses.front().second);
        mQueuedResponses.pop_front();
     }
     else if(mQueuedResponses.size() > 0 && mQueuedResponses.front().first < 300)
*************** ServerInviteSession::dispatchNoAnswerRel
*** 1597,1610 ****
                 mDialog.makeResponse(*p200, msg, 200);
                 send(p200);
  
!                if(mCurrentLocalOfferAnswer.get())
!                {
!                   transition(UAS_FirstSentAnswerReliable);
!                }
!                else
!                {
!                   transition(UAS_NoAnswerReliable);
!                }
                 handler->onPrack(getHandle(), msg);
                 prackCheckQueue();
              }
--- 1591,1597 ----
                 mDialog.makeResponse(*p200, msg, 200);
                 send(p200);
  
!                transition(UAS_NoAnswerReliable);
                 handler->onPrack(getHandle(), msg);
                 prackCheckQueue();
              }