]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
freetdm: Support for RAW traces
authorDavid Yat Sin <dyatsin@sangoma.com>
Wed, 15 Dec 2010 21:29:03 +0000 (16:29 -0500)
committerDavid Yat Sin <dyatsin@sangoma.com>
Wed, 15 Dec 2010 21:29:03 +0000 (16:29 -0500)
12 files changed:
libs/freetdm/src/ftdm_io.c
libs/freetdm/src/ftmod/ftmod_r2/ftmod_r2.c
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_cntrl.c
libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_stack_rcv.c
libs/freetdm/src/ftmod/ftmod_sangoma_isdn/ftmod_sangoma_isdn_trace.c
libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_cli.c
libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c
libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c
libs/freetdm/src/include/freetdm.h

index 6166c551f70355a34f236f8eb569522494ce4d87..3fa763fe79d484e3d4a17eedebb522d0230be814 100644 (file)
@@ -280,6 +280,9 @@ FTDM_STR2ENUM(ftdm_str2ftdm_chan_type, ftdm_chan_type2str, ftdm_chan_type_t, CHA
 FTDM_ENUM_NAMES(SIGNALING_STATUS_NAMES, SIGSTATUS_STRINGS)
 FTDM_STR2ENUM(ftdm_str2ftdm_signaling_status, ftdm_signaling_status2str, ftdm_signaling_status_t, SIGNALING_STATUS_NAMES, FTDM_SIG_STATE_INVALID)
 
+FTDM_ENUM_NAMES(TRACE_DIR_NAMES, TRACE_DIR_STRINGS)
+FTDM_STR2ENUM(ftdm_str2ftdm_trace_dir, ftdm_trace_dir2str, ftdm_trace_dir_t, TRACE_DIR_NAMES, FTDM_TRACE_INVALID)
+
 FTDM_ENUM_NAMES(TON_NAMES, TON_STRINGS)
 FTDM_STR2ENUM(ftdm_str2ftdm_ton, ftdm_ton2str, ftdm_ton_t, TON_NAMES, FTDM_TON_INVALID)
 
@@ -5292,6 +5295,7 @@ static ftdm_status_t ftdm_span_trigger_signal(const ftdm_span_t *span, ftdm_sigm
        if (sigmsg->channel) {
                ftdm_call_clear_data(&(sigmsg->channel->caller_data));
        }
+       ftdm_safe_free(sigmsg->raw_data);
        return status;
 }
 
@@ -5299,8 +5303,6 @@ static ftdm_status_t ftdm_span_queue_signal(const ftdm_span_t *span, ftdm_sigmsg
 {
        ftdm_sigmsg_t *new_sigmsg = NULL;
 
-       ftdm_assert_return((sigmsg->raw_data == NULL), FTDM_FAIL, "No raw data should be used with asynchronous notification\n");
-
        new_sigmsg = ftdm_calloc(1, sizeof(*sigmsg));
        if (!new_sigmsg) {
                return FTDM_FAIL;
@@ -5347,7 +5349,7 @@ FT_DECLARE(ftdm_status_t) ftdm_span_send_signal(ftdm_span_t *span, ftdm_sigmsg_t
 
        case FTDM_SIGEVENT_SIGSTATUS_CHANGED:
                {
-                       ftdm_signaling_status_t sigstatus = ftdm_test_flag(span, FTDM_SPAN_USE_SIGNALS_QUEUE) ? sigmsg->sigstatus : *((ftdm_signaling_status_t*)(sigmsg->raw_data));
+                       ftdm_signaling_status_t sigstatus = ftdm_test_flag(span, FTDM_SPAN_USE_SIGNALS_QUEUE) ? sigmsg->ev_data.sigstatus.status : *((ftdm_signaling_status_t*)(sigmsg->raw_data));
                        if (sigstatus == FTDM_SIG_STATE_UP) {
                                ftdm_set_flag(sigmsg->channel, FTDM_CHANNEL_SIG_UP);
                        } else {
index 154983357169ef8c31e5d825632439feb9f5119e..8c2fd51a64f39fca45196b9a86dc971c63263e15 100644 (file)
@@ -255,7 +255,7 @@ static void ftdm_r2_set_chan_sig_status(ftdm_channel_t *ftdmchan, ftdm_signaling
        sig.span_id = ftdmchan->span_id;
        sig.channel = ftdmchan;
        sig.event_id = FTDM_SIGEVENT_SIGSTATUS_CHANGED;
-       sig.sigstatus = status;
+       sig.ev_data.sigstatus.status = status;
        if (ftdm_span_send_signal(ftdmchan->span, &sig) != FTDM_SUCCESS) {
                ftdm_log_chan(ftdmchan, FTDM_LOG_ERROR, "Failed to change channel status to %s\n", ftdm_signaling_status2str(status));
        }
index 48ddddce6b8e0ae72bf562e45691dc6afe4a9940..bb29b4f4a56978d9e70224c86443a7705fb9fc85 100644 (file)
@@ -976,7 +976,8 @@ static FIO_SPAN_SET_SIG_STATUS_FUNCTION(ftdm_sangoma_isdn_set_span_sig_status)
 }
 
 static ftdm_status_t ftdm_sangoma_isdn_start(ftdm_span_t *span)
-{      
+{
+       sngisdn_span_data_t *signal_data = span->signal_data;
        ftdm_log(FTDM_LOG_INFO,"Starting span %s:%u.\n",span->name,span->span_id);
        if (sngisdn_stack_start(span) != FTDM_SUCCESS) {
                ftdm_log(FTDM_LOG_CRIT, "Failed to start span %s\n", span->name);
@@ -986,6 +987,14 @@ static ftdm_status_t ftdm_sangoma_isdn_start(ftdm_span_t *span)
        ftdm_clear_flag(span, FTDM_SPAN_STOP_THREAD);
        ftdm_clear_flag(span, FTDM_SPAN_IN_THREAD);
 
+       if (signal_data->raw_trace_q921 == SNGISDN_OPT_TRUE) {
+               sngisdn_activate_trace(span, SNGISDN_TRACE_Q921);
+       }
+       
+       if (signal_data->raw_trace_q931 == SNGISDN_OPT_TRUE) {
+               sngisdn_activate_trace(span, SNGISDN_TRACE_Q931);
+       }
+
        /*start the span monitor thread*/
        if (ftdm_thread_create_detached(ftdm_sangoma_isdn_run, span) != FTDM_SUCCESS) {
                ftdm_log(FTDM_LOG_CRIT,"Failed to start Sangoma ISDN Span Monitor Thread!\n");
@@ -1210,6 +1219,7 @@ static FIO_API_FUNCTION(ftdm_sangoma_isdn_api)
                        stream->write_function(stream, "-ERR failed to find span by name %s\n", argv[2]);
                        goto done;
                }
+               
                if (!strcasecmp(trace_opt, "q921")) {
                        sngisdn_activate_trace(span, SNGISDN_TRACE_Q921);
                } else if (!strcasecmp(trace_opt, "q931")) {
@@ -1218,7 +1228,7 @@ static FIO_API_FUNCTION(ftdm_sangoma_isdn_api)
                        sngisdn_activate_trace(span, SNGISDN_TRACE_DISABLE);
                } else {
                        stream->write_function(stream, "-ERR invalid trace option <q921|q931> <span name>\n");
-               }       
+               }
        }
        if (!strcasecmp(argv[0], "l1_stats")) {
                ftdm_span_t *span;
index 0c6c1c6eefe92c59bbc39c085287ab5429d94043..6a440e4f66a8c9187234cd1e13b07cf40d17b157 100644 (file)
@@ -261,6 +261,8 @@ typedef struct sngisdn_span_data {
        int8_t                  facility_timeout;
        uint8_t                 num_local_numbers;
        uint8_t                 ignore_cause_value;
+       uint8_t                 raw_trace_q931;
+       uint8_t                 raw_trace_q921;
        uint8_t                 timer_t3;
        uint8_t                 restart_opt;
        char*                   local_numbers[SNGISDN_NUM_LOCAL_NUMBERS];
@@ -427,8 +429,11 @@ void sngisdn_process_rst_ind (sngisdn_event_data_t *sngisdn_event);
 void sngisdn_rcv_phy_ind(SuId suId, Reason reason);
 void sngisdn_rcv_q921_ind(BdMngmt *status);
 
-void sngisdn_trace_q921(char* str, uint8_t* data, uint32_t data_len);
-void sngisdn_trace_q931(char* str, uint8_t* data, uint32_t data_len);
+void sngisdn_trace_interpreted_q921(sngisdn_span_data_t *signal_data, ftdm_trace_dir_t dir, uint8_t *data, uint32_t data_len);
+void sngisdn_trace_interpreted_q931(sngisdn_span_data_t *signal_data, ftdm_trace_dir_t dir, uint8_t *data, uint32_t data_len);
+void sngisdn_trace_raw_q921(sngisdn_span_data_t *signal_data, ftdm_trace_dir_t dir, uint8_t *data, uint32_t data_len);
+void sngisdn_trace_raw_q931(sngisdn_span_data_t *signal_data, ftdm_trace_dir_t dir, uint8_t *data, uint32_t data_len);
+
 void get_memory_info(void);
 
 ftdm_status_t sng_isdn_activate_trace(ftdm_span_t *span, sngisdn_tracetype_t trace_opt);
index cce10cc1dd8afba2b4245adddbabba8ee43cda32..c9790002234f21880df6f6967a4a3d38ba8b0867 100644 (file)
@@ -296,6 +296,10 @@ ftdm_status_t ftmod_isdn_parse_cfg(ftdm_conf_parameter_t *ftdm_parameters, ftdm_
                        parse_yesno(var, val, &signal_data->facility_ie_decode);
                } else if (!strcasecmp(var, "ignore-cause-value")) {
                        parse_yesno(var, val, &signal_data->ignore_cause_value);
+               } else if (!strcasecmp(var, "q931-raw-trace")) {
+                       parse_yesno(var, val, &signal_data->raw_trace_q931);
+               } else if (!strcasecmp(var, "q921-raw-trace")) {
+                       parse_yesno(var, val, &signal_data->raw_trace_q921);
                } else {
                        ftdm_log(FTDM_LOG_WARNING, "Ignoring unknown parameter %s\n", ftdm_parameters[paramindex].var);
                }
index 5060cb6bbaf57f10b9def14e489294634e4d9690..668b63006cdacc573299acff4f8cb9316506a008 100644 (file)
@@ -47,7 +47,7 @@ void sngisdn_set_chan_sig_status(ftdm_channel_t *ftdmchan, ftdm_signaling_status
        sig.span_id = ftdmchan->span_id;
        sig.channel = ftdmchan;
        sig.event_id = FTDM_SIGEVENT_SIGSTATUS_CHANGED;
-       sig.sigstatus = status;
+       sig.ev_data.sigstatus.status = status;
        ftdm_span_send_signal(ftdmchan->span, &sig);
        return;
 }
index 4b04fb065e51127197a31d120e6075a3948f98ca..3afdaa599e9946910b096b51510ee1d0a90fd955 100644 (file)
@@ -34,9 +34,6 @@
 
 #include "ftmod_sangoma_isdn.h"
 
-#define MAX_DECODE_STR_LEN 2000
-
-
 void sngisdn_rcv_con_ind (int16_t suId, uint32_t suInstId, uint32_t spInstId, ConEvnt *conEvnt, int16_t dChan, uint8_t ces)
 {
        uint8_t bchan_no = 0;
@@ -777,9 +774,6 @@ void sngisdn_rcv_cc_ind(CcMngmt *status)
     return;
 }
 
-#define Q931_TRC_EVENT(event) (event == TL3PKTTX)?"TX": \
-                                                               (event == TL3PKTRX)?"RX":"UNKNOWN"
-
 void sngisdn_rcv_q931_trace(InMngmt *trc, Buffer *mBuf)
 {
        MsgLen mlen;
@@ -788,13 +782,20 @@ void sngisdn_rcv_q931_trace(InMngmt *trc, Buffer *mBuf)
        Buffer *tmp;
        Data *cptr;
        uint8_t data;
+       ftdm_trace_dir_t dir;
        uint8_t tdata[1000];
-       char *data_str = ftdm_calloc(1,MAX_DECODE_STR_LEN); /* TODO Find a proper size */
-       
+       sngisdn_span_data_t     *signal_data = g_sngisdn_data.spans[trc->t.trc.suId];
+
        ftdm_assert(mBuf != NULLP, "Received a Q931 trace with no buffer");
        mlen = ((SsMsgInfo*)(mBuf->b_rptr))->len;
-
-       if (mlen != 0) {
+       
+       if (trc->t.trc.evnt == TL3PKTTX) {
+               dir = FTDM_TRACE_OUTGOING;
+       } else {
+               dir = FTDM_TRACE_INCOMING;
+       }
+       
+       if (mlen) {
                tmp = mBuf->b_cont;
                cptr = tmp->b_rptr;
                data = *cptr++;
@@ -809,41 +810,40 @@ void sngisdn_rcv_q931_trace(InMngmt *trc, Buffer *mBuf)
                        }
                        data = *cptr++;
                }
-
-               sngisdn_trace_q931(data_str, tdata, mlen);
-               ftdm_log(FTDM_LOG_INFO, "[SNGISDN Q931] s%d FRAME %s:%s\n", trc->t.trc.suId, Q931_TRC_EVENT(trc->t.trc.evnt), data_str);
+               if (signal_data->raw_trace_q931 == SNGISDN_OPT_TRUE) {
+                       sngisdn_trace_raw_q931(signal_data, dir, tdata, mlen);
+               } else {
+                       sngisdn_trace_interpreted_q931(signal_data, dir, tdata, mlen);
+               }
        }
-
-       ftdm_safe_free(data_str);
-       /* We do not need to free mBuf in this case because stack does it */
-       /* SPutMsg(mBuf); */
        return;
 }
 
 
-#define Q921_TRC_EVENT(event) (event == TL2FRMRX)?"RX": \
-                                                               (event == TL2FRMTX)?"TX": \
-                                                               (event == TL2TMR)?"TMR EXPIRED":"UNKNOWN"
-
 void sngisdn_rcv_q921_trace(BdMngmt *trc, Buffer *mBuf)
 {
        MsgLen mlen;
+       Buffer *tmp;    
        MsgLen i;
        int16_t j;
-       Buffer *tmp;
        Data *cptr;
        uint8_t data;
-       uint8_t tdata[16];
-       char *data_str = ftdm_calloc(1,200); /* TODO Find a proper size */
-       
+       ftdm_trace_dir_t dir;
+       uint8_t tdata[1000];
+       sngisdn_span_data_t     *signal_data = g_sngisdn_data.spans[trc->t.trc.lnkNmb];
 
        if (trc->t.trc.evnt == TL2TMR) {
-               goto end_of_trace;
+               return;
        }
 
+       if (trc->t.trc.evnt == TL2FRMTX) {
+               dir = FTDM_TRACE_OUTGOING;
+       } else {
+               dir = FTDM_TRACE_INCOMING;
+       }
+       
        ftdm_assert(mBuf != NULLP, "Received a Q921 trace with no buffer");
        mlen = ((SsMsgInfo*)(mBuf->b_rptr))->len;
-
        if (mlen != 0) {
                tmp = mBuf->b_cont;
                cptr = tmp->b_rptr;
@@ -865,12 +865,12 @@ void sngisdn_rcv_q921_trace(BdMngmt *trc, Buffer *mBuf)
                        }
 
                }
-               sngisdn_trace_q921(data_str, tdata, mlen);
-               ftdm_log(FTDM_LOG_INFO, "[SNGISDN Q921] s%d FRAME %s:%s\n", trc->t.trc.lnkNmb, Q921_TRC_EVENT(trc->t.trc.evnt), data_str);
+               if (signal_data->raw_trace_q921 == SNGISDN_OPT_TRUE) {
+                       sngisdn_trace_raw_q921(signal_data, dir, tdata, mlen);
+               } else {
+                       sngisdn_trace_interpreted_q921(signal_data, dir, tdata, mlen);
+               }               
        }
-end_of_trace:
-       ftdm_safe_free(data_str);
-       SPutMsg(mBuf);
        return;
 }
 
index e5167164b38077de133ac4130f43072af5045d01..c03976a1c29f1e8b0eac24f6a7386fcfcce66a4d 100644 (file)
 #include "ftmod_sangoma_isdn_trace.h"
 
 #define OCTET(x) (ieData[x-1] & 0xFF)
+#define MAX_DECODE_STR_LEN 2000
 
 void print_hex_dump(char* str, uint32_t *str_len, uint8_t* data, uint32_t index_start, uint32_t index_end);
-void sngisdn_trace_q921(char* str, uint8_t* data, uint32_t data_len);
-void sngisdn_trace_q931(char* str, uint8_t* data, uint32_t data_len);
 uint32_t sngisdn_decode_ie(char *str, uint32_t *str_len, uint8_t current_codeset, uint8_t *data, uint16_t index_start);
 
 uint8_t get_bits(uint8_t octet, uint8_t bitLo, uint8_t bitHi);
 char* get_code_2_str(int code, struct code2str *pCodeTable);
+void sngisdn_decode_q921(char* str, uint8_t* data, uint32_t data_len);
+void sngisdn_decode_q931(char* str, uint8_t* data, uint32_t data_len);
 
 char* get_code_2_str(int code, struct code2str *pCodeTable)
 {
@@ -97,7 +98,42 @@ uint8_t get_bits(uint8_t octet, uint8_t bitLo, uint8_t bitHi)
        return 0;
 }
 
-void sngisdn_trace_q921(char* str, uint8_t* data, uint32_t data_len)
+void sngisdn_trace_interpreted_q921(sngisdn_span_data_t *signal_data, ftdm_trace_dir_t dir, uint8_t *data, uint32_t data_len)
+{
+       char *data_str = ftdm_calloc(1,200); /* TODO Find a proper size */
+       sngisdn_decode_q921(data_str, data, data_len);
+       ftdm_log(FTDM_LOG_INFO, "[SNGISDN Q921] s%d FRAME %s:%s\n", signal_data->ftdm_span->name, ftdm_trace_dir2str(dir), data_str);
+       ftdm_safe_free(data_str);
+}
+
+void sngisdn_trace_raw_q921(sngisdn_span_data_t *signal_data, ftdm_trace_dir_t dir, uint8_t *data, uint32_t data_len)
+{
+       uint8_t                         *raw_data;
+       ftdm_sigmsg_t           sigev;
+       
+       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 = 2;
+       
+       /* TODO: Map trace to call ID here */
+       sigev.call_id = 0;
+       
+       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;
+       ftdm_span_send_signal(signal_data->ftdm_span, &sigev);
+}
+
+void sngisdn_decode_q921(char* str, uint8_t* data, uint32_t data_len)
 {
        int str_len;
        uint32_t i;
@@ -169,7 +205,42 @@ void sngisdn_trace_q921(char* str, uint8_t* data, uint32_t data_len)
        return;
 }
 
-void sngisdn_trace_q931(char* str, uint8_t* data, uint32_t data_len)
+
+void sngisdn_trace_interpreted_q931(sngisdn_span_data_t *signal_data, ftdm_trace_dir_t dir, uint8_t *data, uint32_t data_len)
+{
+       char *data_str = ftdm_calloc(1,MAX_DECODE_STR_LEN); /* TODO Find a proper size */
+       sngisdn_decode_q931(data_str, data, data_len);
+       ftdm_log(FTDM_LOG_INFO, "[SNGISDN Q931] %s FRAME %s:%s\n", signal_data->ftdm_span->name, ftdm_trace_dir2str(dir), data_str);
+       ftdm_safe_free(data_str);
+}
+
+void sngisdn_trace_raw_q931(sngisdn_span_data_t *signal_data, ftdm_trace_dir_t dir, uint8_t *data, uint32_t data_len)
+{
+       uint8_t                         *raw_data;
+       ftdm_sigmsg_t           sigev;
+
+       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 */
+       
+       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;
+       ftdm_span_send_signal(signal_data->ftdm_span, &sigev);
+}
+
+void sngisdn_decode_q931(char* str, uint8_t* data, uint32_t data_len)
 {
        uint32_t str_len;
        uint8_t  prot_disc, callRefFlag;
index 34cca80140f29db1f135b64f2fadc2cfe6c94d12..dc2d24f42a04f89752a413aac9cd099c8b3f395c 100644 (file)
@@ -1589,7 +1589,7 @@ static ftdm_status_t handle_tx_cgb(ftdm_stream_handle_t *stream, int span, int c
                                sigev.span_id = ftdmchan->span_id;
                                sigev.channel = ftdmchan;
                                sigev.event_id = FTDM_SIGEVENT_SIGSTATUS_CHANGED;
-                               sigev.sigstatus = FTDM_SIG_STATE_DOWN;
+                               sigev.ev_data.sigstatus.status = FTDM_SIG_STATE_DOWN;
                                ftdm_span_send_signal(ftdmchan->span, &sigev); 
 
                                /* if this is the first channel in the range */
@@ -1689,7 +1689,7 @@ static ftdm_status_t handle_tx_cgu(ftdm_stream_handle_t *stream, int span, int c
                                sigev.span_id = ftdmchan->span_id;
                                sigev.channel = ftdmchan;
                                sigev.event_id = FTDM_SIGEVENT_SIGSTATUS_CHANGED;
-                               sigev.sigstatus = FTDM_SIG_STATE_UP;
+                               sigev.ev_data.sigstatus.status = FTDM_SIG_STATE_UP;
                                ftdm_span_send_signal(ftdmchan->span, &sigev); 
 
                                /* if this is the first channel in the range */
index 7517ee42a086dd7a9bc6fc877125a8750c9a1e7b..dcfb7f79e04770da550fc19da684987e668425a6 100644 (file)
@@ -2004,7 +2004,7 @@ ftdm_status_t handle_cgb_req(uint32_t suInstId, uint32_t spInstId, uint32_t circ
 
                /* bring the sig status down */
                sigev.event_id = FTDM_SIGEVENT_SIGSTATUS_CHANGED;
-               sigev.sigstatus = FTDM_SIG_STATE_DOWN;
+               sigev.ev_data.sigstatus.status = FTDM_SIG_STATE_DOWN;
                ftdm_span_send_signal(ftdmchan->span, &sigev);
 
                /* unlock the channel again before we exit */
@@ -2135,7 +2135,7 @@ ftdm_status_t handle_cgu_req(uint32_t suInstId, uint32_t spInstId, uint32_t circ
 
                /* bring the sig status down */
                sigev.event_id = FTDM_SIGEVENT_SIGSTATUS_CHANGED;
-               sigev.sigstatus = FTDM_SIG_STATE_UP;
+               sigev.ev_data.sigstatus.status = FTDM_SIG_STATE_UP;
                ftdm_span_send_signal(ftdmchan->span, &sigev);
        
                /* unlock the channel again before we exit */
index 5c171a9f6bb94c76fdf313facb5df223a1c2974f..05a325b913b650207ce8c04b62d015db856650a5 100644 (file)
@@ -841,7 +841,7 @@ void ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
                                                SS7_DEBUG_CHAN(ftdmchan,"All reset flags cleared %s\n", "");
                                                /* all flags are down so we can bring up the sig status */
                                                sigev.event_id = FTDM_SIGEVENT_SIGSTATUS_CHANGED;
-                                               sigev.sigstatus = FTDM_SIG_STATE_UP;
+                                               sigev.ev_data.sigstatus.status = FTDM_SIG_STATE_UP;
                                                ftdm_span_send_signal (ftdmchan->span, &sigev);
                                        } /* if (!ftdm_test_flag (ftdmchan, FTDM_CHANNEL_SIG_UP)) */
                                } /* if !blocked */
@@ -949,7 +949,7 @@ void ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
                /* if the sig_status is up...bring it down */
                if (ftdm_test_flag (ftdmchan, FTDM_CHANNEL_SIG_UP)) {
                        sigev.event_id = FTDM_SIGEVENT_SIGSTATUS_CHANGED;
-                       sigev.sigstatus = FTDM_SIG_STATE_DOWN;
+                       sigev.ev_data.sigstatus.status = FTDM_SIG_STATE_DOWN;
                        ftdm_span_send_signal (ftdmchan->span, &sigev);
                }
 
@@ -1033,7 +1033,7 @@ void ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
 
                                /* bring the sig status back up */
                                sigev.event_id = FTDM_SIGEVENT_SIGSTATUS_CHANGED;
-                               sigev.sigstatus = FTDM_SIG_STATE_UP;
+                               sigev.ev_data.sigstatus.status = FTDM_SIG_STATE_UP;
                                ftdm_span_send_signal(ftdmchan->span, &sigev);
                        }
 
@@ -1046,7 +1046,7 @@ void ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
 
                        /* bring the sig status down */
                        sigev.event_id = FTDM_SIGEVENT_SIGSTATUS_CHANGED;
-                       sigev.sigstatus = FTDM_SIG_STATE_DOWN;
+                       sigev.ev_data.sigstatus.status = FTDM_SIG_STATE_DOWN;
                        ftdm_span_send_signal(ftdmchan->span, &sigev);
 
                        /* go back to the last state */
@@ -1058,7 +1058,7 @@ void ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
 
                        /* bring the sig status down */
                        sigev.event_id = FTDM_SIGEVENT_SIGSTATUS_CHANGED;
-                       sigev.sigstatus = FTDM_SIG_STATE_DOWN;
+                       sigev.ev_data.sigstatus.status = FTDM_SIG_STATE_DOWN;
                        ftdm_span_send_signal(ftdmchan->span, &sigev); 
 
                        /* send a BLA */
@@ -1076,7 +1076,7 @@ void ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
 
                        /* bring the sig status up */
                        sigev.event_id = FTDM_SIGEVENT_SIGSTATUS_CHANGED;
-                       sigev.sigstatus = FTDM_SIG_STATE_UP;
+                       sigev.ev_data.sigstatus.status = FTDM_SIG_STATE_UP;
                        ftdm_span_send_signal(ftdmchan->span, &sigev); 
 
                        /* send a uba */
@@ -1092,7 +1092,7 @@ void ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
 
                        /* bring the sig status down */
                        sigev.event_id = FTDM_SIGEVENT_SIGSTATUS_CHANGED;
-                       sigev.sigstatus = FTDM_SIG_STATE_DOWN;
+                       sigev.ev_data.sigstatus.status = FTDM_SIG_STATE_DOWN;
                        ftdm_span_send_signal(ftdmchan->span, &sigev); 
 
                        /* send a blo */
@@ -1110,7 +1110,7 @@ void ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
 
                        /* bring the sig status up */
                        sigev.event_id = FTDM_SIGEVENT_SIGSTATUS_CHANGED;
-                       sigev.sigstatus = FTDM_SIG_STATE_UP;
+                       sigev.ev_data.sigstatus.status = FTDM_SIG_STATE_UP;
                        ftdm_span_send_signal(ftdmchan->span, &sigev); 
 
                        /* send a ubl */
@@ -1149,7 +1149,7 @@ void ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
 
                        /* bring the channel signaling status to down */
                        sigev.event_id = FTDM_SIGEVENT_SIGSTATUS_CHANGED;
-                       sigev.sigstatus = FTDM_SIG_STATE_DOWN;
+                       sigev.ev_data.sigstatus.status = FTDM_SIG_STATE_DOWN;
                        ftdm_span_send_signal (ftdmchan->span, &sigev);
 
                        /* remove any reset flags */
index f8f69abc71c381efbf045883580587d21141abc4..18da29f5667d8ce355acda8be29153d101198bc6 100644 (file)
@@ -325,12 +325,14 @@ typedef enum {
        FTDM_SIGEVENT_RESTART, /*!< Restart has been requested. Typically you hangup your call resources here */
        FTDM_SIGEVENT_SIGSTATUS_CHANGED, /*!< Signaling protocol status changed (ie: D-chan up), see new status in raw_data ftdm_sigmsg_t member */
        FTDM_SIGEVENT_COLLISION, /*!< Outgoing call was dropped because an incoming call arrived at the same time */
-       FTDM_SIGEVENT_FACILITY, /* !< In call facility event */
-       FTDM_SIGEVENT_INVALID
+       FTDM_SIGEVENT_FACILITY, /*!< In call facility event */
+       FTDM_SIGEVENT_TRACE, /*!<Interpreted trace event */
+       FTDM_SIGEVENT_TRACE_RAW, /*!<Raw trace event */
+       FTDM_SIGEVENT_INVALID, /*!<Invalid */
 } ftdm_signal_event_t;
 #define SIGNAL_STRINGS "START", "STOP", "RELEASED", "UP", "FLASH", "PROCEED", "RINGING", "PROGRESS", \
                "PROGRESS_MEDIA", "ALARM_TRAP", "ALARM_CLEAR", \
-               "COLLECTED_DIGIT", "ADD_CALL", "RESTART", "SIGSTATUS_CHANGED", "COLLISION", "MSG", "INVALID"
+               "COLLECTED_DIGIT", "ADD_CALL", "RESTART", "SIGSTATUS_CHANGED", "COLLISION", "FACILITY", "TRACE", "TRACE_RAW", "INVALID"
 
 /*! \brief Move from string to ftdm_signal_event_t and viceversa */
 FTDM_STR2ENUM_P(ftdm_str2ftdm_signal_event, ftdm_signal_event2str, ftdm_signal_event_t)
@@ -381,16 +383,43 @@ typedef enum {
 /*! \brief Move from string to ftdm_signaling_status_t and viceversa */
 FTDM_STR2ENUM_P(ftdm_str2ftdm_signaling_status, ftdm_signaling_status2str, ftdm_signaling_status_t)
 
+
+typedef struct {
+       ftdm_signaling_status_t status;
+} ftdm_event_sigstatus_t;
+
+typedef enum {
+       /* This is an received frame */
+       FTDM_TRACE_INCOMING,
+       /* This is a transmitted frame */
+       FTDM_TRACE_OUTGOING,
+       /* Invalid */
+       FTDM_TRACE_INVALID,
+} ftdm_trace_dir_t;
+#define TRACE_DIR_STRINGS "INCOMING", "OUTGOING", "INVALID"
+
+/*! \brief Move string to ftdm_trace_dir_t and viceversa */
+FTDM_STR2ENUM_P(ftdm_str2ftdm_trace_dir, ftdm_trace_dir2str, ftdm_trace_dir_t)
+
+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_event_trace_t;
+
 /*! \brief Generic signaling message */
 struct ftdm_sigmsg {
        ftdm_signal_event_t event_id; /*!< The type of message */
        ftdm_channel_t *channel; /*!< Related channel */
        uint32_t chan_id; /*!< easy access to chan id */
        uint32_t span_id; /*!< easy access to span_id */
-       ftdm_signaling_status_t sigstatus; /*!< Signaling status (valid if event_id is FTDM_SIGEVENT_SIGSTATUS_CHANGED) */
        void *raw_data; /*!< Message specific data if any */
        uint32_t raw_data_len; /*!< Data len in case is needed */
        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 */
+       }ev_data;
 };
 
 /*! \brief Crash policy