]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
Merge remote branch 'origin/jz.SPIROU' into releases.3.4.bridge_hack
authorMoises Silva <moy@sangoma.com>
Fri, 27 Jan 2012 04:34:20 +0000 (23:34 -0500)
committerMoises Silva <moy@sangoma.com>
Fri, 27 Jan 2012 04:34:20 +0000 (23:34 -0500)
1  2 
libs/freetdm/mod_freetdm/mod_freetdm.c
libs/freetdm/src/ftmod/ftmod_sangoma_ss7/ftmod_sangoma_ss7_out.c

index 96ec5afae9f65b00cc2f8668c92b0fbaa21f7066,d25b3342f0485f400194bdd2b49cbf344a752e42..59cb6a4f53120ab4dc12d0e37ad540ff8c3ab097
@@@ -56,58 -55,24 +56,73 @@@ void ft_to_sngss7_iam (ftdm_channel_t 
        
        memset (&iam, 0x0, sizeof (iam));
  
 -      if (sngss7_info->circuit->transparent_iam &&
 +      var = ftdm_usrmsg_get_var(ftdmchan->usrmsg, "sigbridge_peer");
 +      if (!ftdm_strlen_zero(var)) {
 +              ftdm_span_t *peer_span = NULL;
 +              ftdm_channel_t *peer_chan = NULL;
 +              sngss7_chan_data_t *peer_info = NULL;
 +
 +              ftdm_get_channel_from_string(var, &peer_span, &peer_chan);
 +              if (!peer_chan) {
 +                      SS7_ERROR_CHAN(ftdmchan, "Failed to find sigbridge peer from string '%s'\n", var);
 +              } else {
 +                      if (peer_span->signal_type != FTDM_SIGTYPE_SS7) {
 +                              SS7_ERROR_CHAN(ftdmchan, "Peer channel '%s' has different signaling type %d'\n", 
 +                                              var, peer_span->signal_type);
 +                      } else {
 +                              sngss7_event_data_t *event_clone = NULL;
 +                              peer_info = peer_chan->call_data;
 +                              SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Starting native bridge with peer CIC %d\n", 
 +                                              sngss7_info->circuit->cic, peer_info->circuit->cic);
 +                              /* make each one of us aware of the native bridge */
 +                              peer_info->peer_data = sngss7_info;
 +                              sngss7_info->peer_data = peer_info;
 +                              /* flush our own queue */
 +                              while ((event_clone = ftdm_queue_dequeue(sngss7_info->event_queue))) {
 +                                      SS7_WARN("[CIC:%d]Discarding clone event from past call!\n", sngss7_info->circuit->cic);
 +                                      ftdm_safe_free(event_clone);
 +                              }
 +                              /* go up until release comes, note that state processing is done different and much simpler when there is a peer  */
 +                              ftdm_set_state(ftdmchan, FTDM_CHANNEL_STATE_UP);
 +                              ftdm_channel_advance_states(ftdmchan);
 +                      }
 +              }
 +      }
 +
 +      if (sngss7_info->peer_data) {
 +              sngss7_span_data_t *span_data = ftdmchan->span->signal_data;
 +              sngss7_event_data_t *event_clone = ftdm_queue_dequeue(sngss7_info->peer_data->event_queue);
 +              /* Retrieve IAM from our peer */
 +              if (!event_clone) {
 +                      SS7_ERROR_CHAN(ftdmchan, "No event clone in peer queue!%s\n", "");
 +              } else if (event_clone->event_id != SNGSS7_CON_IND_EVENT) {
 +                      /* first message in the queue should ALWAYS be an IAM */
 +                      SS7_ERROR_CHAN(ftdmchan, "Invalid initial peer message type '%d'\n", event_clone->event_id);
 +              } else {
 +                      SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx IAM (Bridged)\n", sngss7_info->circuit->cic);
 +                      memcpy(&iam, &event_clone->event.siConEvnt, sizeof(iam));
 +              }
 +              /* since this is the first time we dequeue an event from the peer, make sure our main thread process any other events,
 +                 this will trigger the interrupt in our span peer_chans queue which will wake up our main thread if it is sleeping */
 +              ftdm_queue_enqueue(span_data->peer_chans, sngss7_info->peer_data->ftdmchan);
 +      } else if (sngss7_info->circuit->transparent_iam &&
                sngss7_retrieve_iam(ftdmchan, &iam) == FTDM_SUCCESS) {
                SS7_INFO_CHAN(ftdmchan,"[CIC:%d]Tx IAM (Transparent)\n", sngss7_info->circuit->cic);
+               /* Called Number information */
+               copy_cdPtyNum_to_sngss7(ftdmchan, &iam.cdPtyNum);
+               /* Redirecting Number */
+               copy_redirgNum_to_sngss7(ftdmchan, &iam.redirgNum);
+               /* Redirecting Information */
+               copy_redirgInfo_to_sngss7(ftdmchan, &iam.redirInfo);
+               /* Location Number information */
+               copy_locPtyNum_to_sngss7(ftdmchan, &iam.cgPtyNum1);
+               /* Forward Call Indicators */
+               copy_fwdCallInd_to_sngss7(ftdmchan, &iam.fwdCallInd);
        } else {
                /* Nature of Connection Indicators */
                copy_natConInd_to_sngss7(ftdmchan, &iam.natConInd);