From 4b6edff8e1571a7ec16ba8a29165b37d5ec598c7 Mon Sep 17 00:00:00 2001 From: Konrad Hammel Date: Sat, 5 Jun 2010 19:06:13 -0400 Subject: [PATCH] ->mis-nameda file --- .../ftmod_sangoma_ss7_support.c | 381 ++++++++++++++++++ 1 file changed, 381 insertions(+) create mode 100644 libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c diff --git a/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c new file mode 100644 index 0000000000..85c29f269f --- /dev/null +++ b/libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_support.c @@ -0,0 +1,381 @@ +/* + * Copyright (c) 2009, Konrad Hammel + * 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: + */ +/******************************************************************************/