mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-04-15 16:39:14 +00:00
freetdm: ss7, bug fix in obci_bita handling
freetdm: ss7, added support for SAM freetdm: ss7, updated support for COT in IAM
This commit is contained in:
parent
09dc7c32f0
commit
3ad8a33b62
@ -216,8 +216,20 @@ ftdm_status_t handle_con_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ
|
|||||||
sprintf(nadi, "%d", siConEvnt->cdPtyNum.natAddrInd.val);
|
sprintf(nadi, "%d", siConEvnt->cdPtyNum.natAddrInd.val);
|
||||||
ftdm_channel_add_var(ftdmchan, "ss7_cld_nadi", nadi);
|
ftdm_channel_add_var(ftdmchan, "ss7_cld_nadi", nadi);
|
||||||
|
|
||||||
/* 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);
|
/* check if a COT test is requested */
|
||||||
|
if ((siConEvnt->natConInd.eh.pres) && (siConEvnt->natConInd.contChkInd.pres)) {
|
||||||
|
SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Found COT Request\n", sngss7_info->circuit->cic);
|
||||||
|
|
||||||
|
/* tell the core to loop the channel */
|
||||||
|
ftdm_channel_command(ftdmchan, FTDM_COMMAND_ENABLE_LOOP, NULL);
|
||||||
|
|
||||||
|
/* move to in loop state */
|
||||||
|
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_IN_LOOP);
|
||||||
|
} else {
|
||||||
|
/* 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);
|
||||||
|
}
|
||||||
|
|
||||||
} /* if (channel is usable */
|
} /* if (channel is usable */
|
||||||
|
|
||||||
@ -256,6 +268,9 @@ handle_glare:
|
|||||||
default: /* should not have gotten an IAM while in this state */
|
default: /* should not have gotten an IAM while in this state */
|
||||||
SS7_ERROR_CHAN(ftdmchan, "Got IAM on channel in invalid state(%s)...reset!\n", ftdm_channel_state2str (ftdmchan->state));
|
SS7_ERROR_CHAN(ftdmchan, "Got IAM on channel in invalid state(%s)...reset!\n", ftdm_channel_state2str (ftdmchan->state));
|
||||||
|
|
||||||
|
/* reset the cic */
|
||||||
|
sngss7_set_flag(sngss7_info, FLAG_RESET_TX);
|
||||||
|
|
||||||
/* move the state of the channel to RESTART to force a reset */
|
/* move the state of the channel to RESTART to force a reset */
|
||||||
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_RESTART);
|
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_RESTART);
|
||||||
|
|
||||||
@ -292,6 +307,7 @@ ftdm_status_t handle_con_sta(uint32_t suInstId, uint32_t spInstId, uint32_t circ
|
|||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
case (ADDRCMPLT):
|
case (ADDRCMPLT):
|
||||||
SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Rx ACM\n", sngss7_info->circuit->cic);
|
SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Rx ACM\n", sngss7_info->circuit->cic);
|
||||||
|
|
||||||
switch (ftdmchan->state) {
|
switch (ftdmchan->state) {
|
||||||
/**********************************************************************/
|
/**********************************************************************/
|
||||||
case FTDM_CHANNEL_STATE_DIALING:
|
case FTDM_CHANNEL_STATE_DIALING:
|
||||||
@ -315,14 +331,22 @@ ftdm_status_t handle_con_sta(uint32_t suInstId, uint32_t spInstId, uint32_t circ
|
|||||||
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_PROGRESS_MEDIA);
|
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_PROGRESS_MEDIA);
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
/**********************************************************************/
|
/**********************************************************************/
|
||||||
default: /* incorrect state...reset the CIC */
|
default: /* incorrect state...reset the CIC */
|
||||||
|
SS7_ERROR_CHAN(ftdmchan, "RX ACM in invalid state :%s...resetting CIC\n",
|
||||||
|
ftdm_channel_state2str (ftdmchan->state));
|
||||||
|
|
||||||
|
/* reset the cic */
|
||||||
|
sngss7_set_flag(sngss7_info, FLAG_RESET_TX);
|
||||||
|
|
||||||
/* go to RESTART */
|
/* go to RESTART */
|
||||||
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_PROGRESS);
|
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_RESTART);
|
||||||
break;
|
break;
|
||||||
/**********************************************************************/
|
/**********************************************************************/
|
||||||
} /* switch (ftdmchan->state) */
|
} /* switch (ftdmchan->state) */
|
||||||
|
|
||||||
|
break;
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
case (MODIFY):
|
case (MODIFY):
|
||||||
SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Rx MODIFY\n", sngss7_info->circuit->cic);
|
SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Rx MODIFY\n", sngss7_info->circuit->cic);
|
||||||
@ -354,6 +378,34 @@ ftdm_status_t handle_con_sta(uint32_t suInstId, uint32_t spInstId, uint32_t circ
|
|||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
case (SUBSADDR):
|
case (SUBSADDR):
|
||||||
SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Rx SAM\n", sngss7_info->circuit->cic);
|
SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Rx SAM\n", sngss7_info->circuit->cic);
|
||||||
|
|
||||||
|
/* check the channel state */
|
||||||
|
switch (ftdmchan->state) {
|
||||||
|
/**********************************************************************/
|
||||||
|
case (FTDM_CHANNEL_STATE_COLLECT):
|
||||||
|
|
||||||
|
/* confirm that the event contains the subsquent number field */
|
||||||
|
if (siCnStEvnt->subNum.eh.pres && siCnStEvnt->subNum.addrSig.pres) {
|
||||||
|
/* add the digits to the ftdm channel variable */
|
||||||
|
append_tknStr_from_sngss7(siCnStEvnt->subNum.addrSig,
|
||||||
|
ftdmchan->caller_data.dnis.digits,
|
||||||
|
siCnStEvnt->subNum.oddEven);
|
||||||
|
} else {
|
||||||
|
SS7_INFO_CHAN(ftdmchan,"No Called party (DNIS) information in SAM!%s\n", " ");
|
||||||
|
}
|
||||||
|
|
||||||
|
/* go to idle so that collect state is processed again */
|
||||||
|
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_IDLE);
|
||||||
|
|
||||||
|
break;
|
||||||
|
/**********************************************************************/
|
||||||
|
default:
|
||||||
|
SS7_ERROR_CHAN(ftdmchan, "RX SAM in invalid state :%s...ignoring\n",
|
||||||
|
ftdm_channel_state2str (ftdmchan->state));
|
||||||
|
break;
|
||||||
|
/**********************************************************************/
|
||||||
|
} /* switch (ftdmchan->state) */
|
||||||
|
|
||||||
break;
|
break;
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
case (EXIT):
|
case (EXIT):
|
||||||
@ -830,7 +882,7 @@ ftdm_status_t handle_sta_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ
|
|||||||
break;
|
break;
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
case SIT_STA_CONTCHK: /* continuity check */
|
case SIT_STA_CONTCHK: /* continuity check */
|
||||||
SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Rx COT start\n", sngss7_info->circuit->cic);
|
SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Rx CCR start\n", sngss7_info->circuit->cic);
|
||||||
handle_cot_start(suInstId, spInstId, circuit, globalFlg, evntType, siStaEvnt);
|
handle_cot_start(suInstId, spInstId, circuit, globalFlg, evntType, siStaEvnt);
|
||||||
break;
|
break;
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@ -840,7 +892,7 @@ ftdm_status_t handle_sta_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ
|
|||||||
break;
|
break;
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
case SIT_STA_STPCONTIN: /* stop continuity */
|
case SIT_STA_STPCONTIN: /* stop continuity */
|
||||||
SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Rx COT stop\n", sngss7_info->circuit->cic);
|
SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Rx CCR stop\n", sngss7_info->circuit->cic);
|
||||||
handle_cot_stop(suInstId, spInstId, circuit, globalFlg, evntType, siStaEvnt);
|
handle_cot_stop(suInstId, spInstId, circuit, globalFlg, evntType, siStaEvnt);
|
||||||
break;
|
break;
|
||||||
/**************************************************************************/
|
/**************************************************************************/
|
||||||
@ -1225,7 +1277,7 @@ ftdm_status_t handle_cot_start(uint32_t suInstId, uint32_t spInstId, uint32_t ci
|
|||||||
/* open the channel if it is not open */
|
/* open the channel if it is not open */
|
||||||
if (!ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OPEN)) {
|
if (!ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OPEN)) {
|
||||||
if (ftdm_channel_open_chan(ftdmchan) != FTDM_SUCCESS) {
|
if (ftdm_channel_open_chan(ftdmchan) != FTDM_SUCCESS) {
|
||||||
SS7_ERROR("Failed to open CIC %d for COT test!\n", sngss7_info->circuit->cic);
|
SS7_ERROR("Failed to open CIC %d for CCR test!\n", sngss7_info->circuit->cic);
|
||||||
/* KONRAD FIX ME */
|
/* KONRAD FIX ME */
|
||||||
SS7_FUNC_TRACE_EXIT(__FUNCTION__);
|
SS7_FUNC_TRACE_EXIT(__FUNCTION__);
|
||||||
return FTDM_FAIL;
|
return FTDM_FAIL;
|
||||||
@ -1290,6 +1342,38 @@ ftdm_status_t handle_cot(uint32_t suInstId, uint32_t spInstId, uint32_t circuit,
|
|||||||
{
|
{
|
||||||
SS7_FUNC_TRACE_ENTER(__FUNCTION__);
|
SS7_FUNC_TRACE_ENTER(__FUNCTION__);
|
||||||
|
|
||||||
|
sngss7_chan_data_t *sngss7_info = NULL;
|
||||||
|
ftdm_channel_t *ftdmchan = NULL;
|
||||||
|
|
||||||
|
/* get the ftdmchan and ss7_chan_data from the circuit */
|
||||||
|
if (extract_chan_data(circuit, &sngss7_info, &ftdmchan)) {
|
||||||
|
SS7_ERROR("Failed to extract channel data for circuit = %d!\n", circuit);
|
||||||
|
SS7_FUNC_TRACE_EXIT(__FUNCTION__);
|
||||||
|
return FTDM_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* lock the channel */
|
||||||
|
ftdm_mutex_lock(ftdmchan->mutex);
|
||||||
|
|
||||||
|
switch (ftdmchan->state) {
|
||||||
|
/**************************************************************************/
|
||||||
|
case (FTDM_CHANNEL_STATE_IN_LOOP):
|
||||||
|
/* tell the core to stop looping the channel */
|
||||||
|
ftdm_channel_command(ftdmchan, FTDM_COMMAND_DISABLE_LOOP, NULL);
|
||||||
|
|
||||||
|
/* exit out of the LOOP state and go to collect */
|
||||||
|
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_COLLECT);
|
||||||
|
|
||||||
|
break;
|
||||||
|
/**************************************************************************/
|
||||||
|
default:
|
||||||
|
/* exit out of the LOOP state to the last state */
|
||||||
|
ftdm_set_state_locked(ftdmchan, ftdmchan->last_state);
|
||||||
|
|
||||||
|
break;
|
||||||
|
/**************************************************************************/
|
||||||
|
} /* switch (ftdmchan->state) */
|
||||||
|
|
||||||
if ( (siStaEvnt->contInd.eh.pres > 0) && (siStaEvnt->contInd.contInd.pres > 0)) {
|
if ( (siStaEvnt->contInd.eh.pres > 0) && (siStaEvnt->contInd.contInd.pres > 0)) {
|
||||||
SS7_INFO("Continuity Test result for CIC = %d (span %d, chan %d) is: \"%s\"\n",
|
SS7_INFO("Continuity Test result for CIC = %d (span %d, chan %d) is: \"%s\"\n",
|
||||||
g_ftdm_sngss7_data.cfg.isupCkt[circuit].cic,
|
g_ftdm_sngss7_data.cfg.isupCkt[circuit].cic,
|
||||||
@ -1300,13 +1384,13 @@ ftdm_status_t handle_cot(uint32_t suInstId, uint32_t spInstId, uint32_t circuit,
|
|||||||
SS7_ERROR("Recieved Continuity report containing no results!\n");
|
SS7_ERROR("Recieved Continuity report containing no results!\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* unlock the channel again before we exit */
|
||||||
|
ftdm_mutex_unlock(ftdmchan->mutex);
|
||||||
|
|
||||||
SS7_FUNC_TRACE_EXIT(__FUNCTION__);
|
SS7_FUNC_TRACE_EXIT(__FUNCTION__);
|
||||||
return FTDM_SUCCESS;
|
return FTDM_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
ftdm_status_t handle_blo_req(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt)
|
ftdm_status_t handle_blo_req(uint32_t suInstId, uint32_t spInstId, uint32_t circuit, uint8_t globalFlg, uint8_t evntType, SiStaEvnt *siStaEvnt)
|
||||||
{
|
{
|
||||||
|
@ -79,7 +79,7 @@ ftdm_state_map_t sangoma_ss7_state_map = {
|
|||||||
ZSD_INBOUND,
|
ZSD_INBOUND,
|
||||||
ZSM_UNACCEPTABLE,
|
ZSM_UNACCEPTABLE,
|
||||||
{FTDM_CHANNEL_STATE_IDLE, FTDM_END},
|
{FTDM_CHANNEL_STATE_IDLE, FTDM_END},
|
||||||
{FTDM_CHANNEL_STATE_RESTART, FTDM_END}
|
{FTDM_CHANNEL_STATE_RESTART, FTDM_CHANNEL_STATE_COLLECT, FTDM_END}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
ZSD_INBOUND,
|
ZSD_INBOUND,
|
||||||
@ -100,7 +100,8 @@ ftdm_state_map_t sangoma_ss7_state_map = {
|
|||||||
ZSM_UNACCEPTABLE,
|
ZSM_UNACCEPTABLE,
|
||||||
{FTDM_CHANNEL_STATE_COLLECT, FTDM_END},
|
{FTDM_CHANNEL_STATE_COLLECT, FTDM_END},
|
||||||
{FTDM_CHANNEL_STATE_SUSPENDED, FTDM_CHANNEL_STATE_RESTART,
|
{FTDM_CHANNEL_STATE_SUSPENDED, FTDM_CHANNEL_STATE_RESTART,
|
||||||
FTDM_CHANNEL_STATE_CANCEL, FTDM_CHANNEL_STATE_RING, FTDM_END}
|
FTDM_CHANNEL_STATE_CANCEL, FTDM_CHANNEL_STATE_RING,
|
||||||
|
FTDM_CHANNEL_STATE_IDLE, FTDM_END}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
ZSD_INBOUND,
|
ZSD_INBOUND,
|
||||||
@ -526,29 +527,32 @@ void ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
|
|||||||
ftdm_set_state_locked (ftdmchan, FTDM_CHANNEL_STATE_RING);
|
ftdm_set_state_locked (ftdmchan, FTDM_CHANNEL_STATE_RING);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
SS7_INFO_CHAN(ftdmchan,"Received %d out of %d so far: %s...starting T35\n",
|
/* if we are coming from idle state then we have already been here once before */
|
||||||
i,
|
if (ftdmchan->last_state != FTDM_CHANNEL_STATE_IDLE) {
|
||||||
g_ftdm_sngss7_data.min_digits,
|
SS7_INFO_CHAN(ftdmchan,"Received %d out of %d so far: %s...starting T35\n",
|
||||||
ftdmchan->caller_data.dnis.digits);
|
i,
|
||||||
|
g_ftdm_sngss7_data.min_digits,
|
||||||
/* start ISUP t35 */
|
ftdmchan->caller_data.dnis.digits);
|
||||||
if (ftdm_sched_timer (sngss7_info->t35.sched,
|
|
||||||
"t35",
|
/* start ISUP t35 */
|
||||||
sngss7_info->t35.beat,
|
if (ftdm_sched_timer (sngss7_info->t35.sched,
|
||||||
sngss7_info->t35.callback,
|
"t35",
|
||||||
&sngss7_info->t35,
|
sngss7_info->t35.beat,
|
||||||
&sngss7_info->t35.hb_timer_id)) {
|
sngss7_info->t35.callback,
|
||||||
|
&sngss7_info->t35,
|
||||||
SS7_ERROR ("Unable to schedule timer, hanging up call!\n");
|
&sngss7_info->t35.hb_timer_id)) {
|
||||||
|
|
||||||
ftdmchan->caller_data.hangup_cause = 41;
|
SS7_ERROR ("Unable to schedule timer, hanging up call!\n");
|
||||||
|
|
||||||
/* set the flag to indicate this hangup is started from the local side */
|
ftdmchan->caller_data.hangup_cause = 41;
|
||||||
sngss7_set_flag (sngss7_info, FLAG_LOCAL_REL);
|
|
||||||
|
/* set the flag to indicate this hangup is started from the local side */
|
||||||
/* end the call */
|
sngss7_set_flag (sngss7_info, FLAG_LOCAL_REL);
|
||||||
ftdm_set_state_locked (ftdmchan, FTDM_CHANNEL_STATE_CANCEL);
|
|
||||||
} /* if (ftdm_sched_timer(sngss7_info->t35.sched, */
|
/* end the call */
|
||||||
|
ftdm_set_state_locked (ftdmchan, FTDM_CHANNEL_STATE_CANCEL);
|
||||||
|
} /* if (ftdm_sched_timer(sngss7_info->t35.sched, */
|
||||||
|
} /* if (ftdmchan->last_state != FTDM_CHANNEL_STATE_IDLE) */
|
||||||
} /* checking ST/#digits */
|
} /* checking ST/#digits */
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
@ -581,6 +581,8 @@ uint8_t copy_cgPtyNum_to_sngss7(ftdm_caller_data_t *ftdm, SiCgPtyNum *cgPtyNum);
|
|||||||
uint8_t copy_cdPtyNum_from_sngss7(ftdm_caller_data_t *ftdm, SiCdPtyNum *cdPtyNum);
|
uint8_t copy_cdPtyNum_from_sngss7(ftdm_caller_data_t *ftdm, SiCdPtyNum *cdPtyNum);
|
||||||
uint8_t copy_cdPtyNum_to_sngss7(ftdm_caller_data_t *ftdm, SiCdPtyNum *cdPtyNum);
|
uint8_t copy_cdPtyNum_to_sngss7(ftdm_caller_data_t *ftdm, SiCdPtyNum *cdPtyNum);
|
||||||
uint8_t copy_tknStr_from_sngss7(TknStr str, char *ftdm, TknU8 oddEven);
|
uint8_t copy_tknStr_from_sngss7(TknStr str, char *ftdm, TknU8 oddEven);
|
||||||
|
uint8_t append_tknStr_from_sngss7(TknStr str, char *ftdm, TknU8 oddEven);
|
||||||
|
|
||||||
int check_for_state_change(ftdm_channel_t *ftdmchan);
|
int check_for_state_change(ftdm_channel_t *ftdmchan);
|
||||||
int check_cics_in_range(sngss7_chan_data_t *sngss7_info);
|
int check_cics_in_range(sngss7_chan_data_t *sngss7_info);
|
||||||
int check_for_reset(sngss7_chan_data_t *sngss7_info);
|
int check_for_reset(sngss7_chan_data_t *sngss7_info);
|
||||||
|
@ -341,9 +341,10 @@ void ft_to_sngss7_acm (ftdm_channel_t * ftdmchan)
|
|||||||
|
|
||||||
/* fill in any optional parameters */
|
/* fill in any optional parameters */
|
||||||
if (sngss7_test_options(isup_intf, SNGSS7_ACM_OBCI_BITA)) {
|
if (sngss7_test_options(isup_intf, SNGSS7_ACM_OBCI_BITA)) {
|
||||||
|
SS7_DEBUG_CHAN(ftdmchan, "Found ACM_OBCI_BITA flag:0x%X\n", isup_intf->options);
|
||||||
acm.optBckCalInd.eh.pres = PRSNT_NODEF;
|
acm.optBckCalInd.eh.pres = PRSNT_NODEF;
|
||||||
acm.optBckCalInd.inbndInfoInd.pres = PRSNT_NODEF;
|
acm.optBckCalInd.inbndInfoInd.pres = PRSNT_NODEF;
|
||||||
acm.optBckCalInd.inbndInfoInd.val = sngss7_test_options(isup_intf, SNGSS7_ACM_OBCI_BITA);
|
acm.optBckCalInd.inbndInfoInd.val = 0x1;
|
||||||
acm.optBckCalInd.caFwdMayOcc.pres = PRSNT_DEF;
|
acm.optBckCalInd.caFwdMayOcc.pres = PRSNT_DEF;
|
||||||
acm.optBckCalInd.simpleSegmInd.pres = PRSNT_DEF;
|
acm.optBckCalInd.simpleSegmInd.pres = PRSNT_DEF;
|
||||||
acm.optBckCalInd.mlppUserInd.pres = PRSNT_DEF;
|
acm.optBckCalInd.mlppUserInd.pres = PRSNT_DEF;
|
||||||
|
@ -44,6 +44,7 @@ uint32_t sngss7_id;
|
|||||||
|
|
||||||
/* PROTOTYPES *****************************************************************/
|
/* PROTOTYPES *****************************************************************/
|
||||||
uint8_t copy_tknStr_from_sngss7(TknStr str, char *ftdm, TknU8 oddEven);
|
uint8_t copy_tknStr_from_sngss7(TknStr str, char *ftdm, TknU8 oddEven);
|
||||||
|
uint8_t append_tknStr_from_sngss7(TknStr str, char *ftdm, TknU8 oddEven);
|
||||||
uint8_t copy_cgPtyNum_from_sngss7(ftdm_caller_data_t *ftdm, SiCgPtyNum *cgPtyNum);
|
uint8_t copy_cgPtyNum_from_sngss7(ftdm_caller_data_t *ftdm, SiCgPtyNum *cgPtyNum);
|
||||||
uint8_t copy_cgPtyNum_to_sngss7(ftdm_caller_data_t *ftdm, SiCgPtyNum *cgPtyNum);
|
uint8_t copy_cgPtyNum_to_sngss7(ftdm_caller_data_t *ftdm, SiCgPtyNum *cgPtyNum);
|
||||||
uint8_t copy_cdPtyNum_from_sngss7(ftdm_caller_data_t *ftdm, SiCdPtyNum *cdPtyNum);
|
uint8_t copy_cdPtyNum_from_sngss7(ftdm_caller_data_t *ftdm, SiCdPtyNum *cdPtyNum);
|
||||||
@ -343,6 +344,49 @@ uint8_t copy_tknStr_from_sngss7(TknStr str, char *ftdm, TknU8 oddEven)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/******************************************************************************/
|
||||||
|
uint8_t append_tknStr_from_sngss7(TknStr str, char *ftdm, TknU8 oddEven)
|
||||||
|
{
|
||||||
|
int i = 0;
|
||||||
|
int j = 0;
|
||||||
|
|
||||||
|
/* check if the token string is present */
|
||||||
|
if (str.pres == 1) {
|
||||||
|
/* find the length of the digits so far */
|
||||||
|
j = strlen(ftdm);
|
||||||
|
|
||||||
|
/* confirm that we found an acceptable length */
|
||||||
|
if ( j > 25 ) {
|
||||||
|
SS7_ERROR("string length exceeds maxium value...aborting append!\n");
|
||||||
|
return 1;
|
||||||
|
} /* if ( j > 25 ) */
|
||||||
|
|
||||||
|
/* copy in digits */
|
||||||
|
for (i = 0; i < str.len; i++) {
|
||||||
|
/* convert 4 bit integer to char and copy into lower nibblet*/
|
||||||
|
sprintf(&ftdm[j], "%X", (str.val[i] & 0x0F));
|
||||||
|
/* move along */
|
||||||
|
j++;
|
||||||
|
/* convert 4 bit integer to char and copy into upper nibblet */
|
||||||
|
sprintf(&ftdm[j], "%X", ((str.val[i] & 0xF0) >> 4));
|
||||||
|
/* move along */
|
||||||
|
j++;
|
||||||
|
} /* for (i = 0; i < str.len; i++) */
|
||||||
|
|
||||||
|
/* if the odd flag is up the last digit is a fake "0" */
|
||||||
|
if ((oddEven.pres == 1) && (oddEven.val == 1)) {
|
||||||
|
ftdm[j-1] = '\0';
|
||||||
|
} else {
|
||||||
|
ftdm[j] = '\0';
|
||||||
|
} /* if ((oddEven.pres == 1) && (oddEven.val == 1)) */
|
||||||
|
} else {
|
||||||
|
SS7_ERROR("Asked to copy tknStr that is not present!\n");
|
||||||
|
return 1;
|
||||||
|
} /* if (str.pres == 1) */
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
int check_for_state_change(ftdm_channel_t *ftdmchan)
|
int check_for_state_change(ftdm_channel_t *ftdmchan)
|
||||||
{
|
{
|
||||||
|
Loading…
x
Reference in New Issue
Block a user