forked from Mirrors/freeswitch
->mis-nameda file
This commit is contained in:
parent
9428335522
commit
4b6edff8e1
@ -0,0 +1,381 @@
|
||||
/*
|
||||
* Copyright (c) 2009, Konrad Hammel <konrad@sangoma.com>
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* * Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
*
|
||||
* * Neither the name of the original author; nor the names of any contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
|
||||
* OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
|
||||
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
||||
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
/* INCLUDE ********************************************************************/
|
||||
#include "ftmod_sangoma_ss7_main.h"
|
||||
/******************************************************************************/
|
||||
|
||||
/* DEFINES ********************************************************************/
|
||||
/******************************************************************************/
|
||||
|
||||
/* GLOBALS ********************************************************************/
|
||||
uint32_t sngss7_id;
|
||||
/******************************************************************************/
|
||||
|
||||
/* PROTOTYPES *****************************************************************/
|
||||
uint8_t copy_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_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_to_sngss7(ftdm_caller_data_t *ftdm, SiCdPtyNum *cdPtyNum);
|
||||
|
||||
int check_for_state_change(ftdm_channel_t *ftdmchan);
|
||||
unsigned long get_unique_id(void);
|
||||
|
||||
ftdm_status_t extract_chan_data(uint32_t circuit, sngss7_chan_data_t **sngss7_info, ftdm_channel_t **ftdmchan);
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
/* FUNCTIONS ******************************************************************/
|
||||
uint8_t copy_cgPtyNum_from_sngss7(ftdm_caller_data_t *ftdm, SiCgPtyNum *cgPtyNum)
|
||||
{
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
uint8_t copy_cgPtyNum_to_sngss7(ftdm_caller_data_t *ftdm, SiCgPtyNum *cgPtyNum)
|
||||
{
|
||||
int k;
|
||||
int j;
|
||||
int flag;
|
||||
char tmp;
|
||||
unsigned char lower;
|
||||
unsigned char upper;
|
||||
|
||||
/**************************************************************************/
|
||||
cgPtyNum->eh.pres = PRSNT_NODEF;
|
||||
/**************************************************************************/
|
||||
cgPtyNum->natAddrInd.pres = PRSNT_NODEF;
|
||||
cgPtyNum->natAddrInd.val = 0x03;
|
||||
/**************************************************************************/
|
||||
cgPtyNum->scrnInd.pres = PRSNT_NODEF;
|
||||
cgPtyNum->scrnInd.val = ftdm->screen;
|
||||
/**************************************************************************/
|
||||
cgPtyNum->presRest.pres = PRSNT_NODEF;
|
||||
cgPtyNum->presRest.val = ftdm->pres;
|
||||
/**************************************************************************/
|
||||
cgPtyNum->numPlan.pres = PRSNT_NODEF;
|
||||
cgPtyNum->numPlan.val = 0x01;
|
||||
/**************************************************************************/
|
||||
cgPtyNum->niInd.pres = PRSNT_NODEF;
|
||||
cgPtyNum->niInd.val = 0x00;
|
||||
/**************************************************************************/
|
||||
cgPtyNum->addrSig.pres = PRSNT_NODEF;
|
||||
|
||||
k = 0;
|
||||
j = 0;
|
||||
flag = 0;
|
||||
while (1) {
|
||||
tmp = ftdm->cid_num.digits[k];
|
||||
if (tmp != '\0') {
|
||||
if (isdigit(tmp)) {
|
||||
lower = atoi(&tmp);
|
||||
k++;
|
||||
tmp = ftdm->cid_num.digits[k];
|
||||
} else {
|
||||
while (!(isdigit(tmp)) && (tmp != '\0')) {
|
||||
k++;
|
||||
tmp = ftdm->cid_num.digits[k];
|
||||
} /* while(!(isdigit(tmp))) */
|
||||
|
||||
if (tmp != '\0') {
|
||||
lower = atoi(&tmp);
|
||||
k++;
|
||||
tmp = ftdm->cid_num.digits[k];
|
||||
} else {
|
||||
flag = 1;
|
||||
lower = 0xf;
|
||||
} /* if (tmp != '\0') */
|
||||
} /* (isdigit(tmp)) */
|
||||
} else {
|
||||
flag = 1;
|
||||
lower = 0xf;
|
||||
} /* if (tmp != '\0') */
|
||||
|
||||
tmp = ftdm->cid_num.digits[k];
|
||||
if (tmp != '\0') {
|
||||
if (isdigit(tmp)) {
|
||||
upper = (atoi(&tmp)) << 4;
|
||||
} else {
|
||||
while (!(isdigit(tmp)) && (tmp != '\0')) {
|
||||
k++;
|
||||
tmp = ftdm->cid_num.digits[k];
|
||||
} /* while(!(isdigit(tmp))) */
|
||||
|
||||
if (tmp != '\0') {
|
||||
upper = (atoi(&tmp)) << 4;
|
||||
k++;
|
||||
} else {
|
||||
flag = 1;
|
||||
upper = 0xf;
|
||||
} /* if (tmp != '\0') */
|
||||
} /* if (isdigit(tmp)) */
|
||||
} else {
|
||||
if (flag == 1){
|
||||
upper = 0x0;
|
||||
} else {
|
||||
flag = 1;
|
||||
upper = 0xf;
|
||||
} /* if (flag == 1) */
|
||||
} /* if (tmp != '\0') */
|
||||
|
||||
cgPtyNum->addrSig.val[j] = upper | lower;
|
||||
j++;
|
||||
|
||||
if (flag) {
|
||||
break;
|
||||
} else {
|
||||
k++;
|
||||
}
|
||||
} /* while(1) */
|
||||
|
||||
cgPtyNum->addrSig.len = j;
|
||||
/**************************************************************************/
|
||||
cgPtyNum->oddEven.pres = PRSNT_NODEF;
|
||||
cgPtyNum->oddEven.val = ((cgPtyNum->addrSig.val[j] >>4) == 0x0 ) ? 0x01 : 0x00;
|
||||
/**************************************************************************/
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
uint8_t copy_cdPtyNum_from_sngss7(ftdm_caller_data_t *ftdm, SiCdPtyNum *cdPtyNum)
|
||||
{
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
uint8_t copy_cdPtyNum_to_sngss7(ftdm_caller_data_t *ftdm, SiCdPtyNum *cdPtyNum)
|
||||
{
|
||||
int k;
|
||||
int j;
|
||||
int flag;
|
||||
char tmp;
|
||||
unsigned char lower;
|
||||
unsigned char upper;
|
||||
|
||||
/**************************************************************************/
|
||||
cdPtyNum->eh.pres = PRSNT_NODEF;
|
||||
/**************************************************************************/
|
||||
cdPtyNum->natAddrInd.pres = PRSNT_NODEF;
|
||||
cdPtyNum->natAddrInd.val = 0x03;
|
||||
/**************************************************************************/
|
||||
cdPtyNum->numPlan.pres = PRSNT_NODEF;
|
||||
cdPtyNum->numPlan.val = 0x01;
|
||||
/**************************************************************************/
|
||||
cdPtyNum->innInd.pres = PRSNT_NODEF;
|
||||
cdPtyNum->innInd.val = 0x01;
|
||||
/**************************************************************************/
|
||||
cdPtyNum->addrSig.pres = PRSNT_NODEF;
|
||||
|
||||
k = 0;
|
||||
j = 0;
|
||||
flag = 0;
|
||||
while (1) {
|
||||
tmp = ftdm->dnis.digits[k];
|
||||
if (tmp != '\0') {
|
||||
if (isdigit(tmp)) {
|
||||
lower = atoi(&tmp);
|
||||
k++;
|
||||
tmp = ftdm->dnis.digits[k];
|
||||
} else {
|
||||
while (!(isdigit(tmp)) && (tmp != '\0')) {
|
||||
k++;
|
||||
tmp = ftdm->dnis.digits[k];
|
||||
} /* while(!(isdigit(tmp))) */
|
||||
|
||||
if (tmp != '\0') {
|
||||
lower = atoi(&tmp);
|
||||
k++;
|
||||
tmp = ftdm->dnis.digits[k];
|
||||
} else {
|
||||
flag = 1;
|
||||
lower = 0xf;
|
||||
} /* if (tmp != '\0') */
|
||||
} /* (isdigit(tmp)) */
|
||||
} else {
|
||||
flag = 1;
|
||||
lower = 0xf;
|
||||
} /* if (tmp != '\0') */
|
||||
|
||||
tmp = ftdm->dnis.digits[k];
|
||||
if (tmp != '\0') {
|
||||
if (isdigit(tmp)) {
|
||||
upper = (atoi(&tmp)) << 4;
|
||||
} else {
|
||||
while (!(isdigit(tmp)) && (tmp != '\0')) {
|
||||
k++;
|
||||
tmp = ftdm->dnis.digits[k];
|
||||
} /* while(!(isdigit(tmp))) */
|
||||
|
||||
if (tmp != '\0') {
|
||||
upper = (atoi(&tmp)) << 4;
|
||||
k++;
|
||||
} else {
|
||||
flag = 1;
|
||||
upper = 0xf;
|
||||
} /* if (tmp != '\0') */
|
||||
} /* if (isdigit(tmp)) */
|
||||
} else {
|
||||
if (flag == 1){
|
||||
upper = 0x0;
|
||||
} else {
|
||||
flag = 1;
|
||||
upper = 0xf;
|
||||
} /* if (flag == 1) */
|
||||
} /* if (tmp != '\0') */
|
||||
|
||||
cdPtyNum->addrSig.val[j] = upper | lower;
|
||||
j++;
|
||||
|
||||
if (flag) {
|
||||
break;
|
||||
} else {
|
||||
k++;
|
||||
}
|
||||
} /* while(1) */
|
||||
|
||||
cdPtyNum->addrSig.len = j;
|
||||
/**************************************************************************/
|
||||
cdPtyNum->oddEven.pres = PRSNT_NODEF;
|
||||
cdPtyNum->oddEven.val = ((cdPtyNum->addrSig.val[j] >>4) == 0x0 ) ? 0x01 : 0x00;
|
||||
/**************************************************************************/
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
uint8_t copy_tknStr_from_sngss7(TknStr str, char *ftdm, TknU8 oddEven)
|
||||
{
|
||||
uint8_t i;
|
||||
uint8_t j;
|
||||
|
||||
/* check if the token string is present */
|
||||
if (str.pres == 1) {
|
||||
j=0;
|
||||
|
||||
for (i=0; i < str.len; i++) {
|
||||
sprintf(&ftdm[j], "%d", (str.val[i] & 0x0F));
|
||||
j++;
|
||||
sprintf(&ftdm[j], "%d", ((str.val[i] & 0xF0) >> 4));
|
||||
j++;
|
||||
}
|
||||
|
||||
/* 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';
|
||||
}
|
||||
} else {
|
||||
SS7_ERROR("Asked to copy tknStr that is not present!\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
int check_for_state_change(ftdm_channel_t *ftdmchan)
|
||||
{
|
||||
|
||||
#if 0
|
||||
SS7_DEBUG("Checking for pending state change on span: %d, chan: %d\n!",
|
||||
ftdmchan->physical_span_id,
|
||||
ftdmchan->physical_chan_id);
|
||||
#endif
|
||||
/* check to see if there are any pending state changes on the channel and give them a sec to happen*/
|
||||
ftdm_wait_for_flag_cleared(ftdmchan, FTDM_CHANNEL_STATE_CHANGE, 5000);
|
||||
|
||||
/* check the flag to confirm it is clear now */
|
||||
if (ftdm_test_flag(ftdmchan, FTDM_CHANNEL_STATE_CHANGE)) {
|
||||
/* the flag is still up...so we have a problem */
|
||||
SS7_ERROR("FTDM_CHANNEL_STATE_CHANGE set for over 500ms on span: %d, chan: %d\n",
|
||||
ftdmchan->physical_span_id,
|
||||
ftdmchan->physical_chan_id);
|
||||
|
||||
/* move the state of the channel to RESTART to force a reset */
|
||||
ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_RESTART);
|
||||
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
ftdm_status_t extract_chan_data(uint32_t circuit, sngss7_chan_data_t **sngss7_info, ftdm_channel_t **ftdmchan)
|
||||
{
|
||||
SS7_FUNC_TRACE_ENTER(__FUNCTION__);
|
||||
|
||||
if (g_ftdm_sngss7_data.cfg.isupCircuit[circuit].obj == NULL) {
|
||||
SS7_ERROR("sngss7_info is Null for circuit #%d\n", circuit);
|
||||
return FTDM_FAIL;
|
||||
}
|
||||
|
||||
ftdm_assert_return(g_ftdm_sngss7_data.cfg.isupCircuit[circuit].obj,FTDM_FAIL,"received message on signalling link or non-configured cic\n");
|
||||
*sngss7_info = g_ftdm_sngss7_data.cfg.isupCircuit[circuit].obj;
|
||||
|
||||
ftdm_assert_return((*sngss7_info)->ftdmchan,FTDM_FAIL,"received message on signalling link or non-configured cic\n");
|
||||
*ftdmchan = (*sngss7_info)->ftdmchan;
|
||||
|
||||
SS7_FUNC_TRACE_EXIT(__FUNCTION__);
|
||||
return FTDM_SUCCESS;
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
unsigned long get_unique_id(void)
|
||||
{
|
||||
|
||||
if (sngss7_id < 420000000) {
|
||||
sngss7_id++;
|
||||
} else {
|
||||
sngss7_id = 1;
|
||||
}
|
||||
|
||||
return(sngss7_id);
|
||||
}
|
||||
|
||||
/******************************************************************************/
|
||||
|
||||
/******************************************************************************/
|
||||
/* For Emacs:
|
||||
* Local Variables:
|
||||
* mode:c
|
||||
* indent-tabs-mode:t
|
||||
* tab-width:4
|
||||
* c-basic-offset:4
|
||||
* End:
|
||||
* For VIM:
|
||||
* vim:set softtabstop=4 shiftwidth=4 tabstop=4:
|
||||
*/
|
||||
/******************************************************************************/
|
Loading…
Reference in New Issue
Block a user