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

RE: [reSIProcate] Duplicate transaction id's in sequential NICT (INF0Requests)


I’ll assume from API signatures that you are using, that you are not using the head SVN revision.  The InviteSession::makeInfo method was deprecated sometime ago and replace by the InviteSession::info method. 

 

There have been problems in older releases of the stack surrounding TID generation on Windows platforms.  These revolve around the fact that you must seed the random number generator in each thread that generates random numbers.  TIDs are generated from the send() call, so if you are calling send from multiple threads, then this could be a problem.  Note:  This has been addressed in the SVN head, by ensuring each thread in windows is seeded correctly.

 

Hope this helps.

 

Scott

 


From: resiprocate-devel-bounces@xxxxxxxxxxxxxxxxxxx [mailto:resiprocate-devel-bounces@xxxxxxxxxxxxxxxxxxx] On Behalf Of Keohane, Stephen
Sent: Thursday, September 15, 2005 7:25 PM
To: resiprocate-devel@xxxxxxxxxxxxxxxxxxx
Subject: [reSIProcate] Duplicate transaction id's in sequential NICT (INF0Requests)

 

Hello,

 

I'm stuck on a problem using DUM to send sequential INFO response/requests after I have established a call.

 

I'm seeing a transaction Id reused in requests which causes the response not to be sent up to the application layer.

 

Essentially, I have multiple threads that request a singleton object (SipH) to create and send Info messages to a UAS. When I receive a response from the INFO, I process it from another thread which has the dum->process(fdset);

 

The method which has the dum->process() is mutexed with the methods that create requests.

 

Here is the code snippet which creates the requests:

 

 

try

{

  std::auto_ptr<resip::Contents> contents(new resip::PlainContents(message.c_str()));

 

  resip::SipMessage& infoMessage = pep->inviteSession()->makeInfo(contents);

 

  TRACE("SipH::sendInfo() -- ", infoMessage.brief().c_str());

 

  pep->inviteSession()->send(infoMessage);

 

}

catch(resip::BaseException& be) {}

 

 

Each call object (pep) keeps its own inviteSession. In my scenario I am only running one call. The requests are a couple of seconds apart - the UAS responds almost immediately.

My log format is seconds:thread:Class:method() – message and I am using SIpMessage::brief() here.

 

Here is the pertinent info from my log:

 

 

1126822932:2528:SipH::sendInfo() --  SipReq:  INFO admin@xxxxxxxxxx:5060 tid=eb01e926a62eb30b cseq=INFO contact=administrator / 2 from(tu)

 

1126822932:3876:SipInviteSessionHandler::onInfoSuccess() --  SipResp: 200 tid=3c15db120c39877e cseq=INFO / 2 from(wire)

 

1126822935:2856:SipH::sendInfo() --  SipReq:  INFO admin@xxxxxxxxxx:5060 tid=234829008467be18 cseq=INFO contact=administrator / 3 from(tu)

 

1126822935:3876:SipInviteSessionHandler::onInfoSuccess() --  SipResp: 200 tid=6c3de14aae72d62c cseq=INFO / 3 from(wire)

 

1126822937:3684:SipH::sendInfo() --  SipReq:  INFO admin@xxxxxxxxxx:5060 tid=234829008467be18 cseq=INFO contact=administrator / 4 from(tu)

 

The reSIProcate logs look fine - they essentially tell the same story. The duplicate tid shows up first from Dialog::makeRequest and it is not clear to me how it obtains a transaction id.

 

I've created a test program based on basicCall and it processes requests/responses without incident. The onAnswer sends a infoMessage and the onInfoSuccess sends infoMessages. It might be a rather brutal test but it works. Here is the OnAnswer and OnInfoSuccess:

 

virtual void onAnswer(InviteSessionHandle is, const SipMessage& msg, const SdpContents*sdp)

{

  cout << name << ": InviteSession-onAnswer(SDP)" << endl;

 

  std::string myMsg("Message One");

  std::auto_ptr<resip::Contents> contents(new resip::PlainContents(myMsg.c_str()));

  resip::SipMessage& infoMessage = is->makeInfo(contents);

 

  is->send(infoMessage);

}

 

virtual void onInfoSuccess(InviteSessionHandle is, const SipMessage& msg)

{

  cout << name << ": InviteSession-onInfoSuccess - " << msg.brief() << endl;

 

  std::string myMsg("Message Two");

  std::auto_ptr<resip::Contents> contents(new resip::PlainContents(myMsg.c_str()));

  resip::SipMessage& infoMessage = is->makeInfo(contents);

  is->send(infoMessage);

}

 

 

Am I doing something stupid? It wouldn't be the first time. Any help or advice would be greatly appreciated.

 

Thanks,

 

Stephen Keohane