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 {
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;
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
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);
#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];
}
break;
case Q931mes_SETUP:
{
-
+
Q931ie_CallingNum *callingnum = Q931GetIEPtr(gen->CallingNum, gen->buf);
Q931ie_CalledNum *callednum = Q931GetIEPtr(gen->CalledNum, gen->buf);
zap_status_t status;
}
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);
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 {
switch (zchan->state) {
case ZAP_CHANNEL_STATE_DOWN:
{
+ if (gen->CRV) {
+ Q931ReleaseCRV(&isdn_data->q931, gen->CRV);
+ }
zap_channel_done(zchan);
}
break;
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: