> Hello,
>
> Thanks for the good detail on the SIP signalling portion of your
> issue. However I have a couple questions on other important parts of
> your setup:
> 1. Are you using a LocalParticipant in the original conversation
> between A and B? In the 2nd call between B and C?
> 2. After the call from B to C is placed - what is your conversation
> setup? Do you have both A and C in the same conversation? or are the
> two parties in separate Conversations? If separate - which
> conversation has the Local Participant, if any?
> 3. Are you using testUA to produce this scenario? If so - can you
> please send over the series of commands you are using.
> 4. Can you please provide a wireshark trace of this - it will help to
> be able to see the contents of the SDP bodies.
> 5. I'm assuming A, B and C are all using recon - is this correct?
>
> Thanks,
> Scott
>
> On Tue, Jan 26, 2010 at 8:01 AM, Yamato Kira <
coordinator.kira@xxxxxxxxx> wrote:
>> Hi,
>>
>> I am using resiprocate-1.6.
>>
>> I tried Transfer-Attended sequence with a sip proxy server(repro) and my
>> SIP-UA applications which using recon.
>>
>> A...B...C
>> |...|...|
>> |<=>|...| two party call between A and B.
>> |...|<=>| two party call between B and C.
>> :...:...:
>> |...|...| B execute recon::ConversationManager::rediretToParticipant(A,C)
>> |<R-|...| B send REFER(repleces) to A.
>> |-INV-->| A send INVITE(repleces) to C.
>> |<-200--| C respond 200OK(INVITE) to A.
>> :...:...:
>>
>> see also
>>
http://tools.ietf.org/html/rfc5359#section-2.5
>>
>>
>> I use the recon::ConversationManager::rediretToParticipant().
>> But my application using RECON acted two motions not intended.
>>
>>
>> === 1st problem ===
>> This may be not problem.
>>
>> - After receiving INVITE with Replaces header,
>> my applications which confirmed new session replaced sent re-INVITEs and
>> 491 responses each other.
>>
>> A...B...C
>> :...:...:
>> |...|...| B execute rediretToParticipant(A,C)
>> |<R-|...| B send REFER(repleces) to A.
>> |-INV-->| A send INVITE(repleces) to C.
>> |<-200--| C respond 200OK(INVITE) to A.
>> |-INV-->| A send re-INVITE to C.
>> |<-INV--| C send re-INVITE to A.
>> |-491-->| A respond 491 Request Pending to C.
>> |<-491--| C respond 491 Request Pending to A.
>> :...:...:
>>
>> These re-INVITEs caused by unhold() in
>> RemoteParticipant::stateTransition(Connected);
>> This unhold() is called because mPendingRequest.mType is Unhold.
>> mPendingRequest.mType is set according to the following timing.
>>
>> + receive INVITE(repleces)
>> .+ new RemoteParticipant is created. RemoteParticipant::mLocalHold is set
>> true by constructor.
>> .+ RemoteParticipant::onNewSession(Server)
>> ..+ participantToReplace->replaceWithParticipant(this);
>> ...+ Participant::copyConversationsToParticipant()
>> ....+ RemoteParticipant::addToConversation()
>> .....+ if(mLocalHold && !conversation->shouldHold())
>> .....+ unhold()
>> ......+ mPendingRequest.mType = Unhold;
>>
>> or
>>
>> + receive REFER(replaces)
>> .+ RemoteParticipant::onRefer()
>> ..+ new RemoteParticipant is created. RemoteParticipant::mLocalHold is set
>> true by constructor.
>> ..+ replaceWithParticipant(participant);
>> ...+ Participant::copyConversationsToParticipant()
>> ....+ RemoteParticipant::addToConversation()
>> .....+ if(mLocalHold && !conversation->shouldHold()) // mLocalHold is
>> true.
>> .....+ unhold()
>> ......+ mPendingRequest.mType = Unhold;
>>
>>
>> I have a try to insert tentative code into RemoteParticipant.cxx.
>>
>> --------
>> RemoteParticipant::onNewSession(ServerInviteSessionHandle...
>> {
>> :
>> + mLocalHold = false; // XXX to avoid unhold()
>> participantToReplace->replaceWithParticipant(this); // adjust
>> conversation mappings
>> :
>> }
>> --------
>>
>> --------
>> RemoteParticipant::onRefer(InviteSessionHandle...
>> {
>> :
>> + participant->mLocalHold = false; // XXX to avoid unhold()
>> replaceWithParticipant(participant); // adjust conversation
>> mappings - do this after buildSdpOffer, so that we have a bridge port
>> :
>> }
>> --------
>>
>> Then, the SIP sequence has changed as follows.
>>
>> A...B...C
>> :...:...:
>> |...|...| B execute rediretToParticipant(A,C)
>> |<R-|...| B send REFER(repleces) to A.
>> |-INV-->| A send INVITE(repleces) to C.
>> |<-200--| C respond 200OK(INVITE) to A.
>>
>>
>> But, I am suspecting that my tentative source code is impropriety.
>>
>>
>>
>> === 2nd problem ===
>>
>> - After receiving INVITE with Replaces header,
>> my applications established a new session between A and C, nevertheless
>> they became silent.
>>
>> A...B...C
>> :...:...:
>> |...|...| B execute rediretToParticipant(A,C)
>> |<R-|...| B send REFER(repleces) to A.
>> |-INV-->| A send INVITE(repleces) to C.
>> |<-200--| C respond 200OK(INVITE) to A.
>> |-INV-->| A send re-INVITE to C.
>> |<-INV--| C send re-INVITE to A.
>> |-491-->| A respond 491 Request Pending to C.
>> |<-491--| C respond 491 Request Pending to A.
>> :...:...:
>> |-RTP-->|
>> |-RTP-->| RTP packets flowed only to one direction.
>> |-RTP-->|
>> :...:...:
>>
>> Not only A but also C are silent.
>>
>>
>> I am thinking that RemoteParticipant::adjustRTPStreams() and
>> RemoteParticipant::replaceWithParticipant() may be correlating with this
>> problem.
>> But, I am puzzled.
>>
>> Following is a part of the log of adjustRTPStreams and RemoteParticipant
>> handles.
>> Could anyone help me?
>>
>>
>>
>> A...B...C
>> |...|...|
>> |<=>|...| two party call between A and B.
>> :...:...:
>> |...|-->| B send initial INVITE to C.
>>
>>
>> DEBUG and INFO Logs in C:
>> RemoteParticipant.cxx:71 | RemoteParticipant created (UAS or forked leg),
>> handle=14
>> RemoteParticipant.cxx:1786 | onNewSession(Server): handle=14
>> RemoteParticipant.cxx:1989 | onOffer: handle=14
>> :
>> Conversation.cxx:224 | Participant handle=14 added to conversation handle=5
>> (BridgePort=3)
>> BridgeMixer.cxx:37 | calculatingMixWeigthsForParticipant, handle=14,
>> bridgePort=3
>> RemoteParticipant.cxx:565 | RemoteParticipant::unhold request: handle=14
>> RemoteParticipant.cxx:1466 | adjustRTPStreams: handle=14, found media line
>> in local sdp, mediaType=2, transportType=3, numConnections=1, port=51010
>> RemoteParticipant.cxx:1698 | adjustRTPStreams: handle=14
>> RemoteParticipant.cxx:1746 | adjustRTPStreams: handle=14
>> RemoteParticipant.cxx:1756 | adjustRTPStreams: handle=14, receiving...
>>
>>
>> A...B...C
>> :...:...:
>> |...|<--| C respond 200OK(INVITE) to B
>>
>>
>> RemoteParticipant.cxx:1891 | onConnected: handle=14, SipResp: 200
>> RemoteParticipant.cxx:253 | RemoteParticipant::stateTransition of handle=14
>> to state=Connected
>>
>>
>> A...B...C
>> :...:...:
>> |...|...| B execute recon::ConversationManager::rediretToParticipant(A,C)
>> |<R-|...| B send REFER(repleces) to A.
>> |-INV-->| A send INVITE(repleces) to C.
>>
>> DEBUG and INFO Logs in C:
>> RemoteParticipant.cxx:71 | RemoteParticipant created (UAS or forked leg),
>> handle=16
>> RemoteParticipant.cxx:1786 | onNewSession(Server): handle=16
>> RemoteParticipant.cxx:1798 | onNewSession(Server): handle=16, to replace
>> handle=14
>> :
>> Conversation.cxx:224 | Participant handle=14 added to conversation handle=5
>> (BridgePort=-1)//////// bridgePort=-1 is correct value ??
>> BridgeMixer.cxx:37 | calculatingMixWeigthsForParticipant, handle=14,
>> bridgePort=-1 //////// bridgePort=-1 is correct value ??
>> RemoteParticipant.cxx:565 | RemoteParticipant::unhold request: handle=14
>> :
>> RemoteParticipant.cxx:253 | RemoteParticipant::stateTransition of handle=14
>> to state=Replacing
>> RemoteParticipant.cxx:1989 | onOffer: handle=14, SipReq:
>> :
>> RemoteParticipant.cxx:1466 | adjustRTPStreams: handle=14, found media line
>> in local sdp, mediaType=2, transportType=3, numConnections=1, port=51012
>> RemoteParticipant.cxx:1698 | adjustRTPStreams: handle=14
>> RemoteParticipant.cxx:1746 | adjustRTPStreams: handle=14
>> RemoteParticipant.cxx:1756 | adjustRTPStreams: handle=14, receiving...
>> RemoteParticipant.cxx:253 | RemoteParticipant::stateTransition of handle=14
>> to state=Connecting
>>
>>
>> A...B...C
>> :...:...:
>> |<-200--| C respond 200OK(INVITE) to A.
>>
>>
>> DEBUG and INFO Logs in C:
>> RemoteParticipant.cxx:1891 | onConnected: handle=14, SipResp: 200
>> RemoteParticipant.cxx:253 | RemoteParticipant::stateTransition of handle=14
>> to state=Connected
>> RemoteParticipant.cxx:565 | RemoteParticipant::unhold request: handle=14
>> RemoteParticipantDialogSet.cxx:601 | setProposedSdp: handle=14,
>> proposedSdp=v=0
>> RemoteParticipant.cxx:1466 | adjustRTPStreams: handle=14, found media line
>> in local sdp, mediaType=2, transportType=3, numConnections=1, port=51012
>> RemoteParticipant.cxx:1631 | adjustRTPStreams: handle=14, mediaDirection=3,
>> remoteIp=, remotePort=0
>> RemoteParticipant.cxx:1722 | adjustRTPStreams: handle=14, stop sending.
>> RemoteParticipant.cxx:1756 | adjustRTPStreams: handle=14, receiving...
>> RemoteParticipant.cxx:253 | RemoteParticipant::stateTransition of handle=14
>> to state=Unholding
>>
>> A...B...C
>> :...:...:
>> |-INV-->| A send re-INVITE to C.
>> |<-INV--| C send re-INVITE to A.
>> |-491-->| A respond 491 Request Pending to C.
>> |<-491--| C respond 491 Request Pending to A.
>> :...:...:
>> |-RTP-->|
>> |-RTP-->| RTP packets flowed only to one direction.
>> |-RTP-->|
>> :...:...:
>>
>> RemoteParticipant.cxx:1975 | onAnswer: handle=14, SipResp: 200
>> RemoteParticipant.cxx:1466 | adjustRTPStreams: handle=14, found media line
>> in local sdp, mediaType=2, transportType=3, numConnections=1, port=51012
>> RemoteParticipant.cxx:1698 | adjustRTPStreams: handle=14
>> RemoteParticipant.cxx:1756 | adjustRTPStreams: handle=14, receiving...
>> RemoteParticipant.cxx:253 | RemoteParticipant::stateTransition of handle=14
>> to state=Connected
>>
>>
>>
>> Regards,
>>
>> _______________________________________________
>> recon-devel mailing list
>>
recon-devel@xxxxxxxxxxxxxxx
>> List Archive:
http://list.resiprocate.org/archive/recon-devel/>>
>