hi,
i faced with strange behavior during processing of the 200 ACK with
wrong To-tag.
transaction layer matches such ACK with INVITE transaction only by
branch here:
core/sip/trans_layer.cpp:
<pre>
91 sip_trans* trans_bucket::match_request(sip_msg* msg, unsigned int ttype)
92 {
...
139 // match non-200 ACK first
140 if(compare_branch(*it,msg,branch,(unsigned int)len)) {
141 t = *it;
142 break;
143 }
...
</pre>
comment says that this code should match only non-200 ACK requests, but
branch-only matching makes code with full checks (match_200_ack)
unreachable.
this lines were added in commit
5910b550db43485a1b52b25e233f3badeaa023c6
which was intended to fix non-200 ACK matching in reply to responses
without To-tag.
also later function
bool AmEventDispatcher::post(const string& local_tag, AmEvent* ev)
[core/AmEventDispatcher.cpp:154]
can't find appropriate dialog using To-tag and upper layers never
receive event.
thus we have:
- possible wrong matching of the 200ACK request for UAS transaction.
(RFC says that 200ACK matching MUST include To-tag comparison)
- inconsistency between transaction layer and SIP dispatcher
(transaction removed but ACK request event not received by session.
can cause session hangup in the absence of external requests or rtp
timeout [because H timer will never fire])
please, take a look
--
Best Regards
Michael Furmur
_______________________________________________
Semsdev mailing list
[email protected]
http://lists.iptel.org/mailman/listinfo/semsdev