diff --git a/pjsip/include/pjsip/sip_dialog.h b/pjsip/include/pjsip/sip_dialog.h index da2ec95fb3..dd842677e3 100644 --- a/pjsip/include/pjsip/sip_dialog.h +++ b/pjsip/include/pjsip/sip_dialog.h @@ -160,6 +160,7 @@ struct pjsip_dialog pj_bool_t uac_has_2xx;/**< UAC has received 2xx response? */ pj_bool_t secure; /**< Use secure transport? */ pj_bool_t add_allow; /**< Add Allow header in requests? */ + pj_bool_t ack_sent; /**< ACK has been sent? */ pjsip_cid_hdr *call_id; /**< Call-ID header. */ pjsip_route_hdr route_set; /**< Route set. */ pj_bool_t route_set_frozen; /**< Route set has been set. */ diff --git a/pjsip/src/pjsip/sip_dialog.c b/pjsip/src/pjsip/sip_dialog.c index cda05fbb6e..4a5dd0d14b 100644 --- a/pjsip/src/pjsip/sip_dialog.c +++ b/pjsip/src/pjsip/sip_dialog.c @@ -1363,6 +1363,8 @@ PJ_DEF(pj_status_t) pjsip_dlg_send_request( pjsip_dialog *dlg, } } else { + dlg->ack_sent = PJ_TRUE; + /* Set transport selector */ pjsip_tx_data_set_transport(tdata, &dlg->tp_sel); @@ -2079,7 +2081,8 @@ void pjsip_dlg_on_rx_response( pjsip_dialog *dlg, pjsip_rx_data *rdata ) pj_status_t status; if (rdata->msg_info.cseq->method.id==PJSIP_INVITE_METHOD && - rdata->msg_info.msg->line.status.code/100 == 2) + rdata->msg_info.msg->line.status.code/100 == 2 && + !dlg->ack_sent) { pjsip_tx_data *ack; diff --git a/pjsip/src/pjsua-lib/pjsua_call.c b/pjsip/src/pjsua-lib/pjsua_call.c index 4915331696..5587da78e2 100644 --- a/pjsip/src/pjsua-lib/pjsua_call.c +++ b/pjsip/src/pjsua-lib/pjsua_call.c @@ -5106,7 +5106,7 @@ pjsip_dialog* on_dlg_forked(pjsip_dialog *dlg, pjsip_rx_data *res) res->msg_info.msg->line.status.code/100 == 2) { pjsip_dialog *forked_dlg; - pjsip_tx_data *bye; + pjsip_tx_data *bye, *ack; pj_status_t status; /* Create forked dialog */ @@ -5116,6 +5116,12 @@ pjsip_dialog* on_dlg_forked(pjsip_dialog *dlg, pjsip_rx_data *res) pjsip_dlg_inc_lock(forked_dlg); + /* Respond with ACK first */ + status = pjsip_dlg_create_request(forked_dlg, &pjsip_ack_method, + res->msg_info.cseq->cseq, &ack); + if (status == PJ_SUCCESS) + pjsip_dlg_send_request(forked_dlg, ack, -1, NULL); + /* Disconnect the call */ status = pjsip_dlg_create_request(forked_dlg, pjsip_get_bye_method(), -1, &bye); diff --git a/tests/pjsua/scripts-sipp/uas-forked-200.xml b/tests/pjsua/scripts-sipp/uas-forked-200.xml index 2b7a1cb567..ef1da50e78 100644 --- a/tests/pjsua/scripts-sipp/uas-forked-200.xml +++ b/tests/pjsua/scripts-sipp/uas-forked-200.xml @@ -97,6 +97,9 @@ ]]> + + + @@ -115,11 +118,6 @@ - - - - -