提交 ce34d86c authored 作者: Konrad Hammel's avatar Konrad Hammel

freetdm: ss7 - updated to allow TMR/bearer cap pass-through

上级 4fc415b6
...@@ -41,7 +41,6 @@ ...@@ -41,7 +41,6 @@
/* GLOBALS ********************************************************************/ /* GLOBALS ********************************************************************/
/******************************************************************************/ /******************************************************************************/
/* PROTOTYPES *****************************************************************/
/* PROTOTYPES *****************************************************************/ /* PROTOTYPES *****************************************************************/
ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiConEvnt *siConEvnt); ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiConEvnt *siConEvnt);
ftdm_status_t handle_con_sta(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiCnStEvnt *siCnStEvnt, uint8_t evntType); ftdm_status_t handle_con_sta(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, SiCnStEvnt *siCnStEvnt, uint8_t evntType);
...@@ -140,42 +139,67 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ ...@@ -140,42 +139,67 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ
} else { } else {
/* fill in cid/ani number */ /* fill in calling party information */
if (siConEvnt->cgPtyNum.addrSig.pres) { if (siConEvnt->cgPtyNum.eh.pres) {
copy_tknStr_from_sngss7(siConEvnt->cgPtyNum.addrSig, if (siConEvnt->cgPtyNum.addrSig.pres) {
ftdmchan->caller_data.cid_num.digits, /* fill in cid_num */
siConEvnt->cgPtyNum.oddEven); copy_tknStr_from_sngss7(siConEvnt->cgPtyNum.addrSig,
ftdmchan->caller_data.cid_num.digits,
/* fill in cid Name */ siConEvnt->cgPtyNum.oddEven);
ftdm_set_string(ftdmchan->caller_data.cid_name, ftdmchan->caller_data.cid_num.digits);
/* fill in cid Name */
ftdm_set_string(ftdmchan->caller_data.ani.digits, ftdmchan->caller_data.cid_num.digits); ftdm_set_string(ftdmchan->caller_data.cid_name, ftdmchan->caller_data.cid_num.digits);
/* fill in ANI */
ftdm_set_string(ftdmchan->caller_data.ani.digits, ftdmchan->caller_data.cid_num.digits);
}
if (siConEvnt->cgPtyNum.scrnInd.pres) {
/* fill in the screening indication value */
ftdmchan->caller_data.screen = siConEvnt->cgPtyNum.scrnInd.val;
}
if (siConEvnt->cgPtyNum.presRest.pres) {
/* fill in the presentation value */
ftdmchan->caller_data.pres = siConEvnt->cgPtyNum.presRest.val;
}
} else { } else {
SS7_INFO("No Calling party (ANI) information in IAM!\n"); SS7_INFO_CHAN(ftdmchan,"No Calling party (ANI) information in IAM!%s\n", " ");
} }
/* fill in dnis */ /* fill in called party infomation */
if (siConEvnt->cdPtyNum.addrSig.pres) { if (siConEvnt->cdPtyNum.eh.pres) {
copy_tknStr_from_sngss7(siConEvnt->cdPtyNum.addrSig, if (siConEvnt->cdPtyNum.addrSig.pres) {
ftdmchan->caller_data.dnis.digits, /* fill in the called number/dnis */
siConEvnt->cdPtyNum.oddEven); copy_tknStr_from_sngss7(siConEvnt->cdPtyNum.addrSig,
} else { ftdmchan->caller_data.dnis.digits,
SS7_INFO("No Called party (DNIS) information in IAM!\n"); siConEvnt->cdPtyNum.oddEven);
}
} else {
SS7_INFO_CHAN(ftdmchan,"No Called party (DNIS) information in IAM!%s\n", " ");
} }
/* fill in rdnis */ /* fill in rdnis information*/
if (siConEvnt->redirgNum.addrSig.pres) { if (siConEvnt->redirgNum.eh.pres) {
copy_tknStr_from_sngss7(siConEvnt->redirgNum.addrSig, if (siConEvnt->redirgNum.addrSig.pres) {
ftdmchan->caller_data.rdnis.digits, /* fill in the rdnis digits */
siConEvnt->cgPtyNum.oddEven); copy_tknStr_from_sngss7(siConEvnt->redirgNum.addrSig,
ftdmchan->caller_data.rdnis.digits,
siConEvnt->cgPtyNum.oddEven);
}
} else { } else {
SS7_INFO("No RDNIS party information in IAM!\n"); SS7_DEBUG_CHAN(ftdmchan,"No RDNIS party information in IAM!%s\n", " ");
} }
/* fill in screening/presentation */ /* fill in the TMR/bearer capability */
ftdmchan->caller_data.screen = siConEvnt->cgPtyNum.scrnInd.val; if (siConEvnt->txMedReq.eh.pres) {
ftdmchan->caller_data.pres = siConEvnt->cgPtyNum.presRest.val; if (siConEvnt->txMedReq.trMedReq.pres) {
/* fill in the bearer type */
ftdmchan->caller_data.bearer_capability = siConEvnt->txMedReq.trMedReq.val;
}
} else {
SS7_DEBUG_CHAN(ftdmchan,"No TMR/Bearer Cap information in IAM!%s\n", " ");
}
/* set the state of the channel to collecting...the rest is done by the chan monitor */ /* set the state of the channel to collecting...the rest is done by the chan monitor */
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_COLLECT); ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_COLLECT);
......
...@@ -64,70 +64,72 @@ void ft_to_sngss7_grs (ftdm_channel_t * ftdmchan); ...@@ -64,70 +64,72 @@ void ft_to_sngss7_grs (ftdm_channel_t * ftdmchan);
void void
ft_to_sngss7_iam (ftdm_channel_t * ftdmchan) ft_to_sngss7_iam (ftdm_channel_t * ftdmchan)
{ {
SS7_FUNC_TRACE_ENTER (__FUNCTION__); SS7_FUNC_TRACE_ENTER (__FUNCTION__);
sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;; sngss7_chan_data_t *sngss7_info = ftdmchan->call_data;;
SiConEvnt iam; SiConEvnt iam;
sngss7_info->suInstId = get_unique_id (); sngss7_info->suInstId = get_unique_id ();
sngss7_info->spInstId = 0; sngss7_info->spInstId = 0;
sngss7_info->spId = 1; sngss7_info->spId = 1;
memset (&iam, 0x0, sizeof (iam)); memset (&iam, 0x0, sizeof (iam));
/* copy down the nature of connection indicators */ /* copy down the nature of connection indicators */
iam.natConInd.eh.pres = PRSNT_NODEF; iam.natConInd.eh.pres = PRSNT_NODEF;
iam.natConInd.satInd.pres = PRSNT_NODEF; iam.natConInd.satInd.pres = PRSNT_NODEF;
iam.natConInd.satInd.val = 0; iam.natConInd.satInd.val = 0; /* no satellite circuit */
iam.natConInd.contChkInd.pres = PRSNT_NODEF; iam.natConInd.contChkInd.pres = PRSNT_NODEF;
iam.natConInd.contChkInd.val = 0x00; iam.natConInd.contChkInd.val = CONTCHK_NOTREQ;
iam.natConInd.echoCntrlDevInd.pres = PRSNT_NODEF; iam.natConInd.echoCntrlDevInd.pres = PRSNT_NODEF;
iam.natConInd.echoCntrlDevInd.val = 0x01; iam.natConInd.echoCntrlDevInd.val = ECHOCDEV_INCL;
/* copy down the forward call indicators */ /* copy down the forward call indicators */
iam.fwdCallInd.eh.pres = PRSNT_NODEF; iam.fwdCallInd.eh.pres = PRSNT_NODEF;
iam.fwdCallInd.natIntCallInd.pres = PRSNT_NODEF; iam.fwdCallInd.natIntCallInd.pres = PRSNT_NODEF;
iam.fwdCallInd.natIntCallInd.val = 0x00; iam.fwdCallInd.natIntCallInd.val = 0x00;
iam.fwdCallInd.end2EndMethInd.pres = PRSNT_NODEF; iam.fwdCallInd.end2EndMethInd.pres = PRSNT_NODEF;
iam.fwdCallInd.end2EndMethInd.val = 0x00; iam.fwdCallInd.end2EndMethInd.val = E2EMTH_NOMETH;
iam.fwdCallInd.intInd.pres = PRSNT_NODEF; iam.fwdCallInd.intInd.pres = PRSNT_NODEF;
iam.fwdCallInd.intInd.val = 0x01; iam.fwdCallInd.intInd.val = INTIND_NOINTW;
iam.fwdCallInd.end2EndInfoInd.pres = PRSNT_NODEF; iam.fwdCallInd.end2EndInfoInd.pres = PRSNT_NODEF;
iam.fwdCallInd.end2EndInfoInd.val = 0x00; iam.fwdCallInd.end2EndInfoInd.val = E2EINF_NOINFO;
iam.fwdCallInd.isdnUsrPrtInd.pres = PRSNT_NODEF; iam.fwdCallInd.isdnUsrPrtInd.pres = PRSNT_NODEF;
iam.fwdCallInd.isdnUsrPrtInd.val = 0x01; iam.fwdCallInd.isdnUsrPrtInd.val = ISUP_USED;
iam.fwdCallInd.isdnUsrPrtPrfInd.pres = PRSNT_NODEF; iam.fwdCallInd.isdnUsrPrtPrfInd.pres = PRSNT_NODEF;
iam.fwdCallInd.isdnUsrPrtPrfInd.val = 0x02; iam.fwdCallInd.isdnUsrPrtPrfInd.val = PREF_REQAW;
iam.fwdCallInd.isdnAccInd.pres = PRSNT_NODEF; iam.fwdCallInd.isdnAccInd.pres = PRSNT_NODEF;
iam.fwdCallInd.isdnAccInd.val = 0x01; iam.fwdCallInd.isdnAccInd.val = ISDNACC_ISDN;
iam.fwdCallInd.sccpMethInd.pres = PRSNT_NODEF; iam.fwdCallInd.sccpMethInd.pres = PRSNT_NODEF;
iam.fwdCallInd.sccpMethInd.val = 0x00; iam.fwdCallInd.sccpMethInd.val = SCCPMTH_NOIND;
/* copy down the calling number information */ /* copy down the calling number information */
iam.cgPtyCat.eh.pres = PRSNT_NODEF; iam.cgPtyCat.eh.pres = PRSNT_NODEF;
iam.cgPtyCat.cgPtyCat.pres = PRSNT_NODEF; iam.cgPtyCat.cgPtyCat.pres = PRSNT_NODEF;
iam.cgPtyCat.cgPtyCat.val = 0x0a; iam.cgPtyCat.cgPtyCat.val = CAT_ORD; /* ordinary suscriber */
/* copy down the transmission medium requirements */ /* copy down the transmission medium requirements */
iam.txMedReq.eh.pres = PRSNT_NODEF; iam.txMedReq.eh.pres = PRSNT_NODEF;
iam.txMedReq.trMedReq.pres = PRSNT_NODEF; iam.txMedReq.trMedReq.pres = PRSNT_NODEF;
iam.txMedReq.trMedReq.val = 0; /* SPEECH = 0, 3.1Khz = 3, 64k unres = 2 */ iam.txMedReq.trMedReq.val = ftdmchan->caller_data.bearer_capability;
/* copy down the called number information */ /* copy down the called number information */
copy_cdPtyNum_to_sngss7 (&ftdmchan->caller_data, &iam.cdPtyNum); copy_cdPtyNum_to_sngss7 (&ftdmchan->caller_data, &iam.cdPtyNum);
/* copy down the calling number information */ /* copy down the calling number information */
copy_cgPtyNum_to_sngss7 (&ftdmchan->caller_data, &iam.cgPtyNum); copy_cgPtyNum_to_sngss7 (&ftdmchan->caller_data, &iam.cgPtyNum);
sng_cc_con_request (sngss7_info->spId, sng_cc_con_request (sngss7_info->spId,
sngss7_info->suInstId, sngss7_info->suInstId,
sngss7_info->spInstId, sngss7_info->spInstId,
sngss7_info->circuit->id, &iam, 0); sngss7_info->circuit->id,
&iam,
SS7_MSG_TRACE(ftdmchan, sngss7_info, "Tx IAM\n"); 0);
SS7_FUNC_TRACE_EXIT (__FUNCTION__); SS7_MSG_TRACE(ftdmchan, sngss7_info, "Tx IAM\n");
return;
SS7_FUNC_TRACE_EXIT (__FUNCTION__);
return;
} }
/******************************************************************************/ /******************************************************************************/
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论