summaryrefslogtreecommitdiff
path: root/pjsip
diff options
context:
space:
mode:
authorBenny Prijono <bennylp@teluu.com>2006-02-09 14:14:21 +0000
committerBenny Prijono <bennylp@teluu.com>2006-02-09 14:14:21 +0000
commit34f4ce979c4d04a00460988325dc3c28748f1834 (patch)
tree8de78f3b03af02eb1194965b425af8f10cd9d50b /pjsip
parenta1fd7f6ddafccef9cf47bb8c291749aaa835e7fa (diff)
Fixed ACK receipt not processed by invite session
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@170 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjsip')
-rw-r--r--pjsip/src/pjsip-ua/sip_inv.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/pjsip/src/pjsip-ua/sip_inv.c b/pjsip/src/pjsip-ua/sip_inv.c
index a655c86f..d551ee70 100644
--- a/pjsip/src/pjsip-ua/sip_inv.c
+++ b/pjsip/src/pjsip-ua/sip_inv.c
@@ -198,10 +198,19 @@ static pj_bool_t mod_inv_on_rx_request(pjsip_rx_data *rdata)
* move state to CONFIRMED.
*/
if (method->id == PJSIP_ACK_METHOD && inv &&
- inv->state == PJSIP_INV_STATE_CONFIRMED)
+ inv->state != PJSIP_INV_STATE_CONFIRMED)
{
pjsip_event event;
+ /* Terminate INVITE transaction, if it's still present. */
+ if (inv->invite_tsx &&
+ inv->invite_tsx->state <= PJSIP_TSX_STATE_COMPLETED)
+ {
+ pjsip_tsx_terminate(inv->invite_tsx,
+ inv->invite_tsx->status_code);
+ inv->invite_tsx = NULL;
+ }
+
PJSIP_EVENT_INIT_RX_MSG(event, rdata);
inv_set_state(inv, PJSIP_INV_STATE_CONFIRMED, &event);
}
@@ -1561,6 +1570,7 @@ static void inv_on_state_calling( pjsip_inv_session *inv, pjsip_event *e)
pj_assert(e->body.tsx_state.type == PJSIP_EVENT_RX_MSG);
inv_send_ack(inv, e->body.tsx_state.src.rdata);
+ inv_set_state(inv, PJSIP_INV_STATE_CONFIRMED, e);
} else {
@@ -1700,7 +1710,6 @@ static void inv_on_state_early( pjsip_inv_session *inv, pjsip_event *e)
pj_assert(e->body.tsx_state.type == PJSIP_EVENT_RX_MSG);
inv_send_ack(inv, e->body.tsx_state.src.rdata);
-
inv_set_state(inv, PJSIP_INV_STATE_CONFIRMED, e);
}