Successful outgoing call (common channel signaling)

This section describes the sequence of events when Blueworx Voice Response makes an outgoing call on behalf of an application, using a common channel signaling process.

Figure 1. Common channel signaling process: successful outgoing call
The graphic is a very simplified representation of the process described in detail in the next section. The graphic shows the phases that are explained there.

Error processing

Blueworx Voice Response provides error processing to ensure that a call is never left connected in the event of failure. This table shows what Blueworx Voice Response does when a channel process failure occurs at different phases during the establishment of an outgoing call:

Phase

Error Processing

A

None.

B

Send the SL_CALL_ABORT_REQ primitive to the signaling process.

Because of channel negotiation, the pack and channel may not be determined until after the call is established. In this case, the pack and channel on the SL_CALL_ABORT_REQ may be set to SL_UNDEFINED_VPACK and SL_UNDEFINED_CHAN.

C

Play the technical difficulties message to the caller. This message is a prerecorded message included with Blueworx Voice Response, which says “We are experiencing technical difficulties. Please hang up and try again later”.

Send the SL_CALL_ABORT_REQ primitive to the signaling process.

Description of flows

The flows shown in Figure 1 are as follows:

  1. A: The application state table issues a MakeCall action. This action is processed by the application channel process, a part of Blueworx Voice Response.
  2. The channel process opens the digital trunk device driver.
  3. The channel process creates the SL_CALL_SETUP_REQ primitive to establish a call:
    /* Local variables */
     SL_REQUEST_ST      slRequest ;
     SL_RET_CODE        slRC ;
     int                iSeqNo ;
     int                iChan ;
     .
     .
     .
     
     /* Build an SL_CALL_SETUP_REQUEST */
     slRequest.id           = SLID_REQUEST_ST ;
     slRequest.iseq_no      = 0 ;
     slRequest.pidCHP       = getpid() ;
     slRequest.Command.id   = SL_CALL_SETUP_REQUEST ;
     slRequest.Parms.call_setup_request_st.sizetLength
         = sizeof(slRequest.Parms.call_setup_request_st) ;
     slRequest.Parms.call_setup_request_st.slCallReference = SL_CALL_REF_NULL ;
     
     slRequest.Parms.call_setup_request_st.pause = pause_parameter_from_state_table ;
     slRequest.Parms.call_setup_request_st.ring_wait
                                     = ring_wait_parameter_from_state_table ;
     slRequest.Parms.call_setup_request_st.ring_time
                                     = ring_time_parameter_from_state_table ;
     slRequest.Parms.call_setup_request_st.iChannelNo   = SL_UNDEFINED_VPACK ;
     slRequest.Parms.call_setup_request_st.iVpackNo   = SL_UNDEFINED_CHANNEL;
     slRequest.Parms.call_setup_request_st.ifdBearerChannel
        = file_descriptor ;
     slRequest.Parms.call_setup_request_st.ChannelGroupSet[0]
        = FALSE; /* unused */
     
    
  4. The channel process uses the System : Call : Permitted channel groups variable (SV178) to specify which channel groups the state table accepts: for (iChan = 1 ; iChan <= SL_MAX_CHANNEL_GROUP_ID ; iChan ++ ) {   if (channel_group_permitted[iChan]) {     /* from SV178 */     slRequest.Parms.call_setup_request_st.ChannelGroupSet[iChan] = TRUE ;   }   else {     slRequest.Parms.call_setup_request_st.ChannelGroupSet[iChan] = FALSE ;   } /* end if */
    } /* end for */
     slRequest.Parms.call_setup_request_st.phone_num
         = phone_num_parameter_from_state_table ;
     
  5. B: The channel process sends the SL_CALL_SETUP_REQ primitive to the signaling process:
    slRC = sl_send_request( sigproc, & slRequest, &iSeqNo );
  6. When the sl_send_request() completes:
    • If there were no errors in the request, the SL_REQUEST_ST structure is updated. In particular, the field slRequest.Parms.call_setup_request_st.slCallReference contains the newly allocated call reference for the call.
    • If Blueworx Voice Response detects errors, the return code is non-zero.
  7. The signaling process is in a wait loop, issuing sl_receive_request(), and then processing the received requests.
  8. The signaling process receives the request primitive from the signaling interface.
  9. The signaling process establishes the call, using whatever protocol it supports. The Initial Address Message is used to establish the call. When the network sends the Answer message, the call has been connected.
  10. C: The signaling process creates an SL_CALL_SETUP_CNF primitive:
    • If call setup failed, the ReplyCode field indicates the reason for the failure.
    • If call setup succeeded, the ReplyCode field is set to SL_REPLY_SUCCESS:
      /* Local variables */
       SL_HANDLE 	slHandle ;
       SL_REQUEST_ST 	slRequest ;
       SL_CONFIRM_ST 	slConfirm ;
       SL_RET_CODE 	slRC ;
       .
       .
       .
       /* Build a successful SL_CALL_SETUP_CNF */
       
       slConfirm.id 	= SLID_CONFIRM_ST ;
       slConfirm.iseq 	= slRequest.iseq ;
       slConfirm.pidCHP 	= slRequest.pidCHP ;
       slConfirm.Command.id 	= SL_CALL_SETUP_CNF ;
       slConfirm.Parms.call_setup_confirm_st.sizetLength
       	= sizeof( slConfirm.Parms.call_setup_confirm_st ) ;
       slConfirm.Parms.call_setup_confirm_st.ReplyCode      = SL_REPLY_SUCCESS ;
       slConfirm.Parms.call_setup_confirm_st.slCallReference
       	= slRequest.Parms.call_setup_request_st.slCallReference ;
       slConfirm.Parms.call_setup_confirm_st.iChannelNo    = allocated_channel;
       slConfirm.Parms.call_setup_confirm_st.iVpackNo      = allocated_vpack;
       slConfirm.Parms.call_setup_confirm_st.iChannelGroup = allocated_channel_group;
       slConfirm.Parms.call_setup_confirm_st.tone_type     = PROG_UNKNOWN;
       slConfirm.Parms.call_setup_confirm_st.tone_id       = 0;
       
  11. The signaling process sends the SL_CALL_SETUP_CNF primitive back to the channel process.
    slRC = sl_send_confirm( slHandle, &slConfirm ) ;
  12. The channel process has been waiting for the reply to its request, by using the sl_receive_confirm() subroutine, which now completes.
  13. The channel process maps the ReplyCode to a result, which it returns to the state table.
  14. The MakeCall action completes and the state table continues with the next action.