From ce3e2d701732ae6fd1bb18b55725f6671c25db72 Mon Sep 17 00:00:00 2001 From: MelwareDE Date: Mon, 1 Oct 2007 16:10:37 +0000 Subject: [PATCH] Wait for ECT indication before returning to asterisk. --- chan_capi.c | 23 +++++++++++++++++++++-- chan_capi.h | 1 + 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/chan_capi.c b/chan_capi.c index f8ba967..5f9d45b 100644 --- a/chan_capi.c +++ b/chan_capi.c @@ -1674,7 +1674,7 @@ static int pbx_capi_bridge_transfer( /* start the ECT */ cc_disconnect_b3(i0, 1); - cc_mutex_lock(&i1->lock); + cc_mutex_lock(&i0->lock); /* ECT */ capi_sendf(i0, 1, CAPI_FACILITY_REQ, i0->PLCI, get_capi_MessageNumber(), @@ -1688,7 +1688,16 @@ static int pbx_capi_bridge_transfer( i1->isdnstate |= CAPI_ISDN_STATE_ECT; i0->isdnstate |= CAPI_ISDN_STATE_ECT; - cc_mutex_unlock(&i1->lock); + i0->waitevent = CAPI_WAITEVENT_ECT_IND; + abstime.tv_sec = time(NULL) + 2; + abstime.tv_nsec = 0; + if (ast_cond_timedwait(&i0->event_trigger, &i0->lock, &abstime) != 0) { + cc_log(LOG_WARNING, "%s: timed out waiting for ECT.\n", i0->vname); + } else { + cc_verbose(4, 1, "%s: cond signal received for ECT.\n", i0->vname); + } + + cc_mutex_unlock(&i0->lock); cc_verbose(2, 1, VERBOSE_PREFIX_4 "%s: sent ECT for PLCI=%#x to PLCI=%#x\n", i1->vname, i1->PLCI, i0->PLCI); @@ -3798,6 +3807,16 @@ static void capidev_post_handling(struct capi_pvt *i, _cmsg *CMSG) i->vname); return; } + if ((i->waitevent == CAPI_WAITEVENT_ECT_IND) && + (HEADER_CMD(CMSG) == CAPI_P_IND(FACILITY)) && + (FACILITY_IND_FACILITYSELECTOR(CMSG) == FACILITYSELECTOR_SUPPLEMENTARY) && + (read_capi_word(&FACILITY_IND_FACILITYINDICATIONPARAMETER(CMSG)[1]) == 0x0006)) { + i->waitevent = 0; + ast_cond_signal(&i->event_trigger); + cc_verbose(4, 1, "%s: found and signal for ECT indication.\n", + i->vname); + return; + } if (i->waitevent == capicommand) { i->waitevent = 0; ast_cond_signal(&i->event_trigger); diff --git a/chan_capi.h b/chan_capi.h index 2f8b0d5..90f52d0 100644 --- a/chan_capi.h +++ b/chan_capi.h @@ -256,6 +256,7 @@ struct cc_capi_gains { #define CAPI_WAITEVENT_B3_DOWN 0x00020000 #define CAPI_WAITEVENT_ANSWER_FINISH 0x00030000 #define CAPI_WAITEVENT_HOLD_IND 0x00040000 +#define CAPI_WAITEVENT_ECT_IND 0x00050000 /* Private qsig data for capi device */ struct cc_qsig_data {