From 5daf56acd5287daeed15ea23fe568294428e2e5a Mon Sep 17 00:00:00 2001 From: Anthony Minessale Date: Wed, 2 Apr 2008 20:24:54 +0000 Subject: [PATCH] update git-svn-id: http://svn.openzap.org/svn/openzap/trunk@437 a93c3328-9c30-0410-af19-c9cd2b2d52af --- libs/openzap/src/include/openzap.h | 4 ++-- libs/openzap/src/isdn/Q931.c | 13 +++++++++++++ libs/openzap/src/isdn/include/Q931.h | 1 + libs/openzap/src/zap_isdn.c | 17 ++++++++++++----- 4 files changed, 28 insertions(+), 7 deletions(-) diff --git a/libs/openzap/src/include/openzap.h b/libs/openzap/src/include/openzap.h index 136fa3f8c4..3d973fd3a6 100644 --- a/libs/openzap/src/include/openzap.h +++ b/libs/openzap/src/include/openzap.h @@ -410,6 +410,8 @@ struct zap_isdn_data { struct zap_sigmsg sigmsg; zio_signal_cb_t sig_cb; uint32_t flags; + zap_channel_t *channels_local_crv[32768]; + zap_channel_t *channels_remote_crv[32768]; }; struct zap_analog_data { @@ -438,8 +440,6 @@ struct zap_span { teletone_tone_map_t tone_detect_map[ZAP_TONEMAP_INVALID+1]; teletone_multi_tone_t tone_finder[ZAP_TONEMAP_INVALID+1]; zap_channel_t channels[ZAP_MAX_CHANNELS_SPAN]; - zap_channel_t *channels_local_crv[32768]; - zap_channel_t *channels_remote_crv[32768]; zio_channel_outgoing_call_t outgoing_call; zio_channel_request_t channel_request; void *mod_data; diff --git a/libs/openzap/src/isdn/Q931.c b/libs/openzap/src/isdn/Q931.c index cb9c28ab20..272d768766 100644 --- a/libs/openzap/src/isdn/Q931.c +++ b/libs/openzap/src/isdn/Q931.c @@ -495,6 +495,19 @@ L3INT Q931CreateCRV(Q931_TrunkInfo_t *pTrunk, L3INT * callIndex) return Q931AllocateCRV(pTrunk, CRV, callIndex); } + +L3INT Q931ReleaseCRV(Q931_TrunkInfo_t *pTrunk, L3INT CRV) +{ + int callIndex; + + if ((Q931FindCRV(pTrunk, CRV, &callIndex)) == Q931E_NO_ERROR) { + pTrunk->call[callIndex].InUse = 0; + return Q931E_NO_ERROR; + } + + return Q931E_INVALID_CRV; +} + /***************************************************************************** Function: Q931AllocateCRV diff --git a/libs/openzap/src/isdn/include/Q931.h b/libs/openzap/src/isdn/include/Q931.h index 2da5ba5c01..8cea95e586 100644 --- a/libs/openzap/src/isdn/include/Q931.h +++ b/libs/openzap/src/isdn/include/Q931.h @@ -918,6 +918,7 @@ L3INT Q931InitMesRestartAck(Q931mes_Generic * pMes); L3INT Q931InitMesGeneric(Q931mes_Generic *pMes); L3INT Q931CreateCRV(Q931_TrunkInfo_t *pTrunk, L3INT * callIndex); +L3INT Q931ReleaseCRV(Q931_TrunkInfo_t *pTrunk, L3INT CRV); L3INT Q931AllocateCRV(Q931_TrunkInfo_t *pTrunk, L3INT iCRV, L3INT * callIndex); L3INT Q931FindCRV(Q931_TrunkInfo_t *pTrunk, L3INT crv, L3INT *callindex); L3INT Q931GetCallState(Q931_TrunkInfo_t *pTrunk, L3INT iCRV); diff --git a/libs/openzap/src/zap_isdn.c b/libs/openzap/src/zap_isdn.c index 3cde7b5860..63a8d4782a 100644 --- a/libs/openzap/src/zap_isdn.c +++ b/libs/openzap/src/zap_isdn.c @@ -85,9 +85,9 @@ static L3INT zap_isdn_931_34(void *pvt, L2UCHAR *msg, L2INT mlen) #endif if (gen->CRVFlag) { - zchan = span->channels_local_crv[gen->CRV]; + zchan = isdn_data->channels_local_crv[gen->CRV]; } else { - zchan = span->channels_remote_crv[gen->CRV]; + zchan = isdn_data->channels_remote_crv[gen->CRV]; } @@ -197,7 +197,7 @@ static L3INT zap_isdn_931_34(void *pvt, L2UCHAR *msg, L2INT mlen) break; case Q931mes_SETUP: { - + Q931ie_CallingNum *callingnum = Q931GetIEPtr(gen->CallingNum, gen->buf); Q931ie_CalledNum *callednum = Q931GetIEPtr(gen->CalledNum, gen->buf); zap_status_t status; @@ -234,7 +234,7 @@ static L3INT zap_isdn_931_34(void *pvt, L2UCHAR *msg, L2INT mlen) } if (zchan->state == ZAP_CHANNEL_STATE_DOWN) { - zchan->span->channels_remote_crv[gen->CRV] = zchan; + isdn_data->channels_remote_crv[gen->CRV] = zchan; memset(&zchan->caller_data, 0, sizeof(zchan->caller_data)); zap_set_string(zchan->caller_data.cid_num.digits, (char *)callingnum->Digit); @@ -268,6 +268,10 @@ static L3INT zap_isdn_931_34(void *pvt, L2UCHAR *msg, L2INT mlen) gen->Cause = Q931AppendIE((L3UCHAR *) gen, (L3UCHAR *) &cause); Q931Rx43(&isdn_data->q931, (L3UCHAR *) gen, gen->Size); + if (gen->CRV) { + Q931ReleaseCRV(&isdn_data->q931, gen->CRV); + } + if (zchan) { zap_log(ZAP_LOG_CRIT, "Channel is busy\n"); } else { @@ -335,6 +339,9 @@ static __inline__ void state_advance(zap_channel_t *zchan) switch (zchan->state) { case ZAP_CHANNEL_STATE_DOWN: { + if (gen->CRV) { + Q931ReleaseCRV(&isdn_data->q931, gen->CRV); + } zap_channel_done(zchan); } break; @@ -515,7 +522,7 @@ static __inline__ void state_advance(zap_channel_t *zchan) zap_copy_string((char *)ptrCalledNum->Digit, zchan->caller_data.ani.digits, strlen(zchan->caller_data.ani.digits)+1); Q931Rx43(&isdn_data->q931, (L3UCHAR *) gen, gen->Size); - zchan->span->channels_local_crv[gen->CRV] = zchan; + isdn_data->channels_local_crv[gen->CRV] = zchan; } break; case ZAP_CHANNEL_STATE_HANGUP: