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 @@
-
-
-
-
-