Hello,

I am using the sipXcallLibs and sipXtacklibs in sipXecs (through
sipXtapi) to implement a basic user agent. Everything is working fine
(making calls, receiving calls, register etc.), except, there seems to
be an issue with retransmissions of "ACK"s for duplicate "200 OK"
responses to an "INVITE", i.e.

             INVITE
sipxUA ----------------------> UA2
             200 OK
sipxUA <---------------------- UA2
              ACK
sipxUA ----------------------> UA2
             200 OK
sipxUA <---------------------- UA2
             200 OK
sipxUA <---------------------- UA2
             200 OK
sipxUA <---------------------- UA2


Has anyone else come across this? Is this a known issue?

Looking through the code:

On receiving a duplicate "200 OK", SipTransaction::handleChildIncoming
is called with the messageRelationship - MESSAGE_DUPLICATE, and the
response code is parsed correctly as a 200 OK. At this point, the method
checks the "mpAck" attribute of this SipTransaction object, to resend
the ACK. However, it is found to be NULL and I get this error/warning in
the logs - "SipTransaction::handleChildIncoming duplicate 2xx response
received on UAC for INVITE with no ACK". I can printf and see that the
other attributes - mpRequest, mpLastProvisionalResponse,
mpLastFinalResponse, are set up correctly. 

Going back and looking at where the original ACK was send from, I can
see that the SipTransactionList::findTransactionFor matches the outgoing
ACK message as "MESSAGE_2XX_ACK_PROXY". Manually, forcing this match to
"MESSAGE_2XX_ACK" sets up the "mpAck" correctly, hence solving the
retransmission issues.

** sipXtackLib/src/net/SipTransactionList.cpp **

   5135    if (mIsServerTransaction)
   5136    {
   5137        SET_RELATIONSHIP(MESSAGE_2XX_ACK);
   5138    }
   5139    else
   5140    {
   5141 #ifdef TEST_PRINT
   5142        OsSysLog::add(FAC_SIP, PRI_DEBUG,
                             "SipTransaction::whatRelation ACK PROXY is
REQUEST");
   5143 #endif
   5144        SET_RELATIONSHIP(MESSAGE_2XX_ACK_PROXY);
   5145    }

So, as far as I can tell, the "mIsServerTransaction" is being setup
incorrectly for some reason. What is the purpose of
"mIsServerTransaction"? When acting as a basic user agent setting up a
call, is it correct for the "mIsServerTransaction" to be false?


Or, maybe I am missing something fundamental here?


Thanks,

Arjun.

_______________________________________________
sipx-dev mailing list
[email protected]
List Archive: http://list.sipfoundry.org/archive/sipx-dev
Unsubscribe: http://list.sipfoundry.org/mailman/listinfo/sipx-dev

Reply via email to