]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
freetdm: ISDN - Added support to push raw facility IE from CONNECT messages
authorDavid Yat Sin <dyatsin@sangoma.com>
Fri, 3 Dec 2010 19:22:01 +0000 (14:22 -0500)
committerDavid Yat Sin <dyatsin@sangoma.com>
Fri, 3 Dec 2010 19:31:00 +0000 (14:31 -0500)
libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_hndl.c
libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_out.c
libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_support.c
libs/freetdm/src/ftmod/ftmod_wanpipe/ftmod_wanpipe.c

index a7c111e905a29bd7d19e913740bfd7c143101406..0e68e2a07c66c864821ded75d273fcab701f4bda 100644 (file)
@@ -131,11 +131,13 @@ void sngisdn_process_con_ind (sngisdn_event_data_t *sngisdn_event)
                        get_called_num(ftdmchan, &conEvnt->cdPtyNmb);
                        get_redir_num(ftdmchan, &conEvnt->redirNmb);
                        get_calling_subaddr(ftdmchan, &conEvnt->cgPtySad);
+                       get_prog_ind_ie(ftdmchan, &conEvnt->progInd);
+                       get_facility_ie(ftdmchan, &conEvnt->facilityStr);
                        
                        if (get_calling_name_from_display(ftdmchan, &conEvnt->display) != FTDM_SUCCESS) {
                                get_calling_name_from_usr_usr(ftdmchan, &conEvnt->usrUsr);
                        }
-                       get_prog_ind_ie(ftdmchan, &conEvnt->progInd);
+
                        
                        ftdm_log_chan(sngisdn_info->ftdmchan, FTDM_LOG_INFO, "Incoming call: Called No:[%s] Calling No:[%s]\n", ftdmchan->caller_data.dnis.digits, ftdmchan->caller_data.cid_num.digits);
 
@@ -151,40 +153,34 @@ void sngisdn_process_con_ind (sngisdn_event_data_t *sngisdn_event)
                                }
                        }
 
-                       if (conEvnt->facilityStr.eh.pres) {
-                               if (signal_data->facility_ie_decode == SNGISDN_OPT_FALSE) {
-                                       get_facility_ie(ftdmchan, &conEvnt->facilityStr);
-                               } else if (signal_data->facility == SNGISDN_OPT_TRUE) {
-                                       if (signal_data->switchtype == SNGISDN_SWITCH_NI2) {
-                                               /* Verify whether the Caller Name will come in a subsequent FACILITY message */
-                                               uint16_t ret_val;
-                                               char retrieved_str[255];
-
-                                               ret_val = sng_isdn_retrieve_facility_caller_name(conEvnt->facilityStr.facilityStr.val, conEvnt->facilityStr.facilityStr.len, retrieved_str);
-                                               /*
-                                                       return values for "sng_isdn_retrieve_facility_information_following":
-                                                       If there will be no information following, or fails to decode IE, returns -1
-                                                       If there will be no information following, but current FACILITY IE contains a caller name, returns 0
-                                                       If there will be information following, returns 1
-                                               */
-
-                                               if (ret_val == 1) {
-                                                       ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "Expecting Caller name in FACILITY\n");
-                                                       ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_GET_CALLERID);
-                                                       /* Launch timer in case we never get a FACILITY msg */
-                                                       if (signal_data->facility_timeout) {
-                                                               ftdm_sched_timer(signal_data->sched, "facility_timeout", signal_data->facility_timeout,
-                                                                               sngisdn_facility_timeout, (void*) sngisdn_info, &sngisdn_info->timers[SNGISDN_TIMER_FACILITY]);
-                                                       }
-                                                       break;
-                                               } else if (ret_val == 0) {
-                                                       strcpy(ftdmchan->caller_data.cid_name, retrieved_str);
-                                               }
-                                               break;
+                       /* this should be in get_facility_ie function, fix this later */
+                       if (signal_data->facility == SNGISDN_OPT_TRUE && conEvnt->facilityStr.eh.pres) {
+                               /* Verify whether the Caller Name will come in a subsequent FACILITY message */
+                               uint16_t ret_val;
+                               char retrieved_str[255];
+
+                               ret_val = sng_isdn_retrieve_facility_caller_name(conEvnt->facilityStr.facilityStr.val, conEvnt->facilityStr.facilityStr.len, retrieved_str);
+                                        /*
+                                                return values for "sng_isdn_retrieve_facility_information_following":
+                               If there will be no information following, or fails to decode IE, returns -1
+                               If there will be no information following, but current FACILITY IE contains a caller name, returns 0
+                               If there will be information following, returns 1
+                                                                               */
+
+                               if (ret_val == 1) {
+                                       ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "Expecting Caller name in FACILITY\n");
+                                       ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_GET_CALLERID);
+                                       /* Launch timer in case we never get a FACILITY msg */
+                                       if (signal_data->facility_timeout) {
+                                               ftdm_sched_timer(signal_data->sched, "facility_timeout", signal_data->facility_timeout,
+                                                                                sngisdn_facility_timeout, (void*) sngisdn_info, &sngisdn_info->timers[SNGISDN_TIMER_FACILITY]);
                                        }
+                                       break;
+                               } else if (ret_val == 0) {
+                                       strcpy(ftdmchan->caller_data.cid_name, retrieved_str);
                                }
                        }
-
+                       
                        if (signal_data->overlap_dial == SNGISDN_OPT_TRUE && !conEvnt->sndCmplt.eh.pres) {
                                ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_COLLECT);
                        } else {
@@ -284,6 +280,7 @@ void sngisdn_process_con_cfm (sngisdn_event_data_t *sngisdn_event)
                        case FTDM_CHANNEL_STATE_PROGRESS_MEDIA:
                        case FTDM_CHANNEL_STATE_DIALING:
                                get_prog_ind_ie(ftdmchan, &cnStEvnt->progInd);
+                               get_facility_ie(ftdmchan, &cnStEvnt->facilityStr);
                                ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_UP);
                                break;
                        case FTDM_CHANNEL_STATE_HANGUP_COMPLETE:
@@ -351,6 +348,7 @@ void sngisdn_process_cnst_ind (sngisdn_event_data_t *sngisdn_event)
                case MI_PROGRESS:
                case MI_ALERTING:
                        get_prog_ind_ie(ftdmchan, &cnStEvnt->progInd);
+                       get_facility_ie(ftdmchan, &cnStEvnt->facilityStr);
 
                        if (signal_data->ignore_cause_value != SNGISDN_OPT_TRUE &&
                                cnStEvnt->causeDgn[0].eh.pres && cnStEvnt->causeDgn[0].causeVal.pres) {
@@ -460,7 +458,6 @@ void sngisdn_process_disc_ind (sngisdn_event_data_t *sngisdn_event)
        uint32_t spInstId = sngisdn_event->spInstId;
        sngisdn_chan_data_t *sngisdn_info = sngisdn_event->sngisdn_info;
        ftdm_channel_t *ftdmchan = sngisdn_info->ftdmchan;
-       sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*) ftdmchan->span->signal_data;
        
        DiscEvnt *discEvnt = &sngisdn_event->event.discEvnt;
 
@@ -475,14 +472,9 @@ void sngisdn_process_disc_ind (sngisdn_event_data_t *sngisdn_event)
                case FTDM_CHANNEL_STATE_PROCEED:
                case FTDM_CHANNEL_STATE_PROGRESS:
                case FTDM_CHANNEL_STATE_PROGRESS_MEDIA:
-               case FTDM_CHANNEL_STATE_UP:                     
-                       if (discEvnt->facilityStr.eh.pres) {
-                               if (signal_data->facility_ie_decode == SNGISDN_OPT_FALSE) {
-                                       get_facility_ie(ftdmchan, &discEvnt->facilityStr);
-                               } else {
-                                       /* Call libsng_isdn facility decode function and copy variables here */
-                               }
-                       }
+               case FTDM_CHANNEL_STATE_UP:
+                       get_facility_ie(ftdmchan, &discEvnt->facilityStr);
+
                        if (discEvnt->causeDgn[0].eh.pres && discEvnt->causeDgn[0].causeVal.pres) {
                                ftdmchan->caller_data.hangup_cause = discEvnt->causeDgn[0].causeVal.val;
                        } else {
@@ -526,7 +518,6 @@ void sngisdn_process_rel_ind (sngisdn_event_data_t *sngisdn_event)
        uint32_t spInstId = sngisdn_event->spInstId;
        sngisdn_chan_data_t *sngisdn_info = sngisdn_event->sngisdn_info;        
        ftdm_channel_t *ftdmchan = sngisdn_info->ftdmchan;
-       sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*) ftdmchan->span->signal_data;
        
        RelEvnt *relEvnt = &sngisdn_event->event.relEvnt;
 
@@ -573,13 +564,7 @@ void sngisdn_process_rel_ind (sngisdn_event_data_t *sngisdn_event)
                        if (((sngisdn_chan_data_t*)ftdmchan->call_data)->suInstId == suInstId ||
                                                                        ((sngisdn_chan_data_t*)ftdmchan->call_data)->spInstId == spInstId) {
 
-                               if (relEvnt->facilityStr.eh.pres) {
-                                       if (signal_data->facility_ie_decode == SNGISDN_OPT_FALSE) {
-                                               get_facility_ie(ftdmchan, &relEvnt->facilityStr);
-                                       } else {
-                                               /* Call libsng_isdn facility decode function and copy variables here */
-                                       }
-                               }
+                               get_facility_ie(ftdmchan, &relEvnt->facilityStr);
                                
                                if (relEvnt->causeDgn[0].eh.pres && relEvnt->causeDgn[0].causeVal.pres) {
                                        ftdmchan->caller_data.hangup_cause = relEvnt->causeDgn[0].causeVal.val;
@@ -790,11 +775,7 @@ void sngisdn_process_fac_ind (sngisdn_event_data_t *sngisdn_event)
                        {
                                ftdm_sigmsg_t sigev;
                                if (facEvnt->facElmt.facStr.pres) {
-                                       if (signal_data->facility_ie_decode == SNGISDN_OPT_FALSE) {
-                                               get_facility_ie_str(ftdmchan, &facEvnt->facElmt.facStr.val[2], facEvnt->facElmt.facStr.len);
-                                       } else {
-                                               /* Call libsng_isdn facility decode function and copy variables here */
-                                       }
+                                       get_facility_ie_str(ftdmchan, &facEvnt->facElmt.facStr.val[2], facEvnt->facElmt.facStr.len);
                                }
                                memset(&sigev, 0, sizeof(sigev));
                                sigev.chan_id = ftdmchan->chan_id;
index 08b14a08cea27a560846643e9485c7a5424afc3f..1a7814a75befbb9738c47e1e0e41056d1fc596b0 100644 (file)
@@ -310,6 +310,7 @@ void sngisdn_snd_proceed(ftdm_channel_t *ftdmchan)
                cnStEvnt.chanId.chanNmbSlotMap.val[0] = ftdmchan->physical_chan_id;
        }
 
+       set_facility_ie(ftdmchan, &cnStEvnt.facilityStr);
 
        ftdm_log_chan(ftdmchan, FTDM_LOG_INFO, "Sending PROCEED (suId:%d suInstId:%u spInstId:%u dchan:%d ces:%d)\n", signal_data->cc_id, sngisdn_info->suInstId, sngisdn_info->spInstId, signal_data->dchan_id, sngisdn_info->ces);
 
@@ -341,6 +342,7 @@ void sngisdn_snd_progress(ftdm_channel_t *ftdmchan, ftdm_sngisdn_progind_t prog_
 
        memset(&cnStEvnt, 0, sizeof(cnStEvnt)); 
        set_prog_ind_ie(ftdmchan, &cnStEvnt.progInd, prog_ind);
+       set_facility_ie(ftdmchan, &cnStEvnt.facilityStr);
 
        ftdm_log_chan(ftdmchan, FTDM_LOG_INFO, "Sending PROGRESS (suId:%d suInstId:%u spInstId:%u dchan:%d ces:%d)\n", signal_data->cc_id, sngisdn_info->suInstId, sngisdn_info->spInstId, signal_data->dchan_id, sngisdn_info->ces);
        if(sng_isdn_con_status(signal_data->cc_id, sngisdn_info->suInstId, sngisdn_info->spInstId,&cnStEvnt, MI_PROGRESS, signal_data->dchan_id, sngisdn_info->ces)) {
@@ -366,6 +368,7 @@ void sngisdn_snd_alert(ftdm_channel_t *ftdmchan, ftdm_sngisdn_progind_t prog_ind
        memset(&cnStEvnt, 0, sizeof(cnStEvnt));
 
        set_prog_ind_ie(ftdmchan, &cnStEvnt.progInd, prog_ind);
+       set_facility_ie(ftdmchan, &cnStEvnt.facilityStr);
 
        ftdm_log_chan(ftdmchan, FTDM_LOG_INFO, "Sending ALERT (suId:%d suInstId:%u spInstId:%u dchan:%d ces:%d)\n", signal_data->cc_id, sngisdn_info->suInstId, sngisdn_info->spInstId, signal_data->dchan_id, sngisdn_info->ces);
 
@@ -424,6 +427,7 @@ void sngisdn_snd_connect(ftdm_channel_t *ftdmchan)
        }
 
        set_prog_ind_ie(ftdmchan, &cnStEvnt.progInd, prog_ind);
+       set_facility_ie(ftdmchan, &cnStEvnt.facilityStr);
 
        ftdm_log_chan(ftdmchan, FTDM_LOG_INFO, "Sending CONNECT (suId:%d suInstId:%u spInstId:%u dchan:%d ces:%d)\n", signal_data->cc_id, sngisdn_info->suInstId, sngisdn_info->spInstId, signal_data->dchan_id, sngisdn_info->ces);
        if (sng_isdn_con_response(signal_data->cc_id, sngisdn_info->suInstId, sngisdn_info->spInstId, &cnStEvnt, signal_data->dchan_id, sngisdn_info->ces)) {
index 42bcd1e20ad7e7e06068164c09e33f60d1b525a6..6fd99adbc3df22a31ac44eb41d0c264608cc044c 100644 (file)
@@ -283,7 +283,7 @@ ftdm_status_t get_calling_subaddr(ftdm_channel_t *ftdmchan, CgPtySad *cgPtySad)
 }
 
 ftdm_status_t get_facility_ie(ftdm_channel_t *ftdmchan, FacilityStr *facilityStr)
-{      
+{
        if (!facilityStr->eh.pres) {
                return FTDM_FAIL;
        }
@@ -294,18 +294,25 @@ ftdm_status_t get_facility_ie(ftdm_channel_t *ftdmchan, FacilityStr *facilityStr
 ftdm_status_t get_facility_ie_str(ftdm_channel_t *ftdmchan, uint8_t *data, ftdm_size_t data_len)
 {
        ftdm_caller_data_t *caller_data = &ftdmchan->caller_data;
-       if (data_len > sizeof(caller_data->raw_data)-2) {
-               ftdm_log(FTDM_LOG_CRIT, "Length of Facility IE exceeds maximum length\n");
-               return FTDM_FAIL;
-       }
+       sngisdn_span_data_t *signal_data = (sngisdn_span_data_t*) ftdmchan->span->signal_data;
+       
+       if (signal_data->facility_ie_decode == SNGISDN_OPT_FALSE) {
+               if (data_len > sizeof(caller_data->raw_data)-2) {
+                       ftdm_log(FTDM_LOG_CRIT, "Length of Facility IE exceeds maximum length\n");
+                       return FTDM_FAIL;
+               }
 
-       memset(caller_data->raw_data, 0, sizeof(caller_data->raw_data));
-       /* Always include Facility IE identifier + len so this can be used as a sanity check by the user */
-       caller_data->raw_data[0] = SNGISDN_Q931_FACILITY_IE_ID;
-       caller_data->raw_data[1] = data_len;
+               memset(caller_data->raw_data, 0, sizeof(caller_data->raw_data));
+               /* Always include Facility IE identifier + len so this can be used as a sanity check by the user */
+               caller_data->raw_data[0] = SNGISDN_Q931_FACILITY_IE_ID;
+               caller_data->raw_data[1] = data_len;
        
-       memcpy(&caller_data->raw_data[2], data, data_len);
-       caller_data->raw_data_len = data_len+2;
+               memcpy(&caller_data->raw_data[2], data, data_len);
+               caller_data->raw_data_len = data_len+2;
+               ftdm_log_chan_msg(ftdmchan, FTDM_LOG_DEBUG, "Raw Facility IE copied available\n");
+       } else {
+               /* Call libsng_isdn to process facility IE's here */
+       }
        return FTDM_SUCCESS;
 }
 
index 72a57280d6c2b5e2277d49d42abf87b0e531da30..c8b8868acd3fdbbdef53daff9f525a64f9f17f3f 100644 (file)
@@ -945,7 +945,10 @@ static FIO_WRITE_FUNCTION(wanpipe_write)
        if (bsent > 0) {
                *datalen = bsent;
                if (ftdm_channel_test_feature(ftdmchan, FTDM_CHANNEL_FEATURE_IO_STATS)) {
-                       wanpipe_write_stats(ftdmchan, &hdrframe);
+                       /* BRI cards do not support TX queues for now */
+                       if(!FTDM_SPAN_IS_BRI(ftdmchan->span)) {
+                               wanpipe_write_stats(ftdmchan, &hdrframe);
+                       }
                }
                return FTDM_SUCCESS;
        }