]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
Support for sending Caller ID Name on 4ESS/5ESS
authorDavid Yat Sin <dyatsin@sangoma.com>
Thu, 3 Nov 2011 23:23:00 +0000 (19:23 -0400)
committerDavid Yat Sin <dyatsin@sangoma.com>
Thu, 3 Nov 2011 23:37:05 +0000 (19:37 -0400)
libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.c
libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.h
libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_cfg.c
libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_support.c

index c3aa964d4dfd493625f62d1886014a472be25501..262cd9d03df22cb82dbe1d2bbe3d581bb9dc987b 100644 (file)
@@ -1155,6 +1155,77 @@ static FIO_CONFIGURE_SPAN_SIGNALING_FUNCTION(ftdm_sangoma_isdn_span_config)
                return FTDM_FAIL;
        }
 
+       if (span_data->cid_name_method == SNGISDN_CID_NAME_AUTO) {
+               switch (span_data->switchtype) {
+                       case SNGISDN_SWITCH_EUROISDN:
+                               if (FTDM_SPAN_IS_BRI(span)) {
+                                       span_data->cid_name_method = SNGISDN_CID_NAME_USR_USR_IE;
+                               } else {
+                                       span_data->cid_name_method = SNGISDN_CID_NAME_DISPLAY_IE;
+                               }
+                               break;
+                       case SNGISDN_SWITCH_DMS100:
+                               span_data->cid_name_method = SNGISDN_CID_NAME_DISPLAY_IE;
+                               break;
+                       case SNGISDN_SWITCH_NI2:
+                       case SNGISDN_SWITCH_5ESS:
+                       case SNGISDN_SWITCH_4ESS:
+                               span_data->cid_name_method = SNGISDN_CID_NAME_FACILITY_IE;
+                               break;
+                       default:
+                               break;
+               }
+       }
+
+       if (span_data->send_cid_name == SNGISDN_OPT_DEFAULT) {
+               switch (span_data->switchtype) {
+                       case SNGISDN_SWITCH_EUROISDN:
+#ifdef SNGISDN_SUPPORT_CALLING_NAME_IN_FACILITY
+                       case SNGISDN_SWITCH_NI2:
+                       case SNGISDN_SWITCH_5ESS:
+                       case SNGISDN_SWITCH_4ESS:
+#endif
+                               if (span_data->signalling == SNGISDN_SIGNALING_NET) {
+                                       span_data->send_cid_name = SNGISDN_OPT_TRUE;
+                               } else {
+                                       span_data->send_cid_name = SNGISDN_OPT_FALSE;
+                               }
+                               break;
+                       case SNGISDN_SWITCH_DMS100:
+                               span_data->send_cid_name = SNGISDN_OPT_TRUE;
+                               break;
+#ifndef SNGISDN_SUPPORT_CALLING_NAME_IN_FACILITY
+                       case SNGISDN_SWITCH_NI2:
+                       case SNGISDN_SWITCH_5ESS:
+                       case SNGISDN_SWITCH_4ESS:
+                               span_data->send_cid_name = SNGISDN_OPT_FALSE;
+                               break;
+#endif
+                       default:
+                               span_data->send_cid_name = SNGISDN_OPT_FALSE;
+                               break;
+               }
+       } else if (span_data->send_cid_name == SNGISDN_OPT_TRUE) {
+               switch (span_data->switchtype) {
+                       case SNGISDN_SWITCH_NI2:
+                       case SNGISDN_SWITCH_5ESS:
+                       case SNGISDN_SWITCH_4ESS:
+#ifndef SNGISDN_SUPPORT_CALLING_NAME_IN_FACILITY
+                               ftdm_log(FTDM_LOG_WARNING, "Sending Calling Name in Facility IE not supported, please update your libsng_isdn library\n");
+                               span_data->send_cid_name = SNGISDN_OPT_FALSE;
+#endif
+                               break;
+                       case SNGISDN_SWITCH_INSNET: /* Don't know how to transmit caller ID name on INSNET */
+                       case SNGISDN_SWITCH_QSIG: /* It seems like QSIG does not support Caller ID */
+                               span_data->send_cid_name = SNGISDN_OPT_FALSE;
+                               break;
+                       case SNGISDN_SWITCH_EUROISDN:
+                               break;
+                       default:
+                               span_data->send_cid_name = SNGISDN_OPT_FALSE;
+                               break;
+               }
+       }
 
        span->start = ftdm_sangoma_isdn_start;
        span->stop = ftdm_sangoma_isdn_stop;
index 8d36511b9182bc7c3f4c7fab2591527c23b0e41d..a095b0d57ee025834eeb81bccaaebe4ab225132e 100644 (file)
@@ -132,6 +132,13 @@ typedef enum {
        SNGISDN_AVAIL_UP = 10,
 } sngisdn_avail_t;
 
+typedef enum {
+       SNGISDN_CID_NAME_AUTO,
+       SNGISDN_CID_NAME_DISPLAY_IE,
+       SNGISDN_CID_NAME_USR_USR_IE,
+       SNGISDN_CID_NAME_FACILITY_IE,
+} sngisdn_cid_name_t;
+
 typedef enum {
        SNGISDN_EVENT_CON_IND = 1,
        SNGISDN_EVENT_CON_CFM,
@@ -264,6 +271,8 @@ typedef struct sngisdn_span_data {
        uint8_t                 restart_opt;
        uint8_t                 restart_timeout;
        uint8_t                 force_sending_complete;
+       uint8_t                 cid_name_method;
+       uint8_t                 send_cid_name;
        char*                   local_numbers[SNGISDN_NUM_LOCAL_NUMBERS];
        ftdm_timer_id_t timers[SNGISDN_NUM_SPAN_TIMERS];
        ftdm_sched_t    *sched;
index b53c37fbe9eb2de747a39ccde60bab276258539b..486794ab44dfd3a36022714374975f6aaae7a9ac 100644 (file)
@@ -289,6 +289,9 @@ ftdm_status_t ftmod_isdn_parse_cfg(ftdm_conf_parameter_t *ftdm_parameters, ftdm_
        signal_data->att_remove_dtmf = SNGISDN_OPT_DEFAULT;
        signal_data->force_sending_complete = SNGISDN_OPT_DEFAULT;
 
+       signal_data->cid_name_method = SNGISDN_CID_NAME_AUTO;
+       signal_data->send_cid_name = SNGISDN_OPT_DEFAULT;
+       
        span->default_caller_data.dnis.plan = FTDM_NPI_INVALID;
        span->default_caller_data.dnis.type = FTDM_TON_INVALID;
        span->default_caller_data.cid_num.plan = FTDM_NPI_INVALID;
@@ -401,6 +404,30 @@ ftdm_status_t ftmod_isdn_parse_cfg(ftdm_conf_parameter_t *ftdm_parameters, ftdm_
 #else
                        ftdm_log(FTDM_LOG_WARNING, "chan-id-invert-extend-bit is not supported in your version of libsng_isdn\n");
 #endif
+               } else if (!strcasecmp(var, "cid-name-transmit-method")) {
+                       if (!strcasecmp(val, "display-ie")) {
+                               signal_data->cid_name_method = SNGISDN_CID_NAME_DISPLAY_IE;
+                       } else if (!strcasecmp(val, "user-user-ie")) {
+                               signal_data->cid_name_method = SNGISDN_CID_NAME_USR_USR_IE;
+                       } else if (!strcasecmp(val, "facility-ie")) {
+                               signal_data->cid_name_method = SNGISDN_CID_NAME_FACILITY_IE;
+                       } else if (!strcasecmp(val, "auto") || !strcasecmp(val, "automatic") || !strcasecmp(val, "default")) {
+                               signal_data->cid_name_method = SNGISDN_CID_NAME_AUTO;
+                       } else {
+                               ftdm_log(FTDM_LOG_WARNING, "Invalid option %s for parameter %s\n", val, var);
+                               signal_data->cid_name_method = SNGISDN_CID_NAME_AUTO;
+                       }
+               } else if (!strcasecmp(var, "send-cid-name")) {
+                       if (!strcasecmp(val, "yes")) {
+                               signal_data->send_cid_name = SNGISDN_OPT_TRUE;
+                       } else if (!strcasecmp(val, "no")) {
+                               signal_data->send_cid_name = SNGISDN_OPT_FALSE;
+                       } else if (!strcasecmp(val, "auto") || !strcasecmp(val, "automatic") || !strcasecmp(val, "default")) {
+                               signal_data->send_cid_name = SNGISDN_OPT_DEFAULT;
+                       } else {
+                               ftdm_log(FTDM_LOG_WARNING, "Invalid option %s for parameter %s\n", val, var);
+                               signal_data->send_cid_name = SNGISDN_OPT_DEFAULT;
+                       }
                } else {
                        ftdm_log(FTDM_LOG_WARNING, "Ignoring unknown parameter %s\n", ftdm_parameters[paramindex].var);
                }
index d744ad2942b34c88e64556bc360b45eae9eed2d7..095221dcfaaff21a435650988c1386079ce8dbfb 100644 (file)
@@ -696,70 +696,61 @@ ftdm_status_t set_redir_num(ftdm_channel_t *ftdmchan, RedirNmb *redirNmb)
 ftdm_status_t set_calling_name(ftdm_channel_t *ftdmchan, ConEvnt *conEvnt)
 {
        uint8_t len;
-       ftdm_caller_data_t *caller_data = &ftdmchan->caller_data;
-       /* sngisdn_chan_data_t *sngisdn_info = ftdmchan->call_data; */
+       ftdm_caller_data_t *caller_data = &ftdmchan->caller_data;       
        sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*) ftdmchan->span->signal_data;
+       
 
        len = strlen(caller_data->cid_name);
        if (!len) {
                return FTDM_SUCCESS;
        }
 
-       if (ftdmchan->span->trunk_type == FTDM_TRUNK_BRI ||
-               ftdmchan->span->trunk_type == FTDM_TRUNK_BRI_PTMP) {
+       if (signal_data->send_cid_name == SNGISDN_OPT_FALSE) {
+               return FTDM_SUCCESS;
+       }
 
-               conEvnt->usrUsr.eh.pres = PRSNT_NODEF;
-               conEvnt->usrUsr.protocolDisc.pres = PRSNT_NODEF;
-               conEvnt->usrUsr.protocolDisc.val = PD_IA5; /* IA5 chars */
-               conEvnt->usrUsr.usrInfo.pres = PRSNT_NODEF;
-               conEvnt->usrUsr.usrInfo.len = len;
-               /* in sangoma_brid we used to send usr-usr info as <cid_name>!<calling_number>,
-               change to previous style if current one does not work */
-               memcpy(conEvnt->usrUsr.usrInfo.val, caller_data->cid_name, len);
-       } else {
-               switch (signal_data->switchtype) {
-               case SNGISDN_SWITCH_NI2:
+       switch(signal_data->cid_name_method) {
+               case SNGISDN_CID_NAME_FACILITY_IE:
 #ifdef SNGISDN_SUPPORT_CALLING_NAME_IN_FACILITY
-                       {
-                               if (signal_data->signalling == SNGISDN_SIGNALING_NET) {
-                                       sng_isdn_encode_facility_caller_name(caller_data->cid_name, conEvnt->facilityStr.facilityStr.val, &conEvnt->facilityStr.facilityStr.len);
-                                       conEvnt->facilityStr.eh.pres = PRSNT_NODEF;
-                                       conEvnt->facilityStr.facilityStr.pres = PRSNT_NODEF;
-                               }
-                       }
+                       /* Note: The Facility IE will be overwritten if user chose to transmit a Raw Facility IE */
+                       sng_isdn_encode_facility_caller_name(caller_data->cid_name, conEvnt->facilityStr.facilityStr.val, &conEvnt->facilityStr.facilityStr.len);
+                       conEvnt->facilityStr.eh.pres = PRSNT_NODEF;
+                       conEvnt->facilityStr.facilityStr.pres = PRSNT_NODEF;
 #endif
                        break;
-               case SNGISDN_SWITCH_EUROISDN:
-                       if (signal_data->signalling != SNGISDN_SIGNALING_NET) {
-                               break;
-                       }
-                       /* follow through */
-               case SNGISDN_SWITCH_5ESS:
-               case SNGISDN_SWITCH_4ESS:
-                       conEvnt->display.dispInfo.pres = PRSNT_NODEF;
-                       conEvnt->display.dispInfo.len = len;
-                       memcpy(conEvnt->display.dispInfo.val, caller_data->cid_name, len);
+               case SNGISDN_CID_NAME_USR_USR_IE:
+                       conEvnt->usrUsr.eh.pres = PRSNT_NODEF;
+                       conEvnt->usrUsr.protocolDisc.pres = PRSNT_NODEF;
+                       conEvnt->usrUsr.protocolDisc.val = PD_IA5; /* IA5 chars */
+                       conEvnt->usrUsr.usrInfo.pres = PRSNT_NODEF;
+                       conEvnt->usrUsr.usrInfo.len = len;
+                       /* in sangoma_brid we used to send usr-usr info as <cid_name>!<calling_number>,
+                       change to previous style if current one does not work */
+                       memcpy(conEvnt->usrUsr.usrInfo.val, caller_data->cid_name, len);
                        break;
-               case SNGISDN_SWITCH_DMS100:
-                       conEvnt->ntDisplay[0].eh.pres = PRSNT_NODEF;
-                       conEvnt->ntDisplay[0].dispTypeNt.pres = PRSNT_NODEF;
-                       conEvnt->ntDisplay[0].dispTypeNt.val = 0x01; /* Calling Party Name */
-                       conEvnt->ntDisplay[0].assocInfo.pres = PRSNT_NODEF;
-                       conEvnt->ntDisplay[0].assocInfo.val  = 0x03; /* Included */
-                       conEvnt->ntDisplay[0].eh.pres = PRSNT_NODEF;
-                       conEvnt->ntDisplay[0].eh.pres = PRSNT_NODEF;
-                       conEvnt->ntDisplay[0].dispInfo.pres = PRSNT_NODEF;
-                       conEvnt->ntDisplay[0].dispInfo.len = len;
-                       memcpy(conEvnt->ntDisplay[0].dispInfo.val, caller_data->cid_name, len);
-                       break;
-               case SNGISDN_SWITCH_QSIG:
-                       /* It seems like QSIG does not support Caller ID Name */
+               case SNGISDN_CID_NAME_DISPLAY_IE:
+                       if (signal_data->switchtype == SNGISDN_SWITCH_DMS100) {
+                               conEvnt->ntDisplay[0].eh.pres = PRSNT_NODEF;
+                               conEvnt->ntDisplay[0].dispTypeNt.pres = PRSNT_NODEF;
+                               conEvnt->ntDisplay[0].dispTypeNt.val = 0x01; /* Calling Party Name */
+                               conEvnt->ntDisplay[0].assocInfo.pres = PRSNT_NODEF;
+                               conEvnt->ntDisplay[0].assocInfo.val  = 0x03; /* Included */
+                               conEvnt->ntDisplay[0].eh.pres = PRSNT_NODEF;
+                               conEvnt->ntDisplay[0].eh.pres = PRSNT_NODEF;
+                               conEvnt->ntDisplay[0].dispInfo.pres = PRSNT_NODEF;
+                               conEvnt->ntDisplay[0].dispInfo.len = len;
+                               memcpy(conEvnt->ntDisplay[0].dispInfo.val, caller_data->cid_name, len);
+                       } else {
+                               conEvnt->display.eh.pres = PRSNT_NODEF;
+                               conEvnt->display.dispInfo.pres = PRSNT_NODEF;
+                               conEvnt->display.dispInfo.len = len;
+                               memcpy(conEvnt->display.dispInfo.val, caller_data->cid_name, len);
+                       }
                        break;
-               case SNGISDN_SWITCH_INSNET:
-                       /* Don't know how to transmit caller ID name on INSNET */
+               default:
                        break;
-               }
        }
+
        return FTDM_SUCCESS;
 }