]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
freetdm: OPENZAP-124 - Add round robin hunting direction (Patched by Ric)
authorMoises Silva <moy@sangoma.com>
Sat, 18 Dec 2010 01:04:30 +0000 (20:04 -0500)
committerMoises Silva <moy@sangoma.com>
Sat, 18 Dec 2010 01:04:30 +0000 (20:04 -0500)
libs/freetdm/mod_freetdm/mod_freetdm.c
libs/freetdm/src/ftdm_io.c
libs/freetdm/src/include/freetdm.h
libs/freetdm/src/include/private/ftdm_core.h

index 0615b3821b3f76cef81ce892f15e0b12c91d12db..7637932b792c5ff4223bf9c4a004338cc633544f 100755 (executable)
@@ -1136,6 +1136,10 @@ static switch_call_cause_t channel_outgoing_channel(switch_core_session_t *sessi
                direction = FTDM_BOTTOM_UP;
        } else if (*argv[1] == 'a') {
                direction =  FTDM_TOP_DOWN;
+       } else if (*argv[1] == 'r') {
+               direction =  FTDM_RR_DOWN;
+       } else if (*argv[1] == 'R') {
+               direction =  FTDM_RR_UP;
        } else {
                chan_id = atoi(argv[1]);
        }
index 36b7632cb330c6145353658f02d9787d4a32146f..94a01aa7bafe769546e800f809ee58cd044c0d60 100644 (file)
@@ -1706,6 +1706,21 @@ static ftdm_status_t __inline__ get_best_rated(ftdm_channel_t **fchan, ftdm_chan
        return FTDM_SUCCESS;
 }
 
+static uint32_t __inline__ rr_next(uint32_t last, uint32_t min, uint32_t max, ftdm_direction_t direction)
+{
+       uint32_t next = min;
+
+       ftdm_log(FTDM_LOG_DEBUG, "last = %d, min = %d, max = %d\n", last, min, max);
+
+       if (direction == FTDM_RR_DOWN) {
+               next = (last >= max) ? min : ++last;
+       } else {
+               next = (last <= min) ? max : --last;
+       }
+       return next;
+}
+
+
 FT_DECLARE(int) ftdm_channel_get_availability(ftdm_channel_t *ftdmchan)
 {
        int availability = -1;
@@ -1748,6 +1763,8 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_open_by_group(uint32_t group_id, ftdm_dir
        
        if (direction == FTDM_TOP_DOWN) {
                i = 0;
+       } else if (direction == FTDM_RR_DOWN || direction == FTDM_RR_UP) {
+               i = rr_next(group->last_used_index, 0, group->chan_count - 1, direction);
        } else {
                i = group->chan_count-1;
        }
@@ -1762,16 +1779,24 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_open_by_group(uint32_t group_id, ftdm_dir
 
                if (request_voice_channel(check, ftdmchan, caller_data, direction)) {
                        status = FTDM_SUCCESS;
+                       if (direction == FTDM_RR_UP || direction == FTDM_RR_DOWN) {
+                               group->last_used_index = i;
+                       }
                        break;
                }
 
                calculate_best_rate(check, &best_rated, &best_rate);
 
                if (direction == FTDM_TOP_DOWN) {
-                       if (i >= group->chan_count) {
+                       if (i >= (group->chan_count - 1)) {
                                break;
                        }
                        i++;
+               } else if (direction == FTDM_RR_DOWN || direction == FTDM_RR_UP) {
+                       if (check == best_rated) {
+                               group->last_used_index = i;
+                       }
+                       i = rr_next(i, 0, group->chan_count - 1, direction);
                } else {
                        if (i == 0) {
                                break;
@@ -1850,6 +1875,8 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_open_by_span(uint32_t span_id, ftdm_direc
        
        if (direction == FTDM_TOP_DOWN) {
                i = 1;
+       } else if (direction == FTDM_RR_DOWN || direction == FTDM_RR_UP) {
+               i = rr_next(span->last_used_index, 1, span->chan_count, direction);
        } else {
                i = span->chan_count;
        }       
@@ -1860,6 +1887,10 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_open_by_span(uint32_t span_id, ftdm_direc
                        if (i > span->chan_count) {
                                break;
                        }
+               } else if (direction == FTDM_RR_DOWN || direction == FTDM_RR_UP) {
+                       if (i == span->last_used_index) {
+                               break;
+                       }
                } else {
                        if (i == 0) {
                                break;
@@ -1873,6 +1904,9 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_open_by_span(uint32_t span_id, ftdm_direc
 
                if (request_voice_channel(check, ftdmchan, caller_data, direction)) {
                        status = FTDM_SUCCESS;
+                       if (direction == FTDM_RR_UP || direction == FTDM_RR_DOWN) {
+                               span->last_used_index = i;
+                       }
                        break;
                }
                        
@@ -1880,6 +1914,11 @@ FT_DECLARE(ftdm_status_t) ftdm_channel_open_by_span(uint32_t span_id, ftdm_direc
 
                if (direction == FTDM_TOP_DOWN) {
                        i++;
+               } else if (direction == FTDM_RR_DOWN || direction == FTDM_RR_UP) {
+                       if (check == best_rated) {
+                               span->last_used_index = i;
+                       }
+                       i = rr_next(i, 1, span->chan_count, direction);
                } else {
                        i--;
                }
index dce130f5be91c0cec38d6b37f22c8652229e5b92..69b90f1acd190ee478056496f88e6cd30a121cb7 100644 (file)
@@ -144,7 +144,9 @@ typedef enum {
 /*! \brief Hunting direction (when hunting for free channels) */
 typedef enum {
        FTDM_TOP_DOWN,
-       FTDM_BOTTOM_UP
+       FTDM_BOTTOM_UP,
+       FTDM_RR_DOWN,
+       FTDM_RR_UP,
 } ftdm_direction_t;
 
 /*! \brief I/O channel type */
index 9222da3a4294a1fff4edef83f94f69cffca5bf99..e8ee7156f88c1cfb585a8420696ee3a90c3c7d91 100644 (file)
@@ -493,6 +493,7 @@ struct ftdm_span {
        ftdm_trunk_type_t trunk_type;
        ftdm_analog_start_type_t start_type;
        ftdm_signal_type_t signal_type;
+       uint32_t last_used_index;
        /* Private signaling data. Do not touch unless you are a signaling module */
        void *signal_data;
        fio_signal_cb_t signal_cb;