]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
freetdm: ss7 - update to support CCR
authorKonrad Hammel <konrad@sangoma.com>
Thu, 28 Oct 2010 21:09:51 +0000 (17:09 -0400)
committerKonrad Hammel <konrad@sangoma.com>
Thu, 28 Oct 2010 21:23:12 +0000 (17:23 -0400)
libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c
libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_main.c

index 7519b2787d4c9bb8734a6a07fc90ee2f1be6343a..af3b9edbae393bcba8ffc33a94b22d8ad94e2f3a 100644 (file)
@@ -598,7 +598,7 @@ ftdm_status_t handle_rel_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ
 
                /* this is a remote hangup request */
                sngss7_set_flag(sngss7_info, FLAG_REMOTE_REL);
-
+ftdm_channel_command(ftdmchan, FTDM_COMMAND_DISABLE_LOOP, NULL);
                /* move the state of the channel to CANCEL to end the call */
                ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_TERMINATING);
 
@@ -613,7 +613,7 @@ ftdm_status_t handle_rel_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ
                if (siRelEvnt->causeDgn.causeVal.pres) {
                        ftdmchan->caller_data.hangup_cause = siRelEvnt->causeDgn.causeVal.val;
                } else {
-                       SS7_ERROR("REL does not have a cause code!\n");
+                       SS7_ERROR("REL does not have a cause ftdm_channel_command(ftdmchan, FTDM_COMMAND_DISABLE_LOOP, NULL);code!\n");
                        ftdmchan->caller_data.hangup_cause = 0;
                }
 
@@ -625,6 +625,23 @@ ftdm_status_t handle_rel_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ
 
                break;
        /**************************************************************************/
+       case FTDM_CHANNEL_STATE_IN_LOOP:
+
+               /* inform the core to unloop the channel*/
+               ftdm_channel_command(ftdmchan, FTDM_COMMAND_DISABLE_LOOP, NULL);
+
+               /* since we need to acknowledge the hang up set the flag for remote release */
+               sngss7_set_flag(sngss7_info, FLAG_REMOTE_REL);
+
+               /* go to hangup complete to send the RLC */
+               ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_HANGUP_COMPLETE);
+
+               /* save the call info for the RLC */
+               sngss7_info->suInstId = get_unique_id();
+               sngss7_info->spInstId = spInstId;
+
+               break;
+       /**************************************************************************/
        default:
 
                /* throw the reset flag */
@@ -1293,15 +1310,6 @@ ftdm_status_t handle_cot_start(uint32_t suInstId, uint32_t spInstId, uint32_t ci
        /* switch to the IN_LOOP state */
        ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_IN_LOOP);
 
-       /* store the sngss7 ids */
-       if (suInstId == 0) {
-               sngss7_info->suInstId = get_unique_id();
-       } else {
-               sngss7_info->suInstId = suInstId;
-       }
-       sngss7_info->spInstId = spInstId;
-       sngss7_info->globalFlg = globalFlg;
-
        /* unlock the channel again before we exit */
        ftdm_mutex_unlock(ftdmchan->mutex);
 
@@ -1662,7 +1670,7 @@ ftdm_status_t handle_rsc_rsp(uint32_t suInstId, uint32_t spInstId, uint32_t circ
                sngss7_set_flag(sngss7_info, FLAG_RESET_TX_RSP);
 
                /* go to DOWN */
-               ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_DOWN);
+               /*ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_DOWN);*/
 
                break;
        /**********************************************************************/
index ebb4efa311bac1a3d413220aefd61f05ad18d993..7612f3dd748d5187149ca5c8da4c11c02c1fbf67 100644 (file)
@@ -93,7 +93,8 @@ ftdm_state_map_t sangoma_ss7_state_map = {
        ZSM_UNACCEPTABLE,
        {FTDM_CHANNEL_STATE_IN_LOOP, FTDM_END},
        {FTDM_CHANNEL_STATE_SUSPENDED, FTDM_CHANNEL_STATE_RESTART,
-        FTDM_CHANNEL_STATE_COLLECT, FTDM_CHANNEL_STATE_DOWN, FTDM_END}
+        FTDM_CHANNEL_STATE_COLLECT, FTDM_CHANNEL_STATE_DOWN,
+        FTDM_CHANNEL_STATE_HANGUP_COMPLETE, FTDM_END}
        },
    {
        ZSD_INBOUND,
@@ -970,6 +971,14 @@ void ftdm_sangoma_ss7_process_state_change (ftdm_channel_t * ftdmchan)
                                ftdm_set_state_locked (ftdmchan, ftdmchan->last_state);
                        break;
                        /******************************************************************/
+                       case (FTDM_CHANNEL_STATE_IN_LOOP):
+                               /* we screwed up in a COT/CCR, remove the loop */
+                               ftdm_channel_command(ftdmchan, FTDM_COMMAND_DISABLE_LOOP, NULL);
+
+                               /* go to down */
+                               ftdm_set_state_locked(ftdmchan, FTDM_CHANNEL_STATE_DOWN);
+                               break;
+                       /******************************************************************/
                        default:
                                /* KONRAD: find out what the cause code should be */
                                ftdmchan->caller_data.hangup_cause = 41;