<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[Freeswitch-trunk][17308] </title>
</head>
<body>
<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; }
#msg dl a { font-weight: bold}
#msg dl a:link { color:#fc3; }
#msg dl a:active { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<div id="header">FreeSWITCH Subversion</div>
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://fisheye.freeswitch.org/changelog/FreeSWITCH?cs=17308">17308</a></dd>
<dt>Author</dt> <dd>dyatsin</dd>
<dt>Date</dt> <dd>2010-04-15 10:48:09 -0500 (Thu, 15 Apr 2010)</dd>
</dl>
<h3>Log Message</h3>
<pre>freetdm:Added macro to for boost event span and chan</pre>
<h3>Modified Paths</h3>
<ul>
<li><a href="#freeswitchtrunklibsfreetdmsrcftmodftmod_sangoma_boostftmod_sangoma_boostc">freeswitch/trunk/libs/freetdm/src/ftmod/ftmod_sangoma_boost/ftmod_sangoma_boost.c</a></li>
</ul>
</div>
<div id="patch">
<h3>Diff</h3>
<a id="freeswitchtrunklibsfreetdmsrcftmodftmod_sangoma_boostftmod_sangoma_boostc"></a>
<div class="modfile"><h4>Modified: freeswitch/trunk/libs/freetdm/src/ftmod/ftmod_sangoma_boost/ftmod_sangoma_boost.c (17307 => 17308)</h4>
<pre class="diff"><span>
<span class="info">--- freeswitch/trunk/libs/freetdm/src/ftmod/ftmod_sangoma_boost/ftmod_sangoma_boost.c        2010-04-15 23:50:24 UTC (rev 17307)
+++ freeswitch/trunk/libs/freetdm/src/ftmod/ftmod_sangoma_boost/ftmod_sangoma_boost.c        2010-04-15 15:48:09 UTC (rev 17308)
</span><span class="lines">@@ -69,15 +69,19 @@
</span><span class="cx"> #define BOOST_SPAN(ftdmchan) ((ftdm_sangoma_boost_data_t*)(ftdmchan)->span->signal_data)->sigmod ? ftdmchan->physical_span_id : ftdmchan->physical_span_id-1
</span><span class="cx"> #define BOOST_CHAN(ftdmchan) ((ftdm_sangoma_boost_data_t*)(ftdmchan)->span->signal_data)->sigmod ? ftdmchan->physical_chan_id : ftdmchan->physical_chan_id-1
</span><span class="cx">
</span><ins>+#define BOOST_EVENT_SPAN(sigmod, event) ((sigmod)? event->span:event->span+1)
+#define BOOST_EVENT_CHAN(sigmod, event) ((sigmod)? event->chan:event->chan+1)
+
</ins><span class="cx"> /**
</span><del>- * \brief SANGOMA boost notification flag
</del><ins>+ * \brief Strange flag
</ins><span class="cx"> */
</span><span class="cx"> typedef enum {
</span><del>-        SFLAG_SENT_FINAL_MSG = (1 << 0),
-        SFLAG_SENT_ACK = (1 << 1),
-        SFLAG_RECVD_ACK = (1 << 2),
-        SFLAG_HANGUP = (1 << 3),
-        SFLAG_TERMINATING = (1 << 4)
</del><ins>+        SFLAG_FREE_REQ_ID = (1 << 0),
+        SFLAG_SENT_FINAL_MSG = (1 << 1),
+        SFLAG_SENT_ACK = (1 << 2),
+        SFLAG_RECVD_ACK = (1 << 3),
+        SFLAG_HANGUP = (1 << 4),
+        SFLAG_TERMINATING = (1 << 5)
</ins><span class="cx"> } sflag_t;
</span><span class="cx">
</span><span class="cx"> typedef uint16_t sangoma_boost_request_id_t;
</span><span class="lines">@@ -88,6 +92,7 @@
</span><span class="cx"> typedef enum {
</span><span class="cx">         BST_FREE,
</span><span class="cx">         BST_WAITING,
</span><ins>+        BST_ACK,
</ins><span class="cx">         BST_READY,
</span><span class="cx">         BST_FAIL
</span><span class="cx"> } sangoma_boost_request_status_t;
</span><span class="lines">@@ -104,13 +109,6 @@
</span><span class="cx">         int flags;
</span><span class="cx"> } sangoma_boost_request_t;
</span><span class="cx">
</span><del>-typedef struct {
-        int call_setup_id;
-        int last_event_id;
-} sangoma_boost_call_t;
-
-#define CALL_DATA(ftdmchan) ((sangoma_boost_call_t*)((ftdmchan)->call_data))
-
</del><span class="cx"> //#define MAX_REQ_ID FTDM_MAX_PHYSICAL_SPANS_PER_LOGICAL_SPAN * FTDM_MAX_CHANNELS_PHYSICAL_SPAN
</span><span class="cx"> #define MAX_REQ_ID 6000
</span><span class="cx">
</span><span class="lines">@@ -137,7 +135,7 @@
</span><span class="cx">
</span><span class="cx">         ftdm_mutex_lock(request_mutex);
</span><span class="cx">         if ((id = SETUP_GRID[span][chan])) {
</span><del>-                ftdm_assert(id <= MAX_REQ_ID, "Invalid id");
</del><ins>+                ftdm_assert(id <= MAX_REQ_ID, "Invalid request id\n");
</ins><span class="cx">                 req_map[id] = 0;
</span><span class="cx">                 SETUP_GRID[span][chan] = 0;
</span><span class="cx">         }
</span><span class="lines">@@ -153,7 +151,7 @@
</span><span class="cx"> */
</span><span class="cx"> static void __release_request_id(sangoma_boost_request_id_t r, const char *func, int line)
</span><span class="cx"> {
</span><del>-        ftdm_assert(r <= MAX_REQ_ID, "Invalid id");
</del><ins>+        ftdm_assert(r <= MAX_REQ_ID, "Invalid request id\n");
</ins><span class="cx">         ftdm_mutex_lock(request_mutex);
</span><span class="cx">         req_map[r] = 0;
</span><span class="cx">         ftdm_mutex_unlock(request_mutex);
</span><span class="lines">@@ -181,7 +179,7 @@
</span><span class="cx">                 r = ++last_req;
</span><span class="cx">
</span><span class="cx">                 if (r >= MAX_REQ_ID) {
</span><del>-                        r = last_req = 1;
</del><ins>+                        r = i = last_req = 1;
</ins><span class="cx">                 }
</span><span class="cx">
</span><span class="cx">                 if (req_map[r]) {
</span><span class="lines">@@ -206,28 +204,6 @@
</span><span class="cx"> }
</span><span class="cx"> #define next_request_id() __next_request_id(__FUNCTION__, __LINE__)
</span><span class="cx">
</span><del>-
-static void print_request_ids(void)
-{
-        sangoma_boost_request_id_t i = 0;
-        int cnt=0;
-
-        ftdm_mutex_lock(request_mutex);
-
-        for (i=1; i<= MAX_REQ_ID; i++){
-                if (req_map[i]) {
-                        ftdm_log(FTDM_LOG_CRIT, "Used Request ID=%i\n",i);
-                        cnt++;
-                }
-        }
-
-        ftdm_mutex_unlock(request_mutex);
-        ftdm_log(FTDM_LOG_CRIT, "Total Request IDs=%i\n",cnt);
-        
-        return;
-}
-
-
</del><span class="cx"> /**
</span><span class="cx"> * \brief Finds the channel that triggered an event
</span><span class="cx"> * \param span Span where to search the channel
</span><span class="lines">@@ -239,32 +215,10 @@
</span><span class="cx"> {
</span><span class="cx">         uint32_t i;
</span><span class="cx">         ftdm_channel_t *ftdmchan = NULL;
</span><del>-        ftdm_sangoma_boost_data_t *sangoma_boost_data;
-        uint32_t targetspan = event->span+1;
-        uint32_t targetchan = event->chan+1;
</del><ins>+        ftdm_sangoma_boost_data_t *sangoma_boost_data = span->signal_data;
+        uint32_t targetspan = BOOST_EVENT_SPAN(sangoma_boost_data->sigmod, event);
+        uint32_t targetchan = BOOST_EVENT_CHAN(sangoma_boost_data->sigmod, event);
</ins><span class="cx">
</span><del>-        /* NC: Sanity check in case the call setup id does not relate
-          to span. This can happen if RESTART is received on a
-                 full load. Where stray ACK messages can arrive after
-                 a RESTART has taken place.
- */
-        if (!span) {
-                ftdm_log(FTDM_LOG_CRIT, "No Span for Event=%s s%dc%d cid=%d\n",
-                                                BOOST_DECODE_EVENT_ID(event->event_id),
-                                                event->span,
-                                                event->chan,
-                                                event->call_setup_id);
-                return NULL;
-        }
-
-        sangoma_boost_data = span->signal_data;
-
-        if (sangoma_boost_data->sigmod) {
-                /* span is not strictly needed here since we're supposed to get only events for our span */
-                targetspan = event->span;
-                targetchan = event->chan;
-        }
-
</del><span class="cx">         for(i = 1; i <= span->chan_count; i++) {
</span><span class="cx">                 if (span->channels[i]->physical_span_id == targetspan && span->channels[i]->physical_chan_id == targetchan) {
</span><span class="cx">                         ftdmchan = span->channels[i];
</span><span class="lines">@@ -322,20 +276,12 @@
</span><span class="cx">          * and PRI stack will retransmit a second SETUP after the first timeout, so
</span><span class="cx">          * we should allow for at least 8 seconds.
</span><span class="cx">          */
</span><del>-
</del><span class="cx">         int boost_request_timeout = 10000;
</span><span class="cx">         sangoma_boost_request_status_t st;
</span><span class="cx">         char dnis[128] = "";
</span><span class="cx">         char *gr = NULL;
</span><span class="cx">         uint32_t count = 0;
</span><span class="cx">         int tg=0;
</span><del>-
-        /* NC: On large number of calls 10 seconds is not enough.
-                Resetting to 30 seconds. Especially on ss7 when
-                links are reset during large call volume */
-        if (!sangoma_boost_data->sigmod) {
-                boost_request_timeout = 30000;
-        }
</del><span class="cx">         
</span><span class="cx">         if (sangoma_boost_data->sigmod) {
</span><span class="cx">                 ftdm_log(FTDM_LOG_CRIT, "This function should not be called when sigmod was configured in boost\n");
</span><span class="lines">@@ -344,35 +290,21 @@
</span><span class="cx">         }
</span><span class="cx">
</span><span class="cx">         if (ftdm_test_flag(span, FTDM_SPAN_SUSPENDED)) {
</span><del>-                ftdm_log(FTDM_LOG_CRIT, "SPAN is Suspended.\n");
</del><ins>+                ftdm_log(FTDM_LOG_CRIT, "SPAN is not online.\n");
</ins><span class="cx">                 *ftdmchan = NULL;
</span><span class="cx">                 return FTDM_FAIL;
</span><span class="cx">         }
</span><ins>+        
+        ftdm_set_string(dnis, caller_data->dnis.digits);
</ins><span class="cx">
</span><del>-        if (check_congestion(tg)) {
-                ftdm_log(FTDM_LOG_CRIT, "All circuits are busy. Trunk Group=%i (CONGESTION)\n",tg+1);
-                *ftdmchan = NULL;
-                return FTDM_FAIL;
-        }
-
-        if (count >= span->chan_count) {
-                ftdm_log(FTDM_LOG_CRIT, "All circuits are busy.\n");
-                *ftdmchan = NULL;
-                return FTDM_FAIL;
-        }
-
</del><span class="cx">         r = next_request_id();
</span><span class="cx">         if (r == 0) {
</span><span class="cx">                 ftdm_log(FTDM_LOG_CRIT, "All tanks ids are busy.\n");
</span><span class="cx">                 *ftdmchan = NULL;
</span><span class="cx">                 return FTDM_FAIL;
</span><span class="cx">         }
</span><ins>+        sangomabc_call_init(&event, caller_data->cid_num.digits, dnis, r);
</ins><span class="cx">
</span><del>-        /* After this point we must release request id before we leave the function
-         in case of an error. */
-
-        ftdm_set_string(dnis, caller_data->dnis.digits);
-
</del><span class="cx">         if ((gr = strchr(dnis, '@'))) {
</span><span class="cx">                 *gr++ = '\0';
</span><span class="cx">         }
</span><span class="lines">@@ -383,14 +315,22 @@
</span><span class="cx">                         tg--;
</span><span class="cx">                 }
</span><span class="cx">         }
</span><del>-        
-        sangomabc_call_init(&event, caller_data->cid_num.digits, dnis, r);
-
</del><span class="cx">         event.trunk_group = tg;
</span><span class="cx">
</span><ins>+        if (check_congestion(tg)) {
+                ftdm_log(FTDM_LOG_CRIT, "All circuits are busy. Trunk Group=%i (BOOST REQUESTED BACK OFF)\n",tg+1);
+                *ftdmchan = NULL;
+                return FTDM_FAIL;
+        }
</ins><span class="cx">
</span><span class="cx">         ftdm_span_channel_use_count(span, &count);
</span><span class="cx">
</span><ins>+        if (count >= span->chan_count) {
+                ftdm_log(FTDM_LOG_CRIT, "All circuits are busy.\n");
+                *ftdmchan = NULL;
+                return FTDM_FAIL;
+        }        
+
</ins><span class="cx">         if (gr && *(gr+1)) {
</span><span class="cx">                 switch(*gr) {
</span><span class="cx">                                 case 'g':
</span><span class="lines">@@ -433,7 +373,7 @@
</span><span class="cx">
</span><span class="cx">         if (sangomabc_connection_write(&sangoma_boost_data->mcon, &event) <= 0) {
</span><span class="cx">                 ftdm_log(FTDM_LOG_CRIT, "Failed to tx boost event [%s]\n", strerror(errno));
</span><del>-                status = OUTBOUND_REQUESTS[r].status = FTDM_FAIL;
</del><ins>+                status = FTDM_FAIL;
</ins><span class="cx">                 if (!sangoma_boost_data->sigmod) {
</span><span class="cx">                         *ftdmchan = NULL;
</span><span class="cx">                 }
</span><span class="lines">@@ -447,7 +387,7 @@
</span><span class="cx">                         if (!sangoma_boost_data->sigmod) {
</span><span class="cx">                                 *ftdmchan = NULL;
</span><span class="cx">                         }
</span><del>-                        ftdm_log(FTDM_LOG_CRIT, "Csid:%d Timed out waiting for boost channel request response, current status: BST_WAITING\n", r);
</del><ins>+                        ftdm_log(FTDM_LOG_CRIT, "s%dc%d: Csid:%d Timed out waiting for boost channel request response, current status: BST_WAITING\n", (*ftdmchan)->physical_span_id, (*ftdmchan)->physical_chan_id, r);
</ins><span class="cx">                         goto done;
</span><span class="cx">                 }
</span><span class="cx">         }
</span><span class="lines">@@ -554,7 +494,6 @@
</span><span class="cx">
</span><span class="cx">         ftdm_log(FTDM_LOG_DEBUG, "Dialing number %s over boost channel with request id %d\n", event.called_number_digits, r);
</span><span class="cx">         if (sangomabc_connection_write(&sangoma_boost_data->mcon, &event) <= 0) {
</span><del>-                release_request_id(r);
</del><span class="cx">                 ftdm_log(FTDM_LOG_CRIT, "Failed to tx boost event [%s]\n", strerror(errno));
</span><span class="cx">                 return FTDM_FAIL;
</span><span class="cx">         }
</span><span class="lines">@@ -608,22 +547,15 @@
</span><span class="cx"> {
</span><span class="cx">         
</span><span class="cx">         ftdm_channel_t *ftdmchan = NULL;
</span><del>-        uint32_t event_span = event->span+1;
-        uint32_t event_chan = event->chan+1;
</del><ins>+        uint32_t event_span = BOOST_EVENT_SPAN(mcon->sigmod, event);
+        uint32_t event_chan = BOOST_EVENT_CHAN(mcon->sigmod, event);
</ins><span class="cx">
</span><del>-        
</del><span class="cx">         if (nack_map[event->call_setup_id]) {
</span><del>-                /* In this scenario outgoing call was alrady stopped
-                  via NACK and now we are expecting an NACK_ACK.
-         If we receive an ACK its a race condition thus
-                 ignor it */
</del><span class="cx">                 return;
</span><span class="cx">         }
</span><span class="cx">
</span><del>-        if (mcon->sigmod) {
-                event_span = event->span;
-                event_chan = event->chan;
-        }
</del><ins>+        OUTBOUND_REQUESTS[event->call_setup_id].event = *event;
+        SETUP_GRID[event->span][event->chan] = event->call_setup_id;
</ins><span class="cx">
</span><span class="cx">         if (mcon->sigmod) {
</span><span class="cx">                 ftdmchan = OUTBOUND_REQUESTS[event->call_setup_id].ftdmchan;
</span><span class="lines">@@ -637,12 +569,6 @@
</span><span class="cx">                 if (ftdm_channel_open_chan(ftdmchan) != FTDM_SUCCESS) {
</span><span class="cx">                         ftdm_log(FTDM_LOG_ERROR, "Failed to open FTDM channel [%s]\n", ftdmchan->last_error);
</span><span class="cx">                 } else {
</span><del>-
-                        /* Only bind the setup id to GRID when we are sure that channel is ready
-                         otherwise we could overwite the original call */
-                        OUTBOUND_REQUESTS[event->call_setup_id].event = *event;
-                        SETUP_GRID[event->span][event->chan] = event->call_setup_id;
-
</del><span class="cx">                         ftdm_set_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND);
</span><span class="cx">                         ftdm_set_flag_locked(ftdmchan, FTDM_CHANNEL_INUSE);
</span><span class="cx">                         ftdmchan->sflags = SFLAG_RECVD_ACK;
</span><span class="lines">@@ -681,44 +607,15 @@
</span><span class="cx">                         OUTBOUND_REQUESTS[event->call_setup_id].status = BST_READY;
</span><span class="cx">                         return;
</span><span class="cx">                 }
</span><ins>+        }
</ins><span class="cx">
</span><del>-        } else {
-
-                ftdm_assert(!mcon->sigmod, "CALL STOP ACK: Invalid Sigmod Path");
-
-                if ((ftdmchan = find_ftdmchan(OUTBOUND_REQUESTS[event->call_setup_id].span, (sangomabc_short_event_t*)event, 1))) {
-                                int r;
-                                /* NC: If we get CALL START ACK and channel is in active state
-                                                then we are completely out of sync with the other end.
-                                                Treat CALL START ACK as CALL STOP and hangup the current call.
-                                */
-
-                                if (ftdmchan->state == FTDM_CHANNEL_STATE_UP ||
-                                        ftdmchan->state == FTDM_CHANNEL_STATE_PROGRESS_MEDIA ||
-                                        ftdmchan->state == FTDM_CHANNEL_STATE_PROGRESS) {
-                                        ftdm_log(FTDM_LOG_CRIT, "ZCHAN CALL ACK STATE UP -> Changed to TERMINATING %d:%d\n", event->span+1,event->chan+1);
-                                        ftdm_set_state_r(ftdmchan, FTDM_CHANNEL_STATE_TERMINATING, 0, r);
-                                } else if (ftdmchan->state == FTDM_CHANNEL_STATE_HANGUP || ftdm_test_sflag(ftdmchan, SFLAG_HANGUP)) {
-                                        ftdm_log(FTDM_LOG_CRIT, "ZCHAN CALL ACK STATE HANGUP -> Changed to HANGUP COMPLETE %d:%d\n", event->span+1,event->chan+1);
-                                        ftdm_set_state_r(ftdmchan, FTDM_CHANNEL_STATE_HANGUP_COMPLETE, 0, r);
-                                } else {
-                                        ftdm_log(FTDM_LOG_CRIT, "ZCHAN STATE INVALID State %s on IN CALL ACK %d:%d\n",
-                                                 ftdm_channel_state2str(ftdmchan->state),event->span+1,event->chan+1);
-                                }
-                                ftdm_set_sflag(ftdmchan, SFLAG_SENT_FINAL_MSG);
-                                ftdmchan=NULL;
-                }
-        }
-
-
</del><span class="cx">         if (!ftdmchan) {
</span><del>-                ftdm_log(FTDM_LOG_CRIT, "START ACK CANT FIND A CHAN %d:%d\n", event->span+1,event->chan+1);
</del><ins>+                ftdm_log(FTDM_LOG_CRIT, "START ACK CANT FIND A CHAN %d:%d\n", BOOST_EVENT_SPAN(mcon->sigmod, event), BOOST_EVENT_CHAN(mcon->sigmod, event));
</ins><span class="cx">         } else {
</span><span class="cx">                 /* only reason to be here is failed to open channel when we we're in sigmod */
</span><span class="cx">                 ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_TERMINATING);
</span><del>-                ftdm_set_sflag(ftdmchan, SFLAG_SENT_FINAL_MSG);
</del><span class="cx">         }
</span><del>-        
</del><ins>+        ftdm_set_sflag(ftdmchan, SFLAG_SENT_FINAL_MSG);
</ins><span class="cx">         sangomabc_exec_command(mcon,
</span><span class="cx">                                          event->span,
</span><span class="cx">                                          event->chan,
</span><span class="lines">@@ -739,7 +636,7 @@
</span><span class="cx"> {
</span><span class="cx">         ftdm_channel_t *ftdmchan;
</span><span class="cx">         int r = 0;
</span><del>-
</del><ins>+        
</ins><span class="cx">         if ((ftdmchan = find_ftdmchan(span, event, 1))) {
</span><span class="cx">                 ftdm_sangoma_boost_data_t *sangoma_boost_data = ftdmchan->span->signal_data;
</span><span class="cx">                 ftdm_mutex_lock(ftdmchan->mutex);
</span><span class="lines">@@ -761,6 +658,7 @@
</span><span class="cx">
</span><span class="cx">                 ftdm_set_state_r(ftdmchan, FTDM_CHANNEL_STATE_HANGUP_COMPLETE, 0, r);
</span><span class="cx">                 if (r) {
</span><ins>+                        ftdm_set_sflag(ftdmchan, SFLAG_FREE_REQ_ID);
</ins><span class="cx">                         ftdm_mutex_unlock(ftdmchan->mutex);
</span><span class="cx">                         return;
</span><span class="cx">                 }
</span><span class="lines">@@ -779,7 +677,6 @@
</span><span class="cx">         }
</span><span class="cx"> }
</span><span class="cx">
</span><del>-
</del><span class="cx"> /**
</span><span class="cx"> * \brief Handler for call start nack event
</span><span class="cx"> * \param span Span where event was fired
</span><span class="lines">@@ -821,7 +718,7 @@
</span><span class="cx">         if (event->call_setup_id) {
</span><span class="cx">                 if (sangoma_boost_data->sigmod) {
</span><span class="cx">                         ftdmchan = OUTBOUND_REQUESTS[event->call_setup_id].ftdmchan;
</span><del>-                        CALL_DATA(ftdmchan)->last_event_id = event->event_id;
</del><ins>+                        ftdmchan->call_data = (void*)(intptr_t)event->event_id;
</ins><span class="cx">                         ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_TERMINATING);
</span><span class="cx">                 } else {
</span><span class="cx">                         sangomabc_exec_command(mcon,
</span><span class="lines">@@ -843,7 +740,7 @@
</span><span class="cx">                         /* if there is no call setup id this should not be an outbound channel for sure */
</span><span class="cx">                         ftdm_assert(!ftdm_test_flag(ftdmchan, FTDM_CHANNEL_OUTBOUND), "Yay, outbound flag should not be set here!\n");
</span><span class="cx">
</span><del>-                        CALL_DATA(ftdmchan)->last_event_id = event->event_id;
</del><ins>+                        ftdmchan->call_data = (void*)(intptr_t)event->event_id;
</ins><span class="cx">                         ftdm_mutex_lock(ftdmchan->mutex);
</span><span class="cx">                         ftdm_set_state_r(ftdmchan, FTDM_CHANNEL_STATE_TERMINATING, 0, r);
</span><span class="cx">                         if (r == FTDM_STATE_CHANGE_SUCCESS) {
</span><span class="lines">@@ -896,16 +793,7 @@
</span><span class="cx">
</span><span class="cx">                 ftdm_mutex_lock(ftdmchan->mutex);
</span><span class="cx">                 
</span><del>-                if (ftdm_test_sflag(ftdmchan, SFLAG_HANGUP) ||
-                        ftdmchan->state == FTDM_CHANNEL_STATE_DOWN ||
-                        ftdmchan->state == FTDM_CHANNEL_STATE_TERMINATING) {
-
-                        /* NC: Checking for state DOWN because ss7box can
-                                send CALL_STOP twice in a row. If we do not check for
-                                STATE_DOWN we will set the state back to termnating
-                                and block the channel forever
-                        */
-
</del><ins>+                if (ftdm_test_sflag(ftdmchan, SFLAG_HANGUP)) {
</ins><span class="cx">                         /* racing condition where both sides initiated a hangup
</span><span class="cx">                          * Do not change current state as channel is already clearing
</span><span class="cx">                          * itself through local initiated hangup */
</span><span class="lines">@@ -933,6 +821,10 @@
</span><span class="cx">                         ftdmchan->caller_data.hangup_cause = event->release_cause;
</span><span class="cx">                 }
</span><span class="cx">
</span><ins>+                if (r) {
+                        ftdm_set_sflag(ftdmchan, SFLAG_FREE_REQ_ID);
+                }
+
</ins><span class="cx">                 ftdm_mutex_unlock(ftdmchan->mutex);
</span><span class="cx">
</span><span class="cx">                 if (r) {
</span><span class="lines">@@ -956,25 +848,15 @@
</span><span class="cx">         
</span><span class="cx">         if ((ftdmchan = find_ftdmchan(span, event, 1))) {
</span><span class="cx">                 ftdm_mutex_lock(ftdmchan->mutex);
</span><del>-
-                if (ftdm_test_sflag(ftdmchan, SFLAG_HANGUP) ||
-                        ftdmchan->state == FTDM_CHANNEL_STATE_DOWN ||
-                        ftdmchan->state == FTDM_CHANNEL_STATE_TERMINATING) {
-
-                        /* NC: Do nothing here because we are in process
-                                of stopping the call. So ignore the ANSWER. */
-                        ftdm_log(FTDM_LOG_CRIT, "ANSWER BUT CALL IS HANGUP %d:%d\n", event->span+1,event->chan+1);
-
-                } else if (ftdmchan->state == FTDM_CHANNEL_STATE_HOLD) {
</del><ins>+                if (ftdmchan->state == FTDM_CHANNEL_STATE_HOLD) {
</ins><span class="cx">                         ftdmchan->init_state = FTDM_CHANNEL_STATE_UP;
</span><del>-
</del><span class="cx">                 } else {
</span><span class="cx">                         int r = 0;
</span><span class="cx">                         ftdm_set_state_r(ftdmchan, FTDM_CHANNEL_STATE_UP, 0, r);
</span><span class="cx">                 }
</span><span class="cx">                 ftdm_mutex_unlock(ftdmchan->mutex);
</span><span class="cx">         } else {
</span><del>-                ftdm_log(FTDM_LOG_CRIT, "ANSWER CANT FIND A CHAN %d:%d\n", event->span+1,event->chan+1);
</del><ins>+                ftdm_log(FTDM_LOG_CRIT, "ANSWER CANT FIND A CHAN %d:%d\n", BOOST_EVENT_SPAN(mcon, event), BOOST_EVENT_CHAN(mcon, event));
</ins><span class="cx">                 sangomabc_exec_command(mcon,
</span><span class="cx">                                                          event->span,
</span><span class="cx">                                                          event->chan,
</span><span class="lines">@@ -999,33 +881,23 @@
</span><span class="cx">         if (!(ftdmchan = find_ftdmchan(span, (sangomabc_short_event_t*)event, 0))) {
</span><span class="cx">                 if ((ftdmchan = find_ftdmchan(span, (sangomabc_short_event_t*)event, 1))) {
</span><span class="cx">                         int r;
</span><del>-
-                         /* NC: If we get CALL START and channel is in active state
-                         then we are completely out of sync with the other end.
-                                 Treat CALL START as CALL STOP and hangup the current call.
-                                        The incoming call will also be NACKed.
-                         */
-
-                        if (ftdmchan->state == FTDM_CHANNEL_STATE_UP ||
-                                ftdmchan->state == FTDM_CHANNEL_STATE_PROGRESS_MEDIA ||
-                                ftdmchan->state == FTDM_CHANNEL_STATE_PROGRESS) {
-                                ftdm_log(FTDM_LOG_CRIT, "ZCHAN STATE UP -> Changed to TERMINATING %d:%d\n", event->span+1,event->chan+1);
</del><ins>+                        if (ftdmchan->state == FTDM_CHANNEL_STATE_UP) {
+                                ftdm_log(FTDM_LOG_CRIT, "ZCHAN STATE UP -> Changed to TERMINATING %d:%d\n", BOOST_EVENT_SPAN(mcon->sigmod, event), BOOST_EVENT_CHAN(mcon->sigmod, event));
</ins><span class="cx">                                 ftdm_set_state_r(ftdmchan, FTDM_CHANNEL_STATE_TERMINATING, 0, r);
</span><del>-                        } else if (ftdmchan->state == FTDM_CHANNEL_STATE_HANGUP || ftdm_test_sflag(ftdmchan, SFLAG_HANGUP)) {
-                                ftdm_log(FTDM_LOG_CRIT, "ZCHAN STATE HANGUP -> Changed to HANGUP COMPLETE %d:%d\n", event->span+1,event->chan+1);
-                                ftdm_set_state_r(ftdmchan, FTDM_CHANNEL_STATE_HANGUP_COMPLETE, 0, r);
</del><ins>+                        } else if (ftdm_test_sflag(ftdmchan, SFLAG_HANGUP)) {
+                                ftdm_log(FTDM_LOG_CRIT, "ZCHAN STATE HANGUP -> Changed to HANGUP COMPLETE %d:%d\n", BOOST_EVENT_SPAN(mcon->sigmod, event), BOOST_EVENT_CHAN(mcon->sigmod, event));        ftdm_set_state_r(ftdmchan, FTDM_CHANNEL_STATE_HANGUP_COMPLETE, 0, r);
</ins><span class="cx">                         } else {
</span><del>-                                ftdm_log(FTDM_LOG_CRIT, "ZCHAN STATE INVALID %s on IN CALL %d:%d\n", ftdm_channel_state2str(ftdmchan->state),event->span+1,event->chan+1);
</del><ins>+                                ftdm_log(FTDM_LOG_CRIT, "ZCHAN STATE INVALID %s on IN CALL %d:%d\n", ftdm_channel_state2str(ftdmchan->state),BOOST_EVENT_SPAN(mcon->sigmod, event), BOOST_EVENT_CHAN(mcon->sigmod, event));
</ins><span class="cx">                         }
</span><span class="cx">                         ftdm_set_sflag(ftdmchan, SFLAG_SENT_FINAL_MSG);
</span><span class="cx">                         ftdmchan = NULL;
</span><span class="cx">                 }
</span><del>-                ftdm_log(FTDM_LOG_CRIT, "START CANT FIND CHAN %d:%d\n", event->span+1,event->chan+1);
</del><ins>+                ftdm_log(FTDM_LOG_CRIT, "START CANT FIND CHAN %d:%d\n", BOOST_EVENT_SPAN(mcon->sigmod, event), BOOST_EVENT_CHAN(mcon->sigmod, event));
</ins><span class="cx">                 goto error;
</span><span class="cx">         }
</span><span class="cx">
</span><span class="cx">         if (ftdm_channel_open_chan(ftdmchan) != FTDM_SUCCESS) {
</span><del>-                ftdm_log(FTDM_LOG_CRIT, "START CANT OPEN CHAN %d:%d\n", event->span+1,event->chan+1);
</del><ins>+                ftdm_log(FTDM_LOG_CRIT, "START CANT OPEN CHAN %d:%d\n", BOOST_EVENT_SPAN(mcon->sigmod, event), BOOST_EVENT_CHAN(mcon->sigmod, event));
</ins><span class="cx">                 goto error;
</span><span class="cx">         }
</span><span class="cx">         
</span><span class="lines">@@ -1091,12 +963,12 @@
</span><span class="cx">         ftdm_channel_t *ftdmchan;
</span><span class="cx">
</span><span class="cx">         if (!(ftdmchan = find_ftdmchan(span, (sangomabc_short_event_t*)event, 0))) {
</span><del>-                ftdm_log(FTDM_LOG_CRIT, "CANNOT START LOOP, CHAN NOT AVAILABLE %d:%d\n", event->span+1,event->chan+1);
</del><ins>+                ftdm_log(FTDM_LOG_CRIT, "CANNOT START LOOP, CHAN NOT AVAILABLE %d:%d\n", BOOST_EVENT_SPAN(mcon->sigmod, event), BOOST_EVENT_CHAN(mcon->sigmod, event));
</ins><span class="cx">                 return;
</span><span class="cx">         }
</span><span class="cx">
</span><span class="cx">         if (ftdm_channel_open_chan(ftdmchan) != FTDM_SUCCESS) {
</span><del>-                ftdm_log(FTDM_LOG_CRIT, "CANNOT START LOOP, CANT OPEN CHAN %d:%d\n", event->span+1,event->chan+1);
</del><ins>+                ftdm_log(FTDM_LOG_CRIT, "CANNOT START LOOP, CANT OPEN CHAN %d:%d\n", BOOST_EVENT_SPAN(mcon->sigmod, event), BOOST_EVENT_CHAN(mcon->sigmod, event));
</ins><span class="cx">                 return;
</span><span class="cx">         }
</span><span class="cx">
</span><span class="lines">@@ -1114,7 +986,7 @@
</span><span class="cx">         ftdm_channel_t *ftdmchan;
</span><span class="cx">         ftdm_status_t res = FTDM_FAIL;
</span><span class="cx">         if (!(ftdmchan = find_ftdmchan(span, (sangomabc_short_event_t*)event, 1))) {
</span><del>-                ftdm_log(FTDM_LOG_CRIT, "CANNOT STOP LOOP, INVALID CHAN REQUESTED %d:%d\n", event->span+1,event->chan+1);
</del><ins>+                ftdm_log(FTDM_LOG_CRIT, "CANNOT STOP LOOP, INVALID CHAN REQUESTED %d:%d\n", BOOST_EVENT_SPAN(mcon->sigmod, event), BOOST_EVENT_CHAN(mcon->sigmod, event));
</ins><span class="cx">                 return;
</span><span class="cx">         }
</span><span class="cx">         if (ftdmchan->state != FTDM_CHANNEL_STATE_IN_LOOP) {
</span><span class="lines">@@ -1192,14 +1064,14 @@
</span><span class="cx">                 ftdm_log(FTDM_LOG_WARNING, "Error Incoming digit with len %s %d [w%dg%d]\n",
</span><span class="cx">                                  event->called_number_digits,
</span><span class="cx">                                  event->called_number_digits_count,
</span><del>-                                 event->span+1, event->chan+1);
</del><ins>+                                 BOOST_EVENT_SPAN(mcon->sigmod, event), BOOST_EVENT_CHAN(mcon->sigmod, event));
</ins><span class="cx">                 return;
</span><span class="cx">         }
</span><span class="cx">
</span><span class="cx">         ftdm_log(FTDM_LOG_WARNING, "Incoming digit with len %s %d [w%dg%d]\n",
</span><del>-                                 event->called_number_digits,
-                                 event->called_number_digits_count,
-                                 event->span+1, event->chan+1);
</del><ins>+                                        event->called_number_digits,
+                                        event->called_number_digits_count,
+                                        BOOST_EVENT_SPAN(mcon->sigmod, event), BOOST_EVENT_CHAN(mcon->sigmod, event));
</ins><span class="cx">
</span><span class="cx">         memcpy(digits, event->called_number_digits, event->called_number_digits_count);
</span><span class="cx">         ftdm_channel_queue_dtmf(ftdmchan, digits);
</span><span class="lines">@@ -1236,7 +1108,9 @@
</span><span class="cx"> case SIGBOOST_EVENT_REMOVE_CHECK_LOOP:
</span><span class="cx"> case SIGBOOST_EVENT_CALL_RELEASED:
</span><span class="cx"> if (!(ftdmchan = find_ftdmchan(span, (sangomabc_short_event_t*)event, 1))) {
</span><del>- ftdm_log(FTDM_LOG_DEBUG, "PROCESS STATES CANT FIND CHAN %d:%d\n", event->span+1,event->chan+1);
</del><ins>+ ftdm_log(FTDM_LOG_DEBUG, "PROCESS STATES CANT FIND CHAN %d:%d\n",
+                                                                                                                                                                                        BOOST_EVENT_SPAN(((ftdm_sangoma_boost_data_t*)(span->signal_data))->sigmod, event),
+                                                                                                                                                                                        BOOST_EVENT_CHAN(((ftdm_sangoma_boost_data_t*)(span->signal_data))->sigmod, event));
</ins><span class="cx"> return NULL;
</span><span class="cx"> }
</span><span class="cx"> break;
</span><span class="lines">@@ -1305,12 +1179,8 @@
</span><span class="cx">                 handle_call_done(span, mcon, event);
</span><span class="cx">                 break;
</span><span class="cx"> case SIGBOOST_EVENT_CALL_START_NACK_ACK:
</span><del>-                /* On NACK ack span chan are always invalid
-                 All there is to do is to clear the id */
-                if (event->call_setup_id) {
-                        nack_map[event->call_setup_id] = 0;
-                        release_request_id(event->call_setup_id);
-                }
</del><ins>+                handle_call_done(span, mcon, event);
+                nack_map[event->call_setup_id] = 0;
</ins><span class="cx">                 break;
</span><span class="cx"> case SIGBOOST_EVENT_INSERT_CHECK_LOOP:
</span><span class="cx">                 handle_call_loop_start(span, mcon, event);
</span><span class="lines">@@ -1369,12 +1239,14 @@
</span><span class="cx">                         int call_stopped_ack_sent = 0;
</span><span class="cx">                         ftdm_sangoma_boost_data_t *sangoma_boost_data = ftdmchan->span->signal_data;
</span><span class="cx">
</span><del>-                        release_request_id_span_chan(ftdmchan->physical_span_id-1, ftdmchan->physical_chan_id-1);
</del><ins>+                        if (ftdm_test_sflag(ftdmchan, SFLAG_FREE_REQ_ID)) {
+                                release_request_id_span_chan(ftdmchan->physical_span_id-1, ftdmchan->physical_chan_id-1);
+                        }
</ins><span class="cx">
</span><span class="cx">                         if (!ftdm_test_sflag(ftdmchan, SFLAG_SENT_FINAL_MSG)) {
</span><span class="cx">                                 ftdm_set_sflag_locked(ftdmchan, SFLAG_SENT_FINAL_MSG);
</span><span class="cx">
</span><del>-                                if (ftdmchan->call_data && CALL_DATA(ftdmchan)->last_event_id == SIGBOOST_EVENT_CALL_START_NACK) {
</del><ins>+                                if (ftdmchan->call_data && ((uint32_t)(intptr_t)ftdmchan->call_data == SIGBOOST_EVENT_CALL_START_NACK)) {
</ins><span class="cx">                                         sangomabc_exec_command(mcon,
</span><span class="cx">                                                                         BOOST_SPAN(ftdmchan),
</span><span class="cx">                                                                         BOOST_CHAN(ftdmchan),
</span><span class="lines">@@ -1394,8 +1266,7 @@
</span><span class="cx">                                 }
</span><span class="cx">                         }
</span><span class="cx">                         ftdmchan->sflags = 0;
</span><del>-                        memset(ftdmchan->call_data,0,sizeof(sangoma_boost_call_t));
-
</del><ins>+                        ftdmchan->call_data = NULL;
</ins><span class="cx">                         if (sangoma_boost_data->sigmod && call_stopped_ack_sent) {
</span><span class="cx">                                 /* we dont want to call ftdm_channel_done just yet until call released is received */
</span><span class="cx">                                 ftdm_log(FTDM_LOG_DEBUG, "Waiting for call release confirmation before declaring chan %d:%d as available \n",
</span><span class="lines">@@ -1586,17 +1457,13 @@
</span><span class="cx">                 uint32_t j;
</span><span class="cx">                 ftdm_clear_flag_locked(span, FTDM_SPAN_STATE_CHANGE);
</span><span class="cx">                 if (susp) {
</span><del>-                        for(j = 1; j <= span->chan_count; j++) {
-                                if (ftdm_test_flag((span->channels[j]), FTDM_CHANNEL_STATE_CHANGE) || susp) {
-                                        ftdm_mutex_lock(span->channels[j]->mutex);
-                                        ftdm_clear_flag((span->channels[j]), FTDM_CHANNEL_STATE_CHANGE);
-                                        if (susp && span->channels[j]->state != FTDM_CHANNEL_STATE_DOWN) {
-                                                ftdm_channel_set_state(span->channels[j], FTDM_CHANNEL_STATE_RESTART, 0);
-                                        }
-                                        state_advance(span->channels[j]);
-                                        ftdm_channel_complete_state(span->channels[j]);
-                                        ftdm_mutex_unlock(span->channels[j]->mutex);
-                                }
</del><ins>+                        for (j = 0; j <= span->chan_count; j++) {
+                                ftdm_mutex_lock(span->channels[j]->mutex);
+                                ftdm_clear_flag((span->channels[j]), FTDM_CHANNEL_STATE_CHANGE);
+                                ftdm_channel_set_state(span->channels[j], FTDM_CHANNEL_STATE_RESTART, 0);
+                                state_advance(span->channels[j]);
+                                ftdm_channel_complete_state(span->channels[j]);
+                                ftdm_mutex_unlock(span->channels[j]->mutex);
</ins><span class="cx">                         }
</span><span class="cx">                 } else {
</span><span class="cx">                         while ((ftdmchan = ftdm_queue_dequeue(span->pendingchans))) {
</span><span class="lines">@@ -1775,8 +1642,8 @@
</span><span class="cx">                         sangoma_boost_data->iteration = 0;
</span><span class="cx">                 }
</span><span class="cx"> #endif
</span><del>-                res = ftdm_interrupt_multiple_wait(ints, numints, 100);
-                if (FTDM_SUCCESS != res && FTDM_TIMEOUT != res) {
</del><ins>+                res = ftdm_interrupt_multiple_wait(ints, numints, -1);
+                if (FTDM_SUCCESS != res) {
</ins><span class="cx">                         ftdm_log(FTDM_LOG_CRIT, "Unexpected return value from interrupt waiting: %d\n", res);
</span><span class="cx">                         return -1;
</span><span class="cx">                 }
</span><span class="lines">@@ -1863,6 +1730,7 @@
</span><span class="cx">
</span><span class="cx">                 if (ftdm_boost_wait_event(span) < 0) {
</span><span class="cx">                         ftdm_log(FTDM_LOG_ERROR, "ftdm_boost_wait_event failed\n");
</span><ins>+                        goto error;
</ins><span class="cx">                 }
</span><span class="cx">                 
</span><span class="cx">                 while ((event = ftdm_boost_read_event(span))) {
</span><span class="lines">@@ -1875,6 +1743,7 @@
</span><span class="cx">
</span><span class="cx">         goto end;
</span><span class="cx">
</span><ins>+error:
</ins><span class="cx">         ftdm_log(FTDM_LOG_CRIT, "Boost event processing Error!\n");
</span><span class="cx">
</span><span class="cx"> end:
</span><span class="lines">@@ -1889,53 +1758,7 @@
</span><span class="cx">         return NULL;
</span><span class="cx"> }
</span><span class="cx">
</span><del>-#if 0
-static int sigmod_ss7box_isup_exec_cmd(ftdm_stream_handle_t *stream, char *cmd)
-{
-        FILE *fp;
-        int status=0;
-        char path[1024];
-        
-        fp = popen(cmd, "r");
-        if (fp == NULL) {
-                stream->write_function(stream, "%s: -ERR failed to execute cmd: %s\n",
-                                __FILE__,cmd);
-                return -1;
-        }
-        
-        while (fgets(path, sizeof(path)-1, fp) != NULL) {
-                path[sizeof(path)-1]='\0';
-                stream->write_function(stream,"%s", path);
-        }
-        
-        
-        status = pclose(fp);
-        if (status == -1) {
-                /* Error reported by pclose() */
-        } else {
-                /* Use macros described under wait() to inspect `status' in order
-                to determine success/failure of command executed by popen() */
-        }
</del><span class="cx">
</span><del>-        return status;
-}
-#endif
-
-static void ftdm_cli_span_state_cmd(ftdm_span_t *span, char *state)
-{
-        int j;
-        int cnt=0;
-        for(j = 1; j <= span->chan_count; j++) {
-                if (span->channels[j]->state != FTDM_CHANNEL_STATE_DOWN) {
-                        ftdm_channel_t *ftdmchan = span->channels[j];
-                        ftdm_log(FTDM_LOG_CRIT, "Channel %i s%dc%d State=%s\n",
-                                j,ftdmchan->physical_span_id-1,ftdmchan->physical_chan_id-1,ftdm_channel_state2str(ftdmchan->state));
-                        cnt++;
-                }
-        }
-        ftdm_log(FTDM_LOG_CRIT, "Total Channel Cnt %i\n",cnt);
-}
-
</del><span class="cx"> #define FTDM_BOOST_SYNTAX "list sigmods | <sigmod_name> <command>"
</span><span class="cx"> /**
</span><span class="cx"> * \brief API function to kill or debug a sangoma_boost span
</span><span class="lines">@@ -1957,85 +1780,18 @@
</span><span class="cx">                 if (!strcasecmp(argv[0], "list")) {
</span><span class="cx">                         if (!strcasecmp(argv[1], "sigmods")) {
</span><span class="cx">                                 if (ftdm_sangoma_boost_list_sigmods(stream) != FTDM_SUCCESS) {
</span><del>-                                        stream->write_function(stream, "-ERR failed to list sigmods\n");
</del><ins>+                                        stream->write_function(stream, "%s: -ERR failed to execute cmd\n", __FILE__);
</ins><span class="cx">                                         goto done;
</span><span class="cx">                                 }
</span><span class="cx">                                 goto done;
</span><span class="cx">                         }
</span><del>-
-                        if (!strcasecmp(argv[1], "ids")) {
-                                print_request_ids();
-                                goto done;
-                        }
-                        
-#ifndef __WINDOWS__
-#if 0
-/* NC: This code crashes the kernel due to fork on heavy fs load */
-                } else if (!strcasecmp(argv[0], "ss7box_isupd_ckt")) {
-                
-                        if (!strcasecmp(argv[1], "used")) {
-                                stream->write_function(stream, "ss7box_isupd: in use\n", FTDM_BOOST_SYNTAX);
-                                sigmod_ss7box_isup_exec_cmd(stream, (char*) "ckt_report.sh inuse");
-                        } else if (!strcasecmp(argv[1], "reset")) {
-                                stream->write_function(stream, "ss7box_isupd: in reset\n", FTDM_BOOST_SYNTAX);
-                                sigmod_ss7box_isup_exec_cmd(stream, (char*) "ckt_report.sh reset");
-                        } else if (!strcasecmp(argv[1], "ready")) {
-                                stream->write_function(stream, "ss7box_isupd: ready \n", FTDM_BOOST_SYNTAX);
-                                sigmod_ss7box_isup_exec_cmd(stream, (char*) "ckt_report.sh free");
-                        } else {
-                                stream->write_function(stream, "ss7box_isupd: list\n", FTDM_BOOST_SYNTAX);
-                                sigmod_ss7box_isup_exec_cmd(stream, (char*) "ckt_report.sh");
-                        }
-
-                        goto done;
-#endif
-#endif
-
-                } else if (!strcasecmp(argv[0], "span")) {
-                        sangomabc_connection_t *pcon;
-                        ftdm_sangoma_boost_data_t *sangoma_boost_data;
-                        ftdm_span_t *span;
-
-                        if (argc <= 2) {
-                                stream->write_function(stream, "-ERR invalid span usage: span <name> <cmd>\n");
-                                goto done;
-                        }
-
-                        int err = ftdm_span_find_by_name(argv[1], &span);
-                        if (FTDM_SUCCESS != err) {
-                                stream->write_function(stream, "-ERR failed to find span by name %s\n",argv[1]);
-                                goto done;
-                        }
-
-                        if (!strcasecmp(argv[2], "restart")) {
-                                sangoma_boost_data = span->signal_data;
-                                pcon = &sangoma_boost_data->pcon;
-
-                                /* No need to set any span flags because
-                          our RESTART will generate a RESTART from the sig daemon */
-                                sangomabc_exec_commandp(pcon,
-                                                 0,
-                                                 0,
-                                                 -1,
-                                                 SIGBOOST_EVENT_SYSTEM_RESTART,
-                                                 0);                
-                        } else if (!strcasecmp(argv[2], "state")) {
-                                if (argc <= 3) {
-                                        stream->write_function(stream, "-ERR invalid span state: span <name> state <state name>\n");
-                                        goto done;
-                                }
-                                ftdm_cli_span_state_cmd(span,argv[3]);
-                        }
-
-                        goto done;
-
</del><span class="cx">                 } else {
</span><span class="cx">                         boost_sigmod_interface_t *sigmod_iface = NULL;
</span><span class="cx">                         sigmod_iface = hashtable_search(g_boost_modules_hash, argv[0]);
</span><span class="cx">                         if (sigmod_iface) {
</span><span class="cx">                                 char *p = strchr(data, ' ');
</span><span class="cx">                                 if (++p) {
</span><del>-                                        char* mydup = strdup(p);
</del><ins>+                                        char* mydup = ftdm_strdup(p);
</ins><span class="cx">                                         if(sigmod_iface->exec_api == NULL) {
</span><span class="cx">                                                 stream->write_function(stream, "%s does not support api functions\n", sigmod_iface->name);
</span><span class="cx">                                                 goto done;
</span><span class="lines">@@ -2044,7 +1800,7 @@
</span><span class="cx">                                         if (sigmod_iface->exec_api(stream, mydup) != FTDM_SUCCESS) {
</span><span class="cx">                                                 stream->write_function(stream, "-ERR:failed to execute command:%s\n", mydup);
</span><span class="cx">                                         }
</span><del>-                                        free(mydup);
</del><ins>+                                        ftdm_safe_free(mydup);
</ins><span class="cx">                                 }
</span><span class="cx">                                 
</span><span class="cx">                                 goto done;
</span><span class="lines">@@ -2066,7 +1822,7 @@
</span><span class="cx"> */
</span><span class="cx"> static FIO_IO_LOAD_FUNCTION(ftdm_sangoma_boost_io_init)
</span><span class="cx"> {
</span><del>-        ftdm_assert(fio != NULL, "fio is NULL");
</del><ins>+        assert(fio != NULL);
</ins><span class="cx">         memset(&ftdm_sangoma_boost_interface, 0, sizeof(ftdm_sangoma_boost_interface));
</span><span class="cx">
</span><span class="cx">         ftdm_sangoma_boost_interface.name = "boost";
</span><span class="lines">@@ -2449,7 +2205,6 @@
</span><span class="cx">         ftdm_dso_lib_t lib = NULL;
</span><span class="cx">         char path[255] = "";
</span><span class="cx">         char *err = NULL;
</span><del>-        int j = 0;
</del><span class="cx">         unsigned paramindex = 0;
</span><span class="cx">         ftdm_status_t rc = FTDM_SUCCESS;
</span><span class="cx">
</span><span class="lines">@@ -2544,14 +2299,6 @@
</span><span class="cx">                 ftdm_set_string(sangoma_boost_data->mcon.cfg.remote_ip, remote_ip);
</span><span class="cx">                 sangoma_boost_data->mcon.cfg.remote_port = remote_port;
</span><span class="cx">         }
</span><del>-
-        for (j = 1; j <= span->chan_count; j++) {
-                span->channels[j]->call_data = ftdm_calloc(1,sizeof(sangoma_boost_call_t));
-                if (!span->channels[j]->call_data) {
-                        FAIL_CONFIG_RETURN(FTDM_FAIL);
-                }
-        }
-
</del><span class="cx">         span->signal_cb = sig_cb;
</span><span class="cx">         span->start = ftdm_sangoma_boost_start;
</span><span class="cx">         span->stop = ftdm_sangoma_boost_stop;
</span></span></pre>
</div>
</div>
<div id="footer">See you at ClueCon</div>
</body>
</html>