return -1;
}
-/*! \brief Lock interface lock and find matching pvt lock
- - Their tag is fromtag, our tag is to-tag
- - This means that in some transactions, totag needs to be their tag :-)
- depending upon the direction
+/*! \brief Lock interface lock and find matching pvt lock
*/
static struct sip_pvt *get_sip_pvt_byid_locked(const char *callid, const char *totag, const char *fromtag)
{
for (sip_pvt_ptr = iflist; sip_pvt_ptr; sip_pvt_ptr = sip_pvt_ptr->next) {
if (!strcmp(sip_pvt_ptr->callid, callid)) {
int match = 1;
- char *ourtag = sip_pvt_ptr->tag;
/* Go ahead and lock it (and its owner) before returning */
ast_mutex_lock(&sip_pvt_ptr->lock);
(With a forking SIP proxy, several call legs share the
call id, but have different tags)
*/
- if (pedanticsipchecking && (strcmp(fromtag, sip_pvt_ptr->theirtag) || (!ast_strlen_zero(totag) && strcmp(totag, ourtag))))
- match = 0;
+ if (pedanticsipchecking) {
+ const char *pvt_fromtag, *pvt_totag;
+
+ if (ast_test_flag(&sip_pvt_ptr->flags[1], SIP_PAGE2_OUTGOING_CALL)) {
+ /* Outgoing call tags : from is "our", to is "their" */
+ pvt_fromtag = sip_pvt_ptr->tag ;
+ pvt_totag = sip_pvt_ptr->theirtag ;
+ } else {
+ /* Incoming call tags : from is "their", to is "our" */
+ pvt_fromtag = sip_pvt_ptr->theirtag ;
+ pvt_totag = sip_pvt_ptr->tag ;
+ }
+ if (ast_strlen_zero(fromtag) || strcmp(fromtag, pvt_fromtag) || (!ast_strlen_zero(totag) && strcmp(totag, pvt_totag)))
+ match = 0;
+ }
if (!match) {
ast_mutex_unlock(&sip_pvt_ptr->lock);
if (option_debug > 3 && totag)
ast_log(LOG_DEBUG, "Matched %s call - their tag is %s Our tag is %s\n",
- ast_test_flag(&sip_pvt_ptr->flags[0], SIP_OUTGOING) ? "OUTGOING": "INCOMING",
+ ast_test_flag(&sip_pvt_ptr->flags[1], SIP_PAGE2_OUTGOING_CALL) ? "OUTGOING": "INCOMING",
sip_pvt_ptr->theirtag, sip_pvt_ptr->tag);
/* deadlock avoidance... */