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

View File

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

View File

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

View File

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