]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
Merge branch 'master' into netborder
authorMoises Silva <moy@sangoma.com>
Wed, 5 Jan 2011 18:11:37 +0000 (13:11 -0500)
committerMoises Silva <moy@sangoma.com>
Wed, 5 Jan 2011 18:11:37 +0000 (13:11 -0500)
Conflicts:
libs/freetdm/src/ftdm_io.c
libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_trace.c
libs/freetdm/src/include/freetdm.h

1  2 
libs/freetdm/src/ftdm_io.c
libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn.c
libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_trace.c
libs/freetdm/src/include/freetdm.h

index 1fdb8671386bc5068965519e9db13da35e3297df,21354c4442fda44186debe3493125b9d419082b9..076e8ba9f3d14a4d29e3de2751ef8a4c77d19893
@@@ -2478,9 -2383,7 +2386,6 @@@ FT_DECLARE(ftdm_status_t) _ftdm_channel
        UNREFERENCED_PARAMETER(func);
        UNREFERENCED_PARAMETER(line);
  #endif
-       ftdm_call_set_call_id(&ftdmchan->caller_data);
-       ftdm_wait_for_flag_cleared(ftdmchan, FTDM_CHANNEL_STATE_CHANGE, 100);
-       ftdm_channel_unlock(ftdmchan);
 -
        return status;
  }
  
@@@ -5116,18 -5080,28 +5082,38 @@@ FT_DECLARE(ftdm_status_t) ftdm_configur
  
  FT_DECLARE(ftdm_status_t) ftdm_span_start(ftdm_span_t *span)
  {
-       if (span->start) {
-               /* check the alarms again before starting the signaling module
-                    this works-around some I/O modules (netborder I/O module) that cannot
-                    check the alarm status before during configuration because the spans are
-                    not really started yet at the I/O level */
-               if (ftdm_set_channels_alarms(span, 0) != FTDM_SUCCESS) {
-                       ftdm_log(FTDM_LOG_ERROR, "%d: Failed to set channel alarms\n", span->span_id);
-                       return FTDM_FAIL;
-               }
-               return span->start(span);
+       ftdm_status_t status = FTDM_FAIL;
+       ftdm_mutex_lock(span->mutex);
+       if (ftdm_test_flag(span, FTDM_SPAN_STARTED)) {
+               status = FTDM_EINVAL;
+               goto done;
        }
-       return FTDM_FAIL;
+       if (!span->start) {
+               status = FTDM_ENOSYS;
+               goto done;
+       }
++      /* check the alarms again before starting the signaling module
++         this works-around some I/O modules (netborder I/O module) that cannot
++         check the alarm status before during configuration because the spans are
++         not really started yet at the I/O level */
++      if (ftdm_set_channels_alarms(span, 0) != FTDM_SUCCESS) {
++              ftdm_log(FTDM_LOG_ERROR, "Failed to set channel alarms in span %s\n", span->name);
++              status = FTDM_FAIL;
++              goto done;
++      }
++
+       status = span->start(span);
+       if (status == FTDM_SUCCESS) {
+               ftdm_set_flag_locked(span, FTDM_SPAN_STARTED);
+       }
+ done:
+       ftdm_mutex_unlock(span->mutex);
+       return status;
  }
  
  FT_DECLARE(ftdm_status_t) ftdm_channel_add_to_group(const char* name, ftdm_channel_t* ftdmchan)
index e63ed16a7787e1af9f631e8098522ab700a6cc89,8c421b06915ca5e8b807e2f9873e131dd6b08b99..37f5b42f9ba344522f0c2191c47d7c2187c7466c
@@@ -232,28 -222,24 +233,29 @@@ void sngisdn_trace_raw_q931(sngisdn_spa
  
        memset(&sigev, 0, sizeof(sigev));
  
 -      sigev.span_id = signal_data->ftdm_span->span_id;
 -      sigev.chan_id = signal_data->dchan->chan_id;
 -      sigev.channel = signal_data->dchan;
 -      sigev.event_id = FTDM_SIGEVENT_TRACE_RAW;
 -
 -      sigev.ev_data.logevent.dir = dir;
 -      sigev.ev_data.logevent.level = 3;
 -      
 -      /* TODO: Map trace to call ID here */
 +      /* Note: Mapped raw trace assume only exclusive b-channel selection is used. i.e the b-channel selected on outgoing SETUP is always used for the call */
        
 -      raw_data = ftdm_malloc(data_len);
 -      ftdm_assert(raw_data, "Failed to malloc");
 -      
 -      memcpy(raw_data, data, data_len);
 -      sigev.raw.data = raw_data;
 -      sigev.raw.len = data_len;
 -      sigev.raw.autofree = 1;
 -      ftdm_span_send_signal(signal_data->ftdm_span, &sigev);
 +      if (sngisdn_get_frame_info(data, data_len, dir, &frame_info) == FTDM_SUCCESS) {
 +              if (sngisdn_map_call(signal_data, frame_info, &ftdmchan) == FTDM_SUCCESS) {
 +                      sigev.call_id = ftdmchan->caller_data.call_id;
 +                      sigev.span_id = ftdmchan->physical_span_id;
 +                      sigev.chan_id = ftdmchan->physical_chan_id;
 +                      sigev.channel = ftdmchan;
 +              }
 +              sigev.event_id = FTDM_SIGEVENT_TRACE_RAW;
 +
 +              sigev.ev_data.trace.dir = dir;
 +              sigev.ev_data.trace.type = FTDM_TRACE_TYPE_Q931;
 +
 +              raw_data = ftdm_malloc(data_len);
 +              ftdm_assert(raw_data, "Failed to malloc");
 +
 +              memcpy(raw_data, data, data_len);
-               sigev.raw_data = raw_data;
-               sigev.raw_data_len = data_len;
++              sigev.raw.data = raw_data;
++              sigev.raw.len = data_len;
++              sigev.raw.autofree = 1;
 +              ftdm_span_send_signal(signal_data->ftdm_span, &sigev);
 +      }
  }
  
  void sngisdn_decode_q931(char* str, uint8_t* data, uint32_t data_len)
index 2fd821e5efb1ecea5cac5140e6f6408d9cefcb38,38bc61188b92ab349bca8250df54c997bb32bdb1..5f61b0e257a6fdaaee341b5c1f9c3fdc2b6b741a
@@@ -415,9 -427,40 +437,40 @@@ FTDM_STR2ENUM_P(ftdm_str2ftdm_trace_typ
  typedef struct {
        /* Direction - incoming or outgoing */
        ftdm_trace_dir_t dir;
 -      uint8_t level; /* 1 for phy layer, 2 for q921/mtp2, 3 for q931/mtp3 */
 +      ftdm_trace_type_t type;
  } ftdm_event_trace_t;
  
+ typedef struct {
+       /* Digits collected */
+       char digits[FTDM_DIGITS_LIMIT];
+ } ftdm_event_collected_t;
+ /*! \brief FreeTDM supported indications.
+  * This is used during incoming calls when you want to request the signaling stack
+  * to notify about indications occurring locally. See ftdm_channel_call_indicate for more info */
+ typedef enum {
+       FTDM_CHANNEL_INDICATE_NONE,
+       FTDM_CHANNEL_INDICATE_RINGING,
+       FTDM_CHANNEL_INDICATE_PROCEED,
+       FTDM_CHANNEL_INDICATE_PROGRESS,
+       FTDM_CHANNEL_INDICATE_PROGRESS_MEDIA,
+       FTDM_CHANNEL_INDICATE_BUSY,
+       /* Using this indication is equivalent to call ftdm_channel_call_answer API */
+       FTDM_CHANNEL_INDICATE_ANSWER,
+       FTDM_CHANNEL_INDICATE_INVALID,
+ } ftdm_channel_indication_t;
+ #define INDICATION_STRINGS "NONE", "RINGING", "PROCEED", "PROGRESS", "PROGRESS_MEDIA", "BUSY", "ANSWER", "INVALID"
+ /*! \brief Move from string to ftdm_channel_indication_t and viceversa */
+ FTDM_STR2ENUM_P(ftdm_str2channel_indication, ftdm_channel_indication2str, ftdm_channel_indication_t)
+ typedef struct {
+       /* The indication that was completed */
+       ftdm_channel_indication_t indication;
+       /* Completion status of the indication */
+       ftdm_status_t status;
+ } ftdm_event_indication_completed_t;
  /*! \brief Generic signaling message */
  struct ftdm_sigmsg {
        ftdm_signal_event_t event_id; /*!< The type of message */
        uint32_t call_id; /*!< unique call id for this call */
        union {
                ftdm_event_sigstatus_t sigstatus; /*!< valid if event_id is FTDM_SIGEVENT_SIGSTATUS_CHANGED */
 -              ftdm_event_trace_t logevent;    /*!< valid if event_id is FTDM_SIGEVENT_TRACE or FTDM_SIGEVENT_TRACE_RAW */
 +              ftdm_event_trace_t trace;       /*!< valid if event_id is FTDM_SIGEVENT_TRACE or FTDM_SIGEVENT_TRACE_RAW */
-       }ev_data;
+               ftdm_event_collected_t collected; /*!< valid if event_id is FTDM_SIGEVENT_COLLECTED_DIGIT */
+               ftdm_event_indication_completed_t indication_completed; /*!< valid if the event_id is FTDM_SIGEVENT_INDICATION_COMPLETED */
+       } ev_data;
+       struct {
+               uint8_t autofree; /*!< Whether the freetdm core will free it after message delivery */
+               uint32_t len; /*!< Data len */
+               void *data; /*!< Signaling module specific data */
+       } raw;
  };
  
  /*! \brief Crash policy