]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
freetdm: ISDN - Fix for segfault when setting outbound-called-npi=e164
authorDavid Yat Sin <dyatsin@sangoma.com>
Mon, 9 May 2011 22:04:07 +0000 (18:04 -0400)
committerDavid Yat Sin <dyatsin@sangoma.com>
Mon, 9 May 2011 22:04:07 +0000 (18:04 -0400)
libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h
libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_support.c
libs/freetdm/src/include/freetdm.h

index 902729d01ceca8d08f80606d6a102d5ff70d14a7..ac69fa8d660a8d64f99ce4edb2936e7db180b3d5 100644 (file)
@@ -292,6 +292,12 @@ typedef struct ftdm_sngisdn_data {
        sngisdn_span_data_t *spans[MAX_L1_LINKS+1]; /* spans are indexed by link_id */
 }ftdm_sngisdn_data_t;
 
+typedef struct ftdm2trillium
+{
+       uint8_t ftdm_val;
+       uint8_t trillium_val;
+}ftdm2trillium_t;
+
 
 /* TODO implement these 2 functions */
 #define ISDN_FUNC_TRACE_ENTER(a)
index 880b61efeb90db6e4a95bd80a68d9ac7cc52b588..edad62fc0ded3b263871116d4a7c26d5e21b67ff 100644 (file)
@@ -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_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;
 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)
 {
        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) {
-               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) {
-               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) {
@@ -281,11 +327,11 @@ ftdm_status_t get_redir_num(ftdm_channel_t *ftdmchan, RedirNmb *redirNmb)
        }
 
        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) {
-               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) {
@@ -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)
 {
        uint8_t val;
+
        if (!progInd->eh.pres) {
                return FTDM_FAIL;
        }
 
        if (progInd->progDesc.pres) {
+               /* TODO: use get_ftdm_val function and table here */
                switch (progInd->progDesc.val) {
                        case IN_PD_NOTETEISDN:
                                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->nmbPlanId.pres        = PRSNT_NODEF;
-       if (caller_data->cid_num.plan >= FTDM_NPI_INVALID) {
-               cgPtyNmb->nmbPlanId.val         = FTDM_NPI_UNKNOWN;
-       } else {
-               cgPtyNmb->nmbPlanId.val         = caller_data->cid_num.plan;
-       }
+       cgPtyNmb->nmbPlanId.val = get_trillium_val(npi_codes, caller_data->cid_num.plan, IN_NP_UNK);
 
        cgPtyNmb->typeNmb1.pres         = PRSNT_NODEF;
 
-       if (caller_data->cid_num.type >= FTDM_TON_INVALID) {
-               cgPtyNmb->typeNmb1.val          = FTDM_TON_UNKNOWN;
-       } else {
-               cgPtyNmb->typeNmb1.val          = caller_data->cid_num.type;
-       }
+       cgPtyNmb->typeNmb1.val = get_trillium_val(ton_codes, caller_data->cid_num.type, IN_TON_UNK);
 
        cgPtyNmb->nmbDigits.pres        = PRSNT_NODEF;
        cgPtyNmb->nmbDigits.len         = len;
@@ -508,7 +548,7 @@ ftdm_status_t set_calling_num2(ftdm_channel_t *ftdmchan, CgPtyNmb *cgPtyNmb)
 
        val = FTDM_SCREENING_INVALID;
        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);
        }
 
@@ -525,7 +565,7 @@ ftdm_status_t set_calling_num2(ftdm_channel_t *ftdmchan, CgPtyNmb *cgPtyNmb)
        
        val = FTDM_PRES_INVALID;
        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);
        }
 
@@ -540,14 +580,14 @@ ftdm_status_t set_calling_num2(ftdm_channel_t *ftdmchan, CgPtyNmb *cgPtyNmb)
        
        val = FTDM_NPI_INVALID;
        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);
        }
 
        if (val == FTDM_NPI_INVALID) {
                cgPtyNmb->nmbPlanId.val = caller_data->cid_num.plan;
        } else {
-               cgPtyNmb->nmbPlanId.val = val;
+               cgPtyNmb->nmbPlanId.val = get_trillium_val(npi_codes, val, IN_NP_UNK);
        }
 
        cgPtyNmb->typeNmb1.pres         = PRSNT_NODEF;
@@ -555,14 +595,14 @@ ftdm_status_t set_calling_num2(ftdm_channel_t *ftdmchan, CgPtyNmb *cgPtyNmb)
        /* Type of Number */
        val = FTDM_TON_INVALID;
        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);
        }
 
        if (val == FTDM_TON_INVALID) {
                cgPtyNmb->typeNmb1.val = caller_data->cid_num.type;
        } else {
-               cgPtyNmb->typeNmb1.val = val;
+               cgPtyNmb->typeNmb1.val = get_trillium_val(ton_codes, val, IN_TON_UNK);
        }
        return FTDM_SUCCESS;
 }
@@ -575,21 +615,14 @@ ftdm_status_t set_called_num(ftdm_channel_t *ftdmchan, CdPtyNmb *cdPtyNmb)
        if (!len) {
                return FTDM_SUCCESS;
        }
-       cdPtyNmb->eh.pres           = PRSNT_NODEF;
+       
+       cdPtyNmb->eh.pres                       = PRSNT_NODEF;
 
-       cdPtyNmb->nmbPlanId.pres      = PRSNT_NODEF;
-       if (caller_data->dnis.plan >= FTDM_NPI_INVALID) {
-               cdPtyNmb->nmbPlanId.val       = FTDM_NPI_UNKNOWN;
-       } else {
-               cdPtyNmb->nmbPlanId.val       = caller_data->dnis.plan;
-       }
+       cdPtyNmb->nmbPlanId.pres        = PRSNT_NODEF;
+       cdPtyNmb->nmbPlanId.val         = get_trillium_val(npi_codes, caller_data->dnis.plan, IN_NP_UNK);
        
-       cdPtyNmb->typeNmb0.pres       = PRSNT_NODEF;
-       if (caller_data->dnis.type >= FTDM_TON_INVALID) {
-               cdPtyNmb->typeNmb0.val        = FTDM_TON_UNKNOWN;
-       } else {
-               cdPtyNmb->typeNmb0.val        = caller_data->dnis.type;
-       }
+       cdPtyNmb->typeNmb0.pres         = PRSNT_NODEF;
+       cdPtyNmb->typeNmb0.val          = get_trillium_val(ton_codes, caller_data->dnis.type, IN_TON_UNK);
 
        cdPtyNmb->nmbDigits.pres = PRSNT_NODEF;
        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->nmbPlanId.pres        = PRSNT_NODEF;
-       if (caller_data->rdnis.plan >= FTDM_NPI_INVALID) {
-               redirNmb->nmbPlanId.val = FTDM_NPI_UNKNOWN;
-       } else {
-               redirNmb->nmbPlanId.val = caller_data->rdnis.plan;
-       }
+       redirNmb->nmbPlanId.val         = get_trillium_val(npi_codes, caller_data->rdnis.plan, IN_NP_UNK);
 
        redirNmb->typeNmb.pres          = PRSNT_NODEF;
-       if (caller_data->rdnis.type >= FTDM_TON_INVALID) {
-               redirNmb->typeNmb.val           = FTDM_TON_UNKNOWN;
-       } else {
-               redirNmb->typeNmb.val           = caller_data->rdnis.type;
-       }
+       redirNmb->typeNmb.val           = get_trillium_val(ton_codes, caller_data->rdnis.type, IN_TON_UNK);
 
        redirNmb->nmbDigits.pres = PRSNT_NODEF;
        redirNmb->nmbDigits.len = len;
@@ -1103,9 +1128,9 @@ ftdm_bearer_cap_t sngisdn_get_infoTranCap_from_stack(uint8_t bearer_capability)
 {
        switch(bearer_capability) {
        case IN_ITC_SPEECH:
-               return FTDM_BEARER_CAP_SPEECH;          
+               return FTDM_BEARER_CAP_SPEECH;
        case IN_ITC_UNRDIG:
-               return FTDM_BEARER_CAP_64K_UNRESTRICTED;                
+               return FTDM_BEARER_CAP_64K_UNRESTRICTED;
        case IN_ITC_A31KHZ:
                return FTDM_BEARER_CAP_3_1KHZ_AUDIO;
        default:
index 6ab518a6e38f579c6a1d59c4f073a6fb32ffecba..3bc2f5b25dcd27e9a385e3bdc9326cedc6215e2e 100755 (executable)
@@ -241,12 +241,12 @@ FTDM_STR2ENUM_P(ftdm_str2ftdm_ton, ftdm_ton2str, ftdm_ton_t)
 /*! Numbering Plan Identification (NPI) */
 typedef enum {
        FTDM_NPI_UNKNOWN = 0,
-       FTDM_NPI_ISDN = 1,
-       FTDM_NPI_DATA = 3,
-       FTDM_NPI_TELEX = 4,
-       FTDM_NPI_NATIONAL = 8,
-       FTDM_NPI_PRIVATE = 9,
-       FTDM_NPI_RESERVED = 10,
+       FTDM_NPI_ISDN,
+       FTDM_NPI_DATA,
+       FTDM_NPI_TELEX,
+       FTDM_NPI_NATIONAL,
+       FTDM_NPI_PRIVATE,
+       FTDM_NPI_RESERVED,
        FTDM_NPI_INVALID
 } ftdm_npi_t;
 #define NPI_STRINGS "unknown", "ISDN", "data", "telex", "national", "private", "reserved", "invalid"