Network Facility Request - Two B Channel Transfer (TBCT) (Synchronous Mode)
TBCT enables an ISDN PRI user to request the switch to connect together two independent calls on the user's interface. The two calls can be served by the same PRI trunk or by different PRI trunks. If the switch accepts the request, the user is released from the calls and the two calls are connected directly. Billing for the two original calls continues in the same manner as if the transfer had not occurred. As an option, TBCT also allows for transfer notification to the transferred users.
TBCT works only when all of the following conditions are met:
- The user subscribes to TBCT (this feature is supported for the 5ESS and 4ESS protocols only).
- The two calls are of compatible bearer capabilities.
- At least one of the two calls is answered. If the other call is outgoing from the user, it may be either answered or alerting; if the other call is incoming to the user, it must be answered.
To invoke the TBCT feature, send a FACILITY message to the Network containing, among other things, the Call Reference Values (CRVs) of the two calls to be transferred. The cc_GetNetCRV( ) function allows applications to query the Dialogic firmware directly for the Network Call Reference Value. (See the GlobalCall API Software Reference for detailed information about using this function.)
When a transferred call is disconnected, the network informs the TBCT controller by sending a NOTIFY message with the Network Call Reference Value. The application receives the GCEV_EXTENSION event (with ext_id = GCIS_EXEV_NOTIFY) event.
Figure25 and Figure26 provide line diagrams that illustrate the operation of the TBCT feature.
The sample code that follows Figure29 uses the gc_GetNetCRV( ) function to acquire the Call Reference Values (CRVs) of the two calls to be transferred.
Figure 25. TBCT Invocation with Notification (Both Calls Answered)
Figure 26. TBCT Invocation with Notification (Call 1 Answered/Call 2 Alerting) Figure27, Figure28, and Figure29 illustrate the procedures for initiating a TBCT. The scenario is followed by code samples that demonstrate the use of Dialogic API in initiating a TBCT.
Figure 27. Synchronous Programming: Initiating TBCT
Figure 28. Synchronous Programming: Initiating TBCT (Users A and B Connected)
Figure 29. Synchronous Programming: Initiating TBCT (Users A and B Disconnected) The following example code illustrates the use of the GlobalCall API at various stages of the TBCT call scenario.
LINEDEV dti_dev1_hdl; . . rc = gc_Open( &dti_bd_hdl, ":N_dtiB1:P_isdn", 0); . .CRN crn1=0; unsigned short crn1_crv=0; . . rc = gc_GetNetCRV ( crn1, &crn1_crv ); . .typedef union { struct { unsigned char ie_id; // Byte 1 unsigned char length; // Byte 2 unsigned char prot_profile :5; // Byte 3, Intel Layout unsigned char spare :2; unsigned char extension_1 :1; unsigned char comp_type; // Byte 4 unsigned char comp_length; // Byte 5 unsigned char comp_data[249]; // Bytes 6 to 254 . . // Preparing the Facility IE Element tbct_ie.bits.ie_id = 0x1C; tbct_ie.bits.length = 21; tbct_ie.bits.extension_1 = 1; tbct_ie.bits.spare = 0x00; tbct_ie.bits.prot_profile = 0x11; // Supplementary Service (ROSE) tbct_ie.bits.comp_type = 0xA1; // Invoke tbct_ie.bits.comp_length = 18; // Component Length (Data Only) tbct_ie.bits.comp_data[0] = 0x02; // Invoke Identifier, tag tbct_ie.bits.comp_data[1] = 0x01; // Invoke Identifier, length tbct_ie.bits.comp_data[2] = 0x2E; // Invoke Identifier, invoke ie (varies) tbct_ie.bits.comp_data[3] = 0x06; // Operation Object, tag tbct_ie.bits.comp_data[4] = 0x07; // Operation Object, length tbct_ie.bits.comp_data[5] = 0x2A; // Operation Object, Operation Value tbct_ie.bits.comp_data[6] = 0x86; // Operation Object, Operation Value tbct_ie.bits.comp_data[7] = 0x48; // Operation Object, Operation Value tbct_ie.bits.comp_data[8] = 0xCE; // Operation Object, Operation Value tbct_ie.bits.comp_data[9] = 0x15; // Operation Object, Operation Value tbct_ie.bits.comp_data[10] = 0x00; // Operation Object, Operation Value tbct_ie.bits.comp_data[11] = 0x08; // Operation Object, Operation Value tbct_ie.bits.comp_data[12] = 0x30; // Sequence, tag tbct_ie.bits.comp_data[13] = 0x04; // Sequence, length (varies, combined length of Link & D Channel ID ) tbct_ie.bits.comp_data[14] = 0x02; // Link ID, tag tbct_ie.bits.comp_data[15] = 0x02; // Link ID, length (varies) tbct_ie.bits.comp_data[16] = (unsigned char) ((crn2_crv>>8)&0xFF); // Link ID, linkid value (varies) tbct_ie.bits.comp_data[17] = (unsigned char) (crn2_crv&0xFF); // Link ID, inkid value (varies) // The D Channel Identifier is Optional // tbct_ie.bits.comp_data[18] = 0x04; // D Channel ID, tag // tbct_ie.bits.comp_data[19] = 0x04; // D Channel ID, length // tbct_ie.bits.comp_data[20] = 0x00; // D Channel ID, dchid (varies) // tbct_ie.bits.comp_data[21] = 0x00; // D Channel ID, dchid (varies) // tbct_ie.bits.comp_data[22] = 0x00; // D Channel ID, dchid (varies) // tbct_ie.bits.comp_data[23] = 0x00; // D Channel ID, dchid (varies) /* ** Load all the IE's into a single IE block ** !!NOTE!! - IE must be added in IE ID order! */ ie_blk.length = (5 + 18); for ( ctr = 0; ctr < ie_blk.length; ctr++ ) { ie_blk.data[ctr] = tbct_ie.bytes[ctr]; } /* end if */ /* ** Send out a facility message that will execute the transfer */ rc = gc_SndMsg( crn2, SndMsg_Facility, &ie_blk );typedef union { struct { unsigned char ie_id; // Byte 1 unsigned char length; // Byte 2 unsigned char prot_profile :5; // Byte 3, Intel Layout unsigned char spare :2; unsigned char extension_1 :1; unsigned char comp_type; // Byte 4 unsigned char comp_length; // Byte 5 unsigned char comp_data[249]; // Bytes 6 to 254 } bits; unsigned char bytes[254]; } FACILITY_IE_LAYOUT; . FACILITY_IE_LAYOUT *tbct_ie; . IE_BLK ie_list; . ext_id = (EXTENSIONEVTBLK*) (metaevt.extevtdatap); /*assumes `metaevt' is filled by gc_GetMetaEvent */ switch ( event ) { . . case GCEV_EXTENSION: switch (ext_id) { . . . case GCIS_EXEV_FACILITY: gc_GetCallInfo( crn2, U_IES, &ie_list);; . . . // retrieve facility IE for (ie_len = 2; ie_len < ie_list.length;) { if (ie_list[ie_len] == FACILITY_IE) // found the facility IE { tbct_ie = &ie_list[ie_len]; // process the Facility IE tbct_ie_len = tbct_id->length; #define FACILITY_IE 0x1C #define RETURN_RESULT 0xA2 #define RETURN_ERROR 0xA3 #define REJECT 0xA4 #define INVOKE_IDEN_TAG 0x02 if (tbct_ie->bits.comp_type == RETURN_RESULT) // network accepted TBCT request{ . . // if subscribed to Notification to Controller, check for Invoke component // if (tbct_ie->bits.comp_data[0] == INVOKE_IDEN_TAG) { invoke_iden = tbct_ie->bits.comp_data[2]; // get invoke identifier }} else if (tbct_ie->bits.comp_type == RETURN_RESULT) // network accepted TBCT request } else { /* if it is not facility IE, go to the next IE */ /* if this is single byte IE */ if (ie_list[ie_len] & 0x80) /* increment by one byte */ ie_len = ie_len + 1; else/* otherwise increment by length of the IE */ ie_len = ie_len + ie_list[ie_len + 1]; } } break; . . . .ext_id = (EXTENSIONEVTBLK*) (metaevt.extevtdatap); /*assumes `metaevt' is filled by gc_GetMetaEvent */ switch ( event ) { . . case GCEV_EXTENSION: switch (ext_id) { . . . case GCIS_EXEV_NOTIFY: gc_GetInfoElem( boarddev, &ie_list ); . . . // retrieve Notification IE for (ie_len = 2; ie_len < ie_list.length;) { if (ie_list[ie_len] == NOTIFICATION_IE) // found the Notification IE { } else { /* if it is not facility IE, go to the next IE */ /* if this is single byte IE */ if (ie_list[ie_len] & 0x80) /* increment by one byte */ ie_len = ie_len + 1; else /* otherwise increment by length of the IE */ ie_len = ie_len + ie_list[ie_len + 1]; } } break; . . }
Click here to contact Dialogic Customer Engineering
Copyright 2001, Dialogic Corporation