git-svn-id: http://svn.openzap.org/svn/openzap/trunk@437 a93c3328-9c30-0410-af19-c9cd2b2d52af
This commit is contained in:
Anthony Minessale 2008-04-02 20:24:54 +00:00
parent ca2bbe4bc2
commit d06ede0e44
4 changed files with 28 additions and 7 deletions

View File

@ -410,6 +410,8 @@ struct zap_isdn_data {
struct zap_sigmsg sigmsg; struct zap_sigmsg sigmsg;
zio_signal_cb_t sig_cb; zio_signal_cb_t sig_cb;
uint32_t flags; uint32_t flags;
zap_channel_t *channels_local_crv[32768];
zap_channel_t *channels_remote_crv[32768];
}; };
struct zap_analog_data { struct zap_analog_data {
@ -438,8 +440,6 @@ struct zap_span {
teletone_tone_map_t tone_detect_map[ZAP_TONEMAP_INVALID+1]; teletone_tone_map_t tone_detect_map[ZAP_TONEMAP_INVALID+1];
teletone_multi_tone_t tone_finder[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[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_outgoing_call_t outgoing_call;
zio_channel_request_t channel_request; zio_channel_request_t channel_request;
void *mod_data; void *mod_data;

View File

@ -495,6 +495,19 @@ L3INT Q931CreateCRV(Q931_TrunkInfo_t *pTrunk, L3INT * callIndex)
return Q931AllocateCRV(pTrunk, CRV, 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 Function: Q931AllocateCRV

View File

@ -918,6 +918,7 @@ L3INT Q931InitMesRestartAck(Q931mes_Generic * pMes);
L3INT Q931InitMesGeneric(Q931mes_Generic *pMes); L3INT Q931InitMesGeneric(Q931mes_Generic *pMes);
L3INT Q931CreateCRV(Q931_TrunkInfo_t *pTrunk, L3INT * callIndex); 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 Q931AllocateCRV(Q931_TrunkInfo_t *pTrunk, L3INT iCRV, L3INT * callIndex);
L3INT Q931FindCRV(Q931_TrunkInfo_t *pTrunk, L3INT crv, L3INT *callindex); L3INT Q931FindCRV(Q931_TrunkInfo_t *pTrunk, L3INT crv, L3INT *callindex);
L3INT Q931GetCallState(Q931_TrunkInfo_t *pTrunk, L3INT iCRV); L3INT Q931GetCallState(Q931_TrunkInfo_t *pTrunk, L3INT iCRV);

View File

@ -85,9 +85,9 @@ static L3INT zap_isdn_931_34(void *pvt, L2UCHAR *msg, L2INT mlen)
#endif #endif
if (gen->CRVFlag) { if (gen->CRVFlag) {
zchan = span->channels_local_crv[gen->CRV]; zchan = isdn_data->channels_local_crv[gen->CRV];
} else { } else {
zchan = span->channels_remote_crv[gen->CRV]; zchan = isdn_data->channels_remote_crv[gen->CRV];
} }
@ -234,7 +234,7 @@ static L3INT zap_isdn_931_34(void *pvt, L2UCHAR *msg, L2INT mlen)
} }
if (zchan->state == ZAP_CHANNEL_STATE_DOWN) { 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)); memset(&zchan->caller_data, 0, sizeof(zchan->caller_data));
zap_set_string(zchan->caller_data.cid_num.digits, (char *)callingnum->Digit); 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); gen->Cause = Q931AppendIE((L3UCHAR *) gen, (L3UCHAR *) &cause);
Q931Rx43(&isdn_data->q931, (L3UCHAR *) gen, gen->Size); Q931Rx43(&isdn_data->q931, (L3UCHAR *) gen, gen->Size);
if (gen->CRV) {
Q931ReleaseCRV(&isdn_data->q931, gen->CRV);
}
if (zchan) { if (zchan) {
zap_log(ZAP_LOG_CRIT, "Channel is busy\n"); zap_log(ZAP_LOG_CRIT, "Channel is busy\n");
} else { } else {
@ -335,6 +339,9 @@ static __inline__ void state_advance(zap_channel_t *zchan)
switch (zchan->state) { switch (zchan->state) {
case ZAP_CHANNEL_STATE_DOWN: case ZAP_CHANNEL_STATE_DOWN:
{ {
if (gen->CRV) {
Q931ReleaseCRV(&isdn_data->q931, gen->CRV);
}
zap_channel_done(zchan); zap_channel_done(zchan);
} }
break; 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); 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); 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; break;
case ZAP_CHANNEL_STATE_HANGUP: case ZAP_CHANNEL_STATE_HANGUP: