freetdm: ss7 - added suport for per isup interface min_digits

ss7 - fixed strcpy bugs and compile warnings
This commit is contained in:
Konrad Hammel 2010-12-08 17:32:52 -05:00
parent 666e9fc2c6
commit 6fdba3452a
3 changed files with 40 additions and 21 deletions

View File

@ -502,6 +502,8 @@ void ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
/**************************************************************************/ /**************************************************************************/
case FTDM_CHANNEL_STATE_COLLECT: /* IAM received but wating on digits */ case FTDM_CHANNEL_STATE_COLLECT: /* IAM received but wating on digits */
isup_intf = &g_ftdm_sngss7_data.cfg.isupIntf[sngss7_info->circuit->infId];
if (ftdmchan->last_state == FTDM_CHANNEL_STATE_SUSPENDED) { if (ftdmchan->last_state == FTDM_CHANNEL_STATE_SUSPENDED) {
SS7_DEBUG("re-entering state from processing block/unblock request ... do nothing\n"); SS7_DEBUG("re-entering state from processing block/unblock request ... do nothing\n");
break; break;
@ -521,8 +523,8 @@ void ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
/*now go to the RING state */ /*now go to the RING state */
ftdm_set_state_locked (ftdmchan, FTDM_CHANNEL_STATE_RING); ftdm_set_state_locked (ftdmchan, FTDM_CHANNEL_STATE_RING);
} else if (i >= g_ftdm_sngss7_data.min_digits) { } else if (i >= isup_intf->min_digits) {
SS7_DEBUG_CHAN(ftdmchan, "Received %d digits (min digits = %d)\n", i, g_ftdm_sngss7_data.min_digits); SS7_DEBUG_CHAN(ftdmchan, "Received %d digits (min digits = %d)\n", i, isup_intf->min_digits);
/*now go to the RING state */ /*now go to the RING state */
ftdm_set_state_locked (ftdmchan, FTDM_CHANNEL_STATE_RING); ftdm_set_state_locked (ftdmchan, FTDM_CHANNEL_STATE_RING);
@ -532,7 +534,7 @@ void ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
if (ftdmchan->last_state != FTDM_CHANNEL_STATE_IDLE) { if (ftdmchan->last_state != FTDM_CHANNEL_STATE_IDLE) {
SS7_INFO_CHAN(ftdmchan,"Received %d out of %d so far: %s...starting T35\n", SS7_INFO_CHAN(ftdmchan,"Received %d out of %d so far: %s...starting T35\n",
i, i,
g_ftdm_sngss7_data.min_digits, isup_intf->min_digits,
ftdmchan->caller_data.dnis.digits); ftdmchan->caller_data.dnis.digits);
/* start ISUP t35 */ /* start ISUP t35 */
@ -1520,9 +1522,6 @@ static FIO_SIG_LOAD_FUNCTION(ftdm_sangoma_ss7_init)
/* initalize the global gen_config flag */ /* initalize the global gen_config flag */
g_ftdm_sngss7_data.gen_config = 0; g_ftdm_sngss7_data.gen_config = 0;
/* min. number of digitis to wait for */
g_ftdm_sngss7_data.min_digits = 7;
/* function trace initizalation */ /* function trace initizalation */
g_ftdm_sngss7_data.function_trace = 1; g_ftdm_sngss7_data.function_trace = 1;
g_ftdm_sngss7_data.function_trace_level = 7; g_ftdm_sngss7_data.function_trace_level = 7;

View File

@ -50,7 +50,7 @@
/******************************************************************************/ /******************************************************************************/
/* DEFINES ********************************************************************/ /* DEFINES ********************************************************************/
#define MAX_NAME_LEN 10 #define MAX_NAME_LEN 25
#define MAX_PATH 255 #define MAX_PATH 255
#define MAX_CIC_LENGTH 5 #define MAX_CIC_LENGTH 5
@ -224,6 +224,7 @@ typedef struct sng_isup_intf {
uint32_t isap; uint32_t isap;
uint32_t clg_nadi; uint32_t clg_nadi;
uint32_t cld_nadi; uint32_t cld_nadi;
uint32_t min_digits;
uint16_t t4; uint16_t t4;
uint32_t t10; uint32_t t10;
uint32_t t11; uint32_t t11;
@ -326,7 +327,6 @@ typedef struct sng_ss7_cfg {
typedef struct ftdm_sngss7_data { typedef struct ftdm_sngss7_data {
sng_ss7_cfg_t cfg; sng_ss7_cfg_t cfg;
int gen_config; int gen_config;
int min_digits;
int function_trace; int function_trace;
int function_trace_level; int function_trace_level;
int message_trace; int message_trace;

View File

@ -142,7 +142,7 @@ int ftmod_ss7_parse_xml(ftdm_conf_parameter_t *ftdm_parameters, ftdm_span_t *spa
if (!strcasecmp(var, "ch_map")) { if (!strcasecmp(var, "ch_map")) {
/**********************************************************************/ /**********************************************************************/
strcpy(isupCkt.ch_map, val); strncpy(isupCkt.ch_map, val, MAX_CIC_MAP_LENGTH-1);
SS7_DEBUG("\tFound channel map \"%s\"\n", isupCkt.ch_map); SS7_DEBUG("\tFound channel map \"%s\"\n", isupCkt.ch_map);
/**********************************************************************/ /**********************************************************************/
} else if (!strcasecmp(var, "typeCntrl")) { } else if (!strcasecmp(var, "typeCntrl")) {
@ -393,7 +393,7 @@ static int ftmod_ss7_parse_mtp_linkset(ftdm_conf_node_t *mtp_linkset)
for (i = 0; i < num_parms; i++) { for (i = 0; i < num_parms; i++) {
/**********************************************************************/ /**********************************************************************/
if (!strcasecmp(parm->var, "name")) { if (!strcasecmp(parm->var, "name")) {
strcpy((char *)mtpLinkSet.name, parm->val); strncpy((char *)mtpLinkSet.name, parm->val, MAX_NAME_LEN-1);
SS7_DEBUG("\tFound an \"mtp_linkset\" named = %s\n", mtpLinkSet.name); SS7_DEBUG("\tFound an \"mtp_linkset\" named = %s\n", mtpLinkSet.name);
/**********************************************************************/ /**********************************************************************/
} else if (!strcasecmp(parm->var, "apc")) { } else if (!strcasecmp(parm->var, "apc")) {
@ -508,7 +508,7 @@ static int ftmod_ss7_parse_mtp_link(ftdm_conf_node_t *mtp_link, sng_mtp_link_t *
/* try to match the parameter to what we expect */ /* try to match the parameter to what we expect */
/**********************************************************************/ /**********************************************************************/
if (!strcasecmp(parm->var, "name")) { if (!strcasecmp(parm->var, "name")) {
strcpy((char *)mtpLink->name, parm->val); strncpy((char *)mtpLink->name, parm->val, MAX_NAME_LEN-1);
SS7_DEBUG("\tFound an \"mtp_link\" named = %s\n", mtpLink->name); SS7_DEBUG("\tFound an \"mtp_link\" named = %s\n", mtpLink->name);
/**********************************************************************/ /**********************************************************************/
} else if (!strcasecmp(parm->var, "span")) { } else if (!strcasecmp(parm->var, "span")) {
@ -827,7 +827,7 @@ static int ftmod_ss7_parse_mtp_route(ftdm_conf_node_t *mtp_route)
/* try to match the parameter to what we expect */ /* try to match the parameter to what we expect */
/**********************************************************************/ /**********************************************************************/
if (!strcasecmp(parm->var, "name")) { if (!strcasecmp(parm->var, "name")) {
strcpy((char *)mtpRoute.name, parm->val); strncpy((char *)mtpRoute.name, parm->val, MAX_NAME_LEN-1);
SS7_DEBUG("\tFound an \"mtp_route\" named = %s\n", mtpRoute.name); SS7_DEBUG("\tFound an \"mtp_route\" named = %s\n", mtpRoute.name);
/**********************************************************************/ /**********************************************************************/
} else if (!strcasecmp(parm->var, "dpc")) { } else if (!strcasecmp(parm->var, "dpc")) {
@ -999,7 +999,7 @@ static int ftmod_ss7_parse_isup_interface(ftdm_conf_node_t *isup_interface)
/* try to match the parameter to what we expect */ /* try to match the parameter to what we expect */
/**********************************************************************/ /**********************************************************************/
if (!strcasecmp(parm->var, "name")) { if (!strcasecmp(parm->var, "name")) {
strcpy((char *)sng_isup.name, parm->val); strncpy((char *)sng_isup.name, parm->val, MAX_NAME_LEN-1);
SS7_DEBUG("\tFound an \"isup_interface\" named = %s\n", sng_isup.name); SS7_DEBUG("\tFound an \"isup_interface\" named = %s\n", sng_isup.name);
/**********************************************************************/ /**********************************************************************/
} else if (!strcasecmp(parm->var, "spc")) { } else if (!strcasecmp(parm->var, "spc")) {
@ -1047,6 +1047,11 @@ static int ftmod_ss7_parse_isup_interface(ftdm_conf_node_t *isup_interface)
SS7_DEBUG("\tFound MTP3 Route = %s\n", parm->val); SS7_DEBUG("\tFound MTP3 Route = %s\n", parm->val);
} }
/**********************************************************************/ /**********************************************************************/
} else if (!strcasecmp(parm->var, "min_digits")) {
sng_isup.min_digits = atoi(parm->val);
SS7_DEBUG("\tFound min_digits = %d\n", sng_isup.min_digits);
/**********************************************************************/
} else if (!strcasecmp(parm->var, "ssf")) { } else if (!strcasecmp(parm->var, "ssf")) {
if (!strcasecmp(parm->val, "nat")) { if (!strcasecmp(parm->val, "nat")) {
sng_isup.ssf = SSF_NAT; sng_isup.ssf = SSF_NAT;
@ -1067,8 +1072,8 @@ static int ftmod_ss7_parse_isup_interface(ftdm_conf_node_t *isup_interface)
/**********************************************************************/ /**********************************************************************/
} else if (!strcasecmp(parm->var, "license")) { } else if (!strcasecmp(parm->var, "license")) {
/**********************************************************************/ /**********************************************************************/
strcpy(g_ftdm_sngss7_data.cfg.license, parm->val); strncpy(g_ftdm_sngss7_data.cfg.license, parm->val, MAX_PATH-1);
strcpy(g_ftdm_sngss7_data.cfg.signature, parm->val); strncpy(g_ftdm_sngss7_data.cfg.signature, parm->val, MAX_PATH-1);
strcat(g_ftdm_sngss7_data.cfg.signature, ".sig"); strcat(g_ftdm_sngss7_data.cfg.signature, ".sig");
SS7_DEBUG("\tFound license file = %s\n", g_ftdm_sngss7_data.cfg.license); SS7_DEBUG("\tFound license file = %s\n", g_ftdm_sngss7_data.cfg.license);
SS7_DEBUG("\tFound signature file = %s\n", g_ftdm_sngss7_data.cfg.signature); SS7_DEBUG("\tFound signature file = %s\n", g_ftdm_sngss7_data.cfg.signature);
@ -1304,6 +1309,13 @@ static int ftmod_ss7_parse_isup_interface(ftdm_conf_node_t *isup_interface)
sng_isup.clg_nadi = 0x03; sng_isup.clg_nadi = 0x03;
} }
/* check if the user requested min_digits value */
if (sng_isup.min_digits == 0) {
/* default to 7 */
sng_isup.min_digits = 7;
}
/* trickle down the SPC to all sub entities */ /* trickle down the SPC to all sub entities */
linkSetId = g_ftdm_sngss7_data.cfg.mtpRoute[sng_isup.mtpRouteId].linkSetId; linkSetId = g_ftdm_sngss7_data.cfg.mtpRoute[sng_isup.mtpRouteId].linkSetId;
@ -1359,7 +1371,7 @@ static int ftmod_ss7_fill_in_mtpLink(sng_mtp_link_t *mtpLink)
} }
/* fill in the information */ /* fill in the information */
strcpy((char *)g_ftdm_sngss7_data.cfg.mtpLink[i].name, (char *)mtpLink->name); strncpy((char *)g_ftdm_sngss7_data.cfg.mtpLink[i].name, (char *)mtpLink->name, MAX_NAME_LEN-1);
g_ftdm_sngss7_data.cfg.mtpLink[i].id = mtpLink->id; g_ftdm_sngss7_data.cfg.mtpLink[i].id = mtpLink->id;
@ -1521,7 +1533,7 @@ static int ftmod_ss7_fill_in_mtpLinkSet(sng_link_set_t *mtpLinkSet)
{ {
int i = mtpLinkSet->id; int i = mtpLinkSet->id;
strcpy((char *)g_ftdm_sngss7_data.cfg.mtpLinkSet[i].name, (char *)mtpLinkSet->name); strncpy((char *)g_ftdm_sngss7_data.cfg.mtpLinkSet[i].name, (char *)mtpLinkSet->name, MAX_NAME_LEN-1);
g_ftdm_sngss7_data.cfg.mtpLinkSet[i].id = mtpLinkSet->id; g_ftdm_sngss7_data.cfg.mtpLinkSet[i].id = mtpLinkSet->id;
g_ftdm_sngss7_data.cfg.mtpLinkSet[i].apc = mtpLinkSet->apc; g_ftdm_sngss7_data.cfg.mtpLinkSet[i].apc = mtpLinkSet->apc;
@ -1559,7 +1571,7 @@ static int ftmod_ss7_fill_in_mtp3_route(sng_route_t *mtp3_route)
SS7_DEBUG("found existing mtp3_route, id is = %d\n", mtp3_route->id); SS7_DEBUG("found existing mtp3_route, id is = %d\n", mtp3_route->id);
} }
strcpy((char *)g_ftdm_sngss7_data.cfg.mtpRoute[i].name, (char *)mtp3_route->name); strncpy((char *)g_ftdm_sngss7_data.cfg.mtpRoute[i].name, (char *)mtp3_route->name, MAX_NAME_LEN-1);
g_ftdm_sngss7_data.cfg.mtpRoute[i].id = mtp3_route->id; g_ftdm_sngss7_data.cfg.mtpRoute[i].id = mtp3_route->id;
g_ftdm_sngss7_data.cfg.mtpRoute[i].dpc = mtp3_route->dpc; g_ftdm_sngss7_data.cfg.mtpRoute[i].dpc = mtp3_route->dpc;
@ -1693,7 +1705,7 @@ static int ftmod_ss7_fill_in_isup_interface(sng_isup_inf_t *sng_isup)
SS7_DEBUG("found existing isup interface, id is = %d\n", sng_isup->id); SS7_DEBUG("found existing isup interface, id is = %d\n", sng_isup->id);
} }
strcpy((char *)g_ftdm_sngss7_data.cfg.isupIntf[i].name, (char *)sng_isup->name); strncpy((char *)g_ftdm_sngss7_data.cfg.isupIntf[i].name, (char *)sng_isup->name, MAX_NAME_LEN-1);
g_ftdm_sngss7_data.cfg.isupIntf[i].id = sng_isup->id; g_ftdm_sngss7_data.cfg.isupIntf[i].id = sng_isup->id;
g_ftdm_sngss7_data.cfg.isupIntf[i].mtpRouteId = sng_isup->mtpRouteId; g_ftdm_sngss7_data.cfg.isupIntf[i].mtpRouteId = sng_isup->mtpRouteId;
@ -1705,6 +1717,7 @@ static int ftmod_ss7_fill_in_isup_interface(sng_isup_inf_t *sng_isup)
g_ftdm_sngss7_data.cfg.isupIntf[i].isap = sng_isup->isap; g_ftdm_sngss7_data.cfg.isupIntf[i].isap = sng_isup->isap;
g_ftdm_sngss7_data.cfg.isupIntf[i].cld_nadi = sng_isup->cld_nadi; g_ftdm_sngss7_data.cfg.isupIntf[i].cld_nadi = sng_isup->cld_nadi;
g_ftdm_sngss7_data.cfg.isupIntf[i].clg_nadi = sng_isup->clg_nadi; g_ftdm_sngss7_data.cfg.isupIntf[i].clg_nadi = sng_isup->clg_nadi;
g_ftdm_sngss7_data.cfg.isupIntf[i].min_digits = sng_isup->min_digits;
g_ftdm_sngss7_data.cfg.isupIntf[i].options = sng_isup->options; g_ftdm_sngss7_data.cfg.isupIntf[i].options = sng_isup->options;
if (sng_isup->t4 != 0) { if (sng_isup->t4 != 0) {
g_ftdm_sngss7_data.cfg.isupIntf[i].t4 = sng_isup->t4; g_ftdm_sngss7_data.cfg.isupIntf[i].t4 = sng_isup->t4;
@ -1976,7 +1989,7 @@ static int ftmod_ss7_fill_in_self_route(int spc, int linkType, int switchType, i
return FTDM_FAIL; return FTDM_FAIL;
} }
strcpy((char *)g_ftdm_sngss7_data.cfg.mtpRoute[0].name, "self-rt"); strncpy((char *)g_ftdm_sngss7_data.cfg.mtpRoute[0].name, "self-route", MAX_NAME_LEN-1);
g_ftdm_sngss7_data.cfg.mtpRoute[0].id = 0; g_ftdm_sngss7_data.cfg.mtpRoute[0].id = 0;
g_ftdm_sngss7_data.cfg.mtpRoute[0].dpc = spc; g_ftdm_sngss7_data.cfg.mtpRoute[0].dpc = spc;
@ -2230,7 +2243,7 @@ static int ftmod_ss7_next_timeslot(char *ch_map, sng_timeslot_t *timeslot)
int lower; int lower;
int upper; int upper;
char tmp[5]; /*KONRAD FIX ME*/ char tmp[5]; /*KONRAD FIX ME*/
char new_ch_map[MAX_CIC_LENGTH]; char new_ch_map[MAX_CIC_MAP_LENGTH];
memset(&tmp[0], '\0', sizeof(tmp)); memset(&tmp[0], '\0', sizeof(tmp));
memset(&new_ch_map[0], '\0', sizeof(new_ch_map)); memset(&new_ch_map[0], '\0', sizeof(new_ch_map));
@ -2337,7 +2350,9 @@ static int ftmod_ss7_next_timeslot(char *ch_map, sng_timeslot_t *timeslot)
/* the the rest of ch_map to new_ch_map */ /* the the rest of ch_map to new_ch_map */
strncat(new_ch_map, &ch_map[x], strlen(&ch_map[x])); strncat(new_ch_map, &ch_map[x], strlen(&ch_map[x]));
/* set the new cic map to ch_map*/ /* set the new cic map to ch_map*/
memset(ch_map, '\0', sizeof(ch_map));
strcpy(ch_map, new_ch_map); strcpy(ch_map, new_ch_map);
} else if (ch_map[x] == ',') { } else if (ch_map[x] == ',') {
@ -2345,16 +2360,21 @@ static int ftmod_ss7_next_timeslot(char *ch_map, sng_timeslot_t *timeslot)
x++; x++;
/* copy the rest of the list to new_ch_map */ /* copy the rest of the list to new_ch_map */
memset(new_ch_map, '\0', sizeof(new_ch_map));
strcpy(new_ch_map, &ch_map[x]); strcpy(new_ch_map, &ch_map[x]);
/* copy the new_ch_map over the old one */ /* copy the new_ch_map over the old one */
memset(ch_map, '\0', sizeof(ch_map));
strcpy(ch_map, new_ch_map); strcpy(ch_map, new_ch_map);
} else if (ch_map[x] == '\0') { } else if (ch_map[x] == '\0') {
/* we're at the end of the string...copy the rest of the list to new_ch_map */ /* we're at the end of the string...copy the rest of the list to new_ch_map */
memset(new_ch_map, '\0', sizeof(new_ch_map));
strcpy(new_ch_map, &ch_map[x]); strcpy(new_ch_map, &ch_map[x]);
/* set the new cic map to ch_map*/ /* set the new cic map to ch_map*/
memset(ch_map, '\0', sizeof(ch_map));
strcpy(ch_map, new_ch_map); strcpy(ch_map, new_ch_map);
} else { } else {
/* nothing to do */ /* nothing to do */