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);