[reSIProcate] SipStack not sending the message to correct address

Byron Campen bcampen at estacado.net
Mon Mar 5 08:24:27 CST 2007


	You would need to reset the BranchParameter topmost Via of the request.
(msg.header(h_Vias).front().param(p_branch).reset(), see  
BranchParameter.hxx line 39)

Best regards,
Byron Campen

> Thanks for the quick reply.
>
> What is the correct solution?
> Should I change the transaction ID every time
> I resend the invite to another Server?
> Is there any good solution to generate new
> transaction ID?
>
>
> Best Regards,
> Janari Põld
>
> Byron Campen wrote:
>>     Simply changing the Request-Uri on the original request and  
>> resending is invalid. This is because both requests will have the  
>> same transaction id. It appears that there is a bug in  
>> TransactionState::processClientInvite() that will allow  
>> mMsgToRetransmit to be overridden by any request from the TU,  
>> regardless of what state the transaction is in (ie, sending a new  
>> INVITE with the same transaction-id is causing state-corruption in  
>> the stack). This is what is causing the assert, and this probably  
>> should be fixed to disallow override of mMsgToRetransmit.
>>
>> Best regards,
>> Byron Campen
>>
>>> Hey,
>>>
>>> I am writing a SIP proxy using resiprocate library.
>>> The proxy is running on 192.168.200.1 and
>>> two SIP servers on 192.168.200.2 and 192.168.200.3.
>>>
>>> Following is the scenario that I want.
>>>
>>>   Client         Proxy      Server1      Server2
>>>     |    INVITE    |           |            |
>>> 1.  |  ----------> |  INVITE   |            |
>>> 2.  |              |  -------> |            |
>>>     |              |    500    |            |
>>> 3.  |              |  <------- |            |
>>>     |              |    ACK    |            |
>>> 4.  |              |  -------> |            |
>>>     |              |           |  INVITE    |
>>> 5.  |              |  --------------------> |
>>>     |            ..........                 |
>>>
>>> Step 1
>>> Proxy receives invite from client, adds via and record-route
>>> header and changes the request-uri (sets the Server1 ip address
>>> in request-uri)
>>>
>>> Step 2
>>> Proxy sends the invite to Server 1, using method
>>> sendTo(SipMessage, Uri, TransactionUser) in SipStack.
>>>
>>> Step 3
>>> Server1 responds with 500
>>>
>>> Step 4
>>> Proxy (SipStack) sends automatically ACK to Server1.
>>>
>>> Step 5
>>> During step 1 Proxy saved the received invite into memory and
>>> now Proxy changes the request-uri (sets the Server2 ip address
>>> in request-uri). Now if the Proxy tries to send the message to  
>>> Server2
>>> using sentTo(SipMessage, Uri, TransactionUser) method, the SIP  
>>> message
>>> is actually sent to Server1.
>>>
>>> Why is the stack sending the message to server1??
>>>
>>>
>>> The Server1 responds again with 500 and after that the stack gets
>>> Assertion Failure and the ABORT signal is sent to the proxy  
>>> application
>>> and the app shuts down.
>>>
>>> I added code to TransactionState.cxx method
>>> processClientInvite(resip::TransactionMessage*) to print out
>>> the msg and mMsgToRetransmit messages. Here is a snippet from the  
>>> log.
>>>
>>> INFO | 20070302-175232.043 |  |  | RESIP:TRANSACTION | 0 |  
>>> 3057712048 |
>>> TransactionState.cxx:797 |
>>> --------------------------- msg BEG  
>>> ---------------------------------
>>> SipResp: 500 tid=4b941154408e538aae1822d1ee5fa4ed cseq=INVITE
>>> contact=192.168.200.2:5060 / 1 from(wire)
>>> --------------------------- msg END  
>>> ---------------------------------
>>> INFO | 20070302-175232.043 |  |  | RESIP:TRANSACTION | 0 |  
>>> 3057712048 |
>>> TransactionState.cxx:798 |
>>> --------------------------- mMsgToRetransmit BEG
>>> ---------------------------------
>>> SipReq:  INVITE service at 192.168.200.3:5060
>>> tid=4b941154408e538aae1822d1ee5fa4ed cseq=INVITE
>>> contact=sipp at 217.159.142.96:5061 / 1 from(tu)
>>> --------------------------- mMsgToRetransmit END
>>> ---------------------------------
>>> sbcd: TransactionState.cxx:799: void
>>> resip::TransactionState::processClientInvite 
>>> (resip::TransactionMessage*):
>>> Assertion `mMsgToRetransmit->method() == ACK' failed.
>>>
>>>
>>>
>>> To conclusion I have a list of servers (Server1 ... ServerN) and  
>>> the proxy
>>> should send the received invite to Server1 if the server returns  
>>> 500 the the
>>> proxy should send the same INVITE to Server2 and so on, until the  
>>> proxy gets
>>> a 200 from ServerX.
>>>
>>>
>>> Am I doing something wrong? Or how can I send the same message to  
>>> another
>>> ServerX if the Server1 responded with 500.
>>>
>>>
>>> Janari Põld
>>>
>>> _______________________________________________
>>> resiprocate-devel mailing list
>>> resiprocate-devel at list.resiprocate.org
>>> https://list.resiprocate.org/mailman/listinfo/resiprocate-devel
>>

-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 2423 bytes
Desc: not available
URL: <http://list.resiprocate.org/pipermail/resiprocate-devel/attachments/20070305/5bdcb667/attachment.bin>


More information about the resiprocate-devel mailing list