mirror of
https://github.com/signalwire/freeswitch.git
synced 2025-03-07 18:51:24 +00:00
freetdm: ISDN - Fix for segfault when setting outbound-called-npi=e164
This commit is contained in:
parent
154731a777
commit
403dd0c5b0
libs/freetdm/src
@ -292,6 +292,12 @@ typedef struct ftdm_sngisdn_data {
|
|||||||
sngisdn_span_data_t *spans[MAX_L1_LINKS+1]; /* spans are indexed by link_id */
|
sngisdn_span_data_t *spans[MAX_L1_LINKS+1]; /* spans are indexed by link_id */
|
||||||
}ftdm_sngisdn_data_t;
|
}ftdm_sngisdn_data_t;
|
||||||
|
|
||||||
|
typedef struct ftdm2trillium
|
||||||
|
{
|
||||||
|
uint8_t ftdm_val;
|
||||||
|
uint8_t trillium_val;
|
||||||
|
}ftdm2trillium_t;
|
||||||
|
|
||||||
|
|
||||||
/* TODO implement these 2 functions */
|
/* TODO implement these 2 functions */
|
||||||
#define ISDN_FUNC_TRACE_ENTER(a)
|
#define ISDN_FUNC_TRACE_ENTER(a)
|
||||||
|
@ -43,9 +43,55 @@ SNGISDN_STR2ENUM(ftdm_str2ftdm_sngisdn_progind_descr, ftdm_sngisdn_progind_descr
|
|||||||
SNGISDN_ENUM_NAMES(SNGISDN_PROGIND_LOC_NAMES, SNGISDN_PROGIND_LOC_STRINGS)
|
SNGISDN_ENUM_NAMES(SNGISDN_PROGIND_LOC_NAMES, SNGISDN_PROGIND_LOC_STRINGS)
|
||||||
SNGISDN_STR2ENUM(ftdm_str2ftdm_sngisdn_progind_loc, ftdm_sngisdn_progind_loc2str, ftdm_sngisdn_progind_loc_t, SNGISDN_PROGIND_LOC_NAMES, SNGISDN_PROGIND_LOC_INVALID)
|
SNGISDN_STR2ENUM(ftdm_str2ftdm_sngisdn_progind_loc, ftdm_sngisdn_progind_loc2str, ftdm_sngisdn_progind_loc_t, SNGISDN_PROGIND_LOC_NAMES, SNGISDN_PROGIND_LOC_INVALID)
|
||||||
|
|
||||||
|
static uint8_t get_trillium_val(ftdm2trillium_t *vals, uint8_t ftdm_val, uint8_t default_val);
|
||||||
|
static uint8_t get_ftdm_val(ftdm2trillium_t *vals, uint8_t trillium_val, uint8_t default_val);
|
||||||
|
|
||||||
extern ftdm_sngisdn_data_t g_sngisdn_data;
|
extern ftdm_sngisdn_data_t g_sngisdn_data;
|
||||||
void get_memory_info(void);
|
void get_memory_info(void);
|
||||||
|
|
||||||
|
ftdm2trillium_t npi_codes[] = {
|
||||||
|
{FTDM_NPI_UNKNOWN, IN_NP_UNK},
|
||||||
|
{FTDM_NPI_ISDN, IN_NP_ISDN},
|
||||||
|
{FTDM_NPI_DATA, IN_NP_DATA},
|
||||||
|
{FTDM_NPI_TELEX, IN_NP_TELEX},
|
||||||
|
{FTDM_NPI_NATIONAL, IN_NP_NATIONAL},
|
||||||
|
{FTDM_NPI_PRIVATE, IN_NP_PRIVATE},
|
||||||
|
{FTDM_NPI_RESERVED, IN_NP_EXT},
|
||||||
|
};
|
||||||
|
|
||||||
|
ftdm2trillium_t ton_codes[] = {
|
||||||
|
{FTDM_TON_UNKNOWN, IN_TON_UNK},
|
||||||
|
{FTDM_TON_INTERNATIONAL, IN_TON_INT},
|
||||||
|
{FTDM_TON_NATIONAL, IN_TON_NAT},
|
||||||
|
{FTDM_TON_NETWORK_SPECIFIC, IN_TON_NETSPEC},
|
||||||
|
{FTDM_TON_SUBSCRIBER_NUMBER, IN_TON_SUB},
|
||||||
|
{FTDM_TON_ABBREVIATED_NUMBER, IN_TON_ABB},
|
||||||
|
{FTDM_TON_RESERVED, IN_TON_EXT},
|
||||||
|
};
|
||||||
|
|
||||||
|
static uint8_t get_trillium_val(ftdm2trillium_t *vals, uint8_t ftdm_val, uint8_t default_val)
|
||||||
|
{
|
||||||
|
ftdm2trillium_t *val = vals;
|
||||||
|
while(val++) {
|
||||||
|
if (val->ftdm_val == ftdm_val) {
|
||||||
|
return val->trillium_val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return default_val;
|
||||||
|
}
|
||||||
|
|
||||||
|
static uint8_t get_ftdm_val(ftdm2trillium_t *vals, uint8_t trillium_val, uint8_t default_val)
|
||||||
|
{
|
||||||
|
ftdm2trillium_t *val = vals;
|
||||||
|
while(val++) {
|
||||||
|
if (val->trillium_val == trillium_val) {
|
||||||
|
return val->ftdm_val;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return default_val;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void clear_call_data(sngisdn_chan_data_t *sngisdn_info)
|
void clear_call_data(sngisdn_chan_data_t *sngisdn_info)
|
||||||
{
|
{
|
||||||
uint32_t cc_id = ((sngisdn_span_data_t*)sngisdn_info->ftdmchan->span->signal_data)->cc_id;
|
uint32_t cc_id = ((sngisdn_span_data_t*)sngisdn_info->ftdmchan->span->signal_data)->cc_id;
|
||||||
@ -257,11 +303,11 @@ ftdm_status_t get_called_num(ftdm_channel_t *ftdmchan, CdPtyNmb *cdPtyNmb)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (cdPtyNmb->nmbPlanId.pres == PRSNT_NODEF) {
|
if (cdPtyNmb->nmbPlanId.pres == PRSNT_NODEF) {
|
||||||
caller_data->dnis.plan = cdPtyNmb->nmbPlanId.val;
|
caller_data->dnis.plan = get_ftdm_val(npi_codes, cdPtyNmb->nmbPlanId.val, IN_NP_UNK);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cdPtyNmb->typeNmb0.pres == PRSNT_NODEF) {
|
if (cdPtyNmb->typeNmb0.pres == PRSNT_NODEF) {
|
||||||
caller_data->dnis.type = cdPtyNmb->typeNmb0.val;
|
caller_data->dnis.type = get_ftdm_val(ton_codes, cdPtyNmb->typeNmb0.val, IN_TON_UNK);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cdPtyNmb->nmbDigits.pres == PRSNT_NODEF) {
|
if (cdPtyNmb->nmbDigits.pres == PRSNT_NODEF) {
|
||||||
@ -281,11 +327,11 @@ ftdm_status_t get_redir_num(ftdm_channel_t *ftdmchan, RedirNmb *redirNmb)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (redirNmb->nmbPlanId.pres == PRSNT_NODEF) {
|
if (redirNmb->nmbPlanId.pres == PRSNT_NODEF) {
|
||||||
caller_data->rdnis.plan = redirNmb->nmbPlanId.val;
|
caller_data->rdnis.plan = get_ftdm_val(npi_codes, redirNmb->nmbPlanId.val, IN_NP_UNK);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (redirNmb->typeNmb.pres == PRSNT_NODEF) {
|
if (redirNmb->typeNmb.pres == PRSNT_NODEF) {
|
||||||
caller_data->rdnis.type = redirNmb->typeNmb.val;
|
caller_data->rdnis.type = get_ftdm_val(ton_codes, redirNmb->typeNmb.val, IN_TON_UNK);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (redirNmb->nmbDigits.pres == PRSNT_NODEF) {
|
if (redirNmb->nmbDigits.pres == PRSNT_NODEF) {
|
||||||
@ -380,11 +426,13 @@ ftdm_status_t get_facility_ie_str(ftdm_channel_t *ftdmchan, uint8_t *data, uint8
|
|||||||
ftdm_status_t get_prog_ind_ie(ftdm_channel_t *ftdmchan, ProgInd *progInd)
|
ftdm_status_t get_prog_ind_ie(ftdm_channel_t *ftdmchan, ProgInd *progInd)
|
||||||
{
|
{
|
||||||
uint8_t val;
|
uint8_t val;
|
||||||
|
|
||||||
if (!progInd->eh.pres) {
|
if (!progInd->eh.pres) {
|
||||||
return FTDM_FAIL;
|
return FTDM_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (progInd->progDesc.pres) {
|
if (progInd->progDesc.pres) {
|
||||||
|
/* TODO: use get_ftdm_val function and table here */
|
||||||
switch (progInd->progDesc.val) {
|
switch (progInd->progDesc.val) {
|
||||||
case IN_PD_NOTETEISDN:
|
case IN_PD_NOTETEISDN:
|
||||||
val = SNGISDN_PROGIND_DESCR_NETE_ISDN;
|
val = SNGISDN_PROGIND_DESCR_NETE_ISDN;
|
||||||
@ -462,19 +510,11 @@ ftdm_status_t set_calling_num(ftdm_channel_t *ftdmchan, CgPtyNmb *cgPtyNmb)
|
|||||||
cgPtyNmb->presInd0.val = caller_data->pres;
|
cgPtyNmb->presInd0.val = caller_data->pres;
|
||||||
|
|
||||||
cgPtyNmb->nmbPlanId.pres = PRSNT_NODEF;
|
cgPtyNmb->nmbPlanId.pres = PRSNT_NODEF;
|
||||||
if (caller_data->cid_num.plan >= FTDM_NPI_INVALID) {
|
cgPtyNmb->nmbPlanId.val = get_trillium_val(npi_codes, caller_data->cid_num.plan, IN_NP_UNK);
|
||||||
cgPtyNmb->nmbPlanId.val = FTDM_NPI_UNKNOWN;
|
|
||||||
} else {
|
|
||||||
cgPtyNmb->nmbPlanId.val = caller_data->cid_num.plan;
|
|
||||||
}
|
|
||||||
|
|
||||||
cgPtyNmb->typeNmb1.pres = PRSNT_NODEF;
|
cgPtyNmb->typeNmb1.pres = PRSNT_NODEF;
|
||||||
|
|
||||||
if (caller_data->cid_num.type >= FTDM_TON_INVALID) {
|
cgPtyNmb->typeNmb1.val = get_trillium_val(ton_codes, caller_data->cid_num.type, IN_TON_UNK);
|
||||||
cgPtyNmb->typeNmb1.val = FTDM_TON_UNKNOWN;
|
|
||||||
} else {
|
|
||||||
cgPtyNmb->typeNmb1.val = caller_data->cid_num.type;
|
|
||||||
}
|
|
||||||
|
|
||||||
cgPtyNmb->nmbDigits.pres = PRSNT_NODEF;
|
cgPtyNmb->nmbDigits.pres = PRSNT_NODEF;
|
||||||
cgPtyNmb->nmbDigits.len = len;
|
cgPtyNmb->nmbDigits.len = len;
|
||||||
@ -508,7 +548,7 @@ ftdm_status_t set_calling_num2(ftdm_channel_t *ftdmchan, CgPtyNmb *cgPtyNmb)
|
|||||||
|
|
||||||
val = FTDM_SCREENING_INVALID;
|
val = FTDM_SCREENING_INVALID;
|
||||||
string = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "isdn.cg_pty2.screening_ind");
|
string = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "isdn.cg_pty2.screening_ind");
|
||||||
if ((string != NULL) && (*string)) {
|
if (!ftdm_strlen_zero(string)) {
|
||||||
val = ftdm_str2ftdm_screening(string);
|
val = ftdm_str2ftdm_screening(string);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -525,7 +565,7 @@ ftdm_status_t set_calling_num2(ftdm_channel_t *ftdmchan, CgPtyNmb *cgPtyNmb)
|
|||||||
|
|
||||||
val = FTDM_PRES_INVALID;
|
val = FTDM_PRES_INVALID;
|
||||||
string = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "isdn.cg_pty2.presentation_ind");
|
string = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "isdn.cg_pty2.presentation_ind");
|
||||||
if ((string != NULL) && (*string)) {
|
if (!ftdm_strlen_zero(string)) {
|
||||||
val = ftdm_str2ftdm_presentation(string);
|
val = ftdm_str2ftdm_presentation(string);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -540,14 +580,14 @@ ftdm_status_t set_calling_num2(ftdm_channel_t *ftdmchan, CgPtyNmb *cgPtyNmb)
|
|||||||
|
|
||||||
val = FTDM_NPI_INVALID;
|
val = FTDM_NPI_INVALID;
|
||||||
string = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "isdn.cg_pty2.npi");
|
string = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "isdn.cg_pty2.npi");
|
||||||
if ((string != NULL) && (*string)) {
|
if (!ftdm_strlen_zero(string)) {
|
||||||
val = ftdm_str2ftdm_npi(string);
|
val = ftdm_str2ftdm_npi(string);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (val == FTDM_NPI_INVALID) {
|
if (val == FTDM_NPI_INVALID) {
|
||||||
cgPtyNmb->nmbPlanId.val = caller_data->cid_num.plan;
|
cgPtyNmb->nmbPlanId.val = caller_data->cid_num.plan;
|
||||||
} else {
|
} else {
|
||||||
cgPtyNmb->nmbPlanId.val = val;
|
cgPtyNmb->nmbPlanId.val = get_trillium_val(npi_codes, val, IN_NP_UNK);
|
||||||
}
|
}
|
||||||
|
|
||||||
cgPtyNmb->typeNmb1.pres = PRSNT_NODEF;
|
cgPtyNmb->typeNmb1.pres = PRSNT_NODEF;
|
||||||
@ -555,14 +595,14 @@ ftdm_status_t set_calling_num2(ftdm_channel_t *ftdmchan, CgPtyNmb *cgPtyNmb)
|
|||||||
/* Type of Number */
|
/* Type of Number */
|
||||||
val = FTDM_TON_INVALID;
|
val = FTDM_TON_INVALID;
|
||||||
string = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "isdn.cg_pty2.ton");
|
string = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "isdn.cg_pty2.ton");
|
||||||
if ((string != NULL) && (*string)) {
|
if (!ftdm_strlen_zero(string)) {
|
||||||
val = ftdm_str2ftdm_ton(string);
|
val = ftdm_str2ftdm_ton(string);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (val == FTDM_TON_INVALID) {
|
if (val == FTDM_TON_INVALID) {
|
||||||
cgPtyNmb->typeNmb1.val = caller_data->cid_num.type;
|
cgPtyNmb->typeNmb1.val = caller_data->cid_num.type;
|
||||||
} else {
|
} else {
|
||||||
cgPtyNmb->typeNmb1.val = val;
|
cgPtyNmb->typeNmb1.val = get_trillium_val(ton_codes, val, IN_TON_UNK);
|
||||||
}
|
}
|
||||||
return FTDM_SUCCESS;
|
return FTDM_SUCCESS;
|
||||||
}
|
}
|
||||||
@ -575,21 +615,14 @@ ftdm_status_t set_called_num(ftdm_channel_t *ftdmchan, CdPtyNmb *cdPtyNmb)
|
|||||||
if (!len) {
|
if (!len) {
|
||||||
return FTDM_SUCCESS;
|
return FTDM_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
cdPtyNmb->eh.pres = PRSNT_NODEF;
|
cdPtyNmb->eh.pres = PRSNT_NODEF;
|
||||||
|
|
||||||
cdPtyNmb->nmbPlanId.pres = PRSNT_NODEF;
|
cdPtyNmb->nmbPlanId.pres = PRSNT_NODEF;
|
||||||
if (caller_data->dnis.plan >= FTDM_NPI_INVALID) {
|
cdPtyNmb->nmbPlanId.val = get_trillium_val(npi_codes, caller_data->dnis.plan, IN_NP_UNK);
|
||||||
cdPtyNmb->nmbPlanId.val = FTDM_NPI_UNKNOWN;
|
|
||||||
} else {
|
|
||||||
cdPtyNmb->nmbPlanId.val = caller_data->dnis.plan;
|
|
||||||
}
|
|
||||||
|
|
||||||
cdPtyNmb->typeNmb0.pres = PRSNT_NODEF;
|
cdPtyNmb->typeNmb0.pres = PRSNT_NODEF;
|
||||||
if (caller_data->dnis.type >= FTDM_TON_INVALID) {
|
cdPtyNmb->typeNmb0.val = get_trillium_val(ton_codes, caller_data->dnis.type, IN_TON_UNK);
|
||||||
cdPtyNmb->typeNmb0.val = FTDM_TON_UNKNOWN;
|
|
||||||
} else {
|
|
||||||
cdPtyNmb->typeNmb0.val = caller_data->dnis.type;
|
|
||||||
}
|
|
||||||
|
|
||||||
cdPtyNmb->nmbDigits.pres = PRSNT_NODEF;
|
cdPtyNmb->nmbDigits.pres = PRSNT_NODEF;
|
||||||
cdPtyNmb->nmbDigits.len = len;
|
cdPtyNmb->nmbDigits.len = len;
|
||||||
@ -610,18 +643,10 @@ ftdm_status_t set_redir_num(ftdm_channel_t *ftdmchan, RedirNmb *redirNmb)
|
|||||||
redirNmb->eh.pres = PRSNT_NODEF;
|
redirNmb->eh.pres = PRSNT_NODEF;
|
||||||
|
|
||||||
redirNmb->nmbPlanId.pres = PRSNT_NODEF;
|
redirNmb->nmbPlanId.pres = PRSNT_NODEF;
|
||||||
if (caller_data->rdnis.plan >= FTDM_NPI_INVALID) {
|
redirNmb->nmbPlanId.val = get_trillium_val(npi_codes, caller_data->rdnis.plan, IN_NP_UNK);
|
||||||
redirNmb->nmbPlanId.val = FTDM_NPI_UNKNOWN;
|
|
||||||
} else {
|
|
||||||
redirNmb->nmbPlanId.val = caller_data->rdnis.plan;
|
|
||||||
}
|
|
||||||
|
|
||||||
redirNmb->typeNmb.pres = PRSNT_NODEF;
|
redirNmb->typeNmb.pres = PRSNT_NODEF;
|
||||||
if (caller_data->rdnis.type >= FTDM_TON_INVALID) {
|
redirNmb->typeNmb.val = get_trillium_val(ton_codes, caller_data->rdnis.type, IN_TON_UNK);
|
||||||
redirNmb->typeNmb.val = FTDM_TON_UNKNOWN;
|
|
||||||
} else {
|
|
||||||
redirNmb->typeNmb.val = caller_data->rdnis.type;
|
|
||||||
}
|
|
||||||
|
|
||||||
redirNmb->nmbDigits.pres = PRSNT_NODEF;
|
redirNmb->nmbDigits.pres = PRSNT_NODEF;
|
||||||
redirNmb->nmbDigits.len = len;
|
redirNmb->nmbDigits.len = len;
|
||||||
|
@ -241,12 +241,12 @@ FTDM_STR2ENUM_P(ftdm_str2ftdm_ton, ftdm_ton2str, ftdm_ton_t)
|
|||||||
/*! Numbering Plan Identification (NPI) */
|
/*! Numbering Plan Identification (NPI) */
|
||||||
typedef enum {
|
typedef enum {
|
||||||
FTDM_NPI_UNKNOWN = 0,
|
FTDM_NPI_UNKNOWN = 0,
|
||||||
FTDM_NPI_ISDN = 1,
|
FTDM_NPI_ISDN,
|
||||||
FTDM_NPI_DATA = 3,
|
FTDM_NPI_DATA,
|
||||||
FTDM_NPI_TELEX = 4,
|
FTDM_NPI_TELEX,
|
||||||
FTDM_NPI_NATIONAL = 8,
|
FTDM_NPI_NATIONAL,
|
||||||
FTDM_NPI_PRIVATE = 9,
|
FTDM_NPI_PRIVATE,
|
||||||
FTDM_NPI_RESERVED = 10,
|
FTDM_NPI_RESERVED,
|
||||||
FTDM_NPI_INVALID
|
FTDM_NPI_INVALID
|
||||||
} ftdm_npi_t;
|
} ftdm_npi_t;
|
||||||
#define NPI_STRINGS "unknown", "ISDN", "data", "telex", "national", "private", "reserved", "invalid"
|
#define NPI_STRINGS "unknown", "ISDN", "data", "telex", "national", "private", "reserved", "invalid"
|
||||||
|
Loading…
x
Reference in New Issue
Block a user