]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
freetdm: OPENZAP-159 --resolved SS7 REL message collision
authorMoises Silva <moy@sangoma.com>
Fri, 17 Jun 2011 14:27:18 +0000 (10:27 -0400)
committerMoises Silva <moy@sangoma.com>
Fri, 17 Jun 2011 14:40:20 +0000 (10:40 -0400)
libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_handle.c

index 6fb9c82895c04bff96a2664eb1f2e22c30e2f4c8..0940ce62f4c3387655597bf1381a218665cf0bab 100644 (file)
@@ -656,7 +656,7 @@ ftdm_status_t handle_rel_ind(uint32_t suInstId, uint32_t spInstId, uint32_t circ
 
                /* this is a remote hangup request */
                sngss7_set_ckt_flag(sngss7_info, FLAG_REMOTE_REL);
-ftdm_channel_command(ftdmchan, FTDM_COMMAND_DISABLE_LOOP, NULL);
+               ftdm_channel_command(ftdmchan, FTDM_COMMAND_DISABLE_LOOP, NULL);
                /* move the state of the channel to CANCEL to end the call */
                ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_TERMINATING);
 
@@ -684,6 +684,27 @@ ftdm_channel_command(ftdmchan, FTDM_COMMAND_DISABLE_LOOP, NULL);
 
                break;
        /**************************************************************************/
+       case FTDM_CHANNEL_STATE_HANGUP_COMPLETE:
+               /* ITU Q.764 2.3.1 e)
+                * Collision of release messages
+                *
+                * ITU Q.784 Test Number 3.8
+                * Collision of REL messages
+                */
+               SS7_DEBUG_CHAN(ftdmchan, "Collision of REL messages. Rx REL while waiting for RLC.\n", " ");
+               if (sngss7_test_ckt_flag(sngss7_info, FLAG_LOCAL_REL) && 
+                       !sngss7_test_ckt_flag (sngss7_info, FLAG_REMOTE_REL)) {
+                       /* locally requested hangup completed, wait for remote RLC */
+                       /* need to perform remote release */
+
+                       /* this is also a remote hangup request */
+                       sngss7_set_ckt_flag(sngss7_info, FLAG_REMOTE_REL);
+
+                       /* send out the release complete */
+                       ft_to_sngss7_rlc (ftdmchan);
+               }
+               break;
+       /**************************************************************************/
        case FTDM_CHANNEL_STATE_IN_LOOP:
 
                /* inform the core to unloop the channel*/