Specifications | Arrow Storage Products VT1231 Outdoor Storage User Manual

Dialogic® Global Call IP
Technology Guide
November 2007
05-2239-009
Copyright © 2003-2007, Dialogic Corporation. All rights reserved.You may not reproduce this document in whole or in part without permission in
writing from Dialogic Corportation.
All contents of this document are furnished for informational use only and are subject to change without notice and do not represent a commitment on
the part of Dialogic Corporation or its subsidiaries (“Dialogic”). Reasonable effort is made to ensure the accuracy of the information contained in the
document. However, Dialogic does not warrant the accuracy of this information and cannot accept responsibility for errors, inaccuracies or omissions
that may be contained in this document.
INFORMATION IN THIS DOCUMENT IS PROVIDED IN CONNECTION WITH DIALOGIC® PRODUCTS. NO LICENSE, EXPRESS OR IMPLIED, BY
ESTOPPEL OR OTHERWISE, TO ANY INTELLECTUAL PROPERTY RIGHTS IS GRANTED BY THIS DOCUMENT. EXCEPT AS PROVIDED IN A
SIGNED AGREEMENT BETWEEN YOU AND DIALOGIC, DIALOGIC ASSUMES NO LIABILITY WHATSOEVER, AND DIALOGIC DISCLAIMS ANY
EXPRESS OR IMPLIED WARRANTY, RELATING TO SALE AND/OR USE OF DIALOGIC PRODUCTS INCLUDING LIABILITY OR WARRANTIES
RELATING TO FITNESS FOR A PARTICULAR PURPOSE, MERCHANTABILITY, OR INFRINGEMENT OF ANY INTELLECTUAL PROPERTY
RIGHT OF A THIRD PARTY.
Dialogic products are not intended for use in medical, life saving, life sustaining, critical control or safety systems, or in nuclear facility applications.
It is possible that the use or implementation of any one of the concepts, applications, or ideas described in this document, in marketing collateral
produced by or on web pages maintained by Dialogic may infringe one or more patents or other intellectual property rights owned by third parties.
Dialogic does not provide any intellectual property licenses with the sale of Dialogic products other than a license to use such product in accordance
with intellectual property owned or validly licensed by Dialogic and no such licenses are provided except pursuant to a signed agreement with
Dialogic. More detailed information about such intellectual property is available from Dialogic’s legal department at 9800 Cavendish Blvd., 5th Floor,
Montreal, Quebec, Canada H4M 2V9. Dialogic encourages all users of its products to procure all necessary intellectual property licenses
required to implement any concepts or applications and does not condone or encourage any intellectual property infringement and
disclaims any responsibility related thereto. These intellectual property licenses may differ from country to country and it is the
responsibility of those who develop the concepts or applications to be aware of and comply with different national license requirements.
Dialogic, Diva, Eicon, Eicon Networks, Dialogic Pro, EiconCard and SIPcontrol, among others, are either registered trademarks or trademarks of
Dialogic. Dialogic's trademarks may be used publicly only with permission from Dialogic. Such permission may only be granted by Dialogic’s legal
department at 9800 Cavendish Blvd., 5th Floor, Montreal, Quebec, Canada H4M 2V9. Any authorized use of Dialogic's trademarks will be subject to
full respect of the trademark guidelines published by Dialogic from time to time and any use of Dialogic’s trademarks requires proper
acknowledgement. Windows is a registered trademark of Microsoft Corporation in the United States and/or other countries. Other names of actual
companies and products mentioned herein are the trademarks of their respective owners.
This document discusses one or more open source products, systems and/or releases. Dialogic is not responsible for your decision to use open
source in connection with Dialogic products (including without limitation those referred to herein), nor is Dialogic responsible for any present or future
effects such usage might have, including without limitation effects on your products, your business, or your intellectual property rights.
Publication Date: November 2007
Document Number: 05-2239-009
Dialogic® Global Call IP Technology Guide – November 2007
Dialogic Corporation
Contents
Revision History . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
About This Publication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Purpose . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Applicability . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Intended Audience . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
How to Use This Publication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Related Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1
IP Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
1.1
1.2
1.3
2
Introduction to VoIP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
H.323 Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.1 H.323 Entities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.2 H.323 Protocol Stack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.3 Codecs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.4 Basic H.323 Call Scenario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.5 Registration with a Gatekeeper . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.6 H.323 Call Scenario via a Gateway . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
SIP Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.3.1 Advantages of Using SIP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.3.2 SIP User Agents and Servers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.3.3 Basic SIP Operation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.3.4 Basic SIP Call Scenario . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.3.5 SIP Messages. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
29
29
30
31
32
32
35
36
39
39
39
40
40
40
Dialogic® Global Call API Architecture for IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
2.1
2.2
2.3
3
25
25
25
25
26
26
Dialogic® Global Call API over IP Architecture with a Host-Based Stack . . . . . . . . . . . . .
Architecture Components . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2.1 Host Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2.2 Dialogic® Global Call API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2.3 IP Signaling Call Control Library (IPT CCLib) . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2.4 IP Media Call Control Library (IPM CCLib) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2.5 IP Media Resource . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Device Types and Usage. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3.1 Device Types Used with IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3.2 IPT Board Devices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3.3 IPT Network Devices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3.4 IPT Start Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
43
44
45
45
45
46
46
46
46
47
48
49
IP Call Scenarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
3.1
3.2
Basic Call Control Scenarios When Using IP Technology. . . . . . . . . . . . . . . . . . . . . . . . .
3.1.1 Basic Call Setup When Using H.323 or SIP . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.1.2 Basic Call Teardown When Using H.323 or SIP. . . . . . . . . . . . . . . . . . . . . . . . . .
3.1.3 Call Setup Scenarios for Early Media . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Call Transfer Scenarios When Using H.323 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2.1 General Conditions for H.450.2 Call Transfers . . . . . . . . . . . . . . . . . . . . . . . . . . .
Dialogic® Global Call IP Technology Guide – November 2007
Dialogic Corporation
51
52
53
53
57
57
3
Contents
3.3
3.4
4
IP-Specific Operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
4.1
4.2
4.3
4.4
4.5
4.6
4
3.2.2 Endpoint Behavior in H.450.2 Blind Call Transfers . . . . . . . . . . . . . . . . . . . . . . . . 57
3.2.3 Successful H.450.2 Blind Call Transfer Scenario . . . . . . . . . . . . . . . . . . . . . . . . . 59
3.2.4 Unsuccessful H.450.2 Blind Call Transfer Scenarios . . . . . . . . . . . . . . . . . . . . . . 61
3.2.5 Endpoint Behavior in H.450.2 Supervised Call Transfer . . . . . . . . . . . . . . . . . . . . 66
3.2.6 Successful H.450.2 Supervised Call Transfer Scenario . . . . . . . . . . . . . . . . . . . . 67
3.2.7 Unsuccessful H.450.2 Supervised Transfer Scenarios . . . . . . . . . . . . . . . . . . . . . 69
Call Transfer Scenarios When Using SIP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
3.3.1 General Conditions for SIP Call Transfers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
3.3.2 Endpoint Behavior in Unattended SIP Call Transfers . . . . . . . . . . . . . . . . . . . . . . 75
3.3.3 Successful Unattended SIP Call Transfer Scenarios . . . . . . . . . . . . . . . . . . . . . . 78
3.3.4 Endpoint Behavior in Attended SIP Transfers . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84
3.3.5 Successful SIP Attended Call Transfer Scenarios. . . . . . . . . . . . . . . . . . . . . . . . . 86
3.3.6 Unsuccessful Call Transfer Scenarios. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
T.38 Fax Server Call Scenarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
3.4.1 Sending T.38 Fax in an Established Audio Session . . . . . . . . . . . . . . . . . . . . . . . 98
3.4.2 Receiving T.38 Fax in an Established Audio Session . . . . . . . . . . . . . . . . . . . . . . 99
3.4.3 Sending T.38 Fax Without an Established Audio Session. . . . . . . . . . . . . . . . . . 101
3.4.4 Receiving T.38 Fax Without an Established Audio Session . . . . . . . . . . . . . . . . 102
3.4.5 Sending a Request to Switch From T.38 Fax to Audio . . . . . . . . . . . . . . . . . . . . 103
3.4.6 Receiving a Request to Switch From T.38 Fax to Audio . . . . . . . . . . . . . . . . . . . 104
3.4.7 Terminating a Call After a T.38 Fax Session . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
3.4.8 Recovering from a Session Switching Failure . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
Call Control Library Initialization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
4.1.1 Setting a SIP Outbound Proxy. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109
4.1.2 Configuring SIP Transport Protocol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
4.1.3 Enabling and Disabling H.245 Tunneling (H.323) . . . . . . . . . . . . . . . . . . . . . . . . 114
Fast and Slow Call Setup Modes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
4.2.1 Setting the Call Setup Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
4.2.2 H.323 Fast Start and Slow Start . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116
4.2.3 H.323 Fast Start with Optional H.245 Channel . . . . . . . . . . . . . . . . . . . . . . . . . . 117
4.2.4 SIP Call Setup Modes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
4.2.5 Retrieving Coder Information from Call Offers. . . . . . . . . . . . . . . . . . . . . . . . . . . 119
Setting Call-Related Information. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
4.3.1 Overview of Setting Call-Related Information . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
4.3.2 Setting Coder Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
4.3.3 Specifying Nonstandard Data Information (H.323) . . . . . . . . . . . . . . . . . . . . . . . 128
4.3.4 Specifying Nonstandard Control Information (H.323) . . . . . . . . . . . . . . . . . . . . . 130
Connection Phase Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
4.4.1 Setting and Retrieving Disconnect Cause or Reason Values . . . . . . . . . . . . . . . 132
4.4.2 Setting Busy Reason Codes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
4.4.3 SIP Provisional (1xx) Responses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
4.4.4 SIP Redirection (3xx) Response Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
4.4.5 SIP Rejection Responses . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
4.4.6 Configuring Proceeding Message Generation (H.323) . . . . . . . . . . . . . . . . . . . . 141
Retrieving Current Call-Related Information. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
4.5.1 Retrieving Nonstandard Data From Protocol Messages (H.323) . . . . . . . . . . . . 145
4.5.2 Examples of Retrieving Call-Related Information . . . . . . . . . . . . . . . . . . . . . . . . 145
Receiving Notification Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
Dialogic® Global Call IP Technology Guide – November 2007
Dialogic Corporation
Contents
4.7
4.8
4.9
4.10
4.11
4.12
4.13
4.14
4.15
4.6.1 Enabling and Disabling Unsolicited Notification Events . . . . . . . . . . . . . . . . . . .
4.6.2 Getting Media Streaming Status and Connection Information . . . . . . . . . . . . . .
4.6.3 Getting Notification of Underlying Protocol State Changes . . . . . . . . . . . . . . . .
Modifying an Existing SIP Call via re-INVITE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.7.1 Overview of the SIP re-INVITE Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.7.2 Enabling Application Access to re-INVITE Requests . . . . . . . . . . . . . . . . . . . . .
4.7.3 Receiving SIP re-INVITE Requests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.7.4 Responding to SIP re-INVITE Requests. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.7.5 Sending a SIP re-INVITE Request . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.7.6 Canceling a Pending re-INVITE Request . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.7.7 Updating Dialog Properties via re-INVITE . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.7.8 Implementing Hold and Retrieve via SIP re-INVITE . . . . . . . . . . . . . . . . . . . . . .
Setting and Retrieving Q.931 Message IEs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.8.1 Enabling Access to Q.931 Message IEs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.8.2 Supported Q.931 Message IEs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.8.3 Setting Q.931 Message IEs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.8.4 Retrieving Q.931 Message IEs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.8.5 Common Usage Scenarios Involving Q.931 Message IEs . . . . . . . . . . . . . . . . .
Setting and Retrieving SIP Message Header Fields . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.9.1 SIP Header Access Overview. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.9.2 Enabling Access to SIP Header Information. . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.9.3 Enabling Long Header Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.9.4 Registering SIP Header Fields to be Retrieved . . . . . . . . . . . . . . . . . . . . . . . . .
4.9.5 Setting SIP Header Fields for Outbound Messages . . . . . . . . . . . . . . . . . . . . . .
4.9.6 Retrieving SIP Message Header Fields . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Using MIME Bodies in SIP Messages (SIP-T). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.10.1 SIP MIME Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.10.2 Enabling and Configuring the SIP MIME Feature . . . . . . . . . . . . . . . . . . . . . . . .
4.10.3 Getting MIME Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.10.4 Sending MIME Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.10.5 MIME Error Conditions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Specifying Transport for SIP Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Handling SIP Transport Failures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Sending and Receiving SIP INFO Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.13.1 Sending an INFO Message . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.13.2 Receiving a Response to an INFO Message . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.13.3 Receiving an INFO Message . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.13.4 Responding to an INFO Message . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Sending and Receiving SIP OPTIONS Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.14.1 Default OPTIONS Behavior . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.14.2 Enabling Application Access to OPTIONS Messages . . . . . . . . . . . . . . . . . . . .
4.14.3 Sending OPTIONS Requests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.14.4 Receiving Responses to OPTIONS Requests . . . . . . . . . . . . . . . . . . . . . . . . . .
4.14.5 Receiving OPTIONS Requests. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.14.6 Responding to OPTIONS Requests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Using SIP SUBSCRIBE and NOTIFY Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.15.1 Sending SUBSCRIBE Requests. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.15.2 Receiving Responses to SUBSCRIBE Requests . . . . . . . . . . . . . . . . . . . . . . . .
4.15.3 Receiving SUBSCRIBE Requests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.15.4 Responding to SUBSCRIBE Requests. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Dialogic® Global Call IP Technology Guide – November 2007
Dialogic Corporation
154
155
157
157
158
159
159
162
163
165
166
167
169
169
170
170
170
171
172
172
179
179
180
183
185
188
188
191
191
197
200
201
202
205
205
206
208
209
210
210
211
212
215
217
218
222
223
225
228
229
5
Contents
4.16
4.17
4.18
4.19
4.20
4.21
4.22
4.23
4.24
4.25
4.26
6
4.15.5 Sending NOTIFY Requests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
4.15.6 Receiving Responses to NOTIFY Requests . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234
4.15.7 Receiving NOTIFY Requests. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
4.15.8 Responding to NOTIFY Requests . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
Handling DTMF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
4.16.1 Specifying DTMF Support . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
4.16.2 Getting Notification of DTMF Detection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
4.16.3 Generating DTMF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
4.16.4 Generating or Detecting DTMF Tones Using a Voice Resource . . . . . . . . . . . . . 241
Sending Nonstandard Protocol Messages (H.323) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
4.17.1 Nonstandard UII Message (H.245) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243
4.17.2 Nonstandard Facility Message (Q.931) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 244
4.17.3 Nonstandard Registration Message . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
4.17.4 Sending Facility, UII, or Registration Message Scenario. . . . . . . . . . . . . . . . . . . 246
Using H.323 Annex M Tunneled Signaling Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
4.18.1 Tunneled Signaling Message Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
4.18.2 Enabling Tunneled Signaling Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 249
4.18.3 Composing Tunneled Signaling Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 250
4.18.4 Sending Tunneled Signaling Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 252
4.18.5 Receiving Tunneled Signaling Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254
Retrieving User-to-User Information Elements from H.323 Messages. . . . . . . . . . . . . . . 258
4.19.1 Enabling Reception of User-to-User Information . . . . . . . . . . . . . . . . . . . . . . . . . 259
4.19.2 Retrieving UU-IEs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 260
Specifying RTP Stream Establishment. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
Managing Quality of Service Alarms. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
4.21.1 Alarm Source Object Name . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
4.21.2 Retrieving the Media Device Handle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
4.21.3 Setting QoS Threshold Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
4.21.4 Retrieving QoS Threshold Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
4.21.5 Handling QoS Alarms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
Registration. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
4.22.1 Registration Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
4.22.2 Registration Operations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
4.22.3 Sending and Receiving Nonstandard Registration Messages (H.323) . . . . . . . . 278
4.22.4 Registration Code Examples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279
4.22.5 Gatekeeper Registration Failure (H.323). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
SIP Digest Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
Using SIP Transport Layer Security (TLS) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
4.24.1 Overview of TLS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 289
4.24.2 Configuring and Enabling TLS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 296
4.24.3 Making Calls Using TLS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
4.24.4 TLS Transport Failures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
Call Transfer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
4.25.1 Enabling Call Transfer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
4.25.2 Dialogic® Global Call API Line Devices for Call Transfer . . . . . . . . . . . . . . . . . . 311
4.25.3 Incoming Transferred Call . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312
4.25.4 Call Transfer Glare Condition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
4.25.5 Call Transfer When Using SIP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315
T.38 Fax Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
4.26.1 T.38 Fax Server Support Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
Dialogic® Global Call IP Technology Guide – November 2007
Dialogic Corporation
Contents
4.27
4.28
4.29
4.30
5
5.2
5.3
5.4
5.5
323
325
325
326
328
329
330
330
330
331
332
333
335
Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.1.1 Third Party Call Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.1.2 Global Call Library and IP Media Library for Third Party Call Control. . . . . . . . .
5.1.3 Session Description Protocol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Global Call in Third Party Call Control Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.2.1 Initializing the Library in Third Party Call Control Mode . . . . . . . . . . . . . . . . . . .
5.2.2 Interface Changes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.2.3 Device Types and Usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.2.4 Using Fast Start and Slow Start Setup in Third Party Call Control Mode . . . . . .
5.2.5 Call Transfer Scenarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.2.6 DTMF Transport . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.2.7 T.38 Fax and Tone Detection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Session Description Protocol Parser/Generator Example . . . . . . . . . . . . . . . . . . . . . . . .
Message Sequence Diagrams. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.4.1 First Party Call Establishment in Third Party Call Control Mode. . . . . . . . . . . . .
5.4.2 Basic Third Party Call Control Establishment . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.4.3 Alternate Third Party Call Control Establishment . . . . . . . . . . . . . . . . . . . . . . . .
5.4.4 Modifying the Coder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.4.5 Cancelling a re-INVITE Request. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.4.6 Receiving an Invalid Answer SDP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.4.7 OPTIONS Request on an Active Dialog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Processing Intraframe Requests for Video Streams . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.5.1 Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.5.2 Requesting an I-Frame in SIP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.5.3 Global Call Example Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
337
337
341
342
343
343
344
352
352
352
353
353
353
353
354
355
358
362
366
367
368
371
371
372
372
Building Dialogic® Global Call API IP Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375
6.1
6.2
6.3
7
322
322
Third Party Call Control (3PCC) Operations and Multimedia Support . . . . . . . . . . . . . . . . 337
5.1
6
4.26.2 Specifying Manual Operating Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.26.3 Initiating a Switch from Audio to T.38 Fax . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.26.4 Associating a T.38 Fax Device with a Media Device When a Fax Request is
Received . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.26.5 Accepting/Rejecting a Request to Switch Between Audio and T.38 Fax . . . . . .
4.26.6 Sending a T.38 Fax in a Session Without Audio Established . . . . . . . . . . . . . . .
4.26.7 Receiving a T.38 Fax in a Session Without Audio Established . . . . . . . . . . . . .
4.26.8 Sending a Request to Switch from T.38 Fax to Audio . . . . . . . . . . . . . . . . . . . .
4.26.9 Receiving a Request to Switch from T.38 Fax to Audio . . . . . . . . . . . . . . . . . . .
4.26.10 Terminating a Call After a T.38 Fax Session . . . . . . . . . . . . . . . . . . . . . . . . . . .
Sending and Receiving V.17 Faxes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4.27.1 Sending G.711 Fax in an Established Audio Session . . . . . . . . . . . . . . . . . . . .
4.27.2 Receiving G.711 Fax in an Established Audio Session . . . . . . . . . . . . . . . . . . .
Using Object Identifiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
LAN Disconnection Alarms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Setting Dialogic® IP Media Library Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Header Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375
Required Libraries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375
Required System Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376
Debugging Dialogic® Global Call API IP Applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
7.1
Debugging Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
Dialogic® Global Call IP Technology Guide – November 2007
Dialogic Corporation
7
Contents
7.2
8
IP-Specific Function Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 387
8.1
8.2
8.3
8
Configuring the Logging Facility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378
7.2.1 Configuration File Overview. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378
7.2.2 Configuring the gc_h3r Logging Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379
7.2.3 Configuring SIP Stack Logging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 382
7.2.4 Configuring H.323 Stack Logging . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383
Dialogic® Global Call API Functions Supported by IP . . . . . . . . . . . . . . . . . . . . . . . . . . . 387
IP-Specific Dialogic® Global Call API Functions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394
gc_AcceptModifyCall( ) – accept proposed modification of call characteristics . . . . . . . . 396
gc_RejectModifyCall( ) – reject proposed modification of call attributes . . . . . . . . . . . . . 406
gc_ReqModifyCall( ) – request modification of call attributes. . . . . . . . . . . . . . . . . . . . . . 414
gc_SetAuthenticationInfo( ) – set IP authentication information . . . . . . . . . . . . . . . . . . . . 421
gc_SipAck( ) – acknowledge a SIP 200OK message in 3PCC mode . . . . . . . . . . . . . . . 424
gc_util_copy_parm_blk( ) – copy the specified GC_PARM_BLK . . . . . . . . . . . . . . . . . . . 428
gc_util_find_parm_ex( ) – find a parameter in a GC_PARM_BLK . . . . . . . . . . . . . . . . . . 430
gc_util_insert_parm_ref_ex( ) – insert a GC_PARM_BLK parameter by reference . . . . . 433
gc_util_next_parm_ex( ) – retrieve the next parameter in a GC_PARM_BLK . . . . . . . . . 436
INIT_GC_PARM_DATA_EXT( ) – initialize GC_PARM_DATA_EXT structure . . . . . . . . 439
INIT_IP_VIRTBOARD( ) – initialize IP_VIRTBOARD data structure . . . . . . . . . . . . . . . . 441
INIT_IPCCLIB_START_DATA( ) – initialize IPCCLIB_START_DATA structure . . . . . . . 443
Dialogic® Global Call API Function Variances for IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444
8.3.1 gc_AcceptCall( ) Variances for IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 444
8.3.2 gc_AcceptInitXfer( ) Variances for IP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445
8.3.3 gc_AcceptXfer( ) Variances for IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446
8.3.4 gc_AnswerCall( ) Variances for IP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447
8.3.5 gc_CallAck( ) Variances for IP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448
8.3.6 gc_Close( ) Variances for IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448
8.3.7 gc_DropCall( ) Variances for IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448
8.3.8 gc_Extension( ) Variances for IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 449
8.3.9 gc_GetAlarmParm( ) Variances for IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451
8.3.10 gc_GetCallInfo( ) Variances for IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452
8.3.11 gc_GetCTInfo( ) Variances for IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455
8.3.12 gc_GetResourceH( ) Variances for IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455
8.3.13 gc_GetXmitSlot( ) Variances for IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455
8.3.14 gc_InitXfer( ) Variances for IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455
8.3.15 gc_InvokeXfer( ) Variances for IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456
8.3.16 gc_Listen( ) Variances for IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 460
8.3.17 gc_MakeCall( ) Variances for IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 460
8.3.18 gc_OpenEx( ) Variances for IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 476
8.3.19 gc_RejectInitXfer( ) Variances for IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 477
8.3.20 gc_RejectXfer( ) Variances for IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478
8.3.21 gc_ReleaseCallEx( ) Variances for IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 478
8.3.22 gc_ReqService( ) Variances for IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 479
8.3.23 gc_RespService( ) Variances for IP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 482
8.3.24 gc_SetAlarmParm( ) Variances for IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483
8.3.25 gc_SetConfigData( ) Variances for IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484
8.3.26 gc_SetUserInfo( ) Variances for IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 487
8.3.27 gc_Start( ) Variances for IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 491
Dialogic® Global Call IP Technology Guide – November 2007
Dialogic Corporation
Contents
8.4
8.5
9
494
495
495
495
IP-Specific Parameters. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 499
9.1
9.2
10
8.3.28 gc_Stop( ) Variances for IP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
8.3.29 gc_UnListen( ) Variances for IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Dialogic® Global Call API States Supported by IP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Dialogic® Global Call API Events Supported by IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Overview of Parameter Usage. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Parameter Set Reference . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.2.1 GCSET_CALL_CONFIG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.2.2 IPSET_CALLINFO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.2.3 IPSET_CONFERENCE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.2.4 IPSET_CONFIG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.2.5 IPSET_DTMF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.2.6 IPSET_EXTENSIONEVT_MSK . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.2.7 IPSET_FOIP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.2.8 IPSET_H323_RESPONSE_CODE. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.2.9 IPSET_IPPROTOCOL_STATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.2.10 IPSET_LOCAL_ALIAS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.2.11 IPSET_MEDIA_STATE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.2.12 IPSET_MIME and IPSET_MIME_200OK_TO_BYE . . . . . . . . . . . . . . . . . . . . . .
9.2.13 IPSET_MSG_H245. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.2.14 IPSET_MSG_Q931 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.2.15 IPSET_MSG_REGISTRATION . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.2.16 IPSET_MSG_SIP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.2.17 IPSET_NONSTANDARDCONTROL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.2.18 IPSET_NONSTANDARDDATA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.2.19 IPSET_PROTOCOL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.2.20 IPSET_REG_INFO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.2.21 IPSET_RTP_ADDRESS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.2.22 IPSET_SDP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.2.23 IPSET_SIP_MSGINFO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.2.24 IPSET_SIP_REQUEST_ERROR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.2.25 IPSET_SIP_RESPONSE_CODE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.2.26 IPSET_SUPPORTED_PREFIXES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.2.27 IPSET_SWITCH_CODEC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.2.28 IPSET_TRANSACTION . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.2.29 IPSET_TUNNELEDSIGNALMSG. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.2.30 IPSET_VENDORINFO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
499
510
511
512
514
515
517
518
518
519
519
520
521
522
523
523
523
524
525
526
526
527
528
528
529
531
532
533
533
534
535
536
IP-Specific Data Structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 537
GC_PARM_DATA_EXT – retrieved parameter data . . . . . . . . . . . . . . . . . . . . . . . . . . . .
IP_ADDR – local IP address . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
IP_AUDIO_CAPABILITY – basic audio capability information . . . . . . . . . . . . . . . . . . . .
IP_AUTHENTICATION – SIP digest authentication data . . . . . . . . . . . . . . . . . . . . . . . .
IP_CAPABILITY – basic capability information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
IP_CAPABILITY_UNION – parameters for different capability categories . . . . . . . . . . .
IP_CONNECT – associate a Media device with a T.38 Fax device . . . . . . . . . . . . . . . .
IP_DTMF_DIGITS – DTMF information. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
IP_DATA_CAPABILITY – basic data capability information . . . . . . . . . . . . . . . . . . . . . .
IP_H221NONSTANDARD – H.221 nonstandard data . . . . . . . . . . . . . . . . . . . . . . . . . .
Dialogic® Global Call IP Technology Guide – November 2007
Dialogic Corporation
538
540
541
542
543
545
546
547
548
549
9
Contents
IP_REGISTER_ADDRESS – gatekeeper registration information . . . . . . . . . . . . . . . . . . 550
IP_TUNNELPROTOCOL_ALTID – TSM protocol alternate ID. . . . . . . . . . . . . . . . . . . . . 551
IP_TUNNELPROTOCOL_OBJECTID – tunneled signaling protocol object ID . . . . . . . . 552
IP_VIRTBOARD – information about an IPT board device . . . . . . . . . . . . . . . . . . . . . . . 553
IPCCLIB_START_DATA – IP call control library configuration information . . . . . . . . . . . 558
REQUEST_ERROR – SIP request retry info . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 560
RTP_ADDR – RTP address . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 561
SIP_TLS_ENGINE – TLS engine configuration information. . . . . . . . . . . . . . . . . . . . . . . 562
11
IP-Specific Event Cause Codes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 565
11.1
11.2
11.3
11.4
11.5
12
IP-Specific Error Codes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 565
Error Codes When Using H.323 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569
Internal Disconnect Reasons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 574
Event Cause Codes and Failure Reasons When Using H.323 . . . . . . . . . . . . . . . . . . . . 576
Failure Response Codes When Using SIP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 584
Supplementary Reference Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 591
12.1
12.2
12.3
12.4
References to More Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 591
SIP Transaction Timer Values . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 592
DNS Configuration for SIP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593
Called and Calling Party Address List Format When Using H.323. . . . . . . . . . . . . . . . . . 594
Glossary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 599
10
Dialogic® Global Call IP Technology Guide – November 2007
Dialogic Corporation
Contents
Figures
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
Typical H.323 Network. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
H.323 Protocol Stack . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
Basic H.323 Network with a Gateway . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
Basic SIP Call Scenario. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
Dialogic® Global Call API Over IP Architecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
Dialogic® Global Call API Devices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
Configurations for Binding IPT Boards to NIC IP Addresses. . . . . . . . . . . . . . . . . . . . . . . . . . . 48
Basic Call Setup When Using H.323 or SIP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
Basic Call Teardown When Using H.323 or SIP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
H.323 Early Media, FastStart Mode. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
H.323 Early Media, SlowStart Mode with Early H.245 Enabled . . . . . . . . . . . . . . . . . . . . . . . . 55
SIP Early Media, Calling UA Offers SDP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
SIP Early Media, Calling UA Answers SDP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
Successful H.450.2 Blind Call Transfer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
H.450.2 Blind Call Transfer Failure - Party B Rejects Call Transfer . . . . . . . . . . . . . . . . . . . . . 61
H.450.2 Blind Call Transfer Failure - No Response from Party B . . . . . . . . . . . . . . . . . . . . . . . 62
H.450.2 Blind Call Transfer Failure - No Response from Party C . . . . . . . . . . . . . . . . . . . . . . . 63
H.450.2 Blind Call Transfer Failure - Party B Clears Primary Call Before Transfer is Completed.
64
H.450.2 Blind Call Transfer Failure - Party C is Busy When Transfer Attempted . . . . . . . . . . . 65
Successful H.450.2 Supervised Call Transfer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
H.450.2 Supervised Call Transfer Failure - Party C Timeout . . . . . . . . . . . . . . . . . . . . . . . . . . 70
H.450.2 Supervised Call Transfer Failure - Party C Rejects the Transfer Request. . . . . . . . . . 71
H.450.2 Supervised Call Transfer Failure - Party B Rejects the Transfer Request. . . . . . . . . . 72
H.450.2 Supervised Call Transfer Failure - Party B Timeout. . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Successful SIP Unattended Call Transfer, Party A Notified with Connection . . . . . . . . . . . . . . 79
Successful SIP Unattended Call Transfer, Party A Notified with Ringing . . . . . . . . . . . . . . . . . 80
Successful SIP Unattended Call Transfer, Party B Terminates REFER Subscription
prior to Notification of Transferred Call Status. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
Successful SIP Unattended Call Transfer, Party A Clears Primary Call prior to Transfer
Completion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
Successful SIP Unattended Call Transfer, Party B Clears Primary Call prior to Transfer
Completion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
Successful SIP Attended Call Transfer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
SIP Attended Call Transfer, Recovery from REFER Unsupported . . . . . . . . . . . . . . . . . . . . . . 88
SIP Attended Call Transfer, Recovery from URI Not Routable . . . . . . . . . . . . . . . . . . . . . . . . . 89
SIP Call Transfer Failure - Party B Rejects Call Transfer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
SIP Call Transfer Failure - No Response from Party B . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
SIP Call Transfer Failure - No Initial NOTIFY After REFER is Accepted. . . . . . . . . . . . . . . . . . 92
SIP Call Transfer Failure - REFER Subscription Expires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
SIP Call Transfer Failure - No Response from Party C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94
SIP Call Transfer Failure - Party B Drops Transferred Call Early . . . . . . . . . . . . . . . . . . . . . . . 95
Dialogic® Global Call IP Technology Guide – November 2007
Dialogic Corporation
11
Contents
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
12
SIP Call Transfer Failure - Party C is Busy When Transfer Attempted . . . . . . . . . . . . . . . . . . . 96
Sending T.38 Fax in an Established Audio Session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
Receiving T.38 Fax in an Established Audio Session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100
Sending T.38 Fax Without an Established Audio Session . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
Receiving T.38 Fax Without an Established Audio Session . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
Sending a Request to Switch From T.38 Fax to Audio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
Receiving a Request to Switch From T.38 Fax to Audio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
Terminating a Call After a T.38 Fax Transfer. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
SIP MIME Scenario for Normal Call Setup and Teardown . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
SIP MIME Scenario for Rejected Call. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
SIP MIME GC_PARM_BLK Structure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
Sending Protocol Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
Outbound Proxy Configured for TLS Transport with Both IP and Hostname . . . . . . . . . . . . . . 304
Outbound Proxy Configured for TLS Transport with Only IP Address Or Hostname . . . . . . . . 305
TLS with “sip:” Source Address and “sip:” Destination Address . . . . . . . . . . . . . . . . . . . . . . . . 306
TLS with “sip:” Source Address and “sips:” Destination Address . . . . . . . . . . . . . . . . . . . . . . . 307
TLS with “sips:” Source Address and “sip:” Destination Address . . . . . . . . . . . . . . . . . . . . . . . 308
TLS with “sips” Source Address and “sips:” Destination Address . . . . . . . . . . . . . . . . . . . . . . 309
Global Call Devices for H.450.2 Blind Call Transfer or SIP Unattended Transfer . . . . . . . . . . 312
Global Call Devices for Supervised Call Transfer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 312
Call Transfer Glare Condition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
T.38 Fax Server Support in Manual Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
Sending G.711 Fax in an Established Audio Session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
Receiving G.711 Fax in an Established Audio Session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332
Third Party Call Controller . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
Basic Call Setup When Using Third Party Call Control . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
Third Party Call Control Setup using re-INVITE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 340
Global Call over IP Architecture for Third Party Call Control Mode . . . . . . . . . . . . . . . . . . . . . 342
First Party Call Control Establishment in Third Party Call Control Mode . . . . . . . . . . . . . . . . . 354
Basic Third Party Call Control Establishment (part one) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 356
Basic Third Party Call Control Establishment (part two). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 357
Alternate Third Party Call Control Establishment (part one). . . . . . . . . . . . . . . . . . . . . . . . . . . 359
Alternate Third Party Call Control Establishment (part two) . . . . . . . . . . . . . . . . . . . . . . . . . . . 360
Alternate Third Party Call Control Establishment (part three) . . . . . . . . . . . . . . . . . . . . . . . . . 361
Successfully Modifying the Coder (part one) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363
Successfully Modifying the Coder (part two) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
Unsuccessfully Modifying the Coder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 365
Cancelling a Coder Switch using re-INVITE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366
Receiving an Invalid Answer SDP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368
OPTIONS Request without a MIME Body . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 370
OPTIONS Request with a MIME Body . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371
Dialogic® Global Call IP Technology Guide – November 2007
Dialogic Corporation
Contents
Tables
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
Summary of Call-Related Information that can be Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Coders Supported for Dialogic® Host Media Processing (HMP) Software . . . . . . . . . . . . . . .
Capabilities Set by Application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Retrievable Call Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Supported Q.931 Message Information Elements. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Supported IEs in Incoming Q.931 Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Common Usage Scenarios Involving Q.931 Message IEs . . . . . . . . . . . . . . . . . . . . . . . . . . .
Common Header Fields in Outbound SIP Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Common Header Fields in Inbound SIP Messages. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Field-Specific Parameters (Deprecated) for SIP Header Access . . . . . . . . . . . . . . . . . . . . . .
Parameter IDs for Partial Header Field Access (Deprecated) . . . . . . . . . . . . . . . . . . . . . . . . .
Global Call Events for Incoming SIP Messages that can Contain MIME Bodies. . . . . . . . . . .
Global Call Functions for SIP MIME Messages Using IPSET_MIME . . . . . . . . . . . . . . . . . . .
Summary of DTMF Mode Settings and Behavior . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Summary of Protocol Messages that Can be Sent with Nonstandard Data . . . . . . . . . . . . . .
H.225 Messages and Global Call Functions for Sending Tunneled Signaling Messages . . . .
H.225 Messages and Global Call Events for Receiving Tunneled Signaling Messages . . . . .
H.225 Messages and Global Call Events for Receiving UU-IE . . . . . . . . . . . . . . . . . . . . . . . .
SIP REGISTER Method. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
IPSET_SDP Parameter Set. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Summary of IPSET_SDP Parameters and Outbound SIP Messages . . . . . . . . . . . . . . . . . . .
Summary of Events That Support Global Call SDP Parameter Sets. . . . . . . . . . . . . . . . . . . .
Global Call Third Party Call Control Mode Events. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Global Call Third Party Call Control Mode Error Codes . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Global Call Functions Invalid in Third Party Call Control Mode . . . . . . . . . . . . . . . . . . . . . . . .
Valid Extension IDs for the gc_Extension( ) Function . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
gc_InvokeXfer( ) Supported Parameters for H.450.2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
H.450.2 ctInitiate Errors Received from the Network. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
H.450.2 ctIdentify Errors Received From the Network . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
H.450.2 ctSetup Errors Received From the Network. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
H.450.2 CT Timer Expiry . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
gc_InvokeXfer( ) Supported Parameters for SIP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
SIP Header Fields Settable in REFER Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Configurable Call Parameters When Using H.323 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Configurable Call Parameters When Using SIP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
ctIdentify Errors Signaled From gc_RejectInitXfer( ) to the Network . . . . . . . . . . . . . . . . . . . .
ctInitiate Errors Signaled From gc_RejectXfer( ) to the Network . . . . . . . . . . . . . . . . . . . . . . .
Registration Information When Using H.323 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Registration Information When Using SIP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
Parameters Configurable Using gc_SetConfigData( ) When Using H.323 . . . . . . . . . . . . . . .
Parameters Configurable Using gc_SetConfigData( ) When Using SIP . . . . . . . . . . . . . . . . .
Dialogic® Global Call IP Technology Guide – November 2007
Dialogic Corporation
122
127
128
143
170
171
171
173
175
178
184
192
197
240
242
253
255
259
270
346
346
347
350
351
351
450
456
457
457
458
458
459
460
461
464
477
478
480
482
485
487
13
Contents
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
14
Summary of Parameter Sets and Parameter Usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 499
GCSET_CALL_CONFIG Parameter Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 511
IPSET_CALLINFO Parameter Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 512
IPSET_CONFERENCE Parameter Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514
IPSET_CONFIG Parameter Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515
IPSET_DTMF Parameter Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 517
IPSET_EXTENSIONEVT_MSK Parameter Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518
IPSET_FOIP Parameter Set. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 518
IPSET_H323_RESPONSE_CODE Parameter Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519
IPSET_IPPROTOCOL_STATE Parameter Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519
IPSET_LOCAL_ALIAS Parameter Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 520
IPSET_MEDIA_STATE Parameter Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521
IPSET_MIME and IPSET_MIME_200OK_TO_BYE Parameter Sets. . . . . . . . . . . . . . . . . . . . 522
IPSET_MSG_H245 Parameter Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523
IPSET_MSG_Q931 Parameter Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523
IPSET_MSG_REGISTRATION Parameter Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523
IPSET_MSG_SIP Parameter Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 524
IPSET_NONSTANDARDCONTROL Parameter Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525
IPSET_NONSTANDARDDATA Parameter Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526
IPSET_PROTOCOL Parameter Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526
IPSET_REG_INFO Parameter Set. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527
IPSET_RTP_ADDRESS Parameter Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528
IPSET_SDP Parameter Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529
IPSET_SIP_MSGINFO Parameter Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529
IPSET_SIP_REQUEST_ERROR Parameter Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 531
IPSET_SIP_RESPONSE_CODE Parameter Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 532
IPSET_SUPPORTED_PREFIXES Parameter Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533
IPSET_SWITCH_CODEC Parameter Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533
IPSET_TRANSACTION Parameter Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 534
IPSET_TUNNELEDSIGNALMSG Parameter Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 535
IPSET_VENDORINFO Parameter Set . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536
Dialogic® Global Call IP Technology Guide – November 2007
Dialogic Corporation
Revision History
This revision history summarizes the changes made in each published version of this document.
Document No.
Publication Date
Description of Revisions
05-2239-009
November 2007
Made global changes to reflect Dialogic brand.
05-2239-008
August 2006
Setting Coder Information: Added G.726 coder info
SIP Rejection Responses: New section
Using H.323 Annex M Tunneled Signaling Messages: Revised entire section for
updated implementation of feature
Retrieving User-to-User Information Elements from H.323 Messages: New section
and subsections
Using SIP Transport Layer Security (TLS): New section and subsections
Sending and Receiving V.17 Faxes: New section
gc_Stop( ) Variances for IP: New section
Summary of Parameter Sets and Parameter Usage table: Added entry for new
IPSET_CALLINFO/ IPPARM_UUIE_ASN1 and IPSET_CONFIG/
IPPARM_1PCC_REJECT_VIDEO parameters
IPSET_CALLINFO Parameter Set table: Added entry for new IPPARM_UUIE_ASN1
parameter
IPSET_CONFIG: Added entry for new IPPARM_1PCC_REJECT_VIDEO parameter
IP_TUNNELPROTOCOL_OBJECTID data structure: new reference page
IP_CAPABILITY data structure: Added capability value for G.726 coder
IP_VIRTBOARD data structure: Added information on limits for xxx_max_call values
in 3PCC mode. Added new UU-IE define for h323_msg_info field, new TLS
define for E_SIP_OutboundProxyTransport field, and new sip_tls_engine field
SIP_TLS_ENGINE data structure: new reference page
SIP Transaction Timer Values: New section
DNS Configuration for SIP: New section
05-2239-007
December 2005
Call Setup Scenarios for Early Media: New section
Retrieving Coder Information from Fast Start Call Offers: New section
Setting Coder Information section: Added defines for half-duplex capabilities
Specifying Nonstandard Data Information (H.323): Updated for data >255 bytes
Specifying Nonstandard Control Information (H.323): Updated for data >255 bytes
Connection Phase Messages: New section to consolidate several existing topics
SIP Provisional (1xx) Responses: New section
SIP Redirection (3xx) Response Messages: New section
Receiving Notification Events: New section to consolidate 3 existing related topics
Getting Media Streaming Status and Connection Information section: Added parm
IDs for half-duplex and on-hold states
Modifying an Existing SIP Call (re-INVITE): New section and subsections
Field-Specific Parameters (Deprecated) for SIP Header Access table: Deleted five
unsupported IPPARM defines
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
15
Revision History
Document No.
05-2239-007
(continued)
Publication Date
Description of Revisions
Retrieving SIP Message Header Fields section: Added note on truncation of too-long
header fields
Sending Nonstandard Protocol Messages (H.323): Updated for NS data >255 bytes
Using MIME Bodies in SIP Messages (SIP-T) section: Updated for MIME header
field parameters >255 bytes
Using H.323 Annex M Tunneled Signaling Messages section: Updated for NS data
>255 bytes. Updated defines for object IDs.
Registration Overview section: Updated description of H.323 unregistration behavior
Registration Code Examples section: Updated registration code example
Sending and Receiving Nonstandard Registration Messages (H.323) section:
updated for NS data > 255 bytes
Setting IP Media Library Parameters: New section
Global Call Functions Supported by IP section: Added entries for Global Call
functions that support non-IP technologies
Message Sequence Diagrams section: Removed notes about lack of support for the
ipm_ModifyMedia( ) function
gc_AcceptModifyCall( ) function: Updated to describe use in 1PCC mode
gc_RejectModifyCall( ) function: Updated to describe use in 1PCC mode
gc_ReqModifyCall( ) function: Updated to describe use in 1PCC mode
gc_util_copy_parm_blk( ) function: Updated parms supporting >255 byte data
gc_util_find_parm_ex( ) function: Updated parms supporting >255 byte data
gc_util_insert_parm_ref_ex( ) function: Updated parms supporting >255 byte data
gc_util_next_parm_ex( ) function: Updated parms supporting >255 byte data
INIT_GC_PARM_DATA_EXT( ) function: new reference page
gc_AcceptCall( ) Variances for IP: Added info about Q.931 Progress message
gc_Start( ) Variances for IP section: Corrected descriptions of default start-up
Summary of Parameter Sets and Parameter Usage table: Added new parm IDs to
IPSET_CONFIG, IPSET_MEDIA_STATE, & IPSET_SIP_RESPONSE_CODE.
Deleted 5 unimplemented parm IDs from IPSET_SIP_MSGINFO.
IPSET_CONFIG Parameter Set table: Added new parm ID for IPML parameters and
new SIP-specific parameter value for IPPARM_OPERATING_MODE
IPSET_MEDIA_STATE Parameter Set table: Added four parm IDs for inactive and
half-duplex states
IPSET_MIME and IPSET_MIME_200OK_TO_BYE Parameter Sets table: Updated
for MIME part headers > 255 bytes
IPSET_NONSTANDARDCONTROL Parameter Set: Updated for data >255 bytes
IPSET_NONSTANDARDDATA Parameter Set table: Updated for data >255 bytes
IPSET_SIP_MSGINFO Parameter Set table: Deleted five unimplemented parm IDs
IPSET_SIP_RESPONSE_CODE Parameter Set table: Added new parm ID for
provisional response status codes
IPSET_TUNNELEDSIGNALMSG Parameter Set table: Updated for data >255 bytes
IP_CAPABILITY data structure: Added new direction defines for half-duplex, on-hold
streaming and FastStart coder info retrieval
IP_VIRTBOARD data structure: Updated descriptions of ..._max_calls fields. Added
FastStart coder info defines for message info masks
IPCCLIB_START_DATA data structure: Added new parms supporting >255 byte data
REQUEST_ERROR data structure: New reference page
16
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
Revision History
Document No.
Publication Date
Description of Revisions
05-2239-006
August 2005
Call Control Library Initialization section: Expanded information on items that can be
configured, including 3PCC mode
Fast Start and Slow Start Call Setup section: Added subsections with H.323 and SIP
specifics and notes on non-support in 3PCC mode
H.323 Fast Start with Optional H.245 Channel: new section
Summary of Call-Related Information that can be Set table: Added DiffServ field
Specifying Transport for SIP Messages section: Added info about missing events
caused by UDP packet loss
Sending an INFO Message: Corrected code example
Responding to an INFO Message section: Corrected code examples
Handling DTMF section: Added note about LBR coders
Third Party Call Control (3PCC) and Multimedia Support: New chapter
Global Call Functions Supported by IP section: Added entries for new
gc_xxxModifyCall( ) functions and gc_SipAck( )
gc_AcceptModifyCall( ): New SIP-specific function
gc_RejectModifyCall( ): New SIP-specific function
gc_ReqModifyCall( ): New SIP-specific function
gc_SipAck( ): New SIP-specific function
gc_AcceptCall( ) Variances for IP section: Added info on setting SIP response code
gc_DropCall( ) Variances for IP: Added info about missing GCEV_DISCONNECTED
events in SIP
gc_Extension( ) Variances for IP section: Added notes on 3PCC support
gc_MakeCall( ) Variances for IP section: Updated info on SIP timeout behavior.
Corrected names of fast start/slow start parameter values. Added parameter for
optional H.245 channel feature.
Global Call Events Supported by IP section: Added events associated with optional
H.245 channel mode and new gc_xxxModifyCall( ) and gc_SipAck( ) functions
IP-Specific Parameters chapter : Updated entries for media-related parameter sets to
indicate non-support in 3PCC mode
Summary of Parameter Sets and Parameter Usage table: Added new parm IDs to
IPSET_CALLINFO (1), IPSET_IPPROTOCOL_STATE (1), IPSET_MSG_SIP
(1), IPSET_SIP_RESPONSE_CODE (1). Added new IPSET_SDP (4 parm IDs)
IPSET_CALLINFO Parameter Set table: Added parm ID for optional H.245 channel
IPSET_CONFIG Parameter Set table: Added info on DiffServ field (DSCP)
IPSET_IPPROTOCOL_STATE Parameter Set table: Added parm for H.245 failure
IPSET_MSG_SIP Parameter Set table: Added IPPARM_SIP_METHOD parm ID
IPSET_SDP parameter set: New section
IPSET_SIP_RESPONSE_CODE Parameter Set table: Added
IPPARM_ACCEPT_RESP_CODE parm ID
IP_CAPABILITY data structure: Added new direction defines
Error Codes When Using H.323 section: Added new codes for H.245 channel error
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
17
Revision History
Document No.
Publication Date
Description of Revisions
05-2239-005
April 2005
Call Control Library Initialization section: Added more detail about how to set
configuration items before calling gc_Start( )
Setting and Retrieving SIP Message Header Fields section: Rewritten to document
generic access mechanism and long header support
Sending OPTIONS Requests section: added note on inclusion of MIME SDP body
Responding to OPTIONS Requests section: Added information about automatic
inclusion of SDP in MIME body of OK responses
Sending NOTIFY Requests section: Corrected code example
Using H.323 Annex M Tunneled Signaling Messages: New section and subsections
Registration section: Reorganized subsections and added information on new SIP
registration capabilities
SIP Digest Authentication: New section and subsections
Debugging Global Call IP Applications chapter : Added note in two locations about
SIP stack parsing error log file
Global Call Functions Supported by IP section: Added entries for
gc_SetAuthenticationInfo( ) and new gc_util_... functions
IP-Specific Global Call Functions: New section to contain API reference pages for:
gc_SetAuthenticationInfo( ) (new function),
gc_util_copy_parm_blk( ) (new function),
gc_util_find_parm_ex( ) (new function),
gc_util_insert_parm_ref_ex( ) (new function),
gc_util_next_parm_ex( ) (new function),
INIT_IP_VIRTBOARD( )
INIT_IPCCLIB_START_DATA( )
Valid Extension IDs for the gc_Extension( ) Function table: Added note on parameter
order requirement when using IPEXTID_SENDMSG
gc_OpenEx( ) Variances for IP section: Added note about not closing and re-opening
channels (PTR# 32087)
gc_Start( ) Variances for IP section: Added information about how to reference
configuration data structure when calling function
Initialization Functions section: Eliminated section by moving information to API
reference pages in new IP-Specific Global Call Functions section
Summary of Parameter Sets and Parameter Usage table: Added two authentication
parameter IDs to IPSET_CONFIG. Added “deprecated” indication to all
parameters in the IPSET_SIP_MSGINFO set except IPPARM_SIP_HDR.
Added two new parameter IDs to IPSET_REG_INFO. Added six new entries for
IPSET_TUNNELEDSIGNALMSG parameter set.
IPSET_CONFIG Parameter Set table: Added
IPPARM_AUTHENTICATION_CONFIGURE and
IPPARM_AUTHENTICATION_REMOVE parameters
IPSET_SIP_MSGINFO section: Added note on deprecation of most parm IDs.
Added note about using extended gc_util_... functions with IPPARM_SIP_HDR
IPSET_SIP_MSGINFO Parameter Set table: Added “deprecated” indications to all
parameters except IPPARM_SIP_HDR
IPSET_REG_INFO Parameter Set table: Added IP_REG_QUERY_INFO value for
IPPARM_OPERATION_REGISTER parameter.
Added IPPARM_REG_AUTOREFRESH and IPPARM_REG_SERVICEID
parameters.
18
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
Revision History
Document No.
Publication Date
05-2239-005
(continued)
Description of Revisions
IPSET_TUNNELEDSIGNALMSG parameter set: New section
GC_PARM_DATA_EXT data structure: New section
IP_AUTHENTICATION data structure: New section
IP_TUNNELPROTOCOL_ALTID data structure: New section
IP_VIRTBOARD data structure: Added new h323_msginfo_mask value for Annex M
tunneled signaling messages. Added sip_registration_registrar field.
IPCCLIB_START_DATA data structure: Added max_parm_data_size field
Failure Response Codes When Using SIP section: Added subsection for new SIP
Registration Error response codes
05-2239-004
January 2005
H.450.2 Blind Call Transfer Failure - Party B Rejects Call Transfer figure: Missing
portion of figure restored
Endpoint Behavior in H.450.2 Supervised Call Transfer section: Added precondition
information, including parties in consultation call being in connected state
Call Transfer Scenarios When Using SIP: New section and subsections
Setting a SIP Outbound Proxy: New section
Configuring SIP Transport Protocol: New section and subsections
Retrieving Current Call-Related Information section: Added note about
acknowledging call before extracting information in H.323
Standard Call-Related SIP Message Header Fields table: Added entries for ten
additional headers
Standard Call-Related Headers for Outbound SIP Messages: New table showing
relationship between header s, Global Call functions, and SIP message types
Standard Call-Related Headers for Inbound SIP Messages: ANew table showing
relationship between SIP message types, Global Call event types, and headers
Setting Additional (Generic) SIP Message Headers: New section
Retrieving Additional (Generic) SIP Message Headers: New section
Using SIP Messages with MIME Bodies (SIP-T): New section and subsections
Global Call Events for Incoming SIP Messages that can Contain MIME Bodies table:
Added five additional message types. Event for 3xx to 6xx responses changed
from GCEV_TASKFAIL to GCEV_DISCONNECTED.
Global Call Functions for SIP MIME Messages Using IPSET_MIME table: Added
one function and five additional message types
Specifying Transport for SIP Messages: new section
Handling SIP Transport Failures: new section
Sending and Receiving SIP INFO Messages: New section and subsections
Sending and Receiving SIP OPTIONS Messages: New section and subsections
Using SIP SUBSCRIBE and NOTIFY Messages: New section and subsections
Specifying DTMF Support section: Clarified descriptions of bitmask values
Getting Media Streaming Status and Connection Information section: Added
information on getting local and remote RTP addresses
Call Transfer When Using SIP: New section and subsection
Sending a T.38 Fax in a Session Without Audio Established section: Corrected code
example (PTR#33979)
Receiving a T.38 Fax in a Session Without Audio Established section: Corrected
code example (PTR#34073)
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
19
Revision History
Document No.
05-2239-004
(continued)
Publication Date
Description of Revisions
Host LAN Disconnection Alarms: New section and subsection
Debugging Global Call IP Applications chapter : Completely rewritten to describe new
RTF logging facilities
gc_AcceptInitXfer( ) Variances for IP section: Added SIP variances
gc_AcceptXfer( ) Variances for IP section: Added SIP variances
gc_Extension( ) Variances for IP section: Added IPEXTID_MSGINFO entry and
added SIP message type in entries for IPEXTID_RECEIVEMSG and IPEXTID_
SENDMSG in Valid Extension IDs for the gc_Extension( ) Function table
gc_GetCallInfo( ) Variances for IP section: Added info on SIP-specific forms of
origination address and destination address
gc_InitXfer( ) Variances for IP section: Added SIP variances
gc_InvokeXfer( ) Variances for IP section: Added SIP variances
gc_RejectInitXfer( ) Variances for IP section: Added SIP variances
gc_RejectXfer( ) Variances for IP section: Added SIP variances
gc_SetConfigData( ) Variances for IP: Added SIP variance about enabling call
transfer invoke acknowledge events
gc_Start( ) Variances for IP: Added bullet items with default value info for SIP MIME,
SIP outbound proxy, SIP transport protocol, SIP request retry, and SIP
OPTIONS access configuration items
INIT_IP_VIRTBOARD( ) section: Added info on SIP MIME enable, SIP outbound
proxy, SIP transport protocol, SIP request retry, and SIP OPTIONS access
Summary of Parameter Sets and Parameter Usage table: Added
IPPARM_REGISTER_SIP_HDR in IPSET_CONFIG set; IPSET_MIME and
IPSET_MIME200OK_TO_BYE sets (5 parameter IDs); IPSET_MSG_SIP set (2
parameter IDs); IPSET_RTP_ADDRESS set (2 parameter IDs); 10 parameter
IDs in IPSET_SIP_MSGINFO plus additional function and event information;
IPSET_SIP_REQUEST_ERROR (2 parameter IDs)
IPSET_CONFIG section: Added IPPARM_REGISTER_SIP_HDR
IPSET_MIME and IPSET_MIME_200OK_TO_BYE: New section
IPSET_MSG_SIP: New section
IPSET_RTP_ADDRESS: New section
IPSET_SIP_MSGINFO: Added 10 additional parameter IDs
IPSET_SIP_REQUEST_ERROR: New section
IP_ADDR structure description: Corrected structure name in text and typedef (was
IPADDR)
IP_VIRTBOARD structure description: Corrected data type of localIP field. Added
SIP MIME enable mask value and fields for SIP outbound proxy, SIP transport
protocol, SIP request retry, and SIP OPTIONS access enable.
RTP_ADDR structure description: New section
20
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
Revision History
Document No.
Publication Date
Description of Revisions
05-2239-003
September 2004
General Conditions for Call Transfers section: New section
Using Fast Start and Slow Start Setup section: Added note about H.323 fast start
when no coder is specified (PTR#33321)
Summary of Call-Related Information that can be Set table: Added note that
GC_SINGLECALL must be used for Call ID and SIP Message Information fields.
Added entries for four additional SIP Message Information fields.
Retrievable Call Information table: Revised datatype for H.323 Call ID and added info
on SIP Call ID
Examples of Retrieving Call-Related Information section: Added code examples for
retrieving and parsing Call ID.
Supported SIP Message Information Fields table: Added entries for Call ID,
Diversion URI, Referred-By, and Replaces. Updated Contact URI entry to
indicate setting is supported.
Nonstandard Registration Message section: Corrected parameters and added code
example
gc_GetCallInfo( ) Variances for IP section: Added information on getting Call ID.
Added SIP-specific address formats (To URI and From URI)
gc_MakeCall( ) Variances for IP section: Added note about SIP timeout
Configurable Call Parameters When Using H.323 table: Corrected value names for
IPPARM_CONNECTIONMETHOD. Added entry for
IPSET_CALLINFO/IPPARM_CALLID.
Configurable Call Parameters When Using SIP table: Corrected value names for
IPPARM_CONNECTIONMETHOD. Added entry for
IPSET_CALLINFO/IPPARM_CALLID.
gc_Start( ) Variances for IP section: Added information on default board instances
and parameter values
Summary of Parameter Sets and Parameter Usage table: Updated info for
IPSET_CALLINFO/IPPARM_CALLID.
Added entries in IPSET_SIP_MSGINFO section for IPPARM_CALLID_HDR,
IPPARM_DIVERSION_URI, IPPARM_REFERRED_BY, and
IPPARM_REPLACES.
Added set/send info for IPSET_SIP_MSGINFO/IPPARM_CONTACT_URI.
IPSET_CALLINFO Parameter Set table: Updated description of IPPARM_CALLID.
Corrected value names for IPPARM_CONNECTIONMETHOD.
IPSET_SIP_MSGINFO Parameter Set table: Added entries for
IPPARM_CALLID_HDR, IPPARM_DIVERSION_URI,
IPPARM_REFERRED_BY, and IPPARM_REPLACES
Updated IPPARM_CONTACT_URI to indicate that setting is supported.
Added length defines for all parameters.
IP_VIRTBOARD structure description: Added default values to field descriptions
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
21
Revision History
Document No.
Publication Date
Description of Revisions
05-2239-002
April 2004
Summary of Call-Related Information that can be Set table: Added entries for Call
ID, MediaWaitForConnect, and PresentationIndicator.
Coders Supported for Host Media Processing (HMP) table: Corrected G.711 entries
to indicate VAD must be disabled (PTR 32576). Added row for G.729a.
Corrected frame size for G.729a+b. Added row for T.38. (PTR 32623)
Setting Busy Reason Codes: New section.
Example of Retrieving Call-Related Information section: Corrected both example
programs
Generating or Detecting DTMF Tones Using a Voice Resource: New section
Setting QoS Threshold Values and Retrieving QoS Threshold Values: Corrected
ParmSetID name in both code examples (PTR 32690)
Registration section: Corrected code example for SIP registration; added table to
map abstract registrar registration concepts to SIP REGISTER elements
Gatekeeper Registration Failure: New section.
Global Call Functions Supported by IP section: Added bullet to indicate support for
gc_GetCTInfo( )
gc_GetCTInfo( ) Variances for IP section: New section
gc_MakeCall( ) Variances for IP section: Clarified procedure for setting protocol to
use on multi-protocol devices. Added information to Forming a Destination
Address String section about specifying port address in TCP/IP destination
addresses.
gc_ReqService( ) Variances for IP section: Added SIP support for alias
gc_SetUserInfo( ) Variances for IP section: Added note about not using this function
to set protocol to use on multi-protocol devices.
gc_Start( ) Variances for IP section: Added note regarding network adaptor
enabling/disabling. Added information about initialization functions and
overriding defaults when appropriate.
Initialization Functions: New section
Summary of Parameter Sets and Parameter Usage table:
Added IPPARM_MEDIAWAITFORCONNECT, IPPARM_PRESENTATION_IND,
and IPPARM_PROGRESS_IND parameters to IPSET_CALLINFO
Added IPSET_H323_RESPONSE_CODE/IPPARM_BUSY_CAUSE parameter
Updated IPSET_LOCAL_ALIAS set entries to add SIP support
Added IPSET_SIP_RESPONSE_CODE/IPPARM_BUSY_REASON parameter
Parameter Set Reference section: Added and updated data type and size information
for all parameter sets in section
IPSET_CALLINFO section: Added entries for 3 new parameters
IPSET_H323_RESPONSE_CODE: New section
IPSET_REG_INFO section: Added row for IPPARM_REG_TYPE
IPSET_SIP_MSGINFO section: Added section for parameters used when setting
and retrieving SIP Message Information fields
IPSET_SIP_RESPONSE_CODE: New section
IP_VIRTBOARD structure description: Updated to refer to INIT_IP_VIRTBOARD()
initialization function. Added sup_serv_mask, h323_msginfo_mask, and
terminal_type fields (PTR 30491)
22
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
Revision History
Document No.
Publication Date
05-2239-002
(continued)
Description of Revisions
IPADDR structure description: Added note that only supported ipv4 field value is
IP_CFG_DEFAULT. Added info about byte order for IPv4 addresses.
IPCCLIB_START_DATA structure description: Updated to refer to
INIT_ IPCCLIB_START_DATA() initialization function.
IP-Specific Event Cause Codes chapter : Updated descriptions of the possible event
causes (PTR 31213:
05-2239-001
September 2003
Initial version of document.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
23
Revision History
24
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
About This Publication
The following topics provide information about this publication.
• Purpose
• Applicability
• Intended Audience
• How to Use This Publication
• Related Information
Purpose
This publication documents the Dialogic® Global Call API for IP technology as it is implemented
in Dialogic® Host Media Processing Software Release 3.1LIN. The Dialogic® Global Call API
implementation in Dialogic® System Release software is documented in a separate set of
documents.
This guide is for users of the Dialogic® Global Call API who are writing applications that use hostbased IP H.323 or SIP technology. The Dialogic® Global Call API provides call control capability
and supports IP Media control capability. This guide provides Dialogic® Global Call API IPspecific information only and should be used in conjunction with the Dialogic® Global Call API
Programming Guide and the Dialogic® Global Call API Library Reference, which describe the
generic behavior of the Dialogic® Global Call API.
Applicability
This document version (05-2239-009) is published for Dialogic® Host Media Processing Software
Release 3.1LIN.
This document may also be applicable to other software releases (including service updates) on
Linux or Windows® operating systems. Check the Release Guide for your software release to
determine whether this document is supported.
Intended Audience
This guide is intended for:
• System Integrators
• Independent Software Vendors (ISVs)
• Value Added Resellers (VARs)
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
25
About This Publication
• Original Equipment Manufacturers (OEMs)
This publication assumes that the audience is familiar with the Windows® operating system and
has experience using the C programming language.
How to Use This Publication
This guide is divided into the following chapters:
• Chapter 1, “IP Overview”, gives a overview of VoIP technology and brief introductions to the
H.323 and SIP standards for novice users.
• Chapter 2, “Dialogic® Global Call API Architecture for IP”, describes how Dialogic® Global
Call API can be used with IP technology and provides an overview of the architecture.
• Chapter 3, “IP Call Scenarios”, provides some call scenarios that are specific to IP technology,
including scenarios for the call transfer supplementary service.
• Chapter 4, “IP-Specific Operations”, describes how to use Dialogic® Global Call API to
perform IP-specific operations, such as setting call related information, registering with a
registration server, sending and receiving protocol-specific messages, etc.
• Chapter 5, “Third Party Call Control (3PCC) Operations and Multimedia Support”, describes
the Dialogic® Global Call API library’s support for scenarios where the SIP call control
application is not a direct participant in calls.
• Chapter 6, “Building Dialogic® Global Call API IP Applications” provides information for
building Dialogic® Global Call API applications that use IP technology.
• Chapter 7, “Debugging Dialogic® Global Call API IP Applications” provides information for
debugging Dialogic® Global Call API IP applications using RTF logging facilities.
• Chapter 8, “IP-Specific Function Information”, documents functions that are specific to the IP
technology and describes additional functionality or limitations for specific Dialogic® Global
Call API functions when used with IP technology.
• Chapter 9, “IP-Specific Parameters” provides a reference for IP-specific parameter set IDs and
their associated parameter IDs.
• Chapter 10, “IP-Specific Data Structures”, provides reference information for data structures
that are specific to the use of Dialogic® Global Call API with the IP technology.
• Chapter 11, “IP-Specific Event Cause Codes” describes IP-specific event cause codes.
• Chapter 12, “Supplementary Reference Information” provides supplementary information
including technology references and formats for called and calling party addresses for H.323.
• A Glossary and an Index can be found at the end of the document.
Related Information
See the following for additional information:
• http://www.dialogic.com/manuals/ (for Dialogic® product documentation)
• http://www.dialogic.com/support/ (for Dialogic technical support)
26
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
About This Publication
• http://www.dialogic.com/ (for Dialogic® product information)
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
27
About This Publication
28
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP Overview
1.
1
This chapter provides overview information about the following topics:
• Introduction to VoIP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
• H.323 Overview. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
• SIP Overview. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
1.1
Introduction to VoIP
Voice over IP (VoIP) can be described as the ability to make telephone calls and send faxes over IPbased data networks with a suitable Quality of Service (QoS). The voice information is sent in
digital form using discrete packets rather than via dedicated connections as in the circuit-switched
Public Switched Telephone Network (PSTN).
Currently, there are two major international groups defining standards for VoIP:
• International Telecommunications Union, Telecommunications Standardization Sector
(ITU-T), which has defined the following:
– Recommendation H.323, covering Packet-based Multimedia Communications Systems
(including VoIP)
• Internet Engineering Task Force (IETF), which has defined drafts of the several RFC (Request
for Comment) documents, including the following central document:
– RFC 3261, the Session Initiation Protocol (SIP)
The H.323 recommendation was developed in the mid 1990s and is a mature protocol.
SIP (Session Initiation Protocol) is an emerging protocol for setting up telephony, conferencing,
multimedia, and other types of communication sessions on the Internet.
1.2
H.323 Overview
The H.323 specification is an umbrella specification for the implementation of packet-based
multimedia over IP networks that cannot guarantee Quality of Service (QoS). This section
discusses the following topics about H.323:
• H.323 Entities
• H.323 Protocol Stack
• Codecs
• Basic H.323 Call Scenario
• Registration with a Gatekeeper
• H.323 Call Scenario via a Gateway
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
29
IP Overview
1.2.1
H.323 Entities
The H.323 specification defines the entity types in an H.323 network including:
Terminal
An endpoint on an IP network that supports the real-time, two-way communication with
another H.323 entity. A terminal supports multimedia coders/decoders (codecs) and setup and
control signaling.
Gateway
Provides the interface between a packet-based network (for example, an IP network) and a
circuit-switched network (for example, the PSTN). A gateway translates communication
procedures and formats between networks. It handles call setup and teardown and the
compression and packetization of voice information.
Gatekeeper
Manages a collection of H.323 entities in an H.323 zone controlling access to the network for
H.323 terminals, Gateways, and MCUs and providing address translation. A zone can span a
wide geographical area and include multiple networks connected by routers and switches.
Typically there is only one gatekeeper per zone, but there may be an alternate gatekeeper for
backup and load balancing. Typically, endpoints such as terminals, gateways, and other
gatekeepers register with the gatekeeper.
Multipoint Control Unit (MCU)
An endpoint that supports conferences between three or more endpoints. An MCU can be a
stand-alone unit or integrated into a terminal, gateway, or gatekeeper. An MCU consists of:
• Multipoint Controller (MC) – handles control and signaling for conferencing support
• Multipoint Processor (MP) – receives streams from endpoints, processes them, and
returns them to the endpoints in the conference
Figure 1 shows the entities in a typical H.323 network.
Figure 1. Typical H.323 Network
Terminal
Terminal
PSTN
Gateway
LAN
Terminal
30
MCU
Gatekeeper
Router
Internet or
Intranet
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP Overview
1.2.2
H.323 Protocol Stack
The H.323 specification is an umbrella specification for the many different protocols that comprise
the overall H.323 protocol stack. Figure 2 shows the H.323 protocol stack.
Figure 2. H.323 Protocol Stack
Application
H.245
(Logical
Channel
Signaling)
H.225.0
(Q.931
Call
Signaling)
RTCP
(Monitoring
and QoS)
H.255.0
(RAS)
TCP
Audio Codecs
G.711, G.723.1,
G.726, G.729, etc.
RTP
(Media Streaming)
UDP
IP
The purpose of each protocol is summarized briefly as follows:
H.245
Specifies messages for opening and closing channels for media streams, and other commands,
requests, and indications.
Q.931
Defines signaling for call setup and call teardown.
H.225.0
Specifies messages for call control, including signaling, the packetization and synchronization
of media streams, and Registration, Admission, and Status (RAS).
Real Time Protocol (RTP)
The RTP specification is an IETF draft standard (RFC 1889) that defines the end-to-end
transport of real-time data. RTP does not guarantee quality of service (QoS) on the
transmission. However, it does provides some techniques to aid the transmission of
isochronous data, including:
• information about the type of data being transmitted
• time stamps
• sequence numbers
Real Time Control Protocol (RTCP)
RTCP is part of the IETF RTP specification (RFC 1889) and defines the end-to-end monitoring
of data delivery and QoS by providing information such as:
• jitter, that is, the variance in the delays introduced in transmitting data over a wire
• average packet loss
The H.245, Q.931, and H.225.0 combination provide the signaling for the establishment of a
connection, the negotiation of the media format that will be transmitted over the connection, and
call teardown at termination. As indicated in Figure 2, the call signaling part of the H.323 protocol
is carried over TCP, since TCP guarantees the in-order delivery of packets to the application.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
31
IP Overview
The RTP and RTCP combination is for media handling only. As indicated in Figure 2, the media
part of the H.323 protocol is carried over UDP and therefore there is no guarantee that all packets
will arrive at the destination and be placed in the correct order.
1.2.3
Codecs
RTP and RTCP data is the payload of a User Datagram Protocol (UDP) packet. Analog signals
coming from an endpoint are converted into the payload of UDP packets by codecs
(coders/decoders). The codecs perform compression and decompression on the media streams.
Different types of codecs provide varying sound quality. The bit rate of most narrow-band codecs is
in the range 1.2 kbps to 64 kbps. The higher the bit rate the better the sound quality. Some of the
most popular codecs are:
G.711
Provides a bit rate of 64 kbps.
G.723.1
Provides bit rates of either 5.3 or 6.4 kbps. Voice communication using this codec typically
exhibits some form of degradation.
G.729
Provides a bit rate of 8 kbps. This codec is very popular for voice over frame relay and for V.70
voice and data modems.
GSM
Provides a bit rate of 13 kbps. This codec is based on a telephony standard defined by the
European Telecommunications Standards Institute (ETSI). The 13 kbps bit rate is achieved
with little degradation of voice-grade audio.
1.2.4
Basic H.323 Call Scenario
A simple H.323 call scenario can be described in five phases:
• Call Setup
• Capability Exchange
• Call Initiation
• Data Exchange
• Call Termination
Calls between two endpoints can be either direct or routed via a gatekeeper. This scenario describes
a direct connection where each endpoint is a point of entry and exit of a media flow. The scenario
described in this section assumes a slow start connection procedure. See Section 4.2, “Fast and
Slow Call Setup Modes”, on page 115 for more information on the difference between the slow
start and fast start connection procedure.
The example in this section describes the procedure for placing a call between two endpoints, A
and B, each with an IP address on the same subnet.
32
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP Overview
Call Setup
Establishing a call between two endpoints nominally requires two TCP connections between the
endpoints:
• one TCP connection for the call setup (Q.931/H.225 messages)
• one TCP connection for capability exchange and call control (H.245 messages)
In practice, the H.245 channel may not be required thanks to two additional features of the H.323
protocol. H.323 version 2 defines a Fast Start mode that accomplishes the endpoint capability
exchange through the use of Fast Start Elements (FSEs) which are “piggy-backed” on Q.931/H.225
call setup messages rather than waiting for an H.245 channel to be established. It is also possible to
encapsulate H.245 media control messages within Q.931/H.225 signaling messages using a
technique known as H.245 tunneling. If tunneling is enabled, one less TCP port is required for
incoming connections.
The caller at endpoint A connects to the callee at endpoint B on a well-known port, typically port
1720, and sends the call Setup message as defined in the H.225.0 specification. The Setup message
includes:
• message type; in this case, Setup
• bearer capability, which indicates the type of call; for example, audio only
• called party number and address
• calling party number and address
• Protocol Data Unit (PDU), which includes an identifier that indicates which version of
H.225.0 should be used along with other information
When endpoint B receives the Setup message, it responds with one of the following messages:
• Release Complete
• Alerting
• Connect
• Call Proceeding
In this case, endpoint B responds with the Alerting message. Endpoint A must receive the Alerting
message before its setup timer expires. After sending this message, the user at endpoint B must
either accept or refuse the call with a predefined time period. When the user at endpoint B picks up
the call, a Connect message is sent to endpoint A and the next phase of the call scenario, capability
exchange, can begin.
Capability Exchange
Call control and capability exchange messages, as defined in the H.245 standard, are sent on a
second TCP connection. Endpoint A opens this connection on a dynamically allocated port at the
endpoint B after receiving the address in one of the following H.225.0 messages:
• Alerting
• Call Proceeding
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
33
IP Overview
• Connect
This connection remains active for the entire duration of the call. The control channel is unique for
each call between endpoints so that several different media streams can be present.
An H.245 TerminalCapabilitySet message that includes information about the codecs supported by
that endpoint is sent from one endpoint to the other. Both endpoints send this message and wait for
a reply which can be one of the following messages:
• TerminalCapabilitySetAck - accept the remote endpoints capability
• TerminalCapabilitySetReject - reject the remote endpoints capability
The two endpoints continue to exchange these messages until a capability set that is supported by
both endpoints is agreed. When this occurs, the next phase of the call scenario, call initiation, can
begin.
Call Initiation
Once the capability setup is agreed, endpoint A and B must set up the voice channels over which
the voice data (media stream) will be exchanged. The scenario described here assumes a slow start
connection procedure. See Section 4.2, “Fast and Slow Call Setup Modes”, on page 115 for more
information on the difference between the slow start and fast start connection procedure.
To open a logical channel at endpoint B, endpoint A sends an H.245 OpenLogicalChannel message
to endpoint B. This message specifies the type of data being sent, for example, the codec that will
be used. For voice data, the message also includes the port number that endpoint B should use to
send RTCP receiver reports. When endpoint B is ready to receive data, it sends an
OpenLogicalChannelAck message to endpoint A. This message contains the port number on which
endpoint A is to send RTP data and the port number on which endpoint A should send RTCP data.
Endpoint B repeats the process above to indicate which port endpoint A will receive RTP data and
send RTCP reports to. Once these ports have been identified, the next phase of the call scenario,
data exchange, can begin.
Data Exchange
Endpoint A and endpoint B exchange information in RTP packets that carry the voice data.
Periodically, during this exchange both sides send RTCP packets, which are used to monitor the
quality of the data exchange. If endpoint A or endpoint B determines that the expected rate of
exchange is being degraded due to line problems, H.323 provides capabilities to make adjustments.
Once the data exchange has been completed, the next phase of the call scenario, call termination,
can begin.
Call Termination
To terminate an H.323 call, one of the endpoints, for example, endpoint A, hangs up. Endpoint A
must send an H.245 CloseLogicalChannel message for each channel it has opened with endpoint B.
Accordingly, endpoint B must reply to each of those messages with a CloseLogicalChannelAck
message. When all the logical channels are closed, endpoint A sends an H.245
34
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP Overview
EndSessionCommand, waits until it receives the same message from endpoint B, then closes the
channel.
Either endpoint (but typically the endpoint that initiates the termination) then sends an H.225.0
ReleaseComplete message over the call signalling channel, which closes that channel and ends the
call.
1.2.5
Registration with a Gatekeeper
In a H.323 network, a gatekeeper is an entity that can manage all endpoints that can send or receive
calls. Each gatekeeper controls a specific zone and endpoints must register with the gatekeeper to
become part of the gatekeeper’s zone. The gatekeeper provides call control services to the
endpoints in its zone. The primary functions of the gatekeeper are:
• address resolution by translating endpoint aliases to transport addresses
• admission control for authorizing network access
• bandwidth management
• network management (in routed mode)
Endpoints communicate with a gatekeeper using the Registration, Admission, and Status (RAS)
protocol. A RAS channel is an unreliable channel that is used to carry RAS messages (as described
in the H.255 standard). The RAS protocol covers the following:
• Gatekeeper Discovery
• Endpoint Registration
• Endpoint Deregistration
• Endpoint Location
• Admission, Bandwidth Change and Disengage
Note:
The RAS protocol covers status request, resource availability, nonstandard registration messages,
unknown message response and request in progress that are not described in any detail in this
overview. See ITU-T Recommendation H.225.0 (09/99) for more information.
Gatekeeper Discovery
An endpoint uses a process called gatekeeper discovery to find a gatekeeper with which it can
register. To start this process, the endpoint can multicast a GRQ (gatekeeper request) message to
the well-known discovery multicast address for gatekeepers. One or more gatekeepers may respond
with a GCF (gatekeeper confirm) message indicating that it can act as a gatekeeper for the
endpoint. If a gatekeeper does not want to accept the endpoint, it returns GRJ (gatekeeper reject). If
more than one gatekeeper responds with a GCF message, the endpoint can choose which
gatekeeper it wants to register with. In order to provide redundancy, a gatekeeper may specify an
alternate gatekeeper in the event of a failure in the primary gatekeeper. Provision for the alternate
gatekeeper information is provided in the GCF and RCF messages.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
35
IP Overview
Endpoint Registration
An endpoint uses a process called registration to join the zone associated with a gatekeeper. In the
registration process, the endpoint informs the gatekeeper of its transport, alias addresses, and
endpoint type. Endpoints register with the gatekeeper identified in the gatekeeper discovery process
described above. Registration can occur before any calls are made or periodically as necessary. An
endpoint sends an RRQ (registration request) message to perform registration and in return receives
an RCF (registration confirmation) or RRJ (registration reject) message.
Endpoint Deregistration
An endpoint may send an URQ (unregister request) in order to cancel registration. This enables an
endpoint to change the alias address associated with its transport address or vice versa. The
gatekeeper responds with an UCF (unregister confirm) or URJ (unregister reject) message.
The gatekeeper may also cancel an endpoint’s registration by sending a URQ (unregister request)
to the endpoint. The endpoint should respond with an UCF (unregister confirm) message. The
endpoint should then try to re-register with a gatekeeper, perhaps a new gatekeeper, prior to
initiating any calls.
Endpoint Location
An endpoint that has an alias address for another endpoint and would like to determine its contact
information may issue a LRQ (location request) message. The LRQ message may be sent to a
specific gatekeeper or multicast to the well-known discovery multicast address for gatekeepers.
The gatekeeper to which the endpoint to be located is registered will respond with an LCF (location
confirm) message. A gatekeeper that is not familiar with the requested endpoint will respond with
LRJ (location reject).
Admission, Bandwidth Change and Disengage
The endpoint and gatekeeper exchange messages to provide admission control and bandwidth
management functions. The ARQ (admission request) message specifies the requested call
bandwidth. The gatekeeper may reduce the requested call bandwidth in the ACF (admission
confirm) message. The ARQ message is also used for billing purposes, for example, a gatekeeper
may respond with an ACF message just in case the endpoint has an account so the call can be
charged. An endpoint or the gatekeeper may attempt to modify the call bandwidth during a call
using a BRQ (bandwidth change request) message. An endpoint will send a DRQ (disengage
request) message to the gatekeeper at the end of a call.
1.2.6
H.323 Call Scenario via a Gateway
While the call scenario described in Section 1.2.4, “Basic H.323 Call Scenario”, on page 32 is
useful for explaining the fundamentals of an H.323 call, it is not a realistic call scenario. Most
significantly, the IP addresses of both endpoints were defined to be known in the example, while
most Internet Service Providers (ISPs) allocate IP addresses to subscribers dynamically. This
section describes the fundamentals of a more realistic example that involves a gateway.
36
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP Overview
A gateway provides a bridge between different technologies; for example, an H.323 gateway (or IP
gateway) provides a bridge between an IP network and the PSTN. Figure 3 shows a configuration
that uses a gateway. User A is at a terminal, while user B is by a phone connected to the PSTN.
Figure 3. Basic H.323 Network with a Gateway
User B
User A
PSTN
Terminal
Phone
Gateway
Gatekeeper
Internet or
Intranet
Figure 3 also shows a gatekeeper. The gatekeeper provides network services such as Registration,
Admission, and Status (RAS) and address mapping. When a gatekeeper is present, all endpoints
managed by the gatekeeper must register with the gatekeeper at startup. The gatekeeper tracks
which endpoints are accepting calls. The gatekeeper can perform other functions also, such as
redirecting calls. For example, if a user does not answer the phone, the gatekeeper may redirect the
call to an answering machine.
The call scenario in this example involves the following phases:
• Establishing Contact with the Gatekeeper
• Requesting Permission to Call
• Call Signaling and Data Exchange
• Call Termination
Establishing Contact with the Gatekeeper
The user at endpoint A attempts to locate a gatekeeper by sending out a Gatekeeper Request (GRQ)
message and waiting for a response. When it receives a Gatekeeper Confirm (GCF) message, the
endpoint registers with the gatekeeper by sending the Registration Request (RRQ) message and
waiting for a Registration Confirm (RCF) message. If more than one gatekeeper responds, endpoint
A chooses only one of the responding gatekeepers. The next phase of the call scenario, requesting
permission to call, can now begin.
Requesting Permission to Call
After registering with the gatekeeper, endpoint A must request permission from the gatekeeper to
initiate the call. To do this, endpoint A sends an Admission Request (ARQ) message to the
gatekeeper. This message includes information such as:
• a sequence number
• a gatekeeper assigned identifier
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
37
IP Overview
• the type of call; in this case, point-to-point
• the call model to use, either direct or gatekeeper-routed
• the destination address; in this case, the phone number of endpoint B
• an estimation of the amount of bandwidth required. This parameter can be adjusted later by a
Bandwidth Request (BRQ) message to the gatekeeper.
If the gatekeeper allows the call to proceed, it sends an Admission Confirm (ACF) message to
endpoint A. The ACF message includes the following information:
• the call model used
• the transport address and port to use for call signaling (in this example, the IP address of the
gateway)
• the allowed bandwidth
All setup has now been completed and the next phase of the scenario, call signaling and data
exchange, can begin.
Call Signaling and Data Exchange
Endpoint A can now send the Setup message to the gateway. Since the destination phone is
connected to an analog line (the PSTN), the gateway goes off-hook and dials the phone number
using dual tone multifrequency (DTMF) digits. The gateway therefore is converting the H.225.0
signaling into the signaling present on the PSTN. Depending on the location of the gateway, the
number dialed may need to be converted. For example, if the gateway is located in Europe, then the
international dial prefix will be removed.
As soon as the gateway is notified by the PSTN that the phone at endpoint B is ringing, it sends the
H.225.0 Alerting message as a response to endpoint A. As soon as the phone is picked up at
endpoint B, the H.225.0 Connect message is sent to endpoint A. As part of the Connect message, a
transport address that allows endpoint A to negotiate codecs and media streams with endpoint B is
sent.
The H.225.0 and H.245 signaling used to negotiate capability, initiate and call, and exchange data
are the same as that described in the basic H.323 call scenario. See the Capability Exchange, Call
Initiation, and Data Exchange phases in Section 1.2.4, “Basic H.323 Call Scenario”, on page 32 for
more information.
In this example the destination phone is analog, therefore, it requires the gateway to detect the ring,
busy, and connect conditions so it can respond appropriately.
Call Termination
As in the basic H.323 call scenario example, the endpoint that hangs up first needs to close all the
channels that were open using the H.245 CloseLogicalChannel message. If the gateway terminates
first, it sends an H.245 EndSessionCommand message to endpoint A and waits for the same
message from endpoint A. The gateway then closes the H.245 channel.
38
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP Overview
When all channels between endpoint A and the gateway are closed, each must send a
DisengageRequest (DRQ) message to the gatekeeper. This message lets the gatekeeper know that
the bandwidth is being released. The gatekeeper sends a DisengageConfirm (DCF) message to both
endpoint A and the gateway.
1.3
SIP Overview
Session Initiation Protocol (SIP) is an ASCII-based, peer-to-peer protocol designed to provide
telephony services over the Internet. The SIP standard was developed by the Internet Engineering
Task Force (IETF) and is one of the most commonly used protocols for VoIP implementations. This
section discusses the following topics about SIP:
• Advantages of Using SIP
• SIP User Agents and Servers
• Basic SIP Operation
• Basic SIP Call Scenario
• SIP Messages
1.3.1
Advantages of Using SIP
Some of the advantages of using SIP include:
• The SIP protocol stack is smaller and simpler than other commonly used VoIP protocols, such
as H.323.
• SIP-based systems are more easily scalable because of the peer-to-peer architecture used. The
hardware and software requirements for adding new users to SIP-based systems are greatly
reduced.
• Functionality is distributed over different components. Control is decentralized. Changes made
to a component have less of an impact on the rest of the system.
1.3.2
SIP User Agents and Servers
User agents (UAs) are appliances or applications, such as SIP phones, residential gateways and
software that initiate and receive calls over a SIP network.
Servers are application programs that accept requests, service requests and return responses to
those requests. Examples of the different types of servers are:
Location Server
Used by a SIP redirect or proxy server to obtain information about the location of the called
party.
Proxy Server
An intermediate program that operates as a server and a client and which makes requests on
behalf of the client. A proxy server does not initiate new requests, it interprets and possibly
modifies a request message before forwarding it to the destination.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
39
IP Overview
Redirect Server
Accepts a request from a client and maps the address to zero or more new addresses and
returns the new addresses to the client. The server does not accept calls or generate SIP
requests on behalf of clients.
Registrar Server
Accepts REGISTER requests from clients. Often, the registrar server is located on the same
physical server as the proxy server or redirect server.
1.3.3
Basic SIP Operation
Callers and callees are identified by SIP addresses. When making a SIP call, a caller first locates
the appropriate server and then sends a SIP request. The most common SIP operation is the
invitation request. Instead of directly reaching the intended callee, a SIP request may be redirected
or may trigger a chain of new SIP requests by proxies. Users can register their location(s) with SIP
servers.
1.3.4
Basic SIP Call Scenario
Figure 4 shows the basic SIP call establishment and teardown scenario.
Figure 4. Basic SIP Call Scenario
SIP Phone
User A
User picks up
phone and dials
SIP Phone
User B
INVITE
Phone
Rings
180, Ringing
User answers
200, OK
ACK
Voice Exchange (RTP)
User hangs up
BYE
200, OK
1.3.5
SIP Messages
In SIP, there are two types of messages:
• SIP Request Messages
• SIP Response Messages
40
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP Overview
SIP Request Messages
The most commonly used SIP request messages are:
• INVITE
• ACK
• BYE
• REGISTER
• CANCEL
• OPTIONS
For more information on specific SIP request types, see RFC 3261 at http://ietf.org/rfc/rfc3261.txt.
SIP Response Messages
SIP response messages are numbered. The first digit in each response number indicates the type of
response. The response types are as follows:
1xx
Information responses; for example, 180 Ringing
2xx
Successful responses; for example, 200 OK
3xx
Redirection responses; for example, 302 Moved Temporarily
4xx
Request failure responses; for example, 402 Forbidden
5xx
Server failure responses; for example, 504 Gateway Timeout
6xx
Global failure responses; for example, 600 Busy Everywhere
For more information on SIP response messages, see RFC 3261 at the URL given above.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
41
IP Overview
42
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
Dialogic® Global Call API
Architecture for IP
2.
2
This chapter discusses the following topics:
• Dialogic® Global Call API over IP Architecture with a Host-Based Stack . . . . . . . . . 43
• Architecture Components . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
• Device Types and Usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
2.1
Dialogic® Global Call API over IP Architecture with a
Host-Based Stack
The Dialogic® Global Call API provides a common call control interface that is independent of the
underlying network interface technology. While Dialogic® Global Call API is primarily concerned
with call control, that is, call establishment and teardown, Dialogic® Global Call API provides
some additional capabilities to support applications that use IP technology.
Dialogic® Global Call API support for IP technology includes:
• call control capabilities for establishing calls over an IP network
• support for IP media control by providing the ability to open and close IP media channels for
streaming
Dialogic® Global Call API supports a system configuration where both the IP signaling stack and a
Dialogic® Host Media Processing (HMP) virtual board, which provides the IP resources for media
processing, are running on the host.
Figure 5 shows the Dialogic® Global Call API over IP architecture when using the virtual
Dialogic® DM3 board implemented by Dialogic® HMP Software and the host-based stack
provided with the system software.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
43
Dialogic® Global Call API Architecture for IP
Figure 5. Dialogic® Global Call API Over IP Architecture
Host Application
GlobalCall
Media
Routing
Call Control
Signaling
IP Network
Host
NIC
H.323 or SIP
Call Control
Library
(IPT CCLib)
Media
Control
IP Media
Call Control
Library
(IPM CCLib)
Host
Board
RTP/RTCP
Media
IP Network
IP Media
Resource
TDM
CT Bus
To simplify IP Media management by the host application and to provide a consistent look and feel
with other Dialogic® Global Call API technology call control libraries, the IP Signaling call control
library (IPT CCLib) controls the IP media functionality on the application’s behalf.
Note:
2.2
Dialogic® Global Call API supports the RADVISION H.323 and SIP stacks. If other third-party
call control stacks are used, Dialogic® Global Call API cannot be used for IP call control, but the
Dialogic® IP Media Library API can be used directly by applications for media resource
management. See the Dialogic® IP Media Library API Programming Guide and Dialogic® IP
Media Library API Library Reference for more information.
Architecture Components
The role of each major component in the architecture is described in the following sections:
• Host Application
• Dialogic® Global Call API
• IP Signaling Call Control Library (IPT CCLib)
• IP Media Call Control Library (IPM CCLib)
• IP Media Resource
44
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
Dialogic® Global Call API Architecture for IP
2.2.1
Host Application
The host application manages and monitors the IP telephony system operations. Typically the
application performs the following tasks:
• initializes Dialogic® Global Call API
• opens and closes IP line devices (used to handle call control)
• opens and closes IP media devices (used to handle media streaming)
• opens and closes public switched telephone network (PSTN) devices
• configures IP media and network devices (capability list, operation mode, etc.)
• performs call control, including making calls, accepting calls, answering calls, dropping calls,
releasing calls, and processing call state events
• queries call and device information
• handles PSTN alarms and errors
2.2.2
Dialogic® Global Call API
Dialogic® Global Call API hides technology and protocol-specific information from the host
application and acts as an intermediary between the host application and the technology call
control libraries. It performs the following tasks:
• performs high-level call control using the underlying call control libraries
• maintains a generic call control state machine based on the function calls used by an
application and call control library events
• collects and maintains data relating to resources
• collects and maintains alarm data
2.2.3
IP Signaling Call Control Library (IPT CCLib)
The IP Signaling call control library (IPT CCLib) implements relevant Global Call call control
functionality in an IP-specific way. It performs the following tasks:
• controls the H.323 and SIP call control stacks
• manages IP media resources as required by the Dialogic® Global Call API call state model and
the IP signaling protocol model
• translates between the Dialogic® Global Call API call model and IP signaling protocol models
• processes Dialogic® Global Call API call control library interface commands
• generates call control library interface events
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
45
Dialogic® Global Call API Architecture for IP
2.2.4
IP Media Call Control Library (IPM CCLib)
The IP Media Call Control Library (IPM CCLib) performs the following tasks:
• processes Dialogic® Global Call API CCLib commands for the opening, closing, and timeslot
routing of IP media devices
• configures QoS (Quality of Service) thresholds
• translates QoS alarm events to Dialogic® Global Call API alarm (GCAMS) events
2.2.5
IP Media Resource
The IP Media Resource processes the IP Media stream. It performs the following tasks:
• encodes PCM data from the TDM bus into IP packets sent to the IP network
• decodes IP packets received from the IP network into PCM data transmitted to the TDM bus
• configures and reports QoS information to the IP Media stream
2.3
Device Types and Usage
This section includes information about device types and usage:
• Device Types Used with IP
• IPT Board Devices
• IPT Network Devices
• IPT Start Parameters
2.3.1
Device Types Used with IP
When using Dialogic® Global Call API with IP technology, a number of different device types are
used:
IPT Board Device
A virtual entity that represents a NIC or NIC address (if one NIC supports more than one IP
address). The format of the device name is iptBx, where x is the logical board number that
corresponds to the NIC or NIC address. See Section 2.3.2, “IPT Board Devices”, on page 47
for more information.
IPT Network Device
Represents a logical channel over which calls can be made. This device is used for call control
(call setup and tear down). The format of the device name is iptBxTy, where x is the logical
board number and y is the logical channel number. See Section 2.3.3, “IPT Network Devices”,
on page 48 for more information.
IP Media Device
Represents a media resource that is used to control RTP streaming, monitoring Quality of
Service (QoS) and the sending and receiving of DTMF digits. The format of the device name
is ipmBxCy, where x is the logical board number and y is the logical channel number.
46
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
Dialogic® Global Call API Architecture for IP
The IPT network device (iptBxTy) and the IP Media device (ipmBxCy) can be opened
simultaneously in the same gc_OpenEx( ) command. If a voice resource is available in the system,
for example an IP board that provides voice resources or any other type of board that provides
voice resources, a voice device can also be included in the same gc_OpenEx( ) call to provide
voice capabilities on the logical channel. See Section 8.3.18, “gc_OpenEx( ) Variances for IP”, on
page 476 for more information.
Alternatively, the IPT network device (iptBxTy) and the IP Media device (ipmBxCy) can be
opened in separate gc_OpenEx( ) calls and subsequently attached using the gc_AttachResource( )
function.
The IP Media device handle, which is required for managing Quality of Service (QoS) alarms for
example, can be retrieved using the gc_GetResourceH( ) function. See Section 4.21, “Managing
Quality of Service Alarms”, on page 263 for more information.
Figure 6 shows the relationship between the various types of Dialogic® Global Call API devices
when a single Host NIC is used.
Figure 6. Dialogic® Global Call API Devices
Host NIC
(IPT board device)
Global Call line device
(with media and voice
devices optionally
attached)
H.323 or SIP
Call Control
IP
Network
RTP
RTCP
IPT
network
device
(on host)
IPM
media
device
(on board)
CT Bus
dxxx
voice
device
2.3.2
DTI
network
device
PSTN
Note: The dxxx voice device can
be on the same board as the IPM
media device or on a different board.
IPT Board Devices
An IPT board device is a virtual entity that corresponds to an IP address and is capable of handling
both H.323 and SIP protocols. The application uses the gc_Start( ) function to bind IP addresses to
IPT virtual board devices. Possible configurations are shown in Figure 7. The operating system
must support the IP address and underlying layers before the Dialogic® Global Call API
application can take advantage of the configurations shown in Figure 7. Up to eight virtual IPT
boards can be configured in one system. For each virtual IPT board, it is possible to configure the
local address and signaling port (H.323 and SIP), the number of IPT network devices that can be
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
47
Dialogic® Global Call API Architecture for IP
opened simultaneously, etc. See Section 8.3.27, “gc_Start( ) Variances for IP”, on page 491 for
more information on how to configure IPT board devices.
Figure 7. Configurations for Binding IPT Boards to NIC IP Addresses
A. Multiple IP Addresses Assigned
to the Same Host NIC
B. Multiple IP Addresses Belonging
to Different Host NICs
IPT Channels
IPT Channels
IPT Channels
IPT Channels
IPT Board 1
IPT Board 2
IPT Board 1
IPT Board 2
IPT Address 1 IPT Address 2
IPT Address 1 IPT Address 2
Host NIC
C. Multiple IPT Boards Using
the Same IP Address
Host NIC 1
Host NIC 2
D. Multiple NICs Abstracted into One
IP Address by the OS
IPT Channels
IPT Channels
IPT Channels
IPT Channels
IPT Board 1
IPT Board 2
IPT Board 1
IPT Board 2
IP Address 1
IP Address 1
Host NIC
Host NIC 1
Host NIC 2
Note: IPT Board 1 and IPT Board 2
must have different port numbers.
Once the IPT board devices are configured, the application can open line devices with the
appropriate IPT network device (IPT channel) and optionally IP Media device (IPM channel).
The gc_SetConfigData( ) function can be used on an IPT board device to apply parameters to all
IPT channels associated with the IPT board device. The application can use the
gc_AttachResource( ) and gc_Detach( ) functions to load balance which host NIC makes a call
for a particular IP Media device (IPM channel). It is also possible that the operating system can
perform load balancing using the appropriate NIC for call control as shown in Figure 7,
configuration D.
The gc_ReqService( ) function is used on an IPT board device for registration with an H.323
gatekeeper or SIP registrar. See Section 8.3.22, “gc_ReqService( ) Variances for IP”, on page 479
for more information.
2.3.3
IPT Network Devices
Dialogic® Global Call API supports three types of IPT network devices:
• H.323 only (P_H323 in the devicename string when opening the device)
48
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
Dialogic® Global Call API Architecture for IP
• SIP only (P_SIP in the devicename string when opening the device)
• Dual protocol, H.323 and SIP (P_IP in the devicename string when opening the device)
The device type is determined when using the gc_OpenEx( ) function to open the device. H.323
and SIP only devices are capable of initiating and receiving calls of the selected protocol type only.
Dual protocol devices are capable of initiating and receiving calls using either the H.323 or SIP
protocol. The protocol used by a call on a dual protocol device is determined during call setup as
follows:
• for outbound calls, by a parameter to the gc_MakeCall( ) function
• for inbound calls, by calling gc_GetCallInfo( ) to retrieve the protocol type used. In this case,
the application can query the protocol type of the current call after the call is established, that
is, as soon as either GCEV_DETECTED (if enabled) or GCEV_OFFERED is received.
2.3.4
IPT Start Parameters
The application determines the number of virtual boards that will be created by the IPT call control
library (up to the number of available IP addresses). For each virtual board, the host application
will provide the following information:
• number of line devices on the board
• maximum number of IPT devices to be used for H.323 calls (used for H.323 stack allocation)
• maximum number of IPT devices to be used for SIP calls (used for SIP stack allocation)
• board IP address
• signaling port for H.323
• signaling port for SIP
• enable/disable access to SIP message information fields (headers)
• enable/disable MIME-encoded content in SIP messages
• number and size of buffers in MIME memory pool (if MIME feature is enabled)
• enable/disable access to H.323 message information fields
• enable/disable call transfer supplementary service
• set terminal type for H.323
• enable and configure outbound proxy for SIP
• configure SIP transport protocol (enable use of TCP)
• configure SIP request retry behavior
• enable/disable application access to SIP OPTIONS messages
• configure maximum number of SIP registrations
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
49
Dialogic® Global Call API Architecture for IP
50
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP-Specific Operations
4.
4
This chapter describes how to use the Dialogic® Global Call API to perform certain operations in
an IP environment. These operations include:
• Call Control Library Initialization . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
• Fast and Slow Call Setup Modes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
• Setting Call-Related Information. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
• Connection Phase Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
• Retrieving Current Call-Related Information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
• Receiving Notification Events . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
• Modifying an Existing SIP Call via re-INVITE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
• Setting and Retrieving Q.931 Message IEs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
• Setting and Retrieving SIP Message Header Fields . . . . . . . . . . . . . . . . . . . . . . . . . . . 172
• Using MIME Bodies in SIP Messages (SIP-T) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 188
• Specifying Transport for SIP Messages. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
• Handling SIP Transport Failures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
• Sending and Receiving SIP INFO Messages. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 205
• Sending and Receiving SIP OPTIONS Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
• Using SIP SUBSCRIBE and NOTIFY Messages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
• Handling DTMF . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
• Sending Nonstandard Protocol Messages (H.323) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
• Using H.323 Annex M Tunneled Signaling Messages . . . . . . . . . . . . . . . . . . . . . . . . . 247
• Retrieving User-to-User Information Elements from H.323 Messages . . . . . . . . . . . . 258
• Specifying RTP Stream Establishment . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
• Managing Quality of Service Alarms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 263
• Registration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 268
• SIP Digest Authentication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
• Using SIP Transport Layer Security (TLS) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
• Call Transfer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
• T.38 Fax Server . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
• Sending and Receiving V.17 Faxes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
• Using Object Identifiers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
107
IP-Specific Operations
• LAN Disconnection Alarms . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
• Setting Dialogic® IP Media Library Parameters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
4.1
Call Control Library Initialization
Certain system parameters are configurable when using the gc_Start( ) function to initialize the
Dialogic® Global Call API library. Some of these parameters, such as the number of virtual boards
and the choice of first party or third party call control operating mode, are set for the entire system,
but most of the configuration parameters are set separately for each of the virtual boards in the
system.
Among the configuration items that can be set for on a per-virtual board basis are:
• the maximum number of IPT devices available on the virtual board (total, H.323, and SIP)
• the local IP address
• the call signaling ports (H.323 and SIP)
• the terminal type (H.323 only)
• the outbound proxy (SIP only)
In addition, the configuration process is also used to enable certain features that have been added to
the Dialogic® Global Call API library as it has evolved in order to ensure backwards compatibility.
These features include:
• the call transfer supplementary service
• the ability to access H.323 message information fields and/or SIP message header fields
• the ability to access MIME-encoded message bodies in SIP messages
• the ability to access tunneled signaling messages (TSMs) and/or user-to-user information
elements (UU-IEs) in H.323 messages
• the ability to control the transport protocol and retry behavior for SIP messages
• the ability to use Transport Layer Security (TLS) for SIP messages
• the ability to handle SIP OPTIONS requests under application control
System configuration is accomplished using two different data structures, which are initialized to
default values and then customized to suit the specific configuration before calling the gc_Start( )
function. System-level configuration items are set in a IPCCLIB_START_DATA data structure,
which also references an array of IP_VIRTBOARD data structures (one per virtual board) that
specify board-level configuration items.
The application begins the configuration process by using the INIT_IPCCLIB_START_DATA( )
and INIT_IP_VIRTBOARD( ) functions to initialize the IPCCLIB_START_DATA structure and
each of the IP_VIRTBOARD data structures. These initialization functions set default values that
can then be overridden with desired values. After setting whatever non-default values it desires
(there is no need for the application to set any item that it is leaving at the default value), the
application references the IPCCLIB_START_DATA structure from a CCLIB_START_STRUCT
structure, which in turn is referenced from the GC_START_STRUCT structure that is passed to the
gc_Start( ) function.
108
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP-Specific Operations
For details on the overall configuration process, including the default values and the allowable
values that can be set for each configuration item, see Section 8.3.27, “gc_Start( ) Variances for
IP”, on page 491, the reference page for IP_VIRTBOARD on page 553, and the reference page for
IPCCLIB_START_DATA on page 558. In addition to this overall information, details on how to
configure specific capabilities and features (including code snippets showing specific
configurations) are provided in the sections of this chapter that document those features, including
the following subsections which describe the configuration of the SIP outbound proxy and the SIP
transport protocol.
Note:
4.1.1
Features that are enabled or configured via the IPCCLIB_START_DATA and IP_VIRTBOARD
structures cannot be disabled or reconfigured once the library has been started. All items set in
these data structures take effect when the gc_Start( ) function is called and remain in effect until
gc_Stop( ) is called when the application exits.
Setting a SIP Outbound Proxy
When initializing a board device for use with SIP, the application can set an outbound proxy. When
such a proxy is set, all outbound requests are sent to the proxy address rather than the IP address of
the original Request-URI. The proxy can be set by specifying an IP address or a host name in the
IP_VIRTBOARD structure that is used in the gc_Start( ) function. If both an IP address and a host
name are specified in IP_VIRTBOARD, the IP address takes precedence.
The following code snippet illustrates how to set a SIP outbound proxy for a single board:
#include "gclib.h"
..
..
#define BOARDS_NUM 1
..
..
/* initialize start parameters */
IPCCLIB_START_DATA cclibStartData;
memset(&cclibStartData,0,sizeof(IPCCLIB_START_DATA));
IP_VIRTBOARD virtBoards[BOARDS_NUM];
memset(virtBoards,0,sizeof(IP_VIRTBOARD)*BOARDS_NUM);
/* initialize start data */
INIT_IPCCLIB_START_DATA(&cclibStartData, BOARDS_NUM, virtBoards);
/* initialize virtual board */
INIT_IP_VIRTBOARD(&virtBoards[0]);
// set outbound proxy by IP Address
virtBoards[0].outbound_proxy_IP.ip_ver = IPVER4;
virtBoards[0].outbound_proxy_IP.u_ipaddr.ipv4 = inet_addr("192.168.1.227");
// set outbound proxy by hostname.
// if outbound proxy is also set by IP address, this is ignored
char OutboundProxyHostName[256];
strcpy(OutboundProxyHostName,"my_outbound_proxy");
virtBoard[0].outbound_proxy_hostname = OutboundProxyHostName;
// set outbound proxy port
virtBoards[0].outbound_proxy_port = 5060;
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
109
IP-Specific Operations
4.1.2
Configuring SIP Transport Protocol
When initializing a board device for use with SIP, the application can enable the use of the TCP
transport protocol in addition to the default UDP transport.
When TCP is enabled, the Dialogic® Global Call API library listens for incoming TCP connections
as well as UDP connections on the SIP signaling port that is configured for the board.
When TCP is enabled, an outbound message is sent using TCP if any of the following three
conditions is true:
• The board device was configured with TCP as the default transport protocol if there is no
proxy, or with TCP as the outbound proxy protocol if there is a SIP proxy configured.
• TCP is explicitly specified by setting the string “;transport=tcp” in the Request-URI header
field before the message is sent. (Note that this requires the SIP Message Info feature to have
been enabled by setting the IP_SIP_MSGINFO_ENABLE mask value in the
sip_msginfo_mask field of IP_VIRTBOARD before starting the board.)
• The size of the outgoing message is larger than the configured maximum size for UDP
messages, which is 1300 by default.
If none of these conditions is true, UDP is used as the default transport protocol.
Note that network conditions may cause UDP packets to be lost, which can cause SIP messages to
be lost. And because SIP does not require some response messages to be retransmitted if the
message is lost (1xx informational responses, for example), there are circumstances when the
Global Call library is unable to generate a completion event because the expected response is never
received. Applications should be written to handle cases caused by missing non-reliable response
messages when using UDP transport protocol.
The SIP transport protocol is configured by five fields in the IP_VIRTBOARD structure that is
used in the gc_Start( ) function:
E_SIP_tcpenabled
Enables TCP support. The default value disables TCP so that all outgoing messages are sent
over UDP and incoming TCP messages are refused. No TCP capabilities are available unless
this parameter is set to the Enabled value.
E_SIP_OutboundProxyTransport
Sets the transport protocol that is used by the SIP outbound proxy if the virtual board is
configured with a proxy and TCP is enabled. The default value sets UDP as the transport for
the proxy. Setting this parameter to the TCP value when TCP is not enabled, or when TCP is
enabled but no proxy is configured causes a bad parameter error when gc_Start( ) is called.
E_SIP_Persistence
Sets the persistence for TCP connections, with options for no persistence (connection closed
after each request), transaction persistence (connection closed when transaction is completed),
or user persistence (connection maintained for the lifetime of the user of the transaction). The
default is user persistence, which minimizes the number of times that sockets are set up and
torn down.
110
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP-Specific Operations
SIP_maxUDPmsgLen
Sets a maximum size for UDP messages. If TCP is enabled and the application attempts to
send a message by UDP that exceeds the configured maximum size (default is 1300 as
suggested in RFC3261), TCP transport is automatically used rather than UDP. This size
checking may have an undesirable effect on system performance, and a parameter value is
defined which disables the feature.
E_SIP_DefaultTransport
Sets the default transport protocol for requests when there is no SIP outbound proxy. The
default value sets UDP as the default transport protocol. Setting this parameter to the TCP
value when TCP is not enabled causes a bad parameter error when gc_Start( ) is called. If
TCP is enabled, the application can override the default transport for a specific request by
explicitly setting a “transport= ” parameter in the Request-URI header field before sending the
request.
See the reference page for IP_VIRTBOARD on page 553, for full details on the data structure
fields and values.
4.1.2.1
Configuring TCP Transport
With five configuration items controlling TCP transport, the number of possible configuration
combinations is clearly very large. The tables in this section list the combinations of configuration
parameter settings that are used to achieve various system behaviors. Note that the tables include
entries for the outbound proxy configuration, since the transport configuration differs depending on
whether or not a proxy is enabled, and the SIP message information mask, which must be
configured to allow the application to set the transport for individual requests.
The following code snippet illustrates the general procedure for setting up the IP_VIRTBOARD
structure to enable TCP. This specific example sets up a SIP outbound proxy, enables TCP, and sets
TCP as the default transport protocol for the proxy for a single board. Note that all data structure
fields that are not explicitly set are assumed to contain their default values as configured by the
INIT_IP_VIRTBOARD( ) function.
#include "gclib.h"
..
..
#define BOARDS_NUM 1
..
..
/* initialize start parameters */
IPCCLIB_START_DATA cclibStartData;
memset(&cclibStartData,0,sizeof(IPCCLIB_START_DATA));
IP_VIRTBOARD virtBoards[BOARDS_NUM];
memset(virtBoards,0,sizeof(IP_VIRTBOARD)*BOARDS_NUM);
/* initialize start data */
INIT_IPCCLIB_START_DATA(&cclibStartData, BOARDS_NUM, virtBoards);
/* initialize virtual board */
INIT_IP_VIRTBOARD(&virtBoards[0]);
// Enable SIP Message Info to allow transport selection for individual requests
virtBoards[0].ip_sip_msginfo_mask = IP_SIP_MSGINFO_ENABLE;
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
111
IP-Specific Operations
// set outbound proxy by IP Address
virtBoards[0].outbound_proxy_IP.ip_ver = IPVER4;
virtBoards[0].outbound_proxy_IP.u_ipaddr.ipv4 = inet_addr("192.168.1.227");
// set outbound proxy port
virtBoards[0].outbound_proxy_port = 5060;
//enable and configure TCP for proxy
virtBoards[0].E_SIP_tcpenabled = ENUM_Enabled;
virtBoards[0].E_SIP_OutboundProxyTransport = ENUM_TCP;
virtBoards[0].E_SIP_Persistence = ENUM_PERSISTENCE_TRANSACT_USER;
Transport Parameter Combinations without Proxy
All Requests UDP
Parameter
Value
E_SIP_tcpenabled
ENUM_Disabled (default)
E_SIP_OutboundProxyTransport
not set
E_SIP_Persistence
not set
SIP_maxUDPmsgLen
not set
E_SIP_DefaultTransport
not set
outbound_proxy_* fields
IP and hostname both not set
sip_msginfo_mask
any value
transport parameter in Request-URI
not set
All Requests TCP
Parameter
Value
E_SIP_tcpenabled
ENUM_Enabled
E_SIP_OutboundProxyTransport
not set
E_SIP_Persistence
ENUM_PERSISTENCE_TRANSACT_USER (default)
SIP_maxUDPmsgLen
not set
E_SIP_DefaultTransport
ENUM_TCP
outbound_proxy_* fields
IP and hostname both not set
sip_msginfo_mask
any value
transport parameter in Request-URI
not set
Selected Requests TCP
Parameter
112
Value
E_SIP_tcpenabled
ENUM_Enabled
E_SIP_OutboundProxyTransport
not set
E_SIP_Persistence
ENUM_PERSISTENCE_TRANSACT_USER (default)
SIP_maxUDPmsgLen
1300 (default)
E_SIP_DefaultTransport
ENUM_UDP (default)
outbound_proxy_* fields
IP and hostname both not set
sip_msginfo_mask
includes IP_SIP_MSGINFO_ENABLE
transport parameter in Request-URI
set to “;transport=tcp” on selected requests
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP-Specific Operations
Selected Requests UDP
Parameter
Value
E_SIP_tcpenabled
ENUM_Enabled
E_SIP_OutboundProxyTransport
not set
E_SIP_Persistence
ENUM_PERSISTENCE_TRANSACT_USER (default)
SIP_maxUDPmsgLen
not set
E_SIP_DefaultTransport
ENUM_TCP
outbound_proxy_* fields
IP and hostname both not set
sip_msginfo_mask
includes IP_SIP_MSGINFO_ENABLE
transport parameter in Request-URI
set to “;transport=udp” on selected requests
Transport Parameter Combinations with Proxy
All Requests UDP via Proxy
Parameter
Value
E_SIP_tcpenabled
ENUM_Disabled (default)
E_SIP_OutboundProxyTransport
not set
E_SIP_Persistence
not set
SIP_maxUDPmsgLen
not set
E_SIP_DefaultTransport
not set
outbound_proxy_* fields
IP -or- hostname set
sip_msginfo_mask
any value
transport parameter in Request-URI
not set
Requests are sent UDP to the proxy, and the proxy sends the request onward using UDP (unless the
proxy resolves the destination as being TCP, based on DNS information).
All Requests TCP via Proxy
Parameter
Value
E_SIP_tcpenabled
ENUM_Enabled
E_SIP_OutboundProxyTransport
ENUM_TCP
E_SIP_Persistence
ENUM_PERSISTENCE_TRANSACT_USER (default)
SIP_maxUDPmsgLen
default (not set)
E_SIP_DefaultTransport
not set
outbound_proxy_ fields
IP -or- hostname set
sip_msginfo_mask
any value
transport parameter in Request-URI
not set
Requests are sent TCP to the proxy, and the proxy sends the request onward using TCP.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
113
IP-Specific Operations
Selected Requests TCP via Proxy
Parameter
Value
E_SIP_tcpenabled
ENUM_Enabled
E_SIP_OutboundProxyTransport
ENUM_UDP (default)
E_SIP_Persistence
ENUM_PERSISTENCE_TRANSACT_USER (default)
SIP_maxUDPmsgLen
1300 (default)
E_SIP_DefaultTransport
not set
outbound_proxy_ fields
IP -or- hostname set
sip_msginfo_mask
includes IP_SIP_MSGINFO_ENABLE
transport parameter in Request-URI
set to “;transport=tcp” for selected requests
Selected requests are sent TCP to the proxy, and the proxy sends the request onward using TCP.
Other requests are sent UDP to proxy, and are sent onward using UDP (unless the proxy resolves
the destination as being TCP, based on DNS information).
Invalid Transport Parameter Combinations
If TCP is not enabled (E_SIP_tcpenabled is the default ENUM_Disabled value), the following
parameter settings are invalid:
• If E_SIP_OutboundProxyTransport is set to ENUM_TCP, gc_Start( ) returns an
IPERR_BAD_PARM error.
• If E_SIP_DefaultTransport is set to ENUM_TCP, gc_Start( ) returns an IPERR_BAD_PARM
error.
• Setting the Request-URI transport parameter to “;transport=tcp” is invalid but does not
produce an error. The invalid header field parameter is ignored, and the request is sent using
UDP.
If TCP is enabled (E_SIP_tcpenabled is set to ENUM_Enabled), and no SIP outbound proxy is
set (neither outbound_proxy_IP nor outbound_proxy_hostname is set), the following parameter
setting is invalid:
• If E_SIP_OutboundProxyTransport is set to ENUM_TCP, gc_Start( ) returns an
IPERR_BAD_PARM error.
4.1.3
Enabling and Disabling H.245 Tunneling (H.323)
Tunneling is the encapsulation of H.245 media control messages within Q.931/H.225 signaling
messages. If tunneling is enabled, one less TCP port is required for incoming connections.
For outgoing calls, the application can enable or disable tunneling by including the following
parameter element in the GCLIB_MAKECALL_BLK used by the gc_MakeCall( ) function:
IPSET_CALLINFO
IPPARM_H245TUNNELING
Possible values:
• IP_H245TUNNELING_ON
• IP_H245TUNNELING_OFF
114
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP-Specific Operations
For incoming calls, tunneling is enabled by default, but it can be configured on a board device level
(where a board device is a virtual entity that corresponds to a NIC or NIC address; see
Section 2.3.2, “IPT Board Devices”, on page 47). This is done using the gc_SetConfigData( )
function with target ID of the board device and the parameters above specified in the
GC_PARM_BLKP structure associated with the gc_SetConfigData( ) function.
Note:
4.2
Tunneling for inbound calls can be configured on a board device basis only (using the
gc_SetConfigData( ) function). Tunneling for inbound calls cannot be configured on a per line
device or per call basis (using the gc_SetUserInfo( ) function).
Fast and Slow Call Setup Modes
The Dialogic® Global Call API library allows applications to specify whether they wish to use
signaling techniques that exchange media capabilities as early as possible in the call initiation
process. In general, this “fast start” call setup is preferable to the “slow start” setup for several
reasons:
• fewer network round trips are required to set up a call
• media streaming may be possible earlier in the pre-connection phase (“early media”)
• the local exchange can generate messages when circumstances prevent a connection to the
endpoint
4.2.1
Setting the Call Setup Mode
Note:
The selection of fast start vs. slow start mode only applies to the first party call control (1PCC)
operating mode. If the Dialogic® Global Call API library is initialized in the third party call control
(3PCC) operating mode, the IPSET_CALLINFO / IPPARM_CONNECTIONMETHOD parameter
that is documented in this section is not supported.
The same Global Call parameter mechanism is used to specify slow start vs. fast start mode for
both the H.323 and SIP protocols, even though the result of the mode selection is quite different in
the different protocols. See Section 4.2.2, “H.323 Fast Start and Slow Start”, on page 116, and
Section 4.2.4, “SIP Call Setup Modes”, on page 118, for protocol-specific details on the connection
modes.
Dialogic® Global Call API applications can set either the fast or slow call setup mode as the default
mode for the entire system or for all calls on a given line device, and can also override that default
on a call-by-call basis. If the application takes no action to specify the setup mode, the system
default is fast start mode.
To specify the slow start mode, either for an individual call or as the default mode, the application
inserts the following parameter element in a GC_PARM_BLK:
IPSET_CALLINFO
IPPARM_CONNECTIONMETHOD
• value = IP_CONNECTIONMETHOD_SLOWSTART
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
115
IP-Specific Operations
The scope of the mode setting is determined by which Global Call function the application passes
the GC_PARM_BLK to:
• gc_SetConfigData( ) sets the slow start mode as the default for the entire system (all line
devices on all board devices for both H.323 and SIP protocols).
• gc_SetUserInfo( ) with duration = GC_ALLCALLS sets the slow start mode as the default
connection mode for H.323 and SIP calls on a given line device.
• gc_MakeCall( ) with the GC_PARM_BLK in the GCLIB_MAKECALL_BLK structure sets
the slow start connection mode for the new call only.
The following code segment illustrates how to insert the parameter that specifies a slow start
connection in a GC_PARM_BLK:
gc_util_insert_parm_val(&libBblock.ext_datap,
IPSET_CALLINFO,
IPPARM_CONNECTIONMETHOD,
sizeof(char),
IP_CONNECTIONMETHOD_SLOWSTART);
If the application has previously set the default mode to the slow start mode, it can override that
default for an individual call or can reset the default to fast start mode by inserting the following
parameter element in a GC_PARM_BLK:
IPSET_CALLINFO
IPPARM_CONNECTIONMETHOD
• value = IP_CONNECTIONMETHOD_FASTSTART
Here again, the Global Call function that is used determines the scope of the setting:
• gc_MakeCall( ) with the GC_PARM_BLK in the GCLIB_MAKECALL_BLK structure sets
the fast start connection mode for the new call only.
• gc_SetUserInfo( ) with duration = GC_ALLCALLS resets the default mode to fast start for a
given line device for both H.323 and SIP protocols.
• gc_SetConfigData( ) resets the default mode for the entire system (all line devices on all
board devices) to fast start for both protocols.
4.2.2
H.323 Fast Start and Slow Start
H.323 version 2 defines a specific call connection method called fastStart, which exchanges
endpoint media capabilities much earlier in the setup process than the call connection method
defined in H.323 version 1 (a process which then became known as slow start setup). If the remote
side supports H.323 version 2 or above, fast start setup can be used; otherwise, slow start setup is
used even if the local endpoint attempts to initiate a call using fast start setup.
In H.323 slow start setup, the messages that are used to communicate each endpoint’s supported
media capabilities are exchanged using the H.245 channel that is established after the H.225 TCP
connection, and this introduces significant latency. Media streaming cannot be established until
both sides have communicated and negotiated their capabilities in multiple message exchanges.
Early media is not possible in H.323 when slow start connection is specified by either party.
116
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP-Specific Operations
Fast start connection, on the other hand, reduces the time required to set up a call to one round-trip
of delay after the H.225 TCP connection is established by “piggy-backing” the local endpoint’s
media capabilities and RTP port in the Q.931 Setup message in a “fastStart element”. If the remote
side supports fast start connection, it returns the capability parameters in the Alerting, Proceeding,
or Connect messages.
Note:
4.2.3
In an H.323 fast start call, the fast start element is included in the H.225 Proceeding or Alerting
from the remote side only when the application explicitly specifies the coders. If no coder is
specified (either a preferred coder or “don't care”) before gc_CallAck( ) and gc_AcceptCall( ) the
fastStart element is not sent out until the Connect (that is, after gc_AnswerCall( )).
H.323 Fast Start with Optional H.245 Channel
Because the H.323 fast start mode uses fastStart elements that are embedded in H.225/ Q.931 call
setup messages rather than explicit messages on the H.245 channel, the establishment of the H.245
channel becomes optional unless that channel will be needed for other purposes, such as
transmission of UII Alphanumeric digits or T.38 fax mode.
When a Global Call application is using the fast start connection mode, it can indicate that the
H.245 channel is indeed optional, which allows the call to be considered established earlier. In a
normal fast start connection, the Dialogic® Global Call API library does not generate a
GCEV_CONNECTED or GCEV_ANSWERED event (to indicate to the application that call
establishment is complete) until after the H.245 channel establishment (Phase B) is complete.
When the application at the calling party specifies that the H.245 channel is optional, the library
generates a GCEV_CONNECTED event as soon as the H.225 call setup (Phase A) is complete
unless the remote endpoint has forced the call to fall back to slow start mode. When the application
at the called party specifies that the H.245 channel is optional, the library generates a
GCEV_ANSWERED event as soon as the H.225 call setup is complete.
The default Global Call behavior is to treat H.245 channel establishment as mandatory (nonoptional), so that GCEV_CONNECTED/GCEV_ANSWERED is only generated after the H.245
channel has been established. The application can specify whether the H.245 channel is optional in
fast start mode by including the following parameter element in a GC_PARM_BLK block:
IPSET_CALLINFO
IPPARM_FASTSTART_MANDATORY_H245CH
with one of the following enumerated values:
• IP_FASTSTART_MANDATORY_H245CH_ON – H.245 channel establishment is
mandatory in fast start connections (default mode)
• IP_FASTSTART_MANDATORY_H245CH_OFF – H.245 channel establishment is
optional in fast start connections
Note:
This parameter is ignored for calls that use slow start call setup.
An application can set the H.245 channel establishment mode on a system-wide, per line device, or
call-by-call basis, depending on what Global Call function is called to set the parameter:
• gc_SetConfigData( ) sets the specified H.245 mode for the entire system (all line devices on
all board devices).
• gc_SetUserInfo( ) with duration = GC_ALLCALLS sets the specified H.245 mode for a
given line device.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
117
IP-Specific Operations
• gc_MakeCall( ) sets the specified H.245 mode for the new call only.
When the application specifies that the H.245 channel is optional, channel establishment proceeds
normally with the exchange of MSD and TCS messages and acknowledgements after the library
has generated a GCEV_CONNECTED event to the application (assuming that the remote endpoint
accepts fast start setup). The application can optionally receive notification of the status of H.245
channel establishment by means of a maskable Global Call extension event. This notification is
recommended if the application will require the H.245 channel for any purpose (for example, T.38
fax mode or UII Alphanumeric messages) because an attempt to use the H.245 channel when the
channel was not successfully established produces a GCEV_TASKFAIL.
In order to be notified of the completion of H.245 channel establishment (successful or failed), the
application must register to receive the corresponding Global Call extension event type. The
application must call the gc_SetConfigData( ) function, passing it a pointer to a GC_PARM_BLK
that contains the following parameter:
IPSET_EXTENSIONEVT_MSK
GCACT_ADDMSK (or GCACT_SETMSK)
• EXTENSIONEVT_SIGNALING_STATUS
When the application has registered for this event type and the H.245 channel establishment fails,
the Dialogic® Global Call API library generates an unsolicited GCEV_EXTENSION event with
the extension ID IPEXTID_IPPROTOCOL_STATE. The parameter block associated with this
event will contain the following parameter element:
IPSET_IPPROTOCOL_STATE
IPPARM_EST_CONTROL_FAILED
The application may also call gc_ResultInfo( ) in this case to retrieve additional information about
the cause of the channel establishment failure. The error cause codes that may be returned include:
• IPEC_H245EstChannelFailure_TransportError
• IPEC_H245EstChannelFailure_RemoreReject
• IPEC_H245EstChannelFailure_TCSError
• IPEC_H245EstChannelFailure_MSDError
If the application is using fast start setup mode with optional H.245 channel and the channel
establishment fails, and the application then attempts an operation that requires the H.245 channel
(for example, sending UII Alphanumeric characters), the library generates a GCEV_TASKFAIL
event. The application may call gc_ResultInfo( ) to retrieve one of the error cause codes listed
above.
4.2.4
SIP Call Setup Modes
Unlike H.323, the SIP protocol does not define a “fast start” connection mode. In SIP, the exchange
of media capabilities is accomplished via an offer/answer exchange using Session Description
Protocol (SDP). This SPD offer/answer exchange can be initiated by either the local or the remote
party, and the SDP information can be embedded in any of the request or response messages that
are exchanged when establishing a SIP dialog. Normal practice is to include the SDP offer in the
INVITE message that initiates a SIP dialog, which corresponds to a “fast start” connection mode.
118
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP-Specific Operations
SIP uses the term delayed offer to refer to cases where the INVITE does not include the SDP offer,
which corresponds to a “slow start” connection mode.
When the calling party in a SIP call uses the default fast start setup mode, the SDP offer is included
in the INVITE message that initiates the connection attempt. The remote party then sends an SDP
answer in its 200 OK response. (The remote party may optionally include the SDP answer in an
informational response such as 180 RINGING, but because informational responses are not
reliable messages in SIP the SDP answer will always be included in the reliable 200 OK final
response.)
When the calling party in a SIP call specifies the slow start setup mode (delayed offer in SIP
terminology), the initial INVITE does not include an SDP offer. Instead, it is left to the remote
party to make the SDP offer in its 200 OK. The calling party then sends the SDP answer in its ACK
to the 200 OK.
Note:
4.2.5
The use of the connection method parameter to control when the SDP offer/answer process is
initiated only supported in the first party call control (1PCC) operating mode. In the third party call
control (3PCC) operating mode, the application explicitly controls when the SDP offer and answer
are sent and the connection method parameter is not supported.
Retrieving Coder Information from Call Offers
Note:
The information in this section only applies when the Global Call IP Call Control library is started
in the first party call control (1PCC) operating mode. The capability described in this section is not
supported when the library is started in the third party call control (3PCC) operating mode.
Any call offer that is received can potentially contain coder proposal information, in the form of an
SDP offer in an INVITE request when using SIP or a fastStart element in a Setup message when
using H.323. The IP call control library handles any such proposed coder information internally to
begin the coder negotiation process, but it may be useful to the application to access the offered
coder information, as well. The call control library can be configured at start-up to provide
application access to proposed coder information for SIP or H.323 or both. When this access is
enabled and the library accepts a call offer that contains coder proposals, the extra data associated
with the GCEV_OFFERED event that is sent to the application will contain one or more additional
parameter elements to convey the coder information that was contained in the offer.
4.2.5.1
Enabling Access to “Fast Start” Coder Information
Application access to fast start coder information is a feature that can be disabled or enabled
independently for the SIP and H.323 protocols at the time the gc_Start( ) function is called.
The mandatory INIT_IP_VIRTBOARD( ) function populates the IP_VIRTBOARD structure
with default values. The default values of the sip_msginfo_mask and h323_msginfo_mask fields in
the IP_VIRTBOARD structure disable all optional message information access features, including
access to coder proposal information. The default values of these data structure fields must be
overridden with appropriate values for each ipt board device on which access needs to be enabled.
For each of the two message information mask fields, the value that the application sets is typically
an OR of two or more defined mask values as described in the reference page for IP_VIRTBOARD
on page 553.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
119
IP-Specific Operations
The defined mask values that are used to enable access to fast start coder information are:
IP_SIP_FASTSTART_CODERS_IN_OFFERED
when OR’ed into the sip_msginfo_mask field, enables application access to coder information
contained in SDP offers in SIP INVITE requests
IP_H323_FASTSTART_CODERS_IN_OFFERED
when OR’ed into the h323_msginfo_mask field, enables application access to coder
information contained in fastStart elements in H.323 Setup messages
Note:
Note that it is not possible to toggle the fast start coder information access between enabled and
disabled states. Features that are enabled or configured via the IPCCLIB_START_DATA and
IP_VIRTBOARD structures cannot be disabled or reconfigured once the library has been started.
All items set in these data structures take effect when the gc_Start( ) function is called and remain
in effect until gc_Stop( ) is called when the application exits.
The following code snippet shows how an application might initialize two virtual boards to enable
basic message information access and access to fast start coder information for both SIP and H.323
protocols.
.
.
.
INIT_IPCCLIB_START_DATA(&ipcclibstart, 2, ip_virtboard);
INIT_IP_VIRTBOARD(&ip_virtboard[0]);
INIT_IP_VIRTBOARD(&ip_virtboard[1]);
ip_virtboard[0].sip_msginfo_mask =
IP_SIP_MSGINFO_ENABLE | IP_SIP_FASTSTART_CODERS_IN_OFFERED;
/* override SIP default to enable access to message info and faststart coder info*/
ip_virtboard[1].sip_msginfo_mask =
IP_SIP_MSGINFO_ENABLE | IP_SIP_FASTSTART_CODERS_IN_OFFERED;
/* override SIP default to enable access to message info and faststart coder info*/
ip_virtboard[0].h323_msginfo_mask =
IP_H323_MSGINFO_ENABLE | IP_H323_FASTSTART_CODERS_IN_OFFERED;
/* override H.323 default to enable access to message info and faststart coder info*/
ip_virtboard[1].h323_msginfo_mask =
IP_H323_MSGINFO_ENABLE | IP_H323_FASTSTART_CODERS_IN_OFFERED;
/* override H.323 default to enable access to message info and faststart coder info*/
.
.
.
4.2.5.2
Accessing “Fast Start” Coder Information
The Global Call IP call control library includes coder information in the extra data associated with
a GCEV_OFFERED event when all of the following conditions are true:
• The library was started with the fast start coder information option enabled for the appropriate
protocol (as described in Section 4.2.5.1, “Enabling Access to “Fast Start” Coder
Information”).
• The fast start mode is enabled (as described in Section 4.2.1, “Setting the Call Setup Mode”).
• The call offer is a fast start offer; that is, it includes an SDP offer (SIP) or fastStart element
(H.323).
• The SDP offer or fastStart element specifies at least one coder that the library supports.
120
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP-Specific Operations
When all of these conditions are true, the extra data associated with the GCEV_OFFERED event
will be a GC_PARM_BLK that contains one or more parameter elements of the following type:
IPSET_CALLINFO
IPPARM_OFFERED_FASTSTART_CODER
• value = IP_CAPABILITY data structure
Each such parameter element reflects a coder specification that was contained in the call offer. If
the offer contains multiple coder specifications, the order of the parameter elements in the
parameter block reflects the order of the specifications in the offer message. This order reflects the
remote endpoint’s coder preference, with the first specification being the most preferred and the
last specification being the least preferred. If any coder properties were left unspecified by the
remote end, the matching fields in the corresponding IP_CAPABILITY structure are filled in with
the value GCCAP_dontCare.
If any of the four conditions described above is not true, there will be no IPSET_CALLINFO /
IPPARM_OFFERED_FASTSTART_CODER parameter element in the parameter block associated
with the GCEV_OFFERED.
When the IP_CAPABILITY data structure is used to convey fast start coder information, the
direction field of the structure uses the following special value defines:
IP_CAP_DIR_RMTRECEIVE
Remote coder was specified to be Receive-only.
IP_CAP_DIR_RMTRTPINACTIVE
Remote coder was specified with “a=inactive”, which is used in SIP to inactivate RTP
streaming. Only supported when using SIP.
IP_CAP_DIR_RMTRTPRTCPINACTIVE
Remote coder was specified with RTP address 0.0.0.0, which is used in SIP to inactivate both
RTP and RTCP. Only supported when using SIP.
IP_CAP_DIR_RMTTRANSMIT
Remote coder was specified to be Transmit-only.
IP_CAP_DIR_RMTTXRX
Remote coder was specified to be capable of both Transmit and Receive.
4.3
Setting Call-Related Information
The Dialogic® Global Call API allows applications to set many items of call-related information.
The following topics are presented in this section:
• Overview of Setting Call-Related Information
• Setting Coder Information
• Specifying Nonstandard Data Information (H.323)
• Specifying Nonstandard Control Information (H.323)
• Setting and Retrieving Disconnect Cause or Reason Values
• Setting Busy Reason Codes
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
121
IP-Specific Operations
4.3.1
Overview of Setting Call-Related Information
Table 1 summarizes the types of information elements that can be specified, the corresponding set
IDs and parameter IDs used to set the information, the functions that can be used to set the
information, and an indication of whether the information is supported when using H.323, SIP, or
both. For more information on the various parameters, refer to the corresponding parameter set
reference section in Chapter 9, “IP-Specific Parameters”.
Table 1. Summary of Call-Related Information that can be Set
Type of
Information
Bearer Capability IE
Set ID and Parameter IDs
IPSET_CALLINFO
• IPPARM_BEARERCAP
Call ID (GUID)
IPSET_CALLINFO
• IPPARM_CALLID
Coder Information †
Functions Used to Set
Information
SIP/
H.323
gc_SetUserInfo( )
(GC_SINGLECALL only)
H.323
only
gc_SetUserInfo( )
(GC_SINGLECALL only)
both
Note: Setting the Call ID must be done
judiciously because it might affect the call
control implementation supported by the
stack. The Call ID should be treated as a
GUID and should be unique at all times.
gc_MakeCall( )
GCSET_CHAN_CAPABILITY
gc_SetConfigData( )
• IPPARM_LOCAL_CAPABILITY
both
gc_SetUserInfo( ) ††
gc_MakeCall( )
Conference Goal
IPSET_CONFERENCE
• IPPARM_CONFERENCE_GOAL
gc_SetConfigData( )
gc_SetUserInfo( ) ††
H.323
only
gc_MakeCall( )
Connection Method
IPSET_CALLINFO
• IPPARM_CONNECTIONMETHOD
gc_SetConfigData( )
both
gc_SetUserInfo( ) ††
gc_MakeCall( )
DTMF Support
IPSET_DTMF
• IPPARM_SUPPORT_DTMF_BITMASK
Display Information
IPSET_CALLINFO
• IPPARM_DISPLAY
gc_SetConfigData( )
both
gc_SetUserInfo( ) ††
gc_SetConfigData( )
both
gc_SetUserInfo( ) ††
gc_MakeCall( )
Enabling/Disabling
Unsolicited Events
IPSET_EXTENSIONEVT_MSK
gc_SetConfigData( )
both
gc_SetUserInfo( )
(GC_SINGLECALL only)
H.323
only
• GCACT_ADDMSK
• GCACT_SETMSK
• GCACT_SUBMSK
Facility IE
IPSET_CALLINFO
• IPPARM_FACILITY
† If no transmit or receive coder type is specified, any supported coder type is accepted. The default is “don’t care”; that is, any
media coder supported by the platform is valid.
†† The duration parameter can be set to GC_SINGLECALL (to apply on a call basis) or to GC_ALLCALLS (to apply on a line
device basis).
††† On the terminating side, can only be set using gc_SetConfigData( ) on a board device. See Section 4.1.3, “Enabling and
Disabling H.245 Tunneling (H.323)”, on page 114 for more information.
122
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP-Specific Operations
Table 1. Summary of Call-Related Information that can be Set (Continued)
Type of
Information
MediaWaitFor
Connect
Set ID and Parameter IDs
IPSET_CALLINFO
• IPPARM_MEDIAWAITFORCONNECT
Functions Used to Set
Information
SIP/
H.323
gc_SetUserInfo( )
(GC_SINGLECALL only)
H.323
only
gc_MakeCall( )
Nonstandard
Control Information
IPSET_NONSTANDARDCONTROL
gc_SetConfigData( )
Either:
gc_SetUserInfo( ) ††
• IPPARM_NONSTANDARDDATA_DATA
and
IPPARM_NONSTANDARDDATA_OBJID
H.323
only
gc_MakeCall( )
or
• IPPARM_NONSTANDARDDATA_DATA
and
IPPARM_H221NONSTANDARD
Nonstandard Data
IPSET_NONSTANDARDDATA
gc_SetConfigData( )
Either:
gc_SetUserInfo( ) ††
• IPPARM_NONSTANDARDDATA_DATA
and
IPPARM_NONSTANDARDDATA_OBJID
H.323
only
gc_MakeCall( )
or
• IPPARM_NONSTANDARDDATA_DATA
and
IPPARM_H221NONSTANDARD
Phone List
IPSET_CALLINFO
• IPPARM_PHONELIST
gc_SetConfigData( )
both
gc_SetUserInfo( ) ††
gc_MakeCall( )
Presentation
Indicator
IPSET_CALLINFO
• IPPARM_PRESENTATION_IND
gc_SetUserInfo( )
(GC_SINGLECALL only)
H.323
only
gc_MakeCall( )
SIP Message
Information Fields
IPSET_SIP_MSGINFO
• IPPARM_CALLID_HDR
gc_SetUserInfo( )
(GC_SINGLECALL only)
SIP
only
gc_SetUserInfo( ) †
both
• IPPARM_CONTACT_DISPLAY
• IPPARM_CONTACT_URI
• IPPARM_DIVERSION_URI
• IPPARM_FROM_DISPLAY
• IPPARM_REFERRED_BY
• IPPARM_REPLACES
• IPPARM_REQUEST_URI
• IPPARM_TO_DISPLAY
T.38 Fax device
association or
disassociation with
Media device
IPSET_FOIP
• IPPARM_T38_CONNECT
• IPPARM_T38_DISCONNECT
† If no transmit or receive coder type is specified, any supported coder type is accepted. The default is “don’t care”; that is, any
media coder supported by the platform is valid.
†† The duration parameter can be set to GC_SINGLECALL (to apply on a call basis) or to GC_ALLCALLS (to apply on a line
device basis).
††† On the terminating side, can only be set using gc_SetConfigData( ) on a board device. See Section 4.1.3, “Enabling and
Disabling H.245 Tunneling (H.323)”, on page 114 for more information.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
123
IP-Specific Operations
Table 1. Summary of Call-Related Information that can be Set (Continued)
Type of
Information
Tunnelling†††
Set ID and Parameter IDs
IPSET_CALLINFO
• IPPARM_H245TUNNELING
Functions Used to Set
Information
gc_SetConfigData( )
gc_SetUserInfo( ) ††
SIP/
H.323
H.323
only
gc_MakeCall( )
Type of Service:
TOS byte / DiffServ
field (DSCP) in IPv4
packet header
IPSET_CONFIG
User to User
Information
IPSET_CALLINFO
• IPPARM_CONFIG_TOS
• IPPARM_USERUSER_INFO
gc_SetUserInfo( ) ††
both
gc_MakeCall( )
gc_SetConfigData( )
gc_SetUserInfo( ) ††
H.323
only
gc_MakeCall( )
Vendor Information
IPSET_VENDORINFO
gc_SetConfigData( )
• IPPARM_H221NONSTD
H.323
only
• IPPARM_VENDOR_PRODUCT_ID
• IPPARM_VENDOR_VERSION_ID
† If no transmit or receive coder type is specified, any supported coder type is accepted. The default is “don’t care”; that is, any
media coder supported by the platform is valid.
†† The duration parameter can be set to GC_SINGLECALL (to apply on a call basis) or to GC_ALLCALLS (to apply on a line
device basis).
††† On the terminating side, can only be set using gc_SetConfigData( ) on a board device. See Section 4.1.3, “Enabling and
Disabling H.245 Tunneling (H.323)”, on page 114 for more information.
4.3.1.1
Setting Call Parameters on a System-Wide Basis
The gc_SetConfigData( ) function is used to configure call-related parameters, such as coder
information, for the entire system. The values set by the gc_SetConfigData( ) function are used by
the call control library as default values for each line device on each board device in the system.
These default values are used unless the application overrides them on a per line-device or per-call
basis.
See Section 8.3.25, “gc_SetConfigData( ) Variances for IP”, on page 484 for more information
about the values of function parameters to set in this context.
4.3.1.2
Setting Call Parameters on a Per Line Device Basis
The gc_SetUserInfo( ) function (with the duration parameter set to GC_ALLCALLS) can be used
to set the values of call-related parameters on a per line-device basis. The values set by
gc_SetUserInfo( ) become the new default values for the specified line device and are used by all
subsequent calls on that device unless the application overrides them on a per-call basis. See
Section 8.3.26, “gc_SetUserInfo( ) Variances for IP”, on page 487 for more information about the
values of function parameters to set in this context.
4.3.1.3
Setting Call Parameters on a Per Call Basis
There are two ways to set call parameters on a per-call basis:
• Using gc_SetUserInfo( ) with the duration parameter set to GC_SINGLECALL
124
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP-Specific Operations
• Using gc_MakeCall( )
Setting Per-Call Call Parameters Using gc_SetUserInfo( )
The gc_SetUserInfo( ) function (with the duration parameter set to GC_SINGLECALL) can be
used to set call parameter values for a single incoming call. This is useful since the
gc_AnswerCall( ) function does not have a parameter to specify a GC_PARM_BLK. At the end of
the call, the values set as defaults for the specified line device replace these call-specific values.
If a gc_MakeCall( ) function is issued after the gc_SetUserInfo( ), the values specified in the
gc_MakeCall( ) function override the values specified by the gc_SetUserInfo( ) function. See
Section 8.3.26, “gc_SetUserInfo( ) Variances for IP”, on page 487 for more information about the
values of function parameters to set in this context.
Setting Per-Call Call Parameters Using gc_MakeCall( )
The gc_MakeCall( ) function can be used to set call parameter values for a call. The values set are
only valid for the duration of the current call. At the end of the call, the values set as default values
for the specified line device override the values specified by the gc_MakeCall( ) function.
See Section 8.3.17, “gc_MakeCall( ) Variances for IP”, on page 460 for more information about
the values of function parameters to set in this context.
4.3.2
Setting Coder Information
Terminal capabilities are exchanged during call establishment. The terminal capabilities are sent to
the remote side as notification of coder supported.
Coder information can be set in the following ways:
• On a system wide basis using gc_SetConfigData( ).
• On a per line device basis using gc_SetUserInfo( ) with a duration parameter value of
GC_ALLCALLS.
• On a per call basis using gc_MakeCall( ) or gc_SetUserInfo( ) with a duration parameter
value of GC_SINGLECALL.
In each case, a GC_PARM_BLK is set up to contain the coder information. The GC_PARM_BLK
must contain the GCSET_CHAN_CAPABILITY parameter set ID with the
IPPARM_LOCAL_CAPABILITY parameter ID, which is of type IP_CAPABILITY.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
125
IP-Specific Operations
Possible values for fields in the IP_CAPABILITY structure are:
capability
Specifies the coder type from among the types supported by the particular IP telephony
platform; see Table 2 for platform-specific coder types. The following values are defined for
the capability field:
• GCCAP_AUDIO_g711Alaw64k
• GCCAP_AUDIO_g711Ulaw64k
• GCCAP_AUDIO_g7231_5_3k (G.723.1 at 5.3 kbps)
• GCCAP_AUDIO_g7231_6_3k (G.723.1 at 6.3 kbps)
• GCCAP_AUDIO_g726_16k
• GCCAP_AUDIO_g726_24k
• GCCAP_AUDIO_g726_32k
• GCCAP_AUDIO_g726_40k
• GCCAP_AUDIO_g729AnnexA
• GCCAP_AUDIO_g729AnnexAwAnnexB
• GCCAP_AUDIO_NO_AUDIO
• GCCAP_DATA_t38UDPFax
• GCCAP_dontCare – The complete list of coders supported by a product is used when
negotiating the coder type to be used. If multiple variations of the same coder are
supported by a product, the underlying call control library offers the preferred variant
only. For example, if G.711 10ms, 20ms, and 30ms are supported, only the preferred
variant, G.711 20 ms, is included.
type
One of the following:
• GCCAPTYPE_AUDIO
• GCCAPTYPE_RDATA
direction
One of the following:
• IP_CAP_DIR_LCLTRANSMIT – transmit capability of full-duplex session
• IP_CAP_DIR_LCLRECEIVE – receive capability of full-duplex session
• IP_CAP_DIR_LCLRXTX – transmit and receive capability (T.38 only)
• IP_CAP_DIR_LCLSENDONLY – capability of a half-duplex transmit-only session
• IP_CAP_DIR_LCLRECVONLY – capability of a half-duplex receive-only session
payload_type
Not supported. The currently supported coders have static (pre-assigned) payload types
defined by standards.
extra
Reference to a data structure of type IP_AUDIO_CAPABILITY, which contains the following
two fields:
• frames_per_packet – The number of frames per packet.
Note: For G.711 coders, the extra.frames_per_packet field sets the frame size (in ms) rather
than the frames per packet.
• VAD – Enables or disables VAD.
Values: GCPV_DISABLE, GCPV_ENABLE, GCCAP_dontCare
Note: Applications must explicitly set this field to GCPV_ENABLE for the coders that
implicitly support only VAD, such as GCCAP_AUDIO_g729AnnexAwAnnexB.
126
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP-Specific Operations
See the reference page for IP_CAPABILITY on page 543 for more information.
Table 2 shows the coders that are supported when using the Dialogic® Global Call API with
Dialogic® Host Media Processing (HMP) Software.
Table 2. Coders Supported for Dialogic® Host Media Processing (HMP) Software
Coder
and Rate
Dialogic® Global Call API #
Define
G.711 A-law
GCCAP_AUDIO_g711Alaw64k
Frame size1: 10, 20, or 30 ms
Frames per Packet: fixed at 1 fpp
Not supported;
must be explicitly
disabled
G.711 mu-law
GCCAP_AUDIO_g711Ulaw64k
Frame size1: 10, 20, or 30 ms
Frames per packet: fixed at 1 fpp
Not supported;
must be explicitly
disabled
G.723.1
5.3 kbps
GCCAP_AUDIO_g7231_5_3k
Frames per packet: 2 or 3
Frame size: fixed at 30 ms
Supported
G.723.1,
6.3 kbps
GCCAP_AUDIO_g7231_6_3k
Frames per packet: 2 or 3
Frame size: fixed at 30 ms
Supported
G.726,
16 kbps
GCCAP_AUDIO_g726_16k
Frames per packet: 1, 2, or 3
Frame size: fixed at 20 ms
Not supported;
must be explicitly
disabled
G.726,
24 kbps
GCCAP_AUDIO_g726_24k
Frames per packet: 1, 2, or 3
Frame size: fixed at 20 ms
Not supported;
must be explicitly
disabled
G.726,
32 kbps
GCCAP_AUDIO_g726_32k
Frames per packet: 1, 2, or 3
Frame size: fixed at 20 ms
Not supported;
must be explicitly
disabled
G.726,
40 kbps
GCCAP_AUDIO_g726_40k
Frames per packet: 1, 2, or 3
Frame size: fixed at 20 ms
Not supported;
must be explicitly
disabled
G.729a
GCCAP_AUDIO_g729AnnexA
Frames per packet: 2, 3, or 4
Frame size: fixed at 10 ms
Not supported;
must be explicitly
disabled
G.729a+b
GCCAP_AUDIO_g729AnnexA
wAnnexB
Frames per packet: 2, 3, or 4
Frame Size: fixed at 10 ms
Must be enabled 2
T.38
GCCAP_DATA_t38UDPFax
Not applicable
Not applicable
Frames Per Packet (fpp)
and Frame Size (ms)
VAD Support
Note:
1. For G.711 coders, the frames_per_pkt field of the IP_AUDIO_CAPABILITY structure is actually used to specify the frame
size rather than the fpp. See the reference page for IP_AUDIO_CAPABILITY on page 541 for more information.
2. Applications must explicitly specify VAD support even though G.729a+b implicitly supports VAD.
Note:
4.3.2.1
When using low bit-rate (LBR) coders, reliable in-band transmission of DTMF tones is not
possible.
Specifying Media Capabilities Before Connection
Applications can only specify media capabilities before initial call connection. For an outbound
call, capabilities must be set before or with the gc_MakeCall( ). For inbound calls, capabilities
must be set before or with the gc_AnswerCall( ), but it is recommended that they be set before
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
127
IP-Specific Operations
gc_AcceptCall( ) to get maximum benefit from Global Call’s early media support. Capability
types can be GCCAPTYPE_AUDIO and/or GCCAPTYPE_RDATA. The session capabilities that
can result when different capabilities are set by applications are listed in the Table 3.
Table 3. Capabilities Set by Application
4.3.2.2
GCCAPTYPE_AUDIO
capability set by application
GCCAPTYPE_RDATA
capability set by application
Resulting Capability
for Initial Connection
Not set
Not set
Any supported audio capability or T.38 fax.
One or more
GCCAP_AUDIO_XXX
Not Set
Any specified audio capability.
No T.38 fax.
Not Set
GCCAP_DATA_t38UDPFax
T.38 fax only.
No audio cpability.
One or more
GCCAP_AUDIO_XXX
GCCAP_DATA_t38UDPFax
Any specified audio capability or T.38 fax.
GCCAP_dontCare
Not Set
Any supported audio capability.
No T.38 fax.
GCCAP_dontCare
GCCAP_DATA_t38UDPFax
Any supported audio capability or T.38 fax.
Resource Allocation When Using Low-Bit Rate Coders
The number of resources available when using G.723 and G.729 coders is limited. When all
resources are consumed, depending on the requirements of the application, different behavior may
be observed as follows:
• If the application specifies only G.723 and/or G.729 audio coders before gc_MakeCall( ),
gc_CallAck( ), gc_AcceptCall( ), or gc_AnswerCall( ), the result is a function failure with an
error code of IPERR_TXRXRESOURCESINSUFF.
• If the application specifies G.711 with G.723 and/or G.729 audio coders, only the G.711 coder
will be provided in the capability set sent to the remote endpoint.
• If the application does not explicitly specify any audio capability, then the G.711 coders (both
A-law and μ-law) are included in the capability set sent to the remote endpoint.
LBR coder resources are only released when gc_ReleaseCallEx( ) is used, regardless of whether
the resource was negotiated or not.
Note:
4.3.3
When using low bit-rate (LBR) coders, in-band transmission of DTMF tones will not work reliably
and should not be attempted.
Specifying Nonstandard Data Information (H.323)
To specify Nonstandard Data information to be included in the H.323 SETUP message, use the
gc_SetUserInfo( ) function with a duration parameter of GC_SINGLECALL to preset the
information. If the duration parameter is set to GC_ALLCALLS, the function fails.
To specify Nonstandard Data, the GC_PARM_BLK pointed by the infoparmblkp parameter in the
function call must be contain two parameter elements that use the IPSET_NONSTANDARDDATA
128
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP-Specific Operations
parameter set ID. The first required parameter element specifies the Nonstandard Data itself, and
the second parameter element identifies the type of object identifier to use.
The maximum length of the Global Call parameter used for the Nonstandard Data information is
configured at start-up via the max_parm_data_size field in the IPCCLIB_START_DATA structure.
The default size is 255 (for backwards compatibility), but applications may configure it to be as
large as 4096 bytes. Applications must use the extended gc_util_..._ex( ) functions to insert or
extract any GC_PARM_BLK parameter elements whose data length is defined to be greater than
255.
Note:
In practice, applications may not be able to utilize the full maximum length of the nonstandard data
parameter element as configured in max_parm_data_size. The H.323 stack limits the overall size of
messages to be max_parm_data_size + 512 bytes, and any messages that exceed this limit are
truncated without any notification to the application.
The parameter element for the Nonstandard Data data is:
IPSET_NONSTANDARDDATA
IPPARM_NONSTANDARDDATA_DATA
• value = Nonstandard Data string, max length = max_parm_data_size (configurable at
library start-up)
The parameter element for the Nonstandard Data identifier is one (and only one) of the following:
IPSET_NONSTANDARDDATA
IPPARM_NONSTANDARDDATA_OBJID
• value = array of unsigned integers, max length = MAX_NS_PARM_OBJID_LENGTH
IPSET_NONSTANDARDDATA
IPPARM_H221NONSTANDARD
• value = IP_H221NONSTANDARD structure
See Section 9.2.18, “IPSET_NONSTANDARDDATA”, on page 526 for more information.
The following code example shown how to set nonstandard data elements:
IP_H221NONSTANDARD appH221NonStd;
appH221NonStd.country_code = 181;
appH221NonStd.extension = 31;
appH221NonStd.manufacturer_code = 11;
char* pData = "Data String";
char* pOid = "1 22 333 4444";
choiceOfNSData = 1;/* App decides which type of object identifier to use */
/* setting NS Data */
gc_util_insert_parm_ref_ex(&pParmBlock,
IPSET_NONSTANDARDDATA,
IPPARM_NONSTANDARDDATA_DATA,
(unsigned long)(strlen(pData)+1),
pData);
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
129
IP-Specific Operations
if (choiceOfNSData) /* App decides the CHOICE of OBJECTIDENTIFIER.
It cannot set both objid & H221 */
{
gc_util_insert_parm_ref(&pParmBlock,
IPSET_NONSTANDARDDATA,
IPPARM_H221NONSTANDARD,
(unsigned char)sizeof(IP_H221NONSTANDARD),
&appH221NonStd);
}
else
{
gc_util_insert_parm_ref(&pParmBlock,
IPSET_NONSTANDARDDATA,
IPPARM_NONSTANDARDDATA_OBJID,
(unsigned char)(strlen(pOid)+1),
pOid);
}
4.3.4
Specifying Nonstandard Control Information (H.323)
To specify Nonstandard Control information to be included in the H.323 SETUP message, use the
gc_SetUserInfo( ) function with a duration parameter of GC_SINGLECALL to preset the
information. If the duration parameter is set to GC_ALLCALLS, the function fails.
To specify Nonstandard Control data, the GC_PARM_BLK pointed by the infoparmblkp function
must be set up with two parameter elements that use the IPSET_NONSTANDARDCONTROL
parameter set ID. The first required parameter element specifies the Nonstandard Control data
itself, and the second parameter element identifies the type of object identifier to use.
The maximum length of the Global Call parameter used for the Nonstandard Control information is
configured at start-up via the max_parm_data_size field in the IPCCLIB_START_DATA structure.
The default size is 255 (for backwards compatibility), but applications may configure it to be as
large as 4096 bytes. Applications must use the extended gc_util_..._ex( ) functions to insert or
extract any GC_PARM_BLK parameter elements whose data length is defined to be greater than
255.
Note:
In practice, applications may not be able to utilize the full maximum length of the nonstandard
control parameter element as configured in max_parm_data_size. The H.323 stack limits the
overall size of messages to be max_parm_data_size + 512 bytes, and any messages that exceed this
limit are truncated without any notification to the application.
The parameter element for the Nonstandard Control data is:
IPSET_NONSTANDARDCONTROL
IPPARM_NONSTANDARDDATA_DATA
• value = Nonstandard Data string, max length =
IPCCLIB_START_DATA.max_parm_data_size (configurable at library start-up)
The parameter element for the Nonstandard Control identifier is one (and only one) of the
following:
IPSET_NONSTANDARDCONTROL
IPPARM_NONSTANDARDDATA_OBJID
• value = array of unsigned integers, max length = MAX_NS_PARM_OBJID_LENGTH
130
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP-Specific Operations
IPSET_NONSTANDARDCONTROL
IPPARM_H221NONSTANDARD
• value = IP_H221NONSTANDARD structure
See Section 9.2.17, “IPSET_NONSTANDARDCONTROL”, on page 525 for more information.
The following code example shows how to set nonstandard data elements:
IP_H221NONSTANDARD appH221NonStd;
appH221NonStd.country_code = 181;
appH221NonStd.extension = 31;
appH221NonStd.manufacturer_code = 11;
char* pControl = "Control String";
char* pOid = "1 22 333 4444";
choiceOfNSControl = 1; /* App decides which type of object identifier to use */
/* setting NS Control */
gc_util_insert_parm_ref_ex(&pParmBlock,
IPSET_NONSTANDARDCONTROL,
IPPARM_NONSTANDARDDATA_DATA,
(unsigned long)(strlen(pControl)+1),
pControl);
if (choiceOfNSControl)
/* App decide the CHOICE of OBJECTIDENTIFIER.
It cannot set both objid & h221 */
{
gc_util_insert_parm_ref(&pParmBlock,
IPSET_NONSTANDARDCONTROL,
IPPARM_H221NONSTANDARD,
(unsingned char)sizeof(IP_H221NONSTANDARD),
&appH221NonStd);
}
else
{
gc_util_insert_parm_ref(&pParmBlock,
IPSET_NONSTANDARDCONTROL,
IPPARM_NONSTANDARDDATA_OBJID,
(unsingned char)(strlen(pOid)+1),
pOid);
}
4.4
Connection Phase Messages
In either the SIP or H.323 protocol, a number of messages are exchanged in the connection phase,
after one endpoint has initiated a call and before the connection is completed. The Dialogic®
Global Call API library and the protocol stack handle most of these messages automatically,
without any participation from the application. But the application is able to configure or access
some of these messages as described in the following topics:
• Setting and Retrieving Disconnect Cause or Reason Values
• Setting Busy Reason Codes
• SIP Provisional (1xx) Responses
• SIP Redirection (3xx) Response Messages
• SIP Rejection Responses
• Configuring Proceeding Message Generation (H.323)
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
131
IP-Specific Operations
4.4.1
Setting and Retrieving Disconnect Cause or Reason Values
Use the cause parameter in the gc_DropCall( ) function to specify a disconnect reason/cause to be
sent to the remote endpoint.
Note:
When using SIP, reasons are only supported when a call is disconnected while in the Offered state.
Use the gc_ResultInfo( ) function to get the reason/cause of a GCEV_DISCONNECTED event.
This reason/cause could be sent from the remote endpoint or it could be the result of an internal
error.
IP-specific reason/cause values are specified in the eIP_EC_TYPE enumerator defined in the
gcip_defs.h header file.
4.4.2
Setting Busy Reason Codes
Both SIP and H.323 define request response codes that can be included in the failure response
messages that are sent when a local system cannot take additional incoming sessions. Global Call
allows applications to set SIP and H.323 busy code values on a virtual board level.
SIP and H.323 busy codes are configured independently, and the configuration of each can be
changed at any time. The busy codes are configured by calling gc_SetConfigData( ) using the
following parameter set ID and parameter ID:
• for SIP: IPSET_SIP_RESPONSE_CODE and IPPARM_BUSY_REASON; see
Section 9.2.25, “IPSET_SIP_RESPONSE_CODE”, on page 532.
• for H.323: IPSET_H323_RESPONSE_CODE and IPPARM_BUSY_CAUSE; see
Section 9.2.8, “IPSET_H323_RESPONSE_CODE”, on page 519.
4.4.2.1
Setting SIP Busy Code
For SIP, RFC3261 defines three applicable busy codes:
480 Temporarily Unavailable
The callee’s end system was contacted successfully, but the callee is currently unavailable. For
example, the callee may be not logged in, may be in a state that precludes communication, or
may have activated the “do not disturb” feature. This busy code is also returned by a redirect or
proxy server that recognizes the user identified by the Request-URI but does not currently have
a valid forwarding location for that user.
486 Busy Here
The callee’s end system was contacted successfully, but the callee is currently not willing or
able to take additional calls at this end system. This response should be used if the user could
be available elsewhere.
600 Busy Everywhere
The callee’s end system was contacted successfully, but the callee is busy and does not wish to
take the call at this time. This response should be used if the callee knows that no other end
system will be available to accept this call.
132
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP-Specific Operations
By default, Global Call automatically responds with a 486 Busy Here when additional incoming
call requests arrive after the maximum number of SIP calls per virtual board has been reached. A
480 Temporarily Unavailable or 600 Busy Everywhere reason code can be used instead of the 486
Busy Here if the application explicitly configures the busy code.
To configure the SIP busy reason code, call gc_SetConfigData( ) with a GC_PARM_BLK that
contains the following parameter element:
IPSET_SIP_RESPONSE_CODE
IPPARM_BUSY_REASON
Possible values:
• IPEC_SIPReasonStatus480TemporarilyUnavailable
• IPEC_SIPReasonStatus486BusyHere (default)
• IPEC_SIPReasonStatus600BusyEverywhere
The following code snippet illustrates how to configure the SIP busy code:
#include "gclib.h"
.
.
/* configure SIP Busy Reason Code to 480 Temporarily Available */
GC_PARM_BLKP pParmBlock = NULL;
gc_util_set_insert_parm_val(&pParmBlock,
IPSET_SIP_RESPONSE_CODE,
IPPARM_BUSY_REASON,
sizeof(unsigned short),
IPEC_SIPReasonStatus480TemporarilyUnavailable);
gc_SetConfigData(GCTGT_CCLIB_NETIF, board, pParmBlock,
0, GCUPDATE_IMMEDIATE, &t, EV_ASYNC);
gc_util_delete_parm_blk(pParmBlock);
4.4.2.2
Setting H.323 Busy Code
ITU Recommendation Q.850 defines cause codes that are used for H.323. Among the applicable
busy cause definitions are:
Cause 34: No circuit/channel available
Indicates there is no appropriate circuit/channel currently available to handle the call.
Cause 47: Resource unavailable/unspecified
Indicates the resource is unavailable when no other cause values in the resource class applies.
To configure the H.323 busy reason code, call gc_SetConfigData( ) with a GC_PARM_BLK that
contains the following parameter element:
IPSET_H323_RESPONSE_CODE
IPPARM_BUSY_CAUSE
Typical values:
• IPEC_Q931Cause34NoCircuitChannelAvailable
• IPEC_Q931Cause44RequestedCircuitChannelNotAvailable
• IPEC_Q931Cause47ResourceUnavailableUnspecified
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
133
IP-Specific Operations
The following code snippet illustrates how to set the H.323 busy code:
#include "gclib.h"
.
.
/* configure H.323 Busy Reason Code to 34 -
"No Circuit/Channel Available" */
GC_PARM_BLKP pParmBlock = NULL;
gc_util_set_insert_parm_val(&pParmBlock,
IPSET_H323_RESPONSE_CODE,
IPPARM_BUSY_CAUSE,
sizeof(unsigned short),
IPEC_Q931Cause34NoCircuitChannelAvailable);
gc_SetConfigData(GCTGT_CCLIB_NETIF, board, pParmBlock,
0, GCUPDATE_IMMEDIATE, &t, EV_ASYNC);
gc_util_delete_parm_blk(pParmBlock);
4.4.3
SIP Provisional (1xx) Responses
RFC 3261 defines five provisional messages (also called informational messages) that may be sent
to the calling party when the server at the called party is performing some further action and does
not yet have a definitive response. One of these provisional messages, the 100 Trying message, is
uniquely reported to the calling application via the maskable GCEV_PROCEEDING event type.
The other four provisional messages, which have response codes in the 18x range, are all reported
to the calling application via the same Global Call event type, GCEV_ALERTING. This section
describes the mechanisms that Global Call provides to allow applications to differentiate among
the 18x provisional responses, which include:
• 180 (Ringing)
• 181 (Call Is Being Forwarded)
• 182 (Queued)
• 183 (Session Progress)
Note:
RFC 3261 indicates that the server for the called party may issue more than one 182 Queued
response to update the caller about the status of the queued call, but the call control library only
generates a GCEV_ALERTING event for the first 182 Queued response for a given call.
For all provisional messages, the primary content is the Status-Code in the response’s Status-Line,
and the technique for retrieving this information is described in Section 4.4.3.1, “Retrieving StatusCode for 18x Provisional Responses”.
RFC 3261 specifies that 182 and 183 responses may optionally contain additional information
about the call status in the Reason-Phrase of the message’s Status-Line. The technique for
retrieving this information is described in Section 4.4.3.2, “Retrieving Reason-Phrase from 182 and
183 Provisional Responses”.
RFC 3261 also specifies that 183 responses can optionally contain more details about the call
progress in message header fields or the message body. Applications can retrieve this information
using the generic access mechanisms described in Section 4.9, “Setting and Retrieving SIP
Message Header Fields”, and Section 4.10, “Using MIME Bodies in SIP Messages (SIP-T)”.
134
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP-Specific Operations
4.4.3.1
Retrieving Status-Code for 18x Provisional Responses
When using SIP, each GCEV_ALERTING event will have an associated GC_PARM_BLK that
contains the specific status code for the 18x provisional response message in a parameter element
of the following type:
IPSET_SIP_RESPOSNSE_CODE
IPPARM_RECEIVED_RESPONSE_STATUS_CODE
• value = 3-digit integer retrieved as Status-Code from Status-Line of the received
provisional message
4.4.3.2
Retrieving Reason-Phrase from 182 and 183 Provisional Responses
The mechanism provided for retrieving the Reason-Phrase for 182 and 183 provisional response
messages is an extension of the generic mechanism for accessing SIP header fields, as described in
Section 4.9, “Setting and Retrieving SIP Message Header Fields”, even though the Reason-Phrase
is not technically a header field.
Applications must first register to receive the Reason-Phrase, using the same technique that is
detailed in Section 4.9.2, “Enabling Access to SIP Header Information”, on page 179. This
registration only needs to be performed once for a board device, and may be performed at any time
during the life of an application.
To register to receive the Reason-Phrase, the application first constructs a GC_PARM_BLK that
contains the following element:
IPSET_CONFIG
IPPARM_REGISTER_SIP_HEADER
• value = "Reason-Phrase"
The application then calls gc_SetConfigData( ) with this GC_PARM_BLK to register for
reception of all the header fields that are identified in the parameter block.
When the Dialogic® Global Call API library receives a 182 or 183 provisional response, it
generates a a GCEV_ALERTING event that has an associated GC_PARM_BLK to contain extra
data about the event. If the application has previously registered to receive the Reason-Phrase, this
GC_PARM_BLK will contain a parameter element as follows:
IPSET_MSG_INFO
IPPARM_SIP_HDR
• value = NULL-terminated string which begins with the string “Reason-Phrase:”
Note:
Depending on the list of header fields that the application has registered to receive, the
GC_PARM_BLK associated with the GCEV_ALERTING event may contain multiple parameter
elements that use the IPSET_SIP_MSG_INFO / IPPARM_SIP_HDR ID pair. It is the application’s
responsibility to parse the value strings of these parameter elements to identify the one that begins
with the “Reason-Phrase:” string.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
135
IP-Specific Operations
4.4.4
SIP Redirection (3xx) Response Messages
RFC 3261 defines the 3xx range of responses as redirection messages, which can be used by the
called party’s server to push alternative routing information back to the originator of an INVITE
request. This allows the server to provide information that is useful in locating the target of the
request while also taking itself out of the loop for further messaging for the transaction. When the
originator of the INVITE request receives a 3xx response, it cancels the original request and issues
one or more new requests based on the URI(s) and transport parameters contained in the response.
The supported redirection status codes include:
• 301 (Moved Permanently)
• 302 (Moved Temporarily)
• 305 (Use Proxy)
4.4.4.1
Redirecting an Incoming Call
To redirect an incoming call, the application first prepares a CG_PARM_BLK that contains the
alternative contact information to be sent to the originator in the Contact header, then calls
gc_SetUserInfo( ) to set the parameters for the next message. After the parameters are set the
application calls gc_DropCall( ) for the CRN to send the 3xx response; the specific response code
that is used is specified via the cause parameter using the IPEC_SIPReasonStatus3xx values that
are defined in gcip_defs.h.
When preparing the parameter block for a redirection response, the application inserts one or more
of the following parameter elements into a GC_PARM_BLK:
IPSET_SIP_MSGINFO
IPPARM_SIP_HDR
• value = complete Contact header string, starting with “Contact:”
Note:
The use of the deprecated IPSET_SIP_MSGINFO / IPPARM_CONTACT_URI parameter ID pair
is not recommended because this ID pair only provides access to the URI portion of the Contact
header (i.e., without the display string and any parameters), and can only set a single URI. If the
GC_PARM_BLK contains one or more IPSET_SIP_MSGINFO / IPPARM_SIP_HDR parameter
elements, any element using IPSET_SIP_MSGINFO / IPPARM_CONTACT_URI will be ignored.
If any specific Contact string being set by the application is longer than 255 bytes, the application
must use the extended gc_util_insert_parm_ref_ex( ) function; if the data is less than 255 bytes in
length, either gc_util_insert_parm_ref( ) or gc_util_insert_parm_ref_ex( ) can be used.
If the application sets more than one Contact header parameter element in the GC_PARM_BLK,
the call control library automatically combines then into a single Contact header in a commaseparated value list that reflects the order in which the application specified the separate Contact
headers.
RFC 3261 provides detailed information about rules and restrictions for Contact header fields in
redirection responses, but a few basic rules are presented here for convenience:
• The Contact header field contains URIs that specify new locations, new user names, or
additional transport parameters.
136
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP-Specific Operations
• None of the URIs in the Contact header field can be equal to the one in the Request-URI.
• For a 301 or 302, the response may contain the same location and username that was targeted
in the original request, but additional transport parameters to try, such as a different multicast
address or a different transport protocol.
• A Contact header field can point to a different resource than the one originally called, and can
use any suitable URI (not just SIP URIs).
• Each Contact header field can include an “expires” parameter to indicate how long the URI is
valid (in seconds). If this parameter is not provided, the value of the Expires header field
determines the length of the validity.
The following code example shows how an application can set two alternative URIs to send in a
302 Moved Temporarily response.
void redirectChannel(int channel)
{
char contact1[] = "Contact: \"forward1\" <sip:forward1@146.152.84.124>;q=0.7;expires=3600";
char contact2[] = "Contact: \"forward2\" <sip:forward2@146.152.84.124>;q=0.5;expires=60";
//Set contact header
GC_PARM_BLKP pParmBlock = NULL;
gc_util_insert_parm_ref_ex(&pParmBlock,
IPSET_SIP_MSGINFO,
IPPARM_SIP_HDR,
(unsigned long) (strlen(contact1)+1),
contact1);
gc_util_insert_parm_ref_ex(&pParmBlock,
IPSET_SIP_MSGINFO,
IPPARM_SIP_HDR,
(unsigned long) (strlen(contact2)+1),
contact2);
int frc = gc_SetUserInfo(GCTGT_GCLIB_CRN, session[channel].crn,pParmBlock,GC_SINGLECALL);
if(GC_SUCCESS != frc)
{
printf("[%d] gc_SetUserInfo failed\n",channel);
gc_util_delete_parm_blk(pParmBlock);
return;
}
int rc = gc_DropCall(session[channel].crn,
IPEC_SIPReasonStatus302MovedTemporarily,
EV_ASYNC);
if(GC_SUCCESS != rc)
{
printf("[%d] gc_DropCall failed \n",channel);
return;
}
}
The SIP message sent by in this example would look something like the following:
SIP/2.0 302 Moved Temporarily
From: HMP-From<sip:146.152.84.1:5060>;tag=52a52b0-0-13c4-28795-17aef347-28795
To: HMP-To<sip:146.152.84.2>;tag=52a5468-0-13c4-28795-783983a2-28795;myname
Call-ID: 52ebbf8-0-13c4-28795-14daf9c6-28795@146.152.84.1
CSeq: 1 INVITE
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
137
IP-Specific Operations
Via: SIP/2.0/UDP 146.152.84.1:5060;received=146.152.84.2;branch=z9hG4bK-28795-9e19f19-554d9dc4
Supported: replaces
Contact: "forward1" <sip:forward1@146.152.84.124>;q=0.7;expires=3600,"forward2"
<sip:forward2@146.152.84.124>;q=0.5;expires=60
Content-Length: 0
4.4.4.2
Receiving and Handling a Redirect Response
After receiving a GCEV_DISCONNECTED event, the application can check the cause of the
event. If the disconnection was because of call redirection, the application can further check the
extra data associated with the event for redirect URIs in the form of a Contact header contained in
an IPSET_SIP_MSGINFO/IPPARM_SIP_HDR parameter element. After completing the drop call
on this channel, the application can make a new call to any of the redirect URIs if it wishes.
According to RFC 3261, applications receiving a 3xx response have great latitude in determining
how (or whether) to generate new requests to the redirect URIs. An application can choose which
of the suggested URIs to add to its target list, and in what order to add them. The application may
generate new requests to the URIs in the target list serially or in parallel. If a new request fails
(receives a result code greater than 399), the application should try the next URI in the target list
until the call succeeds or until all URIs have produced a failure result. If any of the redirected
requests produces a 3xx redirect response, the application can choose to add to its target list any of
the URIs that are contained in the 3xx response as long as the URI is not already in the target list.
RFC 3261 recommends that the new requests use the same To, From, and Call-ID used in the
original, redirected request, but the application may update the Call-ID if it wishes.
In the following example, the parser assumes the redirect URI is in <> and only returns the first
URI in the Contact header.
void processEvtHandler()
{
METAEVENT
metaEvent;
GC_PARM_BLK *parmblkp = NULL;
GC_PARM_DATAPt_gcParmDatap = NULL;
.
.
.
switch (evtType)
{
case GCEV_DISCONNECTED:
/* check for call redirection */
if(true == checkCallRedirected())
{
parmblkp = (GC_PARM_BLK *) metaEvent.extevtdatap;
while (t_gcParmDatap = gc_util_next_parm(parmblkp, t_gcParmDatap))
{
switch(t_gcParmDatap->set_ID)
{
case IPSET_SIP_MSGINFO:
switch(t_gcParmDatap->parm_ID)
{
case IPPARM_SIP_HDR:
/* check for first contact URI */
Char* addr = checkRedirectedAddress(t_gcParmDatap);
if(NULL != addr)
{
printf("Redirect URI is %s",addr);
}
138
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP-Specific Operations
break;
}
break;
}
}
}
/* continue drop call on this channel */
.
.
.
}
.
.
.
}
bool checkCallRedirected()
{
int gcError;
/* GlobalCall Error */
int ccLibId;
/* CC Library ID */
long ccError = 0;
/* Call Control Library error code */
char *GCerrMsg; /* GC pointer to error message string *
char *errMsg;
/* CCLIB pointer to error message string */
if(gc_ResultValue( &g_ClaimedMetaEvent, &gcError, &ccLibId, &ccError) == GC_SUCCESS)
{
gc_ResultMsg(LIBID_GC, (long) gcError, &GCerrMsg);
gc_ResultMsg(ccLibId, ccError, &errMsg);
printf("GC (%d) %s,CC (%ld) %s\n",,gcError,GCerrMsg,ccError,errMsg);
/check for redirection
if(IPEC_SIPReasonStatus300MultipleChoices <= ccError &&
ccError < IPEC_SIPReasonStatus400BadRequest)
{
printf("Call is redirected\n");
return true;
}
else
{
return false;
}
}
return false;
}
/* Get only the first address in <> */
char* checkRedirectedAddress(GC_PARM_DATA *parmp)
{
char* ptr;
char* SipHeaderData=(char*)parmp->value_buf;
char* HeaderName = NULL;
char* HeaderData = NULL;
char* redirectURI = NULL;
ULONG HeaderDataSize = 0;
ptr = strchr(SipHeaderData,':');
if (ptr)
{
ptr[0] = '\0';
HeaderName = SipHeaderData;
HeaderData = ptr + sizeof(char);
HeaderDataSize = parmp->value_size - (strlen(HeaderName) + 1);
}
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
139
IP-Specific Operations
if ( HeaderName != NULL &&
0==_stricmp(HeaderName,"contact") &&
(HeaderData != NULL) &&
(HeaderDataSize != 0) )
{
ptr = strchr(HeaderData,'<');
redirectURI=ptr+sizeof(char);
ptr = strchr(HeaderData,'>');
ptr[0]='\0';
return redirectURI;
}
else
{
return NULL;
}
}
4.4.5
SIP Rejection Responses
Note:
The information in this section only applies when the Dialogic® Global Call IP Call Control library
is started in the first party call control (1PCC) operating mode. The capability described in this
section is not supported when the library is started in the third party call control (3PCC) operating
mode.
There are several circumstances in which the Dialogic® Global Call API library automatically
rejects an initial call offer or a subsequent media session proposal.
If the library receives an initial INVITE request that contains an SDP offer which does not specify
a codec that is supported on the local media platform, the library automatically sends a 488 (Not
Acceptable Here) response. No notification is sent to the application in this situation because no
dialog has been established.
If an SDP offer that does not specify a supported codec is received in a re-INVITE request rather
than an initial INVITE, the library once again automatically rejects the offer with a 488 (Not
Acceptable Here). But in this case the library does notify the application (form informational
purposes only) with a GCEV_REQ_MODIFY_UNSUPPORTED event.
If the library receives an multimedia SDP offer (i.e., an SDP offer that includes a video media
descriptor), the default behavior is to accept the audio portion of the offer (assuming that it is
acceptable) but reject the video portion. This is accomplished by setting a port number of 0 in the
video media descriptor in the SDP answer that is sent in the 200 OK response.
Applications can optionally configure the library to use an alternative response to SDP offers
containing video media descriptors. When the application enables this alternative response, the
library automatically rejects an INVITE or re-INVITE that requests a video media session with a
488 (Not Acceptable Here) response. If the SDP offer proposing a video session is contained in a
200 OK rather than an INVITE, the library will ACK the 200 OK but then immediately terminate
the call with BYE.
140
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP-Specific Operations
This alternative response to media session proposals is enabled using the gc_SetConfigData( )
function, passing it a GC_PARM_BLK that includes the following parameter:
IPSET_CONFIG
IPPARM_1PCC_REJECT_VIDEO
• value = not used
Once this alternative rejection mode has been enabled, the setting remains in effect until the library
is stopped and the application exits.
The following code snippet illustrates how applications would enable the optional rejection mode:
gc_util_insert_parm_val(&pParmBlock, IPSET_CONFIG, IPPARM_1PCC_REJECT_VIDEO, sizeof(int), 0);
long t = 0;
int rc = gc_SetConfigData(GCTGT_CCLIB_NETIF,
boarddev,
pParmBlock,
0,
GCUPDATE_IMMEDIATE,
&t,
EV_ASYNC);
4.4.6
Configuring Proceeding Message Generation (H.323)
When using the H.323 protocol, the application can configure whether the Proceeding message is
sent under application control (using the gc_CallAck( ) function) or automatically by the stack.
The default behavior is for the stack to send Proceeding automatically.
The generation of the Proceeding message is configured using the gc_SetConfigData( ) function.
To configure the generation of the Proceeding message, the GC_PARM_BLK that is passed to the
function must contain the following parameter element:
GCSET_CALL_CONFIG
GCPARM_CALLPROC
Possible values:
• GCCONTROL_APP – The application must use gc_CallAck( ) to send the Proceeding
message. This is the default.
• GCCONTROL_TCCL – The stack sends the Proceeding message automatically.
4.5
Retrieving Current Call-Related Information
To support large numbers of channels, the Dialogic® Global Call API library must perform all
operations in asynchronous mode. To support this, an extension function variant allows the retrieval
of a parameter as an asynchronous operation.
The retrieval of call-related information is a four step process:
1. Set up a GC_PARM_BLK that identifies which information is to be retrieved. The
GC_PARM_BLK includes GC_PARM_DATA blocks. The GC_PARM_DATA blocks specify
only the Set_ID and Parm_ID fields, that is, the value_size field is set to 0. The list of
GC_PARM_DATA blocks indicate to the call control library the parameters to be retrieved.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
141
IP-Specific Operations
2. Use the gc_Extension( ) function to request the data. The parameters for this call should be
specified as follows:
• target_type should be GCTGT_GCLIB_CRN
• target_id should be the actual CRN
• ext_id (extension ID) should be set to IPEXTID_GETINFO
• parmblkp should point to the GC_PARM_BLK set up in step 1
• mode should be set to EV_ASYNC (asynchronous)
3. A GCEV_EXTENSIONCMPLT event is generated in response to the gc_Extension( )
request. The extevtdatap field in the METAEVENT structure for the
GCEV_EXTENSIONCMPLT event is a pointer to an EXTENSIONEVTBLK structure that
contains a GC_PARM_BLK with the requested call-related information.
4. Extract the information from the GC_PARM_BLK associated with the
GCEV_EXTENSIONCMPLT event. In this case, the GC_PARM_BLK contains real data; that
is, the value_size field is not 0, and includes the size of the data following for each parameter
requested.
Note:
When an application on H.323 is using gc_Extension( ) to extract information from a
GCEV_OFFERED event, the application must ensure that it acknowledges the call within 8
seconds to prevent the offering side from timing out. The timer can be extended by sending
PROCEEDING (by calling gc_CallAck( )) or ALERTING (by calling gc_AcceptCall( )) before
extracting the information.
Table 4 shows the parameters that can be retrieved and when the information should be retrieved.
The table also identifies which information can be retrieved when using H.323 and which
information can be retrieved using SIP. For more information on individual parameters, refer to the
corresponding parameter set reference section in Chapter 9, “IP-Specific Parameters”.
142
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP-Specific Operations
Table 4. Retrievable Call Information
Parameter
Call ID
Set ID and Parameter ID(s)
IPSET_CALLINFO
• IPPARM_CALLID
When Information
Can Be Retrieved
Any state after
Offered or
Proceeding
Datatype in
value_buf Field
(see Note 1)
For SIP: string, max.
length = MAX_IP_SIP_
CALLID_LENGTH
SIP/
H.323
both
For H.323: array of
octets, length =
MAX_IP_H323_
CALLID_LENGTH
If protocol is unknown,
MAX_IP_CALLID_
LENGTH defines the
maximum Call ID
length for any possible
protocol.
Bearer
Capability IE
IPSET_CALLINFO
Call Duration
IPSET_CALLINFO
After Offered
String, max. length =
255
H.323
only
After Disconnected,
before Idle
Unsigned long (value
in ms)
H.323
only
Any state after
Offered or
Proceeding
Uint[8]
H.323
only
Any state after
Offered or
Proceeding
char*, max. length =
IP_CONFER
ENCE_ID_
LENGTH (16)
H.323
only
Any state after
Offered or
Proceeding
char*, max. length
= MAX_DISPLAY_
LENGTH (82), nullterminated
both
After Offered
(SETUP message),
Connected
(CONNECT
message), or the
reception of a
Facility message
String,
max. length = 255
H.323
only
• IPPARM_BEARERCAP
• IPPARM_CALL_DURATION
Conference
Goal
IPSET_CONFERENCE
Conference
ID
IPSET_CONFERENCE
Display
Information
IPSET_CALLINFO
Facility IE
IPSET_CALLINFO
• IPPARM_CONFERENCE_GOAL
• IPPARM_CONFERENCE_ID
• IPPARM_DISPLAY
• IPPARM_FACILITY
Notes:
1. This field is the value_buf field in the GC_PARM_DATA structure associated with the GCEV_EXTENSIONCMPLT event
generated in response to the gc_Extension( ) function requesting the information.
2. Display information, user to user information, phone list, nonstandard data, vendor information and nonstandard control
information, and H221 nonstandard information may not be present.
3.Vendor information is included in a Q931 SETUP message received from a peer.
4. The nonstandard object id and nonstandard data parameters described here refer to nonstandard data contained in a
SETUP message for example. This should not be confused with the nonstandard data included in protocol messages sent
using gc_Extension( ) which can be retrieved from the metaevent associated with a GCEV_EXTENSION event.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
143
IP-Specific Operations
Table 4. Retrievable Call Information (Continued)
Parameter
Set ID and Parameter ID(s)
Nonstandard
Control
IPSET_NONSTANDARDCONTROL
(see note 4)
• IPPARM_
NONSTANDARDDATA_DATA
and either
• IPPARM_
NONSTANDARDDATA_OBJID
or
When Information
Can Be Retrieved
See Section 4.5.1,
“Retrieving
Nonstandard Data
From Protocol
Messages
(H.323)”, on
page 145 for more
information.
(see note 4)
IPSET_NONSTANDARDDATA
• IPPARM_
NONSTANDARDDATA_DATA
and either
• IPPARM_
NONSTANDARDDATA_OBJID
or
See Section 4.5.1,
“Retrieving
Nonstandard Data
From Protocol
Messages
(H.323)”, on
page 145 for more
information.
IPSET_CALLINFO
• IPPARM_PHONELIST
User to User
Information
IPSET_CALLINFO
Vendor
Product ID
IPSET_VENDORINFO
Vendor
Version ID
IPSET_VENDORINFO
H.221
Nonstandard
Information
IPSET_VENDORINFO
• IPPARM_USERUSER_INFO
• IPPARM_
VENDOR_PRODUCT_ID
• IPPARM_
VENDOR_VERSION_ID
• IPPARM_H221NONSTD
H.323
only
Uint[ ], max length = 40
String, max length =
max_parm_data_size
H.323
only
Uint[ ], max length = 40
sizeof(
IP_
H221NONSTANDARD)
• IPPARM_H221NONSTANDARD
Phone List
String, max length =
max_parm_data_size
SIP/
H.323
sizeof(
IP_
H221NONSTANDARD)
• IPPARM_H221NONSTANDARD
Nonstandard
Data
Datatype in
value_buf Field
(see Note 1)
Any state after
Offered or
Proceeding
char*,
max. length = 131
both
Any state after
Offered or
Proceeding
char*, max. length =
MAX_USERUSER_
INFO_LENGTH (131
octets)
H.323
only
Any state after
Offered or
Proceeding
char*, max. length =
MAX_PRODUCT_
ID_LENGTH (32)
H.323
only
Any state after
Offered or
Proceeding
char*, max. length
= MAX_VERSION_
ID_LENGTH (32)
H.323
only
Any state after
Offered or
Proceeding
IP_H221_
NONSTANDARD
(see note 4)
H.323
only
Notes:
1. This field is the value_buf field in the GC_PARM_DATA structure associated with the GCEV_EXTENSIONCMPLT event
generated in response to the gc_Extension( ) function requesting the information.
2. Display information, user to user information, phone list, nonstandard data, vendor information and nonstandard control
information, and H221 nonstandard information may not be present.
3.Vendor information is included in a Q931 SETUP message received from a peer.
4. The nonstandard object id and nonstandard data parameters described here refer to nonstandard data contained in a
SETUP message for example. This should not be confused with the nonstandard data included in protocol messages sent
using gc_Extension( ) which can be retrieved from the metaevent associated with a GCEV_EXTENSION event.
If an attempt is made to retrieve information in a state in which the information is not available, no
error is generated. The GC_PARM_BLK associated with the GCEV_EXTENSIONCMPLT event
144
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP-Specific Operations
will not contain the requested information. If phone list and display information are requested and
only phone list is available, then only phone list information is available in the GC_PARM_BLK.
An error is generated if there is an internal error (such as memory cannot be allocated).
All call information is available until a gc_ReleaseCallEx( ) is issued.
4.5.1
Retrieving Nonstandard Data From Protocol Messages
(H.323)
Any received Q.931 message can include Nonstandard Data. The application can use the
gc_Extension( ) function with an ext_id of IPEXTID_GETINFO to retrieve the data while a call is
in any state. The target_type should be GCTGT_GCLIB_CRN and the target_id should be the
actual CRN. The information is included with the corresponding GCEV_EXTENSIONCMPLT
termination event.
Note:
When retrieving nonstandard data, it is only necessary to specify the
IPPARM_NONSTANDARDDATA_DATA parameter ID in the extension request. It is not
necessary to specify the ID for the nonstandard identifier parameter (that is,
IPPARM_NONSTANDARDDATA_OBJID or IPPARM_H221NONSTANDARD). The call
control library ensures that the GCEV_EXTENSIONCMPLT event includes all the correct
information.
When retrieving nonstandard data from the GC_PARM_BLK associated with the
GCEV_EXTENSIONCMPLT event, it is important to use the extended gc_util_..._ex( ) functions
because the IPPARM_NONSTANDARDDATA_DATA parameter is defined to support data that
may be longer than 255 bytes. The actual maximum data length is configured by the application via
the max_parm_data_size field in the IPCCLIB_START_DATA structure when it initializes the
library; the default size is 255, but the application can set any value up to 4096.
4.5.2
Examples of Retrieving Call-Related Information
The following code demonstrates how to do the following:
• create a structure that identifies which information should be retrieved, then use the
gc_Extension( ) with an extID of IPEXTID_GETINFO to issue the request
• extract the data from a structure associated with the GCEV_EXTENSIONCMPLT event
received as a termination event to the gc_Extension( ) function
Similar code can be used when using SIP, except that the code must include only information
parameters supported by SIP (see Table 4, “Retrievable Call Information”, on page 143).
Specifying Call-Related Information to Retrieve
The following function shows how an application can construct and send a request to retrieve callrelated information.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
145
IP-Specific Operations
int getInfoAsync(CRN crn)
{
GC_PARM_BLKP gcParmBlk = NULL;
GC_PARM_BLKP retParmBlk;
int frc;
frc = gc_util_insert_parm_val(&gcParmBlk,
IPSET_CALLINFO,
IPPARM_PHONELIST,
sizeof(int),1);
if (GC_SUCCESS != frc)
{
return GC_ERROR;
}
frc = gc_util_insert_parm_val(&gcParmBlk,
IPSET_CALLINFO,
IPPARM_CALLID,
sizeof(int),1);
if (GC_SUCCESS != frc)
{
return GC_ERROR;
}
frc = gc_util_insert_parm_val(&gcParmBlk,
IPSET_CONFERENCE,
IPPARM_CONFERENCE_ID,
sizeof(int),1);
if (GC_SUCCESS != frc)
{
return GC_ERROR;
}
frc = gc_util_insert_parm_val(&gcParmBlk,
IPSET_CONFERENCE,
IPPARM_CONFERENCE_GOAL,
sizeof(int),1);
if (GC_SUCCESS != frc)
{
return GC_ERROR;
}
frc = gc_util_insert_parm_val(&gcParmBlk,
IPSET_CALLINFO,
IPPARM_DISPLAY,
sizeof(int),1);
if (GC_SUCCESS != frc)
{
return GC_ERROR;
}
frc = gc_util_insert_parm_val(&gcParmBlk,
IPSET_CALLINFO,
IPPARM_USERUSER_INFO,
sizeof(int),1);
if (GC_SUCCESS != frc)
{
return GC_ERROR;
}
146
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP-Specific Operations
frc = gc_util_insert_parm_val(&gcParmBlk,
IPSET_VENDORINFO,
IPPARM_VENDOR_PRODUCT_ID,
sizeof(int),1);
if (GC_SUCCESS != frc)
{
return GC_ERROR;
}
frc = gc_util_insert_parm_val(&gcParmBlk,
IPSET_VENDORINFO,
IPPARM_VENDOR_VERSION_ID,
sizeof(int),1);
if (GC_SUCCESS != frc)
{
return GC_ERROR;
}
frc = gc_util_insert_parm_val(&gcParmBlk,
IPSET_VENDORINFO,
IPPARM_H221NONSTD,
sizeof(int),1);
if (GC_SUCCESS != frc)
{
return GC_ERROR;
}
frc = gc_util_insert_parm_val(&gcParmBlk,/* NS Data: setting this IPPARM implies
retrieval of the complete element */
IPSET_NONSTANDARDDATA,
IPPARM_NONSTANDARDDATA_DATA,
sizeof(int),1);
if (GC_SUCCESS != frc)
{
return GC_ERROR;
}
frc = gc_util_insert_parm_val(&gcParmBlk,/* NS Control: setting this IPPARM implies
retrieval of the complete element */
IPSET_NONSTANDARDCONTROL,
IPPARM_NONSTANDARDDATA_DATA,
sizeof(int),1);
if (GC_SUCCESS != frc)
{
return GC_ERROR;
}
frc = gc_Extension(GCTGT_GCLIB_CRN,
crn,
IPEXTID_GETINFO,
gcParmBlk,
&retParmBlk,
EV_ASYNC);
if (GC_SUCCESS != frc)
{
return GC_ERROR;
}
gc_util_delete_parm_blk(gcParmBlk);
return GC_SUCCESS;
}
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
147
IP-Specific Operations
Extracting Call-Related Information Associated with an Extension
Event
The following code demonstrates how an application can extract call information when a
GCEV_EXTENSIONCMPLT event is received as a result of a request for call-related information.
int OnExtensionAndComplete(GC_PARM_BLKP parm_blk,CRN crn)
{
GC_PARM_DATA *parmp = NULL;
parmp = gc_util_next_parm(parm_blk,parmp);
if (!parmp)
{
return GC_ERROR;
}
while (NULL != parmp)
{
switch (parmp->set_ID)
{
case IPSET_CALLINFO:
switch (parmp->parm_ID)
{
case IPPARM_DISPLAY:
if(parmp->value_size != 0)
{
printf("\tReceived extension data DISPLAY: %s\n", parmp->value_buf);
}
break;
case IPPARM_CALLID:
/* print the Call ID in parmp->value_buf as array of bytes */
for (int count = 0; count < parmp->value_size; count++)
{
printf("0x%2X ", value_buf[count]);
}
break;
case IPPARM_USERUSER_INFO:
if(parmp->value_size != 0)
{
printf("\tReceived extension data UUI: %s\n", parmp->value_buf);
}
break;
case IPPARM_PHONELIST:
if(parmp->value_size != 0)
{
printf("\tReceived extension data PHONELIST: %s\n",
parmp->value_buf);
}
break;
default:
printf("\tReceived unknown CALLINFO extension parmID %d\n",
parmp->parm_ID);
break;
}/* end switch (parmp->parm_ID) for IPSET_CALLINFO */
break;
case IPSET_CONFERENCE:
switch (parmp->parm_ID)
{
case IPPARM_CONFERENCE_GOAL:
if(parmp->value_size != 0)
148
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP-Specific Operations
{
printf("\tReceived extension data IPPARM_CONFERENCE_GOAL: %d\n",
(unsigned int)(*(parmp->value_buf)));
}
break;
case IPPARM_CONFERENCE_ID:
if(parmp->value_size != 0)
{
printf("\tReceived extension data IPPARM_CONFERENCE_ID: %s\n",
parmp->value_buf);
}
break;
default:
printf("\tReceived unknown CONFERENCE extension parmID %d\n",
parmp->parm_ID);
break;
}
break;
case IPSET_VENDORINFO:
switch (parmp->parm_ID)
{
case IPPARM_VENDOR_PRODUCT_ID:
if(parmp->value_size != 0)
{
printf("\tReceived extension data
}
break;
case IPPARM_VENDOR_VERSION_ID:
if(parmp->value_size != 0)
{
printf("\tReceived extension data
}
break;
PRODUCT_ID %s\n", parmp->value_buf);
VERSION_ID %s\n", parmp->value_buf);
case IPPARM_H221NONSTD:
{
if(parmp->value_size == sizeof(IP_H221NONSTANDARD))
{
IP_H221NONSTANDARD *pH221NonStandard;
pH221NonStandard = (IP_H221NONSTANDARD *)(&(parmp->value_buf));
printf("\tReceived extension data VENDOR H221NONSTD:
CC=%d, Ext=%d, MC=%d\n",
pH221NonStandard->country_code,
pH221NonStandard->extension,
pH221NonStandard->manufacturer_code);
}
}
break;
default:
printf("\tReceived unknown VENDORINFO extension parmID %d\n",
parmp->parm_ID);
break;
}/* end switch (parmp->parm_ID) for IPSET_VENDORINFO */
break;
case IPSET_NONSTANDARDDATA:
switch (parmp->parm_ID)
{
case IPPARM_NONSTANDARDDATA_DATA:
printf("\tReceived extension data (NSDATA) DATA: %s\n", parmp->value_buf);
break;
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
149
IP-Specific Operations
case IPPARM_NONSTANDARDDATA_OBJID:
printf("\tReceived extension data (NSDATA) OBJID: %s\n", parmp->value_buf);
break;
case IPPARM_H221NONSTANDARD:
{
if(parmp->value_size == sizeof(IP_H221NONSTANDARD))
{
IP_H221NONSTANDARD *pH221NonStandard;
pH221NonStandard = (IP_H221NONSTANDARD *)(&(parmp->value_buf));
printf("\tReceived extension data (NSDATA) h221:CC=%d, Ext=%d, MC=%d\n",
pH221NonStandard->country_code,
pH221NonStandard->extension,
pH221NonStandard->manufacturer_code);
}
}
break;
default:
printf("\tReceived unknown (NSDATA) extension parmID %d\n",
parmp->parm_ID);
break;
}
break;
case IPSET_NONSTANDARDCONTROL:
switch (parmp->parm_ID)
{
case IPPARM_NONSTANDARDDATA_DATA:
printf("\tReceived extension data (NSCONTROL) DATA: %s\n",
parmp->value_buf);
break;
case IPPARM_NONSTANDARDDATA_OBJID:
printf("\tReceived extension data (NSCONTROL) OBJID: %s\n",
parmp->value_buf);
break;
case IPPARM_H221NONSTANDARD:
{
if(parmp->value_size == sizeof(IP_H221NONSTANDARD))
{
IP_H221NONSTANDARD *pH221NonStandard;
pH221NonStandard = (IP_H221NONSTANDARD *)(&(parmp->value_buf));
printf("\tReceived extension data (NSCONTROL) h221:CC=%d, Ext=%d, MC=%d\n",
pH221NonStandard->country_code,
pH221NonStandard->extension,
pH221NonStandard->manufacturer_code);
}
}
break;
default:
printf("\tReceived unknown (NSCONTROL) extension parmID %d\n",
parmp->parm_ID);
break;
}
break;
150
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP-Specific Operations
case IPSET_MSG_Q931:
switch (parmp->parm_ID)
{
case IPPARM_MSGTYPE:
switch ((*(int *)(parmp->value_buf)))
{
case IP_MSGTYPE_Q931_FACILITY:
printf("\tReceived extension data IP_MSGTYPE_Q931_FACILITY\n");
break;
default:
printf("\tReceived unknown MSG_Q931 extension parmID %d\n",
parmp->parm_ID);
break;
} /* end switch ((int)(parmp->value_buf)) */
break;
}/* end switch (parmp->parm_ID) for IPSET_MSG_Q931 */
break;
case IPSET_MSG_H245:
switch (parmp->parm_ID)
{
case IPPARM_MSGTYPE:
switch ((*(int *)(parmp->value_buf)))
{
case IP_MSGTYPE_H245_INDICATION:
printf("\tReceived extension data IP_MSGTYPE_H245_INDICATION\n");
break;
default:
printf("\tReceived unknown MSG_H245 extension parmID %d\n",
parmp->parm_ID);
break;
}/* end switch ((int)(parmp->value_buf)) */
break;
}/* end switch (parmp->parm_ID) for IPSET_MSG_H245 */
break;
default:
printf("\t Received unknown extension setID %d\n",parmp->set_ID);
break;
}/* end switch (parmp->set_ID) */
parmp = gc_util_next_parm(parm_blk,parmp);
}
return GC_SUCCESS;
}
Note:
IPPARM_CALLID is a set of bytes and should not be interpreted as a string.
Retrieving Call ID
The following code example illustrates how to request Call ID information via a gc_Extension( )
call.
/*
* Assume the following has been done:
* 1. device has been opened (e.g. :N_iptB1T1:P_SIP, :N_iptB1T2:P_SIP, etc...)
* 2. gc_WaitCall() has been issued to wait for a call.
* 3. gc_GetMetaEvent() or gc_GetMetaEventEx() (Windows) has been called
*
to convert the event into metaevent.
* 4. a GCEV_OFFERED has been detected.
*/
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
151
IP-Specific Operations
#include
#include
#include
#include
#include
<stdio.h>
<srllib.h>
<gclib.h>
<gcerr.h>
<gcip.h>
/*
* Assume the 'crn' parameter holds the CRN associated
* with the detected GCEV_OFFERED event.
*/
int request_call_info(CRN crn)
{
int retval = GC_SUCCESS;
GC_PARM_BLKP parmblkp = NULL; /* input parameter block pointer */
GC_PARM_BLKP retblkp = NULL;
/* pointer for output parameter block (unused) */
GC_INFO gc_error_info;
/* GlobalCall error information data */
/* allocate GC_PARM_BLK for Call-ID message parameter */
gc_util_insert_parm_val(&parmblkp, IPSET_CALLINFO, IPPARM_CALLID, sizeof(int), 1);
if (parmblkp == NULL)
{
/* memory allocation error */
return(-1);
}
/* retrieve the Call-ID from the network */
if (gc_Extension(GCTGT_GCLIB_CRN, crn, IPEXTID_GETINFO, parmblkp, &retblkp,
EV_ASYNC) != GC_SUCCESS)
{
/* process error return as shown */
gc_ErrorInfo( &gc_error_info );
printf ("Error: gc_Extension() on crn: 0x%lx, GC ErrorValue: 0x%hx - %s,
CCLibID: %i - %s, CC ErrorValue: 0x%lx - %s\n",
crn, gc_error_info.gcValue, gc_error_info.gcMsg, gc_error_info.ccLibId,
gc_error_info.ccLibName, gc_error_info.ccValue, gc_error_info.ccMsg);
}
/* free the parameter block */
gc_util_delete_parm_blk(parmblkp);
return (retval);
}
Parsing Call ID Information (SIP Protocol)
The following code example illustrates how to parse the Call ID information retrieved via a
gc_Extension( ) call when the SIP protocol is being used.
/*
* Assume the following has been done:
* 1. device has been opened (e.g. :N_iptB1T1:P_SIP, :N_iptB1T2:P_SIP, etc...)
* 2. gc_GetMetaEvent() or gc_GetMetaEventEx() (Windows) has been called
*
to convert the event into metaevent.
* 3. a GCEV_EXTENSIONCMPLT has been detected.
*/
#include
#include
#include
#include
#include
<stdio.h>
<srllib.h>
<gclib.h>
<gcerr.h>
<gcip.h>
/* Assume the 'crn' parameter holds the CRN associated with the detected GCEV_EXTENSIONCMPLT
* event, and the 'pEvt' parameter holds a pointer to the detected metaevent.
*/
152
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP-Specific Operations
int print_call_info(CRN crn, METAEVENT *pEvt)
{
EXTENSIONEVTBLK *ext_data = NULL;
GC_PARM_DATA *parmp = NULL;
GC_PARM_BLK *parm_blkp;
if (pEvt)
{
if (pEvt->evttype == GCEV_EXTENSIONCMPLT)
{
ext_data = (EXTENSIONEVTBLK *)(pEvt->extevtdatap);
}
}
if (!ext_data)
{
printf("\tNot a GCEV_EXTENSIONCMPLT event.\n");
return GC_ERROR;
}
parm_blk = &(ext_data->parmblk);
parmp = gc_util_next_parm(parm_blkp,parmp);
if (!parmp)
{
printf("\tNo data returned in extension event for crn: 0x%lx\n", crn);
return GC_ERROR;
}
while (NULL != parmp)
{
switch (parmp->set_ID)
{
case IPSET_CALLINFO:
switch (parmp->parm_ID)
{
case IPPARM_CALLID:
if(parmp->value_size != 0)
{
/* Here's where we print the SIP Call ID */
printf("\tReceived extension data IPPARM_CALLID: %s\n",
parmp->value_buf);
}
break;
default:
printf("\tReceived unexpected IPSET_CALLINFO parmID %d\n",
parmp->parm_ID);
break;
} /* end switch (parmp->parm_ID) */
break;
default:
printf("\t Received unexpected extension setID %d\n",
parmp->set_ID);
break;
} /* end switch (parmp->set_ID) */
parmp = gc_util_next_parm(parm_blkp,parmp);
} /* end while (parmp != NULL) */
return GC_SUCCESS;
}
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
153
IP-Specific Operations
4.6
Receiving Notification Events
Note:
The information in this section only applies when the Dialogic® Global Call API IP call control
library is started in the first party call control (1PCC) operating mode. The extension events that
provides the capabilities described in this section are not supported when the library is started in
the third party call control (3PCC) operating mode.
The Global Call library allows applications to receive unsolicited notification events for several
different types of state changes and other transition events.
This section includes the following topics:
• Enabling and Disabling Unsolicited Notification Events
• Getting Media Streaming Status and Connection Information
• Getting Notification of Underlying Protocol State Changes
4.6.1
Enabling and Disabling Unsolicited Notification Events
The application can enable and disable the unsolicited GCEV_EXTENSION notification events
associated with certain types of transition events, including:
• media streaming connection state changes (see Section 4.6.2, “Getting Media Streaming
Status and Connection Information”)
• underlying protocol (Q.931 and H.245) connection state changes (see Section 4.6.3, “Getting
Notification of Underlying Protocol State Changes”)
• DTMF digit detection (see Section 4.16.2, “Getting Notification of DTMF Detection”, on
page 240)
Enabling and disabling unsolicited GCEV_EXTENSION notification events is done by
manipulating the event mask, which has a default value of zero, using the gc_SetConfigData( )
function. The relevant gc_SetConfigData( ) function parameter values in this context are:
• target_type – GCTGT_CCLIB_NETIF
• target_id – IPT board device
• size – set to a value of GC_VALUE_LONG
• target_datap – a pointer to a GC_PARM_BLK structure that contains the parameters to be
configured
The GC_PARM_BLK should contain a parameter element with the
IPSET_EXTENSIONEVT_MSK set ID and one of the following parameter IDs:
GCACT_ADDMSK
Add an event to the mask
GCACT_SUBMSK
Remove an event from the mask
GCACT_SETMSK
Set the mask to a specific value
154
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP-Specific Operations
Possible values (corresponding to events that can be added or removed from the mask are) are:
EXTENSIONEVT_DTMF_ALPHANUMERIC
For notification of DTMF digits received in User Input Indication (UII) messages with
alphanumeric data. When using SIP, this value is not applicable.
EXTENSIONEVT_SIGNALING_STATUS
For notification of intermediate protocol state changes in signaling (in H.323, for example,
Q.931 Connected and Disconnected) and control (in H.323, for example, H.245 Connected
and Disconnected).
EXTENSIONEVT_STREAMING_STATUS
For notification of the status and configuration information of transmit or receive directions of
media streaming including: Tx Connected, Tx Disconnected, Rx Connected, and Rx
Disconnected.
4.6.2
Getting Media Streaming Status and Connection
Information
The application can receive notification of changes in the status (connection and disconnection) of
media streaming in the transmit and receive directions as GC_EXTENSIONEVT events. When the
event is a notification of the connection of the media stream in either direction, information about
the coders negotiated for that direction and the local and remote RTP addresses is also available.
The events for this notification must be enabled by setting or adding the bitmask value
EXTENSIONEVT_SIGNALING_STATUS to the GC_EXTENSIONEVT mask; see Section 4.6.1,
“Enabling and Disabling Unsolicited Notification Events”, on page 154. Once the events are
enabled, when a media streaming connection state changes, the application receives a
GCEV_EXTENSION event. The EXTENSIONEVTBLK structure pointed to by the extevtdatap
pointer within the GCEV_EXTENSION event will contain the following information for all media
streaming status changes:
extID
IPEXTID_MEDIAINFO
parmblk
A GC_PARM_BLK containing the protocol connection status with the
IPSET_MEDIA_STATE parameter set ID and one of the following parameter IDs:
• IPPARM_TX_CONNECTED – Media streaming has been initiated in transmit direction.
The parameter value is an IP_CAPABILITY structure containing the coder configuration
that resulted from the capability exchange with the remote peer.
• IPPARM_TX_DISCONNECTED – Media streaming has been terminated in transmit
direction. No parameter value is used with this parameter ID.
• IPPARM_RX_CONNECTED – Media streaming has been initiated in receive direction.
The parameter value is an IP_CAPABILITY structure containing the coder configuration
that resulted from the capability exchange with the remote peer.
• IPPARM_RX_DISCONNECTED – Media streaming has been terminated in receive
direction. No parameter value is used with this parameter ID.
• IPPARM_TX_SENDONLY – Media streaming has been initiated for a half-duplex
transmit-only connection. The parameter value is an IP_CAPABILITY structure
containing the coder configuration that resulted from the capability exchange with the
remote peer.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
155
IP-Specific Operations
• IPPARM_RX_RECVONLY – Media streaming has been initiated for a half-duplex
receive-only connection. The parameter value is an IP_CAPABILITY structure containing
the coder configuration that resulted from the capability exchange with the remote peer.
• IPPARM_TX_INACTIVE – Media streaming in the transmit direction has been
suspended. The parameter value is an IP_CAPABILITY structure containing the coder
configuration that resulted from the capability exchange with the remote peer.
• IPPARM_RX_INACTIVE – Media streaming in the receive direction has been
suspended. The parameter value is an IP_CAPABILITY structure containing the coder
configuration that resulted from the capability exchange with the remote peer.
When the parameter value in the GC_PARM_BLK structure is IPPARM_TX_CONNECTED,
indicating that a transmit media stream connection has occurred, the GC_PARM_BLK structure
will also contain the local and remote RTP addresses. These addresses are handled as an
RTP_ADDR data structure, which contains both the port number and the IP address. The parameter
set ID used for the RTP addresses is IPSET_RTP_ADDRESS, and the parameter IDs are
IPPARM_LOCAL and IPPARM_REMOTE.
RTP Address and Coder Information Retrieval Example
The following code snippet illustrates how to retrieve the RTP addresses and negotiated coder
information from a media stream connection event:
//When the event is an extension event:
GC_PARM_BLKP
gcParmBlk;
EXTENSIONEVTBLK *pextensionBlk;
GC_PARM_DATA
*parmp = NULL;
RTP_ADDR
l_RTA1,l_RTA2;
pextensionBlk = (EXTENSIONEVTBLK *)(m_pMetaEvent->extevtdatap);
gcParmBlk = (&(pextensionBlk->parmblk));
GC_PARM_DATAP l_pParmData;
IP_CAPABILITYl_IPCap;
switch(pextensionBlk->ext_id)
{
case IPEXTID_MEDIAINFO:
//get the coder info:
l_pParmData = gc_util_find_parm(gcParmBlk, IPSET_MEDIA_STATE, IPPARM_TX_CONNECTED);
if(l_pParmData != NULL)
{
memcpy(&l_IPCap, l_pParmData->value_buf, l_pParmData->value_size);
// get the local RTP address:
l_pParmData= gc_util_find_parm(gcParmBlk, IPSET_RTP_ADDRESS, IPPARM_LOCAL);
if(l_pParmData!= NULL)
{
memcpy(&l_RTA1,l_pParmData->value_buf,l_pParmData->value_size);
}
//get the remote RTP address:
l_pParmData =gc_util_find_parm(gcParmBlk, IPSET_RTP_ADDRESS, IPPARM_REMOTE);
if(l_pParmData != NULL)
{
memcpy(&l_RTA2, l_pParmData->value_buf, l_pParmData->value_size);
}
}
156
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP-Specific Operations
else
{
//only get tx or rx, not both
l_pParmData = gc_util_find_parm(gcParmBlk, IPSET_MEDIA_STATE, IPPARM_RX_CONNECTED);
if(l_pParmData != NULL)
{
memcpy(&l_IPCap, l_pParmData->value_buf, l_pParmData->value_size);
}
}
}
4.6.3
Getting Notification of Underlying Protocol State Changes
The application can receive notification of intermediate protocol signaling state changes for both
H.323 and SIP. The events for this notification must be enabled; see Section 4.6.1, “Enabling and
Disabling Unsolicited Notification Events”, on page 154.
Once these events are enabled, when a protocol state change occurs, the application receives a
GCEV_EXTENSION event. The EXTENSIONEVTBLK structure pointed to by the extevtdatap
pointer within the GCEV_EXTENSION event will contain the following information:
extID
IPEXTID_IPPROTOCOL_STATE
parmblk
A GC_PARM_BLK containing the protocol connection status with the
IPSET_IPPROTOCOL_STATE parameter set ID and one of the following parameter IDs:
• IPPARM_SIGNALING_CONNECTED – The signaling for the call has been established
with the remote endpoint. For example, in H.323, a CONNECT message was received by
the caller or a CONNECTACK message was received by the callee.
• IPPARM_SIGNALING_DISCONNECTED – The signaling for the call has been
terminated with the remote endpoint. For example, in H.323, a RELEASE message was
received by the terminator or a RELEASECOMPLETE message was received by peer.
• IPPARM_CONTROL_CONNECTED – Media control signaling for the call has been
established with the remote endpoint. For example, in H.323, an OpenLogicalChannel
message (for the receive direction) or an OpenLogicalCahnnelAck message (for the
transmit direction) was received.
• IPPARM_CONTROL_DISCONNECTED – Media control signaling for the call has been
terminated. For example, in H.323, an EndSession message was received.
Note: The parameter value field in this GC_PARM_BLK in each case is unused (NULL).
4.7
Modifying an Existing SIP Call via re-INVITE
This section discusses the Dialogic® Global Call API implementation of the SIP re-INVITE
method as it applies to first party call control (1PCC). The use of re-INVITE in the context of third
party call control (3PCC) is discussed in Chapter 5, “Third Party Call Control (3PCC) Operations
and Multimedia Support”.
This section includes the following topics:
• Overview of the SIP re-INVITE Method
• Enabling Application Access to re-INVITE Requests
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
157
IP-Specific Operations
• Receiving SIP re-INVITE Requests
• Responding to SIP re-INVITE Requests
• Sending a SIP re-INVITE Request
• Canceling a Pending re-INVITE Request
• Updating Dialog Properties via re-INVITE
• Implementing Hold and Retrieve via SIP re-INVITE
4.7.1
Overview of the SIP re-INVITE Method
RFC 3261 specifies that User Agents must be able to send and respond to additional INVITE
requests after a dialog has been established to allow modification of the dialog or the media
session. These subsequent INVITE requests in an existing dialog are known as re-INVITE requests
to distinguish them from an initial INVITE request that initiates a new dialog. Re-INVITE requests
contain the same Call-ID and To and From tags as the original INVITE request that established the
dialog. Either party in a dialog can issue a re-INVITE, and only one re-INVITE can be pending at
any given time.
The re-INVITE method is a general purpose mechanism that potentially can be used to modify or
update nearly any property of a dialog (notably excluding the header fields that are used to identify
the message as a subsequent INVITE rather than a new INVITE) or the associated media session.
But it is important to note that different IP telephony platforms support re-INVITE requests to
varying degrees. For example, some platforms may only support changing the RTP address while
others may also support changing the direction(s) of media streaming or even the codec
characteristics. Each endpoint has to determine whether it supports the changes requested in a reINVITE, and whether it wishes to accept requests that it supports. An endpoint must reject any reINVITE request that it does not support, and may optionally reject any re-INVITE request for any
reason whatsoever.
In first party call control mode (1PCC), the Dialogic® Global Call API library for Dialogic® Host
Media Processing Software supports the following capabilities for re-INVITE, which are described
in detail in the subsections of this section:
• specifying, changing, or refreshing header field values or parameters for the existing dialog;
for example, refreshing expiring Contact information
• changing the DTMF mode
• changing the direction of the streaming; for example, changing from half-duplex to full-duplex
streaming
• suspending and resuming streaming to implement hold and retrieve functionality
• changing the RTP port of the remote endpoint
Note: Global Call does not provide a mechanism for initiating an RTP port change, but
Global Call applications can receive and act on port change requests received from
non-Global Call applications.
• changing coder properties of the media session; for example, changing from a low bit-rate
coder to reduce resource requirements
158
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP-Specific Operations
• changing between audio and T.38 fax modes
Note: The existing automatic and manual modes for audio/T.38 switching (as described in
Section 4.26, “T.38 Fax Server”) have used re-INVITE “under the hood” when using
the SIP protocol. But when an application has enabled access to re-INVITE requests,
audio/T.38 fax mode changes must be handled explicitly by the application, just like
any other re-INVITE requests.
4.7.2
Enabling Application Access to re-INVITE Requests
Note:
Access to re-INVITE messages must be enabled as described in this section in both 1PCC and
3PCC operating modes.
For backwards compatibility in 1PCC mode, the default behavior of the Dialogic® Global Call API
library is to automatically reject all re-INVITE requests it receives that are not related to T.38, and
to do so without notifying the application.
In order to have access to received SIP re-INVITE requests, applications must set a specific
parameter value using the Global Call gc_SetConfigData( ) function. To enable the
GCEV_REQ_MODIFY_CALL event type that is used to notify applications of re-INVITE
requests, the application must include the following parameter element in the GC_PARM_BLK
that it passes to the gc_SetConfigData( ) function:
IPSET_CONFIG
IPPARM_OPERATING_MODE
• value = IP_T38_MANUAL_MODIFY_MODE
The following code snippet illustrates how to set this parameter:
GC_PARM_BLKP parmblkp = NULL;
long request_id = 0;
gc_util_insert_parm_val(&parmblkp,
IPSET_CONFIG,
IPPARM_OPERATING_MODE,
sizeof(int),
IP_T38_MANUAL_MODIFY_MODE);
if (gc_SetConfigData(GCTGT_CCLIB_NETIF, boardDev, parmblkp, 0 /*timeout*/,
GCUPDATE_IMMEDIATE, &request_id, EV_ASYNC) != GC_SUCCESS)
{
// handle error…
}
In addition to enabling the GCEV_REQ_MODIFY_CALL event for access to received re-INVITE
requests, this parameter setting also enables the three gc_xxxModifyMedia( ) APIs that support reINVITE functionality. Unless this parameter value is set, any attempt to call one of the
gc_xxxModifyMedia( ) functions will fail with an IPERR_BAD_PARM error code.
4.7.3
Receiving SIP re-INVITE Requests
This section focuses primarily on library behavior in 1PCC operating mode. In 3PCC, the
application is responsible for parsing and SDP offers and constructing SDP answers.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
159
IP-Specific Operations
RFC3261 specifies that either party in a SIP dialog can initiate a re-INVITE transaction, so Global
Call applications must be able to receive and handle incoming re-INVITE requests whenever
application access to re-INVITE is enabled.
When the IP Call Control Library receives a re-INVITE request, the library first examines the
request to determine whether it specifies media properties that are acceptable by the local endpoint.
If the received re-INVITE request specifies media capabilities that are not supported by the local
system, the library automatically sends a 488 Not Acceptable Here response to the requesting party
and generates a GCEV_REQ_MODIFY_UNSUPPORTED event to the application. This
unsolicited event contains a CCLIB cause code of IPEC_SIPReasonStatus488NotAcceptableHere.
This event is sent for informational purposes only; the library has already sent the appropriate
response to the remote UA, so the local application does not need to take any action upon receiving
this informational event.
If the received re-INVITE request does not contain an SDP offer, or if it contains an SDP offer that
specifies media capabilities that are supported by the local media device, the call control library
automatically sends a 100 Trying response to the requester and generates an unsolicited
GCEV_REQ_MODIFY_CALL event to notify the application. The METAEVENT associated with
this event contains a pointer to a GC_PARM_BLK structure that the library has populated with the
following information from the re-INVITE request:
• a parameter element that indicates the DTMF mode
• parameter elements for any SIP header fields that the application has registered to receive (as
described in Section 4.9.4, “Registering SIP Header Fields to be Retrieved”, on page 180)
• one or more parameter elements that contain media session properties that were specified in
the received SDP offer (if there was one)
• a parameter element that contains the remote RTP transport address from the received SDP
offer (if there was one)
The DTMF mode specified in the re-INVITE may or may not match the properties of the current
session. It is the application’s responsibility to determine whether the DTMF mode is different
from the current mode, and to decide whether any change being proposed is acceptable. The DTMF
mode is contained in a parameter element of the type:
IPSET_DTMF
IPPARM_SUPPORT_DTMF_BITMASK
• value = IP_DTMF_TYPE_INBAND_RTP or IP_DTMF_TYPE_RFC_2833
The parameter elements associated with the Call-ID, To, and From headers will contain the same
values that were used in the original INVITE request that established the dialog. All other header
fields and parameters have potentially been changed, and it is the application’s responsibility to
parse and compare the values if appropriate. The header fields that the application has registered to
receive are reported in parameter elements of the following type:
IPSET_SIP_MSGINFO
IPPARM_SIP_HDR
• value = complete header string, including name, value, and any parameters
If the re-INVITE request contains an SDP offer, the media capabilities proposed in the offer may or
may not match the properties of the current media session. It is the application’s responsibility to
analyze the media properties proposed in the SDP offer, to determine whether the properties are
160
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP-Specific Operations
different from the current session properties, and to decide whether any proposed change is
acceptable.
The GC_PARM_BLOCK that is associated with the GCEV_REQ_MODIFY_CALL event may
contain any number of parameter elements which identify the supported media properties that were
proposed in the request. Each proposed media capability is handled as a parameter element of the
following type:
GCSET_CHAN_CAPABILITY
IPPARM_LOCAL_CAPABILITY
• value = IP_CAPABILITY data structure
The number of these parameter elements depends on the specifics of what change the re-INVITE is
requesting:
• If the SDP offer in the re-INVITE is proposing a full-duplex media session, there will be a pair
of GCSET_CHAN_CAPABILITY/IPPARM_LOCAL_CAPABILITY parameter elements for
each proposed media capability that is supported on the local platform, one element for each
direction. Within each parameter pair, all fields of the of the IP_CAPABILITY structure will
be the same except for the direction fields, one of which will be IP_CAP_DIR_LCLRECEIVE
and the other IP_CAP_DIR_LCLTRANSMIT.
• If the SDP offer in the re-INVITE is proposing a half-duplex media session, there may be only
a single GCSET_CHAN_CAPABILITY/ IPPARM_LOCAL_CAPABILITY element in the
parameter block, although multiple elements are possible if multiple coders are being
proposed. Within each parameter element, the IP_CAPABILITY.direction field will be either
IP_CAP_DIR_LCLRECVONLY or IP_CAP_DIR_LCLSENDONLY.
• If the SDP offer in the re-INVITE is seeking to suspend streaming (to place the call on hold,
for example), there may be only a single GCSET_CHAN_CAPABILITY/
IPPARM_LOCAL_CAPABILITY element in the parameter block, although multiple
elements are possible. When the re-INVITE is requesting to suspend streaming, the
IP_CAPABILITY.direction field will be set to either IP_CAP_DIR_LCLRTPINACTIVE or
IP_CAP_DIR_LCLRTPRTCPINACTIVE.
• If the SDP offer in the re-INVITE is proposing a change from audio mode to T.38 fax mode,
there will be only one GCSET_CHAN_CAPABILITY/ IPPARM_LOCAL_CAPABILITY
element in the parameter block. Within this element, the IP_CAPABILITY.capability field will
be GCCAP_DATA_t38UDPFax and the IP_CAPABILITY.direction field will be
IP_CAP_DIR_LCLTXRX.
Finally, The GC_PARM_BLK will include a parameter element that contains the remote RTP
transport address, which may be the same as the existing address or may be different. It is the
application’s responsibility to compare the address to determine whether it is different and whether
the proposed change is acceptable.
The RTP transport address is handled as a parameter element of the following type:
IPSET_RTP_ADDRESS
IPPARM_REMOTE
• value = RTP_ADDR data structure
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
161
IP-Specific Operations
There will always be at least one of these parameter elements if the re-INVITE request contains an
SDP offer (which is the typical case for re-INVITE requests).
Note:
4.7.4
SDP does not explicitly communicate RTCP port addresses, but these can be inferred from RTP
addresses according to the “plus one” offset convention.
Responding to SIP re-INVITE Requests
This section focuses primarily on library behavior in 1PCC operating mode. In 3PCC, the
application is responsible for constructing the SDP answer.
After an application has received an unsolicited GCEV_REQ_MODIFY_CALL event that signals
reception of a re-INVITE request, and has retrieved and analyzed the parameter elements from the
GC_PARM_BLK associated with the METAEVENT, it is able to accept or reject the proposed
change by calling the appropriate Global Call API.
4.7.4.1
Rejecting a SIP re-INVITE Request
When an application determines that it is unable to or does not wish to accept the changes that were
proposed in a received re-INVITE request, it simply calls the gc_RejectModifyCall( ) function to
send a final response message with the specified 3xx–6xx reason code. The reason code to send is
specified using the appropriate IPEC_SIPReasonStatus… defines as defined in gcip_defs.h and
documented in Section 11.5, “Failure Response Codes When Using SIP”, on page 584.
When the remote user agent acknowledges the rejection response, the library generates a
GCEV_REJECT_MODIFY_CALL completion event to notify the application and the media
session continues unchanged, just as if a re-INVITE request had never been issued.
If the transmission of the rejection message fails for some reason, the library generates a
GCEV_REJECT_MODIFY_CALL_FAIL event. In the case of such a failure, the re-INVITE
transaction is still in progress, and the application should make another attempt to respond to the
request.
4.7.4.2
Accepting a SIP re-INVITE Request
When an application determines that the changes to the existing dialog or media session that were
proposed in a received re-INVITE request are acceptable, it calls the gc_AcceptModifyCall( )
function to send a 200 OK response. But because the SDP offer contained in a re-INVITE request
may contain more than one session proposal, the application has the opportunity to specify which
proposal it wishes to accept.
If the application calls gc_AcceptModifyCall( ) with a NULL pointer as the parmblkp parameter,
the library uses the codec preferences that were used in the original INVITE dialog to formulate the
SDP response. In this case, if the SDP offer in the re-INVITE proposed a codec that the application
did not indicate as acceptable in the original INVITE dialog, the library treats the situation as a
rejection of the call modification request. In this case, a 488 Not Acceptable Here response is sent
to the remote party to terminate the re-INVITE dialog, and a GCEV_REJECT_MODIFY_CALL
event is sent to the application.
162
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP-Specific Operations
To formulate a specific SDP answer, an application inserts appropriate media capability parameter
elements into the GC_PARM_BLK parameter block that it passes to gc_AcceptModifyCall( ).
Each parameter element is of the following format:
GCSET_CHAN_CAPABILITY
IPPARM_LOCAL_CAPABILITY
• value = IP_CAPABILITY data structure
A full-duplex connection requires two such parameter elements, one for each direction. A halfduplex connection requires one parameter element with the direction field of the IP_CAPABILITY
structure set appropriately.
To accept an on-hold request, the application must insert a parameter element with an
IP_CAPABILITY structure that contains one of the direction values that specifies inactive
streaming. If the application does not specify a capability that matches a proposed capability in the
re-INVITE’s SDP offer, the library treats the situation as a rejection of the modification request,
sends a 488 Not Acceptable Here response to the remote party to terminate the re-INVITE dialog,
and generates a GCEV_REJECT_MODIFY_CALL to the application.
If the re-INVITE request specifies a change in the codec, the library makes the change effective on
the local media platform as soon as the gc_AcceptModifyCall( ) function is called. All further
packets sent by the local media platform will use the new codec, and only packets using the new
codec will be accepted from the remote endpoint. This may cause some audible artifact, such as a
click or a brief silence, if the remote endpoint is not able to synchronize codecs promptly.
When the remote UA acknowledges the 200 OK response, the library generates a
GCEV_ACCEPT_MODIFY_CALL event to notify the application that the re-invite transaction
has completed successfully. If the transmission of the 200 OK message fails for some reason, the
library generates a GCEV_ACCEPT_MODIFY_CALL_FAIL event. In the case of such a failure,
the re-INVITE transaction is still in progress, and the application should make another attempt to
respond to the re-INVITE request.
4.7.5
Sending a SIP re-INVITE Request
This section focuses primarily on library behavior in 1PCC operating mode. In 3PCC, the
application is responsible for constructing the SDP offer that will be contained in the re-INVITE.
To send a SIP re-INVITE request, an application begins by constructing a GC_PARM_BLK that
contains parameter elements for the dialog and media session properties that it wishes to change.
Then the application passes that parameter block in a call to the gc_ReqModifyCall( ) function.
Note that there can be only a single re-INVITE transaction pending at any given time; if there is a
re-INVITE already pending (initiated by either endpoint), calling gc_ReqModifyCall( ) produces
an error result.
If a re-INVITE request times out, the library generates a GCEV_MODIFY_CALL_FAIL event to
the application with a cause value of IPEC_SIPReasonStatus408RequestTimeout. In compliance
with RFC 3261 the 408 timeout condition causes the library to send BYE to terminate the dialog,
and it notifies the application of this termination with a GCEV_DISCONNECTED event.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
163
IP-Specific Operations
The GC_PARM_BLK that the application constructs may contain three types of parameter
elements. There may be an element to specify the DTMF mode, one or more elements to specify
SIP header fields to change in order to update the properties of the dialog (such as the Contact or
Via information), and one or more elements to specify media capabilities to be included in the SDP
offer within the re-INVITE request.
4.7.5.1
Specifying DTMF Mode in a re-INVITE Request
An application may request a change in the DTMF mode in re-INVITE request by inserting a
parameter element of the following type in the GC_PARM_BLK it passes to the
gc_ReqModifyCall( ) function:
IPSET_DTMF
IPPARM_SUPPORT_DTMF_BITMASK
• value = IP_DTMF_TYPE_INBAND_RTP or IP_DTMF_TYPE_RFC_2833
4.7.5.2
Inserting SIP Header Fields in a re-INVITE Request
SIP header fields to be sent in a re-INVITE are specified using the standard technique. The
application simply inserts parameter elements of the following type into the GC_PARM_BLK it
passes to gc_ReqModifyCall( ):
IPSET_SIP_MSGINFO
IPPARM_SIP_HDR
• value = complete header string, including header field name
The header fields are inserted in the SIP message in the same order in which they are inserted into
the GC_PARM_BLK. See Section 4.9.5, “Setting SIP Header Fields for Outbound Messages”, on
page 183 for more details on sending SIP headers.
When setting header fields in SIP re-INVITE requests, there are some restrictions to note:
• Request-URI and Call-ID cannot be set by the application because they are used to identify the
request as a subsequent INVITE request (re-INVITE).
• CSeq cannot be set by the application.
• In the From and To headers, the URI and Tag cannot be changed because they are used to
identify the request as a re-INVITE. In both cases, the Display and some of the URI
parameters can be changed, but the application must ensure that the URI and Tag substrings
that it includes when specifying the header string are identical to those in the original INVITE.
• Max-Forwards can be set by the application, but if the application does not set it the library
automatically sets it to 70.
• Contact and Via can be set by the application, but if the application does not provide them the
library automatically inserts the corresponding header field from the last INVITE or 2xx
response that the application sent in the current dialog.
All other header fields, including proprietary headers, can be set without restriction.
164
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP-Specific Operations
4.7.5.3
Specifying Media Session Properties in a SIP re-INVITE
If an application wishes to change any media session properties via a re-INVITE request, it must
insert appropriate media capability parameter elements into the GC_PARM_BLK that it passes to
gc_ReqModifyCall( ). If there is no need to change media session properties (for example, when
using re-INVITE simply to refresh the Contact information for the dialog), the application can opt
to not include media session property parameter elements in the GC_PARM_BLK, in which case
the library will use the last SDP answer (that is, the current session properties) when it constructs
the re-INVITE.
The parameter elements for media capabilities are of the form:
GCSET_CHAN_CAPABILITY
IPPARM_LOCAL_CAPABILITY
• value = IP_CAPABILITY structure
For a full-duplex media session, the application must insert these capability parameter elements in
pairs, one for transmit (IP_CAPABILITY.direction = IP_CAP_DIR_LCLTRANSMIT) and one for
receive (IP_CAPABILITY.direction = IP_CAP_DIR_LCLRECEIVE). If multiple session
proposals are being included in the SDP offer, the application inserts multiple such pairs of
parameter elements in order of codec preference.
For a half-duplex media session, the application inserts a single parameter element with the
IP_CAPABILITY.direction field set to either IP_CAP_DIR_LCLTXONLY or
IP_CAP_DIR_LCLRXONLY. If multiple session proposals are being included in the SDP offer,
the application inserts multiple parameter elements of this type in order of codec preference.
When requesting the remote endpoint to switch from audio mode to T.38 fax mode, the application
inserts only a single parameter element with IP_CAPABILITY.capability set to
GCCAP_DATA_t38UDPFax and IP_CAPABILITY.direction set to IP_CAP_DIR_LCLTXRX.
When requesting the remote endpoint to suspend streaming to place a call on hold, the application
inserts only a single parameter element with IP_CAPABILITY.direction set to either
IP_CAP_DIR_LCLRTPINACTIVE (to disable RTP streaming only) or
IP_CAP_DIR_LCLRTPRTCPINACTIVE (to disable both RTP and RTCP).
In each case, the IP_CAPABILITY structure must be fully specified. If only one property is being
changed (for example, only changing the direction), the remaining fields of the structure must
contain the current values for each of the other capability properties.
4.7.6
Canceling a Pending re-INVITE Request
If an application wishes to cancel a pending re-INVITE request, it first inserts a special parameter
element into a GC_PARM BLK, then passes that parameter block to gc_ReqModifyCall( ).
The parameter element used to cancel a pending re-INVITE is:
IPSET_MSG_SIP
IPPARM_SIP_METHOD
• value = IP_MSGTYPE_SIP_CANCEL
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
165
IP-Specific Operations
No other parameter elements can be present in the GC_PARM_BLK when canceling a re-INVITE
request.
4.7.7
Updating Dialog Properties via re-INVITE
Dialog properties that are specified in SIP message header fields can be updated or changed by
sending a re-INVITE request that contains header fields with new values. The most common use of
this capability is to provide updated Contact information or to refresh it when the Expires interval
is exceeded. Note that either party in a dialog can issue a re-INVITE to refresh or update dialog
properties.
As noted earlier in this section, applications cannot change the Call-ID, the URI or Tag in the From
and To headers, or the CSeq, since all of these are restricted values in re-INVITE requests.
With the exception of three header fields that the library automatically populates, only the header
fields that are explicitly specified by the application will be transmitted in the re-INVITE and
updated at the remote endpoint. The Contact and Via headers are automatically populated by the
library with the corresponding header values from the last 2xx or INVITE message that was sent by
the application in the current dialog unless the application explicitly sets the header in the reINVITE. The other auto-fill header field is Max-Forwards, which is set to 70 by default.
When the application only needs to send updated header fields (that is, when does not also need to
change any media session properties), the simplest approach is for the application to not include
any capability elements in the GC_PARM_BLK that it passes to gc_ReqModifyCall( ). In this
circumstance, the library automatically inserts the last SDP answer in the re-INVITE request that it
constructs. Alternatively, the application can explicitly insert the current capabilities in the
GC_PARM_BLK.
The following code example illustrates the use of re-INVITE to update the Contact header:
.
.
.
#include <gcip.h>
#include <gclib.h>
.
.
.
/* Request Contact refresh:
/* Assumes: 1) caller has verified call to be in connected state
/*
2) caller has enabled event handler for GCEV_MODIFY_CALL_ACK,
/*
GCEV_MODIFY_CALL_REJ, and GCEV_MODIFY_CALL_FAIL.
*/
*/
*/
*/
int refreshToHomeLocation (CRN crn)
{
char *pContactHeader = "Contact: Rich <r.intelligent@myhomeISP.com>";
gc_util_insert_parm_ref_ex(&parmblkp,
IPSET_SIP_MSGINFO,
IPPARM_SIP_HDR,
(unsigned long)(strlen(pContactIdHeader) + 1),
pContactHeader);
if (NULL == parmblkp)
166
return FAILURE;
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP-Specific Operations
if (gc_ReqModifyCall(crn, parmblkp, EV_ASYNC) < 0)
return FAILURE;
gc_util_delete_parm_blk(parmblkp);
} /* End of function. */
4.7.8
Implementing Hold and Retrieve via SIP re-INVITE
Either party in a SIP dialog (calling or called) can put the call on hold by sending a re-INVITE
request that contains a specially configured SDP offer that requests the remote endpoint to suspend
RTP streaming. SIP standards define two methods for specifying suspension of RTP streaming:
• The newer method of signaling an on-hold request sets the direction attribute in the media
description of the SDP offer to “a=inactive”. This method, which is indicated as the preferred
method in RFC 3261 suspends only the RTP streaming while leaving the RTCP session active
for QoS monitoring.
• The “legacy” method (which is defined in RFC 2543) sets the connection line of the SDP offer
to “c=0.0.0.0”. If the remote endpoint accepts this proposal, both RTP and RTCP are disabled.
The Global Call IP call control library supports both methods of suspending media streaming.
4.7.8.1
Suspending RTP Streaming Only
To place an existing call on hold by suspending only the RTP streaming, an application first inserts
a specially configured capability parameter element into a GC_PARM_BLK, then passes that
parameter block in a call to gc_ReqModifyCall( ). The parameter element conforms to the
following:
GCSET_CHAN_CAPABILITY
IPPARM_LOCAL_CAPABILITY
• value = IP_CAPABILITY data structure with direction field set to
IP_CAP_DIR_LCLRTPINACTIVE
All of the other fields in the IP_CAPABILITY structure should be set to the current values for the
active media session. The application can start with a copy of the IP_CAPABILITY structure that
was retrieved as part of the connection information as described in Section 4.6.2, “Getting Media
Streaming Status and Connection Information”, on page 155, and then modify only the direction
field before inserting the parameter element into the GC_PARM_BLK.
When suspending streaming, it is only necessary to include a single capability parameter element
in the parameter block even if the active call is a full-duplex media session.
4.7.8.2
Suspending RTP and RTCP Streaming
To completely suspend an existing call by deactivating both the RTP streaming and the RTCP
session, an application first inserts a specially configured capability parameter element into a
GC_PARM_BLK, then passes that parameter block in a call to gc_ReqModifyCall( ). The
parameter element conforms to the following:
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
167
IP-Specific Operations
GCSET_CHAN_CAPABILITY
IPPARM_LOCAL_CAPABILITY
• value = IP_CAPABILITY data structure with direction field set to
IP_CAP_DIR_LCLRTPRTCPINACTIVE
As in the similar case of suspending RTP only, all of the fields in the IP_CAPABILITY structure
except for the direction field should be set to the current values for the active media session. The
application can start with a copy of the IP_CAPABILITY structure that was retrieved as part of the
connection information as described in Section 4.6.2, “Getting Media Streaming Status and
Connection Information”, on page 155, and then modify only the direction field before inserting
the parameter element into the GC_PARM_BLK.
When suspending streaming, it is only necessary to include a single capability parameter element
in the parameter block even if the active call is a full-duplex session.
4.7.8.3
Retrieving a Held Call
Retrieving a held call is a matter of sending a re-INVITE with a “normal” SDP offer (non-zero
address in the “c=” line and non-inactive direction parameter in the “m=” line).
For a full-duplex connection, a Global Call application does this by inserting a pair of parameter
elements that specify media capabilities for receive and transmit directions. The parameter
elements are configured as follows:
GCSET_CHAN_CAPABILITY
IPPARM_LOCAL_CAPABILITY
• value = IP_CAPABILITY data structure with direction field set to
IP_CAP_DIR_LCLRECEIVE
GCSET_CHAN_CAPABILITY
IPPARM_LOCAL_CAPABILITY
• value = IP_CAPABILITY data structure with direction field set to
IP_CAP_DIR_LCLTRANSMIT
For a half-duplex connection, a Global Call application inserts a single parameter element as
follows:
GCSET_CHAN_CAPABILITY
IPPARM_LOCAL_CAPABILITY
• value = IP_CAPABILITY data structure with direction field set to
IP_CAP_DIR_LCLRECVONLY or IP_CAP_DIR_LCLSENDONLY
Note that there is no requirement that a session must be re-activated in the same mode that it was in
when it was inactivated. For example, a session that was in full-duplex mode when it was put on
hold can be retrieved from hold as a half-duplex session or vice versa.
If the application wishes to reactivate the held call with the same codec properties as when the call
was placed on hold, it must populate all fields of the IP_CAPABILITY structure except the
direction with the original values. This can be accomplished by using copies of the
IP_CAPABILITY structure that was used in the on-hold re-INVITE request and modifying the
direction field in each, or by using both of the IP_CAPABILITY structures that were retrieved as
168
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP-Specific Operations
the connection information from the original INVITE dialog (see Section 4.6.2, “Getting Media
Streaming Status and Connection Information”, on page 155, for details).
Alternatively, the application can modify the properties of the streaming session (for example,
changing to a different codec) at the same time that it retrieves the call from hold. To do this, the
application simply builds a new pair of parameter elements (or a single element for half duplex)
that specify the desired media properties and direction values.
4.8
Setting and Retrieving Q.931 Message IEs
The Dialogic® Global Call API supports the setting and retrieving of Information Elements (IEs) in
selected Q.931 messages. The level of support is described in the following topics:
• Enabling Access to Q.931 Message IEs
• Supported Q.931 Message IEs
• Setting Q.931 Message IEs
• Retrieving Q.931 Message IEs
• Common Usage Scenarios Involving Q.931 Message IEs
4.8.1
Enabling Access to Q.931 Message IEs
The ability to set and retrieve Q.931 message IEs is an optional feature that can be enabled or
disabled at the time the gc_Start( ) function is called.
The mandatory INIT_IP_VIRTBOARD( ) function populates the IP_VIRTBOARD structure
with default values. The default value of the h323_msginfo_mask field in the IP_VIRTBOARD
structure disables access to Q.931 message information elements. The default value of the
h323_msginfo_mask field must therefore be overridden with the value
IP_H323_MSGINFO_ENABLE for each ipt board device on which the feature is to be enabled.
The following code snippet provides an example for two virtual boards:
INIT_IPCCLIB_START_DATA(&ipcclibstart, 2, ip_virtboard);
INIT_IP_VIRTBOARD(&ip_virtboard[0]);
INIT_IP_VIRTBOARD(&ip_virtboard[1]);
ip_virtboard[0].h323_msginfo_mask = IP_H323_MSGINFO_ENABLE; /* override Q.931 message default */
ip_virtboard[1].h323_msginfo_mask = IP_H323_MSGINFO_ENABLE; /* override Q.931 message default */
Setting the h323_msginfo_mask field to a value of IP_H323_MSGINFO_ENABLE enables the
setting or retrieving of all supported Q.931 message information elements collectively. Enabling
and disabling access to individual Q.931 message information elements is not supported.
Note:
Features that are enabled or configured via the IP_VIRTBOARD structure cannot be disabled or
reconfigured once the library has been started. All items set in these data structures take effect
when the gc_Start( ) function is called and remain in effect until gc_Stop( ) is called when the
application exits.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
169
IP-Specific Operations
4.8.2
Supported Q.931 Message IEs
Table 5 shows the supported Q.931 message Information Elements (IEs), the parameter set ID and
parameter ID that should be included in a GC_PARM_BLK when setting or retrieving the IEs, and
the maximum allowed length of the IE value.
Table 5. Supported Q.931 Message Information Elements
IE Name
Set/Get
Set ID
Parameter ID
Maximum Length
Bearer Capability
Get and Set
IPSET_CALLINFO
IPPARM_BEARERCAP
255
Facility
Get and Set
IPSET_CALLINFO
IPPARM_FACILITY
255
Note: These parameters are character arrays with the maximum size of the array equal to the maximum
length shown.
4.8.3
Setting Q.931 Message IEs
The Dialogic® Global Call API library supports the setting of the following Information Elements
(IEs) in the following outgoing Q.931 messages:
• Bearer Capability IE in a SETUP message
• Facility IE in SETUP, CONNECT, and FACILITY messages
The gc_SetUserInfo( ) function is used to set these IEs. The appropriate function parameters in
this context are:
• target_type – GCTGT_GCLIB_CHAN
• target_id – line device
• infoparmblkp – a GC_PARM_BLK containing the IPSET_CALLINFO parameter set ID and
one of the following parameter IDs:
– IPPARM_BEARERCAP
– IPPARM_FACILITY
• duration – GC_SINGLECALL (GC_ALLCALLS is not supported in this context)
4.8.4
Retrieving Q.931 Message IEs
The Dialogic® Global Call API library supports the retrieval of the following Information Elements
(IEs) from the following incoming Q.931 messages:
• Bearer Capability IE in a SETUP message
• Facility IE in SETUP, CONNECT, and FACILITY messages
Table 6 shows the Dialogic® Global Call API events generated for incoming Q.931 messages and
the parameter set ID and parameter IDs contained in the GC_PARM_BLK associated with each
event.
170
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP-Specific Operations
Table 6. Supported IEs in Incoming Q.931 Messages
Incoming Q.931
Message
Note:
4.8.5
Dialogic® Global Call
API Event
Set ID
Parm ID
SETUP
GCEV_OFFERED
IPSET_CALLINFO
IPPARM_BEARERCAP
SETUP
GCEV_OFFERED
IPSET_CALLINFO
IPPARM_FACILITY
CONNECT
GCEV_CONNECTED
IPSET_CALLINFO
IPPARM_FACILITY
FACILITY
GCEV_EXTENSION
with an ext_id of
EXTID_RECEIVEMSG
IPSET_CALLINFO
IPPARM_FACILITY
The application must retrieve the necessary IEs by copying them into its own buffer before the next
call to gc_GetMetaEvent( ). Once the next gc_GetMetaEvent( ) call is issued, the Q.931
information is no longer available.
Common Usage Scenarios Involving Q.931 Message IEs
Table 7 shows how the Dialogic® Global Call API handles common scenarios that involve the use
of Q.931 message IEs.
Table 7. Common Usage Scenarios Involving Q.931 Message IEs
Scenario
Behavior
The application invokes gc_SetUserInfo( ) to set the
Bearer Capability IE, then invokes gc_MakeCall( )
The Bearer Capability IE is parsed and added to the
new outgoing SETUP message.
The application invokes gc_SetUserInfo( ) to set the
Facility IE, then invokes gc_MakeCall( )
The Facility IE is parsed and added to the new
outgoing SETUP message.
The application invokes gc_SetUserInfo( ) to set the
Bearer Capability IE and the Facility IE, then invokes
gc_MakeCall( )
The Bearer Capability IE and the Facility IE are
parsed and added to the new outgoing SETUP
message.
The application invokes gc_SetUserInfo( ) to set the
Facility IE, then invokes gc_AnswerCall( )
The Facility IE is parsed and added to the new
outgoing CONNECT message.
The application invokes gc_SetUserInfo( ) to set the
Facility IE, then invokes gc_Extension( )
The Facility IE is parsed and added to the new
outgoing FACILITY message.
The application receives a GCEV_OFFERED event
with a Bearer Capability IE
The application retrieves the Bearer Capability IE
using gc_GetMetaEvent( ) and
gc_util_next_parm( ).
The application receives a GCEV_OFFERED event
with a Facility IE
The application retrieves the Facility IE using
gc_GetMetaEvent( ) and gc_util_next_parm( ).
The application receives a GCEV_OFFERED event
with Bearer Capability IE and Facility IE
The application retrieves the Bearer Capability IE and
Facility IE using gc_GetMetaEvent( ) and
gc_util_next_parm( ).
The application receives a GCEV_CONNECTED
event with a Facility IE
The application retrieves the Facility IE using
gc_GetMetaEvent( ) and gc_util_next_parm( ).
The application receives a GCEV_EXTENSION
event with a Facility IE
The application retrieves the Facility IE using
gc_GetMetaEvent( ) and gc_util_next_parm( ).
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
171
IP-Specific Operations
4.9
Setting and Retrieving SIP Message Header Fields
The Dialogic® Global Call API supports the setting and retrieving of SIP message header fields in
various SIP message types, including INFO, INVITE, NOTIFY, OPTIONS, REFER, and
SUBSCRIBE requests. These messages may be implicitly created and sent as a result of a Global
Call function call (for example, gc_MakeCall( ) sends INVITE, gc_InvokeXfer( ) sends REFER,
and gc_ReqService( ) sends REGISTER), or they may be messages that are explicitly constructed
and then sent via gc_Extension( ), such as INFO or NOTIFY requests. On the receiving side, the
messages are passed to the application as GCEV_OFFERED, GCEV_REQ_XFER,
GCEV_CALLINFO, or GEEV_EXTENSION events, depending on the SIP request type, with the
message information contained in the metaevent. The SIP header access feature is described in the
following topics:
• SIP Header Access Overview
• Enabling Access to SIP Header Information
• Enabling Long Header Values
• Registering SIP Header Fields to be Retrieved
• Setting SIP Header Fields for Outbound Messages
• Retrieving SIP Message Header Fields
4.9.1
SIP Header Access Overview
The Dialogic® Global Call API library provides a uniform mechanism for setting SIP header fields
in SIP messages using a single Global Call parameter definition (namely IPSET_SIP_MSGINFO /
IPPARM_SIP_HDR). This new mechanism is intended to replace the previous header access
mechanism that relied on header-specific parameter definitions. Among the advantages of the new
mechanism are:
• supports all SIP header fields, including optional and proprietary fields
• directly extensible to support new header fields
• field content length can exceed 255 bytes
• uniform programming approach
• application can register to receive only the header fields it needs to access from incoming
messages
Header Fields in Outgoing SIP Messages
After access to SIP message information has been enabled (see Section 4.9.2, “Enabling Access to
SIP Header Information”, on page 179), an application sets SIP message header fields for outgoing
messages by inserting the set ID / parm ID pair and the parameter value (header contents) for each
field into a GC_PARM_BLK using gc_util_insert_parm_ref_ex( ) or
gc_util_insert_parm_val( ). The application uses the IPSET_SIP_MSGINFO parameter set ID
and IPPARM_SIP_HDR parameter ID to set any SIP header field. The parameter value must start
with the header name and must conform to the SIP specifications for content, syntax, and
punctuation.
172
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP-Specific Operations
Once the GC_PARM_BLK is composed, the application can pass that parm block as a parameter in
a Global Call function that directly sends a message (such as gc_Extension( ), which is used to
send messages like INFO or OPTIONS, or gc_ReqService( ), which is used to send REGISTER
requests) or can preset the header fields for the next message to be sent by calling the
gc_SetUserInfo( ) function. The use of gc_SetUserInfo( ) to preset SIP message header fields for
the next message is only recommended when using gc_MakeCall( ). For messages that are sent
directly (using gc_Extension( ), for example) the preferred method is to pass the parameter block
directly to the function, because a preset header is always used for the very next message sent,
which might not be the intended message. When using gc_SetUserInfo( ) to preset SIP message
header fields, the duration parameter must be set to GC_SINGLECALL, and the information is
not transmitted until the next Global Call function that sends a SIP message is issued.
Table 8 shows the relationship between some of the most common SIP header fields, the SIP
messages that commonly use them, and the Global Call functions that are used to set the headers
and send the message.
Note:
The Dialogic® Global Call API library handles the SIP Request-URI exactly like a standard SIP
header field even though it is technically distinct from the header fields in a SIP message.
Table 8. Common Header Fields in Outbound SIP Messages
SIP header field
SIP message
Global Call function to set / send message
Accept
OPTIONS
gc_Extension( ) if E_SIP_OPTIONS_Access is
enabled
Accept-Encoding
OPTIONS
gc_Extension( ) if E_SIP_OPTIONS_Access is
enabled
Accept-Language
OPTIONS
gc_Extension( ) if E_SIP_OPTIONS_Access is
enabled
Allow
OPTIONS
gc_Extension( ) if E_SIP_OPTIONS_Access is
enabled
Call-ID
INVITE
gc_SetUserInfo( ) / gc_MakeCall( )
INFO, NOTIFY, SUBSCRIBE
gc_Extension( )
OPTIONS
gc_Extension( ) if E_SIP_OPTIONS_Access is
enabled
INVITE
gc_SetUserInfo( ) / gc_MakeCall( )
INFO, NOTIFY, SUBSCRIBE
gc_Extension( )
REFER
gc_SetUserInfo( ) / gc_InvokeXfer( ) if call
transfer is enabled
OPTIONS
gc_Extension( ) if E_SIP_OPTIONS_Access is
enabled
REGISTER
gc_ReqService( )
Content-Disposition
INFO
gc_Extension( )
Content-Encoding
INFO
gc_Extension( )
Content-Length
INFO
gc_Extension( )
Content-Type
INFO
gc_Extension( )
Contact
(display string and URI
separately accessible
separately using fieldspecific parameters)
‡ From and To header fields are not set in INVITE messages using SIP message information parameters.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
173
IP-Specific Operations
Table 8. Common Header Fields in Outbound SIP Messages (Continued)
SIP header field
SIP message
Global Call function to set / send message
Diversion
(URI separately
accessible via fieldspecific parameter)
INVITE
gc_SetUserInfo( ) / gc_MakeCall( )
INFO, NOTIFY, SUBSCRIBE
gc_Extension( )
Event
NOTIFY, SUBSCRIBE
gc_Extension( )
Expires
SUBSCRIBE
gc_Extension( )
From
INVITE
gc_SetUserInfo( ) / gc_MakeCall( )
INFO, NOTIFY, SUBSCRIBE
gc_Extension( )
OPTIONS
gc_Extension( ) if E_SIP_OPTIONS_Access is
enabled
REFER
gc_SetUserInfo( ) / gc_InvokeXfer( ) if call
transfer is enabled
REGISTER
gc_ReqService( )
Refer-To
REFER
gc_SetUserInfo( ) / gc_InvokeXfer( ) if call
transfer is enabled
Referred-By
INVITE
gc_SetUserInfo( ) / gc_MakeCall( )
REFER
gc_SetUserInfo( ) / gc_InvokeXfer( ) if call
transfer is enabled
INVITE
gc_SetUserInfo( ) / gc_MakeCall( )
REFER
gc_SetUserInfo( ) / gc_InvokeXfer( ) if call
transfer is enabled
INVITE
gc_SetUserInfo( ) / gc_MakeCall( )
INFO, NOTIFY, SUBSCRIBE
gc_Extension( )
OPTIONS
gc_Extension( ) if E_SIP_OPTIONS_Access is
enabled
REFER
gc_SetUserInfo( ) / gc_InvokeXfer( ) if call
transfer is enabled
REGISTER
gc_ReqService( )
OPTIONS
gc_Extension( ) if E_SIP_OPTIONS_Access is
enabled
REGISTER
gc_ReqService( )
OPTIONS
gc_Extension( ) if E_SIP_OPTIONS_Access is
enabled
REGISTER
gc_ReqService( )
(display string
separately accessible
via field-specific
parameter)
Replaces
Request-URI
Require
Supported
‡ From and To header fields are not set in INVITE messages using SIP message information parameters.
174
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP-Specific Operations
Table 8. Common Header Fields in Outbound SIP Messages (Continued)
SIP header field
To
(display string
separately accessible
via field-specific
parameter)
SIP message
Global Call function to set / send message
INVITE
gc_SetUserInfo( ) / gc_MakeCall( )
INFO, NOTIFY, SUBSCRIBE
gc_Extension( )
OPTIONS
gc_Extension( ) if E_SIP_OPTIONS_Access is
enabled
REFER
gc_SetUserInfo( ) / gc_InvokeXfer( ) if call
transfer is enabled
REGISTER
gc_ReqService( )
‡ From and To header fields are not set in INVITE messages using SIP message information parameters.
Header Fields in Incoming SIP Messages
For incoming SIP messages, the Dialogic® Global Call API library packages the header fields that
the application has registered to receive as parameters in the GC_PARM_BLK that is associated
with the Global Call event that notifies the application of the message. The application retrieves the
parameter block by calling gc_GetMetaEvent( ), and can then extract the contents of the various
header fields from the GC_PARM_BLK. The application must complete the retrieval of the
necessary SIP message header information (for example, by copying it into its own buffer) before
the next call to gc_GetMetaEvent( ), since the parameter block is no longer available from the
metaevent buffer once the next gc_GetMetaEvent( ) call is issued.
In addition to the header fields that the application specifically registers to receive, the
GC_PARM_BLK for a message-related Global Call event may contain one or more of the headerspecific parameters that were used in the previous header access methodology. It is important to
note that these parameters are limited to a 255 byte data length and may potentially contain a
truncation of the a header field’s contents.
Table 9 lists some common SIP header fields along with the SIP message that commonly contains
them and the Global Call event that is used to convey the message information to the application.
Note:
The From URI and To URI in incoming INVITE messages are accessible using the
gc_GetCallInfo( ) function; see Section 8.3.10, “gc_GetCallInfo( ) Variances for IP”, on page 452,
for more information. In all other cases, applications must access the complete From and To header
fields in order to access the URIs.
Table 9. Common Header Fields in Inbound SIP Messages
SIP header
SIP message
Global Call event
Accept
OPTIONS
GCEV_EXTENSION if
E_SIP_OPTIONS_Access is enabled
Accept-Encoding
OPTIONS
GCEV_EXTENSION if
E_SIP_OPTIONS_Access is enabled
Accept-Language
OPTIONS
GCEV_EXTENSION if
E_SIP_OPTIONS_Access is enabled
† Header field also accessible via field-specific parameter define.
‡ From and To header fields are not retrieved from INVITE messages using SIP message information parameters.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
175
IP-Specific Operations
Table 9. Common Header Fields in Inbound SIP Messages (Continued)
SIP header
SIP message
Global Call event
Allow
OPTIONS
GCEV_EXTENSION if
E_SIP_OPTIONS_Access is enabled
Call-ID †
INVITE
GCEV_OFFERED
INFO, NOTIFY, SUBSCRIBE
GCEV_EXTENSION
OPTIONS
GCEV_EXTENSION if
E_SIP_OPTIONS_Access is enabled
INVITE
GCEV_OFFERED
INFO, NOTIFY, SUBSCRIBE
GCEV_EXTENSION
OPTIONS
GCEV_EXTENSION if
E_SIP_OPTIONS_Access is enabled
REFER
GCEV_REQ_XFER if call transfer is enabled
3xx to 6xx responses
GCEV_DISCONNECTED
Content-Disposition
INFO
GC_CALLINFO
Content-Encoding
INFO
GC_CALLINFO
Content-Length
INFO
GC_CALLINFO
Content-Type
INFO
GC_CALLINFO
Diversion
INVITE
GCEV_OFFERED
INFO, NOTIFY, SUBSCRIBE
GCEV_EXTENSION
Event †
NOTIFY, SUBSCRIBE
GCEV_EXTENSION
Expires †
SUBSCRIBE
GCEV_EXTENSION
From ‡
(display string and full
header also returned in
header-specific
parameters)
INFO, NOTIFY, SUBSCRIBE
GCEV_EXTENSION
OPTIONS
GCEV_EXTENSION if
E_SIP_OPTIONS_Access is enabled
REFER
GCEV_REQ_XFER if call transfer is enabled
Referred-By †
INVITE
GCEV_OFFERED
REFER
GCEV_REQ_XFER if call transfer is enabled
INVITE
GCEV_OFFERED
REFER
GCEV_REQ_XFER if call transfer is enabled
INVITE
GCEV_OFFERED
INFO, NOTIFY, SUBSCRIBE
GCEV_EXTENSION
OPTIONS
GCEV_EXTENSION if
E_SIP_OPTIONS_Access is enabled
REFER
GCEV_REQ_XFER if call transfer is enabled
OPTIONS
GCEV_EXTENSION if
E_SIP_OPTIONS_Access is enabled
Contact
(display string and URI
separately returned in
field-specific
parameters)
(URI separately
returned in field-specific
parameter)
Replaces †
Request-URI †
Require
† Header field also accessible via field-specific parameter define.
‡ From and To header fields are not retrieved from INVITE messages using SIP message information parameters.
176
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP-Specific Operations
Table 9. Common Header Fields in Inbound SIP Messages (Continued)
SIP header
SIP message
Global Call event
Supported
OPTIONS
GCEV_EXTENSION if
E_SIP_OPTIONS_Access is enabled
To ‡
INFO, NOTIFY, SUBSCRIBE
GCEV_EXTENSION
OPTIONS
GCEV_EXTENSION if
E_SIP_OPTIONS_Access is enabled
REFER
GCEV_REQ_XFER if call transfer is enabled
(display string and full
header also returned in
header-specific
parameters)
† Header field also accessible via field-specific parameter define.
‡ From and To header fields are not retrieved from INVITE messages using SIP message information parameters.
API Functions for Long Header Values
Because some SIP header fields (particularly those that allow multiple values to be contained in a
single header field in a comma-delimited list) can be arbitrarily long, the Global Call IP library has
been extended to remove the inherent 255 byte data length limitation for parameters that are
contained in a GC_PARM_BLK data structure.
When using the IPSET_SIP_MSGINFO/IPPARM_SIP_HDR parameter, and the new, extended
gc_util_... _ex( ) utility functions (see Section 8.2, “IP-Specific Dialogic® Global Call API
Functions”, on page 394, for complete information on these functions), the maximum length of the
parameter value can be configured by the application using
IPCCLIB_START_DATA.max_parm_data_size before the library is started.When an application
has configured an extended maximum parameter length it must not make any attempt to access
parameter block data directly; instead, the new, extended gc_util_..._ex( ) utility functions, which
handle the extended-length data properly, should always be used.
The new, extended gc_util_..._ex( ) utility functions are backwards compatible and can be used
with any GC_PARM_BLOCK regardless of whether it contains parameters that may exceed 255
bytes. For this reason, it is recommended that the extended functions should always be used in
application code that accesses SIP header fields.
Field-Specific Parameters for SIP Header Access
Certain standard SIP header fields can be accessed using header-specific Global Call parameter IDs
instead of the generic IPSET_SIP_MSGINFO / IPPARM_SIP_HDR parameter that is described in
above.
The use of the header-specific parameter IDs has the following limitations:
• This mechanism is being deprecated. The defines will remain in the IP Call Control library for
backward compatibility, but no further development will be done on these parameters and no
issues or problems will be fixed.
• The parameter data associated with header-specific parameter IDs (that is, the header field
contents) is limited to 255 bytes. You must use the generic IPPARM_SIP_HDR parameter ID
rather than a header-specific parameter ID to handle any header field that is longer than 255
bytes.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
177
IP-Specific Operations
Table 10 lists the SIP header fields that have field-specific parameter IDs, all of which are
deprecated. The table also indicates the size defines that correspond to each parameter ID, each of
which is equated to 255. Note that some of these parameters provide access to specific portions of
the corresponding header field, such as only the URI or only the display string.
Note that there is no advantage to using the field-specific parameters that identify complete fields
when setting SIP headers. Parameters that access only a part of the corresponding header field (i.e.,
just the URI or just the display string) may provide some convenience but should be used with
caution because all of these parameter IDs are being deprecated.
When a SIP message is received, the associated parm block contained in the event metadata
contains an element that uses the header-specific parameter ID for each corresponding header field
that is present in the message, regardless of whether the same field is registered to be received
using the generic IPSET_SIP_MSGINFO / IPPARM_SIP_HDR parameter
Table 10. Field-Specific Parameters (Deprecated) for SIP Header Access
Header Field Name
Call-ID ††
Set ID and Parameter ID
IPSET_SIP_MSGINFO
Maximum Data Length Define †
IP_CALLID_HDR_MAXLEN
• IPPARM_CALLID_HDR
Contact display string
IPSET_SIP_MSGINFO
IP_CONTACT_DISPLAY_MAXLEN
• IPPARM_CONTACT_DISPLAY
Contact URI
IPSET_SIP_MSGINFO
IP_CONTACT_URI_MAXLEN
• IPPARM_CONTACT_URI
Diversion URI
IPSET_SIP_MSGINFO
IP_DIVERSION_MAXLEN
• IPPARM_DIVERSION_URI
Event
IPSET_SIP_MSGINFO
IP_EVENT_HDR_MAXLN
• IPPARM_EVENT_HDR
Expires
IPSET_SIP_MSGINFO
IP_EXPIRES_HDR_MAXLEN
• IPPARM_EXPIRES_HDR
From display string
IPSET_SIP_MSGINFO
IP_FROM_DISPLAY_MAXLEN
• IPPARM_FROM_DISPLAY
From (complete header
field, with display string,
URI, and parameters)
IPSET_SIP_MSGINFO
Referred-By
IPSET_SIP_MSGINFO
IP_FROM_MAXLEN
• IPPARM_FROM
IP_REFERRED_BY_MAXLEN
• IPPARM_REFERRED_BY
Replaces (parameter in
Refer-To header field for
attended call transfers)
IPSET_SIP_MSGINFO
Request-URI
IPSET_SIP_MSGINFO
IP_REPLACES_MAXLEN
• IPPARM_REPLACES
IP_REQURI_MAXLEN
• IPPARM_REQUEST_URI
† The value for each listed parameter ID is a character array with the maximum size of the array (including the NULL) equal to
the corresponding maximum length define.
†† Directly setting the Call-ID header field using this parameter overrides any Call-ID value that is set using the
IPSET_CALLINFO / IPPARM_CALLID parameter.
178
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP-Specific Operations
Table 10. Field-Specific Parameters (Deprecated) for SIP Header Access (Continued)
Header Field Name
To display string
Set ID and Parameter ID
IPSET_SIP_MSGINFO
Maximum Data Length Define †
IP_TO_DISPLAY_MAXLEN
• IPPARM_TO_DISPLAY
To (complete header
field, with display string,
URI, and parameters)
IPSET_SIP_MSGINFO
IP_TO_MAXLEN
• IPPARM_TO
† The value for each listed parameter ID is a character array with the maximum size of the array (including the NULL) equal to
the corresponding maximum length define.
†† Directly setting the Call-ID header field using this parameter overrides any Call-ID value that is set using the
IPSET_CALLINFO / IPPARM_CALLID parameter.
4.9.2
Enabling Access to SIP Header Information
The ability to set and retrieve information from SIP message header fields is an optional feature
that can be enabled or disabled at the time the gc_Start( ) function is called.
The mandatory INIT_IP_VIRTBOARD( ) utility function populates the IP_VIRTBOARD
structure with default values. The default value of the sip_msginfo_mask field in the
IP_VIRTBOARD structure disables application access to all SIP message header fields. The value
IP_SIP_MSGINFO_ENABLE (possibly OR’ed with other defined mask values) must be set into
the sip_msginfo_mask field for each IPT board device on which the feature is to be enabled. The
following code snippet provides an example for two virtual boards:
INIT_IPCCLIB_START_DATA(&ipcclibstart, 2, ip_virtboard);
INIT_IP_VIRTBOARD(&ip_virtboard[0]);
INIT_IP_VIRTBOARD(&ip_virtboard[1]);
ip_virtboard[0].sip_msginfo_mask = IP_SIP_MSGINFO_ENABLE; /* override SIP message default */
ip_virtboard[1].sip_msginfo_mask = IP_SIP_MSGINFO_ENABLE; /* override SIP message default */
Setting the value IP_SIP_MSGINFO_ENABLE (possibly OR’ed with other bitmask values) in the
sip_msginfo_mask field enables overall set/retrieve access to SIP header fields for the virtual
board. Enabling and disabling access to individual SIP header fields is not supported.
Note:
4.9.3
Features that are enabled or configured via the IP_VIRTBOARD structure cannot be disabled or
reconfigured once the library has been started. All items set in this data structure take effect when
the gc_Start( ) function is called and remain in effect until gc_Stop( ) is called when the
application exits.
Enabling Long Header Values
The ability to set and retrieve SIP message header fields that exceeds 255 bytes in length is an
optional feature that can be enabled at the time the gc_Start( ) function is called. The maximum
length for SIP header fields is configured in the IPCCLIB_START_DATA data structure and
applies to all virtual boards in the system.
The mandatory INIT_IPCCLIB_START_DATA( ) utility function populates the
IPCCLIB_START_DATA structure with default values. The default value of the
max_parm_data_size field in the IPCCLIB_START_DATA structure sets the maximum data length
for parameter data in a GC_PARM_BLK structure at 255 for backwards compatibility. If the
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
179
IP-Specific Operations
application requires the ability to send and receive SIP header fields that are longer than this default
maximum length (up to a maximum of 4096 bytes), it can overwrite the default value after
initializing the IPCCLIB_START_DATA but before calling gc_Start( ). The following code
snippet provides an example of setting a maximum length of 1024 bytes for SIP header fields (and
other parameter types that specifically support extended-length data) for each of two virtual boards:
INIT_IPCCLIB_START_DATA(&ipcclibstart, 2, ip_virtboard);
INIT_IP_VIRTBOARD(&ip_virtboard[0]);
INIT_IP_VIRTBOARD(&ip_virtboard[1]);
ipcclibstart.max_parm_data_size = 1024; /* set maximum SIP header length to 1k */
ip_virtboard[0].sip_msginfo_mask = IP_SIP_MSGINFO_ENABLE; /* override SIP message default */
ip_virtboard[1].sip_msginfo_mask = IP_SIP_MSGINFO_ENABLE; /* override SIP message default */
Note:
4.9.4
Features that are enabled or configured via the IPCCLIB_START_DATA structure cannot be
disabled or reconfigured once the library has been started. All items set in this data structure take
effect when the gc_Start( ) function is called and remain in effect until gc_Stop( ) is called when
the application exits.
Registering SIP Header Fields to be Retrieved
In order to receive specific SIP header fields, the application must register the field names. The
registration is accomplished by constructing a GC_PARM_BLK where each element contains
registration information for an individual header field to be retrieved, then calling
gc_SetConfigData( ) to set the registration list in the library. Each element in the parm block uses
the IPSET_CONFIG set ID and the parameter ID IPPARM_REGISTER_SIP_HEADER, plus the
header field name as the parameter value. The registration of header fields only needs to be
performed once for a board device, but the application is free to set a different registration list at
some other time, if desired.
When registering standard SIP header fields (that is, header fields which are defined in the IETF
RFC documents), the field names must be spelled consistently so that the SIP stack can recognize
the header fields properly. Be certain that the spelling matches the following list (noting that case
does not matter). Note that Request-URI is handled just like a standard header field, even though it
is technically distinct from true header fields.
Note:
In this list, header fields that are assumed to be accessible to applications to support functionality
documented in this guide are marked with a †, and fields that are accessible in part or in whole via
deprecated header-specific parameter defines are marked with an *.
• Accept †
• Accept-Encoding †
• Accept-Language †
• Allow †
• Allow-Events
• Authentication
• Authentication-Info
• Authorization
• Call-ID † *
• Contact † *
180
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP-Specific Operations
• Content-Disposition †
• Content-Encoding †
• Content-Language †
• Content-Length
• CSeq
• Date
• Diversion † *
• Event † *
• Expires † *
• From † *
• Max-Forwards
• Min-Expires
• Min-SE
• Proxy-Authenticate
• Proxy-Authorization
• RAck
• Referred-By † *
• Refer-To
• Replaces † *
• Request-URI † *
• Require †
• Retry-After
• Route
• RSeq
• Session-Expires
• Subscription-State
• Supported †
• To † *
• Unsupported
• Via
• Warning
• WWW-Authenticate †
The following code snippet illustrates how an application would register to receive the six SIP
header fields required for use of OPTIONS messages that are not accessible via header-specific
parameter defines.
Note:
This example uses gc_util_insert_parm_ref( ) rather than gc_util_insert_parm_ref_ex( )
because it is known that header field name strings are short and never come close to the 255 byte
data length limit.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
181
IP-Specific Operations
// all devices are open
// register SIP headers to monitor
GC_PARM_BLKP parmblkp = NULL;
char
char
char
char
char
char
*pAccept = "Accept";
*pAcceptEnc = "Accept-Encoding";
*pAcceptLang = "Accept-Language";
*pAllow = "Allow";
*pRequire = "Require";
*pSupported = "Supported";
gc_util_insert_parm_ref(&parmblkp,
IPSET_CONFIG,
IPPARM_REGISTER_SIP_HEADER,
strlen(pAccept) + 1,
pAccept);
gc_util_insert_parm_ref(&parmblkp,
IPSET_CONFIG,
IPPARM_REGISTER_SIP_HEADER,
strlen(pAcceptEnc) + 1,
pAcceptEnc);
gc_util_insert_parm_ref(&parmblkp,
IPSET_CONFIG,
IPPARM_REGISTER_SIP_HEADER,
strlen(pAcceptLang) + 1,
pAcceptLang);
gc_util_insert_parm_ref(&parmblkp,
IPSET_CONFIG,
IPPARM_REGISTER_SIP_HEADER,
strlen(pAllow) + 1,
pAllow);
gc_util_insert_parm_ref(&parmblkp,
IPSET_CONFIG,
IPPARM_REGISTER_SIP_HEADER,
strlen(pRequire) + 1,
pRequire);
gc_util_insert_parm_ref(&parmblkp,
IPSET_CONFIG,
IPPARM_REGISTER_SIP_HEADER,
strlen(pSupported) + 1,
pSupported);
long request_id = 0;
// SetConfigData
// NOTE: device handle is a handle to the board device
if (gc_SetConfigData(GCTGT_CCLIB_NETIF, boarddevh, parmblkp, 0,
GCUPDATE_IMMEDIATE, &request_id, EV_ASYNC) != GC_SUCCESS)
{
sprintf(str, "gc_SetConfigData(boarddevh=%ld) Failed registering SIP headers", boarddevh);
printf ("%s"str);
}
gc_util_delete_parm_blk(parmblkp);
182
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP-Specific Operations
4.9.5
Setting SIP Header Fields for Outbound Messages
Note that it is not necessary for applications to register in advance the header field types that it will
be setting (as described in Section 4.9.4, “Registering SIP Header Fields to be Retrieved”, on
page 180). Registration of header field names is only required when the application needs to
retrieve those header fields from received messages.
Assuming that SIP message information access was enabled when the virtual board was started,
applications set SIP message header fields by inserting the set ID/parm ID and value string for each
field being set into a GC_PARM_BLK using gc_util_insert_parm_ref_ex( ) or
gc_util_insert_parm_val( ), and then either setting the header fields for the next message to be
sent by calling the gc_SetUserInfo( ) function or immediately sending the message by calling
gc_Extension( ) or another Global Call function that causes a SIP message to be sent.
When calling gc_SetUserInfo( ) to preset SIP message header fields (which is only recommended
when using the gc_MakeCall( ) function), the duration parameter must be set to
GC_SINGLECALL, and the information is not transmitted until the next Global Call function that
sends a SIP message is issued. Note that the preset header fields will be sent in the next SIP
message, so that the application must ensure that no other Global Call function is called before
gc_MakeCall( ).
Calling the gc_SetUserInfo( ) function results in the following behavior:
• SIP message header fields that are set do not take effect until gc_MakeCall( ) or another
function that transmits a SIP message is issued.
• Using the gc_SetUserInfo( ) does not affect incoming SIP messages on the same channel.
• Any SIP message header fields that are set only affect the next Dialogic® Global Call API
function call.
• The gc_SetUserInfo( ) function fails with GC_ERROR if the sip_msginfo_mask field in the
IP_VIRTBOARD structure is not set to IP_SIP_MSGINFO_ENABLE. When
gc_ErrorInfo( ) is called in this case, the error code is IPERR_BAD_PARAM.
The gc_Extension( ) function is typically used when sending supplementary SIP messages, such as
INFO or OPTIONS. It is possible to use the gc_SetUserInfo( ) function to set the header field
before sending the message with the gc_Extension( ) function call or other function that directly
produces a SIP request (such as gc_ReqService( ) for SIP REGISTER requests), but that approach
is not recommended. This is the case because the preset header fields will be used in the very next
SIP message that is sent, so the application must ensure that no other Global Call function is called
before the intended function.
Refer to Table 8, “Common Header Fields in Outbound SIP Messages”, on page 173, to see the
correspondence between the most common SIP header fields, the supported SIP messages in which
these header fields are commonly set, and the Global Call functions that are called to transmit these
messages.
Applications should use the IPSET_SIP_MSGINFO set ID and the IPPARM_SIP_HDR parameter
ID when setting SIP header fields in the GC_PARM_BLK. This same set ID/parm ID pair can be
used to set any settable SIP header field, whether it is a required field, an optional one, or a
proprietary one. In each case, the parameter value that is inserted into the parameter block is a
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
183
IP-Specific Operations
string that is the complete header field to be sent, starting with the header field name and including
all required syntax elements and punctuation.
As permitted in RFC 3261 and other IETF standards, applications can insert multiple header fields
of the same type with different values, or can insert a single header field with multiple values in a
comma-delimited string.
When an optional or proprietary header field is being set, the IP call control library and SIP stack
simply pass through the header contents as specified by the application. The library and stack
check for the presence of all header fields that are required for a specific SIP request or reply, and if
such a required field is being set by the application, there may be some level of validation
performed, as well. Further details regarding validation and error checking will be provided in
future revisions of this document.
Note:
Setting SIP message header information requires a detailed knowledge of the SIP protocol and its
relationship to Dialogic® Global Call API. The application has the responsibility to ensure that the
correct SIP message information is set before calling the appropriate Dialogic® Global Call API
function to send the message.
Note that header-specific Global Call parameter IDs exist for some standard SIP header fields, but
that there is no advantage to using the those parameters when setting SIP headers if the parameter
accesses a complete header field. Parameters that access only a part of the corresponding header
field (i.e., just the URI or just the display string) may provide some convenience, but this approach
is not recommended because all of the header-specific parameter defines are being deprecated.
Table 11 identifies the parameter IDs that provide access to partial header fields.
Table 11. Parameter IDs for Partial Header Field Access (Deprecated)
Header Field Name
Contact display string
Set ID and Parameter ID
IPSET_SIP_MSGINFO
Maximum Data Length Define †
IP_CONTACT_DISPLAY_MAXLEN
• IPPARM_CONTACT_DISPLAY
Contact URI
IPSET_SIP_MSGINFO
IP_CONTACT_URI_MAXLEN
• IPPARM_CONTACT_URI
Diversion URI
IPSET_SIP_MSGINFO
IP_DIVERSION_MAXLEN
• IPPARM_DIVERSION_URI
From display string
IPSET_SIP_MSGINFO
IP_FROM_DISPLAY_MAXLEN
• IPPARM_FROM_DISPLAY
Replaces (parameter in
Refer-To header field for
attended call transfers)
IPSET_SIP_MSGINFO
To display string
IPSET_SIP_MSGINFO
IP_REPLACES_MAXLEN
• IPPARM_REPLACES
IP_TO_DISPLAY_MAXLEN
• IPPARM_TO_DISPLAY
† The value for each listed parameter ID is a character array with the maximum size of the array (including the NULL) equal to
the corresponding maximum length define, all of which are equated to 255.
The following code snippet shows how to set the Request-URI header information before issuing
gc_MakeCall( ). This translates to a SIP INVITE message with the specified Request-URI.
184
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP-Specific Operations
#include "gclib.h"
..
..
GC_PARM_BLK *pParmBlock = NULL;
char
*pDestAddrBlk = "1111@127.0.0.1\0";
char
*pReqURI = "sip:2222@127.0.0.1\0";
/* Insert SIP Request-URI */
/* Add 1 to strlen for the NULL termination character */
gc_util_insert_parm_ref_ex(&pParmBlock,
IPSET_SIP_MSGINFO,
IPPARM_REQUEST_URI,
(unsigned long) (strlen(pReqURI) + 1),
pReqURI);
/* Set Call Information */
gc_SetUserInfo(GCTGT_GCLIB_CHAN, ldev, pParmBlock, GC_SINGLECALL);
gc_util_delete_parm_blk(pParmBlock);
/* set GCLIB_ADDRESS_BLK with destination string & type*/
strcpy(gcmkbl.gclib->destination.address,pDestAddrBlk);
gcmkbl.gclib->destination.address_type = GCADDRTYPE_TRANSPARENT;
/* calling the function with the MAKECALL_BLK,
the INVITE "To" field will be: 1111@127.0.0.1
the INVITE RequestURI will be: sip:2222@127.0.0.1
*/
gc_MakeCall(ldev, &crn, NULL, &gcmkbl, MakeCallTimeout, EV_ASYNC);
The following code snippet illustrates how an application can set a proprietary header called
Remote-Party-ID. This header is a CableLabs (DCS Group) sponsored extension to transmit
trusted Caller Identity and Privacy ISUP indications which have not been standardized for
translation across SIP networks.
GC_PARM_BLKP parmblkp = NULL;
char *pRemotePartyIdHeader = "Remote-Party-ID:Alice";
gc_util_insert_parm_ref_ex(&parmblkp,
IPSET_SIP_MSGINFO,
IPPARM_SIP_HDR,
(unsigned long) (strlen(pRemotePartyIdHeader) + 1),
pRemotePartyIdHeader);
gc_SetUserInfo(GCTGT_GCLIB_CRN, crn, parmblkp, GC_SINGLECALL);
gc_util_delete_parm_blk(parmblkp);
// transmit SIP message to network
...
...
4.9.6
Retrieving SIP Message Header Fields
The reception of most SIP requests and replies is reported to the application by means of a Global
Call event, with information about the type of message contained in the metaevent data. If SIP
message information access was enabled when the virtual board was started (see Section 4.9.2,
“Enabling Access to SIP Header Information”, on page 179), the metaevent will also contain
information from SIP header fields. The application processes the Dialogic® Global Call API event
using the gc_GetMetaEvent( ) function, and then processes the GC_PARM_BLK using Global
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
185
IP-Specific Operations
Call utility functions.to retrieve the message type information and individual SIP header fields of
interest.
Note:
The application must retrieve the necessary SIP message header field information by copying the
GC_PARM_BLK into its own buffer with gc_util_copy_parm_blk( ) before the next call to
gc_GetMetaEvent( ). Once the next gc_GetMetaEvent( ) call is issued, the header information no
longer available from the metaevent buffer.
Refer to Table 9, “Common Header Fields in Inbound SIP Messages”, on page 175, to see the
correspondence between SIP message type and Global Call event type for common SIP header
fields.
If the application has registered one or more SIP header fields to be received (as described in
Section 4.9.4, “Registering SIP Header Fields to be Retrieved”, on page 180), the
GC_PARM_BLK contains a separate parameter element for each registered field that was present
in the received message. Each of these elements contains the IPSET_SIP_MSGINFO set ID and
the IPPARM_SIP_HDR parameter ID. The associated data buffer contains the entire header field,
complete with name, value, and any optional parameters. It is the application’s responsibility to
parse the data to determine the type of the header field.
Note:
If a header field that the application has registered to receive is longer than the maximum parameter
length (as configured via IPCCLIB_STARTDATA.max_parm_data_size at library start-up), the
header field will be truncated in the IPSET_SIP_MSGINFO / IPPARM_SIP_HDR parameter
element. Applications can check for this situation by calling gc_ResultInfo( ) upon receiving any
Global Call event that corresponds to a SIP message. A result value of IPEC_SipHeaderTruncation
indicates that one or more of the SIP header values in the GC_PARM_BLK associated with the
event were truncated.
If the received message contains multiple header field rows with the same field name, there will be
a corresponding multiple set of parameter elements in the GC_PARM_BLK in the same order in
which the multiple rows were arranged in the message header. If any header field contains multiple
values as a comma-delimited list, it is the application’s responsibility to parse the retrieved list and
extract the separate values, as appropriate
The following code snippet illustrates how an application retrieves registered SIP header fields
when a Global Call event has been received. The example assumes that the header field name has
been registered and that the event has already been received.
char
siphdr[IP_SIP_HDR_MAXLEN];
GC_PARM_DATA_EXT
parm_data;
INIT_GC_PARM_DATA_EXT(&parm_data);
while ((ret = gc_util_next_parm_ex(pParmBlock, &parm_data)) == GC_SUCCESS)
{
switch (parm_data.parm_ID)
{
case IPPARM_SIP_HDR:
strncpy(siphdr, (char*)parm_data.pData, parm_data.data_size);
siphdr[parm_data.data_size]='\0';
sprintf(m_DisplayString, "\t\tGeneric Sip Header = %s", siphdr);
printf("%s", m_DisplayString);
break;
}
}
186
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP-Specific Operations
In addition to the IPPARM_SIP_HDR elements that correspond to the registered header fields, the
parm block will also contain elements that use the deprecated field-specific parameter IDs listed in
Table 10, “Field-Specific Parameters (Deprecated) for SIP Header Access”, on page 178. Some of
these field-specific parameters provide access to a specific part of the corresponding header field
(specifically just the display string or just the URI) rather than the complete header field.
The following code demonstrates how to copy the Request-URI from a GCEV_OFFERED event
using the (deprecated) field-specific parameter ID IPPARM_REQUEST_URI. The
GC_PARM_BLK structure containing the data is referenced via the extevtdatap pointer in the
METAEVENT structure. In this particular scenario, the GCEV_OFFERED event is generated as a
result of receiving an INVITE message.
#include "gclib.h"
..
..
METAEVENT
metaevt;
GC_PARM_DATA_EXT parm_data;
GC_PARM_BLK
*pParmBlock = NULL;
char
reqestURI[IP_REQUEST_URI_MAXLEN];
/* Get Meta Event */
gc_GetMetaEvent(&metaevt);
switch(metaevt->evttype)
{
.
.
.
case GCEV_OFFERED:
currentCRN = metaevt->crn;
pParmBlock = (GC_PARM_BLK*)(metaevt->extevtdatap);
INIT_GC_PARM_DATA_EXT(&parm_data);
/* going thru each parameter block data*/
while ((ret = gc_util_next_parm_ex(pParmBlock,&parm_data)) == GC_SUCCESS)
{
switch (parm_data.set_ID)
{
/* Handle SIP message information */
case IPSET_SIP_MSGINFO:
switch (parm_data.parm_ID)
{
/* Copy Request URI from parameter block */
/* NOTE: value_size = string length + 1 (for the NULL termination) */
case IPPARM_REQUEST_URI:
strncpy(requestURI, parm_data.value_buf, parm_data.value_size);
break;
}
}
break;
}
.
.
.
}
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
187
IP-Specific Operations
4.10
Using MIME Bodies in SIP Messages (SIP-T)
When using SIP, the Dialogic® Global Call API library supports the sending and receiving of
messages that include a single-part or multipart MIME body.
This feature was implemented primarily to allow applications to send and receive SIP Telephony
(SIP-T) information, which is encoded in a MIME message body as defined in RFC 3372, a
document which describes a framework for SIP-PSTN interworking gateways. This capability
allows the encapsulation of ISUP in the SIP body during or after call setup, and the use of the INFO
method for mid-call signaling. With the use of a separate SS7 signaling stack to translate the ISUP
information, applications can route SIP messages with dependencies on ISUP to provide ISUP
transparency across SS7-ISUP internetworking.
The Global Call implementation of SIP MIME messages is very general, so that it should support
MIME for a variety of other purposes besides SIP-T, such as text messaging. The call control
library only copies data to and from a SIP MIME body. With the exception of SDP (Session
Description Protocol), the Global Call library treats MIME body information as raw data and does
not parse or translate information that is encapsulated in SIP MIME messages. (SDP is not exposed
to the application like other MIME-encoded data because the call control library controls media
negotiations internally.)
4.10.1
SIP MIME Overview
The Dialogic® Global Call API library handles single-part MIME and multipart MIME in the same
way to simplify application coding. The library uses two levels of GC_PARM_BLK data structures
to contain information being embedded into or extracted from MIME messages. The top-level
GC_PARM_BLK structure contains a list of one or more lower-level GC_PARM_BLK structures
that contain the header and body information for each MIME part. When an application sends a
single MIME part in a SIP message that already includes a MIME part for SDP (which is not
exposed to applications in 1PCC mode and is not exposed using the mechanism described in this
section in 3PCC mode), the library transparently creates a multipart MIME message with the
appropriate multipart headers. In the case where an incoming message has multipart MIME
embedded in a multipart MIME part (nested parts), the Global Call library parses through all the
parts in order and extracts them to a flat list of data structures.
For incoming SIP messages with MIME information, the call control library creates a Global Call
event corresponding to the message type with GC_PARM_BLK structures attached. Standard
Global Call practices are used to retrieve the GC_PARM_BLK structures, and all information in
each MIME part is accessed through parameters in the corresponding GC_PARM_BLK structure.
It is important to note that the specific parameters that contain the MIME part header fields have
been defined as parameters that may exceed the 255 byte length limit of most Global Call
parameters. (The actual maximum size is configured via the max_parm_data_size field in the
IPCCLIB_START_DATA structure when initializing the library.) For this reason, applications
should always use the extended gc_util_..._ex( ) functions when retrieving MIME information
from incoming messages.
For outgoing SIP messages, the application must populate GC_PARM_BLK structures with
parameters that specify the content of all the MIME parts to be sent, and then set the MIME
information before or at the time of calling the relevant Global Call function that sends the SIP
188
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP-Specific Operations
message. If any of the MIME part header fields are longer than 255 bytes (up to the maximum size
configured by the application in the max_parm_data_size field in IPCCLIB_START_DATA), the
application must use the extended gc_util_insert_parm_ref_ex( ) function rather than the
standard gc_util_insert_parm_ref( ) utility function.
Figure 47 shows the relationships between Global Call function calls, SIP messages, and Global
Call events for outgoing and incoming SIP messages with MIME content in a normal call
setup/teardown scenario. Figure 48 shows the same relationships in a reject scenario.
Figure 47. SIP MIME Scenario for Normal Call Setup and Teardown
App
GC
GC
App
gc_MakeCall() with IPSET_MIME
INVITE with MIME
GCEV_OFFERED with IPSET_MIME
gc_SetUserInfo() with IPSET_MIME
gc_CallAck()
100 Trying with MIME
gc_SetUserInfo() with IPSET_MIME
GCEV_PROCEEDING with IPSET_MIME
gc_AcceptCall()
180 Ringing with MIME
gc_SetUserInfo() with IPSET_MIME
GCEV_ALERTING with IPSET_MIME
gc_AnswerCall()
200 OK with MIME
ACK
GCEV_CONNECTED with IPSET_MIME
GCEV_ANSWERED
gc_SetUserInfo() with IPSET_MIME_200OK_TO_BYE to
preload MIME in 200 OK to a BYE
gc_SetUserInfo() with IPSET_MIME_200OK_TO_BYE to
preload MIME in 200 OK to a BYE
gc_SetUserInfo() with IPSET_MIME
gc_DropCall()
BYE with MIME
GCEV_DISCONNECTED with IPSET_MIME
200 OK with MIME
GCEV_DROPCALL with IPSET_MIME
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
189
Figure 48. SIP MIME Scenario for Rejected Call
App
GC
GC
App
gc_MakeCall() with IPSET_MIME
INVITE with MIME
GCEV_OFFERED with IPSET_MIME
gc_SetUserInfo() with IPSET_MIME
gc_DropCall()
603 decline with MIME
Ack
GCEV_TASKFAIL with reason and IPSET_MIME
GCEV_DISCONNECTED
Figure 49. SIP MIME GC_PARM_BLK Structure
n
1
First level
GC_PARM_BLK
Second level
GC_PARM_BLK
B1
IPPARM_MIME_PART
.....
IPPARM_MIME_PART_TYPE
IPPARM_MIME_PART_TYPE
IPPARM_MIME_PART_BODY_S
IZE
IPPARM_MIME_PART_BODY_S
IZE
IPPARM_MIME_PART_HEADER
Second level
GC_PARM_BLK
Bn
IPPARM_MIME_PART_HEADER
These parameters
provide information for
MIME body part 1
GC/App MIME
Memory buffer
IPPARM_MIME_PART
IPPARM_MIME_PART_BODY
MIME part body 1
IPPARM_MIME_PART_HEADER
IPPARM_MIME_PART_BODY
These parameters
provide information for
MIME body part n
.
MIME part body n
4.10.2
Enabling and Configuring the SIP MIME Feature
.
.
INIT_IPCCLIB_START_DATA(&ipcclibstart, 2, ip_virtboard);
INIT_IP_VIRTBOARD(&ip_virtboard[0]);
INIT_IP_VIRTBOARD(&ip_virtboard[1]);
ip_virtboard[0].sip_msginfo_mask = IP_SIP_MSGINFO_ENABLE | IP_SIP_MIME_ENABLE
/* override default to enable SIP header and MIME access*/
ip_virtboard[1].sip_msginfo_mask = IP_SIP_MSGINFO_ENABLE | IP_SIP_MIME_ENABLE;
/* override default to enable AIP header and MIME access */
.
.
4.10.3
Getting MIME Information
INVITE sip:user2@127.0.0.1 SIP/2.0
From: <sip:user1@127.0.0.1>;tag=0-13c4-3f9fecfb-1a356266-56c9
To: <sip:user2@127.0.0.1>
Call-ID: 93d5f4-0-13c4-3f9fecfb-1a356266-2693@127.0.0.1
CSeq: 1 INVITE
Via: SIP/2.0/UDP 146.152.84.141:5060;received=127.0.0.1;branch=z9hG4bK-3f9fecfb1a356270-61ce
Max-Forwards: 70
Supported: 100rel
Mime-Version: 1.0
Contact: <sip:user1@127.0.0.1>
Content-Type: multipart/mixed ;boundary=unique-boundary-1
Content-Length: 886
--unique-boundary-1
Content-Type: application/SDP ;charset=ISO-10646
v=0
o=jpeterson 2890844526 2890842807 IN IP4 126.16.64.4
s=SDP seminar
c=IN IP4 MG122.level3.com
t=2873397496 2873404696
m=audio 9092 RTP/AVP 0 3 4
--unique-boundary-1
Content-Type: application/ISUP ;version=nxv3 ;base=etsi121
Content-Disposition: signal ;handling=optional
Content-User: Dialogic ;type=demo1
01
43
53
0e
00
00
00
95
49
00
10
1e
00
03
0a
1e
00
06
07
1e
03
0d
03
06
02
03
10
26
00
80
27
05
07
90
80
0d
04
a2
88
f5
10
07
03
01
00
03
00
06
33
10
00
10
63
03
89
04
21
63
8b
00
--unique-boundary-1—
Content-Type: image/jpeg
Content-Transfer-Encoding: base64
iQCVAwUBMJrRF2N9oWBghPDJAQE9UQQAtl7LuRVndBjrk4EqYBIb3h5QXIX/LC//
jJV5bNvkZIGPIcEmI5iFd9boEgvpirHtIREEqLQRkYNoBActFBZmh9GC3C041WGq
uMbrbxc+nIs1TIKlA08rVi9ig/2Yh7LFrK5Ein57U/W72vgSxLhe/zhdfolT9Brn
HOxEa44b+EI=
--unique-boundary-1—
Table 12. Global Call Events for Incoming SIP Messages that can Contain MIME Bodies
Incoming SIP Message
Global Call Event
Table 12. Global Call Events for Incoming SIP Messages that can Contain MIME Bodies
Incoming SIP Message
Global Call Event
IPPARM_MIME_PART
0x78339ff0
[address of first second-level GC_PARM_BLK (B1) ]
IPPARM_MIME_PART (required)
0x78356144
[address of second second-level GC_PARM_BLK (B2) ]
The first second-level GC_PARM_BLK (B1), at address 0x78339ff0 in this example, contains the
following parameters and values, which represent the information for the first non-SDP MIME part
in the example shown above:
IPPARM_MIME_PART_TYPE
Content-Type: application/ISUP ;version=nxv3 ;base=etsi121
[data from MIME part header in received MIME message]
IPPARM_MIME_PART_BODY_SIZE
182
[size of received data in buffer]
IPPARM_MIME_PART_BODY
0x329823e8
[address of buffer]
IPPARM_MIME_BODY_HEADER [optional parameter]
Content-Disposition: signal ;handling=optional
[data from MIME part header in received MIME message]
IPPARM_MIME_BODY_HEADER [optional parameter]
Content-User: Dialogic ;type=demo1
[data from MIME part header in received MIME message]
The buffer at the address given in the value of IPPARM_MIME_PART_BODY (0x329823e8 in this
example) contains the data that was received in the MIME part body:
01
43
53
0e
00
00
00
95
49
00
10
1e
00
03
0a
1e
00
06
07
1e
03
0d
03
06
02
03
10
26
00
80
27
05
07
90
80
0d
04
a2
88
f5
10
07
03
01
00
03
00
06
33
10
00
10
63
03
89
04
21
63
8b
00
The second, second-level GC_PARM_BLK (B2), at address 0x78356144 in this example, contains
the following parameters and values, which represent the information for the second non-SDP
MIME part in the example shown above:
IPPARM_MIME_PART_TYPE
Content-Type: image/jpeg
[data from MIME part header in received MIME message]
IPPARM_MIME_PART_BODY_SIZE
208
[size of received data in buffer]
IPPARM_MIME_PART_BODY
0x3298a224
[address of buffer]
IPPARM_MIME_BODY_HEADER [optional parameter]
Content-Transfer-Encoding: base64
[data from MIME part header in received MIME message]
The buffer at the address given in the value of IPPARM_MIME_PART_BODY (0x3298a224 in this
example) contains the data that was received in the MIME part body:
iQCVAwUBMJrRF2N9oWBghPDJAQE9UQQAtl7LuRVndBjrk4EqYBIb3h5QXIX/LC//
jJV5bNvkZIGPIcEmI5iFd9boEgvpirHtIREEqLQRkYNoBActFBZmh9GC3C041WGq
uMbrbxc+nIs1TIKlA08rVi9ig/2Yh7LFrK5Ein57U/W72vgSxLhe/zhdfolT9Brn
HOxEa44b+EI=
Note that the data that is retrieved from each MIME part body is copied into the buffer as a
continuous block of binary data whose length (in bytes) is indicated in
IPPARM_MIME_PART_BODY_SIZE. No type checking or data formatting is performed by the
Dialogic® Global Call API library. Note that a MIME part body does not necessarily end with ‘\0’,
and that a MIME body might contain ‘\0’ as part of the body itself.
All GC_PARM_BLK structures (on both levels) and MIME part body buffers will be freed when
the next Global Call event is accessed. The application must therefore copy the necessary
parameters and the data buffers before processing the next Global Call event. When copying a
complete GC_PARM_BLK structure, the application should use the
function rather than
or some similar function because the parameters for MIME part
headers are among the Global Call parameters that support data length greater than 255 bytes.
Code Example
The following code example illustrates the retrieval of MIME information from a
GCEV_OFFERED event. It prints out every MIME part header and MIME part body (except for
any SDP) that exists in the SIP INVITE message. Note that the example uses the extended utility
functions because the parameters for MIME part header fields may be longer than 255 bytes.
INT32 processEvtHandler()
{
METAEVENT
metaEvent;
GC_PARM_BLK
*parmblkp = NULL;
GC_PARM_DATAP
t_gcParmDatap = NULL;
GC_PARM_BLK
*parmblkp2 = NULL;
.
.
.
switch (evtType)
{
case GCEV_OFFERED:
/* received GC event, parse PARM_BLK, examine extension data */
parmblkp = (GC_PARM_BLK *) metaEvent.extevtdatap;
while (t_gcParmDatap = gc_util_next_parm(parmblkp, t_gcParmDatap))
{
switch(t_gcParmDatap->set_ID)
{
case IPSET_MIME:
switch(t_gcParmDatap->parm_ID)
{
case IPPARM_MIME_PART:
/* Get MIME part pointer */
parmblkp2= (GC_PARM_BLK*)(*(UINT32*)( t_gcParmDatap ->value_buf));
if(NULL == parmblkp2 || 0 != getMIMEPart(parmblkp2))
{
printf("\n!!!error getting MIME part!!!\n");
return -1;
}
break;
}
break;
}
}
}
:
}
INT32 getMIMEPart(GC_PARM_BLK* parmblkp)
{
GC_PARM_DATA_EXT
ParmDataExt;
//Initialize the structure to start from the 1st parm in the GC_PARM_BLK
INIT_GC_PARM_DATA_EXT(&ParmDataExt);
UINT32
char
char
bodySize = 0;
*appBuff = NULL;
*bodyBuff = NULL;
/* get the first param data*/
if(GC_SUCCESS != gc_util_next_parm_ex(parmblkp, &ParmDataExt))
{
/* error condition */
printf("\n !!! unable to get parm data ext !!!\n");
return -1;
}
/* Get MIME type info, this has to be the first parameter */
if(IPSET_MIME == ParmDataExt.set_ID && IPPARM_MIME_PART_TYPE == ParmDataExt.parm_ID)
{
printf("\t Content-Type = %s\n", (char*)ParmDataExt.pData);
}
else
{
/* error condition */
printf("\n !!! first parameter in MIME part is not MIME type!!!\n");
return -1;
}
/* Get the rest of MIME info*/
while (GC_SUCCESS == gc_util_next_parm_ex(parmblkp, &ParmDataExt))
{
switch(ParmDataExt.set_ID)
{
case IPSET_MIME:
switch(ParmDataExt.parm_ID)
{
case IPPARM_MIME_PART_TYPE:
/* duplicate MIME part, error out */
printf("\n!!!Duplicate MIME part error!!!\n");
return -1;
break;
case IPPARM_MIME_PART_BODY_SIZE:
/* Get MIME part body size */
bodySize = *(UINT32*)(ParmDataExt.pData);
printf("\t MIME part body Size = %d\n", bodySize);
break;
case IPPARM_MIME_PART_HEADER:
/* Get MIME part header */
printf("\t MIME part header = %s\n", (char*)ParmDataExt.pData);
break;
case IPPARM_MIME_PART_BODY:
/* get body buffer pointer */
bodyBuff = (char*)(*(UINT32*)(ParmDataExt.pData));
/* copy MIME part body */
if(bodySize>0)
{
/* allocate memory */
appBuff = (char*)malloc(bodySize+1);
memcpy(appBuff, bodyBuff, bodySize);
}
else
{
/*error body size must be available*/
printf("\n!!! Body Size not available error !!!\n");
return -1;
}
/* Null terminated */
appBuff[bodySize] = '\0';
/* Only print the buffer content as string */
/* For binary data the buffer is not printable*/
printf("\t MIME part Body:\n%s\n",appBuff);
/* Free allocated memory*/
free(appBuff);
break;
}
break;
}
}
.
.
.
return 0;
}
4.10.4
Sending MIME Information
Table 13 lists the Global Call functions that can be used to send SIP messages with MIME
information using the IPSET_MIME parameter set ID in the attached GC_PARM_BLK. Except in
the cases of
and
, sending a SIP message with MIME requires
two function calls,
to set the information, and a second function to cause the
library to send the message.
Table 13. Global Call Functions for SIP MIME Messages Using IPSET_MIME
Global Call Function to Set
MIME Parameter Block
Global Call Function to
Send MIME Message
Device
Type
Outgoing SIP Message with
MIME
gc_MakeCall( )
gc_Extension( )
gc_SetUserInfo( )
gc_CallAck( )
gc_SetUserInfo( )
gc_AcceptCall( )
gc_SetUserInfo( )
gc_AnswerCall( )
gc_SetUserInfo( )
gc_DropCall( )
If the application only needs to send a single MIME part but the call control library also needs to
send SDP information, the firmware automatically and transparently constructs the required
multipart MIME message.
If the application needs to send multipart MIME, all the MIME information is set collectively
within one function call on the given device by inserting multiple IPPARM_MIME_PART
parameters in the desired order to construct a multipart MIME body. The MIME information set by
current function always overwrites any MIME information set by previous functions, so that an
application
set multiple MIME parts by calling
multiple times.
The parameter set ID IPSET_MIME_200OK_TO_BYE is used for a special case of MIME
message. Unlike other outgoing SIP messages that are sent explicitly by Global Call functions, the
200 OK to BYE message is sent automatically when a BYE is received. In order to attach MIME
information to a 200 OK to BYE message, the MIME information has to be pre-loaded by
with set ID IPSET_MIME_200OK_TO_BYE on a channel before the
GCEV_DISCONNECTED event (SIP BYE message) is received. If a MIME message with
IPSET_MIME_200OK_TO_BYE parameters is not set before the GCEV_DISCONNECTED
event (BYE) is received, the automatic 200 OK message will be sent without any MIME body.
Note that the parameter set ID must be set to IPSET_MIME_200OK_TO_BYE in
GC_PARM_BLK associated with the message, not just the top-level block. MIME information set
with IPSET_MIME_200OK_TO_BYE and MIME information set with IPSET_MIME are kept
independent of each other on a given channel.
The data that is to be sent in the MIME part body is copied into the message MIME part from an
application buffer. The data in the buffer must match the data type that is specified by the
IPPARM_MIME_PART_TYPE parameter. The Dialogic® Global Call API library treats the buffer
as a continuous block of binary data of the length (in bytes) specified in
IPPARM_MIME_PART_BODY_SIZE; no type checking or formatting is performed. Note that a
MIME body part does not necessarily end with ‘\0’, and that a MIME body might contain ‘\0’ as
part of the body itself.
Constructing and setting a MIME message is a multi-part process that can be broken down into
several sub-processes:
1. Create and populate a separate GC_PARM_BLK structure for each MIME part to be sent in
the SIP message.
2. Create a top-level GC_PARM_BLK structure and populate it with IPPARM_MIME_PART
parameters that point to the GC_PARM_BLK structures created in the first step.
3. Set or send the message by calling the appropriate Global Call function.
4. Clean up the data structures after the function returns.
Create MIME part structures
The process of constructing an outgoing SIP MIME message begins by constructing a separate
GC_PARM_BLK structure for each MIME part to be sent in the message:
1. Create a GC_PARM_BLK structure.
2. Insert the required IPPARM_MIME_PART_TYPE parameter to identify the MIME part type
using the extended
function because the type string may
exceed 255 bytes in length.
3. Insert any MIME part headers via one or more optional IPPARM_MIME_PART_HEADER
parameters, using the extended
function because the headers
may exceed 255 bytes in length.
4. Insert the required IPPARM_MIME_PART_BODY_SIZE parameter to identify the actual
number of bytes to be copied from the application buffer to the MIME part body using the
function.
5. Insert the required IPPARM_MIME_PART_BODY parameter with a pointer to the application
buffer that contains the data for the MIME part body using the
function. Note that the Dialogic® Global Call API library treats the buffer as a continuous
block of binary data, and that the data must have the appropriate format for the MIME part
type specified in the IPPARM_MIME_PART_TYPE parameter.
Create top-level GC_PARM_BLK
After repeating the preceding procedure for each MIME part to be sent in the SIP message,
construct the top-level data structure that lists the MIME part structures:
1. Create a GC_PARM_BLK structure.
2. Insert a required IPPARM_MIME_PART parameter to point to the GC_PARM_BLK structure
for the first MIME part in the message using the
function.
3. Repeat Step 2 for each additional MIME part, inserting the parameters in order of how the
MIME parts should be organized in the message.
Set/send message data and clean up
After creating and populating the top-level GC_PARM_BLK structure that lists all the MIME parts
to be sent in the SIP message, set or send the message and clean up the set-up structures:
1. Call
or
set or send the MIME message data.
with a pointer to the top-level GC_PARM_BLK to
2. Delete all GC_PARM_BLK structures created during the set-up process after the Global Call
function returns.
3. Optionally, free the application buffer holding the MIME part body data, since that data has
been copied into the dedicated MIME buffer when the function was called. Or you can choose
to not free the application buffer and instead reuse it for the next MIME part body.
Code Example
The following code example constructs a single part MIME message and uses the
function to send it in an INVITE message. Note that the example uses the extended utility function
because the Content-Type and Content-Disposition header strings
exceed 255 bytes.
#include "gclib.h"
.
.
.
GC_PARM_BLK *pParmBlockA = NULL;
GC_PARM_BLK *pParmBlockB = NULL;
char *pBodyType = "Content-Type: application/ISUP ;version=nxv3 ;base=etsi121;
userInput=12345678901234567890123456789012345678901234567890123456789012345678901234567890123456
789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012
3456789012345678901234567890123456789012345678901234567890123456789012345678901234567890";
char *pBody = "01 00 49 00 00 03 02 00 07 04 10 00 33 63 21\r\n43 00 00 03 06 0d 03 80 90 a2 07
03 10 03 63\r\n53 00 10 0a 07 03 10 27 80 88 03 00 00 89 8b\r\n0e 95 1e 1e 1e 06 26 05 0d f5 01
06 10 04 00";
char *pPartHeader1 = "Content-Disposition: signal ;handling=optional;
userInput=12345678901234567890123456789012345678901234567890123456789012345678901234567890123456
789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012
3456789012345678901234567890123456789012345678901234567890123456789012345678901234567890";
char *pPartHeader2 = "Content-User: Dialogic ;type=demo1";
/* Insert Content-Type field */
/* Add 1 to strlen for the NULL termination character */
gc_util_insert_parm_ref_ex(&pParmBlockB,
IPSET_MIME,
IPPARM_MIME_PART_TYPE,
(unsigned long)(strlen(pBodyType) + 1),
pBodyType);
/* Insert Body Size */
gc_util_insert_parm_val(&pParmBlockB,
IPSET_MIME,
IPPARM_MIME_PART_BODY_SIZE,
sizeof(unsigned long),
strlen(pBody));
/* Insert MIME part Body Pointer */
gc_util_insert_parm_val(&pParmBlockB,
IPSET_MIME,
IPPARM_MIME_PART_BODY,
sizeof(unsigned long),
(unsigned long)pBody);
/* Insert other header fields */
gc_util_insert_parm_ref_ex(&pParmBlockB,
IPSET_MIME,
IPPARM_MIME_PART_HEADER,
(unsigned long)(strlen(pPartHeader1) + ),
pPartHeader1);
/* Insert other header fields */
gc_util_insert_parm_ref_ex(&pParmBlockB,
IPSET_MIME,
IPPARM_MIME_PART_HEADER,
(unsigned long)(strlen(pPartHeader2) + 1),
pPartHeader2);
/* Insert parm block B pointer to parm block A */
gc_util_insert_parm_val(&pParmBlockA,
IPSET_MIME,
IPPARM_MIME_PART,
sizeof(unsigned long),
(unsigned long)pParmBlockB;
/* Set Call Information */
gc_SetUserInfo(GCTGT_GCLIB_CHAN, ldev, pParmBlockA, GC_SINGLECALL);
gc_util_delete_parm_blk(pParmBlockB);
gc_util_delete_parm_blk(pParmBlockA);
.
.
.
/* Make a call */
gc_MakeCall(ldev, &crn, NULL, &gcmkbl, MakeCallTimeout, EV_ASYNC);
4.10.5
MIME Error Conditions
When using the SIP MIME feature, any of the following conditions causes the Global Call function
to return an error with the last error set to IPERR_BAD_PARAM:
• A Global Call function attempts to set MIME information when the SIP MIME feature was not
enabled by setting IP_SIP_MIME_ENABLE in the IP_VIRTBOARD structure at initialization
time.
• The application attempts to set MIME information with the MIME body part size larger than
the MIME memory buffer size that was configured during initialization.
• The total size of MIME parts is greater than 1500 bytes when using UDP.
If the MIME memory pool is empty, or if the configured MIME buffer size is smaller than the
MIME body of an incoming SIP-T message, a GCEV_TASKFAIL event is sent to the application
with the reason set to IPEC_MIME_POOL_EMPTY or IPEC_MIME_BUFF_TOO_SMALL,
respectively. In addition, these error conditions also cause a response message with response code
486(Busy Here) to be sent to the remote UA. The current transaction will be terminated without
causing the state of the current call to change.
4.11
Specifying Transport for SIP Messages
When a virtual board is configured with default values in the IP_VIRTBOARD data structure, the
supported transport protocol for all SIP messages is UDP. Applications do not have the ability to
send messages using TCP, and incoming TCP messages are refused.
By setting non-default parameter values in the IP_VIRTBOARD before calling
,
applications can enable support of TCP as well as UDP. In addition to enabling overall TCP
support, the application can configure the board to use TCP as the default transport protocol, and
can set the persistence of TCP connections. See Section 4.1.2, “Configuring SIP Transport
Protocol”, on page 110, for details about the configuration process.
When TCP is enabled, incoming TCP messages are accepted, and if the application needs to
determine the transport protocol it can access the Request-URI in the Global Call event as
described in Section 4.9.6, “Retrieving SIP Message Header Fields”, on page 185. When
responding to a SIP request, the application does not need to specify TCP because the transport
parameter is already be present in the Request-URI.
SIP requests that are sent by the application outside of a SIP dialog (for example, INVITE,
SUBSCRIBE, or NOTIFY) normally use the default transport protocol, but the application can
override the default to send a specific request using the non-default protocol by setting a
“transport=” parameter in the Request-URI header field before the message is sent. If the default
transport is UDP, the relevant parameter string to override the default is “;transport=tcp”; if the
default transport is TCP, the relevant parameter string to override the default is “;transport=udp”.
Setting the transport for a specific SIP request requires that the SIP message information access
feature be enabled and uses the process described in Section 4.9.5, “Setting SIP Header Fields for
Outbound Messages”, on page 183. The following code lines illustrate how a Request-URI with
transport parameter would be inserted into the parameter block for the message to be sent.
sprintf(strReqURI, "sip:%s:%d;transport=tcp", strIPaddr, intPort);
gc_util_insert_parm_ref(&parmblkp,
IPSET_SIP_MSGINFO,
IPPARM_REQUEST_URI,
strlen(strReqURI),
strReqURI);
For SIP requests within a dialog (for example, INFO, NOTIFY, or REFER), there is no need to set
the transport protocol if the persistence configuration item in IP_VIRTBOARD is set to
ENUM_PERSISTENCE_TRANSACT_USER (the default value), because the existing TCP
connection will be used.
BYE requests are exceptions to the general TCP behavior in several respects. First, BYE requests
always make a new connection; an existing TCP connection is not used even if TCP is configured
for user persistence. Second, a default transport protocol setting of TCP or a “;transport=tcp”
parameter in the Request-URI header field is not sufficient to force TCP for a BYE request.
Instead, it is necessary to also set “;transport=tcp” in the Contact URI header field.
Due to network conditions, in certain instances a 1xx Informational Response or an ACK response
may be lost and the SIP standards specify that these messages are not re-transmitted. Only in
instances where the SIP protocol provides for retries of the encompassing transaction will the call
control library be able to generate proper termination events to the application when a response is
lost. Applications should be written to handle cases of missing completion events that may be
caused by missing response messages.
4.12
Handling SIP Transport Failures
The Global Call SIP implementation provides facilities to retry a SIP request when a transport
failure occurs as well as notifying the application of the failure. The retry logic used by the SIP
stack is determined by the value that is set for the E_SIP_RequestRetry field in the
IP_VIRTBOARD configuration structure that is used when the virtual board is started. The default
configuration enables all allowable retries.
The following code snippet illustrates the general procedure for setting up the IP_VIRTBOARD
structure to specify non-default request retry behavior. This specific example disables request
retries following transport failure. Note that all data structure fields that are not explicitly set are
assumed to contain their default values as configured by the
function.
#include "gclib.h"
..
..
#define BOARDS_NUM 1
..
..
/* initialize start parameters */
IPCCLIB_START_DATA cclibStartData;
memset(&cclibStartData,0,sizeof(IPCCLIB_START_DATA));
IP_VIRTBOARD virtBoards[BOARDS_NUM];
memset(virtBoards,0,sizeof(IP_VIRTBOARD)*BOARDS_NUM);
/* initialize start data */
INIT_IPCCLIB_START_DATA(&cclibStartData, BOARDS_NUM, virtBoards);
/* initialize virtual board */
INIT_IP_VIRTBOARD(&virtBoards[0]);
// Enable SIP Message Info to allow transport selection for individual requests
virtBoards[0].ip_sip_msginfo_mask = IP_SIP_MSGINFO_ENABLE;
//enable TCP for individual requests
virtBoards[0].E_SIP_tcpenabled = ENUM_Enabled;
virtBoards[0].E_Persistence = ENUM_PERSISTENCE_TRANSACT_USER;
//disable SIP request retry
virtboard[0].E_SIP_RequestRetry = ENUM_REQUEST_RETRY_NONE
Features that are enabled or configured via the IP_VIRTBOARD structure cannot be disabled or
reconfigured once the library has been started. All items set in this data structure take effect when
the
function is called and remain in effect until
is called when the
application exits.
When UDP is used as the transport protocol, the SIP stack automatically retries the request on the
same address until a timeout occurs or a response is received. When such a timeout occurs there is
generally no point in retrying further on the same address, but having the stack automatically retry
on any additional addresses that are contained in the DNS server may be useful. All request retry
configuration options that enable retry include this type of retry using DNS entries.
When TCP is used as the transport protocol, a request may fail because the destination is not able to
accept TCP in addition to other failure causes. When a TCP request fails, it is generally desirable to
have the stack retry the request using UDP, but because a UDP request is retried automatically until
a response is received or the request times out, the time interval before the application receives a
final fatal transport error may be significantly extended. Because of this, the options for enabling
request retry allow retry using UDP on the same address for a TCP failure to be enabled separately
in addition to retrying using addresses from the DNS server. Additionally, the SIP stack only retries
TCP requests on the same address using UDP if the failure reason indicates that there is a
reasonable possibility that the UDP request will succeed. In particular, there is little point in
retrying if the failure was a 503 Service Unavailable because sending a UDP request to a busy
server is no more likely to succeed than the failed TCP request. Another case where retrying a
failed TCP request is not appropriate is if the failed connection was a connection to a proxy, since a
failed connection to a proxy indicates that the proxy is not able to accept TCP or that the proxy is
down—a fatal error in either case.
An important third case occurs when an application attempts a request using UDP, but the request
is forced to TCP because of its size. In this case, the application supplies an address that is valid for
UDP transport because that is the protocol it assumes will be used. If the connection fails because
the destination cannot accept TCP, it is appropriate for the SIP stack to retry the same address over
UDP without the application’s intervention, because a UDP request is what the application
expected to be sent in the first place. A separate configuration option is provided to accommodate
this specific circumstance while disabling retry on the same address for requests explicitly sent
over TCP.
When a request retry occurs, the Global Call IP library generates a GCEV_EXTENSION event that
contains the following parameter element:
IPSET_SIP_REQUEST_ERROR
IPPARM_SIP_DNS_CONTINUE
• value = REQUEST_ERROR data structure
If retry is not enabled in a particular circumstance, or if the retry attempt failed, the Dialogic®
Global Call API library generates a GCEV_EXTENSION event containing the following
parameter element:
IPSET_SIP_REQUEST_ERROR
IPPARM_SIP_SVC_UNAVAIL
• value = REQUEST_ERROR data structure
In both the “retry continuing” and “no retry” cases, REQUEST_ERROR.error is an enumerated
error code value, and REQUEST_ERROR.method is an array that contains up to
IP_SIP_METHODSIZE characters of the method name. The defined values for the error field are:
IP_SIP_REQUEST_503_RCVD
Connection failed due to 503 Service Unavailable or other fatal error cause.
IP_SIP_REQUEST_FAILED
Connection failed due to general or unclassified error.
IP_SIP_REQUEST_NETWORK_ERROR
Connection failed due to network error or local failure.
IP_SIP_REQUEST_RETRY_FAILED
Failure in request retry logic; retry not attempted.
IP_SIP_REQUEST_TIMEOUT
Connection failed due to connection timeout.
The following code illustrates how an application can extract the failure cause information from the
Extension events associated with SIP transport failures. The example assumes that the event has
already been received.
switch(pextensionBlk->ext_id)
{
.
.
.
case IPSET_SIP_REQUEST_ERROR:
ProcessRequestError(l_pParmData);
break;
.
.
.
void ProcessRequestError(GC_PARM_DATA *parmp)
{
REQUEST_ERROR RE;
memcpy(&RE,parmp->value_buf,parmp->value_size);
switch (parmp->parm_ID)
{
case IPPARM_SIP_DNS_CONTINUE:
printf(" Received IPPARM_SIP_DNS_CONTINUE on %s ", RE.Method);
break;
case IPPARM_SIP_SVC_UNAVAIL:
printf(" Received IPPARM_SIP_SVC_UNAVAIL on %s ",RE.Method);
break;
default:
printf(" Received Unknown Request error");
break;
}
switch(RE.Error)
{
case IP_SIP_REQUEST_NETWORK_ERROR:
printf("IP_SIP_REQUEST_NETWORK_ERROR\n");
break;
case IP_SIP_REQUEST_TIMEOUT:
printf("IP_SIP_REQUEST_TIMEOUT\n");
break;
case IP_SIP_REQUEST_503_RCVD:
printf("IP_SIP_REQUEST_503_RCVD\n");
break;
case IP_SIP_REQUEST_FAILED:
printf("IP_SIP_REQUEST_FAILED\n");
break;
default:
printf(" Received Unknown Error cause\n");
break;
}
}
4.13
Sending and Receiving SIP INFO Messages
The SIP INFO message (as specified in IETF RFC 2976) provides a means for transporting
application-level, session-related control information along the SIP signaling path after the setup of
a SIP-controlled session has begun. INFO messages can be sent on an early INVITE-initiated SIP
dialog (after a 101-199 provisional response) or on a confirmed dialog. The information of interest
to the application can be contained in standard message header fields, proprietary header fields, or
one or more MIME-encoded body parts. The Dialogic® Global Call API library provides facilities
for sending and receiving INFO requests and responses on a “pass-through” basis, meaning that
there are no Global Call state changes associated with such messages. The library generates Call
Info events to notify applications of incoming INFO messages, and Extension events for incoming
INFO response messages. The
Send Message API is used for outgoing INFO
requests and responses.
Only one INFO request can be pending on a dialog. Once an INVITE request has been sent,
another one cannot be sent until a response has been received.
The following topics discuss how applications can send, receive, and respond to INFO requests.
• Sending an INFO Message
• Receiving a Response to an INFO Message
• Receiving an INFO Message
• Responding to an INFO Message
Application access to the header fields in INFO messages requires that the mask value
IP_SIP_MSGINFO_ENABLE must be set into the sip_msginfo_mask field of the
IP_VIRTBOARD configuration data structure before
is called. Additionally, INFO
messages frequently utilize MIME message bodies, and the ability to access MIME data must be
enabled by setting the IP_SIP_MIME_ENABLE mask value in the same sip_msginfo_mask.
4.13.1
Sending an INFO Message
To send an INFO message, the application begins by creating a GC_PARM_BLK that contains an
element with the IPSET_MSG_SIP parameter set ID, the IPPARM_MSGTYPE parameter ID and
the IP_MSGTYPE_SIP_INFO parameter value. The application adds elements for the desired
header fields (any combination of standard and proprietary header fields) and one or more MIME
body parts, if appropriate, to the parameter block. (The technique for setting the header fields to be
sent is described in Section 4.9.5, “Setting SIP Header Fields for Outbound Messages”, on
page 183, and the technique for constructing MIME-encoded body parts is described in
Section 4.10, “Using MIME Bodies in SIP Messages (SIP-T)”, on page 188.) After constructing
the complete parameter block, the application uses the
function to send the
message. Because INFO messages relate to dialogs that have been initiated or confirmed, the
in the function call must be GCTGT_GCLIB_CRN, and the t
CRN handle for the current call.
must be the
The following standard header fields are generally required for INFO messages:
• To
• From
• Contact
• Request-URI
• Diversion
• Call-ID
If the application does not explicitly set the Request-URI, the library populates it with the URI
from the To header field by default.
The following standard header fields are also commonly used in INFO requests:
• Content-Disposition
• Content-Encoding
The Content-Length and Content-Type header fields are normally filled in by the library and should
not be set by the application.
The following code snippet illustrates the essential steps for constructing and sending an INFO
request. The example assumes that a GC_PARM_BLK has already been declared.
gc_util_insert_parm_val(&parmblkp,
IPSET_MSG_SIP,
IPPARM_MSGTYPE,
sizeof(int),
IP_MSGTYPE_SIP_INFO);
// Insert SIP Call ID field
gc_util_insert_parm_ref(&parmblkp,
IPSET_SIP_MSGINFO,
IPPARM_CALLID_HDR,
strlen(m_CurrentCallID),
m_CurrentCallID);
// Insert other SIP header information here
.
.
.
// transmit INFO message to network
retval = gc_Extension(GCTGT_GCLIB_CRN, crn, IPEXTID_SENDMSG, parmblkp, &retblkp, EV_ASYNC);
.
.
.
// outbound INFO has been sent.
// expect to receive a GCEV_EXTENSION containing a response
4.13.2
Receiving a Response to an INFO Message
After an INFO message is sent, the SIP stack will receive a response message and the library will
generate a GCEV_EXTENSION event of type IPEXTID_RECEIVEMSG to notify the application.
The GC_PARM_BLK associated with Extension event will contain a parameter element as
follows:
ID IPSET_MSG_SIP
ID IPPARM_MSGTYPE
and one of the following values:
• IP_MSGTYPE_SIP_INFO_OK
• IP_MSGTYPE_SIP_INFO_FAILED
The application can also retrieve the specific SIP response code from the Extension event’s
parameter block using the IPSET_MSG_SIP parameter set ID and the parameter ID
IPPARM_MSG_SIP_RESPONSE_CODE.
The application must retrieve the necessary SIP message header information by copying it into its
own buffer before the next call to
. Once the next
call is
issued, the header information is no longer available from the metaevent buffer.
The following code snippet illustrates the procedure for extracting the INFO response information
from an Extension event.
//
//
An outbound SIP INFO request has been sent previously
expect an inbound SIP INFO response
switch(metaeventp->evttype)
{
case GCEV_EXTENSION:
while ((parmp = gc_util_next_parm(pParmBlock,parmp)) != 0)
{
switch (parmp->set_ID)
{
// Handle SIP message information
case IPSET_MSG_SIP:
switch (parmp->parm_ID)
{
// determine message type
case IPPARM_MSGTYPE:
MessType = (int)(*(parmp->value_buf));
switch (MessType)
{
case IP_MSGTYPE_SIP_INFO_OK:
// process INFO response
break;
case IP_MSGTYPE_SIP_INFO_FAILED:
// process INFO response
break;
}
break;
// get the SIP response code
case IPPARM_MSG_SIP_RESPONSE_CODE:
ResponseCode = (int)(*(parmp->value_buf));
break;
}
break;
}
}
break;
}
4.13.3
Receiving an INFO Message
When the SIP stack receives an incoming SIP INFO message, it generates a GCEV_CALLINFO
event to the application.
The application can extract standard message header fields from the parameter block associated
with the GCEV_CALLINFO event using the technique described in Section 4.9.6, “Retrieving SIP
Message Header Fields”, on page 185. If the message contains MIME-encoded information in its
body (as many INFO messages do), the application can use the technique described in
Section 4.10.3, “Getting MIME Information”, on page 191 to extract the information.
The application must retrieve the necessary SIP message header and body information by copying
it into its own buffer before the next call to
. Once the next
call is issued, the message information is no longer available from the
metaevent buffer.
The following code snippet illustrates the essential process for extracting INFO message header
information from a Call Info event.
switch(metaeventp->evttype)
{
case GCEV_CALLINFO:
pParmBlock = (GC_PARM_BLK*)(metaeventp->extevtdatap);
parmp = NULL;
/* going thru each parameter block data*/
while ((parmp = gc_util_next_parm(pParmBlock,parmp)) != 0)
{
switch (parmp->set_ID)
{
/* Handle SIP message information */
case IPSET_SIP_MSGINFO:
switch (parmp->parm_ID)
{
case IPPARM_REQUEST_URI:
strncpy(requestURI,(char*)parmp->value_buf,parmp->value_size);
sprintf(str, "gc_util_next_parm() Success, Request URI = %s",requestURI);
break;
case IPPARM_CONTACT_URI:
.
.
break;
case IPPARM_DIVERSION_URI:
.
.
break;
.
.
}
break;
.
.
// etc.
.
.
}
break;
}
break;
}
4.13.4
Responding to an INFO Message
Once an application has received a GCEV_CALLINFO event for a SIP INFO message and
extracted the information from the event, it must send a response message.
The response is sent by passing a GC_PARM_BLK containing the following parameter element to
the
function:
IPSET_MSG_SIP
IPPARM_MSGTYPE
and one of the following parameter values:
• IP_MSGTYPE_SIP_INFO_OK
• IP_MSGTYPE_SIP_FAILED
In addition, the application can set a specific SIP response code in the response message using the
following parameter element:
IPSET_MSG_SIP
IPPARM_MSG_SIP_RESPONSE_CODE
and one of the following values:
• For an “OK” response, the value should be in the range 200 to 299; if the application does
not set this parameter, the Dialogic® Global Call API library fills in the default value 200.
• For a “Failed” response, the value should be 300 or higher; if the application does not set
this parameter, the Dialogic® Global Call API library fills in the default value 501.
The following two code snippets illustrate how an application would send “OK” and “Failed”
responses to INFO messages.
“OK” Response to INFO Message
// inbound SIP INFO request has been received
// reply to INFO with an OK
gc_util_insert_parm_val(&parmblkp,
IPSET_MSG_SIP,
IPPARM_MSGTYPE,
sizeof(int),
IP_MSGTYPE_SIP_INFO_OK);
// Insert SIP response code
gc_util_insert_parm_val(&parmblkp,
IPSET_MSG_SIP,
IPPARM_MSG_SIP_RESPONSE_CODE,
sizeof(int),
200);
// transmit INFO response message to network
retval = gc_Extension(GCTGT_GCLIB_CRN, crn, IPEXTID_SENDMSG, parmblkp, &retblkp, EV_ASYNC);
“Failed” Response to INFO Message
// application has just received an inbound SIP INFO request.
// in this case, we are sending a "Not Implemented" failure response
gc_util_insert_parm_val(&parmblkp,
IPSET_MSG_SIP,
IPPARM_MSGTYPE,
sizeof(int),
IP_MSGTYPE_SIP_INFO_FAILED);
// Insert SIP response code
gc_util_insert_parm_val(&parmblkp,
IPSET_MSG_SIP,
IPPARM_MSG_SIP_RESPONSE_CODE,
sizeof(int),
501);
// transmit INFO response message to network
retval = gc_Extension(GCTGT_GCLIB_CRN, crn, IPEXTID_SENDMSG, parmblkp, &retblkp, EV_ASYNC);
4.14
Sending and Receiving SIP OPTIONS Messages
The SIP OPTIONS method provides a means for a SIP User Agent to query the capabilities of
another UA or proxy, either within or outside of a SIP dialog. As an example, a client can use the
OPTIONS method to discover the content types, extensions, methods, codecs, etc. that are
supported by another party without having to “ring” the party by sending an INVITE.
RFC 3261 requires all user agents to support the OPTIONS method. The default behavior of the
Dialogic® Global Call API library is to send automatic responses to incoming OPTIONS requests
and not provide facilities for applications to send OPTIONS requests. Optionally, an IPT virtual
board can be configured to enable application access to OPTIONS messages. When access is
enabled, applications can send OPTIONS requests to remote parties and are responsible for
responding to incoming OPTIONS requests.
The following topics describe the Dialogic® Global Call API library’s implementation of support
for the OPTIONS method.
• Default OPTIONS Behavior
• Enabling Application Access to OPTIONS Messages
• Sending OPTIONS Requests
• Receiving Responses to OPTIONS Requests
• Receiving OPTIONS Requests
• Responding to OPTIONS Requests
4.14.1
Default OPTIONS Behavior
If the SIP OPTIONS access feature is not enabled when the ipt virtual board device is started, the
SIP stack in the Dialogic® Global Call API library responds to incoming OPTIONS requests
automatically, using default information, because all SIP User Agents are required to support the
OPTIONS method. The application has no control over the content of these automatic response
messages, nor can it send OPTIONS requests.
When Global Call automatically responds to an incoming OPTIONS request, there are two
possibilities:
• If a channel is available to handle the incoming request, Global Call sends a 200 OK message
that includes an SDP message body (Content-Type: application/sdp) which indicates the same
capabilities that the library would report in an outgoing INVITE request.
• If there is no channel available to handle an incoming connection request (for example, all
channels in use or gc_WaitCall( ) not having been called), Global Call sends a “busy”
response. The specific code that is sent can be configured by means of the
IPSET_SIP_RESPONSE_CODE/ IPPARM_BUSY_REASON parameter, but the default busy
response is 486 Busy Here. This behavior allows a remote UA to use an OPTIONS request to
determine whether it can initiate a new call on the target system.
The default Allow header will be the following if supplementary services (call transfer) is not
enabled:
Allow: INVITE, CANCEL, ACK, BYE
or the following if supplementary services is enabled:
Allow: INVITE, CANCEL, ACK, BYE, REFER, NOTIFY
Note that in either case, OPTIONS is not included in the list.
4.14.2
Enabling Application Access to OPTIONS Messages
The ability to send and respond to SIP OPTIONS requests under application control is an optional
feature that can be enabled or disabled at the time that the gc_Start( ) function is called.
The mandatory INIT_IP_VIRTBOARD( ) utility functions populates the IP_VIRTBOARD
structure with default values. The default values of two fields in the IP_VIRTBOARD structure
must be overridden to enable application access to OPTIONS messages:
• The E_SIP_OPTIONS_Access field must be set to ENUM_Enabled. The default value is
ENUM_Disabled, which disables access to OPTIONS messages.
• The sip_msginfo-mask field must be set to the OR of IP_SIP_MSGINFO_ENABLE and
IP_SIP_MIME_ENABLE (and any other appropriate mask values). The default mask value
disables access to the header fields and MIME bodies of SIP messages, which would prevent
the application from doing anything useful with OPTIONS messages.
See the reference page for IP_VIRTBOARD on page 553 for more information on these fields.
The following code snippet provides an example of enabling OPTIONS access for two virtual
boards:
INIT_IPCCLIB_START_DATA(&ipcclibstart, 2, ip_virtboard);
INIT_IP_VIRTBOARD(&ip_virtboard[0]);
INIT_IP_VIRTBOARD(&ip_virtboard[1]);
ip_virtboard[0].sip_msginfo_mask = IP_SIP_MSGINFO_ENABLE | IP_SIP_MIME_ENABLE;
ip_virtboard[1].sip_msginfo_mask = IP_SIP_MSGINFO_ENABLE | IP_SIP_MIME_ENABLE;
ip_virtboard[0].E_SIP_OPTIONS_Access = ENUM_Enabled;
ip_virtboard[1].E_SIP_OPTIONS_Access = ENUM_Enabled;
Features that are enabled or configured via the IP_VIRTBOARD structure cannot be disabled or
reconfigured once the library has been started. All items set in this data structure take effect when
the gc_Start( ) function is called and remain in effect until gc_Stop( ) is called when the
application exits.
Note that in addition to enabling OPTIONS access, SIP message information access, and SIP
MIME access before the virtual board is started, the application must also register the six additional
SIP headers that it will need to access in OPTIONS-related messages it receives (Accept, AcceptEncoding, Accept-Language, Allow, Require, and Supported). This registration is performed on a
one-time basis after the virtual board has been started, as described in Section 4.9.4, “Registering
SIP Header Fields to be Retrieved”, on page 180, but the header field registration list can be
updated at any time.
4.14.3
Sending OPTIONS Requests
When SIP OPTIONS access is enabled, applications use gc_Extension( ) to send the message after
assembling the appropriate header fields and any MIME body parts in a GC_PARM_BLK. To build
an OPTIONS request, the application uses the parameter set ID IPSET_MSG_SIP, the parameter
ID IPPARM_MSGTYPE, and the parameter value IP_MSGTYPE_SIP_OPTIONS.
The application can send an OPTIONS message outside of a SIP dialog by using a board device
handle in the gc_Extension( ) call:
gc_Extension(GCTGT_GCLIB_CHAN, boarddevhandle, IPEXTID_SENDMSG, parmblkp, &retblkp, EV_ASYNC)
Alternatively, the application can send an OPTIONS request within a dialog by using the line
device handle in the gc_Extension( ) call:
gc_Extension(GCTGT_GCLIB_CHAN, linedevhandle, IPEXTID_SENDMSG, parmblkp, &retblkp, EV_ASYNC)
When SIP OPTIONS access is enabled, the Allow header field will be the following if
supplementary services (call transfer) is not enabled:
Allow: INVITE, CANCEL, ACK, BYE, OPTIONS
or the following if supplementary services is enabled:
Allow: INVITE, CANCEL, ACK, BYE, REFER, NOTIFY, OPTIONS
The application can add additional methods to the Allow header, but the Dialogic® Global Call API
library will ensure that all of the methods supported by the library are included.
The following parameters IDs are used with the IPSET_SIP_MSGINFO parameter set ID to set the
header fields in the OPTIONS message, using the general techniques described in Section 4.9.5,
“Setting SIP Header Fields for Outbound Messages”:
parm_ID
value_buf
Default value
If the IP Call Control library was started in the first party call control (1PCC) operating mode, the
library automatically inserts a MIME body part containing SDP data that reflects the current
capability set (that is, the same SDP information that would be sent in an INVITE request).This is
the case even though the SDP information is not required and may not be meaningful to the User
Agent that will receive the OPTIONS request (since an OPTIONS request is not part of a
negotiation).
If the library was started in the third party call control (3PCC) operating mode, SDP information is
not automatically inserted in OPTIONS requests or responses. If the application needs to include
SDP information, it must explicitly insert it using the gc_SetUserInfo( ) function and the
IPSET_SDP/IPPARM_SDP_OPTION_OFFER or IPSET_SDP/IPPARM_SDP_OPTION_ANSWER
parameter.
Once the header fields are set up, the application can send the message within a call using:
gc_Extension(GCTGT_GCLIB_CRN, crn, IPEXTID_SENDMSG, parmblkp, &retblkp, EV_ASYNC)
where crn is the CRN returned on a gc_MakeCall( ) or in a GCEV_OFFERED event.
Or the application can send the message outside a dialog using:
gc_Extension(GCTGT_GCLIB_CHAN, boardh, IPEXTID_SENDMSG, parmblkp, &retblkp, EV_ASYNC)
where boardh is the handle obtained by opening the board device.
The following pseudo-code shows a more complete example of constructing and sending an
OPTIONS request.
gc_util_insert_parm_val(&parmblkp,
IPSET_MSG_SIP,
IPPARM_MSGTYPE,
sizeof(int),
IP_MSGTYPE_SIP_OPTIONS);
gc_util_insert_parm_ref_ex(&parmblkp,
IPSET_SIP_MSGINFO,
IPPARM_TO,
(unsigned long)(strlen(szTo)+1),
szTo);
gc_util_insert_parm_ref-ex(&parmblkp,
IPSET_SIP_MSGINFO,
IPPARM_REQUEST_URI,
(unsigned long)(strlen(szRURI)+1),
szRURI);
gc_util_insert_parm_ref-ex(&parmblkp,
IPSET_SIP_MSGINFO,
IPPARM_FROM,
(unsigned long)(strlen(szFrom)+1),
szFrom);
gc_util_insert_parm_ref-ex(&parmblkp,
IPSET_SIP_MSGINFO,
IPPARM_CONTACT_URI,
(unsigned long)(strlen(szCntct)+1),
szCntct);
gc_util_insert_parm_ref_ex(&parmblkp,
IPSET_SIP_MSGINFO,
IPPARM_SIP_HDR,
(unsigned long)(strlen(szAccept)+1),
szAccept);
gc_util_insert_parm_ref_ex(&parmblkp,
IPSET_SIP_MSGINFO,
IPPARM_SIP_HDR,
(unsigned long)(strlen(szAcceptE)+1),
szAcceptE);
gc_util_insert_parm_ref_ex(&parmblkp,
IPSET_SIP_MSGINFO,
IPPARM_SIP_HDR,
(unsigned long)(strlen(szAcceptL)+1),
szAcceptL);
gc_util_insert_parm_ref_ex(&parmblkp,
IPSET_SIP_MSGINFO,
IPPARM_SIP_HDR,
(unsigned long)(strlen(szSupp)+1),
szSupp);
gc_util_insert_parm_ref_ex(&parmblkp,
IPSET_SIP_MSGINFO,
IPPARM_SIP_HDR,
(unsigned long)(strlen(szAllow)+1),
szAllow);
gc_Extension(GCTGT_GCLIB_CHAN,
devhandle,
IPEXTID_SENDMSG,
parmblkp,
&retblkp,
EV_ASYNC);
4.14.4
Receiving Responses to OPTIONS Requests
When the Dialogic® Global Call API library’s SIP stack receives a response to a SIP OPTIONS
request, it generates a GCEV_EXTENSION event of type IPEXTID_RECEIVEMSG.
The GC_PARM_BLK associated with the Extension event will contain a parameter element as
follows:
IPSET_MSG_SIP
IPPARM_MSGTYPE parameter ID
and one of the following values:
• IP_MSGTYPE_SIP_OPTIONS_OK
• IP_MSGTYPE_SIP_OPTIONS_FAILED
The application can also retrieve the specific SIP response code from the event’s parameter block
using the IPSET_MSG_SIP set ID and the IPPARM_MSG_SIP_RESPONSE_CODE parameter
ID.
In the case of an IP_MSGTYPE_SIP_OPTIONS_OK response, the application can use the
techniques described in Section 4.9.6, “Retrieving SIP Message Header Fields” to retrieve message
header fields of interest, including:
• Request-URI
• To header field
• From header field
• Contact URI
• Accept header field
• Accept-encoding header field
• Accept-language header field
• Supported header field
• Allow header field
• Require header field
• Call-ID header field
The application can also extract any MIME information from the message body using the
techniques described in Section 4.10.3, “Getting MIME Information”, on page 191. Note that
responses to OPTIONS requests are the single case where the MIME part containing SDP
information is exposed to the application rather than handled internally by the Dialogic® Global
Call API library. The SDP information is identified by the string “Content-Type: application/sdp”.
In the case of an IP_MSGTYPE_SIP_OPTIONS_FAILED response, the application can use the
techniques described in Section 4.9.6, “Retrieving SIP Message Header Fields” to retrieve the
following message header fields:
• Request-URI
• To header field
• From header field
• Contact URI
The application must retrieve the necessary SIP message header and body information by copying
it into its own buffer before the next call to gc_GetMetaEvent( ). Once the next
gc_GetMetaEvent( ) call is issued, the message information is no longer available from the
metaevent buffer.
The following pseudo-code illustrates how to extract “OK” and “Failed” responses to OPTIONS
requests from a GCEV_EXTENSION event.
char
char
char
char
siphdr[IP_SIP_HDR_MAXLEN];
AcceptHeader[IP_SIP_HDR_MAXLEN];
Accept_encodingHeader[IP_SIP_HDR_MAXLEN];
Accept_languageHeader[IP_SIP_HDR_MAXLEN];
case
GCEV_EXTENSION:
if( pextensionBlk->ext_id== IPEXTID_RECEIVEMSG )
{
while ((l_pParm = gc_util_next_parm(pParmBlock, l_pParm )) != 0)
{
int l_mtype= (int)(*( l_pParm ->value_buf));
switch (l_pParm ->set_ID)
{
case IPSET_MSG_SIP:
if(l_pParm ->parm_ID == IPPARM_MSGTYPE)
{
if(l_mtype== IP_MSGTYPE_SIP_OPTIONS_OK)
{
printf("OPTIONS request successful\n");
}
else if (l_mtype== IP_MSGTYPE_SIP_ OPTIONS_FAILED)
{
printf("OPTIONS request failedl\n");
}
}
else if(l_pParm ->parm_ID == PARM_MSG_SIP_RESPONSE_CODE)
{
int *l_RC= (int *) l_pParm ->value_buf;
printf ("Response Code %d \n",*l_RC);
}
case IPSET_SIP_MSGINFO:
switch(l_pParm ->parm_ID)
{
case IPPARM_SIP_HDR:
strncpy(siphdr,(char*)parmp->value_buf,parmp->value_size);
siphdr[parmp->value_size]='\0';
if(!strnicmp(siphdr,"Accept-encoding",strlen("Accept-encoding" )))
{
strcpy(Accept_encodingHeader,siphdr);
}
else if (! strnicmp(siphdr,"Accept-language",strlen("Accept-language")))
{
strcpy(Accept_languageHeader,siphdr);
}
else if (! strnicmp(siphdr,"Accept",strlen("Accept")))
{
strcpy(AcceptHeader,siphdr);
}
…
//(process other headers)
default :
break;
}
4.14.5
Receiving OPTIONS Requests
When the Dialogic® Global Call API library is started with the
IP_VIRTBOARD.E_SIP_OPTIONS_Access field set to ENUM_Enabled (to allow application
access to OPTIONS requests), the library will act in one of two ways when the SIP stack receives a
SIP OPTIONS request:
• If there is no channel available to handle an incoming connection request (for example, all
channels in use or gc_WaitCall( ) not having been called), Global Call automatically sends a
“busy” response. The application can set the specific code that is sent by means of the
IPSET_SIP_RESPONSE_CODE/ IPPARM_BUSY_REASON parameter, but the default busy
response is 486 Busy Here. The behavior of sending a busy response allows a remote UA to
use an OPTIONS request to determine whether it can initiate a new call on the target system.
• If there is a channel available to handle incoming calls, the library generates an Extension
event (GCEV_EXTENSION) of type IPEXTID_RECEIVEMSG to notify the application of
the incoming OPTIONS request. The GC_PARM_BLK associated with the Extension event
will contain a parameter element with the IPSET_MSG_SIP set ID, the IPPARM_MSGTYPE
parameter ID, and the value IP_MSGTYPE_SIP_OPTIONS.
The application can use the techniques described in Section 4.9.6, “Retrieving SIP Message Header
Fields” to retrieve header fields of interest, including:
• To header field
• Request URI
• From header field
• Contact URI
• Accept header field
• Accept-encoding header field
• Accept-language header field
• Supported header field
• Allow header field
• Require header field
• Call-ID header field
The application can also extract MIME information from the message body using the techniques
described in Section 4.10.3, “Getting MIME Information”, on page 191. Note that the MIME part
that contains SDP information is not exposed to the application.
The application must retrieve the necessary SIP message header and body information by copying
the data into its own buffer before the next call to gc_GetMetaEvent( ). Once the next
gc_GetMetaEvent( ) call is issued, the message information is no longer available from the
metaevent buffer.
The following pseudo-code illustrates how to extract an OPTIONS request from a received
GCEV_EXTENSION event,
case
GCEV_EXTENSION:
if( pextensionBlk->ext_id== IPEXTID_RECEIVEMSG)
{
while ((l_pParm = gc_util_next_parm(pParmBlock, l_pParm )) != 0)
{
int l_mtype= (int)(*( l_pParm->value_buf));
switch (l_pParm->set_ID)
{
case IPSET_MSG_SIP:
if(l_pParm ->parm_ID == IPPARM_MSGTYPE)
{
if(l_mtype== IP_MSGTYPE_SIP_OPTIONS )
{
printf("OPTIONS request received\n");
}
…
}
break
case IPSET_SIP_MSGINFO:
switch(l_pParm ->parm_ID)
{
case IPPARM_CALLID_HDR:
strncpy(g_CurrentCallID,(char*)parmp->value_buf,parmp->value_size);
g_CurrentCallID[parmp->value_size]='\0';
break;
…
//(process other headers)
default :
break;
}
}
4.14.6
Responding to OPTIONS Requests
If SIP OPTIONS access is enabled, it is the application’s responsibility to respond to incoming
OPTIONS requests, assuming that there is a channel available to handle the incoming request. (If
there is no channel available, Global Call automatically sends a “busy” response.)
OPTIONS responses are sent as Global Call Extension messages using gc_Extension( ). There are
separate message types for “OK and “Failed” response messages, but both types must use the
Call-ID header obtained from the received request.
“Success” Response Message
“OK” responses to OPTIONS requests use the IPSET_MSG_SIP / IPPARM_MSGTYPE
parameter set and ID with a value of IP_MSGTYPE_SIP_OPTIONS_OK.
The following parameters in the parameter set IPSET_SIP_MSGINFO are used to set the header
fields in the OPTIONS response message, using the general techniques described in Section 4.9.5,
“Setting SIP Header Fields for Outbound Messages”:
parm_ID
value_buf
Default value
parm_ID
value_buf
Default value
The Dialogic® Global Call API library ensures that the Allow header field contains all SIP methods
supported by the library, which includes the following methods if supplementary services (call
transfer) is not enabled:
INVITE, CANCEL, ACK, BYE, OPTIONS
or the following if supplementary services is enabled:
INVITE, CANCEL, ACK, BYE, REFER, NOTIFY, OPTIONS
When sending an “OK” response, the IP Call Control library automatically inserts a MIME body
part that contains SDP data which reflects the current capability set (that is, the same SDP
information that would be sent in an INVITE request). This may be the standard capability set, or
the application may explicitly configure the capabilities to send in the “OK” by inserting a
parameter element of the following type into the GC_PARM_BLK:
GCSET_CHAN_CAPABILITY
IPPARM_LOCAL_CAPABILITY
• value = IP_CAPABILITY data structure
gc_util_insert_parm_ref-ex(&target_datap,
GCSET_CHAN_CAPABILITY,
IPPARM_LOCAL_CAPABILITY,
(unsigned long)(sizeof(IP_CAPABILITY)),
&a_DefaultCapability);
The application can also send generic, non-SDP MIME information using the techniques described
in Section 4.10.4, “Sending MIME Information”, on page 197.
The following pseudo-code illustrates the general procedure for constructing a successful response
to an OPTIONS request.
gc_util_insert_parm_val(&parmblkp,
IPSET_MSG_SIP,
IPPARM_MSGTYPE,
sizeof(int),
IP_MSGTYPE_SIP_OPTIONS_OK);
gc_util_insert_parm_ref_ex(&parmblkp,
IPSET_SIP_MSGINFO,
IPPARM_SIP_HDR,
(unsigned long)(strlen(szAccept)+1),
szAccept);
gc_util_insert_parm_ref_ex(&parmblkp,
IPSET_SIP_MSGINFO,
IPPARM_CALLID_HDR,
(unsigned long)(strlen(g_CurrentCallID)+1,
g_CurrentCallID);
gc_util_insert_parm_ref_ex(&parmblkp,
IPSET_SIP_MSGINFO,
IPPARM_SIP_HDR,
(unsigned long)(strlen(szAcceptE)+1),
szAcceptE);
gc_util_insert_parm_ref_ex(&parmblkp,
IPSET_SIP_MSGINFO,
IPPARM_SIP_HDR,
(unsigned long)(strlen(szAcceptL)+1),
szAcceptL);
gc_util_insert_parm_ref_ex(&parmblkp,
IPSET_SIP_MSGINFO,
IPPARM_SIP_HDR,
(unsigned long)(strlen(szSupp)+1),
szSupp);
gc_util_insert_parm_ref_ex(&parmblkp,
IPSET_SIP_MSGINFO,
IPPARM_SIP_HDR,
(unsigned long)(strlen(szAllow)+1),
szAllow);
//insert a message body
gc_Extension(GCTGT_GCLIB_CHAN,
devhandle,
IPEXTID_SENDMSG,
parmblkp,
&retblkp,
EV_ASYNC);
“Failed” Response Message
“Failed” responses to OPTIONS requests use the IPSET_MSG_SIP set ID and
IPPARM_MSGTYPE parameter ID with a value of IP_MSGTYPE_SIP_OPTIONS_FAILED.
When sending the response message, the application must include the Call-ID header field value
that was retrieved from the incoming OPTIONS request. The response is on the board device (that
is, the gc_Extension( ) call uses the board handle that was obtained when opening the board
device), and the Call-ID is used to identify the specific request to which the response applies.
The application can also set a specific SIP response code in a “Failed” OPTIONS response
message using IPSET_MSG_SIP / IPPARM_MSG_SIP_RESPONSE_CODE. If the application
does not set a specific response code, Global Call uses the default value 486 (Busy Here).
The following pseudo-code illustrates sending a “Failed” response with the response code 486.
gc_util_insert_parm_val(&parmblkp,
IPSET_MSG_SIP,
IPPARM_MSGTYPE,
sizeof(int),
IP_MSGTYPE_SIP_OPTIONS_FAILED);
gc_util_insert_parm_ref_ex(&parmblkp,
IPSET_SIP_MSGINFO,
IPPARM_CALLID_HDR,
(unsigned long)(strlen(g_CurrentCallID)+1),
g_CurrentCallID);
gc_util_insert_parm_val(&parmblkp,
IPSET_MSG_SIP,
IPPARM_MSG_SIP_RESPONSE_CODE,
sizeof(int),
486);
gc_Extension(GCTGT_GCLIB_CHAN,
boardh,
IPEXTID_SENDMSG,
parmblkp,
&retblkp,
EV_ASYNC);
The following pseudo-code illustrates sending a “Failed” response with the response code 415,
which requires Accept, Accept-Encoding, and Accept-Language header fields.
gc_util_insert_parm_val(&parmblkp,
IPSET_MSG_SIP,
IPPARM_MSGTYPE,
sizeof(int),
IP_MSGTYPE_SIP_OPTIONS_FAILED);
gc_util_insert_parm_ref_ex(&parmblkp,
IPSET_SIP_MSGINFO,
IPPARM_SIP_HDR,
(unsigned long)(strlen(szAccept)+1),
szAccept);
gc_util_insert_parm_ref_ex(&parmblkp,
IPSET_SIP_MSGINFO,
IPPARM_CALLID_HDR,
(unsigned long)(strlen(g_CurrentCallID)+1),
g_CurrentCallID);
gc_util_insert_parm_ref_ex(&parmblkp,
IPSET_SIP_MSGINFO,
IPPARM_SIP_HDR,
(unsigned long)(strlen(szAcceptE)+1),
szAcceptE);
gc_util_insert_parm_ref_ex(&parmblkp,
IPSET_SIP_MSGINFO,
IPPARM_SIP_HDR,
(unsigned long)(strlen(szAcceptL)+1),
szAcceptL);
gc_util_insert_parm_val(&parmblkp,
IPSET_MSG_SIP,
IPPARM_MSG_SIP_RESPONSE_CODE,
sizeof(int),
415);
gc_Extension(GCTGT_GCLIB_CHAN,
boardh,
IPEXTID_SENDMSG,
parmblkp,
&retblkp,
EV_ASYNC);
4.15
Using SIP SUBSCRIBE and NOTIFY Messages
The SIP SUBSCRIBE and NOTIFY methods (as documented in IETF RFC 3265) provide a basic
mechanism for event notification between nodes. In the most basic implementation, an entity on a
network can use the SUBSCRIBE request to communicate its interest in certain state changes for
resources or calls on the network, and those entities (or other entities acting on their behalf) can
send NOTIFY messages as notifications when those state changes occur. This SUBSCRIBE /
NOTIFY mechanism is used outside of a dialog or call.
In addition, there may be unsubscribed NOTIFY messages that are not preceded by a
corresponding SUBSCRIBE request. One common use of unsubscribed NOTIFY messages is to
enable and disable the Message Waiting Indicator (MWI) on a PIMG.
The Dialogic® Global Call API library for SIP fully supports both the SUBSCRIBE and NOTIFY
methods, including both subscribed and unsubscribed NOTIFY. These messages are all handled on
a “pass-through” basis (in other words, there are no Global Call state changes associated with the
events). The Global Call Extension API mechanism is used in all cases. Outgoing requests and
responses are sent by building an appropriate GC_PARM_BLK and then calling gc_Extension( ),
while incoming requests and responses are passed to the application as GCEV_EXTENSION
events.
Note that the NOTIFY messages which are used in the Dialogic® Global Call API library
implementation of SIP call transfer are not handled explicitly by applications using the techniques
described in this section. The Dialogic® Global Call API library handles these messages implicitly,
automatically generating the outgoing NOTIFY messages that are required in a call transfer
operation, and passing incoming NOTIFY messages associated with a call transfer to the
application as GCEV_INVOKE_XFER or GCEV_INVOKE_XFER_FAIL events. The exception
to this generalization is a NOTIFY message that is sent to the Transferor after the primary call has
been dropped; in this case, the message is interpreted as a “normal” NOTIFY outside of a dialog
and is passed as a GCEV_EXTENSION event that the application must explicitly accept or reject
as described in Section 4.15.8, “Responding to NOTIFY Requests”, on page 235. These posttermination NOTIFY messages may occur under various circumstances, including the following:
• In the normal course of events in the scenario where the Transferor is notified upon ringing of
the transferred call (see Figure 26, “Successful SIP Unattended Call Transfer, Party A Notified
with Ringing”, on page 80)
• If a 200 OK to NOTIFY is lost in the network and the primary call is terminated by party A
before party B sends another NOTIFY as a retry
• If a non-Global Call UA sends a NOTIFY for some reason after the primary call is terminated
Note that an application that will be sending and receiving SUBSCRIBE and NOTIFY messages
must enable both the SIP message information (header) and SIP MIME (body) access features
before starting the IPT virtual board with the gc_Start( ) function. The INIT_IP_VIRTBOARD( )
utility function populates the IP_VIRTBOARD structure with default values. The default values of
the sip_msginfo_mask field in this structure must be overridden to enable application access to
SUBSCRIBE and NOTIFY messages. Specifically, the sip_msginfo_mask field must be set to the
OR of IP_SIP_MSGINFO_ENABLE and IP_SIP_MIME_ENABLE. See the reference page for
IP_VIRTBOARD on page 553 for more information on this field and these mask values.
The following code snippet provides an example of enabling message header and body access for
two virtual boards:
INIT_IPCCLIB_START_DATA(&ipcclibstart, 2, ip_virtboard);
INIT_IP_VIRTBOARD(&ip_virtboard[0]);
INIT_IP_VIRTBOARD(&ip_virtboard[1]);
ip_virtboard[0].sip_msginfo_mask = IP_SIP_MSGINFO_ENABLE | IP_SIP_MIME_ENABLE;
ip_virtboard[1].sip_msginfo_mask = IP_SIP_MSGINFO_ENABLE | IP_SIP_MIME_ENABLE;
The following topics describe how applications send, receive, and respond to SUBSCRIBE and
NOTIFY requests:
• Sending SUBSCRIBE Requests
• Receiving Responses to SUBSCRIBE Requests
• Receiving SUBSCRIBE Requests
• Responding to SUBSCRIBE Requests
• Sending NOTIFY Requests
• Receiving Responses to NOTIFY Requests
• Receiving NOTIFY Requests
• Responding to NOTIFY Requests
4.15.1
Sending SUBSCRIBE Requests
To send a SUBSCRIBE request message, the application begins by creating a GC_PARM_BLK
that contains an element with the IPSET_MSG_SIP set ID, the IPPARM_MSGTYPE parameter ID
and the IP_MSGTYPE_SIP_SUBSCRIBE parameter value. The application adds elements for the
desired header fields and one or more MIME body parts, if appropriate, to the parameter block,
then uses the gc_Extension( ) function to send the message. The header may include any
combination of standard header fields and proprietary header fields. General techniques for setting
header fields are described in Section 4.9.5, “Setting SIP Header Fields for Outbound Messages”.
The technique for constructing MIME body parts is described in Section 4.10.4, “Sending MIME
Information”.
The header fields that normally must be set in a SUBSCRIBE request include the following:
• To display string (IPPARM_TO_DISPLAY)
• From display string (IPPARM_FROM_DISPLAY)
• Expires header field (IPPARM_EXPIRES_HDR)
• Event header field (IPPARM_EVENT_HDR)
• Call-ID header field (IPPARM_CALLID_HDR)
SUBSCRIBE requests normally contain an Expires header field, which indicates the duration of
the subscription. When the application does not explicitly set an Expires header field, the default
duration that is defined in the SIP “event package” for the particular type of event will apply. To
keep a subscription effective beyond the accepted duration, the subscriber needs to send a new
SUBSCRIBE message on the same dialog when it receives an expiration message. To terminate or
unsubscribe an existing subscription, the application can send a SUBSCRIBE request with the
value 0 in the Expires header field to specify immediate expiration.
The following code snippet illustrates how an application constructs and sends a SUBSCRIBE
request.
void CSubNotMgr::SendSIPSubscribe (char*
char*
char*
char*
char*
char*
pRequestURI,
pTo,
pFrom,
pExpire,
pEvent,
pCallID)
{
char
str[MAX_STRING_SIZE];
sprintf(str, "<--- Sending SIP SUBSCRIBE\n");
printandlog(ALL_DEVICES, MISC, NULL, str, 0);
GC_PARM_BLKP
GC_PARM_BLKP
GC_INFO
int
parmblkp = NULL;
// input parameter block pointer
retblkp = NULL;
// return parameter block
gc_error_info;
// GlobalCall error information data
retval = GC_SUCCESS;
gc_util_insert_parm_val(&parmblkp,
IPSET_MSG_SIP,
IPPARM_MSGTYPE,
sizeof(int),
IP_MSGTYPE_SIP_SUBSCRIBE);
// Insert SIP request URI field
if (pRequestURI)
{
gc_util_insert_parm_ref_ex(&parmblkp,
IPSET_SIP_MSGINFO,
IPPARM_REQUEST_URI,
(unsigned long)(strlen(pRequestURI)),
pRequestURI);
}
// Insert SIP To field
if (pTo)
{
gc_util_insert_parm_ref_ex(&parmblkp,
IPSET_SIP_MSGINFO,
IPPARM_TO_DISPLAY,
(unsigned long)(strlen(pTo)),
pTo);
}
// Insert SIP From field
if (pFrom)
{
gc_util_insert_parm_ref_ex(&parmblkp,
IPSET_SIP_MSGINFO,
IPPARM_FROM_DISPLAY,
(unsigned long)(strlen(pFrom)),
pFrom);
}
// Insert SIP Expire field
if (pExpire)
{
gc_util_insert_parm_ref_ex(&parmblkp,
IPSET_SIP_MSGINFO,
IPPARM_EXPIRES_HDR,
(unsigned long)(strlen(pExpire)),
pExpire);
}
// Insert SIP Event field
if (pEvent)
{
gc_util_insert_parm_ref_ex(&parmblkp,
IPSET_SIP_MSGINFO,
IPPARM_EVENT_HDR,
(unsigned long)(strlen(pEvent)),
pEvent);
}
// Insert SIP Call ID field
if (pCallID)
{
gc_util_insert_parm_ref-ex(&parmblkp,
IPSET_SIP_MSGINFO,
IPPARM_CALLID_HDR,
(unsigned long)(strlen(pCallID)),
pCallID);
}
if (parmblkp == NULL)
{
// memory allocation error
return;
}
// transmit SUBSCRIBE message to network
retval = gc_Extension(GCTGT_GCLIB_CHAN, boardh,
IPEXTID_SENDMSG, parmblkp,
&retblkp, EV_ASYNC);
if (retval != GC_SUCCESS)
{
gc_ErrorInfo( &gc_error_info );
printf ("Error : gc_Extension() on HANDLE: 0x%lx,
GC ErrorValue: 0x%hx - %s, CCLibID: %i - %s,
CC ErrorValue: 0x%lx - %s\n", boardh,
gc_error_info.gcValue, gc_error_info.gcMsg,
gc_error_info.ccLibId, gc_error_info.ccLibName,
gc_error_info.ccValue, gc_error_info.ccMsg);
return;
}
// clean up
gc_util_delete_parm_blk(parmblkp);
m_bSubscribeSent = true;
}
4.15.2
Receiving Responses to SUBSCRIBE Requests
After a SUBSCRIBE request is sent, the remote entity responds with an accept or reject reply,
which the call control library passes to the application as a GCEV_EXTENSION event of type
IPEXTID_RECEIVEMSG.
The data associated with the Extension event will contain the following parameter element:
IPSET_MSG_SIP
IPPARM_MSGTYPE
and one of the following two values:
• IP_MSGTYPE_SIP_SUBSCRIBE_ACCEPT
• IP_MSGTYPE_SIP_SUBSCRIBE_REJECT
Additionally, the subscriber application may periodically receive an event that indicates the
expiration of the subscription duration. Note that the application does not have to respond to an
expiration message because the message indicates that the transaction is no longer active. The data
associated with the expiration message event is:
IPSET_MSG_SIP
IPPARM_MSGTYPE
• value = IP_MSGTYPE_SIP_SUBSCRIBE_EXPIRE
The application must retrieve the necessary SIP message header information by copying it into its
own buffer before the next call to gc_GetMetaEvent( ). Once the next gc_GetMetaEvent( ) call is
issued, the header information is no longer available from the metaevent buffer.
The following example code illustrates the general procedure for extracting information from the
Extension event for any of the incoming messages associated with the SUBSCRIBE and NOTIFY
methods.
// main event loop
// get a GCEV_EXTENSION event and process it
void process_event(void)
{
METAEVENT metaevent;
int
evttype;
gc_GetMetaEvent(&metaevent);
evttype = metaevent.evttype;
GC_PARM_BLK *pParmBlock = NULL;
GC_PARM_DATA *parmp = NULL;
switch (evttype)
{
case GCEV_EXTENSION:
OnExtensionEvent(&metaevent);
break;
}
}
// process GCEV_EXTENSION event
// get SIP Msg and SIP Msg Info
void OnExtensionEvent(METAEVENT *metaeventp)
{
GC_PARM_BLK
*pParmBlock = NULL;
EXTENSIONEVTBLK *pExtensionBlock = NULL;
GC_PARM_DATA
*parmp = NULL;
pExtensionBlock = (EXTENSIONEVTBLK*)(metaeventp->extevtdatap);
pParmBlock = &pExtensionBlock->parmblk;
parmp = NULL;
int CurrentMessage = 0;
// going thru each parameter block data
while ((parmp = gc_util_next_parm(pParmBlock,parmp)) != 0)
{
switch (parmp->set_ID)
{
// Handle SIP message information
case IPSET_MSG_SIP:
CurrentMessage = ProcessSIPMsg(parmp);
break;
/* Handle SIP message information */
case IPSET_SIP_MSGINFO:
ProcessSIPMsgInfo(parmp);
break;
default:
break;
}
}
pParmBlock = (GC_PARM_BLK*)(metaeventp->extevtdatap);
parmp = NULL;
}
// determine type of SIP Message and process accordingly
int CSubNotMgr::ProcessSIPMsg(GC_PARM_DATA *parmp)
{
int MessType=0;
switch (parmp->parm_ID)
{
case IPPARM_MSGTYPE:
{
MessType = (int)(*(parmp->value_buf));
switch (MessType)
{
case IP_MSGTYPE_SIP_SUBSCRIBE:
// process here
break;
case IP_MSGTYPE_SIP_SUBSCRIBE_ACCEPT:
// process here
break;
case IP_MSGTYPE_SIP_SUBSCRIBE_REJECT:
// process here
break;
case IP_MSGTYPE_SIP_SUBSCRIBE_EXPIRE:
// process here
break;
case IP_MSGTYPE_SIP_NOTIFY:
// process here
break;
case IP_MSGTYPE_SIP_NOTIFY_ACCEPT:
// process here
break;
case IP_MSGTYPE_SIP_NOTIFY_REJECT:
// process here
break;
default:
break;
}
break;
}
default:
break;
}
return MessType;
}
// process SIP Msg Info
void CSubNotMgr::ProcessSIPMsgInfo(GC_PARM_DATA *parmp)
{
char
requestURI[IP_REQUEST_URI_MAXLEN];
char
contactURI[IP_CONTACT_URI_MAXLEN];
char
diversionURI[IP_DIVERSION_URI_MAXLEN];
char
event[IP_EVENT_HDR_MAXLEN];
char
expires[IP_EXPIRES_HDR_MAXLEN];
switch (parmp->parm_ID)
{
case IPPARM_REQUEST_URI:
strncpy(requestURI,(char*)parmp->value_buf,parmp->value_size);
requestURI[parmp->value_size]='\0';
break;
case IPPARM_CONTACT_URI:
strncpy(contactURI,(char*)parmp->value_buf,parmp->value_size);
contactURI[parmp->value_size]='\0';
break;
case IPPARM_DIVERSION_URI:
strncpy(diversionURI,(char*)parmp->value_buf,parmp->value_size);
diversionURI[parmp->value_size]='\0';
break;
case IPPARM_EVENT_HDR:
strncpy(event,(char*)parmp->value_buf,parmp->value_size);
event[parmp->value_size]='\0';
break;
case IPPARM_EXPIRES_HDR:
strncpy(expires,(char*)parmp->value_buf,parmp->value_size);
expires[parmp->value_size]='\0';
break;
case IPPARM_CALLID_HDR:
strncpy(m_CurrentCallID,(char*)parmp->value_buf,parmp->value_size);
m_CurrentCallID[parmp->value_size]='\0';
break;
default:
break;
}
}
4.15.3
Receiving SUBSCRIBE Requests
When the SIP stack receives a SIP SUBSCRIBE request, the Dialogic® Global Call API library
generates an Extension event of type IPEXTID_RECEIVEMSG. The data associated with this
Extension event contains the following parameter element:
IPSET_MSG_SIP
IPPARM_MSGTYPE
• value = IP_MSGTYPE_SIP_SUBSCRIBE
The application can use the techniques described in Section 4.9.6, “Retrieving SIP Message Header
Fields” to retrieve message header fields of interest, including:
• To display string
• From display string
• Expires header field
• Event header field
• Call-ID header field
If the message has a body, the application can extract the MIME-encoded information using the
techniques described in Section 4.10.3, “Getting MIME Information”.
The application must retrieve the necessary SIP message header and body information by copying
the data into its own buffer before the next call to gc_GetMetaEvent( ). Once the next
gc_GetMetaEvent( ) call is issued, the message information is no longer available from the
metaevent buffer.
A code example that illustrates the general procedure for retrieving information from all incoming
messages associated with the SUBSCRIBE and NOTIFY methods is included in Section 4.15.2,
“Receiving Responses to SUBSCRIBE Requests”, on page 225.
4.15.4
Responding to SUBSCRIBE Requests
Once an application has received a GCEV_EXTENSION event for a SIP SUBSCRIBE request and
extracted the information from the event, it must send a response message.
The response is sent as an Extension message, passing a parameter block that contains the
following element:
IPSET_MSG_SIP
IPPARM_MSGTYPE
and one of the following two parameter values:
• IP_MSGTYPE_SIP_SUBSCRIBE_ACCEPT
• IP_MSGTYPE_SIP_SUBSCRIBE_REJECT
The “Accept” message is a 200 OK, while the “Reject” message is a 501 response. In either case,
the response message must include the Call-ID header field value that was received in the
SUBSCRIBE request so that the subscriber can match the response to the request.
The following two code snippets illustrate how an application would send “Accept” and “Reject”
responses to SUBSCRIBE requests.
“Accept” response to SUBSCRIBE request
When accepting a SUBSCRIBE request, a SIP entity normally includes an Expires header field,
which may contain the same value that was received in the Expires header field of the
SUBSCRIBE request or any smaller value.
void CSubNotMgr::SendSIPSubscribeAccept (char* pExpire)
{
char
str[MAX_STRING_SIZE];
sprintf(str, "<--- Sending SIP SUBSCRIBE Accept\n");
printandlog(ALL_DEVICES, MISC, NULL, str, 0);
GC_PARM_BLKP
GC_PARM_BLKP
GC_INFO
int
parmblkp = NULL;
// input parameter block pointer
retblkp = NULL;
// return parameter block
gc_error_info;
// GlobalCall error information data
retval = GC_SUCCESS;
gc_util_insert_parm_val(&parmblkp,
IPSET_MSG_SIP,
IPPARM_MSGTYPE,
sizeof(int),
IP_MSGTYPE_SIP_SUBSCRIBE_ACCEPT);
// Insert SIP Expire field
gc_util_insert_parm_ref_ex(&parmblkp,
IPSET_SIP_MSGINFO,
IPPARM_EXPIRES_HDR,
(unsigned long)(strlen(pExpire)),
pExpire);
// Insert SIP Call ID field
gc_util_insert_parm_ref_ex(&parmblkp,
IPSET_SIP_MSGINFO,
IPPARM_CALLID_HDR,
(unsigned long)(strlen(m_CurrentCallID)),
m_CurrentCallID);
if (parmblkp == NULL)
{
// memory allocation error
return;
}
// transmit NOTIFY message to network
retval = gc_Extension(GCTGT_GCLIB_CHAN, boardh,
IPEXTID_SENDMSG, parmblkp,
&retblkp, EV_ASYNC);
if (retval != GC_SUCCESS)
{
gc_ErrorInfo( &gc_error_info );
printf ("Error : gc_Extension() on HANDLE: 0x%lx,
GC ErrorValue: 0x%hx - %s, CCLibID: %i - %s,
CC ErrorValue: 0x%lx - %s\n", boardh,
gc_error_info.gcValue, gc_error_info.gcMsg,
gc_error_info.ccLibId, gc_error_info.ccLibName,
gc_error_info.ccValue, gc_error_info.ccMsg);
return;
}
// clean up
gc_util_delete_parm_blk(parmblkp);
m_bSubscribeAcceptSent = true;
}
“Reject” response to SUBSCRIBE request
void CSubNotMgr::SendSIPSubscribeReject (void)
{
char
str[MAX_STRING_SIZE];
sprintf(str, "<--- Sending SIP SUBSCRIBE Reject\n");
printandlog(ALL_DEVICES, MISC, NULL, str, 0);
GC_PARM_BLKP
GC_PARM_BLKP
GC_INFO
int
parmblkp = NULL;
// input parameter block pointer
retblkp = NULL;
// return parameter block
gc_error_info;
// GlobalCall error information data
retval = GC_SUCCESS;
gc_util_insert_parm_val(&parmblkp,
IPSET_MSG_SIP,
IPPARM_MSGTYPE,
sizeof(int),
IP_MSGTYPE_SIP_SUBSCRIBE_REJECT);
// Insert SIP Call ID field
gc_util_insert_parm_ref_ex(&parmblkp,
IPSET_SIP_MSGINFO,
IPPARM_CALLID_HDR,
(unsigned long)(strlen(m_CurrentCallID)),
m_CurrentCallID);
if (parmblkp == NULL)
{
// memory allocation error
return;
}
// transmit NOTIFY message to network
retval = gc_Extension(GCTGT_GCLIB_CHAN, boardh,
IPEXTID_SENDMSG, parmblkp,
&retblkp, EV_ASYNC);
if (retval != GC_SUCCESS)
{
gc_ErrorInfo( &gc_error_info );
printf ("Error : gc_Extension() on HANDLE: 0x%lx,
GC ErrorValue: 0x%hx - %s, CCLibID: %i - %s,
CC ErrorValue: 0x%lx - %s\n", boardh,
gc_error_info.gcValue, gc_error_info.gcMsg,
gc_error_info.ccLibId, gc_error_info.ccLibName,
gc_error_info.ccValue, gc_error_info.ccMsg);
return;
}
// clean up
gc_util_delete_parm_blk(parmblkp);
m_bSubscribeRejectSent = true;
}
4.15.5
Sending NOTIFY Requests
To send a NOTIFY message, the application begins by creating a GC_PARM_BLK that contains
an element of the following type:
IPSET_MSG_SIP
IPPARM_MSGTYPE
• value = IP_MSGTYPE_SIP_NOTIFY
The application adds elements for the desired header fields and one or more MIME body parts, if
appropriate, to the parameter block, then uses the gc_Extension( ) function to send the message.
The header fields that can be set and the general technique for setting them are described in
Section 4.9.5, “Setting SIP Header Fields for Outbound Messages”. The technique for constructing
MIME bodies is described in Section 4.10.4, “Sending MIME Information”.
The header fields that normally must be set in a NOTIFY request include the following:
• Request-URI
• To display string
• From display string
• Event header field
• Call-ID header field
If the NOTIFY being sent is a subscribed NOTIFY, the Call-ID header field must contain the same
Call-ID value as the SUBSCRIBE request that the NOTIFY relates to. For an unsubscribed
NOTIFY, the Call-ID header field must be NULL.
The following code snippet illustrates how an application constructs and sends a NOTIFY request.
void CSubNotMgr::SendSIPNotify ( char*
char*
char*
char*
char*
char*
pRequestURI,
pTo,
pFrom,
pEvent,
pBody,
pCallID)
{
char str[MAX_STRING_SIZE];
char *pBlankBody = " ";
sprintf(str, "<--- Sending SIP NOTIFY on device %d\n", hsendboard);
printandlog(ALL_DEVICES, MISC, NULL, str, 0);
GC_PARM_BLKP
GC_PARM_BLKP
GC_PARM_BLKP
GC_INFO
int
parmblkp = NULL;
//
parmblkbody = NULL; //
retblkp = NULL;
//
gc_error_info;
//
retval = GC_SUCCESS;
input parameter block pointer
body parms
return parameter block
GlobalCall error information data
// Insert SIP message type
gc_util_insert_parm_val(&parmblkp,
IPSET_MSG_SIP,
IPPARM_MSGTYPE,
sizeof(int),
IP_MSGTYPE_SIP_NOTIFY);
// Insert SIP Request-URI
if (pRequestURI)
{
gc_util_insert_parm_ref_ex(&parmblkp,
IPSET_SIP_MSGINFO,
IPPARM_REQUEST_URI,
(unsigned long)(strlen(pRequestURI)),
pRequestURI);
}
// Insert SIP To field
if (pTo)
{
gc_util_insert_parm_ref_ex(&parmblkp,
IPSET_SIP_MSGINFO,
IPPARM_TO_DISPLAY,
(unsigned long)(strlen(pTo)),
pTo);
}
// Insert SIP From field
if (pFrom)
{
gc_util_insert_parm_ref_ex(&parmblkp,
IPSET_SIP_MSGINFO,
IPPARM_FROM_DISPLAY,
(unsigned long)(strlen(pFrom)),
pFrom);
//Insert SIP Contact header field
gc_util_insert_parm_ref_ex(&parmblkp,
IPSET_SIP_MSGINFO,
IPPARM_CONTACT_URI,
(unsigned long)(strlen(pFrom)),
pFrom);
}
// Insert SIP Event field
if (pEvent)
{
gc_util_insert_parm_ref_ex(&parmblkp,
IPSET_SIP_MSGINFO,
IPPARM_EVENT_HDR,
(unsigned long)(strlen(pEvent)),
pEvent);
}
// Insert SIP CallID field
if (pCallID)
{
gc_util_insert_parm_ref-ex(&parmblkp,
IPSET_SIP_MSGINFO,
IPPARM_CALLID_HDR,
(unsigned long)(strlen(pCallID)),
pCallID);
}
// Insert the message Body
if (pBody)
{
// Insert Content-Type field
// Add 1 to strlen for the NULL termination character
gc_util_insert_parm_ref_ex(&parmblkbody,
IPSET_MIME,
IPPARM_MIME_PART_TYPE,
(unsigned long)(strlen(pBody) + 1),
pBody);
// Insert Body Size
gc_util_insert_parm_val(&parmblkbody,
IPSET_MIME,
IPPARM_MIME_PART_BODY_SIZE,
sizeof(unsigned long),
strlen(pBlankBody));
// Insert MIME part Body Pointer
gc_util_insert_parm_val(&parmblkbody,
IPSET_MIME,
IPPARM_MIME_PART_BODY,
sizeof(unsigned long),
(unsigned long)pBlankBody);
// Insert parm block B pointer to parm block A
gc_util_insert_parm_val(&parmblkp, //pParmBlockA,
IPSET_MIME,
IPPARM_MIME_PART,
sizeof(unsigned long),
(unsigned long)parmblkbody);
if (parmblkbody == NULL)
{
// memory allocation error
return;
}
}
if (parmblkp == NULL)
{
// memory allocation error
return;
}
// transmit NOTIFY message to network
retval = gc_Extension(GCTGT_GCLIB_CHAN,
hsendboard,
IPEXTID_SENDMSG,
parmblkp,
&retblkp,
EV_ASYNC);
if (retval != GC_SUCCESS)
{
gc_ErrorInfo( &gc_error_info );
printf ("Error : gc_Extension() on HANDLE: 0x%lx,
GC ErrorValue: 0x%hx - %s,
CCLibID: %i - %s,
CC ErrorValue: 0x%lx - %s\n",
boardh,
gc_error_info.gcValue,
gc_error_info.gcMsg,
gc_error_info.ccLibId,
gc_error_info.ccLibName,
gc_error_info.ccValue,
gc_error_info.ccMsg);
return;
}
// clean up
gc_util_delete_parm_blk(parmblkp);
if (pBody) gc_util_delete_parm_blk(parmblkbody);
m_bNotifySent=true;
}
4.15.6
Receiving Responses to NOTIFY Requests
After a NOTIFY request is sent, the remote entity responds with an accept or reject reply, which the
call control library sends to the application as a GCEV_EXTENSION event of type
IPEXTID_RECEIVEMSG.
The GC_PARM_BLK associated with the Extension event for a NOTIFY response contains the
following parameter element:
IPSET_MSG_SIP
IPPARM_MSGTYPE
and one of the following two values:
• IP_MSGTYPE_SIP_NOTIFY_ACCEPT
• IP_MSGTYPE_SIP_NOTIFY_REJECT
The application must retrieve the necessary SIP message header information by copying it into its
own buffer before the next call to gc_GetMetaEvent( ). Once the next gc_GetMetaEvent( ) call is
issued, the header information is no longer available from the metaevent buffer.
A code example that illustrates the general technique for retrieving information from all incoming
messages associated with the SUBSCRIBE and NOTIFY methods is included in Section 4.15.2,
“Receiving Responses to SUBSCRIBE Requests”, on page 225.
4.15.7
Receiving NOTIFY Requests
When the SIP stack receives a SIP NOTIFY request, the Dialogic® Global Call API library
generates an Extension event (GCEV_EXTENSION) of type IPEXTID_RECEIVEMSG.
The data associated with this Extension event contains a parameter element as follows:
IPSET_MSG_SIP
IPPARM_MSGTYPE
• value = IP_MSGTYPE_SIP_NOTIFY
Both subscribed and unsubscribed NOTIFY requests can be received; in the case of a subscribed
NOTIFY, the value of the Call-ID header field will match the Call-ID of a previously sent
SUBSCRIBE request.
The application can use the techniques described in Section 4.9.6, “Retrieving SIP Message Header
Fields” to retrieve message header fields of interest, including:
• To display string
• From display string
• Event header field
• Call-ID header field
If the message has a body, the application can extract the MIME-encoded information using the
techniques described in Section 4.10.3, “Getting MIME Information”.
The application must retrieve the necessary SIP message header and body information by copying
the data into its own buffer before the next call to gc_GetMetaEvent( ). Once the next
gc_GetMetaEvent( ) call is issued, the message information is no longer available from the
metaevent buffer.
A code example that illustrates the general procedure for retrieving information from all incoming
messages associated with the SUBSCRIBE and NOTIFY methods is included in Section 4.15.2,
“Receiving Responses to SUBSCRIBE Requests”, on page 225.
4.15.8
Responding to NOTIFY Requests
Once an application has received a GCEV_EXTENSION event for a SIP NOTIFY message (either
subscribed or unsubscribed) and extracted the information from the event, it must send a response
message.
The response is sent as an Extension message using the following parameter element in the
parameter block:
IPSET_MSG_SIP
IPPARM_MSGTYPE
and one of the following two parameter values:
• IP_MSGTYPE_SIP_NOTIFY_ACCEPT
• IP_MSGTYPE_SIP_NOTIFY_REJECT
For an “Accept” response the message sent is a 200 OK, while “Reject” sends a 501 response. In
either case, the response message must include the Call-ID header that was received in the
NOTIFY request.
The following two code snippets illustrate how an application would send “Accept” and “Reject”
responses to NOTIFY requests.
“Accept” Response to NOTIFY Request
void CSubNotMgr::SendSIPNotifyAccept ()
{
char
str[MAX_STRING_SIZE];
sprintf(str, "<--- Sending SIP NOTIFY Accept\n");
printandlog(ALL_DEVICES, MISC, NULL, str, 0);
GC_PARM_BLKP
GC_PARM_BLKP
GC_INFO
int
parmblkp = NULL; // input parameter block pointer
retblkp = NULL;
// return parameter block
gc_error_info;
// GlobalCall error information data
retval = GC_SUCCESS;
gc_util_insert_parm_val(&parmblkp,
IPSET_MSG_SIP,
IPPARM_MSGTYPE,
sizeof(int),
IP_MSGTYPE_SIP_NOTIFY_ACCEPT);
// Insert SIP Call ID field
gc_util_insert_parm_ref_ex(&parmblkp,
IPSET_SIP_MSGINFO,
IPPARM_CALLID_HDR,
(unsigned long)(strlen(m_CurrentCallID)),
m_CurrentCallID);
if (parmblkp == NULL)
{
// memory allocation error
return;
}
// transmit NOTIFY message to network
retval = gc_Extension(GCTGT_GCLIB_CHAN, boardh,
IPEXTID_SENDMSG, parmblkp,
&retblkp, EV_ASYNC);
if (retval != GC_SUCCESS)
{
gc_ErrorInfo( &gc_error_info );
printf ("Error : gc_Extension() on HANDLE: 0x%lx,
GC ErrorValue: 0x%hx - %s, CCLibID: %i - %s,
CC ErrorValue: 0x%lx - %s\n", boardh,
gc_error_info.gcValue, gc_error_info.gcMsg,
gc_error_info.ccLibId, gc_error_info.ccLibName,
gc_error_info.ccValue, gc_error_info.ccMsg);
return;
}
// clean up
gc_util_delete_parm_blk(parmblkp);
m_bNotifyAcceptSent = true;
}
“Reject” Response to NOTIFY Request
void CSubNotMgr::SendSIPNotifyReject (void)
{
char
str[MAX_STRING_SIZE];
sprintf(str, "<--- Sending SIP NOTIFY Reject\n");
printandlog(ALL_DEVICES, MISC, NULL, str, 0);
GC_PARM_BLKP
GC_PARM_BLKP
GC_INFO
int
parmblkp = NULL; // input parameter block pointer
retblkp = NULL; // return parameter block
gc_error_info;
// GlobalCall error information data
retval = GC_SUCCESS;
gc_util_insert_parm_val(&parmblkp,
IPSET_MSG_SIP,
IPPARM_MSGTYPE,
sizeof(int),
IP_MSGTYPE_SIP_NOTIFY_REJECT);
// Insert SIP Call ID field
gc_util_insert_parm_ref_ex(&parmblkp,
IPSET_SIP_MSGINFO,
IPPARM_CALLID_HDR,
(unsigned long)(strlen(m_CurrentCallID)),
m_CurrentCallID);
if (parmblkp == NULL)
{
// memory allocation error
return;
}
// transmit NOTIFY message to network
retval = gc_Extension(GCTGT_GCLIB_CHAN, boardh,
IPEXTID_SENDMSG, parmblkp,
&retblkp, EV_ASYNC);
if (retval != GC_SUCCESS)
{
gc_ErrorInfo( &gc_error_info );
printf ("Error : gc_Extension() on HANDLE: 0x%lx,
GC ErrorValue: 0x%hx - %s, CCLibID: %i - %s,
CC ErrorValue: 0x%lx - %s\n", boardh,
gc_error_info.gcValue, gc_error_info.gcMsg,
gc_error_info.ccLibId, gc_error_info.ccLibName,
gc_error_info.ccValue, gc_error_info.ccMsg);
return;
}
// clean up
gc_util_delete_parm_blk(parmblkp);
m_bNotifyRejectSent = true;
}
4.16
Handling DTMF
DTMF handling is described under the following topics:
• Specifying DTMF Support
• Getting Notification of DTMF Detection
• Generating DTMF
• Generating or Detecting DTMF Tones Using a Voice Resource
4.16.1
Specifying DTMF Support
The Dialogic® Global Call API can be used to configure which DTMF transmission modes are
supported by the application. The DTMF mode can be specified in one of three ways:
• for all line devices simultaneously by using gc_SetConfigData( )
• on a per-line device basis by using gc_SetUserInfo( ) with a duration parameter value of
GC_ALLCALLS
• on a per-call basis by using gc_SetUserInfo( ) with a duration parameter value of
GC_SINGLECALL
The GC_PARM_BLK associated with the gc_SetConfigData( ) or gc_SetUserInfo( ) function is
used to indicate which DTMF modes are supported. The GC_PARM_BLK should include the
following parameter element
IPSET_DTMF
IPPARM_SUPPORT_DTMF_BITMASK
• value = a single bitmask value or the OR of more than one value to specify multiple
supported DTMF transmission modes
The IPPARM_SUPPORT_DTMF_BITMASK parameter can only be replaced rather than
modified. For each gc_SetConfigData( ) or gc_SetUserInfo( ) call, the previous value of the
IPPARM_SUPPORT_DTMF_BITMASK parameter is overwritten.
Bitmask values for SIP
SIP applications must set the DTMF signaling mode before calling gc_MakeCall( ),
gc_AnswerCall( ), gc_AcceptCall( ), or gc_CallAck( ). If a SIP application does not do this, the
function call fails with an IPERR_NO_DTMF_CAPABILITY indication. Supported bitmask
values are:
IP_DTMF_TYPE_INBAND_RTP
DTMF digits are sent and received inband via standard RTP transcoding.
Inband mode cannot be used when using low bit-rate (LBR) coders.
IP_DTMF_TYPE_RFC_2833
DTMF digits are sent and received in the RTP stream as defined in RFC 2833.
Bitmask values for H.323
An H.323 application that supports only the default H.245 User Input Indication (UII)
Alphanumeric mode does not need to explicitly set the DTMF signaling mode. All other
applications must set the DTMF mode using the following bitmask values:
IP_DTMF_TYPE_ALPHANUMERIC (default)
DTMF digits are sent and received in H.245 UII Alphanumeric messages.
HMP only supports the H.245 UII Alphanumeric mode; H.245 UII Signal mode is
not supported.
IP_DTMF_TYPE_INBAND_RTP
DTMF digits are sent and received inband via standard RTP transcoding.
Inband mode cannot be used when using low bit-rate (LBR) coders.
IP_DTMF_TYPE_RFC_2833
DTMF digits are sent and received in the RTP stream as defined in RFC 2833.
As an example, the following code snippet shows how to specify the out-of-band signaling mode
for all calls on a line device:
{
GC_PARM_BLKP parmblkp = NULL;
gc_util_insert_parm_val(&parmblkp,
IPSET_DTMF,
IPPARM_SUPPORT_DTMF_BITMASK,
sizeof(char),
IP_DTMF_TYPE_INBAND_RTP);
if (gc_SetUserInfo(GCTGT_GCLIB_CHAN, port[callindex].ldev,
parmblkp, GC_ALLCALLS) != GC_SUCCESS) {
// gc_SetUserInfo returned an error
}
gc_util_delete_parm_blk(parmblkp);
The mode in which DTMF is transmitted (Tx) is determined by the intersection of the mode values
specified by the IPPARM_SUPPORT_DTMF_BITMASK and the receive capabilities of the
remote endpoint. When this intersection includes multiple modes, the selected mode is based on
the following priority:
1. RFC 2833
2. H.245 UII Alphanumeric (H.323 only)
3. Inband
The mode in which DTMF is received (Rx) is based on the selection of transmission mode from the
remote endpoint; however, RFC 2833 can only be received if RFC 2833 is specified by the
IPPARM_SUPPORT_DTMF_BITMASK parameter ID.
Table 14 summarizes the DTMF mode settings and associated behavior.
Table 14. Summary of DTMF Mode Settings and Behavior
IP_DTMF_TYPE_
RFC_2833
IP_DTMF_TYPE_
ALPHANUMERIC
IP_DTMF_TYPE_
INBAND
Transmit (Tx)
DTMF Mode
Receive (Rx)
DTMF Mode
When using RFC 2833, the payload type is specified using the following parameter element:
IPSET_DTMF
IPPARM_DTMF_RFC2833_PAYLOAD_TYP
and one of the following values:
• IP_USE_STANDARD_PAYLOADTYPE – (default payload type (101)
• any value in the range 96 to 127 – (dynamic payload type
4.16.2
Getting Notification of DTMF Detection
Once DTMF support has been configured (see Section 4.16.1, “Specifying DTMF Support”, on
page 238), the application can specify which DTMF modes will provide notification when DTMF
digits are detected. The events for this notification must be enabled; see Section 4.6.1, “Enabling
and Disabling Unsolicited Notification Events”, on page 154.
Once the events are enabled, when an incoming DTMF digit is detected, the application receives a
GCEV_EXTENSION event, with an extID of IPEXTID_RECEIVE_DTMF. The
GCEV_EXTENSION event contains the digit and the method. The GC_PARM_BLK associated
with the event contains the IPSET_DTMF parameter set ID and the following parameter ID:
IPPARM_DTMF_ALPHANUMERIC
For H.323, DTMF digits are received in H.245 User Input Indication (UII) alphanumeric
messages. The parameter value is a data structure of type IP_DTMF_DIGITS (it is not a
string). See the reference page for IP_DTMF_DIGITS on page 547 for more information. For
SIP, this parameter is not supported.
4.16.3
Generating DTMF
Once DTMF support has been configured (see Section 4.16.1, “Specifying DTMF Support”, on
page 238), the application can use the gc_Extension( ) function to generate DTMF digits. The
relevant gc_Extension( ) function parameter values in this context are:
• target_type should be GCTGT_GCLIB_CRN
• target_id should be the actual CRN
• ext_ID should be IPEXTID_SEND_DTMF
The GC_PARM_BLK pointed to by the parmblkp parameter must contain the IPSET_DTMF
parameter set ID and the following parameter ID:
IPPARM_DTMF_ALPHANUMERIC
For H.323, specifies that DTMF digits are to be sent in H.245 User Input Indication (UII)
Alphanumeric messages. For SIP, this parameter is not supported.
4.16.4
Generating or Detecting DTMF Tones Using a Voice
Resource
Using a voice resource to generate or detect DTMF tones in Inband or RFC2833 DTMF transfer
mode requires that the voice resource (for example, dxxxB1C1) be attached to the IPT network
device (for example, iptB1T1) that also has an IP Media device (ipmB1C1) attached. This can be
achieved using the gc_OpenEx( ) function as follows:
gc_OpenEx(lindevice, ":P_IP:N_iptB1T1:M_ipmB1C1:V_dxxxB1C1", EV_ASYNC, userattr)
where:
• linedevice is a Global Call device
• P_IP indicates that the device supports both the H.323 and SIP protocols
• N_iptB1T1 identifies the IPT network device
• M_ipmB1C1 identifies the IPT Media device
• V_dxxxB1C1 specifies the voice resource that will be used to generate or detect the DTMF
tones
• EV_ASYNC indicates the function operates in asynchronous mode
• userattr points to a buffer where user information can be stored
Alternatively, the IPT network device and IP Media device can be opened without the voice
resource, and the IP line device can be routed to the voice device when needed.
Once the voice resource is attached to the IPT network and IPT Media devices, the following voice
library functions can be used:
• dx_dial( ) to generate DTMF tones
• dx_getdig( ) to detect DTMF tones
4.17
Sending Nonstandard Protocol Messages (H.323)
The Dialogic® Global Call API library allows applications that are using the H.323 protocol to
send certain messages that contain Nonstandard Data. This capability is supported for the
following message types:
• User Input Indication (UII) message (H.245)
• Facility messages (Q.931)
• Registration messages
Table 15 summarizes the set IDs and parameter IDs used to send the messages and describes the
call states in which each message should be sent.
Table 15. Summary of Protocol Messages that Can be Sent with Nonstandard Data
Type
Set ID & Parameter ID
When Message Should be Sent
The maximum length of the Global Call parameter used for the Nonstandard Data information is
configured at start-up via the max_parm_data_size field in the IPCCLIB_START_DATA structure.
The default size is 255 (for backwards compatibility), but applications may configure it to be as
large as 4096 bytes. Applications must use the extended gc_util_..._ex( ) functions to insert or
extract any GC_PARM_BLK parameter elements whose data length is defined to be greater than
255.
In practice, applications may not be able to utilize the full maximum length of the nonstandard data
parameter element as configured in max_parm_data_size. The H.323 stack limits the overall size of
messages to be max_parm_data_size + 512 bytes, and any messages that exceed this limit are
truncated without any notification to the application.
4.17.1
Nonstandard UII Message (H.245)
To send nonstandard UII messages, use the gc_Extension( ) function in asynchronous mode with
an ext_id (extension ID) of IPEXTID_SENDMSG. The target_type should be
GCTGT_GCLIB_CRN and the target_id should be the actual CRN. The GC_PARM_BLK must
contain parameter elements that identify the message type, the nonstandard data, and the
nonstandard data identifier. At the sending end, reception of a GCEV_EXTENSIONCMPLT event
indicates that the message has been sent.
The parameter element that identifies the message type is:
IPSET_MSG_H245
IPPARM_MSGTYPE
• value = IP_MSGTYPE_H245_INDICATION
The parameter element for the Nonstandard Data data is:
IPSET_NONSTANDARDDATA
IPPARM_NONSTANDARDDATA_DATA
• value = Nonstandard Data string, max length = max_parm_data_size (configurable at
library start-up)
The parameter element for the Nonstandard Data identifier is one (and only one) of the following:
IPSET_NONSTANDARDDATA
IPPARM_NONSTANDARDDATA_OBJID
• value = array of unsigned integers, max length = MAX_NS_PARM_OBJID_LENGTH
IPSET_NONSTANDARDDATA
IPPARM_H221NONSTANDARD
• value = IP_H221NONSTANDARD structure
When the Dialogic® Global Call API library receives a nonstandard UII message, it generates a
GCEV_EXTENSION event with the ext_id value IPEXTID_RECEIVEMSG. The extevtdatap
field in the METAEVENT structure for the GCEV_EXTENSION event is a pointer to an
EXTENSIONEVTBLK structure which in turn contains a GC_PARM_BLK that includes all of the
data in the message.
See Section 9.2.13, “IPSET_MSG_H245”, on page 523 and Section 9.2.18,
“IPSET_NONSTANDARDDATA”, on page 526 for more information.
.
.
.
/* H245 UII with ObjId and data */
rc = gc_util_insert_parm_val(&t_PrmBlkp, IPSET_MSG_H245, IPPARM_MSGTYPE,
sizeof(int), IP_MSGTYPE_H245_INDICATION);
rc = gc_util_insert_parm_ref_ex(&t_PrmBlkp, IPSET_NONSTANDARDDATA,
IPPARM_NONSTANDARDDATA_OBJID, ObjLen+1, ObjId);
rc = gc_util_insert_parm_ref_ex(&t_PrmBlkp, IPSET_NONSTANDARDDATA,
IPPARM_NONSTANDARDDATA_DATA, DataLen+1, data);
if (rc == -1)
{
printf("Fail to insert parm");
return -1;
}
else
printf("Sending IP H245 UII Message");
gc_Extension(GCTGT_GCLIB_CRN,
crn,
IPEXTID_SENDMSG,
t_PrmBlkp,
&t_RetBlkp,
EV_ASYNC);
gc_util_delete_parm(t_PrmBlkp);
.
.
.
4.17.2
Nonstandard Facility Message (Q.931)
To send a nonstandard Facility message, use the gc_Extension( ) function in asynchronous mode
with an ext_id (extension ID) of IPEXTID_SENDMSG. The target_type should be
GCTGT_GCLIB_CRN and the target_id should be the actual CRN. The GC_PARM_BLK must
contain parameter elements that identify the message type, the nonstandard data, and the
nonstandard data identifier. At the sending end, reception of a GCEV_EXTENSIONCMPLT event
indicates that the message has been sent.
The parameter element that identifies the message type is:
IPSET_MSG_Q931
IPPARM_MSGTYPE
• value = IP_MSGTYPE_Q931_FACILITY
The parameter element for the Nonstandard Data data is:
IPSET_NONSTANDARDDATA
IPPARM_NONSTANDARDDATA_DATA
• value = Nonstandard Data string, max length = max_parm_data_size (configurable at
library start-up)
The parameter element for the Nonstandard Data identifier is one (and only one) of the following:
IPSET_NONSTANDARDDATA
IPPARM_NONSTANDARDDATA_OBJID
• value = array of unsigned integers, max length = MAX_NS_PARM_OBJID_LENGTH
IPSET_NONSTANDARDDATA
IPPARM_H221NONSTANDARD
• value = IP_H221NONSTANDARD structure
When the Dialogic® Global Call API library receives a nonstandard Facility message, it generates a
GCEV_EXTENSION event with the ext_id value IPEXTID_RECEIVEMSG. The extevtdatap
field in the METAEVENT structure for the GCEV_EXTENSION event is a pointer to an
EXTENSIONEVTBLK structure which in turn contains a GC_PARM_BLK that includes all of the
data in the message.
See Section 9.2.14, “IPSET_MSG_Q931”, on page 523 and Section 9.2.18,
“IPSET_NONSTANDARDDATA”, on page 526 for more information.
The following code shows how to set up and send a Q.931 nonstandard facility message.
char ObjId[]= "1 22 333 4444";
char NSData[]= "DataField_Facility";
GC_PARM_BLKP
gcParmBlk = NULL;
gc_util_insert_parm_val(&gcParmBlk,
IPSET_MSG_Q931,
IPPARM_MSGTYPE,
sizeof(int),
IP_MSGTYPE_Q931_FACILITY);
gc_util_insert_parm_ref(&gcParmBlk,
IPSET_NONSTANDARDDATA,
IPPARM_NONSTANDARDDATA_OBJID,
sizeof(ObjId),
ObjId);
gc_util_insert_parm_ref_ex(&gcParmBlk,
IPSET_NONSTANDARDDATA,
IPPARM_NONSTANDARDDATA_DATA,
sizeof(NSData),
NSData);
gc_Extension( GCTGT_GCLIB_CRN,
crn,
IPEXTID_SENDMSG,
gcParmBlk,
NULL,
EV_ASYNC);
gc_util_delete_parm_blk(gcParmBlk);
4.17.3
Nonstandard Registration Message
To send a nonstandard registration message, use the gc_Extension( ) function in asynchronous
mode with an ext_id (extension ID) of IPEXTID_SENDMSG. The target_type should be
GCTGT_CCLIB_NETIF and the target_id should be the board device handle, since the message
destination is the Gatekeeper. The GC_PARM_BLK must contain parameter elements that identify
H.323 protocol, the message type, the nonstandard data, and the nonstandard data identifier. The
application receives a GCEV_EXTENSIONCMPLT event to indicate that the message has been
sent.
The following parameter element sets the protocol to be H.323:
IPSET_PROTOCOL
IPPARM_PROTOCOL_BITMASK
• value = IP_PROTOCOL_H323
The parameter element that identifies the message type is:
IPSET_MSG_REGISTRATION
IPPARM_MSGTYPE
• value = IP_MSGTYPE_REG_NONSTD
The parameter element for the Nonstandard Data data is:
IPSET_NONSTANDARDDATA
IPPARM_NONSTANDARDDATA_DATA
• value = Nonstandard Data string, max length = max_parm_data_size (configurable at
library start-up)
The parameter element for the Nonstandard Data identifier is one (and only one) of the following:
IPSET_NONSTANDARDDATA
IPPARM_NONSTANDARDDATA_OBJID
• value = array of unsigned integers, max length = MAX_NS_PARM_OBJID_LENGTH
IPSET_NONSTANDARDDATA
IPPARM_H221NONSTANDARD
• value = IP_H221NONSTANDARD structure
The following code snippet illustrates how to send an H.323 nonstandard registration message.
{
GC_PARM_BLKP parmblkp = NULL;
char h221nonstd_id[] = "My H.221 Nonstandard data identifier";
/* must be <= MAX_NS_PARM_OBJID_LENGTH (40) */
char nonstd_data[] = "My nonstandard_data";
gc_util_insert_parm_val(&parmblkp, IPSET_PROTOCOL, IPPARM_PROTOCOL_BITMASK,
sizeof(char), IP_PROTOCOL_H323);
gc_util_insert_parm_val(&parmblkp, IPSET_MSG_REGISTRATION, IPPARM_MSGTYPE,
sizeof(unsigned long), IP_MSGTYPE_REG_NONSTD);
gc_util_insert_parm_ref_ex(&parmblkp, IPSET_NONSTANDARDDATA, IPPARM_NONSTANDARDDATA_DATA,
sizeof(nonstd_data), nonstd_data);
gc_util_insert_parm_ref(&parmblkp, IPSET_NONSTANDARDDATA, IPPARM_H221NONSTANDARD,
sizeof(h221nonstd_id), h221nonstd_id);
if (gc_Extension(GCTGT_CCLIB_NETIF, bdev, IPEXTID_SENDMSG, parmblkp, NULL,
EV_ASYNC) != GC_SUCCESS)
{
printandlog(ALL_DEVICES, GC_APIERR, NULL, "gc_Extension() Failed", 0);
exitdemo(1);
}
}
See Section 9.2.15, “IPSET_MSG_REGISTRATION”, on page 523 and Section 9.2.18,
“IPSET_NONSTANDARDDATA”, on page 526 for more information.
4.17.4
Sending Facility, UII, or Registration Message Scenario
The gc_Extension( ) function can be used to send H.245 UII messages or Q.931 nonstandard
facility messages. Figure 50 shows this scenario.
An H.245 UII message can only be sent when a call is in the connected state. A Q.931 nonstandard
facility message can be sent in any call state.
Figure 50. Sending Protocol Messages
Sender
Application
Receiver
GlobalCall
GlobalCall
Application
gc_Extension( )
(ip_ext = IPEXTID_SENDMSG)
GCEV_EXTENSIONCMPLT
GCEV_EXTENSION
(ip_ext = IPEXTID_RECEIVEMSG)
4.18
Using H.323 Annex M Tunneled Signaling Messages
The Dialogic® Global Call API IP call control library supports the tunneled signaling message
capability that is documented in Annex M of the ITU-T recommendations for H.323. This
capability allows DSS/QSIG/ISUP messages to be encapsulated in common H.225 call signaling
messages. Note that this tunneled message capability is separate and distinct from H.245
tunnelling.
The tunneled signaling message capabilities are described in the following topics:
• Tunneled Signaling Message Overview
• Enabling Tunneled Signaling Messages
• Composing Tunneled Signaling Messages
• Sending Tunneled Signaling Messages
• Receiving Tunneled Signaling Messages
4.18.1
Tunneled Signaling Message Overview
The ITU-T H.323 Annex M recommendation specifies that tunneled signaling message fields may
be contained in any of nine different H.225 messages: Setup, Call Proceeding, Alerting, Connect,
Release Complete, Facility, Progress, Information, and Notify. The Global Call implementation of
tunneled signaling messages allows applications to send and receive tunneled messages in the first
six of the listed H.225 messages. The Dialogic® Global Call API library does not support
application access to the last three messages in the list of messages specified in Annex M
(Progress, Information, and Notify) so these message types cannot be used for tunneled signaling
messages.
The Dialogic® Global Call API library supports the ability to send and receive tunneled signaling
messages in supported H.225 message types as an optional feature that is disabled by default for
backwards compatibility. The ability to send and receive TSMs can only be enabled when starting
the system; once enabled, the tunneled signaling message feature cannot be disabled without
restarting the system. The feature can be enabled for any virtual board by setting a specific bitmask
value in a field of the appropriate IP_VIRTBOARD data structure; see Section 4.18.2, “Enabling
Tunneled Signaling Messages”, for details. When the feature is enabled, applications can use the
standard Global Call parameter mechanism to set up a TSM to be sent in the next outgoing H.225
message. To receive a TSM, the application requests the Dialogic® Global Call API library to
forward the TSM after it has received a Global Call state change event that is associated with one of
the supported message types. For most H.225 message types, the application uses gc_Extension( )
to request the TSM contents which the library returns via a GCEV_EXTENSIONCMPLT
asynchronous completion event. In the singular case of the Facility message, the tunneled signaling
message content is provided via the unsolicited GCEV_EXTENSION event that notifies the
application of the Facility message itself.
An application has no ability to specify which H.225 message types it wishes to receive tunneled
signaling messages in, and should therefore be prepared to handle TSMs contained in any of the
specified H.225 message types so that TSMs are not lost.
Applications construct a tunneled signaling message by constructing a GC_PARM_BLK
composed of Global Call parameter elements that contain the TSM protocol identification and
message content. The TSM protocol identification can use either a protocol object ID, specified in
an IP_TUNNELPROTOCOL_OBJECTID data structure, or alternate identification data, specified
in an IP_TUNNELPROTOCOL_ALTID structure. Only one TSM can be sent per H.225 message.
A tunneled signaling message can also include nonstandard data. The nonstandard data is handled
as additional parameter elements in the same GC_PARM_BLK that contains the TSM. As in other
Global Call implementations of nonstandard data, the protocol used for the nonstandard data in a
TSM can be identified by either H.221 protocol or a protocol object ID. Only one nonstandard data
element can be sent per tunneled signaling message.
The maximum data length for the Global Call parameters used for the tunneled signaling message
content and the optional nonstandard data content is configured at system start-up. The maximum
data length for these parameters is configured by setting the max_parm_data_size field in the
IPCCLIB_START_DATA structure. The default size is 255 bytes (for backwards compatibility),
but applications may configure it to be as large as 4096 bytes. Applications must use the extended
gc_util_..._ex( ) functions to insert or extract any GC_PARM_BLK parameter elements whose
data length has been configured to be greater than 255 bytes.
In practice, applications may not be able to utilize the full maximum length of the tunneled
signaling message content parameter element as configured in max_parm_data_size, particularly if
the tunneled signaling message contains optional nonstandard data. The H.323 stack limits the
overall size of messages to be max_parm_data_size + 512 bytes, and any messages that exceed this
limit are truncated without any notification to the application.
For all supported H.225 message types except Setup, the application presets the TSM contents to
send by passing the configured GC_PARM_BLK in a call to the gc_SetUserInfo( ) function. When
the application subsequently calls one of the Global Call functions listed in Table 16, “H.225
Messages and Global Call Functions for Sending Tunneled Signaling Messages”, on page 253, the
library and stack use the preset data to construct and send a tunneled signaling message in the
248
Dialogic Corporation
corresponding H.225 message. The duration parameter in the gc_SetUserInfo( ) function must
always be GC_SINGLECALL; TSM content cannot persist for more than one H.225 message.
The gc_SetUserInfo( ) mechanism cannot be used to preset a tunneled signaling message to be
sent in a Setup message because the function call requires a valid CRN, which does not yet exist at
that point in the call setup process. When sending a TSM in Setup, the application must include the
configured GC_PARM_BLK in the GC_MAKECALL_BLK data structure that is passes to the
gc_MakeCall( ) function.
Table 16, “H.225 Messages and Global Call Functions for Sending Tunneled Signaling Messages”,
on page 253 lists the H.225 message types that can be used to send tunneled signaling messages
along with the corresponding Global Call mechanism that is used set the TSM information and the
Global Call function that is used to send each message type.
When reception of tunneled signaling messages is enabled as described in the “Enabling Tunneled
Signaling Messages” section, applications must specifically request the message by calling the
gc_Extension( ) function and providing a tag value that identifies the specific type of H.225
message that was received. When the corresponding H.225 message contains a tunneled signaling
message, the library generates an asynchronous GCEV_EXTENSIONCMPLT completion event
which includes the tunneled signaling message information in the metaevent data. Tunneled
signaling messages can only be retrieved within a call (the application must use a valid CRN when
registering to receive tunneled signaling messages), but the call can be in any state.
4.18.2
Enabling Tunneled Signaling Messages
The ability to send tunneled signaling messages in outgoing H.225 messages and to retrieve TSM
content from inbound H.225 messages is an optional feature that is enabled or disabled on a virtual
board basis at the time the gc_Start( ) function is called.
The mandatory INIT_IP_VIRTBOARD( ) function populates the IP_VIRTBOARD structure
with default values. The default value of the h323_msginfo_mask field in the IP_VIRTBOARD
structure does not enable either access to either Q.931 message information elements or to tunneled
signaling messages. To enable either or both of these features for an ipt device, it is necessary to
override the default value of the h323_msginfo_mask field with a value that represents the
appropriate logical combination of the two defined mask values. To enable access to tunneled
signaling messages in general, the value IP_H323_ANNEXMMSG_ENABLE must be set in the
mask. The following code snippet enables Q.931 message IE access on two virtual boards and
enables tunneled signaling messages on the second board only:
INIT_IPCCLIB_START_DATA(&ipcclibstart, 2, ip_virtboard);
INIT_IP_VIRTBOARD(&ip_virtboard[0]);
INIT_IP_VIRTBOARD(&ip_virtboard[1]);
ip_virtboard[0].h323_msginfo_mask = IP_H323_MSGINFO_ENABLE;
/* override Q.931 message default */
ip_virtboard[1].h323_msginfo_mask = IP_H323_MSGINFO_ENABLE | IP_H323_ANNEXMMSG_ENABLE;
/* override Q.931 message and TSM defaults */
Features that are enabled or configured via the IP_VIRTBOARD structure cannot be disabled or
reconfigured once the library has been started. All items set in this data structure take effect when
the gc_Start( ) function is called and remain in effect until gc_Stop( ) is called when the
application exits.
249
Dialogic Corporation
4.18.3
Composing Tunneled Signaling Messages
The process of sending a tunneled signaling message begins by composing a GC_PARM_BLK that
contains Global Call parameter elements for the message protocol, the message content, and any
nonstandard data.
The first parameter element identifies the message protocol. It must be one of the following two
forms:
IPSET_TUNNELEDSIGNALMSG
IPPARM_TUNNELEDSIGNALMSG_PROTOCOL_OBJECTID
• value = protocol object ID information in an IP_TUNNELPROTOCOL_OBJECTID data
structure and conforming to the appropriate ASN.1 format
IPSET_TUNNELEDSIGNALMSG
IPPARM_TUNNELEDSIGNALMSG_ALTERNATEID
• value = alternate protocol ID information in an IP_TUNNELPROTOCOL_ALTID data
structure
The second parameter element contains the actual message content. Applications should use the
gc_util_insert_parm_ref_ex( ) function to insert this parameter element because the parameter
data may exceed 255 bytes.
IPSET_TUNNELEDSIGNALMSG
IPPARM_TUNNELEDSIGNALMSG_CONTENT
• value = actual message content
max. length = max_parm_data_size (configured at library start-up)
In practice, applications may not be able to utilize the full maximum length of the TSM content
parameter element as configured in max_parm_data_size, particularly if the TSM also contains
non-standard data. The H.323 stack limits the overall size of messages to be max_parm_data_size
+ 512 bytes, and any messages that exceed this limit are truncated without any notification to the
application.
If the tunneled signal message includes optional nonstandard data, the GC_PARM_BLK needs to
contain two additional parameter elements. These parameters should only be inserted in the
GC_PARM_BLK if nonstandard data is being sent in the message. The first parameter element for
nonstandard data is:
IPSET_TUNNELEDSIGNALMSG
IPPARM_TUNNELEDSIGNALMSG_NSDATA_DATA
• value = actual nonstandard data, max. length = max_parm_data_size (configured at
library start-up)
Applications should use the gc_util_insert_parm_ref_ex( ) function to insert this parameter
element because the parameter data may exceed 255 bytes.
In practice, applications may not be able to utilize full maximum parameter length configured in
max_parm_data_size for nonstandard data content. The H.323 stack limits the overall size of
messages to be max_parm_data_size + 512 bytes, which must contain the tunneled signaling
message content as well as the nonstandard data.
250
Dialogic Corporation
The second parameter element for nonstandard data uses one of the following two forms:
IPSET_TUNNELEDSIGNALMSG
IPPARM_TUNNELEDSIGNALMSG_NSDATA_OBJID
• value = nonstandard data object ID string conforming to appropriate ASN.1 format
IPSET_TUNNELEDSIGNALMSG
IPPARM_TUNNELEDSIGNALMSG_NSDATA_H221NS
• value = H.221 nonstandard data protocol information in an IP_H221NONSTANDARD
data structure
The following code example illustrates the process of composing the parameter block for a
tunneled signaling message.
GC_PARM_BLKP
gcParmBlk = NULL;
IP_TUNNELPROTOCOL_ALTID
tsmTpAltId;
IP_TUNNELPROTOCOL_OBJECTID tsmTpObjId;
char *pMsgContent
= "00 11 22 33 44 55 44 33 33 66 66 55 77 22 11 11";
int asize = strlen(pMsgContent);
char *pTP_Oid
= "0 0 17 931";
// Note that the Object Id string must be in the correct ASN.1 format.
char TP_AltID_Type[]
= "Tunneled Protocol Alternate ID protocol type";
char TP_AltID_Variant[] = "Tunneled Protocol Alternate ID protocol variant";
char TP_AltID_SubId[]
= "Tunneled Protocol Alternate ID subidentifier - User";
char *ptsmNSData_Data
= "Tunneled Signaling Message Non Standard Data";
char *pTP_ObjID_Oid
= "0 0 17 931";
// Note that the Object Id string must be in the correct ASN.1 format.
char TP_ObjID_SubId[]
= "Tunneled Protocol Object ID subidentifier - User";
int bsize = strlen(TP_ObjID_SubId);
IP_H221NONSTANDARD tsmH221NS;
tsmH221NS.country_code = 91;
tsmH221NS.extension = 202;
tsmH221NS.manufacturer_code = 11;
INIT_IP_TUNNELPROTOCOL_ALTID(&tsmTpAltId);
strcpy(tsmTpAltId.protocolType, TP_AltID_Type);
tsmTpAltId.protocolTypeLength = strlen(TP_AltID_Type) + 1;
strcpy(tsmTpAltId.protocolVariant, TP_AltID_Variant);
tsmTpAltId.protocolVariantLength = strlen(TP_AltID_Variant) + 1;
strcpy(tsmTpAltId.subIdentifier, TP_AltID_SubId);
tsmTpAltId.subIdentifierLength = strlen(TP_AltID_SubId) + 1;
INIT_IP_TUNNELPROTOCOL_OBJECTID(&tsmTpObjId);
strcpy(tsmTpObjId.TunneledProtocol_Oid, pTP_ObjID_Oid);
tsmTpObjId.TunneledProtocol_OidLength = strlen(pTP_ObjID_Oid) + 1;
strcpy(tsmTpObjId.subIdentifier, TP_ObjID_SubId);
tsmTpObjId.subIdentifierLength = strlen(TP_ObjID_SubId) + 1;
choiceOfTSMProtocol = 1;
/* App decides whether to use the tunneled signaling message Protocol Object ID/ AltID */
choiceOfNSData = 1;
/* App decides which type of object identifier to use for TSM NS Data */
if (choiceOfTSMProtocol)
/* App decides the choice of the tunneled signaling msg protocol object identifier */
/* It cannot set both objid & alternate id */
{
gc_util_insert_parm_ref(&gcParmBlk,
IPSET_TUNNELEDSIGNALMSG,
IPPARM_TUNNELEDSIGNALMSG_ALTERNATEID,
(unsigned char)sizeof(IP_TUNNELPROTOCOL_ALTID),
&tsmTpAltId);
251
Dialogic Corporation
}
else
{
gc_util_insert_parm_ref(&gcParmBlk,
IPSET_TUNNELEDSIGNALMSG,
IPPARM_TUNNELEDSIGNALMSG_PROTOCOL_OBJECTID,
(unsigned char)sizeof(IP_TUNNELPROTOCOL_OBJECTID),
&tsmTpObjId);
/* Note the use of the extended gc_util function because TSM data may exceed 255 bytes */
gc_util_insert_parm_ref_ex(&gcParmBlk,
IPSET_TUNNELEDSIGNALMSG,
IPPARM_TUNNELEDSIGNALMSG_CONTENT,
(unsigned char)(strlen(pMsgContent)+1),
pMsgContent);
/* Now fill in the Tunneled Signaling message Non Standard data fields, if used */
/* Note the use of the extended gc_util function because NSD data may exceed 255 bytes */
gc_util_insert_parm_ref_ex(&gcParmBlk,
IPSET_TUNNELEDSIGNALMSG,
IPPARM_TUNNELEDSIGNALMSG_NSDATA_DATA,
(unsigned char)(strlen(ptsmNSData_Data)+1),
ptsmNSData_Data);
if (choiceOfNSData)
/* App decides the CHOICE of Non Standard OBJECTIDENTIFIER. */
/* It cannot set both objid & H221 */
{
// Set the NS Object ID
gc_util_insert_parm_ref(&gcParmBlk,
IPSET_TUNNELEDSIGNALMSG,
IPPARM_TUNNELEDSIGNALMSG_NSDATA_OBJID,
(unsigned char) (strlen(ptsmNSData_Oid)+1),
ptsmNSData_Oid
}
else
{
// Set the H221
gc_util_insert_parm_ref(&gcParmBlk,
IPSET_TUNNELEDSIGNALMSG,
IPPARM_TUNNELEDSIGNALMSG_NSDATA_H221NS,
(unsigned char)sizeof(IP_H221NONSTANDARD),
&tsmH221NS);
4.18.4
Sending Tunneled Signaling Messages
Once the GC_PARM_BLK containing the TSM information has been composed by the
application, the application must pass the parameter block to the call control library to be
transformed into a tunneled message that can be inserted into an H.225 message. The mechanism
used to hand the TSM information to the library varies depending on what Global Call function and
corresponding H.225 message will be used to send the TSM.
Table 16 lists the H.225 message types that can be used to send tunneled signaling messages along
with the corresponding Global Call mechanism that is used set the TSM information and the
Global Call function that is used to send each message type.
252
Dialogic Corporation
Table 16. H.225 Messages and Global Call Functions for Sending Tunneled Signaling
Messages
H.225 message to be
used to send TSM
Mechanism used to set
TSM to send
Global Call Function used to send H.225 message
containing TSM
Setup
GC_MAKECALL_BLK
gc_MakeCall( )
Proceeding
gc_SetUserInfo( )
(GC_SINGLECALL)
gc_CallAck( )
Alerting
gc_SetUserInfo( )
(GC_SINGLECALL)
gc_AcceptCall( )
Connected
gc_SetUserInfo( )
(GC_SINGLECALL)
gc_AnswerCall( )
Release Complete
gc_SetUserInfo( )
(GC_SINGLECALL)
gc_DropCall( )
Facility
gc_SetUserInfo( )
(GC_SINGLECALL)
gc_Extension( )
(IPEXTID_SENDMSG, IPSET_MSG_Q931,
IPPARM_MSGTYPE, IP_MSGTYPE_Q931_FACILITY)
Sending a TSM in a Setup Message
Once the GC_PARM_BLK is composed, the block is included in a GC_MAKECALL_BLK
structure via the intermediate GCLIB_MAKECALL_BLK structure, and that block is then passed
as a parameter in a call to gc_MakeCall( ). The Setup message that is sent as a result of the call to
gc_MakeCall( ) will contain a TSM with elements as specified in the GC_PARM_BLK.
The gc_SetUserInfo( ) function cannot be used to preset TSM information to be sent in a Setup
message because that function requires a valid CRN when setting a tunneled signaling message and
the CRN does not exist at this point in the call setup. The TSM can only be specified in the
GC_MAKECALL_BLK for a Setup message.
Sending a TSM in an Alerting, Connected, Facility, Proceeding, or
ReleaseComplete Message
To include a tunneled signaling message in any H.225 message other than a Setup message, the
application uses the gc_SetUserInfo( ) to preset the message data before calling the Global Call
function that causes the H.225 message to be sent. Data set via gc_SetUserInfo( ) applies to the
next outgoing message, so applications should be careful to call this function immediately before
the function that will send the intended H.225 message.
When calling gc_SetUserInfo( ), the parameters should be set as follows:
• target_type must be set to GCTGT_GCLIB_CRN
• target_id is the CRN
• infoparmblkp is a pointer to the GC_PARM_BLK that was configured with the parameter
elements for the tunneled signaling message
• duration must be set to GC_SINGLECALL
253
Dialogic Corporation
Four of the supported H.225 message types are sent as a direct result of a specific Global Call
function call for the CRN and require no other preparation after the gc_SetUserInfo( ):
• gc_AcceptCall( ) sends Alerting
• gc_AnswerCall( ) sends Connected
• gc_CallAck( ) sends Proceeding
• gc_DropCall( ) sends Release Complete
But because there is no call state change associated with the Facility message, there is no dedicated
Global Call function to send this message (nor is there a dedicated Global Call event to receive a
Facility message). Instead, Global Call uses the generic gc_Extension( ) mechanism to send and
receive Facility messages. Because of this, an application must construct a GC_PARM_BLK to
pass to the gc_Extension( ) function call to specify that it wishes to send a Facility message; note
that this GC_PARM_BLK is completely separate from the structure that sets up the TSM itself via
the gc_SetUserInfo( ) function. The GC_PARM_BLK passed to gc_Extension( ) must contain a
parameter element of the following type:
IPSET_MSG_Q931
IPPARM_MSGTYPE
• value = IP_MSGTYPE_Q931_FACILITY
The parameters for the gc_Extension( ) function call should be set as follows:
• target_type must be set to GCTGT_GCLIB_CRN
• target_id is the CRN
• ext_id must be set to IPEXTID_SENDMSG
• parmblkp is a pointer to the GC_PARM_BLK that was configured with the parameter
element for the Q.931 Facility message
• retblkp is NULL
• mode must be set to EV_ASYNC
4.18.5
Receiving Tunneled Signaling Messages
Assuming that the TSM feature was enabled when the virtual board was started, an application can
request the tunneled signaling message content whenever it receives a Global Call event that
corresponds to one of the supported H.225 message types. For all supported message types except
Facility, the application uses the gc_Extension( ) function and the extension ID
IPEXTID_GETINFO to request the TSM, and the TSM contents are transmitted in the external
data associated with the asynchronous GCEV_EXTENSIONCMPLT completion event for the
function call. In the case of the Facility message, Global Call notifies the application that it has
received the message via an unsolicited GCEV_EXTENSION event, and this event itself conveys
the TSM in its external data.
Table 17 relates the message types of the supported H.225 messages that can contain TSM fields to
the Global Call event types that are used to notify the application of the message’s arrival and the
tag that is used by the application when retrieving the TSM content.
254
Dialogic Corporation
Table 17. H.225 Messages and Global Call Events for Receiving Tunneled Signaling
Messages
H.225 message
Global Call event used
to notify application
Tag used to retrieve message fields
via GCEV_EXTENSIONCMPLT
Setup
GCEV_OFFERED
TSM_CONTENT_OFFERED
Proceeding
GCEV_PROCEEDING †
TSM_CONTENT_PROCEEDING
Alerting
GCEV_ALERTING
TSM_CONTENT_ALERTING
Connected
GCEV_CONNECTED
TSM_CONTENT_CONNECTED
Release Complete
GCEV_DISCONNECTED
TSM_CONTENT_DISCONNECTED
Facility
GCEV_EXTENSION
TSM_CONTENT_EXTENSION
† The GCEV_PROCEEDING event is maskable. When Tunneled Signalling Messages are enabled, the
application must ensure that this event is not masked.
Retrieving TSMs from Alerting, Connected, Proceeding,
ReleaseComplete, and Setup Messages
To retrieve TSM after receiving a Global Call state change event corresponding to an Alerting,
Connected, Proceeding, ReleaseComplete, or Setup message, the application first constructs a
GC_PARM_BLK that specifies the type of information it wishes to retrieve, then calls the
gc_Extension( ) function to request the information.
The GC_PARM_BLK must contain the following two parameter elements:
IPSET_TUNNELEDSIGNALMSG
IPPARM_TUNNELEDSIGNALMSG_CONTENT
• value is unused; set to 1
IPSET_TUNNELEDSIGNALMSG
IPPARM_TSM_CONTENT_EVENT
• value = appropriate TSM_CONTENT_... tag value as listed in Table 17
When the application calls gc_Extension( ), the parameters should be set up as follows:
• target_type must be GCTGT_GCLIB_CRN
• target_id must be a valid CRN
• ext_id must be IPEXTID_GETINFO
• parmblkp must point to the GC_PARM_BLK that was configured to contain the required
parameter element as just described.
• retblkp must be a valid pointer to a GC_PARM_BLK
• mode must be EV_ASYNC
If the received H.225 message contained a tunneled signaling message, the library generates an
asynchronous GCEV_EXTENSIONCMPLT completion event. The extevtdatap field in the
METAEVENT structure for this event is a pointer to an EXTENSIONEVTBLK structure, which in
turn contains a GC_PARM_BLK that contains the fields of the received tunneled signaling
255
Dialogic Corporation
message. Applications are then able to extract the data of interest using the gc_util_..._ex( )
functions.
The GC_PARM_BLK will always contain the following three parameter elements:
IPSET_TUNNELEDSIGNALMSG
IPPARM_TSM_CONTENT_EVENT
• value = the appropriate TSM_CONTENT_... tag value
one or the other of the following two elements:
IPSET_TUNNELEDSIGNALMSG
IPPARM_TUNNELEDSIGNALMSG_PROTOCOL_OBJECTID
• value = IP_TUNNELPROTOCOL_OBJECTID data structure
IPSET_TUNNELEDSIGNALMSG
IPPARM_TUNNELEDSIGNALMSG_ALTERNATEID
• value = IP_TUNNELPROTOCOL_ALTID data structure
and the following element:
IPSET_TUNNELEDSIGNALMSG
IPPARM_TUNNELEDSIGNALMSG_CONTENT
• value = tunneled signaling message content string
If the TSM includes optional nonstandard data, there will be two additional parameter elements:
IPSET_TUNNELEDSIGNALMSG
IPPARM_TUNNELEDSIGNALMSG_NSDATA_DATA
• value = nonstandard data string
and one of the following two elements:
IPSET_TUNNELEDSIGNALMSG
IPPARM_TUNNELEDSIGNALMSG_NSDATA_OBJID
• value = nonstandard data object ID string in ASN.1 format
IPSET_TUNNELEDSIGNALMSG
IPPARM_TUNNELEDSIGNALMSG_NSDATA_H221NS
• value = IP_H221NONSTANDARD data structure
Notes: 1. The application must take care to retrieve the Annex M Message information from any incoming
H.225 message before the next H.225 message arrives. If the new message also contains TSM
information, that new TSM overwrites the prior information.
2. The overall message size that the Global Call H.323 stack can handle is defined as
max_parm_data_size (which is configured at library startup) + 512 bytes. Any message that is
received which exceeds this length is truncated.
3. Parameter values that are contained in a GC_PARM_BLK are subject to maximum length limits
that are defined for each parameter type. Any data received in a TSM that exceeds these defined
limits is truncated without notification to the application.
4. The application should use the extended gc_util_..._ex( ) functions when extracting parameters
from a GC_PARM_BLK that contains TSM contents because some of the Global Call
parameters for TSMs support data length that may exceed 255 bytes.
256
Dialogic Corporation
TSM Retrieval Code Example
The following code example shows how an application might handle the process of requesting
tunneled signaling message after it has received a Global Call event associated with one of the
supported H.225 message types.
GC_PARM_BLKP gcParmBlk = NULL;
GC_PARM_BLKP retParmBlk;
GC_PARM_DATA_EXT parm_data_ext;
INIT_GC_PARM_DATA_EXT(&parm_data_ext);
int frc;
switch(event)
{
case GCEV_ALERTING:
frc = gc_util_insert_parm_val(&gcParmBlk,
IPSET_TUNNELEDSIGNALMSG,
IPPARM_TUNNELEDSIGNALMSG_CONTENT,
sizeof(int),
1);
frc = gc_util_insert_parm_val(&gcParmBlk,
IPSET_TUNNELEDSIGNALMSG,
IPPARM_TSM_CONTENT_EVENT,
sizeof(int),
TSM_CONTENT_ALERTING);
frc = gc_Extension(GCTGT_GCLIB_CRN,
crn,
IPEXTID_GETINFO,
gcParmBlk,
&retParmBlk,
EV_ASYNC);
break;
case GCEV_CONNECTED:
frc = gc_util_insert_parm_val(&gcParmBlk,
IPSET_TUNNELEDSIGNALMSG,
IPPARM_TUNNELEDSIGNALMSG_CONTENT,
sizeof(int),
1);
frc = gc_util_insert_parm_val(&gcParmBlk,
IPSET_TUNNELEDSIGNALMSG,
IPPARM_TSM_CONTENT_EVENT,
sizeof(int),
TSM_CONTENT_CONNECTED);
frc = gc_Extension(GCTGT_GCLIB_CRN,
crn,
IPEXTID_GETINFO,
gcParmBlk,
&retParmBlk,
EV_ASYNC);
break;
...
//Similar cases for other event types of interest
...
case GCEV_EXTNCMPLT:
GC_PARM_DATA *parmp = NULL;
while (GC_SUCCESS == (gc_util_next_parm_ex(parm_blk, &parm_data_ext)))
{
switch (parmp->set_ID)
{
case IPSET_TUNNELEDSIGNALMSG:
switch (parm_data_ext.parm_ID)
257
Dialogic Corporation
{
case IPPARM_TSM_CONTENT_EVENT:
printf("\tReceived TSM in message type: %s\n",
parm_data_ext.value_buf);
break;
case IPPARM_TUNNELEDSIGNALMSG_CONTENT:
printf("\tReceived extension data (TSM) Msg Content: %s\n",
parm_data_ext.value_buf);
break;
case IPPARM_TUNNELEDSIGNALMSG_PROTOCOLOBJID:
printf("\tReceived extension data (TSM) PROTOCOL_OBJID:
%s\n", parm_data_ext.value_buf);
break;
case IPPARM_TUNNELEDSIGNALMSG_ALTERNATEID:
printf("\tReceived extension data (TSM) TUNNELPROTOCOL_ALTID:
%s\n", parm_data_ext.value_buf);
break;
// Additional cases for optional NSD
...
}
}
}
4.19
Retrieving User-to-User Information Elements from
H.323 Messages
Various ITU-T recommendations specify User-to-User Information Elements (UU-IE), which may
be contained in a number of different call control messages. The Global Call H.323 call control
library allows applications to receive UU-IE in six types of H.225 messages: Setup, Call
Proceeding, Alerting, Connect, Release Complete, and Facility. The library does not provide
facilities to set and send a UU-IE in an outgoing call control message. UU-IE is retrieved and
passed to the application in raw (ASN.1) format; it is the application’s responsibility to convert the
information from ASN.1 format as appropriate.
The ability to receive UU-IE from incoming H.225 messages is implemented as an optional feature
that is disabled by default for backwards compatibility. The ability to receive UU-IE can only be
enabled when starting the system; once enabled, the feature cannot be disabled without restarting
the system. The feature can be enabled for any virtual board by setting a specific bitmask value in a
field of the appropriate IP_VIRTBOARD data structure.
When the UU-IE retrieval feature is enabled, Global Call uses the metaevent mechanism to forward
the UU-IE to an application along with the state change event associated with the supported H.225
message type (or an Extension event in the case of a Facility message). The UU-IE content is
handled as a Global Call parameter element in the extension data that is associated with the
metaevent.
258
Dialogic Corporation
An application has no ability to specify which H.225 message types it wishes to receive UU-IE in,
and should therefore be capable of handling UU-IE contained in any of the specified H.225
message types.
The maximum data length for the Global Call parameter used for the UU-IE content is configured
at system start-up. The maximum data length for this parameter is configured by setting the
max_parm_data_size field in the IPCCLIB_START_DATA structure. The default size is 255 bytes
(for backwards compatibility), but applications may configure it to be as large as 4096 bytes.
Applications must use the extended gc_util_..._ex( ) functions to extract any GC_PARM_BLK
parameter elements whose data length has been configured to be greater than 255 bytes.
4.19.1
Enabling Reception of User-to-User Information
The ability to retrieve UU-IE from inbound H.225 messages is an optional feature that is enabled or
disabled on a virtual board basis at the time the gc_Start( ) function is called.
The mandatory INIT_IP_VIRTBOARD( ) function populates the IP_VIRTBOARD structure
with default values. The default value of the h323_msginfo_mask field in the IP_VIRTBOARD
structure does not enable access to any of the supported additional information types (Q.931
message information elements, tunneled signaling messages, or User-to-User information
elements). To enable any of these features for an ipt device, the default value of the
h323_msginfo_mask field must be overridden with a value that represents the appropriate logical
combination of the defined mask values. To enable access to User-to-User IEs, the value
IP_H323_RETRIEVE_UUIE_ENABLE must be set in the mask. The following code snippet
enables Q.931 message IE access on two virtual boards and enables UU-IE access on the second
board only:
INIT_IPCCLIB_START_DATA(&ipcclibstart, 2, ip_virtboard);
INIT_IP_VIRTBOARD(&ip_virtboard[0]);
INIT_IP_VIRTBOARD(&ip_virtboard[1]);
ip_virtboard[0].h323_msginfo_mask = IP_H323_MSGINFO_ENABLE;
/* override Q.931 message default */
ip_virtboard[1].h323_msginfo_mask = IP_H323_MSGINFO_ENABLE | IP_H323_RETRIEVE_UUIE_ENABLE;
/* override Q.931 message and UU-IE defaults */
Note:
Features that are enabled or configured via the IP_VIRTBOARD structure cannot be disabled or
reconfigured once the library has been started. All items set in this data structure take effect when
the gc_Start( ) function is called and remain in effect until gc_Stop( ) is called when the
application exits.
Table 17 relates the supported H.225 messages that can contain UU-IE fields to the Global Call
event types that are used to notify the application of the message’s arrival.
Table 18. H.225 Messages and Global Call Events for Receiving UU-IE
H.225 message
Global Call event used to notify application
Setup
GCEV_OFFERED
Proceeding
GCEV_PROCEEDING †
Alerting
GCEV_ALERTING
† The GCEV_PROCEEDING event is maskable.
259
Dialogic Corporation
Table 18. H.225 Messages and Global Call Events for Receiving UU-IE
H.225 message
Global Call event used to notify application
Connected
GCEV_CONNECTED
Release Complete
GCEV_DISCONNECTED
Facility
GCEV_EXTENSION (IPEXTID_RECEIVEMSG)
† The GCEV_PROCEEDING event is maskable.
4.19.2
Retrieving UU-IEs
Once the UU-IE access feature is enabled, any User-to-User Information Element received in a
supported message type is made available to the application as a parameter element in a
GC_PARM_BLK that is associated with metaevent for one of the Global Call event types listed in
Table 17. The metaevent is retrieved using the standard gc_GetMetaEvent( ) method and the
parameter element is retrieved from the parameter block using standard Global Call extended
gc_util_..._ex( ) functions.
Note:
The application must take care to retrieve the UU-IE information from any incoming message or
copy it to a new location before the next message arrives. The next call to gc_GetMetaEvent( )
will wipe out the metaevent data from the prior event.
In all cases, User-to-User Information Elements are handled as Global Call parameter elements of
the following type:
IPSET_CALLINFO
IPPARM_UUIE_ASN1
• value = octet string containing raw, ASN.1-encoded user-to-user information element
It is the application’s responsibility to decode the ASN.1 data and retrieve any information that is of
interest.
Note:
The maximum length for the value of the UU-IE parameter element is max_parm_data_size, which
is configured at library startup (the default value is 255). Any received UU-IE data that exceeds this
maximum length is truncated without notification to the application. When max_parm_data_size is
set to a value larger than 255, the application must use the extended gc_util_..._ex( ) functions
when extracting parameters from a GC_PARM_BLK.
Retrieving UU-IE from Alerting, Connected, Proceeding,
ReleaseComplete, and Setup Messages
To retrieve UU-IE from the Global Call event that notifies the application of an Alerting,
Connected, Proceeding, ReleaseComplete, or Setup message, the application uses
gc_GetMetaEvent( ) to retrieve the metaevent. If the received H.225 message contained a UU-IE,
the GC_PARM_BLK structure pointed to by the extevtdatap field in the METAEVENT structure
will contain a parameter element that has the UU-IE data as its value. The application is then able
to use the gc_util_..._ex( ) functions to extract the ASN.1-encoded data for processing.
260
Dialogic Corporation
Retrieving UU-IE from Facility Messages
Because there is no Global Call state change event associated with a Facility message, a slightly
different retrieval mechanism applies to this message type. In the case of a Facility message, the
UU-IE is sent to the application in an unsolicited GCEV_EXTENSION event which has an
extension ID of IPEXTID_RECEIVEMSG rather than a Global Call state change event. The
extevtdatap field of the metaevent for this event is a pointer to an EXTENSIONEVTBLK structure
which contains a GC_PARM_BLK structure. This parameter block in turn contains a parameter
element that has the ASN.1-encoded UU-IE data as its value.
UU-IE Retrieval Code Example
The following example illustrates retrieval of a UU-IE element received in an H.323 message:
int OnEventRetrieveUUIE(METAEVENT metaevent)
{
// This function does the following:
// 1) See if the event can have a UUIE data; if not then return
// 2) Extract the GC parm block associated with the event
// 3) Go through the GC parm block to see if there exists a setid/parmid combination
//
of IPSET_CALLINFO/IPPARM_UUIE_ASN1
// 4) For the GC parm data, that has the above combination, print the UUIE length and
//
UUIE data bytes.
int rc;
GC_PARM_BLKP parm_blk
GC_PARM_DATA_EXT parm;
char *pChar;
int evttype;
EXTENSIONEVTBLK * pextensionBlk;
Int i;
evttype = metaevent.evttype;
switch(evttype)
{
case GCEV_OFFERED:
case GCEV_PROCEEDING:
case GCEV_ALERTING:
case GCEV_CONNECTED:
case GCEV_DISCONNECTED:
// For all these events, metaevent's extension event block will contain the actual
// GC parm block.
parm_blk = metaevent.extevtdatap;
break;
case GCEV_EXTENSION:
// For this event, metaevent's extension event block will contain the actual
// extension event block.
pextensionBlk = (EXTENSIONEVTBLK *)(metaevent.extevtdatap);
parm_blk = (&(pextensionBlk->parmblk));
if(pextensionBlk->ext_id != IPEXTID_RECEIVEMSG)
{
printf("UUIE extraction is possible only for ext id of IPEXTID_RECEIVEMSG.
Not for ext id of %d\n", pextensionBlk->ext_id);
return(-1);
}
break;
261
Dialogic Corporation
default:
// Since UUIE data can be present only for the above mentioned events,
// return from the fuction for all other events.
printf("UUIE retrieval is not supported for this type of event.\n");
return(-1);
break;
}
// Initialize the GC parm data.
INIT_GC_PARM_DATA_EXT(&parm);
//
//
//
rc
if
{
Now go through all the GC parm datas of the GC parm block to find out if there is a
setid/parmid combination of IPSET_CALLINFO/IPPARM_UUIE_ASN1. Parm block with
this particular combination contains the ASN1 encoded UUIE.
= gc_util_next_parm_ex(parm_blk,&parm);
(rc != 0)
return -1;
}
while (rc != EGC_NO_MORE_PARMS)
{
switch (parm.set_ID)
{
case IPSET_CALLINFO:
switch (parm.parm_ID)
{
case IPPARM_UUIE_ASN1:
// This GC parm data contains the ASN1 encoded UUIE.
pChar = (unsigned char *)parm.pData;
printf("The ASN1 encoded UU-IE data of size"
"%d is at %x.\n", parm.data_size, parm.pData);
for(i=0; i< parm.data_size; i++)
{
printf("%d ", *(unsigned char *)(pChar+i));
}
// The user can pass this pChar to some ASN.1 decoder to convert it
// to a textual format.
break;
}
break;
}
// Get the next GC parm data.
rc = gc_util_next_parm_ex(parm_blk,&parm);
}
return(0);
}
4.20
Specifying RTP Stream Establishment
Note:
The information in this section only applies when the Dialogic® Global Call API IP Call Control
library is started in the first party call control (1PCC) operating mode. The capability described in
this section is not supported when the library is started in the third party call control (3PCC)
operating mode.
When using the Dialogic® Global Call API, RTP streaming can be established before the call is
connected (that is, before the calling party receives the GCEV_CONNECTED event). This feature
enables a voice message to be played to the calling party (for example, a message stating that the
called party is unavailable for some reason) without the calling party being billed for the call.
262
Dialogic Corporation
The gc_SetUserInfo( ) function can be used to specify call-related information such as coder
information and display information before issuing gc_CallAck( ), gc_AcceptCall( ) or
gc_AnswerCall( ). See Section 8.3.26, “gc_SetUserInfo( ) Variances for IP”, on page 487 for more
information.
On the called party side, RTP streaming can be established before any of the following functions
are issued to process the call:
• gc_AcceptCall( ) – SIP Ringing (180) message returned to the calling party
• gc_AnswerCall( ) – SIP OK (200) message returned to the calling party
4.21
Managing Quality of Service Alarms
Note:
The information in this section only applies when the Dialogic® Global Call API IP Call Control
library is started in the first party call control (1PCC) operating mode. When the library is started in
the third party call control (3PCC) operating mode, QoS alarms are configured and handled via the
IP Media (IPML) API library.
The Dialogic® Global Call API supports the setting and retrieving of Quality of Service (QoS)
thresholds and the handling of a QoS alarm when it occurs. The QoS thresholds supported by
Dialogic® Global Call API are:
• jitter
• lost packets
• RTCP inactivity
• RTP inactivity
When using Dialogic® Global Call API with other technologies (such as E1 CAS or T1 Robbed
Bit), alarms are managed and reported on the network device. For example, when gc_OpenEx( ) is
issued, specifying both a network device (dtiB1T1) and a voice device (dxxxB1C1) in the
devicename parameter, the function retrieves a Dialogic® Global Call API line device. This
Dialogic® Global Call API line device can be used directly in Dialogic® Global Call API Alarm
Management System (GCAMS) functions to manage alarms on the network device.
When using the Dialogic® Global Call API with IP technology, alarms such as QoS alarms are
more directly related to the media processing and are therefore reported on the media device rather
than on the network device. When gc_OpenEx( ) is issued, specifying both a network device
(iptB1T1) and a media device (ipmB1C1) in the devicename parameter, two Dialogic® Global Call
API line devices are created:
• The first Dialogic® Global Call API line device corresponds to the network device and is
retrieved in the gc_OpenEx( ) function.
• The second Dialogic® Global Call API line device corresponds to the media device and is
retrieved using the gc_GetResourceH( ) function. This is the line device that must be used
with GCAMS functions to manage QoS alarms. See the Global Call API Programming Guide
for more information about GCAMS.
Note:
Applications must include the gcipmlib.h header file before Dialogic® Global Call API can be
used to set or retrieve QoS threshold values.
263
Dialogic Corporation
4.21.1
Alarm Source Object Name
In Dialogic® Global Call API, alarms are managed using the Dialogic® Global Call API Alarm
Management System (GCAMS). Each alarm source is represented by an Alarm Source Object
(ASO) that has an associated name. When using Dialogic® Global Call API with IP, the ASO name
is IPM QoS ASO. The ASO name is useful in many contexts, for example, when configuring a
device for alarm notification.
4.21.2
Retrieving the Media Device Handle
To retrieve the Dialogic® Global Call API line device corresponding to the media device, use the
gc_GetResourceH( ) function. See Section 8.3.12, “gc_GetResourceH( ) Variances for IP”, on
page 455 for more information.
The Dialogic® Global Call API line device corresponding to the media device is the device that
must be used with GCAMS functions to manage QoS alarms.
4.21.3
Setting QoS Threshold Values
To set QoS threshold values, use the gc_SetAlarmParm( ) function. See Section 8.3.24,
“gc_SetAlarmParm( ) Variances for IP”, on page 483 for more information.
The following code demonstrates how to set QoS threshold values.
Note:
The following code uses the IPM_QOS_THRESHOLD_INFO structure from the IP Media Library
(IPML). See the Dialogic® IP Media Library API Library Reference and the Dialogic® IP Media
Library API Programming Guide for more information.
/*****************************************************************************
Routine: SetAlarmParm
Assumptions/Warnings: None.
Description: calls gc_SetAlarmParm()
Parameters: handle of the Media device
Returns: None
******************************************************************************/
void SetAlarmParm(int hMediaDevice)
{
ALARM_PARM_LIST alarm_parm_list;
IPM_QOS_THRESHOLD_INFO QoS_info;
alarm_parm_list.n_parms = 1;
QoS_info.unCount=1;
QoS_info.QoSThresholdData[0].eQoSType = QOSTYPE_JITTER;
QoS_info.QoSThresholdData[0].unTimeInterval = 1000;
QoS_info.QoSThresholdData[0].unDebounceOn = 5000;
QoS_info.QoSThresholdData[0].unDebounceOff = 15000;
QoS_info.QoSThresholdData[0].unFaultThreshold = 50;
QoS_info.QoSThresholdData[0].unPercentSuccessThreshold = 90;
QoS_info.QoSThresholdData[0].unPercentFailThreshold = 10;
alarm_parm_list.alarm_parm_fields[0].alarm_parm_data.pstruct =
(void *) &QoS_info;
264
Dialogic Corporation
if (gc_SetAlarmParm(hMediaDevice, ALARM_SOURCE_ID_NETWORK_ID,
ParmSetID_qosthreshold_alarm, &alarm_parm_list, EV_SYNC)!= GC_SUCCESS)
{
/* handle gc_SetAlarmParm() failure */
printf("SetAlarmParm(hMediaDevice=%d, mode=EV_SYNC) Failed", hMediaDevice);
return;
}
printf("SetAlarmParm(hMediaDevice=%d, mode=EV_SYNC) Succeeded", hMediaDevice);
}
4.21.4
Retrieving QoS Threshold Values
To retrieve QoS threshold values, use the gc_GetAlarmParm( ) function. See Section 8.3.9,
“gc_GetAlarmParm( ) Variances for IP”, on page 451 for more information.
The following code demonstrates how to retrieve QoS threshold values.
Note:
The following code uses the IPM_QOS_THRESHOLD_INFO structure from the IP Media Library
(IPML). See the Dialogic® IP Media Library API Library Reference and the Dialogic® IP Media
Library API Programming Guide for more information.
/*****************************************************************************
Routine: GetAlarmParm
Assumptions/Warnings: None
Description: calls gc_GetAlarmParm()
Parameters: handle of Media device
Returns: None
******************************************************************************/
void GetAlarmParm(int hMediaDevice)
{
ALARM_PARM_LIST alarm_parm_list;
unsigned int n;
IPM_QOS_THRESHOLD_INFO QoS_info;
IPM_QOS_THRESHOLD_INFO *QoS_infop;
QoS_info.unCount=2;
QoS_info.QoSThresholdData[0].eQoSType = QOSTYPE_LOSTPACKETS;
QoS_info.QoSThresholdData[1].eQoSType = QOSTYPE_JITTER;
/* get QoS thresholds for LOSTPACKETS and JITTER */
alarm_parm_list.alarm_parm_fields[0].alarm_parm_data.pstruct = (void *) &QoS_info;
alarm_parm_list.n_parms = 1;
if (gc_GetAlarmParm(hMediaDevice, ALARM_SOURCE_ID_NETWORK_ID,
ParmSetID_qosthreshold_alarm, &alarm_parm_list, EV_SYNC) != GC_SUCCESS)
{
/* handle gc_GetAlarmParm() failure */
printf("gc_GetAlarmParm(hMediaDevice=%d, mode=EV_SYNC) Failed", hMediaDevice);
return;
}
/* display threshold values retrieved */
printf("n_parms = %d\n", alarm_parm_list.n_parms);
QoS_infop = alarm_parm_list.alarm_parm_fields[0].alarm_parm_data.pstruct;
for (n=0; n < QoS_info.unCount; n++)
{
printf("QoS type = %d\n", QoS_infop->QoSThresholdData[n].eQoSType);
printf("\tTime Interval = %u\n", QoS_infop->QoSThresholdData[n].unTimeInterval);
printf("\tDebounce On = %u\n", QoS_infop->QoSThresholdData[n].unDebounceOn);
printf("\tDebounce Off = %u\n", QoS_infop->QoSThresholdData[n].unDebounceOff);
printf("\tFault Threshold = %u\n", QoS_infop->QoSThresholdData[n].unFaultThreshold);
printf("\tPercent Success Threshold = %u\n",
265
Dialogic Corporation
QoS_infop->QoSThresholdData[n].unPercentSuccessThreshold);
printf("\tPercent Fail Threshold = %u\n",
QoS_infop->QoSThresholdData[n].unPercentFailThreshold);
printf("\n\n");
}
}
4.21.5
Handling QoS Alarms
The application must first be enabled to receive notification of alarms on the specified line device.
The following code demonstrates how this is achieved.
/****************************************************************
*
NAME: enable_alarm_notification(struct channel *pline)
* DESCRIPTION: Enables all alarms notification for pline
*
Also fills in pline->mediah
*
INPUT: pline - pointer to channel data structure
*
RETURNS: None - exits if error
*
CAUTIONS: Does no sanity checking as to whether or not the technology
*
supports alarms - assumes caller has done that already
****************************************************************/
static void enable_alarm_notification(struct channel *pline)
{
char
str[MAX_STRING_SIZE];
int
alarm_ldev;
/* linedevice that alarms come on */
alarm_ldev = pline->ldev;
/* until proven otherwise */
if (pline->techtype == H323)
{
/* Recall that the alarms for IP come on the media device, not the network device */
if (gc_GetResourceH(pline->ldev, &alarm_ldev, GC_MEDIADEVICE) != GC_SUCCESS)
{
sprintf(str, "gc_GetResourceH(linedev=%ld, &alarm_ldev,
GC_MEDIADEVICE) Failed", pline->ldev);
printandlog(pline->index, GC_APIERR, NULL, str);
exitdemo(1);
}
sprintf(str, "gc_GetResourceH(linedev=%ld, &alarm_ldev,
GC_MEDIADEVICE) passed, mediah = %d", pline->ldev, alarm_ldev);
printandlog(pline->index, MISC, NULL, str);
pline->mediah = alarm_ldev;
/* save for later use */
}
else
{
printandlog(pline->index, MISC, NULL, "Not setting pline->mediah
since techtype != H323");
}
sprintf(str, "enable_alarm_notification - pline->mediah = %d\n", (int) pline->mediah);
if (gc_SetAlarmNotifyAll(alarm_ldev, ALARM_SOURCE_ID_NETWORK_ID,
ALARM_NOTIFY) != GC_SUCCESS)
{
sprintf(str, "gc_SetAlarmNotifyAll(linedev=%ld,
ALARM_SOURCE_ID_NETWORK_ID, ALARM_NOTIFY) Failed", pline->ldev);
printandlog(pline->index, GC_APIERR, NULL, str);
exitdemo(1);
}
sprintf(str, "gc_SetAlarmNotifyAll(linedev=%ld, ALARM_SOURCE_ID_NETWORK_ID,
ALARM_NOTIFY) PASSED", pline->ldev);
printandlog(pline->index, MISC, NULL, str);
}
266
Dialogic Corporation
When a GCEV_ALARM event occurs, use the Dialogic® Global Call API Alarm Management
System (GCAMS) functions such as, gc_AlarmNumber( ) to retrieve information about the alarm.
The following code demonstrates how to process a QoS alarm when it occurs. In this case the
application simply logs information about the alarm.
/****************************************************************
*
NAME: void print_alarm_info(METAEVENTP metaeventp,
*
struct channel *pline)
* DESCRIPTION: Prints alarm information
*
INPUTS: metaeventp - pointer to the alarm event
*
pline - pointer to the channel data structure
*
RETURNS: NA
*
CAUTIONS: Assumes already known to be an alarm event
****************************************************************/
static void print_alarm_info(METAEVENTP metaeventp, struct channel *pline)
{
long
alarm_number;
char
*alarm_name;
unsigned long
alarm_source_objectID;
char
*alarm_source_object_name;
char
str[MAX_STRING_SIZE];
if (gc_AlarmNumber(metaeventp, &alarm_number) != GC_SUCCESS)
{
sprintf(str, "gc_AlarmNumber(...) FAILED");
printandlog(pline->index, GC_APIERR, NULL, str);
printandlog(pline->index, STATE, NULL, " ");
exitdemo(1);
}
if (gc_AlarmName(metaeventp, &alarm_name) != GC_SUCCESS)
{
sprintf(str, "gc_AlarmName(...) FAILED");
printandlog(pline->index, GC_APIERR, NULL, str);
printandlog(pline->index, STATE, NULL, " ");
exitdemo(1);
}
if (gc_AlarmSourceObjectID(metaeventp, &alarm_source_objectID) != GC_SUCCESS)
{
sprintf(str, "gc_AlarmSourceObjectID(...) FAILED");
printandlog(pline->index, GC_APIERR, NULL, str);
printandlog(pline->index, STATE, NULL, " ");
exitdemo(1);
}
if (gc_AlarmSourceObjectName(metaeventp, &alarm_source_object_name) != GC_SUCCESS)
{
sprintf(str, "gc_AlarmSourceObjectName(...) FAILED");
printandlog(pline->index, GC_APIERR, NULL, str);
printandlog(pline->index, STATE, NULL, " ");
exitdemo(1);
}
sprintf(str, "Alarm %s (%d) occurred on ASO %s (%d)",
alarm_name, (int) alarm_number, alarm_source_object_name,
(int) alarm_source_objectID);
printandlog(pline->index, MISC, NULL, str);
}
267
Dialogic Corporation
See the Dialogic® Global Call API Programming Guide for more information about the operation
of GCAMS and the Dialogic® Global Call API Library Reference for more information about
GCAMS functions.
4.22
Registration
In an H.323 network, a Gatekeeper manages the entities in a specific zone and an endpoint must
register with the Gatekeeper to become part of that zone. In a SIP network, a Registrar manages a
set of associations or bindings between Addresses-of-Record and actual endpoint addresses for a
domain. The Dialogic® Global Call API provides applications with the ability to perform endpoint
registration. These capabilities are described in the following topics:
• Registration Overview
• Registration Operations
• Sending and Receiving Nonstandard Registration Messages (H.323)
• Registration Code Examples
• Gatekeeper Registration Failure (H.323)
4.22.1
Registration Overview
The Dialogic® Global Call API provides a number of options for registration and manipulation of
registration information. The Dialogic® Global Call API simplifies and abstracts the network RAS
messages in H.323 and REGISTER messages in SIP.
When using the Dialogic® Global Call API to perform endpoint registration, the following general
conditions and restrictions apply:
• An application must use an IPT board device handle to perform registration. A board device
handle can be obtained by using gc_OpenEx( ) with a devicename parameter of “N_iptBx”.
• When using the gc_ReqService( ) function, two mandatory parameter elements,
GCSET_SERVREQ / PARM_REQTYPE and GCSET_SERVREQ / PARM_ACK, are
required in the GC_PARM_BLK parameter block. These parameters are required by the
generic service request mechanism provided by Dialogic® Global Call API and are not sent in
any registration message.
• When setting H.323 alias or SIP Transport Address information, the gc_ReqService( )
function can include more than one address in the GC_PARM_BLK associated with the
function. Prefixes are ignored for SIP.
• Registration operations cannot be included in the preset registration information using
gc_SetConfigData( ).
H.323 Gatekeeper Registration
In H.323, the following operations (and the corresponding RAS messages) are supported:
• locating a gatekeeper via unicast or multicast (RAS messages: GRQ/GCF/GRJ)
• registration (RAS message: RRQ)
268
Dialogic Corporation
• specifying one-time or periodical registration (RAS message: RRQ)
• changing registered information (RAS message: RRQ)
• removing registered information by value (RAS message: RRQ)
• sending non-standard registration message (RAS message: NonStandardMessage)
• deregistering (RAS messages: URQ/UCF/URJ)
• handling calls according to the gatekeeper policy for directing and routing calls (RAS
messages: ARQ/ACF/ARJ, DRQ/DCF/DRJ)
Note:
For detailed information on RAS negotiation, see ITU-T Recommendation H.225.0.
When using the Dialogic® Global Call API to perform H.323 Gatekeeper registration, the
following conditions and restrictions apply in addition to the general conditions noted above:
• An H.323 application must perform registration only when there are no active calls.
• Once an H.323 application chooses to be registered with a Gatekeeper, it can change its
Gatekeeper by deregistering and reregistering with another Gatekeeper.
• Once an H.323 application is registered and has active calls, deregistration or switching to a
different Gatekeeper will disconnect all active calls and cause GCEV_DISCONNECTED
events to be sent to the application. The gc_ResetLineDev( ) function can be used to put
channels in the Idle state before deregistering.
• Once an H.323 application chooses to be registered with a Gatekeeper, it cannot handle calls
without being registered with some Gatekeeper or explicitly deregistering. If the Gatekeeper
connection is lost, for example, the application cannot handle calls until it either reregisters or
deregisters.
• Once an application is registered, if it wishes to handle calls without the registration protocol
(that is, return to the same mode as before registration), it can simply deregister. When the
application deregisters, all existing calls are dropped and GCEV_DISCONNECTED events
are sent to the application, and new calls may be blocked for a short time while the H.323 stack
restarts in manual RAS mode.
SIP Registration
The SIP REGISTER method is used to register associations between a media endpoint alias and its
real (transport) address. These associations are commonly referred to as bindings, each of which
represents a unique tuple of several items, including:
• the Registrar’s address, which is specified as the Request-URI
• the Address of Record (a “name” that will be used to easily locate the SIP endpoint), which is
specified as the To header field
• the Transport address (the actual URI of the SIP endpoint), which is specified as the Contact
header field
• the Sender’s Address of Record (only used in third-party call control environments), which is
specified as the From header field
An application can register as many bindings as it wants, so that a given SIP endpoint may have
multiple AORs or aliases. When a Proxy receives an INVITE request addressed to a registered
AOR, it routes the request to the endpoint address identified in the binding. For example, if a
269
Dialogic Corporation
binding exists between the AOR
tom@somewhere.com
and the transport address
454554-tom-sdih53@py1.somewhere.com:5063
an INVITE addressed to tom@somewhere.com would be routed by a Proxy to the address
454554-tom-sdih53@py1.somewhere.com:5063. When the application receives the
GCEV_OFFERED event for this INVITE, it can extract the “454554-tom-sdih53” portion of the
address from the Phone List and use that information to route the call to the appropriate logical SIP
endpoint. Note that calls are not automatically routed to a specific IPT device by the registration
mechanism.
Global Call supports registering and de-registering with a Registrar, and querying the Registrar for
existing bindings; it does not support receiving SIP REGISTER requests. Table 19 associates
abstract Registrar registration concepts with SIP REGISTER message elements and Global Call
programming interface elements.
Table 19. SIP REGISTER Method
Concept
SIP REGISTER Element
Global Call Interface Element
Initiate registration
REGISTER method
gc_ReqService( )
Registrar’s address
Request-URI
IPSET_REG_INFO
IPPARM_REG_ADDRESS
IP_REGISTER_ADDRESS.reg_server
Alias (Address-of-record)
To header field
IPSET_REG_INFO
IPPARM_REG_ADDRESS
IP_REGISTER_ADDRESS.reg_client
Sender's address-of-record (only
used in 3rd party call control
environments)
From header field
IPSET_SIP_MSGINFO
IPPARM_SIP_HDR
header string starting with “From:” †
Transport address (actual
endpoint address)
Contact header field
IPSET_LOCAL_ALIAS
IPPARM_ADDRESS_TRANSPARENT
address string
Auto-refresh interval
Expires header field
IPSET_REG_INFO
IPPARM_REG_ADDRESS
IP_REGISTER_ADDRESS.time_to_live
† If not supplied by application, library automatically uses the value provided for Alias
Note:
Because the Transport Address is sent to the Registrar in the Contact header field, which can use
any valid URI scheme according to RFC 3261, the header field must include a valid URI scheme
prefix, such as “sip:” or “sips:”. If the application does not supply a scheme prefix, the call control
library automatically inserts “sip:”, but only after the SIP stack has generated a parser error. These
stack parser errors are written to the RTFLog file unless the user turns off logging of this type of
error. To turn off the logging of these parser errors, find the line
<MClient name="PARSER" state = "1"/>
in the RtfConfigWin.xml file and replace it with
<MClient name="PARSER" state = "1">
<MClientLabel name="Error" state = "0"/>
</MClient>
270
Dialogic Corporation
When using SIP, it is important to note that RFC3261 specifies that the “host” portion of a URI that
is given as a numeric IPv4 address (for example, 123.211.40.90) and one given as a domain name
(for example, example.com) are treated as unique even if they actually resolve to the same entity.
Applications should be careful to ensure that the “host” portions of any URIs in all subsequent
operations on that binding are consistent with way they were specified during the initial
registration.
4.22.2
Registration Operations
Applications perform all types of registration operations (registering, deregistering, querying, and
modifying or deleting registration information) using the gc_ReqService( ) function. The specific
operation to perform and the information necessary for that operation are specified in parameter
elements in a GC_PARM_BLK that is passed to the gc_ReqService( ) function. The specific
parameters to use for each type of operation are described in the following subsections.
In addition to the parameter elements that are required for H.323 or SIP registrations, there are two
mandatory parameter elements that are required by the generic service request mechanism even
though they have no meaning in the context of H.323/SIP endpoint registration. These two
parameters, GCSET_SERVREQ / PARM_REQTYPE and GCSET_SERVREQ / PARM_ACK,
must always be present in the GC_PARM_BLK.
The gc_ReqService( ) function operates in the asynchronous mode, and the application receives a
GCEV_SERVICERESP termination event if the call control library succeeds in communicating
with the registration server. It is important to note that a GCEV_SERVICERESP event indicates
that the requested registration operation was completed successfully only if the event’s result code
(the ccValue field in the GC_INFO structure from a gc_ResultInfo( ) function call) is IPERR_OK.
If the result code is any other value, there was some sort of error during the registration.
4.22.2.1
Configuring the Maximum Number of Registrations (SIP)
Because internal stack resources are required to monitor each unique binding that is set to autorefresh, and because auto-refresh is the default mode for SIP registration, the Global Call call
control library allows the application to configure the maximum number of registrations for each
virtual board when the system is started. If an application requests a registration that exceeds the
configured maximum number of registrations for the virtual board, the application’s request is
rejected by the call control library, which generates a GCEV_SERVICERESP event with the
response code IPEC_REG_FAIL_insufficientInternalResources.
The configuration of the maximum number of registrations is accomplished on a virtual board basis
by setting the sip_registrar_registrations field in the IP_VIRTBOARD structure for each virtual
board before gc_Start( ) is called. The default value for this field sets the maximum number of
registrations to be the same as the maximum number of SIP calls (the sip_max_calls field in
IP_VIRTBOARD), which is appropriate in most situations. If the application needs to register all
or most users with more than one Registrar, or to register multiple transport addresses for all or
most users, it needs to increase this configuration parameter from the default value.
The mandatory INIT_IP_VIRTBOARD( ) function populates the IP_VIRTBOARD structure
with the default value for the sip_registrar_registrations field. The following code snippet
271
Dialogic Corporation
illustrates how an application might increase the maximum number of registrations on the second
of two virtual boards to allow two registrations per user:
INIT_IPCCLIB_START_DATA(&ipcclibstart, 2, ip_virtboard);
INIT_IP_VIRTBOARD(&ip_virtboard[0]);
INIT_IP_VIRTBOARD(&ip_virtboard[1]);
ip_virtboard[1].sip_registrar_registrations = 240; /* override defaults no. of registrations*/
Note:
4.22.2.2
Features that are enabled or configured via the IP_VIRTBOARD structure cannot be disabled or
reconfigured once the library has been started. All items set in this data structure take effect when
the gc_Start( ) function is called and remain in effect until gc_Stop( ) is called when the
application exits.
Locating a Registration Server
A Dialogic® Global Call API application can choose to use a known address for the registration
server (H.323 Gatekeeper or SIP Registrar) or to discover a registration server by multicasting to a
well-known address on which registration servers listen. This choice is determined by the IP
address specified as the registration address during registration.
The registration address is specified in the IPPARM_REG_ADDRESS parameter in the
IPSET_REG_INFO parameter set. The value of the IPPARM_REG_ADDRESS is an
IP_REGISTER_ADDRESS structure, which includes a reg_server field that contains the address
value. A specific range of IP addresses is reserved for multicast transmission:
• If the application specifies an address in the range of multicast addresses or specifies the
default multicast address (IP_REG_MULTICAST_DEFAULT_ADDR), then registration
server discovery is selected.
• If the application specifies an address outside the range of multicast addresses, then
registration with a specific server is selected.
Note:
In SIP, if the reg_server field contains NULL or an invalid address, the default multicast address is
automatically used by the library.
When using the default multicast registration address, the application can specify the maximum
number of hops (connections between routers) in the max_hops field of the
IP_REGISTER_ADDRESS structure.
H.323
For H.323 registration, the port number used for RAS is one less than the port number used for
signaling. To avoid a port conflict when configuring multiple ipt board devices, do not assign
consecutive H.323 signaling port numbers to ipt board devices in the IPCCLIB_START_DATA
structure. See Section 8.3.27, “gc_Start( ) Variances for IP”, on page 491 for more information.
4.22.2.3
Registration Requests
An application uses the gc_ReqService( ) function to register with a Gatekeeper/Registrar. The
registration information in this case is included in the GC_PARM_BLK associated with the
gc_ReqService( ) function. See Section 4.22.4, “Registration Code Examples”, on page 279 for
more information.
272
Dialogic Corporation
H.323
If registration is initiated by a Dialogic® Global Call API application via gc_ReqService( ) and the
Gatekeeper rejects the registration, a GCEV_SERVICERESP event containing the result code
IPEC_RASReasonInvalidIPEC_RASAddress.
If an application’s registration attempt fails for any reason, it is the application’s responsibility to
re-register.
If the stack receives an unsolicited URQ, it silently responds with a UCF, and immediately tries to
re-register with the same Gatekeeper. If three successive attempts at re-registration fail, the library
generates GCEV_TASKFAIL. If the application attempts to use the gc_ReqService( ) function
during this time, those function calls will fail.
SIP
In SIP, an application can make multiple simultaneous registration requests to different Registrars
or to the same Registrar on behalf of different User Agents. To allow the application to distinguish
among multiple completion events from these simultaneous requests, the data associated with the
completion event contains a Service ID parameter that is the number that was handed back to the
application when the initiating gc_ReqService( ) was made.
According to RFC3261, applications may not make more than one registration attempt at the same
time for a particular User Agent on a particular Registrar. If the application attempts to send a
second REGISTER request to a given Registrar for the same UA before the initial REGISTER
transaction completes, the call control library rejects the request and generates a
GCEV_SERVICERESP event containing the result code
IPEC_REG_FAIL_registrationTransactionInProgress to notify the application of the rejection.
4.22.2.4
Auto-Refreshing Registrations
The Dialogic® Global Call API enables an application to specify a one-time registration or periodic
registration where bindings are automatically re-registered with the Gatekeeper/Registrar at the
interval (in seconds) specified by the application. Applications that are using automatic reregistration are not notified of successful registration refresh transactions.
H.323
In H.323 registration, periodic registration is achieved by setting the time_to_live field in the
IP_REGISTER_ADDRESS structure. If the parameter is set to zero (the default value), then the
stack uses one-time registration functionality. If the parameter is set to a value greater than zero,
then each registration with the server is valid for the specified number of seconds and the stack
automatically refreshes its request before timeout.
If the Gatekeeper rejects the registration (sends RRJ) during periodic registration, the application
will receive an unsolicited GCEV_TASKFAIL event that contains a reason provided by the
Gatekeeper. If the Gatekeeper does not set the reason, the default reason is
IPEC_RASReasonInvalidIPEC_RASAddress.
273
Dialogic Corporation
SIP
When using SIP, auto-refresh is used by default. If the application does not explicitly set the
time_to_live value in the IP_REGISTER_ADDRESS structure (that is, doesn’t change the value
from its default value of 0), the call control library automatically sets the Expires header field in the
REGISTER request to a a value of 3600 seconds. If the application wishes to request a longer or
shorter auto-refresh interval, it simply sets the time_to_live field to the appropriate value, and that
value is set in the Expires header field.
The actual expiration time for registration is determined by the Registrar, which may or may not
accept the Expires value suggested in the REGISTER request. The expiration time received from
the Registrar is recorded and used by the Dialogic® Global Call API library only if the application
has not disabled the auto-refresh mechanism. If the expiration time returned by the Registrar is
greater than 40 seconds, re-registration is attempted 30 seconds before the registration is set to
expire. If the expiration time returned by the Registrar is 40 seconds or less, re-registration is
attempted within 5 seconds of receiving that response. When auto-refresh is enabled, the call
control library rejects registration refresh times of 5 seconds or less and generates a
GCEV_SERVICERESP event with the response code IPEC_REG_FAIL_invalidExpires. If a
refresh time of 5 seconds or less is actually desired, the application must disable the auto-refresh
mechanism for each binding and will then be responsible for explicitly renewing those bindings
with the Registrar.
If the automatic re-registration fails because the Registrar rejects the request, the Registrar’s
response code is forwarded to the application in a GCEV_SERVICERESP event. Automatic reregistration can also fail if constant application activity on a particular binding causes reregistration to be postponed beyond the binding’s actual expiration time. (A 500ms postponement
occurs when an auto re-registration attempt collides with a current application transaction on the
same binding.) In this case the GCEV_SERVICERESP event sent to the application contains the
result code IPEC_REG_FAIL_reRegistrationRequired. In either case, the application is then
responsible for re-registering the binding, if appropriate.
The extra data associated with a re-registration failure event includes:
• Request-URI (as IPSET_SIP_MSGINFO / IPPARM_REQUEST_URI)
• To header field value (as IPSET_SIP_MSGINFO / IPPARM_TO)
• From header field value, if one had been provided (as IPSET_SIP_MSGINFO / IPPARM_TO)
• Contact header field value that failed to auto refresh (as IPSET_LOCAL_ALIAS /
IPPARM_ADDRESS_TRANSPARENT)
A SIP application can explicitly disable or re-enable auto-refresh on a per registration basis, by
using the following parameter element:
IPSET_REG_INFO
IPPARM_REG_AUTOREFRESH
and one of the following values:
• IP_AUTOREFRESH_DISABLE – disable auto-refresh for a specific registration
274
Dialogic Corporation
• IP_AUTOREFRESH_ENABLE – enable auto-refresh for a specific registration, using the
non-zero value specified in IP_REGISTER_ADDRESS.time_to_live or the default value
of 3600 in the Expires header field
Note: If this parameter is not present in the GC_PARM_BLK when registration is
requested, auto-refresh is enabled by default.
4.22.2.5
Receiving Notification of Registration
An application that sends a registration request to a Gatekeeper/Registrar receive notification of
whether the registration is successful or not. When using the Dialogic® Global Call API, the
application receives a GCEV_SERVICERESP termination event with an associated
GC_PARM_BLK that contains the following elements:
IPSET_PROTOCOL
IPPARM_PROTOCOL_BITMASK
with one of the following values:
• IP_PROTOCOL_H323
• IP_PROTOCOL_SIP
IPSET_REG_INFO
IPPARM_REG_STATUS
with one of the following values:
• IP_REG_CONFIRMED – registration operation completed properly
• IP_REG_REJECTED – registration operation did not complete properly; the
gc_ResultInfo( ) function can be used to retrieve the reason for the failure
SIP
For registrations with a SIP Registrar, the GC_PARM_BLK associated with the
GCEV_SERVICERESP termination event also contains the following element:
IPSET_REG_INFO
IPPARM_REG_SERVICEID
• value = the Service ID that was handed back to the application when the initiating
gc_ReqService( ) was made
This Service ID can be used by the application to distinguish among multiple events returned on a
given handle, since the application can send multiple simultaneous REGISTER requests to
different Registrars or to the same Registrar on behalf of different User Agents.
4.22.2.6
Querying Registration Information (SIP)
Global Call provides a mechanism for a SIP application to query a Registrar to determine what
bindings currently exist. To do this, the application calls gc_ReqService( ) with the following
parameter element included in the GC_PARM_BLK that is passed to the function:
IPSET_REG_INFO
IPPARM_OPERATION_REGISTER
• value = IP_REG_QUERY_INFO
275
Dialogic Corporation
The application specifies the Registrar and Alias to query by including the following parameter
element in the GC_PARM_BLK that is passed to gc_ReqService( ):
IPSET_REG_INFO
IPPARM_REG_ADDRESS
• value = IP_REGISTER_ADDRESS structure with reg_client and reg_server fields filled
in to indicate the desired Registrar address and Alias to query
Note:
This parameter is optional. If it is not included in the GC_PARM_BLK, or if either of the addresses
in the IP_REGISTER_ADDRESS structure is not supplied, the most recently used Registrar
address and Alias are used by default.
By default, the registration query operation returns all Transport Addresses that are currently
registered for the specified Alias by the application. If the application wishes to query all Transport
Addresses that have been registered in the Registrar for the specified Alias (that is, all registrations
by all applications), the GC_PARM_BLK that it supplies to the gc_ReqService( ) function must
include the following element:
IPSET_LOCAL_ALIAS
IPPARM_ADDRESS_TRANSPARENT
• value = "*"
The GCEV_SERVICERESP completion event for this function call contains all current bindings
for the specified Address of Record in a series of IPSET_LOCAL_ALIAS /
IPPARM_ADDRESS_TRANSPARENT parameter elements. The value of each of these elements
is a null-terminated string that contains a current binding created by this application along with any
header field parameters that were appended by the Registrar.
4.22.2.7
Changing Registration Information
The Dialogic® Global Call API provides the ability to modify or add to the registration information
after it has been registered with the Gatekeeper/Registrar. To change registration information, the
application uses the gc_ReqService( ) function and passes a GC_PARM_BLK that contains the
following element:
IPSET_REG_INFO
IPPARM_OPERATION_REGISTER
and one of the following values:
• IP_REG_SET_INFO – override existing registration
• IP_REG_ADD_INFO – add to existing registration information
A SIP application can specify the Registrar and Alias to modify information for by including the
following parameter in the GC_PARM_BLK that is passed to gc_ReqService( ):
IPSET_REG_INFO
IPPARM_REG_ADDRESS
• value = IP_REGISTER_ADDRESS structure with reg_client and reg_server fields filled
in to indicate the desired Registrar address and Alias
Note:
This parameter is optional. If it is not included in the GC_PARM_BLOCK, or if either of the
addresses in the IP_REGISTER_ADDRESS structure is not supplied, the most recently used
Registrar address and Alias are used by default.
276
Dialogic Corporation
The overriding or additional information is contained in other elements in the GC_PARM_BLK.
The elements that can be included are given in Table 38, “Registration Information When Using
H.323”, on page 480 and Table 39, “Registration Information When Using SIP”, on page 482.
Note:
4.22.2.8
For SIP, the Sender’s Address of Record that was used to initially register a binding never changes.
Any attempt to update this value is ignored.
Removing Registered Information by Value
Global Call allows applications to delete one or more registration values from an existing
registration. This applies to aliases and supported prefixes in H.323, and to Transport Addresses in
SIP. When an application needs to delete one or more specific values, it uses the gc_ReqService( )
function and passes a GC_PARM_BLK that contain the following parameter element:
IPSET_REG_INFO
IPPARM_OPERATION_REGISTER
• value = IP_REG_DELETE_BY_VALUE
Each H.323 alias or SIP Transport Address to be deleted is contained in an additional element in
the GC_PARM_BLK that uses the IPSET_LOCAL_ALIAS set ID and the appropriate parameter
ID for the address type.
H.323
Supported prefixes to be deleted from the registration are specified via GC_PARM_BLK elements
that use the IPSET_SUPPORTED_PREFIXES set ID.
If the string that is contained in the value of the GC_PARM_BLK element matches a registered
alias or supported prefix, it is deleted from the local database and an updated list is sent to the
Gatekeeper.
SIP
A SIP application can specify the Registrar and Alias to modify information for by including the
following parameter in the GC_PARM_BLK that is passed to gc_ReqService( ):
IPSET_REG_INFO
IPPARM_REG_ADDRESS
• value = IP_REGISTER_ADDRESS structure with reg_client and reg_server fields filled
in to indicate the desired Registrar address and Alias
Note:
This parameter is optional. If it is not included in the GC_PARM_BLOCK, or if either of the
addresses in the IP_REGISTER_ADDRESS structure is not supplied, the most recently used
Registrar address and Alias are used by default.
If the GC_PARM_BLK does not contain any IPSET_LOCAL_ALIAS elements specifying
Transport Addresses to be deleted, no bindings will be deleted and the function call has the same
result as the query operation described in Section 4.22.2.6, “Querying Registration Information
(SIP)”, on page 275.
277
Dialogic Corporation
If the GC_PARM_BLK contains an IPSET_LOCAL_ALIAS /
IPPARM_ADDRESS_TRANSPARENT parameter element with the value "*", all bindings that
exist in the specified Registrar for the specified Alias are deleted, regardless of what application
created them.
4.22.2.9
Deregistering
The Dialogic® Global Call API provides the ability to deregister from a Gatekeeper/Registrar.
When deregistering, the application can decide whether to keep the registration information locally
or delete it. To deregister, an application uses the gc_ReqService( ) function and passes it a
GC_PARM_BLK that contains the following element:
IPSET_REG_INFO
IPPARM_OPERATION_DEREGISTER
and one of the following values:
• IP_REG_MAINTAIN_LOCAL_INFO – keep the registration information locally
• IP_REG_DELETE_ALL – delete the local registration information
See Section 4.22.4.2, “Deregistration Example”, on page 283 for more information.
SIP
A SIP application can specify the Registrar and Alias to deregister by including the following
parameter in the GC_PARM_BLK that is passed to gc_ReqService( ):
IPSET_REG_INFO
IPPARM_REG_ADDRESS
• value = IP_REGISTER_ADDRESS structure with reg_client and reg_server fields filled
in to indicate the desired Registrar address and Alias
Note:
This parameter is optional. If it is not included in the GC_PARM_BLOCK, or if either of the
addresses in the IP_REGISTER_ADDRESS structure is not supplied, the most recently used
Registrar address and Alias are used by default.
If the GC_PARM_BLK does not contain any IPSET_LOCAL_ALIAS elements specifying
Transport Addresses to be deleted, all bindings previously created by this application for the
specified Alias will be removed from the Registrar.
If the GC_PARM_BLK contains an IPSET_LOCAL_ALIAS /
IPPARM_ADDRESS_TRANSPARENT parameter element with the value "*", all bindings that
exist in the specified Registrar for the specified Alias are deleted, regardless of what application
created them.
4.22.3
Sending and Receiving Nonstandard Registration
Messages (H.323)
The Dialogic® Global Call API provides the ability to send nonstandard messages to and receive
nonstandard messages from the gatekeeper or registrar. To send nonstandard messages, the
application uses the gc_Extension( ) function. The first element must be set as described in
Section 9.2.15, “IPSET_MSG_REGISTRATION”, on page 523. Other elements are set as in
278
Dialogic Corporation
conventional nonstandard messages; see Section 9.2.18, “IPSET_NONSTANDARDDATA”, on
page 526.
An unsolicited GCEV_EXTENSION event with an extension ID (ext_id) of
IPEXTID_RECEIVEMSG can be received that contains a nonstandard registration message. The
associated GC_PARM_BLK contains the message details in parameter elements as follows:
The parameter element that identifies the message type is:
IPSET_MSG_REGISTRATION
IPPARM_MSGTYPE
• value = IP_MSGTYPE_REG_NONSTD
The parameter element for the Nonstandard Data data is:
IPSET_NONSTANDARDDATA
IPPARM_NONSTANDARDDATA_DATA
• value = Nonstandard Data string, max length = max_parm_data_size (configurable at
library start-up)
The parameter element for the Nonstandard Data identifier is one (and only one) of the following:
IPSET_NONSTANDARDDATA
IPPARM_NONSTANDARDDATA_OBJID
• value = array of unsigned integers, max length = MAX_NS_PARM_OBJID_LENGTH
IPSET_NONSTANDARDDATA
IPPARM_H221NONSTANDARD
• value = IP_H221NONSTANDARD structure
The maximum length of the Global Call parameter used for the Nonstandard Data information is
configured at start-up via the max_parm_data_size field in the IPCCLIB_START_DATA structure.
The default size is 255 (for backwards compatibility), but applications may configure it to be as
large as 4096 bytes. Applications must use the extended gc_util_..._ex( ) functions to insert or
extract any GC_PARM_BLK parameter elements whose data length is defined to be greater than
255.
Note:
4.22.4
In practice, applications may not be able to utilize the full maximum length of the nonstandard data
parameter element as configured in max_parm_data_size. The H.323 stack limits the overall size of
messages to be max_parm_data_size + 512 bytes, and any messages that exceed this limit are
truncated without any notification to the application.
Registration Code Examples
This section contains code examples illustrating SIP registration and deregistration.
279
Dialogic Corporation
4.22.4.1
Registration Example
The following code example shows how to populate a GC_PARM_BLK structure that can be used
to register an endpoint with a gatekeeper (H.323) or registrar (SIP). The GC_PARM_BLK structure
contains the following registration information:
• two mandatory parameters required by the generic gc_ReqService( ) function
• the protocol type (H.323 or SIP)
• the type of operation (register/deregister) and sub-operation (set information, add information,
delete by value, delete all)
• the IP address to be registered
• the endpoint type to register as
• a number of local aliases
• a number of supported prefixes
int boardRegistration(IN LINEDEV boarddev, IN char protocol)
{
GC_PARM_BLKP pParmBlock = NULL;
int frc = GC_SUCCESS;
if (protocol != IP_PROTOCOL_H323 && protocol != IP_PROTOCOL_SIP )
{
printf("failed bad protocol identifier.\n");
return GC_ERROR;
}
/****** Two (mandatory) elements that are not related directly to
the server-client negotiation ********/
frc = gc_util_insert_parm_val(&pParmBlock,
GCSET_SERVREQ,
PARM_REQTYPE,
sizeof(char),
IP_REQTYPE_REGISTRATION);
frc = gc_util_insert_parm_val(&pParmBlock,
GCSET_SERVREQ,
PARM_ACK,
sizeof(char),
1);
/******Setting the protocol target***********/
frc = gc_util_insert_parm_val(&pParmBlock,
IPSET_PROTOCOL,
IPPARM_PROTOCOL_BITMASK,
sizeof(char),
protocol); /*can be H323 or SIP*/
/****** Setting the operation to perform ***********/
frc = gc_util_insert_parm_val(&pParmBlock,
IPSET_REG_INFO,
IPPARM_OPERATION_REGISTER, /* can be Register or Deregister */
sizeof(char),
IP_REG_SET_INFO); /* can be other relevant "sub" operations */
280
Dialogic Corporation
/****** Setting address information ***********/
IP_REGISTER_ADDRESS registerAddress;
memset(registerAddress, 0, sizeof(IP_REGISTER_ADDRESS));
strcpy(registerAddress.reg_server,"101.102.103.104"); /* set server address*/
if (protocol == IP_PROTOCOL_SIP)
{
strcpy(registerAddress.reg_client,"user@10.20.30.40"); /* set alias for SIP*/
}
registerAddress.max_hops = regMulticastHops;
registerAddress.time_to_live = regTimeToLive;
frc = gc_util_insert_parm_ref(&pParmBlock,
IPSET_REG_INFO,
IPPARM_REG_ADDRESS,
(UINT8)sizeof(IP_REGISTER_ADDRESS),
&registerAddress);
if (protocol == IP_PROTOCOL_H323)
{
/**** SIP does not allow setting of these parm elements ****/
/****** Setting endpoint type to GATEWAY ***********/
gc_util_insert_parm_val(&pParmBlock,
IPSET_REG_INFO,
IPPARM_REG_TYPE,
(unsigned char)sizeof(EPType),
IP_REG_GATEWAY);
/****** Setting supportedPrefixes information ***********/
/****
This parm block may be repeated with different ****
****
supported prefixes and supported prefix types ****/
frc = gc_util_insert_parm_ref(&pParmBlock,
IPSET_SUPPORTED_PREFIXES,
(unsigned short)IPPARM_ADDRESS_PHONE,
(UINT8)(strlen("011972")+1),
"011972");
}
/**** Setting terminalAlias information ****/
/**** May repeat this line with different addresses and address types ****/
frc = gc_util_insert_parm_ref (&pParmBlock,
IPSET_LOCAL_ALIAS,
(unsigned short)IPPARM_ADDRESS_EMAIL,
(UINT8)(strlen("someone@someplace.com")+1),
"someone@someplace.com");
/****** Send the request ***********/
unsigned long serviceID ;
int rc = gc_ReqService(GCTGT_CCLIB_NETIF,
boarddev,
&serviceID,
pParmBlock,
NULL,
EV_ASYNC);
if (rc != GC_SUCCESS)
{
printf("failed in gc_ReqService\n");
return GC_ERROR;
}
gc_util_delete_parm_blk(pParmBlock);
return GC_SUCCESS;
}
281
Dialogic Corporation
int boardUnregisterH323(IN char protocol)
{
GC_PARM_BLKP pParmBlock = NULL;
unsigned long serviceID = 1;
int rc,frc;
int gc_error;
// GC error code
int cclibid;
// Call Control library ID for gc_ErrorValue
long cc_error;
// Call Controll library error code
char *resultmsg; // String associated with cause code
char *lib_name;
// Library name for cclibid
if (protocol != IP_PROTOCOL_H323 && protocol != IP_PROTOCOL_SIP)
{
printf("failed bad protocol identifier.\n");
return GC_ERROR;
}
gc_util_insert_parm_val (&pParmBlock,
IPSET_REG_INFO,
IPPARM_OPERATION_DEREGISTER,
sizeof(unsigned char),
IP_REG_DELETE_ALL);
frc = gc_util_insert_parm_val(&pParmBlock,
GCSET_SERVREQ,
PARM_REQTYPE,
sizeof(unsigned char),
IP_REQTYPE_REGISTRATION);
if (frc != GC_SUCCESS)
{
printf("failed in PARM_REQTYPE\n");
return GC_ERROR;
}
frc = gc_util_insert_parm_val(&pParmBlock,
GCSET_SERVREQ,
PARM_ACK,
sizeof(unsigned char),
1);
if (frc != GC_SUCCESS)
{
printf("failed in PARM_ACK\n");
return GC_ERROR;
}
frc = gc_util_insert_parm_val(&pParmBlock,
IPSET_PROTOCOL,
IPPARM_PROTOCOL_BITMASK,
sizeof(char),
protocol); /* can be H323 or SIP */
if (frc != GC_SUCCESS)
{
printf("failed in IPSET_PROTOCOL\n");
return GC_ERROR;
}
rc = gc_ReqService(GCTGT_CCLIB_NETIF,
brddev,
&serviceID,
pParmBlock,
NULL,
EV_ASYNC);
if ( GC_SUCCESS != rc)
{
printf("gc_ReqService failed while unregestering\n");
if (gc_ErrorValue(&gc_error, &cclibid, &cc_error) != GC_SUCCESS)
{
282
Dialogic Corporation
printf("gc_Start() failed: Unable to retrieve error value\n");
}
else
{
gc_ResultMsg(LIBID_GC, (long) gc_error, &resultmsg);
printf("gc_ReqService() failed: gc_error=0x%X: %s\n", gc_error, resultmsg);
gc_ResultMsg(cclibid, cc_error, &resultmsg);
gc_CCLibIDToName(cclibid, &lib_name);
printf("%s library had error 0x%lx - %s\n", lib_name, cc_error, resultmsg);
}
gc_util_delete_parm_blk(pParmBlock);
return GC_ERROR;
}
printf ("Unregister request to the GK was sent ...\n");
gc_util_delete_parm_blk(pParmBlock);
return GC_SUCCESS;
}
4.22.4.2
Deregistration Example
The following code example shows how to populate a GC_PARM_BLK structure that can be used
to deregister an endpoint with a gatekeeper (H.323). The GC_PARM_BLK structure contains the
following deregistration information:
• the type of operation (in this case, deregister) and sub-operation (do not retain the registration
information locally)
• two mandatory parameters required by the generic gc_ReqService( ) function
• the protocol type (in this case, H.323)
void unregister()
{
GC_PARM_BLKP
unsigned long
int
int gc_error;
int cclibid;
long cc_error;
char *resultmsg;
char *lib_name;
pParmBlock = NULL;
serviceID = 1;
rc,frc;
// GC error code
// Call Control library ID for gc_ErrorValue
// Call Controll library error code
// String associated with cause code
// Library name for cclibid
gc_util_insert_parm_val(&pParmBlock,
IPSET_REG_INFO,
IPPARM_OPERATION_DEREGISTER,
sizeof(unsigned char),
IP_REG_DELETE_ALL);
frc = gc_util_insert_parm_val(&pParmBlock,
GCSET_SERVREQ,
PARM_REQTYPE,
sizeof(unsigned char),
IP_REQTYPE_REGISTRATION);
if (frc != GC_SUCCESS)
{
printf("failed in PARM_REQTYPE\n");
termapp();
}
283
Dialogic Corporation
frc = gc_util_insert_parm_val(&pParmBlock,
GCSET_SERVREQ,
PARM_ACK,
sizeof(unsigned char),
1);
if (frc != GC_SUCCESS)
{
printf("failed in PARM_ACK\n");
termapp();
}
frc = gc_util_insert_parm_val(&pParmBlock,
IPSET_PROTOCOL,
IPPARM_PROTOCOL_BITMASK,
sizeof(char),
IP_PROTOCOL_H323); /*can be H323, SIP or Both*/
if (frc != GC_SUCCESS)
{
printf("failed in IPSET_PROTOCOL\n");
termapp();
}
rc = gc_ReqService(GCTGT_CCLIB_NETIF,
brddev,
&serviceID,
pParmBlock,
NULL,
EV_ASYNC);
if ( GC_SUCCESS != rc)
{
printf("gc_ReqService failed while unregestering\n");
if (gc_ErrorValue(&gc_error, &cclibid, &cc_error) != GC_SUCCESS)
{
printf("gc_Start() failed: Unable to retrieve error value\n");
}
else
{
gc_ResultMsg(LIBID_GC, (long) gc_error, &resultmsg);
printf("gc_ReqService() failed: gc_error=0x%X: %s\n", gc_error, resultmsg);
gc_ResultMsg(cclibid, cc_error, &resultmsg);
gc_CCLibIDToName(cclibid, &lib_name);
printf("%s library had error 0x%lx - %s\n", lib_name, cc_error, resultmsg);
}
gc_util_delete_parm_blk(pParmBlock);
exit(0);
}
printf("Unregister request to the GK was sent ...\n");
printf("the application will not be able to make calls !!! so it will EXIT\n");
gc_util_delete_parm_blk(pParmBlock);
return;
}
4.22.5
Gatekeeper Registration Failure (H.323)
Gatekeeper registration can fail for any one of several reasons, such as disconnecting the network
cable, a network topology change that result in the loss of all paths to the Gatekeeper, a Gatekeeper
failure, or a Gatekeeper shutdown. Terminals may not be immediately aware of the registration
failure unless a RAS registration is attempted when the cable is disconnected, in which case the
transaction fails immediately because of a socket bind failure. More typically, a RAS registration
284
Dialogic Corporation
failure is only detected when either the Time To Live interval (programmable, with a default of 20
seconds) or the Response timeout (2 seconds) expires. RAS failure detection times can be
improved by setting the Time To Live value in the RAS registration request to a value smaller than
the default value, to 10 seconds, for example.
When RAS loses the Gatekeeper registration, all existing calls are automatically disconnected by
Global Call, and GCEV_DISCONNECTED events are sent to the application. Calls in progress
that are disconnected during RAS recovery are identified by a call control library result value of
IPEC_RASReasonNotRegistered in the GCEV_DISCONNECTED event. All new calls are
gracefully rejected and will continue to be rejected until RAS successfully registers with another
Gatekeeper or explicitly unregisters and allows the H.323 stack to restart in manual RAS mode.
The application can use the gc_ReqService( ) function to perform the re-register or unregister
operation.
All gc_ReqService( ) function calls result in the return of either a GCEV_SERVICERESP
(success) or GCEV_TASKFAIL (fail) completion event. If RAS registration fails (for example, as a
result of an immediate socket bind failure or failure notification following a Time To Live timeout),
the application receives a GCEV_TASKFAIL event. The range of applicable cause values for RASrelated GCEV_TASKFAIL events is IPEC_RASReasonMin to IPEC_RASReasonMax. The
application must use the gc_ReqService( ) function to reconfigure or register RAS in response to
that event. If the RAS registration is rejected, the call control library is still cleaning up after the
RAS registration failure and the application will receive another GCEV_TASKFAIL event, in
which case it must issue gc_ReqService( ) yet again.
It is recommended (but not required) that after receiving a GCEV_TASKFAIL event which
identifies loss of Gatekeeper registration, the application should:
• stop attempting to make new calls, because this uses resources unnecessarily and slows down
the cleanup time
• immediately issue a new RAS register or RAS unregister request
RAS registration requests should be made immediately on receipt of a RAS GCEV_TASKFAIL.
Recovery from the loss of registration with the Gatekeeper is not completed until the call control
library re-registers or attempts to unregister. Re-registration or unregistration is not attempted by
the call control library until commanded by the application using the gc_ReqService( ) function to
issue a RAS REGISTER REQUEST or a RAS UNREGISTER SERVICE REQUEST respectively.
Note:
4.23
The RAS GCEV_TASKFAIL event automatically repeats at intervals of 30 seconds if the
application does not re-register with a Gatekeeper. This is done to remind the application that it
must deal with the registration failure before it can successfully make or receive any new calls.
SIP Digest Authentication
Authentication is a process which allows a remote endpoint (a User Agent Server, or UAS) to
verify the identity of a User Agent Client (UAC) that has sent a request to the UAS. If the UAS
rejects a request with a 401 or 407 response, the UAC can re-send the request in a form that
includes the sender’s username and password to authenticate its identity. Once the UAC has
authenticated its identity to the UAS, the UAS may require further verification that the UAC is
authorized to make the original request, but that is a separate process from authentication. The
285
Dialogic Corporation
standard type of SIP authentication is called “digest authentication”, which refers to the encryption
method used for secure transmission of the user’s secret password in the message, and is
documented in IETF RFC 2617.
To be able to respond automatically respond to authentication challenges, a UAC typically registers
one or more triplets containing {realm, username, password}, where realm identifies the protected
domain and the username and password identify the specific user. When a UAC receives a 401 or
407 response, it searches the triplets for a realm string that matches the one contained in the
WWW-Authenticate or Proxy-Authenticate header field in the response. If it finds a matching
realm string, it calculates a digest of the corresponding username and password strings and
includes that result in the Authorization header field of the request it re-sends to the UAS.
The Global Call implementation of digest authorization extends this model to use quadruplets of
{realm, identity, username, password}, where the identity represents the user’s URI in the realm.
This extension allows applications to either register a single username and password for a given
realm, or multiple username/password pairs that are each associated with a different identity URI.
For quadruplets that have an empty string as the identity element, the Dialogic® Global Call API
library matching process uses the realm element only, exactly as if it were using a conventional
authentication triplet instead of a quadruplet. If the identity element is a non-empty string, the
library compares the identity string against the URI in the From header field of the 401/407
response. When the identity is non-empty, the library re-sends the request with the
username/password digest only if both the realm and identity match the appropriate fields in the
response message.
As an example, if the following header fields are received in a 401 Unauthorized response:
From: <sip:bob@example.com>;tag=0-13c4-4129f5f4-3bf3065a-7fc2
...
WWW-Authenticate: Digest realm="atlanta.com", domain="sip:ss1.carrier.com", qop="auth",
nonce="f84f1cec41e6cbe5aea9c8e88d359", opaque="", stale=FALSE, algorithm=MD5
both of the following quadruplets would be considered to be matches:
{"atlanta.com", "sip:bob@example.com", "bob", "password1"}
{"atlanta.com", "", "anonymous", ""}
Applications that require multiple identities per realm set multiple quadruplets with different, nonempty identity strings. Such applications may also set a default username and password by setting a
quadruplet with an empty identity string. This default username/password is only used when a
401/407 response does not match the identity in any of the triplets for the given realm and may be
an anonymous authentication as shown in the preceding example.
Applications that require only a single username/password pair per realm set only a single
quadruplet with an empty identity string. In this case the application would not set any quadruplets
that include non-empty identity strings.
Applications that wish to use the authentication mechanism should configure the desired
authentication quadruplets before calling any function that may send a SIP request. Any 401 or 407
response that is received for a request that was sent before authentication quadruplets were
configured causes the call/request to be terminated and not re-sent by Global Call even if an
286
Dialogic Corporation
appropriate authentication quadruplet was configured in the interim. The reason code for such a
termination is IPEC_SIPReasonStatus401Unauthorized or
IPEC_SIPReasonStatus407ProxyAuthenticationRequired.
Digest authentication is supported for the following SIP message types:
• BYE
• INFO within a dialog
• INVITE and re-INVITE (subsequent INVITE within a dialog)
• NOTIFY within a dialog
• OPTIONS within a dialog
• REFER within a dialog
• REGISTER
• SUBSCRIBE
Authentication is specifically not supported for the following SIP message types:
• INFO outside of a dialog
• NOTIFY outside of a dialog
• OPTIONS outside of a dialog
Applications configure authentication quadruplets for virtual board by constructing a
GC_PARM_BLK that contains a separate parameter element for each quadruplet, then calling the
gc_SetAuthenticationInfo( ) function with that parameter block. Authentication quadruplets are
removed in the same way but using a different parameter ID in the parameter element. The same
function call can configure or remove any number of quadruplets for a given virtual board by
including the appropriate combination of parameter elements in the GC_PARM_BLK. For a given
function call, each parameter in the GC_PARM_BLK should have a unique realm/identity pair; if
multiple parameter elements have the same realm/identity pair, only the last of these elements in
the parameter block becomes effective.
To add or modify an authentication quadruplet, the relevant set ID and parameter ID are:
IPSET_CONFIG
IPPARM_AUTHENTICATION_CONFIGURE
• value = IP_AUTHENTICATION data structure containing the desired quadruplet values.
If the realm/identity pair is unique for the virtual board, a new quadruplet is added to the
library’s authentication database. If the realm/identity pair matches an existing quadruplet,
the existing username/password pair is replaced by the new username/password pair.
To remove an existing authentication quadruplet, the relevant set ID and parameter ID are:
IPSET_CONFIG
IPPARM_AUTHENTICATION_REMOVE
• value = IP_AUTHENTICATION data structure that identifies the realm and identity of the
quadruplet to be removed. The username and password elements of this structure are
ignored. If the specified realm and identity do not match those of an existing quadruplet,
the function call produces an IPERR_UNAVAILABLE error.
287
Dialogic Corporation
The elements of the authentication quadruplets are contained in an IP_AUTHENTICATION data
structure, with each element having the following characteristics:
realm
a case-insensitive string that defines the protected domain name. This element must always
contain a non-empty string.
identity
for a single-user realm, an empty string
for a multi-user realm, either a case-insensitive string that identifies the user in the given realm,
or else an empty string to allow specification of a default username/password pair. Non-empty
strings must conform to the conventions for a SIP URI, and must begin with a “sip:” or “sips:”
scheme
username
a case-sensitive, null-terminated string that is the user’s name. This element must always
contain a non-empty string when configuring an authentication quadruplet. This value of this
structure element is ignored when removing an authentication quadruplet.
password
a case-sensitive, null-terminated string that is the user’s secret password in clear text. This
element can optionally be an empty string, for example, if the quadruplet contains an
anonymous username. This value of this structure element is ignored when removing an
authentication quadruplet.
When preparing to configure a quadruplet, the application should begin by initializing the
IP_AUTHORIZATION structure with the INIT_IP_AUTHORIZATION( ) function, which
configures the structure with the correct version number and with NULL string pointers for each
element. The application should then populate each element with the desired string, including any
empty strings. If any of the elements is left with a NULL pointer when passed to the function, the
function call fails with IPERR_BAD_PARM.
Note that the gc_SetConfigData( ) and gc_SetUserInfo( ) functions cannot be used to configure
authentication quadruplets. If a GC_PARM_BLK containing either of the authentication parameter
IDs is passed to either of those functions, the function call fails with IPERR_BAD_PARM.
4.24
Using SIP Transport Layer Security (TLS)
The Dialogic® Global Call API library supports SIP Transport Layer Security (TLS), which is a
security mechanism that operates on the Transport layer, on top of TCP transport. By using TLS as
the connection transport, a SIP entity can send and receive SIP messages in a secure, authenticated
manner.
The Global Call implementation of TLS is described in the following topics:
• Overview of TLS
• Configuring and Enabling TLS
• Making Calls Using TLS
• TLS Transport Failures
288
Dialogic Corporation
4.24.1
Overview of TLS
Internet Protocol security in general and Transport Layer Security in specific are very complex
subjects, and a comprehensive discussion is well beyond the scope of this document. But anyone
attempting to use TLS must have at least a basic understanding of the concepts and entities
involved, and this brief introduction is intended to provide that foundation.
First we present definitions of a few key concepts:
Certificate
A digital certificate is an electronic document which links a public key to a person or company
in a public key infrastructure, enabling the user to send encrypted and digitally signed
electronic messages. The certificate identifies the user and is required to verify his digital
signature. The certificate contains information about the identity and public key of the
person/company as well as the certificate’s expiration date. Furthermore, the certificate may
contain information about the usage of the certificate.
Certificate Authority (CA)
A certificate Authority authorizes certificates by signing the contents using its private key.
Certificate authorities are well known authorities, whose signatures are known and trusted. By
signing other certificates, they act as a digital notary. Examples of CAs are VeriSign and
DigiCert.
Diffie-Hellman (D-H) key exchange
A cryptographic protocol that allows two parties who have no prior knowledge of each other to
jointly establish a shared secret key over an insecure communications channel. This key can
then be used to encrypt subsequent communications using a symmetric key cipher.
Digital Signature Algorithm (DSA)
DSA is used for creating and verifying digital signatures. It provides authentication, but cannot
be used for encryption or secrecy.
Digital Signature Standard (DSS)
DSS specifies Digital Signature Algorithm (DSA) appropriate for applications requiring
digital signature.
PEM
PEM specifies a base64-encoded certificate format.
Public Key Infrastructure
The Public Key Infrastructure is the network security architecture of an organization. It
includes software, encryption technologies, and services that enable secure transactions on the
Internet, intranets, and extranets.
RSA
RSA is public-key encryption technology developed by RSA Data Security, Inc. The acronym
stands for Rivest, Shamir, and Adelman, the inventors of the technology.
Secure Socket Layer (SSL))
SSL is a sophisticated encryption scheme that does not require the client and the server to
arrange for a secret key to be exchanged between the client and server BEFORE the
transaction is started. SSL uses public/private keys to provide a flexible encryption scheme
that can be set up at the time of the secure transaction. A short tutorial on SSL is available at
http://www.eventhelix.com/RealtimeMantra/Networking/SSL.pdf.
289
Dialogic Corporation
By using TLS as a connection transport, a SIP entity can send and receive data in a secure
authenticated manner. TLS, together with the commonly used Public Key Infrastructure
certification distribution mechanism achieves the following goals:
• Guarantees the identity of a remote computer
• Transmits messages to that remote computer in a secure encrypted manner
TLS uses pairs of asymmetrical encryptions keys to guarantee the identity of a remote computer.
The public key of each remote computer is published in a certificate, which is a document digitally
signed by a certificate authority. Both sides of the connection agree to trust the certificate (either
directly or through a chain of intermediate trusted certificates) before the TLS connection
establishment has started. In the TLS connection establishment process, the certificate of the
remote computer is retrieved and verified and a new key and encryption algorithm is negotiated for
the specific connection.
Establishment of a TLS connection is a three-phase process:
Phase 1: TCP connection establishment
TLS uses TCP as its underlying transport protocol, so, a TLS handshake can start only after a
TCP connection has reached the CONNECTED state.
Phase 2: TLS handshake
The basic TLS handshake process consists of several TCP message exchanges between the
client and the server, in which the client retrieves the server’s certificate, verifies it, and
negotiates an encryption key and algorithm for the session. Both parties also make sure that the
security of the handshake has not been compromised. For more information on the TLS
handshake see RFC 2246 and RFC 3546.
Phase 3: Post connection assertion
In this phase, the client makes sure that the certificate handed to it by the server does indeed
belong to server. This step is taken to prevent the situation in which a server named malise.com
will present a valid certificate of someonelse.com.
After these three phases have been completed, encrypted messages can be transmitted on the
connection in a secure manner.
RFC 3261 defines the use of TLS as a transport mechanism by using the “sips:” scheme. When
using the “sips:” scheme in a URI (or any other header that indicates the next hop of a message,
such as Route or Via) RFC 3261 mandates the transport to be TLS. For this reason, TLS cannot
guarantee a secure delivery end-to-end, but only to the next hop.
The SIP stack used by Global Call uses an open source library called OpenSSL that provides TLS
and encryption services. For more information about OpenSSL, refer to the OpenSSL project
website at http://www.openssl.org. The list of ciphers supported by OpenSSL is available at
http://www.openssl.org/docs/apps/ciphers.html.
A digital certificate is an electronic document which links a public key to a person or company in a
public key infrastructure, enabling the user to send encrypted and digitally signed electronic
messages. The certificate identifies the user and is required to verify his digital signature. The
certificate contains information about the identity and public key of the person/company as well as
the certificate’s expiration date. Additionally, the certificate may contain information about the
usage of the certificate.
290
Dialogic Corporation
Global Call only supports certificates that use the Privacy Enhanced Mail (PEM) format.
Applications will need to convert other formats to PEM format. Similarly, Global Call only
supports certificates that use the RSA or DSA key formats.
An example of an RSA certificate in PEM format is shown below.
Certificate:
Data:
Version: 1 (0x0)
Serial Number: 8 (0x8)
Signature Algorithm: md5WithRSAEncryption
Issuer: O=RVTEST, L=Metropolis, ST=New York, C=US, CN=udiw@radvision.com
Validity
Not Before: Apr 13 04:54:37 2003 GMT
Not After : Apr 10 04:54:37 2013 GMT
Subject: C=US, ST=New York, O=RVTEST, CN=127.0.0.1
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (1024 bit)
Modulus (1024 bit):
00:dc:81:8f:86:b7:ff:cc:63:ff:6b:2b:bb:f2:d0:
21:71:bf:4f:ea:11:ac:b9:ce:6e:87:ef:ae:00:4f:
85:03:84:76:c9:25:1c:9f:33:43:a3:1a:96:a6:e8:
8d:35:f9:1a:e1:b9:90:b8:ee:15:2d:cc:47:6d:a9:
32:fa:75:fc:6c:ea:fd:c6:4b:cf:22:26:49:f6:46:
bb:99:e5:92:b7:d2:2f:22:f6:26:b2:5b:52:37:13:
70:78:df:09:e6:2f:d0:db:ee:aa:9e:a9:14:27:cb:
5a:38:5a:2a:de:4e:fa:63:7c:9a:67:6c:ac:8e:f1:
8a:63:d8:e9:82:0a:2d:71:7b
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints:
CA:FALSE
X509v3 Subject Key Identifier:
82:2F:CE:D0:15:ED:C0:01:73:C1:2D:54:65:C0:6E:04:C2:28:FB:5D
X509v3 Subject Alternative Name:
DNS:localhost
Signature Algorithm: md5WithRSAEncryption
aa:df:5c:35:2d:d0:71:32:b8:9f:be:71:50:5d:e3:d0:90:68:
ec:f7:9a:35:b3:19:61:fc:5d:c2:3a:4c:83:aa:67:de:50:a9:
f5:60:ee:1a:16:10:26:2f:8a:e4:98:71:5a:06:8c:cc:59:02:
b5:f4:88:12:e9:28:27:41:1e:de:07:61:56:2c:2a:7b:4c:6a:
39:b0:10:d8:78:8f:e8:6d:7d:56:1f:48:5b:b5:79:9e:aa:be:
a9:b4:1d:84:f9:4d:10:5c:fe:e1:6d:81:47:35:96:95:79:bb:
76:33:88:a0:8f:22:1d:e0:c1:42:9e:9a:bd:83:0f:a0:ee:9c:
d9:e0
-----BEGIN CERTIFICATE----MIICWzCCAcQCAQgwDQYJKoZIhvcNAQEEBQAwYzEPMA0GA1UEChMGUlZURVNUMRMw
EQYDVQQHEwpNZXRyb3BvbGlzMREwDwYDVQQIEwhOZXcgWW9yazELMAkGA1UEBhMC
VVMxGzAZBgNVBAMUEnVkaXdAcmFkdmlzaW9uLmNvbTAeFw0wMzA0MTMwNDU0Mzda
Fw0xMzA0MTAwNDU0MzdaMEUxCzAJBgNVBAYTAlVTMREwDwYDVQQIEwhOZXcgWW9y
azEPMA0GA1UEChMGUlZURVNUMRIwEAYDVQQDEwkxMjcuMC4wLjEwgZ8wDQYJKoZI
hvcNAQEBBQADgY0AMIGJAoGBANyBj4a3/8xj/2sru/LQIXG/T+oRrLnObofvrgBP
hQOEdsklHJ8zQ6MalqbojTX5GuG5kLjuFS3MR22pMvp1/Gzq/cZLzyImSfZGu5nl
krfSLyL2JrJbUjcTcHjfCeYv0Nvuqp6pFCfLWjhaKt5O+mN8mmdsrI7ximPY6YIK
LXF7AgMBAAGjQjBAMAkGA1UdEwQCMAAwHQYDVR0OBBYEFIIvztAV7cABc8EtVGXA
bgTCKPtdMBQGA1UdEQQNMAuCCWxvY2FsaG9zdDANBgkqhkiG9w0BAQQFAAOBgQCq
31w1LdBxMrifvnFQXePQkGjs95o1sxlh/F3COkyDqmfeUKn1YO4aFhAmL4rkmHFa
BozMWQK19IgS6SgnQR7eB2FWLCp7TGo5sBDYeI/obX1WH0hbtXmeqr6ptB2E+U0Q
XP7hbYFHNZaVebt2M4igjyId4MFCnpq9gw+g7pzZ4A==
-----END CERTIFICATE-----
291
Dialogic Corporation
A private key is used to decipher the information encrypted by the public key in the certificate. An
example of private key in PEM format is shown below.
-----BEGIN RSA PRIVATE KEY----MIICXAIBAAKBgQDcgY+Gt//MY/9rK7vy0CFxv0/qEay5zm6H764AT4UDhHbJJRyf
M0OjGpam6I01+RrhuZC47hUtzEdtqTL6dfxs6v3GS88iJkn2RruZ5ZK30i8i9iay
W1I3E3B43wnmL9Db7qqeqRQny1o4WireTvpjfJpnbKyO8Ypj2OmCCi1xewIDAQAB
AoGAc4HCx1U3P7/aGi+sooL4IfePSxO7IRHLwJWC1lLRYIhRGQjBt3tJIPVamVAU
OIOm2zszXkwI+BacDAun0p9ffE1NQaIyihpoTxMThYhQgmpVUdtsz0UqRhMFB+o+
Glf236M2fQr4nTdHvW8OVAhUzGQf7yfR48Ntx6ekjf2B6BECQQD6vSTUApa9UPGD
cPUzEaoCNergUPdM6G72+Gls9NSI73AHYBGA97ba23gah/hBjmjdziF0UxmPAP4Q
KgP1haCXAkEA4SIFJIwg4v8fUIIp9KmhM60RAT+diqLJ90AJPy4x3aLM38YJuRfk
F30ALePuR7MkvuP994GnsfUg9cWjzENuvQJBAO+QN9e4gX1wENCc5Cle/ygNi9O2
iBGbIiolPdU0Nrx+yHLDfvXRt4tzlVUEBFXeUqNZhu01WH4hXJzlB9NVURECQCaT
y8nNcT00dks3YrUX9BWEzGsoWXiOGImToYIACm9uHCkkKDpdS6pysvsqGYSTv/It
4zDsOK4X0QQMT9sKmwkCQAZN7GNJ8QSgwMgwDw4hkmu+GHUXLC6cF68xdUurA2Gc
olCWLrdlpqJSUzp1XHXff/oqEygwjNmPbVujES09c4w=
-----END RSA PRIVATE KEY-----
A Certificate Authority (CA) authorizes certificates by signing the contents using its private key.
Certificate Authorities are well known authorities, whose signatures are known and trusted. By
signing other certificates, they act as a digital notary. A number of commercial CAs are available,
such as VeriSign and Thawte, and there are also some free CAs, such as www.cacert.org. For test
purposes, or for a case where the links to be secured will be local calls that use the local CA, it is
also possible for a system to install its own CA, using OpenSSL for example.
It often occurs that a client will not accept a certificate supplied by a server because the certificate
is signed by an intermediate CA which is not known to the client. The client typically states that the
validity of the certificate cannot be verified. In such cases, a chained SSL certificate or certificate
group may allow the client to accept the server’s certificate by connecting it back to a CA that is
known and trusted by the client.
A certificate chain is a sequence of certificates, where each certificate in the chain is signed by the
subsequent certificate. The purpose of certificate chain is to establish a chain of trust from a peer
certificate to a trusted Certification Authority (CA) certificate. The CA vouches for the identity in
the peer certificate by signing it. If the CA is one that you trust (indicated by the presence of a copy
of the CA certificate in your root certificate directory), this implies you can trust the signed peer
certificate as well.
To illustrate a certificate chain, we show three fictional example certificates: root.pem,
serverCA.pem and server.pem.
First, the root.pem certificate. Note that the certificate is self-signed and X509v3 Basic Constrains
shows CA:TRUE.
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 10 (0xa)
Signature Algorithm: sha1WithRSAEncryption
Issuer: C=US, ST=New Jersey, O=dialgic.com, CN=hmfurootCA.dialogic.com/emailAddress=h.fu@dialogic.com
Validity
Not Before: Nov 21 17:36:28 2005 GMT
Not After : Nov 21 17:36:28 2006 GMT
Subject: C=US, ST=New Jersey, O=dialogic.com, CN=hmfurootCA.dialogic.com/emailAddress=h.fu@dialogic.com
Subject Public Key Info:
292
Dialogic Corporation
Public Key Algorithm: rsaEncryption
RSA Public Key: (1024 bit)
Modulus (1024 bit):
00:bc:42:8d:5b:d5:7c:9b:ad:bd:46:3a:63:04:8a:
6a:7b:5e:c3:79:15:cd:4e:83:13:64:ac:3c:dd:ea:
7a:34:51:7f:ce:b1:3b:3d:42:a9:d1:98:9a:88:76:
c4:4e:7b:d6:33:db:81:95:4a:01:92:49:5e:f1:bb:
45:47:f9:be:18:f9:af:5d:7b:61:39:78:56:28:31:
bd:e8:ef:06:09:44:f8:33:bb:4d:f3:43:fe:7d:18:
88:80:0c:38:fb:be:36:ac:00:1f:74:84:da:fd:3d:
d4:48:05:21:aa:e8:db:1c:0d:86:33:ed:c7:bd:55:
b8:08:e7:53:7c:ad:67:7f:ed
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints:
CA:TRUE
Signature Algorithm: sha1WithRSAEncryption
37:58:76:91:f3:cf:66:5b:01:43:d6:d4:76:dc:ae:a3:71:37:
47:ee:f3:a9:db:10:27:da:9f:7e:69:b4:79:d1:36:6e:ab:16:
a8:4a:70:b2:a3:f2:f9:38:a7:90:c4:1c:65:bc:9e:e9:7d:5d:
38:50:6b:9f:f3:05:82:f2:20:cb:74:45:ca:53:ce:fb:0a:7f:
60:b8:c0:be:1a:52:fb:70:88:a8:99:6b:a8:d5:c7:56:d6:a9:
59:3d:fb:4b:cf:0f:3e:08:64:7e:ee:40:76:24:3e:61:8a:00:
af:a3:fa:a5:67:b0:23:c2:40:4b:03:bc:ff:1b:ce:46:94:55:
e5:a7
-----BEGIN CERTIFICATE----MIICcDCCAdmgAwIBAgIBCjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJVUzET
MBEGA1UECBMKTmV3IEplcnNleTESMBAGA1UEChMJaW50ZWwuY29tMR4wHAYDVQQD
ExVobWZ1LXJvb3RDQS5pbnRlbC5jb20xHTAbBgkqhkiG9w0BCQEWDmguZnVAaW50
ZWwuY29tMB4XDTA1MTEyMTE3MzYyOFoXDTA2MTEyMTE3MzYyOFowdTELMAkGA1UE
BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxEjAQBgNVBAoTCWludGVsLmNvbTEe
MBwGA1UEAxMVaG1mdS1yb290Q0EuaW50ZWwuY29tMR0wGwYJKoZIhvcNAQkBFg5o
LmZ1QGludGVsLmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAvEKNW9V8
m629RjpjBIpqe17DeRXNToMTZKw83ep6NFF/zrE7PUKp0ZiaiHbETnvWM9uBlUoB
kkle8btFR/m+GPmvXXthOXhWKDG96O8GCUT4M7tN80P+fRiIgAw4+742rAAfdITa
/T3USAUhqujbHA2GM+3HvVW4COdTfK1nf+0CAwEAAaMQMA4wDAYDVR0TBAUwAwEB
/zANBgkqhkiG9w0BAQUFAAOBgQA3WHaR889mWwFD1tR23K6jcTdH7vOp2xAn2p9+
abR50TZuqxaoSnCyo/L5OKeQxBxlvJ7pfV04UGuf8wWC8iDLdEXKU877Cn9guMC+
GlL7cIiomWuo1cdW1qlZPftLzw8+CGR+7kB2JD5higCvo/qlZ7AjwkBLA7z/G85G
lFXlpw==
-----END CERTIFICATE-----
Next we show serverCA.pem. Note that this certificate is signed by the root certificate and X509v3
Basic Constrains shows CA:TRUE.
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 11 (0xb)
Signature Algorithm: sha1WithRSAEncryption
Issuer: C=US, ST=New Jersey, O=dialogic.com, CN=hmfurootCA.dialogic.com/emailAddress=h.fu@dialogic.com
Validity
Not Before: Nov 21 17:40:29 2005 GMT
Not After : Nov 21 17:40:29 2006 GMT
Subject: C=US, ST=New Jersey, O=dialogic.com, CN=hmfuserverCA.dialogic.com/emailAddress=h.fu@dialogic.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (1024 bit)
Modulus (1024 bit):
00:f8:8a:34:ea:95:34:66:23:aa:31:4d:62:47:52:
8b:e5:8e:f2:0b:87:36:db:d6:d6:5c:49:3f:d6:93:
4d:9c:06:26:df:cb:e1:11:64:ac:10:35:71:91:79:
22:e1:75:c9:f0:33:c5:1b:67:8b:5f:3e:bc:21:7c:
293
Dialogic Corporation
0c:1a:f7:e5:bc:00:44:dc:1b:36:17:5c:49:04:a0:
a5:6a:d2:99:31:d6:24:a4:76:93:94:69:e2:80:a9:
d2:fa:e9:fd:b6:dc:80:17:f2:12:62:1e:46:e8:83:
4a:82:d8:b0:60:a3:6c:5e:60:c0:73:f4:dd:50:db:
9d:16:a0:92:51:67:5d:a5:31
Exponent: 65537 (0x10001)
X509v3 extensions:
X509v3 Basic Constraints:
CA:TRUE
Signature Algorithm: sha1WithRSAEncryption
58:f1:e4:37:45:96:e5:fd:9e:96:58:57:79:08:69:35:6f:da:
af:16:21:0b:2f:87:d3:37:85:e2:93:6c:0d:fc:7f:25:17:4e:
af:93:1a:53:57:69:bb:58:e6:0e:a4:05:ef:a9:3a:16:27:e4:
e5:a8:01:54:cb:c6:46:17:47:3d:98:7f:af:19:10:1e:6a:15:
b0:93:c2:4a:12:c1:30:fb:46:ba:31:76:6f:51:71:4b:67:2e:
d3:31:64:58:d4:0a:b7:14:a6:95:9a:2c:b8:f9:a5:f3:8d:56:
13:11:bf:76:5e:16:d9:be:91:de:12:3f:e4:e5:62:96:4d:d7:
6c:f4
-----BEGIN CERTIFICATE----MIICcjCCAdugAwIBAgIBCzANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQGEwJVUzET
MBEGA1UECBMKTmV3IEplcnNleTESMBAGA1UEChMJaW50ZWwuY29tMR4wHAYDVQQD
ExVobWZ1LXJvb3RDQS5pbnRlbC5jb20xHTAbBgkqhkiG9w0BCQEWDmguZnVAaW50
ZWwuY29tMB4XDTA1MTEyMTE3NDAyOVoXDTA2MTEyMTE3NDAyOVowdzELMAkGA1UE
BhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxEjAQBgNVBAoTCWludGVsLmNvbTEg
MB4GA1UEAxMXaG1mdS1zZXJ2ZXJDQS5pbnRlbC5jb20xHTAbBgkqhkiG9w0BCQEW
DmguZnVAaW50ZWwuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQD4ijTq
lTRmI6oxTWJHUovljvILhzbb1tZcST/Wk02cBibfy+ERZKwQNXGReSLhdcnwM8Ub
Z4tfPrwhfAwa9+W8AETcGzYXXEkEoKVq0pkx1iSkdpOUaeKAqdL66f223IAX8hJi
Hkbog0qC2LBgo2xeYMBz9N1Q250WoJJRZ12lMQIDAQABoxAwDjAMBgNVHRMEBTAD
AQH/MA0GCSqGSIb3DQEBBQUAA4GBAFjx5DdFluX9npZYV3kIaTVv2q8WIQsvh9M3
heKTbA38fyUXTq+TGlNXabtY5g6kBe+pOhYn5OWoAVTLxkYXRz2Yf68ZEB5qFbCT
wkoSwTD7Rroxdm9RcUtnLtMxZFjUCrcUppWaLLj5pfONVhMRv3ZeFtm+kd4SP+Tl
YpZN12z0
-----END CERTIFICATE-----
Finally, the server.pem certificate file. Note that this certificate is signed by the serverCA certificate
and X509v3 Basic Constraints shows CA:FALSE.
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 12 (0xc)
Signature Algorithm: sha1WithRSAEncryption
Issuer: C=US, ST=New Jersey, O=dialogic.com, CN=hmfuserverCA.dialogic.com/emailAddress=h.fu@dialogic.com
Validity
Not Before: Nov 21 17:42:38 2005 GMT
Not After : Nov 21 17:42:38 2006 GMT
Subject: C=US, ST=New Jersey, O=dialogic.com, CN=hmfumobile.dialogic.com/emailAddress=h.fu@dialogic.com
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
RSA Public Key: (1024 bit)
Modulus (1024 bit):
00:ad:71:3b:df:99:78:5d:8c:f2:e5:22:5d:6d:90:
38:37:d8:7e:25:6f:b7:2b:18:c7:6b:dd:c4:f1:af:
06:55:04:d6:e3:fc:a1:ed:35:59:a9:c1:73:b6:c4:
71:2f:75:3d:5c:ce:61:80:a6:f1:53:3f:35:f3:4d:
58:07:ee:ae:9d:ce:b5:30:13:2e:7a:6a:24:75:be:
95:6a:8b:25:33:e6:4a:f4:4a:19:9f:03:d7:09:d3:
83:b2:de:8c:2d:8c:8e:79:a3:f3:d8:07:12:80:0e:
68:5a:35:dd:53:f1:0b:02:32:fa:1f:93:fe:64:61:
d4:7b:9e:f7:6a:eb:98:19:99
Exponent: 65537 (0x10001)
X509v3 extensions:
294
Dialogic Corporation
X509v3 Basic Constraints:
CA:FALSE
X509v3 Subject Key Identifier:
E6:56:D3:2E:8F:7D:5B:04:99:D6:B0:C9:4C:54:A2:0B:33:31:67:FD
X509v3 Authority Key Identifier:
DirName:/C=US/ST=New Jersey/O=dialogic.com/CN=hmfurootCA.dialogic.com/emailAddress=h.fu@dialogic.com
serial:0B
Netscape CA Revocation Url:
https://www.sial.org/ca-crl.pem
Signature Algorithm: sha1WithRSAEncryption
47:52:fa:c6:77:7f:9c:7e:f2:8c:df:4c:21:2e:57:2a:a8:14:
06:72:aa:fb:68:8d:90:f8:c3:5c:4b:07:b4:60:c9:21:26:a1:
f9:b4:de:0e:09:4c:93:14:1b:4c:e8:af:49:1c:48:c7:6d:33:
06:5d:b6:a3:fd:c3:f5:09:41:2b:0c:20:71:3c:2d:92:2e:32:
7a:a0:d1:00:ea:49:ee:7a:14:8e:06:f5:e3:16:92:b4:85:ab:
3a:04:65:7a:d4:65:9d:6d:f4:65:d7:d4:49:b1:4f:a8:8e:0a:
49:ec:fc:7e:0a:ca:31:62:f7:7d:72:64:fb:6c:de:0c:c1:d7:
f2:a8
-----BEGIN CERTIFICATE----MIIDSzCCArSgAwIBAgIBDDANBgkqhkiG9w0BAQUFADB3MQswCQYDVQQGEwJVUzET
MBEGA1UECBMKTmV3IEplcnNleTESMBAGA1UEChMJaW50ZWwuY29tMSAwHgYDVQQD
ExdobWZ1LXNlcnZlckNBLmludGVsLmNvbTEdMBsGCSqGSIb3DQEJARYOaC5mdUBp
bnRlbC5jb20wHhcNMDUxMTIxMTc0MjM4WhcNMDYxMTIxMTc0MjM4WjB1MQswCQYD
VQQGEwJVUzETMBEGA1UECBMKTmV3IEplcnNleTESMBAGA1UEChMJaW50ZWwuY29t
MR4wHAYDVQQDExVobWZ1LW1vYmlsZS5pbnRlbC5jb20xHTAbBgkqhkiG9w0BCQEW
DmguZnVAaW50ZWwuY29tMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCtcTvf
mXhdjPLlIl1tkDg32H4lb7crGMdr3cTxrwZVBNbj/KHtNVmpwXO2xHEvdT1czmGA
pvFTPzXzTVgH7q6dzrUwEy56aiR1vpVqiyUz5kr0ShmfA9cJ04Oy3owtjI55o/PY
BxKADmhaNd1T8QsCMvofk/5kYdR7nvdq65gZmQIDAQABo4HoMIHlMAkGA1UdEwQC
MAAwHQYDVR0OBBYEFOZW0y6PfVsEmdawyUxUogszMWf9MIGIBgNVHSMEgYAwfqF5
pHcwdTELMAkGA1UEBhMCVVMxEzARBgNVBAgTCk5ldyBKZXJzZXkxEjAQBgNVBAoT
CWludGVsLmNvbTEeMBwGA1UEAxMVaG1mdS1yb290Q0EuaW50ZWwuY29tMR0wGwYJ
KoZIhvcNAQkBFg5oLmZ1QGludGVsLmNvbYIBCzAuBglghkgBhvhCAQQEIRYfaHR0
cHM6Ly93d3cuc2lhbC5vcmcvY2EtY3JsLnBlbTANBgkqhkiG9w0BAQUFAAOBgQBH
UvrGd3+cfvKM30whLlcqqBQGcqr7aI2Q+MNcSwe0YMkhJqH5tN4OCUyTFBtM6K9J
HEjHbTMGXbaj/cP1CUErDCBxPC2SLjJ6oNEA6knuehSOBvXjFpK0has6BGV61GWd
bfRl19RJsU+ojgpJ7Px+CsoxYvd9cmT7bN4MwdfyqA==
-----END CERTIFICATE-----
A Certificate Revocation List (CRL) contains a list of all the revoked certificates a CA has issued
that have yet to expire. When a certificate is revoked, the CA declares that the certificate should no
longer be trusted. OpenSSL support both Version 1 and Version 2 CRLs.
An example of a CRL file in PEM format is shown as following.
Certificate Revocation List (CRL):
Version 1 (0x0)
Signature Algorithm: sha1WithRSAEncryption
Issuer: /CN=hmfu-serverCA.dialogic.com/C=US/ST=New
Jersey/L=Parsippany/O=dialogic.com/emailAddress=h.fu@dialogic.com
Last Update: Nov 16 16:17:08 2005 GMT
Next Update: Dec 16 16:17:08 2005 GMT
Revoked Certificates:
Serial Number: DD862A284475A685
Revocation Date: Nov 16 16:15:44 2005 GMT
Signature Algorithm: sha1WithRSAEncryption
c7:de:1f:5c:0a:cc:ae:90:45:89:6d:35:3d:2c:ad:8b:cb:10:
06:8b:ce:49:6a:4a:65:9f:c8:fd:16:6a:6e:5c:e4:d5:d4:7b:
fd:3f:bd:88:24:bd:5d:f0:98:47:40:8f:50:87:53:50:9d:8e:
1b:42:7c:87:d7:23:96:2d:7f:f4:fa:50:6d:a3:88:3f:e4:57:
0a:e3:f3:40:3c:f7:82:5d:14:62:5d:86:0f:ce:72:80:56:b1:
a6:af:7e:be:70:3c:7a:5a:18:c3:de:79:cf:b1:38:46:a7:f4:
295
Dialogic Corporation
9b:5e:b3:85:92:7c:bb:c8:c9:93:fd:98:fa:e6:54:39:5b:58:
37:1c
-----BEGIN X509 CRL----MIIBcDCB2jANBgkqhkiG9w0BAQUFADCBjDEgMB4GA1UEAxMXaG1mdS1zZXJ2ZXJD
QS5pbnRlbC5jb20xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpOZXcgSmVyc2V5MRMw
EQYDVQQHEwpQYXJzaXBwYW55MRIwEAYDVQQKEwlpbnRlbC5jb20xHTAbBgkqhkiG
9w0BCQEWDmguZnVAaW50ZWwuY29tFw0wNTExMTYxNjE3MDhaFw0wNTEyMTYxNjE3
MDhaMBwwGgIJAN2GKihEdaaFFw0wNTExMTYxNjE1NDRaMA0GCSqGSIb3DQEBBQUA
A4GBAMfeH1wKzK6QRYltNT0srYvLEAaLzklqSmWfyP0Wam5c5NXUe/0/vYgkvV3w
mEdAj1CHU1CdjhtCfIfXI5Ytf/T6UG2jiD/kVwrj80A894JdFGJdhg/OcoBWsaav
fr5wPHpaGMPeec+xOEan9Jtes4WSfLvIyZP9mPrmVDlbWDcc
-----END X509 CRL-----
Global Call applications can act as either a TLS server or a TLS client.
TCP or TLS connections that are opened to Global Call are referred to as server connections.
Generally, server connections should be closed by the party that initiated the connection. Server
connections are not reusable by other calls or standalone transactions outside of calls. Server
connections should be terminated by the initiator when no transaction is using it.
TCP or TLS connections that are opened by Global Call are referred to as client connections. The
persistence of TLS client connections is configurable using the same mechanism that sets the
persistence of TCP connections.
The Dialogic® Global Call API library implements a TLS engine, which binds together a complete
set of parameters related to TLS operation. Each virtual board in a system is configured with its
own TLS engine, which identifies the TLS port number, the certificate, private key and optional
certificate chains that will be used when the library is acting as a TLS server, and one or more
trusted root certificate authorities (CAs) that will be used when the library will be acting as a TLS
client.
4.24.2
Configuring and Enabling TLS
TLS is configured and enabled separately for each virtual board in the system through the
IP_VIRTBOARD data structures that configure each virtual board. As with other IP features that
are configured and enabled via IP_VIRTBOARD, the configuration of this feature cannot be
changed at run-time; the values that are contained in IP_VIRTBOARD when gc_Start( ) is called
remain in effect until the system is stopped and the application restarted.
There are several specific steps required to configure and enable TLS, in addition to the initial step
of allocating and initializing the IP_VIRTBOARD structure and the final step of including the
IP_VIRTBOARD structures in the IPCCLIB_START_DATA structure that is passed to
gc_Start( ), which are common to all features that are configured via IP_VIRTBOARD. The
feature-specific steps are discussed in the following sections:
• Allocating, Initializing, and Configuring a SIP_TLS_ENGINE Data Structure
• Enabling TCP in IP_VIRTBOARD
• Configuring TCP/TLS Persistence in IP_VIRTBOARD
• Enabling TLS in IP_VIRTBOARD
296
Dialogic Corporation
4.24.2.1
Allocating, Initializing, and Configuring a SIP_TLS_ENGINE Data
Structure
The process of configuring the TLS feature for a virtual board begins by allocating a
SIP_TLS_ENGINE data structure and initializing it to default values using the
INIT_SIP_TLS_ENGINE( ) function.
After the SIP_TLS_ENGINE structure is initialized, it must be configured for TLS client
operation, TLS server operation, or both. The default values in the structure do not set the
minimum configuration for either server or client operation. If an initialized but unconfigured
SIP_TLS_ENGINE structure is referenced in an IP_VIRTBOARD structure that is passed to
gc_Start( ), the library start operation will fail.
Changing the Default TLS Port Number
The default values set in SIP_TLS_ENGINE by the initialization function specify port number
5061 as the TLS port (the default UDP and TCP ports are 5060). The default value is valid and only
needs to be changed if the application specifically requires a different port number. The port
number is specified in the sip_tls_port field of the structure.
Configuring for Local Certificates for TLS Server Operation
To configure a virtual board to operate as a TLS server, the application must configure an RSA
certificate and/or a DSS certificate in the SIP_TLS_ENGINE structure. In either case, the
certificate and its associated key should be issued by a CA and should identify the local host name.
The TLS engine can hold one of each type certificate, and Global Call will report the appropriate
one to a remote UA depending on the cipher selected during the TLS handshake.
One or both of the local certificate/key pairs must be configured if Global Call will be operating as
a TLS server. If Global Call will be operating as a TLS client, it will need to configure one or both
local certificates (and optionally a certificate chain) to support mutual authentication.
For either type of certificate, the application must configure three items:
• private key filename—the name of the file that contains the private key, either an RSA key for
the RSA certificate or a DSS certificate for a DSA certificate. In either case, the file may be in
plain text format or may be encrypted.
• private key password—the password string that is required to use the private key if the private
key file is encrypted. If the private key for either certificate is not encrypted, the corresponding
password field in SIP_TLS_ENGINE should be left at its default NULL value.
• certificate filename—the name of the file that contains the certificate that identifies the local
host name
Configuring a Certificate Chain
In addition to the local certificates, applications can optionally configure the a certificate chain
using the chain_cert_number and chain_cert_filename fields. A certificate chain configuration is
typically necessary if the local certificate is issued by an intermediate CA rather than a root CA.
Note that the TLS engine contains only a single certificate chain, which is appended to both the
297
Dialogic Corporation
RSA and DSS certificates. Application cannot use different certificate chains for RSA and DSS
certificates at the same time.
Each member of the chain_cert_filename array identifies a single certificate in the chain that links
the local certificate to the root CA. The order of the chain certificates must start with the
intermediate certificate that issues the local certificate. The next certificate in the chain is the one
that issued the previous certificate and so on until the root CA certificate is reached. For example, if
root.pem signs serverCA1.pem, and serverCA1.pem signs serverCA2.pem, and serverCA2.pem
signs server.pem, then chain_cert_number should be set to 2, chain_cert_filename[0] should point
to serverCA2.pem, and chain_cert_filename[1] should point to serverCA1.pem.
Configuring CA Certificates for TLS Client Operation
To configure a virtual board to operate as a TLS server, the application must configure an array of
one or more CA certificates in the SIP_TLS_ENGINE structure using the ca_cert_number and
ca_cert_filename fields.
The ca_cert_filename field identifies as an array of one or more root CA certificates which it trusts.
The ca_cert_number field identifies the number of certificates in the array.
If a TLS client application needs to support mutual authentication, it will also need to configure the
one or both local certificate/private key pairs, and optionally a certificate chain. During mutual
authentication, the client needs to identify itself to the server in the same way that a server
identifies itself to a client.
Configuring Certificate Revocation Lists (CRLs)
An application may optionally configure the library to use one or more Certificate Revocation List
(CRL) files via the crl_number and crl_filename fields. In this configuration crl_filename is an
array that contains one or more files in PEM format; the size of the array is crl_number. When one
or more CRLs have been configured, Global Call consults these CRLs to decide whether the
certificate has been revoked when it examines incoming certificates.
Configuring the Cipher Suite
An application may optionally configure the local cipher suite that is used to negotiate encryption
algorithms with the remote UA. The local_cipher_suite field is a list of ciphers that is specified as a
specially formatted string defined by OpenSSL. OpenSSL allows for several keywords in the elist,
which are shortcuts for sets of ciphers. Details of the cipher list and keywords can be found in
openSSL manual page at http://www.openssl.org/docs/apps/ciphers.html.
Note:
The local_cipher_suite field is a pointer to the formatted string itself rather than the name of the file
that contains the string.
The default value of local_cipher_suite is NULL which uses OpenSSL’s default string
“ALL:!ADH:+RC4:@STRENGTH”.
298
Dialogic Corporation
Configuring Diffie-Hellman (D-H) Key Exchange Parameters
In order to perform a Diffie-Hellman (D-H) key exchange the server must use a D-H group (D-H
parameters) and generate a D-H key. As TLS server, Global Call always generates a new D-H key
during the negotiation. dh_param_512_filename should points to a PEM-format file that contains
D-H parameters with 512-bit key, and dh_param_1024_filename should points to a PEM-format
file that contains D-H parameters with 1024-bit key. If the application does not provide D-H
parameters, Global Call uses the pre-built default D-H parameters for D-H key exchange ciphers.
Note that the non-ephemeral D-H modes are currently unimplemented in OpenSSL because there
is no support for D-H certificates.
Configuring Server Session Caching
An application may optionally enable server session caching by setting session_id string. If the
string is set, Global Call enables session caching on server side and supplies a session identifier to
the client during handshake. During a new handshake, if session_id in ClientHello is non-empty,
Global Call looks up the session cache for a match and resumes a session if possible. Server session
cache terminates when Global Call closes. The session timeout is not configurable and is set at 300
seconds.
The default value of session_id is NULL, and in this case the server returns an empty session_id to
indicate that the session will not be cached and therefore cannot be resumed.
Note that client session caching is not supported in Global Call because Global Call already
supports client connection persistency (see Section 4.24.2.3, “Configuring TCP/TLS Persistence in
IP_VIRTBOARD”, on page 302) so that multiple calls can share the same TLS connection
whenever possible. Server session caching may provide a benefit to remote UA which does not
support client connection persistency and wishes to re-establish TLS connection every time and
resume TLS session if possible.
Setting the Mutual Authentication Option
The E_client_cert_required field determines whether or not the Dialogic® Global Call API library
will require the client to present its certificate for mutual authentication during a TLS handshake
when the library is acting as TLS server. If the client fails to present its certificate or if the
certificate verification fails, the TLS handshake will fail. Mutual authentication is only required if
the application sets this field to the value ENUM_Enabled; the default value is ENUM_Disable.
Setting the Insecure Port Blocking Options
To prevent downgrade attack, Global Call allows applications to optionally block the local UDP
and/or TCP ports by configuring the block_udp_port and block_tcp_port fields in
SIP_TLS_ENGINE. When either port is blocked, both send and receive on that port are disabled
and the application may not make calls or receive calls on that port. If both the UDP and TCP ports
are blocked, only the TLS port (the default TLS port is 5061) can be used as the secure port for
sending and receiving SIP messages.
299
Dialogic Corporation
In both cases, the default value set by INIT_SIP_TLS_ENGINE( ) is ENUM_Disabled, which
leaves both the UDP and TCP ports open. If the application wishes to block either or both of the
ports, it must set the value ENUM_Enabled in the appropriate field or fields.
Simple SIP_TLS_ENGINE Configuration Example
The following code sample illustrates how an application might set up a simple TLS configuration:
#include "gclib.h"
..
..
#define BOARDS_NUM 1
..
..
/* initialize start parameters */
IPCCLIB_START_DATA cclibStartData;
memset(&cclibStartData,0,sizeof(IPCCLIB_START_DATA));
IP_VIRTBOARD virtBoards[BOARDS_NUM];
memset(virtBoards,0,sizeof(IP_VIRTBOARD)*BOARDS_NUM);
/* initialize start data */
INIT_IPCCLIB_START_DATA(&cclibStartData, BOARDS_NUM, virtBoards);
/* initialize virtual board */
INIT_IP_VIRTBOARD(&virtBoards[0]);
/* initialize TLS Engine */
SIP_TLS_ENGINE sip_tls_engine;
INIT_SIP_TLS_ENGINE(&sip_tls_engine);
sip_tls_engine.local_rsa_private_key_filename = "localhost.rsa-key-cert.pem";
sip_tls_engine.local_rsa_cert_filename = "localhost.rsa-key-cert.pem";
sip_tls_engine.ca_cert_number = 1;
sip_tls_engine.ca_cert_filename[0] = "cacert.pem";
/* configure virtual board TLS engine pointer */
virtBoard[0].sip_tls_engine = &sip_tls_engine
Advanced SIP_TLS_ENGINE Configuration Example
The following code sample illustrates a more sophisticated TLS configuration:
#include "gclib.h"
..
..
#define BOARDS_NUM 1
..
..
/* initialize start parameters */
IPCCLIB_START_DATA cclibStartData;
memset(&cclibStartData,0,sizeof(IPCCLIB_START_DATA));
IP_VIRTBOARD virtBoards[BOARDS_NUM];
memset(virtBoards,0,sizeof(IP_VIRTBOARD)*BOARDS_NUM);
/* initialize start data */
INIT_IPCCLIB_START_DATA(&cclibStartData, BOARDS_NUM, virtBoards);
/* initialize virtual board */
INIT_IP_VIRTBOARD(&virtBoards[0]);
300
Dialogic Corporation
/* initialize TLS Engine */
SIP_TLS_ENGINE sip_tls_engine;
INIT_SIP_TLS_ENGINE(&sip_tls_engine);
/* change default port number */
sip_tls_engine.sip_tls_port = 5062;
/* configure local RSA certificate and key */
sip_tls_engine.local_rsa_private_key_filename = "localhost.rsa-key-cert.pem";
sip_tls_engine.local_rsa_private_key_password = "RSAKeyPassword";
sip_tls_engine.local_rsa_cert_filename = "localhost.rsa-key-cert.pem";
/* configure local DSS certificate and key */
sip_tls_engine.local_dss_private_key_filename = "localhost.dss-key-cert.pem";
sip_tls_engine.local_dss_private_key_password = "DSSKeyPassword";
sip_tls_engine.local_dss_cert_filename = "localhost.dss-key-cert.pem";
/* configure two root certficates */
sip_tls_engine.ca_cert_number = 2;
sip_tls_engine.ca_cert_filename = (char**)calloc(sip_tls_engine.ca_cert_number,sizeof(char*));
sip_tls_engine.ca_cert_filename[0] = "cacert1.pem";
sip_tls_engine.ca_cert_filename[1] = "cacert2.pem";
/* configure two chain certificates */
sip_tls_engine.chain_cert_number = 2;
sip_tls_engine.chain_cert_filename =
(char**)calloc(sip_tls_engine.chain_cert_number,sizeof(char*));
sip_tls_engine.chain_cert_filename[0] = "chaincert1.pem";
sip_tls_engine.chain_cert_filename[0] = "chaincert2.pem";
/* configure one CRL */
sip_tls_engine.crl_number = 1;
sip_tls_engine.crl_filename = (char**)calloc(sip_tls_engine.crl_number,sizeof(char*));
sip_tls_engine.crl_filename[0] = "crl.pem";
/* configure local cipher list to be exportable, sorted with key strength */
sip_tls_engine.local_cipher_suite = "EXP:@STRENGTH";
/* configure DH parameters */
sip_tls_engine.dh_param_512_filename = "dh512_param.pem";
sip_tls_engine.dh_param_1024_filename = "dh1024_param.pem";
/* enable server session cache by setting session id string */
sip_tls_engine.session_id = "HMP Media Server";
/* enable mutual authentication, disable UDP and TCP ports */
sip_tls_engine.E_client_cert_required = ENUM_Enabled;
sip_tls_engine.E_block_udp_port = ENUM_Disabled;
sip_tls_engine.E_block_tcp_port = ENUM_Disabled;
/* configure virtual board TLS engine pointer */
virtBoard[0].sip_tls_engine = &sip_tls_engine
4.24.2.2
Enabling TCP in IP_VIRTBOARD
The TLS security mechanism operates on top of the TCP protocol, support for which is optional in
Global Call. It is therefore necessary to enable the TCP protocol in IP_VIRTBOARD by setting the
E_SIP_tcpenabled field to ENUM_Enabled. If an IP_VIRTBOARD structure which contains a
SIP_TLS_ENGINE structure but which does not enable TCP is passed to gc_Start( ), the library
initialization will fail.
301
Dialogic Corporation
4.24.2.3
Configuring TCP/TLS Persistence in IP_VIRTBOARD
Because TLS operates on top of TCP, the Global Call mechanism for configuring the persistence of
TCP connections also affects TLS connections. This configuration is accomplished via the
E_SIP_Persistence field in IP_VIRTBOARD as described in Section 4.1.2, “Configuring SIP
Transport Protocol”, on page 110 and Section 4.1.2.1, “Configuring TCP Transport”, on page 111.
The default persistency is ENUM_PERSISTENCE_TRANSACT_USER, which means that the
TLS client connection will be reused among calls, registrations, and other standalone transactions
if possible. Reusing the TLS client connection will save TLS connection time between the same
source and destination addresses and port numbers. When no one uses a TLS client connection, it
will be terminated by Global Call, and the TLS client connection is therefore kept alive only if
someone is using it.
If the application sets ENUM_PERSISTENCE_TRANSACT as the persistence, a TLS client
connection is terminated as soon as the SIP transaction is terminated. This means that multiple TLS
client connections may be required within the same SIP call. This persistence setting is therefore
not recommended for performance reasons.
In the case where an outbound proxy is configured with valid IP address, Global Call will try to
establish a persistent TCP or TLS client connection to the outbound proxy IP address during library
start up. Note that an outbound proxy name can not be used to resolve to an IP address in either
TCP or TLS during Global Call start up. (This is a limitation only during start up time; during run
time, an outbound proxy name can be used to resolve to IP address.) If TLS is configured as
outbound proxy transport, the outbound proxy name must be configured to verify certificate
identify during Global Call start up, otherwise the persistent client connection can not be
established.
If established, this persistent TCP or TLS client connection could then be reused by all
outgoing/incoming SIP messages to/from the proxy. This persistent TCP or TLS client connection
will be kept alive until Global Call closes, regardless of the E_SIP_Persistence setting in the
IP_VIRTBOARD structure.
4.24.2.4
Enabling TLS in IP_VIRTBOARD
The final step in the process of configuring and enabling TLS is to include the configured
SIP_TLS_ENGINE data structure in the sip_tls_engine field of IP_VIRTBOARD.
If this sip_tls_engine field references a SIP_TLS_ENGINE structure that is not properly
configured for either TLS server or TLS client operation, the library will fail to load when
gc_Start( ) is called. In this case the error will be reported as IPERR_INVALID_TLS_PARAM.
The library will also fail to load when gc_Start( ) is called if TLS is enabled but the TCP protocol
is not enabled via E_SIP_tcpenabled because TLS operates on top of TCP. In this case, the reported
error will be IPERR_INVALID_TLS_WITHOUT_TCP.
302
Dialogic Corporation
4.24.3
Making Calls Using TLS
RFC 3261 defines the use of TLS as a transport mechanism by using the “sips:” scheme. When
using the “sips:” scheme in a URI (or in any other header that indicates the next hop of a message,
such as Route, Via, and others), RFC 3261 mandates the transport to be TLS. This is the reason
why TLS will not guarantee a secure delivery end-to-end, but only to the next hop.
There are several different scenarios of how a Global Call application can originate a call using
TLS. These include:
• Outbound proxy transport configured to be TLS
• Source address is “sip:” URI, destination address is “sip:” URI
• Source address is “sip:” URI, destination address is “sips:” URI
• Source address is “sips:” URI, destination address is “sip:” URI
• Source address is “sips:” URI, destination address is “sips:” URI
Outbound proxy transport configured to be TLS
When an outbound proxy is enabled, the transport protocol is determined by the
E_SIP_OutboundProxyTransport field in the IP_VIRTBOARD structure. If the application wishes
to use TLS transport, it must set the outbound proxy transport in IP_VIRTBOARD to the value
ENUM_TLS. The transport method is independent of the URI scheme of the destination address.
In the following scenario the outbound proxy transport is configured for TLS transport for all
outgoing requests. With both the outbound proxy IP address and hostname configured, a persistent
TLS connection will be established and reused for all subsequent outgoing messages.
303
Dialogic Corporation
Figure 51. Outbound Proxy Configured for TLS Transport with Both IP and Hostname
App TLS
Client &
Server
Outbound
Proxy
(local.com)
Global Call
Remote
UA
gc_Start()
With TLS client and server configuration,
UDP is default transport. Outbound proxy
is configured with TLS, both outbound
proxy IP and Hostname are configured.
gc_MakeCall()
destination.address =
"sip:friend@remote.com"
origination.address =
"sip:user@local.com"
Persistent TLS connection
established (shared by all
outgoing messages from GC
to outbound proxy)
Reuse persistent TLS connection
INVITE sip:friend@remote.com SIP/2.0
To:<sip:friend@remote.com>
From:<sip:user@local.com>
Via: SIP/2.0/TLS xxxxxx
Contact: <sip:user@local.com>
GCEV_CONNECTED
200 OK
To:<sip:friend@remote.com>
From:<sip:user@local.com>
Via: SIP/2.0/TLS xxxxxx
Contact: <sip:user@local.com>
ACK sip:friend@remote.com
To:<sip:friend@remote.com>
From:<sip:user@local.com>
Via: SIP/2.0/TLS xxxxxx
Contact: <sip:user@local.com>
INVITE sip:friend@remote.com SIP/2.0
To:<sip:friend@remote.com>
From:<sip:user@local.com>
Via: SIP/2.0/UDP xxxxxx
Via: SIP/2.0/TLS xxxxxx
Contact: <sip:user@local.com>
200 OK
To:<sip:friend@remote.com>
From:<sip:user@local.com>
Via: SIP/2.0/UDP xxxxxx
Via: SIP/2.0/TLS xxxxxx
Contact: <sip:user@local.com>
ACK sip:friend@remote.com
To:<sip:friend@remote.com>
From:<sip:user@local.com>
Via: SIP/2.0/UDP xxxxxx
Via: SIP/2.0/TLS xxxxxx
Contact: <sip:user@local.com>
gc_DropCall()
Reuse persistent TLS connection
BYE sip:friend@remote.com SIP/2.0
To:<sip:friend@remote.com>
From:<sip:user@local.com>
Via: SIP/2.0/TLS xxxxxx
GCEV_DROPCALL
200 OK
To:<sip:friend@remote.com>
From:<sip:user@local.com>
Via: SIP/2.0/TLS xxxxxx
BYE sip:friend@remote.com SIP/2.0
To:<sip:friend@remote.com>
From:<sip:user@local.com>
Via: SIP/2.0/UDP xxxxxx
Via: SIP/2.0/TLS xxxxxx
200 OK
To:<sip:friend@remote.com>
From:<sip:user@local.com>
Via: SIP/2.0/UDP xxxxxx
Via: SIP/2.0/TLS xxxxxx
gc_ReleaseCall()
GCEV_RELEASECALL
The following scenario also illustrates a case where the outbound proxy is configured for TLS
transport, but here the proxy is only identified by one of the two means (that it, only by IP address
or by hostname, but not both). In this case, there will be no persistent TLS connection established.
Instead, a TLS connection will be established for the SIP transaction. This TLS connection will be
reused only as long as some transaction is using it and will be terminated when no transaction is
using it.
304
Dialogic Corporation
Figure 52. Outbound Proxy Configured for TLS Transport with Only IP Address Or Hostname
App TLS
Client &
Server
Outbound
Proxy
(local.com)
Global Call
Remote
UA
gc_Start()
With TLS client and server configuration,
UDP is default transport. Outbound proxy
is configured with TLS, either outbound
proxy IP or Hostname is configured,
but not both.
gc_MakeCall()
destination.address =
"sip:friend@remote.com"
origination.address =
"sip:user@local.com"
TLS connection #1 is
established
INVITE sip:friend@remote.com SIP/2.0
To:<sip:friend@remote.com>
From:<sip:user@local.com>
Via: SIP/2.0/TLS xxxxxx
Contact: <sip:user@local.com>
GCEV_CONNECTED
200 OK
To:<sip:friend@remote.com>
From:<sip:user@local.com>
Via: SIP/2.0/TLS xxxxxx
Contact: <sip:user@local.com>
ACK sip:friend@remote.com
To:<sip:friend@remote.com>
From:<sip:user@local.com>
Via: SIP/2.0/TLS xxxxxx
Contact: <sip:user@local.com>
TLS connection #1 is
terminated
INVITE sip:friend@remote.com SIP/2.0
To:<sip:friend@remote.com>
From:<sip:user@local.com>
Via: SIP/2.0/UDP xxxxxx
Via: SIP/2.0/TLS xxxxxx
Contact: <sip:user@local.com>
200 OK
To:<sip:friend@remote.com>
From:<sip:user@local.com>
Via: SIP/2.0/UDP xxxxxx
Via: SIP/2.0/TLS xxxxxx
Contact: <sip:user@local.com>
ACK sip:friend@remote.com
To:<sip:friend@remote.com>
From:<sip:user@local.com>
Via: SIP/2.0/UDP xxxxxx
Via: SIP/2.0/TLS xxxxxx
Contact: <sip:user@local.com>
gc_DropCall()
TLS connection #2 is
established
BYE sip:friend@remote.com SIP/2.0
To:<sip:friend@remote.com>
From:<sip:user@local.com>
Via: SIP/2.0/TLS xxxxxx
200 OK
To:<sip:friend@remote.com>
From:<sip:user@local.com>
Via: SIP/2.0/TLS xxxxxx
GCEV_DROPCALL
gc_ReleaseCall()
BYE sip:friend@remote.com SIP/2.0
To:<sip:friend@remote.com>
From:<sip:user@local.com>
Via: SIP/2.0/UDP xxxxxx
Via: SIP/2.0/TLS xxxxxx
200 OK
To:<sip:friend@remote.com>
From:<sip:user@local.com>
Via: SIP/2.0/UDP xxxxxx
Via: SIP/2.0/TLS xxxxxx
TLS connection #2 is
terminated
GCEV_RELEASECALL
Source address is “sip:” URI, destination address is “sip:” URI
In this scenario, the transport protocol of an initial INVITE is decided as follows:
1. If the E_SIP_DefaultTransport field in the IP_VIRTBOARD structure is ENUM_UDP, the
actual transport protocol depends on DNS lookup, as defined by RFC3263. Global Call
automatically matches the remote UA’s supported protocols with local supported protocols.
The final transport for the initial INVITE may be TLS, TCP, or UDP.
305
Dialogic Corporation
2. If the E_SIP_DefaultTransport field in the IP_VIRTBOARD structure is ENUM_TCP, only
TCP will be used as transport protocol. No TLS will be used in the initial INVITE.
Global Call will always use a “sip:” URI as the local contact URI unless this is specifically changed
by the application.
The following figure illustrates an initial INVITE with TLS where both source and destination
addresses use the “sip:” scheme. In this case, the DNS resolves the required transport to be TLS.
Note that in the 200 OK to the INVITE, the Contact URI has changed to the “sips:” scheme, which
causes the subsequent ACK and BYE transactions to use TLS transport.
Figure 53. TLS with “sip:” Source Address and “sip:” Destination Address
App TLS
Client &
Server
App TLS
Client &
Server
Global Call
Global Call
gc_Start()
gc_Start()
With TLS client and server configuration,
UDP is default transport.
No outbound proxy is configured.
With TLS client and server configuration,
UDP is default transport.
No outbound proxy is configured.
gc_MakeCall()
destination.address =
"sip:friend@remote.com"
origination.address =
"sip:user@local.com"
DNS resolves remote.com
transport to be TLS.
INVITE sip:friend@remote.com SIP/2.0
To:<sip:friend@remote.com>
From:<sip:user@local.com>
Via: SIP/2.0/TLS xxxxxx
Contact: <sip:user@local.com>
GCEV_CONNECTED
200 OK
To:<sip:friend@remote.com>
From:<sip:user@local.com>
Via: SIP/2.0/TLS xxxxxx
Contact: <sips:friend@remote.com>
ACK
To:<sips:friend@remote.com>
From:<sip:user@local.com>
Via: SIP/2.0/TLS xxxxxx
Contact: <sip:user@local.com>
gc_DropCall()
GCEV_OFFERED
gc_Answer()
Contact: <sips:friend@remote.com>
GCEV_ANSWERED
BYE
To:<sips:friend@remote.com>
From:<sip:user@local.com>
Via: SIP/2.0/TLS xxxxxx
GCEV_DISCONNECTED
200 OK
To:<sips:friend@remote.com>
From:<sip:user@local.com>
Via: SIP/2.0/TLS xxxxxx
GCEV_DROPCALL
gc_DropCall()
gc_ReleaseCall()
GCEV_DROPCALL
GCEV_RELEASECALL
gc_ReleaseCall()
GCEV_RELEASECALL
306
Dialogic Corporation
Source address is “sip:” URI, destination address is “sips:” URI
In this scenario, the transport protocol of initial INVITE is TLS and Global Call acts as TLS client.
Global Call will always use a “sip:” URI as local contact URI unless the application specifically
changes it, which means that the subsequent incoming request message should use UDP because
local URI is “sip:”.
The following figure illustrates an initial INVITE transaction where TLS is specified via a “sips:”
URI as the destination address. Note that the BYE transaction is UDP because the source address is
given as a “sip:” URI.
Figure 54. TLS with “sip:” Source Address and “sips:” Destination Address
App TLS
Client
App TLS
Server
Global Call
Global Call
gc_Start()
gc_Start()
With TLS client configuration.
With TLS server configuration.
gc_MakeCall()
destination.address =
"sips:friend@remote.com"
origination.address =
"sip:user@local.com"
INVITE sips:friend@remote.com SIP/2.0
To:<sips:friend@remote.com>
From:<sip:user@local.com>
Via: SIP/2.0/TLS xxxxxx
Contact: <sip:user@local.com>
200 OK
To:<sips:friend@remote.com>
From:<sip:user@local.com>
Via: SIP/2.0/TLS xxxxxx
Contact: <sips:friend@remote.com>
GCEV_CONNECTED
ACK
To:<sips:friend@remote.com>
From:<sip:user@local.com>
Via: SIP/2.0/TLS xxxxxx
Contact: <sip:user@local.com>
GCEV_OFFERED
gc_Answer()
GCEV_ANSWERED
gc_DropCall()
GCEV_DISCONNECTED
BYE
From:<sips:friend@remote.com>
To:<sip:user@local.com>
Via: SIP/2.0/UDP xxxxxx
200 OK
From:<sips:friend@remote.com>
To:<sip:user@local.com>
Via: SIP/2.0/UDP xxxxxx
gc_DropCall()
GCEV_DROPCALL
gc_ReleaseCall()
GCEV_DROPCALL
GCEV_RELEASECALL
gc_ReleaseCall()
GCEV_RELEASECALL
307
Dialogic Corporation
Source address is “sips:” URI, destination address is “sip:” URI
In this scenario, the transport protocol of an initial INVITE is determined using the same process as
in the “sip:” source/“sip:” destination case. Global Call will always use a “sips:” URI as the local
contact URI unless the application specifically changes it, which means that the subsequent
incoming request message should use TLS because the local URI is “sips:”
The following figure illustrates the scenario for an initial INVITE where the source address is a
“sips:” URI but the destination is a “sip:” URI. In this case, the initial INVITE is UDP because of
the “sip:” destination address but the BYE is TLS because of the “sips:” URI in the source address.
Figure 55. TLS with “sips:” Source Address and “sip:” Destination Address
App TLS
Server
App TLS
Client
Global Call
Global Call
gc_Start()
gc_Start()
With TLS server configuration.
With TLS client configuration.
gc_MakeCall()
destination.address =
"sip:friend@remote.com"
origination.address =
"sips:user@local.com"
INVITE sip:friend@remote.com SIP/2.0
To:<sip:friend@remote.com>
From:<sips:user@local.com>
Via: SIP/2.0/UDP xxxxxx
Contact: <sips:user@local.com>
200 OK
To:<sip:friend@remote.com>
From:<sips:user@local.com>
Via: SIP/2.0/UDP xxxxxx
Contact: <sip:friend@remote.com>
GCEV_CONNECTED
ACK
To:<sip:friend@remote.com>
From:<sips:user@local.com>
Via: SIP/2.0/UDP xxxxxx
Contact: <sips:user@local.com>
GCEV_OFFERED
gc_Answer()
GCEV_ANSWERED
gc_DropCall()
GCEV_DISCONNECTED
BYE
From:<sip:friend@remote.com>
To:<sips:user@local.com>
Via: SIP/2.0/TLS xxxxxx
200 OK
From:<sip:friend@remote.com>
To:<sips:user@local.com>
Via: SIP/2.0/TLS xxxxxx
gc_DropCall()
GCEV_DROPCALL
gc_ReleaseCall()
GCEV_DROPCALL
GCEV_RELEASECALL
gc_ReleaseCall()
GCEV_RELEASECALL
308
Dialogic Corporation
Source address is “sips:” URI, destination address is “sips:” URI
In this scenario, the transport protocol of an initial INVITE is TLS and Global Call acts as TLS
client and server. Global Call will always use a “sips:” URI as the local contact URI unless the
application specifically changes it, which means that the subsequent incoming request message
should use TLS because the local URI is “sips:”.
The following figure illustrates a scenario where all transactions are TLS because both the source
address and destination address are “sips:” URIs.
Figure 56. TLS with “sips” Source Address and “sips:” Destination Address
App TLS
Client &
Server
App TLS
Client &
Server
Global Call
Global Call
gc_Start()
gc_Start()
With TLS client and server configuration.
With TLS client and server configuration.
gc_MakeCall()
destination.address =
"sips:friend@remote.com"
origination.address =
"sips:user@local.com"
INVITE sips:friend@remote.com SIP/2.0
To:<sips:friend@remote.com>
From:<sips:user@local.com>
Via: SIP/2.0/TLS xxxxxx
Contact: <sips:user@local.com>
GCEV_OFFERED
gc_Answer()
200 OK
To:<sips:friend@remote.com>
From:<sips:user@local.com>
Via: SIP/2.0/TLS xxxxxx
Contact: <sips:friend@remote.com>
ACK
To:<sips:friend@remote.com>
From:<sips:user@local.com>
Via: SIP/2.0/TLS xxxxxx
Contact: <sips:user@local.com>
GCEV_CONNECTED
BYE
From:<sips:friend@remote.com>
To:<sips:user@local.com>
Via: SIP/2.0/TLS xxxxxx
GCEV_ANSWERED
gc_DropCall()
GCEV_DISCONNECTED
200 OK
From:<sips:friend@remote.com>
To:<sips:user@local.com>
Via: SIP/2.0/TLS xxxxxx
GCEV_DROPCALL
gc_DropCall()
gc_ReleaseCall()
GCEV_DROPCALL
GCEV_RELEASECALL
gc_ReleaseCall()
GCEV_RELEASECALL
After the initial INVITE transaction, the transport of subsequent request message to the remote UA
depends on the Contact URI scheme from the remote response or request messages. This means
that the remote UA has the freedom to change the Contact URI to be either a “sip:” or “sips:” URI
independent of initial INVITE request. Global Call will try to use the required transport depending
on the remote Contact URI scheme in conjunction with default transport protocol and any
309
Dialogic Corporation
outbound proxy configuration. Global Call also allows the application to change the contact URI
scheme to be different than the initial INVITE by setting the complete contact header as described
in Section 4.9.5, “Setting SIP Header Fields for Outbound Messages”, on page 183.
For out-of-call request messages, such as REGISTER, OPTIONS, INFO, and
SUBSCRIBE/NOTIFY, the transport method depends on the destination address URI scheme as
well as the default transport protocol and any outbound proxy configuration.
4.24.4
TLS Transport Failures
If a TLS connection fails to establish due to a timeout, a network error, or some other reason,
Global Call notifies the application with a GCEV_EXTENSION event with extension ID
IPEXTID_RECEIVEMSG. The metadata for this extension event will contain a parameter of type
IPSET_SIP_REQUEST_ERROR / IPPARM_SIP_SVC_UNAVAIL whose data is a
REQUEST_ERROR data structure with the error code IP_SIP_NETWORK_ERROR.
Note:
Unlike TCP connection failure, Global Call will not retry the transaction using UDP if the TLS
connection fails, regardless of the value of the E_SIP_RequestRetry parameter in the
IP_VIRTBOARD structure.
Common causes of connection failure include:
• remote UA does not support TLS
• TLS negotiation fails
• post-connection assertion fails (TLS negotiation succeeds but remote TLS certificate hostname
does not match request URI hostname)
• certificate has been revoked or is outdated
4.25
Call Transfer
The Dialogic® Global Call API library provides six APIs specifically for call transfer in the IP
technology. These APIs are described in the Dialogic® Global Call API Library Reference with
protocol-specific variances described in the subsections of Section 8.3, “Dialogic® Global Call API
Function Variances for IP”. This section describes general considerations for implementing call
transfer as well as details specific to H.450.2 (part of the H.323 protocol suite) and SIP protocols.
For H.450.2-specific call transfer scenarios see Section 3.2, “Call Transfer Scenarios When Using
H.323”, on page 57, and for SIP-specific call transfer scenarios, see Section 3.3, “Call Transfer
Scenarios When Using SIP”, on page 74. The topics covered here include:
• Enabling Call Transfer
• Dialogic® Global Call API Line Devices for Call Transfer
• Incoming Transferred Call
• Call Transfer Glare Condition
• Call Transfer When Using SIP
310
Dialogic Corporation
4.25.1
Enabling Call Transfer
The call transfer supplementary service is a feature that must be enabled at the time the gc_Start( )
function is called. Both H.450.2 and SIP call transfer services are enabled at the same time. If the
application tries to use one of the six IP call transfer functions when call transfer was not enabled,
the function call fails with an IPERR_SUP_SERV_DISABLED indication.
The mandatory INIT_IP_VIRTBOARD( ) function populates the IP_VIRTBOARD structure
with default values. The default value of the sup_serv_mask field in the initialized structure
disables the call transfer service for both H.323 and SIP protocols. The default sup_serv_mask field
value must therefore be overridden with the value IP_SUP_SERV_CALL_XFER for each IPT
board device on which call transfer is to be enabled. The following code snippet provides an
example for two virtual boards:
.
.
INIT_IPCCLIB_START_DATA(&ipcclibstart, 2, ip_virtboard);
INIT_IP_VIRTBOARD(&ip_virtboard[0]);
INIT_IP_VIRTBOARD(&ip_virtboard[1]);
ip_virtboard[0].sup_serv_mask = IP_SUP_SERV_CALL_XFER; /* override supp services default */
ip_virtboard[1].sup_serv_mask = IP_SUP_SERV_CALL_XFER; /* override supp services default */
.
.
Note:
4.25.2
Features that are enabled or configured via the IP_VIRTBOARD structure cannot be disabled or
reconfigured once the library has been started. All items set in this data structure take effect when
the gc_Start( ) function is called and remain in effect until gc_Stop( ) is called when the
application exits.
Dialogic® Global Call API Line Devices for Call Transfer
The Dialogic® Global Call API IP architecture is designed so that each RTP transcoder at all times
is streaming (xmit and rcv) with only one other endpoint. In order to support call transfers, two
Global Call line devices are required at some or all of the endpoints. And because all involved call
handles must be on the same stack instance, the following limitations are imposed on call transfers:
• When performing an attended call transfer at party A, both the consultation line device and the
transferring line device must be on the same virtual board.
• When performing a call transfer (either attended or unattended) at party B, both the
transferring line device and the transferred line device must be on the same virtual board.
• When performing an attended call transfer at party C, both the consultation line device and the
transferred-to line device must be on the same virtual board.
To support blind call transfer, two Dialogic® Global Call API line devices are required at the
transferred (party B) endpoint, one for the primary call with the transferring (party A) endpoint and
a second to initiate the transferred call to the transferred-to (party C) endpoint. See Figure 57.
311
Dialogic Corporation
Figure 57. Global Call Devices for H.450.2 Blind Call Transfer or SIP Unattended Transfer
Party A
Party B
Party C
B ldev1
A ldev1
Primary Call
B ldev2
C ldev1
Transferred Call
To support a successful H.450.2 supervised call transfer or SIP attended call transfer, two
Dialogic® Global Call API line devices are eventually utilized at all endpoints. The transferring
endpoint or transferor (party A) makes a consultation call to the transferred-to endpoint or transfer
target (party C), thus utilizing two line devices at both these endpoints as well. See Figure 58.
Figure 58. Global Call Devices for Supervised Call Transfer
Party A
Party B
Party C
B ldev1
A ldev1
Primary Call
C ldev1
A ldev2
Secondary (Consultation) Call
B ldev2
C ldev2
Transferred Call
4.25.3
Incoming Transferred Call
The incoming transferred call to party C contains the call control library (CCLIB) cause value of
IPEC_IncomingTransfer and a Dialogic® Global Call API library (GC LIB) cause value of
GCRV_XFERCALL. The gc_ResultInfo( ) function can be used to retrieve these values.
In the case of supervised transfer, the associated CRN of the secondary/consultation call is
provided. The secondary CRN can be accessed via the extevtdatap pointer within the
METAEVENT structure of the GCEV_OFFERED event which references a GC_PARM_BLK.
From this parameter block, a data element identified by the SetId/ParmId pair of
GCSET_SUPP_XFER and GCPARM_SECONDARYCALL_CRN can be retrieved via the
parameter block utility functions to retrieve the secondary call CRN, which is of datatype size CRN
(long).
If the transferee address is also provided to party C (optional for H.450.2), it can also be retrieved
from this same parameter block, via a data element identified by the SetId/ParmId pair of
GCSET_SUPP_XFER and GCPARM_TRANSFERRING_ADDR via the parameter block utility
functions as a character array of maximum size GC_ADDRSIZE.
The following code sample demonstrates how to implement this:
312
Dialogic Corporation
.
.
.
case GCEV_OFFERED:
{
if (metaevent.extevtdatap)
{
GC_PARM_BLKP parm_blkp = metaevent.extevtdatap;
GC_PARM_DATAP curParm = NULL;
printf("GCEV_OFFERED has parmblk:\n");
while ((curParm = gc_util_next_parm(parm_blkp, curParm)) != NULL)
{
CRN secondaryCRN = 0;
char transferringAddr[GC_ADDRSIZE];
printf("SetID: 0x%x ParmID: 0x%x\n",curParm->set_ID,curParm->parm_ID);
switch (curParm->parm_ID)
{
case GCPARM_SECONDARYCALL_CRN:
memcpy(&secondaryCRN, curParm->value_buf, curParm->value_size);
printf("GCPARM_SECONDARYCALL_CRN: 0x%x\n",secondaryCRN);
break;
case GCPARM_TRANSFERRING_ADDR:
memcpy(transferringAddr, curParm->value_buf, curParm->value_size);
printf("GCPARM_TRANSFERRING_ADDR: %s\n",transferringAddr);
break;
default:
printf("UNEXPECTED PARM_ID: %d\n",curParm->parm_ID);
break;
}
}
}
break;
.
.
.
4.25.4
Call Transfer Glare Condition
Glare can occur on a line device during both blind and supervised call transfer operations. Glare
occurs on a line device during call transfer at Party B when the application calls gc_MakeCall( ) to
establish the transferred call (after the application has called gc_AcceptXfer( ) on the primary
CRN). Glare occurs because the CCLIB IP library has chosen the same line device for an incoming
call that the application has chosen for establishing the transferred call. The application indication
that this glare condition has occurred is that gc_MakeCall( ) fails with an error indication of
EGC_INVSTATE, GCRV_GLARE, or EGC_ILLSTATE. The application should retry the
transferred call establishment request on another “available” line device. The application should
process the GCEV_OFFERED metaevent on the incoming call/line device that caused the glare
“normally” when it is retrieved. The call scenario in Figure 59 describes the glare condition and the
appropriate application response.
313
Dialogic Corporation
Figure 59. Call Transfer Glare Condition
Precondition: Primary call between A and B is connected (not shown).
A
(Transfering)
App
A
(Transfering)
IP CCLib
gc_InvokeXfer(CRNp)
B
(Transferred)
App
B
(Transferred)
IP CCLib
C
(Transferred To)
App
C
(Transferred To)
IP CCLib
FACILITY(cInitiate.Invoke)
GCEV_REQ_
XFER(CRNp)
gc_AcceptXfer(CRNp)
GCEV_ACCEPT_
XFER(CRNp)
SETUP
Event GCEV_OFFERED(LDg/CRNg) is queued
up by Global Call, but not processed by the
application.
Before the application can process the
GCEV_OFFERED(LDg/CRNg) event, but after it is
posted to the application's queue, the applicartion
attempts to complete the blind call transfer on line
device LDg.
The gc_MakeCall(LDg) fails (invalid state) due to
the glare condition with the incoming call.
The application should re-attempt the blind transfer
call on another line device (LDt).
GCEV_
OFFERED
(LDg, CRNg)
gc_MakeCall
(LDg)
GC_ERROR
gc_ErrorInfo
EGC_INVSTATE
gc_MakeCall
(LDt)
CRNt
gc_AcceptCall
(CRNg)
SETUP(ctSetup.Invoke)
GCEV_DIALING
(CRNt)
GCEV_
OFFERED(CRNt
& xfer flag)
After the application successfully initiates the
transfer call on line device LDt, it can process
the incomming call on line device LDg/CRNg.
GCEV_
ACCEPT(CRNg)
(optional)
gc_AcceptCall(CRNt)
(optional)
ALERTING(optional)
GCEV_
ALERTING (CRNt)
(optional)
ALERTING (optional)
GCEV_
PROCEEDING(CRNt)
(optional)
PROCEEDING (optional)
GCEV_CONNECTED
(CRNt)
GCEV_
ACCEPTED(CRNt)
(optional)
gc_AnswerCall(CRNt)
CONNECT(ctSetup.ReturnResult)
GCEV_
ANSWERED(CRNt)
GCEV_XFER_
CMPLT(CRNp)
GCEV_INVOKE_
XFER(CRNp)
GCEV_
DISCONNECTED
(CRNp)
gc_DropCall(CRNp)
GCEV_
DROPCALL(CRNp)
gc_ReleaseCallEx
(CRNp)
GCEV_
RELEASECALL
RLC(ctInitiate.ReturnResult)
GCEV_
DISCONNECTED
(CRNp)
gc_DropCall(CRNp)
GCEV_
DROPCALL(CRNp)
gc_ReleaseCallEx
(CRNp)
GCEV_
RELEASECALL
(CRNp)
KEY:
CRNp
CRNt
- CRN of primary call
- CRN of transferred call
CRNg
- CRN of incoming call
causing glare condition
- final line device of
transferred call
- line device experiencing glare
LDt
LDg
Post Condition: Transferred call between B and C completed. Primary call between A and B
is dropped and released. Incoming call that causes glare is ringing.
314
Dialogic Corporation
4.25.5
Call Transfer When Using SIP
This section describes specific call transfer procedures when using SIP protocol. For complete SIPspecific call transfer scenarios see Section 3.3, “Call Transfer Scenarios When Using SIP”, on
page 74. The topics covered here include:
• Enabling GCEV_INVOKE_XFER_ACCEPTED Events
• Invoking an Unattended Call Transfer
• Invoking an Attended Call Transfer
• Processing Asynchronous Call Transfer Events
• Handling a Transfer Request
• Making a Transferred Call
4.25.5.1
Enabling GCEV_INVOKE_XFER_ACCEPTED Events
The following code snippet illustrates how to enable the GCEV_INVOKE_XFER_ACCEPTED
event type, which is optionally used to notify the application at party A that party B has accepted a
transfer request. This event type is disabled by default. This event can be enabled for an individual
line device at any time after the line device is opened. The event is enabled in the party A
(Transferor) application, and need only be enabled if the application wishes to receive the events.
Note that there is no equivalent event in H.450.2.
//enable GCEV_INVOKE_XFER_ACCEPTED event
GC_PARM_BLK *t_pParmBlk = NULL;
long request_id;
gc_util_insert_parm_val(&t_pParmBlk, GCSET_CALLEVENT_MSK, GCACT_ADDMSK,
sizeof(long), GCMSK_INVOKEXFER_ACCEPTED);
gc_SetConfigData(GCTGT_GCLIB_CHAN,ldev,t_pParmBlk, 0, GCUPDATE_IMMEDIATE, &request_id, EV_SYNC);
gc_util_delete_parm_blk(t_pParmBlk);
Disabling the event is done in exactly the same way except that the parameter ID that is set in the
GC_PARM_BLK would be GCACT_SUBMSK instead of GCACT_ADDMSK.
4.25.5.2
Invoking an Unattended Call Transfer
The following code snippet illustrates how to invoke an unattended (blind) transfer on a channel
that is in the connected state. In this example, the Refer-To header field of the REFER message that
is sent is set to “sip:500@192.168.1.10”, while the Referred-By header field is automatically
populated by Global Call.
int Gc_InvokeXfer(int channel)
{
INT32 rc;
GCLIB_MAKECALL_BLK t_gclibmakecallblk;
GC_MAKECALL_BLK
t_gcmakecallblk = {0};
char invokeaddr[] = "192.168.1.10"; // party C (TRTSE)
char phonelist[] = "500";
315
Dialogic Corporation
/* Invoke transfer */
memset(&t_gclibmakecallblk, 0, sizeof(GCLIB_MAKECALL_BLK));
strcpy(t_gclibmakecallblk.destination.address, invokeaddr);
t_gclibmakecallblk.destination.address_type = GCADDRTYPE_IP;
t_gclibmakecallblk.destination.address_plan = GCADDRPLAN_UNKNOWN;
t_gcmakecallblk.gclib = &t_gclibmakecallblk;
gc_util_insert_parm_ref(&t_pParmBlk, IPSET_CALLINFO, IPPARM_PHONELIST,
sizeof(phonelist), phonelist);
t_gclibmakecallblk.ext_datap = t_pParmBlk;
rc = gc_InvokeXfer(session[channel].crn, 0, 0, &t_gcmakecallblk, 0, EV_ASYNC);
gc_util_delete_parm_blk(t_pParmBlk);
if(GC_SUCCESS != rc)
{
printf("GC_APP : [%d] Invoke Xfer failed!!!\n",channel);
return GC_ERROR;
}
return GC_SUCCESS;
}
4.25.5.3
Invoking an Attended Call Transfer
Note that it is necessary for the consultation call to be in the connected state at both parties before
the transfer operation is invoked. If the transferred-to party (party C) is a Global Call application
and is not in the connected state when the transfer is invoked, it may fail to receive the Global Call
event for the transfer request, which will cause a GCEV_TASKFAIL.
The following code snippet illustrates how a party that is connected to two remote parties, a
primary call and a secondary call, invokes a call transfer by sending a REFER to one of the remote
parties. The Refer-To, Replaces, and Referred-By header fields in the REFER are automatically
filled in by Global Call. Note that the application does not have to specify the Refer-To information
in an attended transfer because the secondary call already contains that information.
int Gc_InvokeXfer(int primaryChannel, int secondaryChannel)
{
INT32 rc;
/* Invoke transfer */
rc = gc_InvokeXfer(session[primaryChannel].crn, session[secondaryChannel].crn,
0, 0, 0, EV_ASYNC);
if(GC_SUCCESS != rc)
{
printf("GC_APP : [%d] Invoke Xfer failed!!!\n",primaryChannel);
return GC_ERROR;
}
return GC_SUCCESS;
}
4.25.5.4
Processing Asynchronous Call Transfer Events
The following code snippets illustrate how to handle the asynchronous events that notify
applications of the call transfer status as a SIP call transfer proceeds.
316
Dialogic Corporation
INT32 processEvtHandler()
{
METAEVENT
metaEvent;
GC_PARM_BLK *parmblkp = NULL;
:
int rc = gc_GetMetaEvent(&metaEvent);
if (GC_SUCCESS != rc)
{
printf("GC_APP : gc_GetMetaEvent() failed\n");
return rc;
}
long evtType = sr_getevttype();
long evtDev = sr_getevtdev();
int g_extIndex = g_lArray[g_evtdev];
switch (evtType)
{
///////////////////////////////////////////
// Party A events
///////////////////////////////////////////
case GCEV_INVOKE_XFER_ACCEPTED:
// remote party has accepted REFER by 2xx response
printf("Invoke Transfer Accepted By Remote\n");
break;
case GCEV_INVOKE_XFER:
// remote party has notified transfer success in NOTIFY
printf("Invoke Transfer Successful\n");
break;
case GCEV_INVOKE_XFER_FAIL:
// Invoke Transfer failed by remote NOTIFY or locally
PrintEventError(&metaEvent);
break;
case GCEV_INVOKE_XFER_REJ:
// Invoke Transfer Rejected by Remote party
PrintEventError(&metaEvent);
break;
/////////////////////////////////////////
// Party B events
/////////////////////////////////////////
case GCEV_REQ_XFER:
// Incoming transfer request
GC_REROUTING_INFO *pRerouteInfo = (GC_REROUTING_INFO *)metaEvent.extevtdatap;
printf("Reroute number = %s\n", pRerouteInfo->rerouting_num);
if(NULL != pRerouteInfo->parm_blkp)
{
// Handle parm blocks
}
strcpy(session[g_extIndex].rerouting_num,pRerouteInfo->rerouting_num);
session[g_extIndex].rerouting_addrblk = *pRerouteInfo->rerouting_addrblkp;
GC_HandleXferReq(g_extIndex)
break;
case GCEV_ACCEPT_XFER:
// Accepted incoming transfer request
break;
317
Dialogic Corporation
case GCEV_ACCEPT_XFER_FAIL:
// Failed to accept incoming transfer request
PrintEventError(&metaEvent);
break;
case GCEV_REJ_XFER:
// Rejected incoming transfer request
break;
case GCEV_REJ_XFER_FAIL:
// Failed to reject incoming transfer request
PrintEventError(&metaEvent);
break;
case GCEV_XFER_CMPLT:
// completed transferred call
break;
case GCEV_XFER_FAIL:
// Failed to complete the transferred call
PrintEventError(&metaEvent);
break;
/////////////////////////////////////////
// Party C events
/////////////////////////////////////////
case GCEV_OFFERED:
// Received incoming call
// Normall incoming call handling
...
break;
...
}
...
}
void PrintEventError(METAEVENT* pEvent, long evtDev)
{
int gcError;
/* GlobalCall Error */
int ccLibId;
/* CC Library ID */
long ccError;
/* Call Control Library error code */
char *GCerrMsg; /* GC pointer to error message string */
char *errMsg;
/* CCLIB pointer to error message string */
if(gc_ResultValue(pEvent, &gcError, &ccLibId, &ccError)
{
gc_ResultMsg(LIBID_GC, (long) gcError, &GCerrMsg);
gc_ResultMsg(ccLibId, ccError, &errMsg);
== GC_SUCCESS)
printf("Ld 0x%lx, GC (%d) %s, CC (%ld) %s, (%s)\n",
evtDev, gcError, GCerrMsg, ccError, errMsg, ATDV_NAMEP(evtDev));
}
}
4.25.5.5
Handling a Transfer Request
The following code snippet illustrates how party B handles an incoming transfer request (REFER).
Party B can either reject the request or accept it. Note that if no rejection reason is specified, the
default reason, 603 Decline, is used.
318
Dialogic Corporation
int Gc_HandleXferReq(int channel)
{
if(session[channel].ConfigFileParm.autoRejectCallXfer)
{
printf("GC_APP : [%d] Reject call xfer request\n",channel);
if(GC_SUCCESS != gc_RejectXfer(session[channel].crn, IPEC_SIPReasonStatus502BadGateway,
0, EV_ASYNC))
{
printf("GC_APP : [%d] Reject call xfer failed on device 0x%lx\n", channel,
session[channel].ldev);
PrintEventError(g_evtdev);
return GC_ERROR;
}
}
else
{
printf("GC_APP : [%d] Accept call xfer request\n",channel);
if(GC_SUCCESS != gc_AcceptXfer(session[channel].crn, 0, EV_ASYNC))
{
printf("GC_APP : [%d] Accept call xfer failed on device 0x%lx\n", channel,
session[channel].ldev);
PrintEventError(g_evtdev);
return GC_ERROR;
}
}
return GC_SUCCESS;
}
4.25.5.6
Making a Transferred Call
The following code snippet illustrates how party B makes the transferred call to party C after
accepting transfer request from party A
int Gc_MakeXferCall(int channelPrimary, int channelXfer)
{
GC_PARM_BLK
* t_pParmBlk = NULL;
GCLIB_MAKECALL_BLK t_gclibmakecallblk ;
GC_MAKECALL_BLK
t_gcmakecallblk = {0};
t_gcmakecallblk.gclib = &t_gclibmakecallblk;
int
channelXfer;
memset(&t_gclibmakecallblk, 0, sizeof(GCLIB_MAKECALL_BLK));
gc_util_insert_parm_val(&t_pParmBlk, GCSET_SUPP_XFER, GCPARM_PRIMARYCALL_CRN,
sizeof(unsigned long), session[channelPrimary].crn);
t_gclibmakecallblk.ext_datap = t_pParmBlk;
t_gclibmakecallblk.destination = session[channelPrimary].rerouting_addrblk;
int frc = gc_MakeCall(session[channelXfer].ldev, &session[channelXfer].crn,
NULL, &t_gcmakecallblk, 0, EV_ASYNC);
if((GC_SUCCESS != frc) ||(0 == session[channelXfer].crn))
{
printf("GC_APP : [%d] Gc_MakeCall failed: : crn 0x%lx\n", channelXfer,
session[channelXfer].crn);
PrintGCError(session[channelXfer].ldev);
}
gc_util_delete_parm_blk(t_pParmBlk);
return GC_SUCCESS;
}
319
Dialogic Corporation
4.26
T.38 Fax Server
Dialogic® Global Call API support for T.38 Fax Server is described under the following topics:
• T.38 Fax Server Support Overview
• Specifying Manual Operating Mode
• Initiating a Switch from Audio to T.38 Fax
• Associating a T.38 Fax Device with a Media Device When a Fax Request is Received
• Accepting/Rejecting a Request to Switch Between Audio and T.38 Fax
• Sending a T.38 Fax in a Session Without Audio Established
• Receiving a T.38 Fax in a Session Without Audio Established
• Sending a Request to Switch from T.38 Fax to Audio
• Receiving a Request to Switch from T.38 Fax to Audio
4.26.1
T.38 Fax Server Support Overview
Dialogic® Global Call API provides T.38 fax server functionality to support fax-on-demand and
other applications. The functionality includes the ability of an application to:
• initiate and complete a T.38 session without an audio connection being first established
• switch coders from audio to T.38 fax and back again during a pre-established audio connection
To support T.38 fax functionality, Dialogic® Global Call API uses two types of media devices:
• a traditional Media device
• a new T.38 Fax device
By default, ipmBxCy represents the media device on board x and channel y, which has no fax
capability on HMP. By associating the corresponding voice handle with a fax handle, the ipmBxCy
device represents the fax channel defined by the fax handle, with no voice capability.
Disassociating the voice and fax devices restores the ipmBxCy device voice capability.
The Dialogic® Global Call API uses the gc_SetUserInfo( ) function to associate and disassociate a
traditional Media device with a T.38 Fax device when establishing or concluding a T.38 fax
connection. Manual device association must be done before the next Dialogic® Global Call API
function that requires fax information:
• For H.323, the association must be made before gc_MakeCall( ) on the outbound call side,
and gc_CallAck( ), gc_AcceptCall( ) and gc_AnswerCall( ) on the inbound call side,
whichever occurs first since the underlying “open logical channel” can happen at any of these
times if coder capabilities and fax port information is available.
320
Dialogic Corporation
• For SIP, the association must be made before gc_MakeCall( ) on the outbound call side and
gc_AnswerCall( ) on the inbound call side, since media can only be opened after either of
these functions.
Note:
When a Media device is associated with a T.38 Fax device to establish a fax session over an
existing audio connection, then when the fax session concludes, the Media device must be
disassociated with the T.38 Fax device, optionally reestablishing the audio connection, before the
call is dropped.
Figure 60 provides a flowchart that summarizes the T.38 fax server functionality and indicates the
Dialogic® Global Call API functions and events used at different stages in the call control process.
The initial voice or fax capability decision before call connection is determined as described in
Section 4.3.2.1, “Specifying Media Capabilities Before Connection”, on page 127.
Figure 60. T.38 Fax Server Support in Manual Mode
gc_Open( )
Open ipmBxCy
device
Voice
Fax
Voice or Fax
gc_SetUserInfo( ) with
IPPARM_T38_CONNECT
Association of fax device
and voice device
gc_MakeCall( ) or
gc_AnswerCall( )
Make/Receive Voice
Call
gc_ReleaseCallEx( )
Release current call
gc_MakeCall( ) or
gc_AnswerCall( )
Make/Receive fax Call
Notified by
Global Call
voice call is ready
Switch to
fax or end
call
Notified by
Global Call
fax call is ready
gc_DropCall( )
Drop current call
end
fax
gc_SetUserInfo( ) with
IPPARM_T38_DISCONNECT
Disassociation fax device
and voice device
end
Switch to
voice or end
call
voice
gc_SetUserInfo( ) with
IPPARM_T38_CONNECT
Association fax device
and voice device
gc_SetUserInfo( ) with
IPPARM_T38_DISCONNECT
Disassociation fax device
and voice device
gc_Extension( ) with
IPARM_T38_INITIATE
Initiate a T.38 fax session
gc_Extension( ) with
IPARM_AUDIO_INITIATE
Initiate audio session
Notified by
Global Call
T.38 Fax session
is ready
Notified by
Global Call
Audio session
is ready
321
Dialogic Corporation
4.26.2
Specifying Manual Operating Mode
An application must be configured in “Manual” mode to control the association and disassociation
of Media and T.38 Fax devices during each call. The mode of operation is set on a board device
basis. Once the GCEV_OPENEX event is received to confirm that the board device is open, the
gc_SetConfigData( ) function can be used to configure “Manual” mode as indicated in the code
example below:
INT32 processEvtHandler()
{
GC_PARM_BLK *parmblkp = NULL;
long
t = 0;
:
:
switch (evtType)
{
:
:
case GCEV_OPENEX:
gc_util_insert_parm_val(&parmblkp, IPSET_CONFIG, IPPARM_OPERATING_MODE,
sizeof(int), IP_MANUAL_MODE);
gc_SetConfigData(GCTGT_CCLIB_NETIF, pline->ldev, parmblkp, 0,
GCUPDATE_IMMEDIATE, &t, EV_ASYNC);
gc_util_delete_parm_blk(parmblkp);
break;
:
:
}
:
:
}
4.26.3
Initiating a Switch from Audio to T.38 Fax
After an audio session has been established, the application can use the gc_Extension( ) function
to initiate a RequestMode (H.323) or re-INVITE (SIP) to change the coder. Prior to initiating a
coder change, the T.38 Fax device must be associated with the Media device. This can be achieved
using the gc_SetUserInfo( ) function. The application receives a GCEV_EXTENSION event to
indicate that T.38 media is ready to send and receive fax information. The following code provides
an example:
INT32 processEvtHandler()
{
METAEVENT
metaEvent;
GC_PARM_BLK
*parmblkp = NULL;
IP_CONNECT
ipConnect;
:
switch (evtType)
{
:
case GCEV_CONNECTED:
/* received Connect event */
/* in conversation */
ipConnect.version = 0x100;
ipConnect.mediaHandle = pline->mediaH;
ipConnect.faxHandle = pline->faxH;
ipConnect.connectType = IP_FULLDUP;
322
Dialogic Corporation
gc_util_insert_parm_ref(&parmblkp, IPSET_FOIP, IPPARM_T38_CONNECT,
(sizeof(IP_CONNECT)), (void *)(&ipConnect));
gc_SetUserInfo(GCTGT_GCLIB_CRN, pline->crn, parmblkp, GC_SINGLECALL);
gc_util_delete_parm_blk(parmblkp);
/* Initiate T.38 codec switch */
gc_util_insert_parm_ref(&parmblkp, IPSET_SWITCH_CODEC, IPPARM_T38_INITIATE,
sizeof(int), NULL);
gc_Extension(GCTGT_GCLIB_CRN,pline->crn, IPEXTID_CHANGEMODE,
parmblkp, NULL, EV_ASYNC);
gc_util_delete_parm_blk(parmblkp);
break;
case GCEV_EXTENSIONCMPLT:
/* received extension complete event for T.38 initiation*/
/* do nothing */
break;
case GCEV_EXTENSION:
/* received extension event for media readiness */
ext_evtblkp = (EXTENSIONEVTBLK *) metaEvent.extevtdatap;
parmblkp = &ext_evtblkp->parmblk;
while (t_gcParmDatap = gc_util_next_parm(parmblkp, t_gcParmDatap))
{
switch(t_gcParmDatap->set_ID)
{
case IPSET_SWITCH_CODEC:
switch(t_gcParmDatap->parm_ID)
{
case IPPARM_READY:
/* Ready to send and receive fax */
fx_sendfax();
break;
:
:
}
break;
}
}
break;
:
}
:
}
4.26.4
Associating a T.38 Fax Device with a Media Device When a
Fax Request is Received
During a voice call, a T.38 Fax request can be received by a RequestMode (H.323) or re-INVITE
(SIP) message. The application receives notification of the request as a GCEV_EXTENSION
event. A T.38 Fax device must then be associated with the Media device by filling in an
IP_CONNECT structure with the appropriate T.38 Fax and Media device handles and using the
gc_SetUserInfo( ) function. To continue to accept the request, the gc_Extension( ) function is
used as described in Section 4.26.5, “Accepting/Rejecting a Request to Switch Between Audio and
T.38 Fax”, on page 325. The following code provides an example:
323
Dialogic Corporation
INT32 processEvtHandler()
{
METAEVENT
metaEvent;
GC_PARM_BLK
*parmblkp = NULL;
GC_PARM_DATAP
t_gcParmDatap = NULL;
GC_PARM_BLK
*parmblkp2 = NULL;
EXTENSIONEVTBLK *ext_evtblkp = NULL;
IP_CONNECT
ipConnect;
:
switch (evtType)
{
case GCEV_EXTENSION:
/* received extension event, parse PARM_BLK examine
* extension data
*/
ext_evtblkp = (EXTENSIONEVTBLK *) metaEvent.extevtdatap;
parmblkp = &ext_evtblkp->parmblk;
while (t_gcParmDatap = gc_util_next_parm(parmblkp, t_gcParmDatap))
{
switch(t_gcParmDatap->set_ID)
{
case IPSET_SWITCH_CODEC:
switch(t_gcParmDatap->parm_ID)
{
case IPPARM_T38_REQUESTED:
/* connect the media and fax devices */
ipConnect.version = 0x100;
ipConnect.mediaHandle = pline->mediaH;
ipConnect.faxHandle = pline->faxH;
ipConnect.connectType = IP_FULLDUP;
gc_util_insert_parm_ref(&parmblkp2, IPSET_FOIP, IPPARM_T38_CONNECT,
sizeof(IP_CONNECT), (void *)(&ipConnect));
gc_SetUserInfo(GCTGT_GCLIB_CRN, pline->crn,
parmblkp, GC_SINGLECALL);
gc_util_delete_parm_blk(parmblkp2);
/* accept T.38 request by example 4.17.5 */
acceptCodecSwitchRequest();
break;
case IPPARM_READY:
/* Ready to send and receive fax */
fx_sendfax();
break;
}
break;
}
}
break;
}
:
}
324
Dialogic Corporation
4.26.5
Accepting/Rejecting a Request to Switch Between Audio
and T.38 Fax
After T.38 coder change request has been received, followed by association of T.38 Fax device with
Media device as described in Section 4.26.4, “Associating a T.38 Fax Device with a Media Device
When a Fax Request is Received”, on page 323, the application can use the gc_Extension( )
function to accept or reject the request as follows:
• To accept the request, the GC_PARM_BLK associated with the gc_Extension( ) function
includes components that indicate acceptance, specifically IPSET_SWITCH_CODEC and
IPPARM_ACCEPT. A RequestModeAck (H.323) or 200 OK (SIP) message is not sent until
the request is accepted. The following code provides an example:
/* Reject the incoming request */
INT32 acceptCodecSwitchRequest()
{
GC_PARM_BLK *parmblkp = NULL;
:
gc_util_insert_parm_val(&parmblkp, IPSET_SWITCH_CODEC, IPPARM_ACCEPT,
sizeof(int), NULL);
gc_Extension(GCTGT_GCLIB_CRN,pline->crn, IPEXTID_CHANGEMODE,
parmblkp, NULL, EV_ASYNC);
gc_util_delete_parm_blk(parmblkp);
}
• To reject the request, the GC_PARM_BLK associated with the gc_Extension( ) function
includes components that indicate rejection, specifically IPSET_SWITCH_CODEC and
IPPARM_REJECT. The reason for rejecting the request is also included in the
GC_PARM_BLK. Chapter 11, “IP-Specific Event Cause Codes” describes the supported
reject reasons that can be used in this context. For H.323, reasons prefixed by
“IPEC_Q931Cause” can be used. For SIP, reasons prefixed by “IPEC_SIPReason” can be
used. The reason parameter corresponds to a RequestModeReject cause (H.323) or a negative
response code (SIP). The following code provides an example:
/* Reject the incoming request */
INT32 rejectCodecSwitchRequest()
{
GC_PARM_BLK *parmblkp = NULL;
:
:
/* Reject with reason being busy, SIP */
gc_util_insert_parm_val(&parmblkp, IPSET_SWITCH_CODEC, IPPARM_REJECT,
sizeof(int), IPEC_SIPReasonStatus486BusyHere);
gc_Extension(GCTGT_GCLIB_CRN, pline->crn, IPEXTID_CHANGEMODE,
parmblkp, NULL, EV_ASYNC);
gc_util_delete_parm_blk(parmblkp);
}
4.26.6
Sending a T.38 Fax in a Session Without Audio Established
The Dialogic® Global Call API supports the transmission of fax information in a session that does
not already have an audio connection established. To send T.38 Fax in such a session, the
application must use the gc_SetConfigData( ) function to specify “Manual” mode, then associate a
325
Dialogic Corporation
T.38 Fax device with a media device before calling the gc_MakeCall( ) function to actually send
the fax information. The association only applies to a single call and can be accomplished by
calling the gc_SetUserInfo( ) function on a line device for a single call, or in the
GC_MAKECALL_BLK structure when calling gc_MakeCall( ).
Note:
If using gc_SetUserInfo( ) to make the association on a line device, the duration must be set to
GC_SINGLECALL rather than GC_ALLCALLS.
The following code provides an example:
INT32 processEvtHandler()
{
GC_PARM_BLK *parmblkp = NULL;
:
:
switch (evtType)
{
case GCEV_OPENEX:
/* Set manual mode */
gc_util_insert_parm_val(&parmblkp, IPSET_CONFIG, IPPARM_OPERATING_MODE,
sizeof(int), IP_MANUAL_MODE);
gc_SetConfigData(GCTGT_GCLIB_NETIF, boarddev, parmblkp, 0,
GCUPDATE_IMMEDIATE, &t, EV_ASYNC);
gc_util_delete_parm_blk(parmblkp);
/* Associate T.38 device with media device */
ipConnect.version = 0x100;
ipConnect.mediaHandle = pline->mediaH;
ipConnect.faxHandle = pline->faxH;
ipConnect.connectType = IP_FULLDUP;
gc_util_insert_parm_ref(&(libBlock.ext_datap), IPSET_FOIP, IPPARM_T38_CONNECT,
sizeof(IP_CONNECT), (void *)(&ipConnect));
gc_SetUserInfo(GCTGT_GCLIB_CHAN, pline->LDEV, parmblkp, GC_SINGLECALL);
gc_util_delete_parm_blk(parmblkp);
/* Make call now */
gc_MakeCall();
break;
case GCEV_CONNECTED:
fx_sendfax();
break;
}
:
:
}
4.26.7
Receiving a T.38 Fax in a Session Without Audio
Established
The Dialogic® Global Call API supports the reception of fax information in a session that does not
already have an audio connection established. The application can receive a GCEV_OFFERED
event with a T.38 Fax request even if the session has no audio connection.
Note:
The parameter block associated with the GCEV_OFFERED event indicates an incoming T.38 Fax
request if T.38 Fax is the only media offered in the incoming request. If more than T.38 media is
offered, no specific T.38 information will be associated with offered event.
326
Dialogic Corporation
To answer the T.38 offer, the application must associate a Fax device with the Media device and set
local T.38 media capability before calling the gc_AnswerCall( ) function. The following code
provides an example:
INT32 processEvtHandler()
{
METAEVENT
metaEvent;
GC_PARM_BLK
*parmblkp = NULL;
GC_PARM_DATAP
t_gcParmDatap = NULL;
GC_PARM_BLK
*parmblkp2 = NULL;
EXTENSIONEVTBLK *ext_evtblkp = NULL;
IP_CONNECT
ipConnect;
IP_CAPABILITY
ipcap;
:
switch (evtType)
{
case GCEV_OFFERED:
/* parse PARM_BLK examine data */
parmblkp = (GC_PARM_BLK *)metaEvent.extevtdatap;
while (t_gcParmDatap = gc_util_next_parm(parmblkp, t_gcParmDatap))
{
switch(t_gcParmDatap->set_ID)
{
case IPSET_FOIP:
switch(t_gcParmDatap->parm_ID)
{
case IPPARM_T38_OFFERED:
/* connect media with fax devices */
ipConnect.version = 0x100;
ipConnect.mediaHandle = pline->mediaH;
ipConnect.faxHandle = pline->faxH;
ipConnect.connectType = IP_FULLDUP;
gc_util_insert_parm_ref(&parmblkp2, IPSET_FOIP, IPPARM_T38_CONNECT,
(sizeof(IP_CONNECT)), (void *)(&ipConnect));
gc_SetUserInfo(GCTGT_GCLIB_CRN, pline->crn, parmblkp2, GC_SINGLECALL);
gc_util_delete_parm_blk(parmblkp2);
/* set T.38 media capability*/
ipcap.capability = GCCAP_DATA_t38UDPFax;
ipcap.type = GCCAPTYPE_RDATA;
ipcap.direction = IP_CAP_DIR_LCLTXRX;
ipcap.extra.data.max_bit_rate = 144;
gc_util_insert_parm_ref(&parmblkp2, GCSET_CHAN_CAPABILITY,
IPPARM_LOCAL_CAPABILITY,
sizeof(IP_CAPABILITY), &ipcap);
gc_SetUserInfo(GCTGT_GCLIB_CRN, pline->crn, pParmBlock2,
GC_SINGLECALL);
gc_util_delete_parm_blk(pParmBlock2);
/* received completion event for gc_Extension() */
gc_AnswerCall(pline->crn, 0, EV_ASYNC);
break;
}
break
}
}
break
}
}
327
Dialogic Corporation
4.26.8
Sending a Request to Switch from T.38 Fax to Audio
To request a switch from a T.38 Fax session back to an audio session, the application uses the
gc_Extension( ) function, which initiates a RequestMode (H.323) or re-INVITE (SIP) message to
actually perform the action. Before initiating the change of coder, the Fax device must be
disassociated from the Media device using the gc_SetUserInfo( ) function. The application
receives a GCEV_EXTENSION event to indicate that audio can now be sent and received. The
following code provides and example:
INT32 switchFromFaxToAudio()
{
GC_PARM_BLK
*parmblkp = NULL;
IP_CONNECT
ipConnect;
ipConnect.version = 0x100;
ipConnect.mediaHandle = pline->mediaH;
gc_util_insert_parm_ref(&parmblkp, IPSET_FOIP, IPPARM_T38_DISCONNECT,
(sizeof(IP_CONNECT)), (void *)(&ipConnect));
gc_SetUserInfo(GCTGT_GCLIB_CRN, pline->crn, parmblkp, GC_SINGLECALL);
gc_util_delete_parm_blk(parmblkp);
/* Initiate audio codec switch */
gc_util_insert_parm_ref(&parmblkp, IPSET_SWITCH_CODEC,
IPPARM_AUDIO_INITIATE, sizeof(int), NULL);
gc_Extension(GCTGT_GCLIB_CRN,pline->crn, IPEXTID_CHANGEMODE, parmblkp, NULL, EV_ASYNC);
gc_util_delete_parm_blk(parmblkp);
}
INT32 processEvtHandler()
{
METAEVENT
metaEvent;
GC_PARM_BLK
*parmblkp = NULL;
:
switch (evtType)
{
case GCEV_EXTENSIONCMPLT:
/* received extension complete event for audio initiation*/
/* do nothing */
break;
case GCEV_EXTENSION:
/* received extension event for media readiness */
ext_evtblkp = (EXTENSIONEVTBLK *) metaEvent.extevtdatap;
parmblkp = &ext_evtblkp->parmblk;
while (t_gcParmDatap = gc_util_next_parm(parmblkp, t_gcParmDatap))
{
switch(t_gcParmDatap->set_ID)
{
case IPSET_SWITCH_CODEC:
switch(t_gcParmDatap->parm_ID)
{
case IPPARM_READY:
/* Ready to send and receive audio */
gc_Listen();
break;
:
:
}
break;
}
}
328
Dialogic Corporation
break;
:
}
:
}
4.26.9
Receiving a Request to Switch from T.38 Fax to Audio
An application may receive a request to switch from a T.38 Fax session back to an audio session.
The request is received as a GCEV_EXTENSION event that is triggered by a RequestMode
(H.323) or re-INVITE (SIP) message. Before accepting the incoming request, the application must
disassociate the T.38 Fax device from the Media device using the gc_SetUserInfo( ) function, then
continue accepting the request as described in Section 4.26.5, “Accepting/Rejecting a Request to
Switch Between Audio and T.38 Fax”, on page 325.
INT32 processEvtHandler()
{
METAEVENT
metaEvent;
GC_PARM_BLK
*parmblkp = NULL;
GC_PARM_DATAP
t_gcParmDatap = NULL;
GC_PARM_BLK
*parmblkp2 = NULL;
EXTENSIONEVTBLK *ext_evtblkp = NULL;
IP_CONNECT
ipConnect;
:
switch (evtType)
{
case GCEV_EXTENSION:
/* received extension event, parse PARM_BLK examine
* extension data
*/
ext_evtblkp = (EXTENSIONEVTBLK *) metaEvent.extevtdatap;
parmblkp = &ext_evtblkp->parmblk;
while (t_gcParmDatap = gc_util_next_parm(parmblkp, t_gcParmDatap))
{
switch(t_gcParmDatap->set_ID)
{
case IPSET_SWITCH_CODEC:
switch(t_gcParmDatap->parm_ID)
{
case IPPARM_AUDIO_REQUESTED:
/* disconnect the media and fax devices */
ipConnect.version = 0x100;
ipConnect.mediaHandle = pline->mediaH;
gc_util_insert_parm_ref(&parmblkp2, IPSET_FOIP, IPPARM_T38_DISCONNECT,
sizeof(IP_CONNECT), (void *)(&ipConnect));
gc_SetUserInfo(GCTGT_GCLIB_CRN, pline->crn, parmblkp, GC_SINGLECALL);
gc_util_delete_parm_blk(parmblkp2);
/* accept audio request by example 4.3.3 */
acceptCodecSwitchRequest();
break;
case IPPARM_READY:
/* Ready to send and receive audio */
gc_Listen();
break;
}
break;
:
}
}
329
Dialogic Corporation
break;
:
}
:
}
4.26.10
Terminating a Call After a T.38 Fax Session
After a T.38 fax session is finished, and prior to issuing gc_DropCall( ), the T.38 Fax device needs
to be disassociated from the Media device using the gc_SetUserInfo( ) function. The following
code provides and example.
INT32 processEvtHandler()
{
METAEVENT
metaEvent;
GC_PARM_BLK
*parmblkp = NULL;
IP_CONNECT
ipConnect;
:
switch (evtType)
{
case GCEV_DISCONNECTED:
/* received extension event, parse PARM_BLK examine extension data */
/* disconnect the media and fax devices */
ipConnect.version = 0x100;
ipConnect.mediaHandle = pline->mediaH;
gc_util_insert_parm_ref(&parmblkp, IPSET_FOIP, IPPARM_T38_DISCONNECT,
sizeof(IP_CONNECT), (void *)(&ipConnect));
gc_SetUserInfo(GCTGT_GCLIB_CRN, pline->crn, parmblkp, GC_SINGLECALL);
gc_util_delete_parm_blk(parmblkp);
/* dropcall */
gc_DropCall(pline->crn, GC_NORMAL_CLEARING, EV_ASYNC);
break;
}
:
}
4.27
Sending and Receiving V.17 Faxes
The Dialogic® HMP system is capable of originating and receiving a fax using a V.17 soft modem.
This facility can be used with the Dialogic® Global Call API library routing the V.17 PCM data
over a G.711 coder in a “fax pass-through” mode by connecting the fax (dxxx) device directly to
the media (ipm) device via a PCM connection.
Alternatively, the V.17 PCM data can be routed over a PSTN connection by connecting the fax
(dxxx) device directly to the DTI front end device (refer to the Dialogic® Fax Software Reference).
4.27.1
Sending G.711 Fax in an Established Audio Session
In the scenario shown in Figure 61, the user application uses the Dialogic® Global Call API to open
a Media device and make a voice call. A Fax device is then opened and the application connects the
Fax device to the voice session.
330
Dialogic Corporation
Figure 61. Sending G.711 Fax in an Established Audio Session
App
GC/cclib
Remote Device Capable of
Signaling, Audio and Fax
FAX
gc_OpenEx(:N_iptB1T1:M_ipmB1C1)
gc_MakeCall()
H.323 SETUP with TCS or SIP INVITE to send
Origination IP address and RTP port number
Call Connected
GCEV_CONNECTED
fx_open(dxxxB23C1)
gc_UnListen()
gc_Listen()
fx_listen()
fx_sndfax()
Fax Data via RTP
4.27.2
Receiving G.711 Fax in an Established Audio Session
In the scenario shown in Figure 62, the user application uses the Dialogic® Global Call API to open
a Media device and establishes an audio session with the remote device. To prepare to receive a fax,
the application must also open a Fax device.
331
Dialogic Corporation
Figure 62. Receiving G.711 Fax in an Established Audio Session
App
GC/cclib
Remote Device Capable of
Signaling, Audio and Fax
FAX
fx_open(dxxxB23C1)
gc_OpenEx(:N_iptB1T1:M_ipmB1C1)
H.323 SETUPw/TCS or SIP INVITE to send
Origination IP address and RTP port number
gc_MakeCall()
Call Connected
GCEV_CONNECTED
gc_Unlisten()
gc_Listen()
fx_listen()
fx_recvfax()
Fax Data via RTP
4.28
Using Object Identifiers
Object Identifiers (OIDs) are not free strings, they are standardized and assigned by various
controlling authorities such as, the International Telecommunications Union (ITU), British
Standards Institute (BSI), American National Standards Institute (ANSI), Internet Assigned
Numbers Authority (IANA), International Standards Organization (ISO), and public corporations.
Depending on the authority, OIDs use different encoding and decoding schemes. Vendors,
companies, governments and others may purchase one or more OIDs to use while communicating
with another entity on the network. For more information about OIDs, see
http://www.alvestrand.no/objectid/.
An application may want to convey an OID to the remote side. This can be achieved by setting the
OID string in any nonstandard parameter that can be sent in any Setup, Proceeding, Alerting,
Connect, Facility, or User Input Indication (UII) message.
The Dialogic® Global Call API supports the use of any valid OID by allowing the OID string to be
included in the GC_PARM_BLK associated with the specific message using the relevant parameter
set ID and parameter IDs. Dialogic® Global Call API will not send an OID that is not in a valid
format. For more information on the valid OID formats see http://asn-1.com/x660.htm which
defines the general procedures for the operation of OSI (Open System Interconnection) registration
authorities.
The application is responsible for the validity and legality of any OID used.
332
Dialogic Corporation
4.29
LAN Disconnection Alarms
The Dialogic® Global Call API IP Call Control library allows applications to receive notification of
a disruption of traffic over the host network interface. The network disconnection notification uses
the standard GCAMS alarm mechanism.
The Global Call IP Call Control library provides facilities to notify applications when there is a
disruption of a host LAN connection that is handling call control signaling traffic, and when any
such disruption is corrected. The most common cause of such a LAN disruption is cable
disconnection, but any disruption of the LAN connection will cause the alarm to be sent to board
devices that have registered for it. LAN status is monitored on a 4 second loop.
Signaling LAN disconnect (Alarm State ON) and recovery (Alarm State OFF) alarms are generated
on a virtual board device level using the standard GCAMS mechanism. If multiple board devices
are connected to different ports on the same NIC (rather than separate NICs), all of those devices
that have registered for the alarm will receive alarm events when the NIC’s LAN connection fails or
when it is restored after a disconnection. There is a single disconnect alarm event and a single
corresponding recovery event for each LAN disconnection on each virtual board.
The signaling LAN disconnect and recovery alarms are only reported via asynchronous GCAMS
events. There is no mechanism for determining the LAN cable alarm status on demand. The
signaling LAN disconnect alarm is not designated as a blocking or non-blocking GCAMS alarm
because it is a board device level alarm rather than a line device level alarm. Refer to the Dialogic®
Global Call API Library Reference and Dialogic® Global Call API Programming Guide for more
information on GCAMS facilities.
The call control library does not take any action (for example, disconnecting an already set up call)
in response to LAN disconnection alarm events. It is up to the application whether or not to take
any action when alarm events are received. If the application does not take any action when a LAN
disconnect alarm is received, the following behavior applies under the circumstances described:
• Already established calls will not be affected unless the LAN connection that has failed is
carrying the media traffic as well as the signaling traffic. (Media LAN disconnection is not
reported by the signaling LAN disconnect alarm.)
• A call that is in the process of being established will be disconnected by the Call Control
library due to the signaling failure, and the application will be notified of the disconnection via
existing Global Call disconnect events with appropriate disconnection reasons.
• If the application ignores the LAN disconnect error and tries to make a new call over the
disconnected LAN connection, the call will fail and the application will be notified of the
reason via existing Global Call events.
If a LAN disconnection failure occurs during application startup, no GCAMS alarm event will be
generated, because there is no virtual board which is started up to receive the alarm. There will also
be no alarm events generated for applications using the NIC address associated with the system
loopback adapter (typically IP address 127.0.0.1) because the signaling never leaves the system in
this case.
333
Dialogic Corporation
To enable the receipt of signaling LAN disconnect alarm events, the application must perform the
following general steps:
• Explicitly open the board device.
• Register the device handle (from the open operation) with GCAMS using the Global Call
function gc_SetAlarmNotifyAll( ). This registration uses the wildcard Alarm Source Object
(ASO) ID, ALARM_SOURCE_ID_NETWORK_ID, because the IP Call Control library ASO
ID is not known at this point.
When an alarm event is received, the alarm number, the alarm name, the ASO ID and the ASO
name can be retrieved using standard Global Call alarm APIs. The retrieved alarm number is equal
to TYPE_LAN_DISCONNECT for a disconnect alarm or TYPE_LAN_DISCONNECT + 0x10
for a reconnect alarm event. The retrieved alarm name will be “Lan Cable Disconnected” or “Lan
cable connected”. The retrieved ASO ID will be “IPCCLIBAsoId”.
The following code illustrates how signaling LAN disconnect alarms are enabled and handled.
main()
{
/* Initialize the SRL mode for the application */
#ifdef _WIN32
int
mode = SR_STASYNC;
sr_setparm(SRL_DEVICE, SR_MODELTYPE, &mode)
#else
int
mode = SR_POLLMODE;
sr_setparm(SRL_DEVICE, SR_MODEID, &mode)
#endif
/* Open the board device */
sprintf(DevName,":N_iptB1:P_IP");
rc = gc_OpenEx(&boarddev,DevName,EV_ASYNC,(void *)NULL);
/* Enable Alarm notification on the board handle with generic ASO ID*/
gc_SetAlarmNotifyAll (boarddev, ALARM_SOURCE_ID_NETWORK_ID, ALARM_NOTIFY);
/* -- Forever loop where the main work is done - wait for an event or user requested exit */
for (;;)
{
ret = sr_waitevt(500);
/* 1/2 second */
if (ret != -1)
{
/* i.e. not timeout */
process_event();
}
}
}
process_event()
{
METAEVENT
metaevent;
gc_GetMetaEvent(&metaevent)
evttype = metaevent.evttype;
switch (evttype)
{
case GCEV_ALARM:
print_alarm_info(&metaevent);
break;
}
}
334
Dialogic Corporation
print_alarm_info(&metaevent);
{
long
alarm_number;
char
*alarm_name;
unsigned long
alarm_source_objectID;
char
*alarm_source_object_name;
gc_AlarmNumber(metaeventp, &alarm_number);
// Will be of type TYPE_LAN_DISCONNECT = 0x01
// or TYPE_LAN_DISCONNECT + 0x10 (LAN connected).
gc_AlarmName(metaeventp, &alarm_name);
// Will be "Lan Cable Disconnected" or "Lan cable connected".
gc_AlarmSourceObjectID(metaeventp, &alarm_source_objectID);
// Will usually be = 7.
gc_AlarmSourceObjectName(metaeventp, &alarm_source_object_name)
// Will be "IPCCLIBAsoId"
printf("Alarm %s (0x%lx) occurred on ASO %s (%d)", alarm_name, alarm_number,
alarm_source_object_name, (int) alarm_source_objectID);
}
4.30
Setting Dialogic® IP Media Library Parameters
As a convenience to Global Call application developers, most Dialogic® IP Media Library API
parameters that are set via the IPM_PARM_INFO data structure can be set using a Dialogic®
Global Call API call. (The only IP Media Library parameters which cannot be set from Global Call
are the three parameters for DTMF transfer mode and RFC2833 payload types.)
The IP Media Library settings that can be performed for a line device from Global Call include the
following:
• enabling/disabling echo cancellation
• specifying adaptive coefficients for echo cancellation
• specifying the echo tail length for echo cancellation
• adjusting audio volume level to or from the IP network
• specifying the type of service in IPv4 headers, either as a 7-bit TOS field or as a 6-bit DSCP
field for Differentiated Services (per RFC2474)
For more information on the IP Media Library parameters that can be set and the supported values
for those parameters, see the reference pages for the IPM_PARM_INFO data structure in the
Dialogic® IP Media Library API Library Reference.
To set an IP Media Library parameter for a line device from Global Call, the application first
constructs an IPM_PARM_INFO data structure that contains the desired parameter ID and value.
Then a parameter element containing the structure is inserted into a GC_PARM_BLK via the
gc_util_insert_parm_ref( ) function using the following IDs:
IPSET_CONFIG
IPPARM_IPMPARM
• Value = IPM_PARM_INFO data structure
The application then calls the gc_SetUserInfo( ) function to send the parameter block to the
ipm_SetParm( ) function on a pass-through basis (that is, without any validity checking on the
Global Call side).
335
Dialogic Corporation
The ipm_SetParm( ) function is called asynchronously even though gc_SetUserInfo( ) is a
synchronous function. The return value of the ipm_SetParm( ) function call is passed through as
the return value for the gc_SetUserInfo( ) call and must be interpreted as it is for the asynchronous
ipm_SetParm( ) call; specifically, the success return value only indicates that the ipm_SetParm( )
function began execution successfully. If the set parameter operation completes successfully, an
IPMEV_SETPARM event will be generated by IPML, but there will be no corresponding Global
Call event because there is no completion event for the synchronous gc_SetUserInfo( ) function. If
an error occurs while setting the parameter, there an IPMEV_ERROR event is generated by IPML
and a GCEV_TASKFAIL event is generated by Global Call.
The following example illustrates how a Global Call application might enable echo cancellation:
IPM_PARM_INFO ipmParmInfo;
Int echoCancellation = ECACTIVE_ON;
ipmParmInfo.eParm = PARMCH_ECACTIVE;
ipmParmInfo.pvParmValue = (void *)&echoCancellation;
gc_util_insert_parm_ref(&parmblkp,
IPSET_CONFIG,
IPPARM_IPMPARM,
(unsigned long)sizeof(IPM_PARM_INFO),
&ipmParmInfo);
gc_SetUserInfo(GCTGT_GCLIB_CHAN, lineDev, parmblkp, GC_ALLCALLS);
gc_util_delete_parm_blk(parmblkp);
The following code example illustrates how the TOS field might be set from a Global Call
application:
IPM_PARM_INFO ipmParmInfo;
char tos=5;
ipmParmInfo.eParm = PARMCH_TOS;
ipmParmInfo.pvParmValue = (void *)&tos;
gc_util_insert_parm_ref(&parmblkp,
IPSET_CONFIG,
IPPARM_IPMPARM,
(unsigned long)sizeof(IPM_PARM_INFO),
&ipmParmInfo);
gc_SetUserInfo(GCTGT_GCLIB_CHAN, port[index].ldev, parmblkp, GC_ALLCALLS);
gc_util_delete_parm_blk(parmblkp);
336
Dialogic Corporation
IP Call Scenarios
3.
3
This chapter provides common call control scenarios when using Dialogic® Global Call API with
IP technology. Topics include:
• Basic Call Control Scenarios When Using IP Technology . . . . . . . . . . . . . . . . . . . . . . 51
• Call Transfer Scenarios When Using H.323 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
• Call Transfer Scenarios When Using SIP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
• T.38 Fax Server Call Scenarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
3.1
Basic Call Control Scenarios When Using IP Technology
This section provides details of the basic call control scenarios when using IP technology. The
scenarios include:
• Basic Call Setup When Using H.323 or SIP
• Basic Call Teardown When Using H.323 or SIP
• Call Setup Scenarios for Early Media
51
Dialogic Corporation
IP Call Scenarios
3.1.1
Basic Call Setup When Using H.323 or SIP
Figure 8 shows the basic call setup sequence when using H.323 or SIP.
Notes: 1. This figure assumes that the network and media channels are already open and a media channel
with the appropriate media capabilities is attached to the network channel. See Section 8.3.18,
“gc_OpenEx( ) Variances for IP”, on page 476 for information on opening and attaching network
and media devices and Section 8.3.17, “gc_MakeCall( ) Variances for IP”, on page 460 for
detailed information on the specification of the destination address etc.
2. Only H.225.0 (Q.931) messages are shown in the sequence below. H.245 messages were omitted
in the interest of simplification.
3. The destination address must be a valid address that can be translated by the remote node.
Figure 8. Basic Call Setup When Using H.323 or SIP
Application
GlobalCall
Application
GlobalCall
gc_WaitCall( )
gc_MakeCall( )
H.323: Q.931 Setup
SIP: INVITE
GCEV_DIALING
GCEV_DETECTED
GCEV_OFFERED
GCEV_PROCEEDING
GCEV_ALERTING
gc_CallAck
H.323: Q.931 Proceeding (GCACK_SERVICE_PROC)
SIP: 100 (Trying)
GCEV_CALLPROC
H.323: Q.931 Alerting
SIP: 180 (Ringing)
H.323: Q.931 Connected
SIP: 200 (OK)
GCEV_CONNECTED
52
gc_AcceptCall( )
GCEV_ACCEPT
SIP: ACK
gc_AnswerCall( )
GCEV_ANSWERED
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP Call Scenarios
3.1.2
Basic Call Teardown When Using H.323 or SIP
Figure 9 shows the basic call teardown scenario when using Dialogic® Global Call API with H.323
or SIP.
Note:
Only H.225.0 (Q.931) messages are shown in the sequence below. H.245 messages were omitted in
the interest of simplification.
Figure 9. Basic Call Teardown When Using H.323 or SIP
Application
Global Call
CC Lib
Global Call
CC Lib
Application
Call connected and media streaming established
gc_DropCall( )
H.323: Q.931 ReleaseComplete
SIP: BYE
GCEV_DISCONNECTED
SIP: 200 (OK)
GCEV_DROPCALL
gc_DropCall( )
GCEV_DROPCALL
gc_ReleaseCallEx( )
GCEV_RELEASECALL
3.1.3
gc_ReleaseCallEx( )
GCEV_RELEASECALL
Call Setup Scenarios for Early Media
When using IP technology, the establishment of RTP media streaming is normally one of the final
steps in establishing and connecting a call. This is in contrast to the public switched telephone
network (PSTN), where call progress signaling is commonly provided to the calling party via
audible, in-band call progress tones, such as ringback, busy signal, and SIT tones. When
implementing a VoIP gateway, it often imperative to initiate media (RTP) streaming from the local
endpoint to the calling party before the call is connected. This capability is commonly referred to as
early media.
The Global Call IP call control library automatically enables media streaming at the earliest
possible point in the pre-connect process. This is generally the earliest point at which the remote
endpoint provides the remote RTP/RTCP transport addresses and media capabilities. The precise
point at which media can be enabled is dependant on a large number of factors, and the following
figures illustrate some common best-case scenarios. Each figure illustrates the Dialogic® Global
Call API library’s behavior from the application’s perspective, either in the calling party role or in
the called party role.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
53
IP Call Scenarios
Note that in some cases it is possible to enable streaming in one direction significantly earlier than
in the other direction. To take full advantage of this fact, the Global Call IP call control library
initially enables a temporary unidirectional connection, then modifies the connection to be full
duplex as soon as that is possible.
3.1.3.1
H.323 FastStart Mode
The library’s default for H.323 operation enables the Global Call FastStart mode, in which the
channel capability information is embedded in a fastStart element (indicated in the figure as
“FSE”) that can be sent within the messages of the H.225 Setup exchange rather than using the
H.245 messages. (This minimizes the number of round-trip message exchanges and avoids the
latency of H.245 channel establishment.) As a calling endpoint, the Dialogic® Global Call API
library enables media after Alerting is received if the called endpoint supports the fastStart mode.
As a called endpoint, the Global Call library enables media in a fastStart connection after the
application calls gc_AcceptCall( ).
If the calling endpoint sets the MediaWaitForConnect element in the Setup message, the Dialogic®
Global Call API library does not enable media transmission for a called endpoint until the Connect
message is sent.
Figure 10. H.323 Early Media, FastStart Mode
Pre condition:
Both line devices are IDLE. Called party has executed gc_WaitCall().
FastStart is enabled. Tunneling is enabled.
Calling
App
IP
CCLib
gc_MakeCall( )
IP
CCLib
SETUP(fse OLCFm , OLCFn ,
OLCRm , OLCRn, ...)
Called
App
GCEV_DETECTED/OFFERED
gc_AcceptCall( )
Unidirectional media
streams are enabled
after the ALERTING
is received and before
each respective
GCEV_EXTENSION
(MEDIAINFO) event
is dispatched.
GCEV_EXTENSION
(EXTID_MEDIAINFO - RX)
ALERTING(fse with OLCFx
and OLC Ry )
GCEV_ALERTING
PROGRESS(fse with OLCFx
and OLC Ry )
GCEV_EXTENSION
(EXTID_MEDIAINFO - RX)
GCEV_EXTENSION
(EXTID_MEDIAINFO - TX)
GCEV_EXTENSION
(EXTID_MEDIAINFO - TX)
Unidirectional media
streams are enabled
before each respective
GCEV_EXTENSION
(MEDIAINFO) event
is dispatched and
before the ALERTING
response is sent.
GCEV_ACCEPT
gc_AnswerCall( )
CONNECT(fse with OLC Fx
and OLC Ry )
GCEV_CONNECTED
GCEV_ANSWERED
FACILITY(TCS, MSD)
FACILITY(TCS, MSD,
TCSAck, MSDAck)
FACILITY(TCSAck, MSDAck)
Post condition: Call is connected.
54
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP Call Scenarios
3.1.3.2
H.323 SlowStart Mode
Many factors affect the opportunities for early media in H.323 SlowStart mode.
• Unless both endpoints support what is referred to as “early H.245”, early media is not possible
in the H.323 SlowStart connection mode.
• When a Global Call application specifies the optional SlowStart mode, or when one endpoint
does not support H.323 fastStart mode, media transmission cannot begin at either endpoint
until the remote endpoint has sent its Ack to the appropriate OpenLogicalChannel command.
• If the OLCAck that either endpoint receives contains a FlowControlToZero flag parameter that
is true, media transmission from that endpoint is not be enabled until a subsequent
FlowControl message is received.
• If the calling endpoint sets the MediaWaitForConnect element in the Setup message, the called
endpoint does not enable media transmission until the Connect message is sent.
Figure 11. H.323 Early Media, SlowStart Mode with Early H.245 Enabled
Pre condition:
Both line devices are IDLE. Called party has executed gc_WaitCall().
SlowStart is enabled. Tunneling is enabled.
Calling
App
IP
CCLib
IP
CCLib
Called
App
gc_MakeCall( )
SETUP(TCS, MSD tunneled)
GCEV_DETECTED/OFFERED
gc_AcceptCall( )
ALERTING(TCSAck,
MSDAck, MSD, TCS)
Unidirectional media
streams are enabled
before each respective
GCEV_EXTENSION
(MEDIAINFO) event
is dispatched.
GCEV_ALERTING
FACILITY
(MSDAck, TCSAck, OLCm)
FACILITY
(OLCAck m , OLCn )
GCEV_EXTENSION
(EXTID_MEDIAINFO - RX)
GCEV_ACCEPT
FACILITY(OLCAck n )
Unidirectional media
streams are enabled
before each respective
GCEV_EXTENSION
(MEDIAINFO) event
is dispatched.
GCEV_EXTENSION
(EXTID_MEDIAINFO - RX)
GCEV_EXTENSION
(EXTID_MEDIAINFO - TX)
GCEV_EXTENSION
(EXTID_MEDIAINFO - TX)
gc_AnswerCall( )
PROGRESS
CONNECT
GCEV_CONNECTED
GCEV_ANSWERED
Post condition: Call is connected.
3.1.3.3
SIP FastStart Mode (Calling UA Offers SDP)
The SIP protocol does not define distinct “fast start” and “slow start” modes as does H.323, but the
Dialogic® Global Call API library uses the same FastStart/SlowStart parameter interface to allow
applications to specify whether the calling UA offers SDP in its INVITE message or whether it
allows the called UA to offer SDP, which SIP refers to as “delayed offer”. In the default “FastStart”
mode, the calling endpoint offers SDP and the called UA answers.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
55
IP Call Scenarios
Figure 12. SIP Early Media, Calling UA Offers SDP
Pre condition:
Both line devices are IDLE. Called party has executed gc_WaitCall().
"FastStart" is enabled.
Calling
App
If only one Rx coder is
specified in offer,
streaming is enabled
at time of offer.
IP
CCLib
IP
CCLib
Called
App
gc_MakeCall( )
INVITE("m=" m , "m="n , ...)
Unidirectional media
streams are enabled
before each respective
GCEV_EXTENSION
(MEDIAINFO) event
is dispatched upon
receiving SDP answer.
GCEV_DETECTED/OFFERED
gc_AcceptCall( )
180 RINGING
("m=" m , "m="n , ...)
GCEV_EXTENSION
(EXTID_MEDIAINFO - RX)
GCEV_ACCEPT
GCEV_EXTENSION
(EXTID_MEDIAINFO - TX)
GCEV_EXTENSION
(EXTID_MEDIAINFO - TX)
GCEV_ALERTING
GCEV_EXTENSION
(EXTID_MEDIAINFO - RX)
Unidirectional media
streams are enabled
before each respective
GCEV_EXTENSION
(MEDIAINFO) event
is dispatched after
answering SDP.
gc_AnswerCall( )
If the 180 (or 183)
response does not
include SDP answer,
media cannot be
enabled until 200 OK.
200 OK ("m=" m , "m="n , ...)
ACK
GCEV_CONNECTED
GCEV_ANSWERED
Post condition: Call is connected.
3.1.3.4
SIP SlowStart Mode (Calling UA Answers SDP)
When a SIP application sets the optional SlowStart parameter, it specifies that the INVITE message
it sends will not contain SDP, so that it is up to the called UA to offer SDP which the calling UA
will subsequently answer. In SIP terminology, this is known as delayed offer.
Figure 13. SIP Early Media, Calling UA Answers SDP
Pre condition:
Both line devices are IDLE. Called party has executed gc_WaitCall().
"SlowStart" is enabled.
Calling
App
IP
CCLib
IP
CCLib
Called
App
gc_MakeCall( )
INVITE [no SDP]
GCEV_DETECTED/OFFERED
Unidirectional media
streams are enabled
before each respective
GCEV_EXTENSION
(MEDIAINFO) event
is dispatched upon
receiving SDP offer.
180 Ringing
GCEV_ALERTING
gc_AcceptCall( )
GCEV_ACCEPT
GCEV_EXTENSION
(EXTID_MEDIAINFO - TX)
GCEV_EXTENSION
(EXTID_MEDIAINFO - RX)
200 OK ("m=" m , "m="n , ...)
gc_AnswerCall( )
ACK("m=" m , "m="n , ...)
GCEV_ANSWERED
GCEV_CONNECTED
GCEV_EXTENSION
(EXTID_MEDIAINFO - TX)
If only one Rcv codec
was specified in SDP
offer, unidirectional
receive stream is
enabled when SDP
is offered.
Unidirectional media
streams are enabled
before each respective
GCEV_EXTENSION
(MEDIAINFO) event
is dispatched upon
receiving SDP answer.
GCEV_EXTENSION
(EXTID_MEDIAINFO - RX)
Post condition: Call is connected.
56
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP Call Scenarios
3.2
Call Transfer Scenarios When Using H.323
The Dialogic® Global Call API API functions that support IP call transfer are described in the
Dialogic® Global Call API Library Reference. Information on implementing H.450.2 call transfer
can be found in Section 4.25, “Call Transfer”, on page 310, and protocol-specific information
about the individual call transfer APIs can be found in the subsections of Section 8.3, “Dialogic®
Global Call API Function Variances for IP”, on page 444.
The following topics describe the call transfer capabilities provided when using the H.450.2
supplementary service with H.323:
• General Conditions for H.450.2 Call Transfers
• Endpoint Behavior in H.450.2 Blind Call Transfers
• Successful H.450.2 Blind Call Transfer Scenario
• Unsuccessful H.450.2 Blind Call Transfer Scenarios
• Endpoint Behavior in H.450.2 Supervised Call Transfer
• Successful H.450.2 Supervised Call Transfer Scenario
• Unsuccessful H.450.2 Supervised Transfer Scenarios
3.2.1
General Conditions for H.450.2 Call Transfers
When performing a call transfer operation, all involved call handles must be on the same stack
instance. This imposes the following application restrictions for call transfer operations:
• When performing a supervised call transfer at party A, both the consultation line device and
the transferring line device must be on the same virtual board.
• When performing a call transfer (either supervised or blind) at party B, both the transferring
line device and the transferred line device must be on the same virtual board.
• When performing a supervised call transfer at party C, both the consultation line device and
the transferred-to line device must be on the same virtual board.
3.2.2
Endpoint Behavior in H.450.2 Blind Call Transfers
This section describes the behavior of each of the three endpoints in an H.450.2 blind call transfer.
The assumed precondition for supervised call transfer is:
• The transferring endpoint (party A) and the transferred endpoint (party B) are participating in
an active call. From the perspective of the Dialogic® Global Call API, party A and party B are
both in the GCST_CONNECTED state.
3.2.2.1
Transferring Endpoint (Party A) Role
The transferring endpoint (party A) initiates the blind transfer by calling the gc_InvokeXfer( )
function, which results in the sending a ctInitiate.Invoke APDU (Application Protocol Data Unit,
the type of message used for H.450 supplementary services) within a Facility message. From this
point forward, this endpoint is only subsequently notified as to the creation of the transferred call
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
57
IP Call Scenarios
attempt. Note however, that it is not notified as to the end result of the transfer, specifically whether
the transfer results in a connection or a no-answer. Instead, the transferring endpoint is only
guaranteed notification that the transferred-to endpoint has been alerted to the incoming transferred
call offering (that is, ringback). As specified in H.450.2, the ctInitiate.ReturnResult APDU may be
returned in either Alerting or Connect. The primary call will also be disconnected remotely via the
transferred endpoint (party B) as part of a successful status notification from this endpoint. Both
the forward and reverse logical channels will be closed along with their associated audio or data
streams. From the Dialogic® Global Call API perspective, the primary call is terminated at the
transferring endpoint, as indicated by the GCEV_DISCONNECTED event, implying the endpoint
is then responsible for the drop and release of the primary call.
3.2.2.2
Transferred Endpoint (Party B) Role
The endpoint to be transferred (party B) is notified of the request to transfer from the initiating
endpoint via the GCEV_REQ_XFER event. Assuming the party to be transferred accepts the
transfer request via the gc_AcceptXfer( ) function, it retrieves the destination address information
from the unsolicited transfer request via the GC_REROUTING_INFO structure passed within the
GCEV_REQ_XFER event. The endpoint to be transferred then uses the rerouting address
information to initiate a call to the new destination party via gc_MakeCall( ). From the perspective
of the application, this transferred call is treated in the same manner as a normal singular call and
the party receives intermediate call state events as to the progress of the call (that is,
GCEV_DIALING, GCEV_ALERTING, GCEV_PROCEEDING, and GCEV_CONNECTED).
When the transferred endpoint receives its first indication from the transferred-to endpoint (party
C) that the call transfer was successful (ctSetup.ReturnResult APDU), the transferred endpoint is
notified of the transfer success and implicitly, without user or application initiation, disconnects the
primary call with the transferring endpoint.
Assuming the transferred call is answered, the transferred endpoint is then involved in active media
streaming with the transferred-to endpoint. Note that the notification of transfer success via the
GCEV_XFER_CMPLT event may also arrive with any call progress events, that is,
GCEV_ALERTING, GCEV_PROCEEDING, or GCEV_CONNECTED. Although the primary
call to the transferring endpoint (party A) is implicitly dropped, the call itself must still be
explicitly dropped via gc_DropCall( ) to resynchronize the local state machine and released via
gc_ReleaseCallEx( ).
3.2.2.3
Transferred-To Endpoint (Party C) Role
For the most part, from the perspective of the transferred-to endpoint (party C), the transferred call
is treated as a typical incoming call. The call is first notified to the application via
GCEV_DETECTED or GCEV_OFFERED events at which point the GCRV_XFERCALL cause
value provided in the event will alert the application that this call offering is the result of a transfer.
At that point, the application may retrieve the typical calling party information about the call. The
transferred-to party is then provided the same methods of action as a typical incoming call, namely
alerting the transferred endpoint (party B) that the call is proceeding (typical for gateways),
ringback notification that the local user is being alerted, or simply answering the call. The only
behavior change from this endpoint over typical non-transferred calls, is whether to treat or display
the calling party information any differently if it is the result of a transfer. Assuming the transferred
call is eventually connected or timed out on no answer, the transferred-to party must eventually
drop and release this call as the case for non-transferred call.
58
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP Call Scenarios
3.2.3
Successful H.450.2 Blind Call Transfer Scenario
As indicated in Figure 14, the precondition for blind transfer is that the transferring endpoint (party
A) and the transferred endpoint (party B) are participating in an active (primary) call and are in
GCST_CONNECTED from the perspective of the Dialogic® Global Call API. Completion of a
successful blind transfer results in the eventual termination of the primary call, and the creation of
the transferred call. Note that the connection of the transferred call is not a mandate for the
completion of a blind transfer. It is always possible that the transferred call itself may possibly be
left unanswered after ringing (Alerting indication) and eventually abandoned and still be
considered a successful blind transfer from the perspective of the transferring endpoint (party A).
Successful blind transfer, in this regard requires only that some response notification (that is, either
Alerting or Connect) was received from the transferred-to endpoint.
For simplification purposes, Figure 14 does not indicate the opening and closing of logical
channels (and the associated media sessions) because the control procedures are consistent with
typical non-transfer related H.323 calls.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
59
IP Call Scenarios
Figure 14. Successful H.450.2 Blind Call Transfer
Pre condition: Primary call between A and B is connected (not shown).
A
(Transferring)
App
A
(Transferring)
IP CCLib
gc_InvokeXfer(CRNp)
B
(Transferred)
App
B
(Transferred)
IP CCLib
C
(Transferred To)
App
C
(Transferred To)
IP CCLib
FACILITY(ctInitiate.Invoke)
GCEV_REQ_
XFER(CRNp)
gc_AcceptXfer(CRNp )
GCEV_
ACCEPT_XFER(CRNp)
gc_MakeCall
(CRNt, CRNp )
GCEV_DIALING
(CRNt)
SETUP(ctSetup.Invoke)
GCEV_
OFFERED(CRNt
& GCRV_XFERCALL)
gc_AcceptCall(CRN)
(optional)
GCEV_
ALERTING (CRNt)
optional
GCEV_
PROCEEDING(CRNt)
optional
GCEV_CONNECTED
(CRNt)
ALERTING (optional)
GCEV_
ACCEPT(CRNt)
(optional)
PROCEEDING (optional)
gc_AnswerCall(CRNt)
CONNECT(ctSetup.ReturnResult)
GCEV_
ANSWERED(CRNt)
GCEV_XFER_CMPLT
(CRNp)
GCEV_
INVOKE_XFER(CRNp)
GCEV_
DISCONNECTED
(CRNp)
gc_DropCall(CRNp)
GCEV_
DROPCALL(CRNp)
gc_ReleaseCallEx
(CRNp)
GCEV_
RELEASECALL
(CRNp)
RLC(ctInitiate.ReturnResult)
GCEV_
DISCONNECTED
(CRNp)
gc_DropCall(CRNp)
GCEV_
DROPCALL(CRNp)
gc_ReleaseCallEx
(CRNp)
KEY:
CRNp - primary call
CRNt - transferred call
GCEV_
RELEASECALL
(CRNp)
Post condition: Transferred call between B and C offered.
Primary call between A and B dropped and released.
60
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP Call Scenarios
3.2.4
Unsuccessful H.450.2 Blind Call Transfer Scenarios
There are a several of scenarios where a blind call transfer may fail. The most common scenarios
are described in the following topics:
• Party B Rejects Transfer
• No Response From Party B
• No Response From Party C
• Party B Clears Primary Call Before Transfer is Completed
• Party C is Busy When Transfer Attempted
For simplification purposes, none of the following figures indicate the opening and closing of
logical channels (and the associated media sessions) because the control procedures are consistent
with typical non-transfer related H.323 calls.
3.2.4.1
Party B Rejects Transfer
As indicated in Figure 15, the application at the transferred endpoint (party B) may call the
gc_RejectXfer( ) function to signal via the ctInitiate.ReturnResult APDU that it cannot participate
in a transfer. As a result, the GCEV_INVOKE_XFER_REJ termination event is received at
transferring endpoint (party A) and the original primary call is left connected and in the
GCST_CONNECTED state from the perspective of both A and B.
Figure 15. H.450.2 Blind Call Transfer Failure - Party B Rejects Call Transfer
Pre condition: Primary call between A and B is connected (not shown).
A
(Transferring)
App
A
(Transferring)
IP CCLib
gc_InvokeXfer(CRNp)
B
(Transferred)
App
B
(Transferred)
IP CCLib
C
(Transferred To)
App
C
(Transferred To)
IP CCLib
FACILITY(ctInitiate.Invoke)
GCEV_REQ_XFER
(CRNp)
GCEV_
INVOKE_XFER_REJ
(CRNp, GCRV_
REMOTEREJ_
UNAVAIL)
gc_RejectXfer(CRNp,
GCVAL_REJREASON_
UNAVAIL)
FACILITY(ctInitiate.ReturnResult = notAvailable)
GCEV_
REJ_XFER
(CRNp)
Post condition: Parties A and B remain connected.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
61
IP Call Scenarios
3.2.4.2
No Response From Party B
As indicated in Figure 16, the transferred endpoint (party B) may not respond to the
ctInitiate.ReturnResult APDU which would cause the T3 timer configured as 20 seconds at the
transferring endpoint (party A) to expire. As a result, the GCEV_INVOKE_XFER_FAIL
termination event would be received at transferring endpoint (party A) and the original primary call
is left connected and in the GCST_CONNECTED state from the perspective of both A and B.
Figure 16. H.450.2 Blind Call Transfer Failure - No Response from Party B
Pre condition: Primary call between A and B is connected (not shown).
A
(Transferring)
App
A
(Transferring)
IP CCLib
gc_InvokeXfer(CRNp)
B
(Transferred)
App
B
(Transferred)
IP CCLib
C
(Transferred To)
App
C
(Transferred To)
IP CCLib
FACILITY(ctInitiate.Invoke)
GCEV_REQ_XFER
(CRNp)
T3 timer
expires
(No response from
B application)
GCEV_
INVOKE_XFER_
FAIL(CRNp)
Post condition: Parties A and B remain connected.
62
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP Call Scenarios
3.2.4.3
No Response From Party C
As indicated in Figure 17, the transferred-to endpoint (party C) may not respond to the incoming
call which would cause the T4 timer configured as 20 seconds at the transferred endpoint (party B)
to expire. As a result, the transferred endpoint (party B) receives the GCEV_DISCONNECTED
event for the transferred call timeout and after sending a ctInitiate.ReturnResult = Unspecified
APDU receives the GCEV_XFER_FAIL event on the primary call. Upon receiving the
ctInitiate.ReturnResult = Unspecified APDU, the transferring endpoint (party A) is notified by the
GCEV_INVOKE_XFER_FAIL termination event and the original primary call is left connected
and in the GCST_CONNECTED state from the perspective of both A and B.
Figure 17. H.450.2 Blind Call Transfer Failure - No Response from Party C
Pre condition: Primary call between A and B is in connected (not shown).
A
(Transferring)
App
A
(Transferring)
IP CCLib
B
(Transferred)
App
B
(Transferred)
IP CCLib
C
(Transferred To)
App
C
(Transferred To)
IP CCLib
gc_InvokeXfer(CRNp)
FACILITY(ctInitiate.Invoke)
GCEV_REQ_XFER
(CRNp)
gc_AcceptXfer
(CRNp)
GCEV_
ACCEPT_XFER
(CRNp)
gc_MakeCall(CRNt,
CRNp )
GCEV_DIALING
(CRNt)
GCEV_
DISCONNECTED
(CRNt)
GCEV_
INVOKE_XFER_
FAIL(CRNp,
GCRV_REMOTEREJ_
UNSPECIFIED)
FACILITY(ctInitiate.ReturnResult = unspecified)
SETUP(ctSetup.Invoke)
T4 timer
expires
GCEV_
OFFERED
(CRNt,
GCRV_XFERCALL)
No response from C
GCEV_XFER_
FAIL(CRNp)
gc_DropCall(CRNt)
GCEV_
DROPCALL(CRNt)
gc_ReleaseCallEx
(CRNt)
GCEV_
RELEASECALL
(CRNt)
RELEASECOMPLETE
GCEV_
DISCONNECTED
(CRNt)
gc_DropCall(CRNt)
GCEV_
DROPCALL
(CRNt)
gc_ReleaseCallEx(CRNt)
GCEV_
RELEASECALL
(CRNt)
Post condition: Parties A and B remain connected.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
63
IP Call Scenarios
3.2.4.4
Party B Clears Primary Call Before Transfer is Completed
The primary call may be cleared at any time while a blind transfer is in progress. As indicated in
Figure 18, the transferred endpoint (party B) may clear the primary call while awaiting
acknowledgement from the transferred-to endpoint (party C). As a result, the
GCEV_INVOKE_XFER_FAIL termination event is received at transferring endpoint (party A)
followed by a GCEV_DISCONNECTED. Similarly, the GCEV_XFER_FAIL termination event is
received at the transferred endpoint (party B) followed by a GCEV_DROPCALL. At this point
party A must drop and release the call while party B must release the call. The transferred call will
also be abandoned implicitly per H.450.2 once the primary call is abandoned. The transferred-to
endpoint will receive the GCEV_DISCONNECTED event at which point it must explicitly drop
and release the abandoned transferred call attempt. Note that if instead party A initiated the
clearing of the primary call while blind transfer is in progress, the only major difference with the
corollary is that party B and not A would react to the primary disconnect (in the same manner as
before) and explicitly drop the primary call; otherwise, the behavior is identical.
Figure 18. H.450.2 Blind Call Transfer Failure - Party B Clears Primary Call
Before Transfer is Completed
Pre condition: Primary call between A and B is in connected (not shown).
A
(Transferring)
App
A
(Transferring)
IP CCLib
gc_InvokeXfer(CRNp)
B
(Transferred)
App
B
(Transferred)
IP CCLib
C
(Transferred To)
App
C
(Transferred To)
IP CCLib
FACILITY(ctInitiate.Invoke)
GCEV_REQ_XFER
(CRNp)
gc_AcceptXfer
(CRNp)
GCEV_
ACCEPT_XFER
(CRNp)
gc_MakeCall(CRNt,
CRNp)
GCEV_DIALING
(CRNt)
Before C responds...
SETUP(ctSetup.Invoke)
GCEV_
OFFERED
(CRNt,
GCRV_XFERCALL)
gc_DropCall(CRNp)
GCEV_
INVOKE_XFER_
FAIL(CRNp)
GCEV_
DISCONNECTED
(CRNp)
gc_DropCall(CRNp)
GCEV_
DROPCALL
(CRNp)
gc_ReleaseCallEx
(CRNp)
GCEV_
RELEASECALL
(CRNp)
RELEASECOMPLETE
GCEV_XFER_
FAIL(CRNp)
GCEV_
DROPCALL(CRNp)
gc_ReleaseCallEx
(CRNp)
GCEV_
RELEASECALL
(CRNp)
GCEV_
DISCONNECTED
(CRNt)
RELEASECOMPLETE
GCEV_
DISCONNECTED
(CRNt)
gc_DropCall(CRNt)
GCEV_
DROPCALL
(CRNt)
gc_ReleaseCallEx(CRNt)
GCEV_
RELEASECALL
(CRNt)
gc_DropCall(CRNt)
GCEV_
DROPCALL
(CRNt)
gc_ReleaseCallEx
(CRNt)
GCEV_
RELEASECALL
(CRNt)
Post condition: Both primary and transferred calls are dropped and released.
64
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP Call Scenarios
3.2.4.5
Party C is Busy When Transfer Attempted
The transferred-to endpoint (party C) may also be busy at the time of transfer (unknown to the
transferring endpoint). As indicated in Figure 19, this would result in a Release Complete message
with Q.931 Cause 17, User Busy, being returned to the transferred endpoint (party B) indicated to
its application via a GCEV_DISCONNECTED event with a cause of GCRV_BUSY. The
transferred endpoint (party B) returns a ctInitiate.ReturnError APDU to the transferring endpoint to
indicate the transfer failure and in turn must drop the transferred call attempt. As a result, the
GCEV_INVOKE_XFER_FAIL termination event is received at transferring endpoint (party A) and
the original primary call is left connected and in the GCST_CONNECTED state from the
perspective of both A and B.
Figure 19. H.450.2 Blind Call Transfer Failure - Party C is Busy When Transfer Attempted
Pre condition: Primary call between A and B is in connected (not shown).
Party C has call connected to another party (not shown).
A
(Transferring)
App
A
(Transferring)
IP CCLib
gc_InvokeXfer(CRNp)
B
(Transferred)
App
B
(Transferred)
IP CCLib
C
(Transferred To)
App
C
(Transferred To)
IP CCLib
FACILITY(ctInitiate.Invoke)
GCEV_REQ_XFER
(CRNp)
gc_AcceptXfer
(CRNp)
GCEV_
ACCEPT_XFER
(CRNp)
gc_MakeCall(CRNt,
CRNp)
GCEV_DIALING
(CRNt)
GCEV_
INVOKE_XFER_
FAIL(CRNp,
GCRV_REMOTE
REJ_UNAVAIL)
FACILITY(ctInitiate.ReturnResult = notAvailable)
SETUP(ctSetup.Invoke)
Party C is busy (not shown).
RELEASECOMPLETE(Q.931Cause17UserBusy)
GCEV_XFER_FAIL
(CRNt,
GCRV_REMOTE
REJ_UNAVAIL)
GCEV_
DISCONNECTED
(GCRV_BUSY,
CRNt)
gc_DropCall
(CRNt)
GCEV_
DROPCALL(CRNt)
gc_ReleaseCallEx
(CRNt)
GCEV_
RELEASECALL
(CRNt)
Post condition: Parties A and B remain connected.
Party C also remains connected (to another party not shown).
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
65
IP Call Scenarios
3.2.5
Endpoint Behavior in H.450.2 Supervised Call Transfer
This section describes the behavior of each of the three endpoints in a supervised call transfer under
H.450.2. The assumed preconditions for supervised call transfer are:
• The transferring endpoint (party A) and the transferred endpoint (party B) are participating in
an active call, known as the primary call. From the perspective of the Global Call API, party A
and party B are both in the GCST_CONNECTED state.
• The transferring endpoint and the transferred-to endpoint (party C) are participating in an
active call, known as the secondary or consultation call. From the perspective of the Global
Call call control library, party A and party C are both in the GCST_CONNECTED state. If
party C uses Global Call and is not in the connected state when the transfer is invoked, it may
fail to receive the Global Call event for the transfer request (GCEV_REQ_INIT_XFER),
which will cause it to receive a GCEV_TASKFAIL.
3.2.5.1
Transferring Endpoint (Party A) Role
As in the case of blind transfer, the transferring endpoint initiates the supervised transfer by calling
the gc_InvokeXfer( ) function. The distinction between blind and supervised transfer usage is the
addition of the CRN of the secondary (consultation) call. Calling the gc_InvokeXfer( ) function at
the transferring endpoint with two CRN values results in the sending of an ctIdentify.Invoke APDU
in a Facility message to the transferred-to endpoint (party C). Once a positive acknowledgement
from the transferred-to endpoint is received via a ctIdentify.ReturnResult APDU in a Facility
message, the transferring endpoint automatically proceeds to invoke the actual call transfer by
sending an ctInitiate.Invoke APDU in a Facility message to the transferred endpoint (party B).
From this point forward, from the perspective of this endpoint, the behavior is similar to that of a
blind or unsupervised transfer. The one difference is that the secondary, consultation call is
disconnected once the transferred call is answered at the transferred-to endpoint (party C) and must
be explicitly dropped and released. Note however, if the transferred call goes unanswered or fails,
the secondary call is left active and maintained in the GCST_CONNECTED state.
3.2.5.2
Transferred Endpoint (Party B) Role
The endpoint to be transferred (party B) has no knowledge of the origins of the destination address
information a priori in that it was retrieved as a result of a consultation call. Thus, from the
perspective of this endpoint, the behavior and handling of supervised transfer is exactly the same as
that of blind transfer.
3.2.5.3
Transferred-To Endpoint (Party C) Role
At any point in time after a secondary consultation call is answered by the transferred-to endpoint,
a Facility(ctIdentify.Invoke) request may arrive requesting whether it is able to participate in an
upcoming transfer as signified by the GCEV_REQ_INIT_XFER event. Assuming that the endpoint
is capable, the application calls the gc_AcceptInitXfer( ) function to accept the transfer along with
the intended rerouting number address in the reroutinginfop GC_REROUTING_INFO pointer
parameter. The IP CCLIB internally returns a newly created callIdentity for the transferred call to
use.
66
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP Call Scenarios
From this point forward, the behavior in handling the incoming transferred call from the
perspective of this endpoint is identical to that of a blind or unsupervised transfer. The only
difference is that the secondary, consultation call is disconnected once the transferred call is
answered and must be explicitly dropped and released.
3.2.6
Successful H.450.2 Supervised Call Transfer Scenario
As indicated in Figure 20, the first precondition for supervised H.450.2 transfer is that the
transferring endpoint (party A) and the transferred endpoint (party B) are participating in an active
call (the primary call) and from the Global Call perspective, in the GCST_CONNECTED state.
The second precondition for supervised transfer is that a secondary call (the consultation call) from
the transferring endpoint (party A) to the transferred-to endpoint (party C) is active and both
endpoints are in the GCST_CONNECTED state.
Completion of a successful supervised transfer results in the eventual termination of the primary
and secondary (consultation) calls, and the creation of the transferred call. Note that the connection
of the transferred call is not a mandate for supervised call transfer. While less likely due to the
typical human dialogue on a secondary (consultation) call, it is always possible that the transferred
call itself may be left unanswered and eventually abandoned and still be considered a successful
transfer from the signaling perspective of the transferring endpoint (party A).
For simplification purposes Figure 20 does not indicate the opening and closing of logical channels
(and the associated media sessions) because the control procedures are consistent with typical nontransfer related H.323 calls.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
67
IP Call Scenarios
Figure 20. Successful H.450.2 Supervised Call Transfer
Pre condition: Primary call between A and B is connected.
Secondary (consultation) call between A and C is connected (not shown).
A
(Transferring)
App
A
(Transferring)
IP CCLib
gc_InitXfer
(CRNs)
GCEV_
INIT_XFER
(CRNs)
gc_InvokeXfer(CRNp,
CRNs )
B
(Transferred)
App
B
(Transferred)
IP CCLib
C
(Transferred To)
App
C
(Transferred To)
IP CCLib
Dispatch "dummy"
event to
synchronize with
GC state machine.
FACILITY(ctIdentify.Invoke)
GCEV_REQ_
INIT_XFER(CRNs)
gc_AcceptInitXfer(CRNs)
FACILITY(ctIdentify.ReturnResult)
FACILITY(ctInitiate.Invoke)
GCEV_REQ_XFER
(CRNp)
GCEV_ACCEPT_
INIT_XFER(CRNs)
gc_AcceptXfer(CRNp)
GCEV_
ACCEPT_XFER
(CRNp)
gc_MakeCall(CRNt)
SETUP(ctSetup.Invoke)
GCEV_DIALING
(CRNt)
GCEV_OFFERED
(CRNt & GCRV_XFERCALL)
...typical H.323
call setup...
...typical H.323
call setup...
gc_AnswerCall(CRNt)
CONNECT(ctSetup.Invoke)
GCEV_
CONNECTED(CRNt)
GCEV_
INVOKE_XFER(CRNp)
GCEV_
DISCONNECTED
(CRNp)
gc_DropCall(CRNp)
GCEV_
DROPCALL(CRNp)
gc_ReleaseCallEx
(CRNp)
GCEV_
RELEASECALL(CRNp)
GCEV_
DISCONNECTED
(CRNs)
gc_DropCall(CRNs)
GCEV_
DROPCALL(CRNs)
gc_ReleaseCallEx
(CRNs)
GCEV_
RELEASECALL(CRNs)
GCEV_
ANSWERED(CRNt)
RLC(ctInitiate.ReturnResult)
GCEV_
XFER_CMPLT
(CRNp)
GCEV_
DISCONNECTED
(CRNp)
gc_DropCall(CRNp)
GCEV_
DROPCALL(CRNp)
gc_ReleaseCallEx
(CRNp)
GCEV_
RELEASECALL(CRNp)
RLC
GCEV_
DISCONNECTED(CRNs)
KEY:
CRNp - primary call
CRNs - secondary
(consultation) call
CRNt - transferred call
gc_DropCall(CRNs)
GCEV_
DROPCALL(CRNs)
gc_ReleaseCallEx(CRNs)
GCEV_
RELEASECALL(CRNs)
Post condition: Transferred call between B and C offered (optional whether connected or not).
Primary call between A and B dropped and released.
Secondary (consultation) call between A and C dropped and released.
68
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP Call Scenarios
3.2.7
Unsuccessful H.450.2 Supervised Transfer Scenarios
Note:
The same failures that can potentially occur in blind transfer, may take place in supervised transfer
as well. See Section 3.2.4, “Unsuccessful H.450.2 Blind Call Transfer Scenarios”, on page 61 for
more information. The difference being that the secondary, consultation may optionally be cleared
as specified in H.450.2.
There are a several other scenarios where a supervised call transfer may fail. The most common
scenarios are described in the following topics:
• Party C Timeout
• Party C Rejects the Transfer Request
• Party B Rejects the Transfer Request
• Party B Timeout
For simplification purposes, none of the following figures indicate the opening and closing of
logical channels (and the associated media sessions) because the control procedures are consistent
with typical non-transfer related H.323 calls.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
69
IP Call Scenarios
3.2.7.1
Party C Timeout
As indicated in Figure 21, the user or application at the transferred-to endpoint (party C) may fail
to respond to the ctIdentify.Invoke request causing the timer 1 to expire at the transferring endpoint
(party A) resulting in an abandoned transfer attempt. As a result, the
GCEV_INVOKE_XFER_FAIL termination event is received at transferring endpoint (party A).
Both the original primary call and the secondary, consultation call are left connected and in the
GCST_CONNECTED state from the perspective of both A and B (primary) and A and C
(secondary).
Figure 21. H.450.2 Supervised Call Transfer Failure - Party C Timeout
Pre condition: Primary call between A and B is connected.
Secondary (consultation) callbetween A and C is connected (not shown).
A
(Transferring)
App
A
(Transferring)
IP CCLib
gc_InvokeXfer
(CRNp, CRNs)
B
(Transferred)
App
B
(Transferred)
IP CCLib
C
(Transferred To)
App
C
(Transferred To)
IP CCLib
FACILITY(ctIdentify.Invoke)
GCEV_REQ_
INIT_XFER(CRNs)
T1 timer expires
No response from C
GCEV_
INVOKE_FAIL
(CRNp,
GCRV_TIMEOUT)
FACILITY(ctAbandonInvoke)
GCEV_ACCEPT_
INIT_XFER_FAIL(CRNs)
KEY:
CRNp - primary call
CRNs - secondary
(consultation) call
CRNt - transferred call
Post condition: Primary call between A and B remains connected.
Secondary (consultation) call between A and C remains connected.
Transferred call between B and C never initiated.
70
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP Call Scenarios
3.2.7.2
Party C Rejects the Transfer Request
As indicated in Figure 22, the user or application at the transferred-to endpoint (party C) may call
the gc_RejectInitXfer( ) function to signal via the ctInIdentify.ReturnResult APDU that it cannot
participate in a transfer. As a result, the GCEV_INVOKE_XFER_REJ termination event is
received at the transferring endpoint (party A). Both the original primary call and the secondary,
consultation call are left connected and in the GCST_CONNECTED state from the perspective of
both A and B (primary) and A and C (secondary); GCST_CONNECTED state from the perspective
of both A and B.
Figure 22. H.450.2 Supervised Call Transfer Failure - Party C Rejects the Transfer Request
Pre condition: Primary call between A and B is connected.
Secondary (consultation) call between A and C is connected (not shown).
A
(Transferring)
App
A
(Transferring)
IP CCLib
gc_InvokeXfer
(CRNp, CRNs)
B
(Transferred)
App
B
(Transferred)
IP CCLib
C
(Transferred To)
App
C
(Transferred To)
IP CCLib
FACILITY(ctIdentify.Invoke)
GCEV_REQ_
INITX_FER(CRNs)
gc_RejectInitXfer(CRNs)
GCEV_
INVOKE_REJ
(CRNp)
FACILITY(ctIdentify.ReturnError = notAvailable)
KEY:
CRNp - primary call
CRNs - secondary
(consultation) call
CRNt - transferred call
GCEV_REJ_
INIT_XFER(CRNs)
Post condition: Primary call between A and B remains connected.
Secondary (consultation) call between A and C remains connected.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
71
IP Call Scenarios
3.2.7.3
Party B Rejects the Transfer Request
As indicated in Figure 23, the user or application at the transferred endpoint (party B) may call the
gc_RejectXfer( ) function to reject the transfer request and signal via the ctInitiate.ReturnResult
APDU that it cannot participate in a transfer. As a result, the GCEV_INVOKE_XFER_REJ
termination event is received at transferring endpoint (party A). Both the original primary call and
the secondary, consultation call are left connected and in the GCST_CONNECTED state from the
perspective of both A and B (primary) and A and C (secondary); GCST_CONNECTED state from
the perspective of both A and B.
Figure 23. H.450.2 Supervised Call Transfer Failure - Party B Rejects the Transfer Request
Pre condition: Primary call between A and B is connected.
Secondary (consultation) call between A and C is connected (not shown).
A
(Transferring)
App
A
(Transferring)
IP CCLib
B
(Transferred)
App
B
(Transferred)
IP CCLib
gc_InvokeXfer
(CRNp, CRNs)
C
(Transferred To)
App
C
(Transferred To)
IP CCLib
FACILITY(ctIdentify.Invoke)
GCEV_REQ_
INIT_XFER(CRNs)
gc_AcceptInitXfer(CRNs)
FACILITY(ctIdentify.ReturnResult)
FACILITY(ctInitiate.Invoke)
gc_RejectXfer
(CRNp, notAvailable)
FACILITY(ctInitiate.ReturnResult = notAvailable)
GCEV_
INVOKE_XFER_
REJ(CRNp)
GCEV_
REJ_XFER
(CRNp)
FACILITY(ctAbandon)
KEY:
CRNp - primary call
CRNs - secondary
(consultation) call
CRNt - transferred call
GCEV_ACCEPT_
INIT_XFER_FAIL(CRNs)
Post condition: Primary call between A and B remains connected.
Secondary (consultation) call between A and C remains connected.
72
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP Call Scenarios
3.2.7.4
Party B Timeout
As indicated in Figure 24, the user or application at the transferred-to endpoint (party C) may
receive the transferred call after the T4 timer expires. If this is the case and the callIdentity is
cleared as a result of the T4 expiry, the transferred-to endpoint will clear or reject the transferred
call as indicated by a GCEV_DISCONNECTED event at the transferred endpoint (party B) and a
GCEV_INVOKE_XFER_FAIL event at the transferring endpoint (party A). Both the original
primary call and the secondary, consultation call are left connected and in the
GCST_CONNECTED state from the perspective of both A and B (primary) and A and C
(secondary); GCST_CONNECTED state from the perspective of both A and B.
Figure 24. H.450.2 Supervised Call Transfer Failure - Party B Timeout
Pre condition: Primary call between A and B is connected.
Secondary (consultation) call between A and C is connected (not shown).
A
(Transferring)
App
A
(Transferring)
IP CCLib
gc_InvokeXfer
(CRNp, CRNs)
B
(Transferred)
App
B
(Transferred)
IP CCLib
C
(Transferred To)
App
C
(Transferred To)
IP CCLib
FACILITY(ctIdentify.Invoke)
T4 timer started
(20 secs.)
GCEV_REQ_
INIT_XFER(CRNs)
gc_AcceptInitXfer(CRNs)
FACILITY(ctIdentify.ReturnResult)
FACILITY(ctInitiate.Invoke)
GCEV_REQ_XFER
(CRNp)
gc_AcceptXfer(CRNp)
GCEV_
ACCEPT_XFER
(CRNp)
20 secs. elapse before
SETUP arrives,
thus timer T4 expires
time interval in excess of
timer T4 duration...
gc_MakeCall(CRNt)
GCEV_DIALING
(CRNt)
SETUP(ctSetup.Invoke)
Invalid callIdentity, thus
call is cleared internally
RLC
GCEV_
INVOKE_XFER_
FAIL(CRNp)
FACILITY(ctInitiate.InvokeReturnError)
GCEV_ACCEPT_
INIT_XFER_FAIL(CRNs)
GCEV_
DISCONNECTED
(CRNt)
gc_DropCall(CRNt)
GCEV_
DROPCALL(CRNt)
gc_ReleaseCallEx
(CRNt)
KEY:
CRNp - primary call
CRNs - secondary
(consultation) call
CRNt - transferred call
Post condition: Primary call between A and B remains connected.
Secondary (consultation) call between A and C remains connected.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
73
IP Call Scenarios
3.3
Call Transfer Scenarios When Using SIP
The Dialogic® Global Call API functions that supports IP call transfer are described in the Global
Call API Library Reference; protocol-specific information about the individual call transfer APIs
can be found in the subsections of Section 8.3, “Dialogic® Global Call API Function Variances for
IP”. General information on implementing call transfer can be found in Section 4.25, “Call
Transfer”, on page 310, and SIP-specific details can be found in Section 4.25.5, “Call Transfer
When Using SIP”, on page 315.
The following topics describe the call transfer capabilities provided when using the SIP call
transfer supplementary service:
• General Conditions for SIP Call Transfers
• Endpoint Behavior in Unattended SIP Call Transfers
• Successful Unattended SIP Call Transfer Scenarios
• Endpoint Behavior in Attended SIP Transfers
• Successful SIP Attended Call Transfer Scenarios
• Unsuccessful Call Transfer Scenarios
3.3.1
General Conditions for SIP Call Transfers
SIP call transfer uses the REFER method (with NOTIFY support) to reroute a call (a SIP dialog)
after the call has been established; in other words, after two endpoints have an established media
path.
There are two fundamental types of call transfer:
• Unattended transfer, which is referred to as “blind transfer” in most other technologies and
protocols. In this type of transfer the transferring party (called the Transferor in SIP) has a call
(or SIP dialog) with the transferred party (called the Transferee in SIP) but not with the
transferred-to party (called the Transfer Target in SIP).
• Attended transfer, which is referred to as “supervised transfer” in most other technologies and
protocols. In this type of transfer, the Transferor has a dialog with both the Transferee and the
Transfer Target.
In its simplest terms, a SIP call transfer involves the Transferor issuing a REFER to the Transferee
to cause the Transferee to issue an INVITE to the Transfer Target. The Transferee and Transfer
Target negotiate the media without regard to the media that had been negotiated between the
Transferor and the Transferee, just as if the Transferee had initiated the INVITE on its own.
Once a transfer request is accepted by the Transferee, the Transferor is not allowed to send another
transfer request to the Transferee. Only if a transfer request is rejected or fails is the Transferor
allowed to attempt another transfer request to Transferee.
The disposition of the media streams between the Transferor and the Transferee is not altered by
the REFER method. A successful REFER transaction does not terminate the session between the
Transferor and the Transferee; if those parties wish to terminate their session, they must do so with
a subsequent BYE request.
74
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP Call Scenarios
In the SIP call transfer protocol the Transferor is notified when the Transferee accepts the REFER
transfer request. The Dialogic® Global Call API Library allows this notification to be signaled to
the application as a GCEV_INVOKE_XFER_ACCEPTED event. This event is optional, and is
disabled (or masked) by default. The party A application can enable and disable this event at any
time after the line device is opened using the gc_SetConfigData( ) function. See Section 4.25.5.1,
“Enabling GCEV_INVOKE_XFER_ACCEPTED Events”, on page 315 for details.
When performing a call transfer operation, all involved call handles must be on the same stack
instance. This imposes the following application restrictions for call transfer operations
• When performing an attended call transfer at party A, both the consultation line device and the
transferring line device must be on the same virtual board.
• When performing a call transfer (either attended or unattended) at party B, both the
transferring line device and the transferred line device must be on the same virtual board.
• When performing an attended call transfer at party C, both the consultation line device and the
transferred-to line device must be on the same virtual board.
Interoperability Issues
The latest standards for the SIP REFER method are defined in IETF RFC 3515, published in April
2003. The current Global Call implementation is compliant with RFC 3515, but many existing
implementations of REFER are based on the previous draft of the REFER method and are not fully
compliant. The most significant non-compliance issues are:
• no initial NOTIFY after sending out 202 accept to REFER request
• no subscription state information in NOTIFY message
• no NOTIFY generated by the Transferee (Transferred party) after the call is terminated
• any NOTIFY received by the Transferor (Transferring party) after the subscription is
terminated or the call is terminated will be rejected. Note that the subscription can be
terminated implicitly after receiving NOTIFY of 180 Ringing.
3.3.2
Endpoint Behavior in Unattended SIP Call Transfers
The precondition for unattended call transfer (commonly referred to as “blind call transfer” in other
technologies and protocols) is that the transferring endpoint (party A, or Transferor in SIP
terminology) and the transferred endpoint (party B or Transferee in SIP terms) are participating in
an active call, known as the primary call. From the perspective of the Dialogic® Global Call API,
both parties are in the GCST_CONNECTED state. Completion of a successful unattended transfer
results in the eventual termination of the primary call, and the creation of the transferred call
between party B and the Transfer Target (party C).
3.3.2.1
Transferor or Transferring Endpoint (party A)
The Transferor (party A) initiates an unattended transfer by calling the gc_InvokeXfer( ) function
on the CRN of the primary call (CRNp), which results in the sending a REFER message to the
Transferee (party B). The Refer-To header in the REFER request is constructed from either the char
*numberstr or the GC_MAKECALL_BLK *makecallp parameter in the gc_InvokeXfer( )
function, following the same rules as gc_MakeCall( ). The Referred-By header is automatically
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
75
IP Call Scenarios
constructed with the local URI—the same as the From or To header, depending on the direction of
the initial call INVITE. Optionally, the Transferor can override the default Referred-By header by
inserting a Referred-By header in the gc_InvokeXfer( ) parm block. Party A will be notified if
REFER is accepted or rejected by transferred endpoint (party B).
If party A receives a 2xx response to the REFER (indicating that is was accepted by party B), a
GCEV_INVOKE_XFER_ACCEPTED event may optionally be generated. This optional event is
disabled by default; after the line device has been opened, the event can be enabled or disabled at
any time by use of the gc_SetConfigData( ) function.
The primary call may be terminated by either party before transferred call is completed. Unlike an
H.450.2 transfer, party A in a SIP transfer will not get any transfer termination event if party A
terminates the primary call before receiving final status from party B. This is because there is no
way to be sure if the transfer is successful or if it failed and it is party A’s responsibility to update
the application transfer states in this case. This is a common scenario in blind transfer where party
A does not care about the transferred call status and drops the primary call immediately after
receiving a GCEV_INVOKE_XFER_ACCEPTED event.
When the REFER subscription is terminated, party A rejects subsequent NOTIFY messages. Any
of the following events terminate the REFER subscription:
• a NOTIFY with subscription state terminated is received
• a NOTIFY of 180 Ringing is received
• a 2xx-6xx final response is received
• the primary call is terminated
If the primary call remains connected and the REFER subscription is alive, party A may be notified
of the final status of transferred call from party B. The notification of transferred call status is
optional depending on party B.
From party A’s perspective, a call transfer is considered successful as long as
GCEV_INVOKE_XFER_ACCEPTED (if enabled) and GCEV_INVOKE_XFER events are
received. If the optional GCEV_INVOKE_XFER_ACCEPTED event type is enabled, that event is
generated by receiving a 2xx response (to the REFER request) from party B. The
GCEV_INVOKE_XFER event is generated by receiving from party B either a NOTIFY of
termination of the REFER subscription or a NOTIFY of 180 Ringing or 2xx final status on the
transferred call.
The REFER subscription will be terminated and the primary call will also be disconnected locally
immediately after generating a GCEV_INVOKE_XFER event. From the Global Call API
perspective, the primary call is terminated at the transferring endpoint as indicated by the
GCEV_DISCONNECTED event implying the Transferor endpoint is then responsible for dropping
and releasing the primary call.
3.3.2.2
Transferee or Transferred Endpoint (Party B)
The endpoint to be transferred (party B, or Transferee in SIP terms) is notified of the request to
transfer from the initiating endpoint via a GCEV_REQ_XFER event on CRNp. If party B accepts
the transfer request via gc_AcceptXfer( ) function call on CRNp, a 202 Accepted response is sent
76
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP Call Scenarios
to party A. Sending 202 Accepted to party A starts the REFER subscription, whereupon party B
automatically sends a NOTIFY of 100 Trying (with default expiration time of 300 seconds) to party
A on CRNp. No further notification of 100 Trying is sent from party B to party A during the call
transfer process.
Party B retrieves the destination address information from the unsolicited transfer request via the
GC_REROUTING_INFO structure passed with the GCEV_REQ_XFER event. Party B uses the
rerouting address information (Refer-To address) to initiate a call to the new destination party via
gc_MakeCall( ) on CRNt. From the perspective of the application, this transferred call is treated in
the same manner as a normal singular call and the party receives intermediate call state events as to
the progress of the call (e.g., GCEV_DIALING, GCEV_ALERTING, GCEV_PROCEEDING, and
GCEV_CONNECTED).
If the CRNp number is included during the gc_MakeCall( ) on CRNt and the primary call is in the
connected state, then a GCEV_XFER_CMPLT event is generated on CRNp once the transferred
call is connected. If the CRNp number is not included, there will be no notification to the primary
call and/or party A of the transferred call status. The CRNp number must not be included in the
gc_MakeCall() if primary call was disconnected prior to making transferred call.
When party B receives any provisional response except 100 Trying from Party C and if the REFER
subscription is still alive, party B automatically sends NOTIFY to party A with such transferred
call status.
When party B receives the indication from party C that the call transfer was successful (200 OK),
the party B application is notified of the success via a GCEV_XFER_CMPLT event on CRNp. If
the primary call is still connected, party B will notify party A of the transfer status (200 OK) and
terminate the REFER subscription. Then party B implicitly, without user/application initiation,
disconnects the primary call with party A. Although the primary call to party A is implicitly
dropped, the call itself must still be explicitly dropped via gc_DropCall( ) and released via
gc_ReleaseCallEx( ) to resynchronize the local state machine.
Either the party A or party B application may terminate the primary call after party B accepts the
transfer request. If the primary call is terminated by party A before receiving any call transfer
termination event (GCEV_INVOKE_XFER or GCEV_INVOKE_XFER_FAIL), party B will not
notify party A of the transfer status. If the primary call is terminated by party B before receiving
any transferred call provisional or final response from party C, party B will send NOTIFY to party
A with 200 OK and terminate the REFER subscription before sending BYE to party A.
If the primary call is disconnected before making the transferred call to party C, party B must not
include the primary call CRN (CRNp) when making the transferred call to party C. Otherwise, a
Global Call error will be returned.
Note that the primary call can be disconnected prior to making the transferred call only during an
unattended transfer because the transferred call can be established independently from the primary
call. During an attended transfer, the transferred call cannot be established after the primary call is
disconnected because the primary call database contains the Replaces information that is required
by the transferred call.
If the Referred-By header exists in the REFER message, it is passed to the application via the
GCEV_REQ_XFER event if SIP message information access was enabled (by setting the
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
77
IP Call Scenarios
IP_SIP_MSGINFO_ENABLE in the sip_msginfo_mask field of the IP_VIRTBOARD data
structure) when the virtual board was started.
3.3.2.3
Transfer Target or Transferred-To Endpoint (Party C)
From the perspective of party C, the transferred call is, for the most part, treated as a typical
incoming call. The call is first notified to the application by a GCEV_DETECTED or
GCEV_OFFERED event on CRNt. The GCRV_XFERCALL cause value is provided in the event
to alert the application that this call offering is the result of a transfer, but only if the incoming
INVITE contains Referred-By or Replaces information indicating a new transferred call. ReferredBy and Replaces information, if present, is also attached to GCEV_OFFERED events if SIP header
access was enabled (by setting the IP_SIP_MSGINFO_ENABLE value in the sip_msginfo_mask
field of the IP_VIRTBOARD data structure) when the virtual board was started.
At that point, the application may retrieve the typical calling party information on CRNt. Party C is
then provided the same methods of action as a typical incoming call, namely to alert party B that
the call is proceeding (typically for gateways), ringback notification that the local user is being
alerted, or simply that the call is answered. The only behavior change from this endpoint over
typical non-transferred calls is whether to handle the calling party information any differently
because it is the result of a transfer.
3.3.3
Successful Unattended SIP Call Transfer Scenarios
This section describes various scenarios for successful call transfers under the SIP protocol. The
scenarios include:
• Successful Transfer with Notification of Connection
• Successful Transfer with Notification of Ringing
• Successful Transfer with Early Termination of REFER Subscription
• Successful Transfer with Primary Call Cleared Prior to Transfer Completion
All of the scenarios indicate all three common naming conventions for the three parties involved in
a call transfer: parties (A, B, and C), endpoints (transferring, transferred, and transferred-to), and
SIP roles (Transferor, Transferee, and Transfer Target). “IP CClib” refers to the call control library
and SIP stack portions of Global Call. “Non-Global Call” is used to represent a User Agent that
might behave legally but differently than Global Call. Pre and post conditions are explicitly listed
in each scenario, but the common pre-condition for all scenarios is that the Transferor (party A) and
the Transferee (party B) are participating in an active (primary) call and are in the
GCST_CONNECTED state from the perspective of the Global Call API.
All of the following scenarios illustrate the optional GCEV_INVOKE_XFER_ACCEPTED event,
which is disabled by default. The party A application can enable and disable this event at any time
after the line device is opened using the gc_SetConfigData( ) function.
78
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP Call Scenarios
3.3.3.1
Successful Transfer with Notification of Connection
Figure 25 illustrates the basic successful scenario, with party A receiving notification from party B
after the transferred call between party B and party C has been connected. The SIP dialog for the
primary call between party A and party B is automatically disconnected, and both parties then tear
down the call using gc_DropCall( ) and gc_ReleaseCallEx( ).
Figure 25. Successful SIP Unattended Call Transfer, Party A Notified with Connection
Pre condition: Primary call between A and B is connected (not shown).
A
(Transferring,
Transferor)
App
A
(Transferring,
Transferor)
IP CCLib
gc_InvokeXfer
(CRNp)
B
(Transferred,
Transferee)
App
B
(Transferred,
Transferee)
IP CCLib
C
(Transferred To,
Transfer Target)
App
C
(Transferred To,
Transfer Target)
IP CCLib
REFER
GCEV_REQ_
XFER(CRNp)
gc_AcceptXfer(CRNp)
GCEV_ACCEPT_
XFER(CRNp)
GCEV_
INVOKE_XFER_
ACCEPTED(CRNp)
(optional)
202 Accepted
NOTIFY(100 Trying)
Subscription-State=active; expires=300
200 OK
gc_MakeCall
(CRNt, CRNp)
GCEV_DIALING
(CRNt)
100 Trying from Party C
is not Notified to Party A
GCEV_CALLPROC
(CRNt) (optional)
INVITE
GCEV_OFFERED(CRNt)
IPEC_IncomingTransfer
(optional)
gc_CallAck(CRNt) (optional)
100 Trying (optional)
GCEV_PROCEEDING
(CRNt) (optional)
gc_AnswerCall(CRNt)
GCEV_CONNECTED
(CRNt)
200 OK
ACK
GCEV_XFER_CMPLT
(CRNp)
GCEV_
ANSWERED(CRNt)
NOTIFY(200 OK)
Subscription-State = terminated
GCEV_INVOKE_
XFER(CRNp)
GCEV_
DISCONNECTED
(CRNp)
gc_DropCall(CRNp)
GCEV_
DROPCALL(CRNp)
gc_ReleaseCallEx
(CRNp)
GCEV_
RELEASECALL
(CRNp)
200 OK
BYE
BYE
200 OK
200 OK
KEY:
CRNp - primary call
CRNt - transferred call
GCEV_
DISCONNECTED
(CRNp)
gc_DropCall(CRNp)
GCEV_
DROPCALL(CRNp)
gc_ReleaseCallEx
(CRNp)
GCEV_
RELEASECALL
(CRNp)
Post condition: Transferred call between B and C connected.
Primary call between A and B dropped and released
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
79
IP Call Scenarios
3.3.3.2
Successful Transfer with Notification of Ringing
Figure 26 illustrates a scenario where party B notifies party A that the transfer has completed as
soon as party C responds to the INVITE with a 100 Trying or 180 Ringing. The Call Control
Library at Party A disconnects the primary call with party B after the notification and the
application then must tear down the call using gc_DropCall( ) and gc_ReleaseCallEx( ).
Figure 26. Successful SIP Unattended Call Transfer, Party A Notified with Ringing
Pre condition: Primary call between A and B is connected (not shown).
A
(Transferring,
Transferor)
App
A
(Transferring,
Transferor)
IP CCLib
gc_InvokeXfer
(CRNp)
B
(Transferred,
Transferee)
App
B
(Transferred,
Transferee)
IP CCLib
C
(Transferred To,
Transfer Target)
App
C
(Transferred To,
Transfer Target)
IP CCLib
REFER
GCEV_REQ_
XFER(CRNp)
gc_AcceptXfer(CRNp)
GCEV_ACCEPT_
XFER(CRNp)
GCEV_
INVOKE_XFER_
ACCEPTED(CRNp)
(optional)
202 Accepted
NOTIFY(100 Trying)
Subscription-State=active; expires=300
200 OK
gc_MakeCall
(CRNt, CRNp)
GCEV_DIALING
(CRNt)
GCEV_ALERTING
(CRNt) (optional)
INVITE
GCEV_OFFERED(CRNt)
IPEC_IncomingTransfer
(optional)
gc_CallAck(CRNt) (optional)
100 Trying (optional)
GCEV_PROCEEDING
(CRNt) (optional)
100 Trying from Party C
is not Notified to Party A
GCEV_PROCEEDING
(CRNt) (optional)
GCEV_INVOKE_
XFER(CRNp)
GCEV_XFER_CMPLT
(CRNp)
NOTIFY(180 Ringing)
Subscription-State = active
200 OK
NOTIFY(200 OK)
Subscription-State = terminated
GCEV_
DISCONNECTED
(CRNp)
400 Bad Request
BYE
BYE
200 OK
200 OK
GCEV_
DISCONNECTED
(CRNp)
gc_DropCall(CRNp)
gc_DropCall(CRNp)
GCEV_
DROPCALL(CRNp)
gc_ReleaseCallEx
(CRNp)
GCEV_
DROPCALL(CRNp)
GCEV_
RELEASECALL
(CRNp)
180 Ringing (optional)
KEY:
CRNp - primary call
CRNt - transferred call
gc_ReleaseCallEx
(CRNp)
GCEV_
RELEASECALL
(CRNp)
GCEV_CONNECTED
(CRNt)
gc_AnswerCall(CRNt)
200 OK
ACK
GCEV_
ANSWERED(CRNt)
Post condition: Transferred call between B and C is connected.
Primary call between A and B dropped and released
80
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP Call Scenarios
3.3.3.3
Successful Transfer with Early Termination of REFER Subscription
Figure 27 illustrates a valid scenario for which Global Call does not support the party B role. In this
scenario, party B terminates the REFER subscription with the first NOTIFY, before party A can be
notified of the transferred call status. The Call Control Library at Party A disconnects the primary
call with party B after the terminating NOTIFY and the application then must tear down the call
using gc_DropCall( ) and gc_ReleaseCallEx( ).
Figure 27. Successful SIP Unattended Call Transfer, Party B Terminates REFER Subscription
prior to Notification of Transferred Call Status
Pre condition: Primary call between A and B is connected (not shown).
A
(Transferring,
Transferor)
App
B
(Transferred,
Transferee)
non-Global Call
A
(Transferring,
Transferor)
IP CCLib
gc_InvokeXfer
(CRNp)
GCEV_
INVOKE_XFER_
ACCEPTED(CRNp)
GCEV_INVOKE_
XFER(CRNp)
GCEV_
DISCONNECTED
(CRNp)
C
(Transferred To,
Transfer Target)
App
C
(Transferred To,
Transfer Target)
IP CCLib
REFER
202 Accepted
3rd party UA might terminate the
NOTIFY session with the first NOTIFY
NOTIFY(1xx or 2xx)
Subscription-State = terminated
200 OK
BYE
200 OK
INVITE
GCEV_OFFERED(CRNt)
IPEC_IncomingTransfer
(optional)
gc_DropCall(CRNp)
GCEV_
DROPCALL(CRNp)
gc_CallAck(CRNt)
(optional)
gc_ReleaseCallEx
(CRNp)
100 Trying (optional)
GCEV_
RELEASECALL
(CRNp)
GCEV_PROCEEDING
(CRNt) (optional)
KEY:
CRNp - primary call
CRNt - transferred call
180 Ringing (optional)
gc_AnswerCall
(CRNt)
200 OK
ACK
GCEV_
ANSWERED(CRNt)
Post condition: Transferred call between B and C is connected.
Primary call between A and B dropped and released
3.3.3.4
Successful Transfer with Primary Call Cleared Prior to Transfer
Completion
The SIP protocol supports unattended transfer scenarios where the primary call is cleared or
dropped before the transfer completes. In some other technologies and protocols, these scenarios
are referred to as “unattended blind transfers” as opposed to “attended blind transfers” where the
primary call is maintained until completion. Note that scenarios similar to these are not supported
by the H.450.2 protocol.
Figure 28 illustrates a scenario in which party A drops the primary call with party B as soon as it
receives notification that party B has accepted the transfer request. In this scenario, party A does
not receive any notification that the transfer has completed.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
81
IP Call Scenarios
Figure 28. Successful SIP Unattended Call Transfer, Party A Clears Primary Call prior to
Transfer Completion
Precondition: Primary call between A and B is connected (not shown).
A
(Transferring,
Transferor)
App
A
(Transferring,
Transferor)
IP CCLib
gc_InvokeXfer
(CRNp)
B
(Transferred,
Transferee)
App
B
(Transferred,
Transferee)
IP CCLib
C
(Transferred To,
Transfer Target)
App
C
(Transferred To,
Transfer Target)
IP CCLib
REFER
GCEV_REQ_
XFER(CRNp)
gc_AcceptXfer(CRNp)
GCEV_ACCEPT_
XFER(CRNp)
GCEV_
INVOKE_XFER_
ACCEPTED(CRNp)
202 Accepted
NOTIFY(100 Trying)
Subscription-State=active; expires=300
200 OK
gc_DropCall(CRNp)
GCEV_DROPCALL
(CRNp)
gc_ReleaseCallEx
(CRNp)
GCEV_
RELEASECALL
(CRNp)
Unlike the H450.2 CCLIB
implementation, Party A will not
receive invoke xfer termination
event if Party A drops primary call
early because there is no way
of knowing if invoke transfer
succeeds or fails.
BYE
200 OK
GCEV_XFER_FAIL
(CRNp)
Cause = IPEC_SIPReasonStatusBYE
GCEV_
DISCONNECTED
(CRNp)
gc_DropCall(CRNp)
GCEV_DROPCALL
(CRNp)
gc_ReleaseCallEx
(CRNp)
GCEV_RELEASECALL
(CRNp)
gc_MakeCall(CRNt)
No primary CRN
available
INVITE
GCEV_DIALING
(CRNt)
GCEV_OFFERED
(CRNt)
gc_AnswerCall(CRNt)
GCEV_CONNECTED
(CRNt)
200 OK
ACK
GCEV_ANSWERED
(CRNt)
Post Condition: Primary call is dropped and released.
Transferred call is connected.
Figure 29 illustrates a scenario in which party B drops the primary call with party A after accepting
the transfer request and issuing INVITE to party C, but before receiving any response from party C.
In this scenario, party B does notify party A, but this notification only signifies that party B has
acted on the transfer request and not that the transfer has actually completed.
82
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP Call Scenarios
Figure 29. Successful SIP Unattended Call Transfer, Party B Clears Primary Call prior to
Transfer Completion
Pre condition: Primary call between A and B is connected (not shown).
A
(Transferring,
Transferor)
App
A
(Transferring,
Transferor)
IP CCLib
gc_InvokeXfer
(CRNp)
GCEV_
INVOKE_XFER_
ACCEPTED(CRNp)
B
(Transferred,
Transferee)
App
B
(Transferred,
Transferee)
IP CCLib
C
(Transferred To,
Transfer Target)
App
C
(Transferred To,
Transfer Target)
IP CCLib
REFER
GCEV_REQ_
XFER(CRNp)
gc_AcceptXfer
(CRNp)
GCEV_ACCEPT_
XFER(CRNp)
202 Accepted
NOTIFY(100 Trying)
Subscription-State=active; expires=300
gc_MakeCall
(CRNt, CRNp)
INVITE
GCEV_DIALING
(CRNt)
GCEV_OFFERED
(CRNt)
Before C responds...
gc_DropCall(CRNp)
GCEV_INVOKE_
XFER(CRNp)
NOTIFY(200 OK)
Subscription-State = terminated
BYE
BYE
200 OK
GCEV_
DISCONNECTED
(CRNp)
gc_DropCall(CRNp)
GCEV_DROPCALL
(CRNp)
gc_ReleaseCallEx
(CRNp)
GCEV_
RELEASECALL
(CRNp)
200 OK
GCEV_XFER_
CMPLT(CRNp)
GCEV_DROPCALL
(CRNp)
gc_ReleaseCallEx
(CRNp)
GCEV_RELEASECALL
(CRNp)
GCEV_CONNECTED
(CRNt)
gc_AnswerCall(CRNt)
200 OK
ACK
GCEV_ANSWERED
(CRNt)
Post condition: Primary call is dropped and released.
Transferred call is connected.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
83
IP Call Scenarios
3.3.4
Endpoint Behavior in Attended SIP Transfers
The assumed preconditions for attended SIP call transfer (commonly referred to as “supervised call
transfer” in other technologies and protocols) are:
• The transferring endpoint (party A, or Transferor in SIP terminology) and the transferred
endpoint (party B, or Transferee in SIP terms) are participating in an active call, known as the
primary call. From the perspective of the Global Call API, party A and party B are both in the
GCST_CONNECTED state.
• The Transferor and the transferred-to party (party C or the Transfer Target in SIP terminology)
are participating in an active call, known as the secondary or consultation call. From the
perspective of the Global Call call control library, party A and party C are both in the
GCST_CONNECTED state.
Completion of a successful attended transfer results in the eventual termination of the primary and
secondary calls, and the creation of the transferred call between party B and the party C.
3.3.4.1
Transferor or Transferring Endpoint (Party A)
SIP does not support or require a transfer initiation process to obtain the rerouting number as in
H.323/H.450.2 supervised transfer. To be consistent with the generic Global Call supervised
transfer scenario, the party A application in a SIP attended transfer can call gc_InitXfer( ), but no
request / response messages will be exchanged between party A and party C as a result. Following
this function call, party A always receives a GCEV_INIT_XFER completion event with a dummy
rerouting address. To alert party C of incoming transfer process, party A can only notify party C by
application data or human interaction outside of SIP protocol.
Just as in the case of unattended transfers, an attended transfer is actually initiated when the
Transferor calls the gc_InvokeXfer( ) function. The difference between unattended and attended
transfer usage is the inclusion of the CRN of the secondary (consultation) call as a parameter in the
function call. When the Transferor calls gc_InvokeXfer( ) with two CRN values, a REFER
message with a replace parameter in the Refer-To header is sent to the Transferee (party B).
From this point onward, the behavior at this endpoint is similar to that of a unattended transfer,
except that the application must also drop the secondary/consultation call at transfer completion.
Unlike H.450.2, Global Call will not disconnect the secondary/consultation call once the
transferred call is answered at party C.
Because SIP does not require any pre-invocation setup for attended call transfers, the Transferor
(party A) can actually treat either of the two active calls as the primary call, and can send the
REFER to either of the remote endpoints. This fact provides a recovery mechanism in case one of
the remote endpoints does not support the REFER method, as illustrated in the scenarios in the
following section.
Protecting and Exposing the Transfer Target
The ability to direct the REFER to either of the parties to which the Transferor provides the
opportunity to protect the Transfer Target.
84
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP Call Scenarios
To protect the Transfer Target, the Transferor simply reverses the primary and secondary call CRNs
when calling gc_InvokeXfer( ) to reverse the roles of the two remote parties. The original Transfer
Target will now send INVITE to the original Transferee, so that the Transferee is effectively “called
back” by the Transfer Target. This has the advantage of hiding information about the original
Transfer Target from the original transferee, although the Transferee’s experience in this scenario
will be different that in current systems PBX or Centrex systems.
To expose the Transfer Target and provide an experience similar to current PBX and Centrex
systems, the Transferor uses the secondary call to alert the Transfer Target to the impending
transfer, but then disconnects the secondary call and completes the transfer as an unattended
transfer. In this case, the gc_InvokeXfer( ) call only includes the CRN of the primary call.
3.3.4.2
Transferee or Transferred Endpoint (Party B)
This endpoint behaves in the same manner as in unattended transfer with one exception: the
INVITE that is sent from Party B to Party C for the transferred call contains a Replaces header that
is obtained from the replace parameter in the Refer-To header of the REFER from Party A.
Note that the primary call cannot be disconnected prior to making the transferred call during an
attended transfer because the primary call database contains the Replaces information that is
required to establish the transferred call.
3.3.4.3
Transfer Target or Transferred-To Endpoint (Party C)
This endpoint behaves in much the same manner as in an unattended transfer with one additional
feature and one additional responsibility.
If the Replaces header exists in the incoming INVITE, Global Call automatically matches the
Replaces value with any existing connected call on Party C. If a matching call (the secondary or
consultation call) is found, that call’s CRNs is passed to the application as a
GCPARM_SECONDARYCALL_CRN parameter in the GC_PARM_BLK that is attached to the
GCEV_OFFERED event.
The party C application must also drop the secondary/consultation call when the transfer
completes. Unlike H.450.2 call transfer, Global Call does not automatically disconnect the
secondary call once the transferred call answered at the party C.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
85
IP Call Scenarios
3.3.5
Successful SIP Attended Call Transfer Scenarios
This section describes the basic scenario for successful SIP call transfer and the scenarios for
recovery from two conditions that can block transfer completion. The scenarios include:
• Successful SIP Attended Call Transfer
• Attended Transfer when REFER is Not Globally Supported
• Attended Transfer When Contact URI is Not Globally Routable
The scenarios all illustrate the optional GCEV_INVOKE_XFER_ACCEPTED event, which is
disabled by default. The Transferor application can enable and disable this event at any time after
the line device is opened using the gc_SetConfigData( ) function.
86
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP Call Scenarios
3.3.5.1
Successful SIP Attended Call Transfer
Figure 30 illustrates the basic scenario for successful SIP attended call transfer. The scenario
illustrates the use of a gc_InitXfer( ) function call, which is not required in SIP. The
GCEV_INIT_XFER completion event in this case contains a dummy rerouting address.
Figure 30. Successful SIP Attended Call Transfer
Pre condition: Primary call between A and B is connected (not shown).
Secondary (consultation) call between A and C is connected (not shown).
A
(Transferring,
Transferor)
App
A
(Transferring,
Transferor)
IP CCLib
gc_InitXfer
(CRNs)
GCEV_INIT
XFER_(CRNs)
gc_InvokeXfer
(CRNp, CNRs)
GCEV_
INVOKE_XFER_
ACCEPTED(CRNp)
B
(Transferred,
Transferee)
App
B
(Transferred,
Transferee)
IP CCLib
GCEV_
DISCONNECTED
(CRNp)
gc_DropCall(CRNp)
GCEV_DROPCALL
(CRNp)
gc_ReleaseCallEx
(CRNp)
GCEV_RELEASECALL
(CRNp)
C
(Transferred To,
Transfer Target)
IP CCLib
Dispatch "dummy" event
to synchronize with GC
state machine.
REFER (Refer-To:sip:
TransferredTo?Replaces=secondaryCall)
GCEV_REQ_
XFER(CRNp)
gc_AcceptXfer
(CRNp)
GCEV_ACCEPT_
XFER(CRNp)
202 Accepted
NOTIFY(100 Trying)
Subscription-State=active; expires=300
200 OK
gc_MakeCall
(CRNt, CRNp)
INVITE (Replaces:secondaryCall)
GCEV_OFFERED
(CRNt & xfer flag)
GCEV_DIALING
(CRNt)
GCEV_INVOKE_
XFER_(CRNp)
C
(Transferred To,
Transfer Target)
App
GCEV_CONNECTED
(CRNt)
NOTIFY (200 OK)
Subscription-State = terminated
200 OK
GCEV_XFER_
CMPLT(CRNp)
BYE
200 OK
GCEV_
DISCONNECTED
(CRNp)
gc_DropCall(CRNp)
GCEV_DROPCALL
(CRNp)
gc_ReleaseCallEx
(CRNp)
GCEV_RELEASECALL
(CRNp)
GCEV_
DISCONNECTED
(CRNs)
gc_DropCall(CRNs)
GCEV_DROPCALL
(CRNs)
gc_ReleaseCallEx
(CRNs)
GCEV_RELEASECALL
(CRNs)
gc_AnswerCall(CRNt)
200 OK
GCEV_ANSWERED
(CRNt)
KEY:
CRNp - primary call
CRNs - secondary (consultation) call
CRNt - transferred call
gc_DropCall(CRNs)
BYE
200 OK
GCEV_DISCONNECTED
(CRNs)
GCEV_DROPCALL
(CRNs)
gc_ReleaseCallEx
(CRNs)
GCEV_RELEASECALL
(CRNs)
Post condition: Transferred call between B and C offered (option whether connected or not).
Primary call between A and B dropped and released.
Secondary (consultation) call between A and C dropped and released.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
87
IP Call Scenarios
3.3.5.2
Attended Transfer when REFER is Not Globally Supported
If protecting or exposing the Transfer Target is not a concern, it is possible to complete an attended
transfer when only the Transferor and one other party support REFER. Note that a 405 Method Not
Allowed might be returned instead of the 501 Not Implemented response.
Figure 31. SIP Attended Call Transfer, Recovery from REFER Unsupported
Pre condition: Primary call between A and B is connected (not shown).
Secondary (consultation) call between A and C is connected (not shown).
A
(Transferring,
Transferor)
App
A
(Transferring,
Transferor)
IP CCLib
B
(Transferred,
Transferee)
non-Global Call
C
(Transferred To,
Transfer Target)
App
C
(Transferred To,
Transfer Target)
IP CCLib
gc_InitXfer(CRNs)
GCEV_INIT_
XFER_(CRNs)
gc_InvokeXfer
(CRNp, CNRs)
GCEV_INVOKE_
XFER_REJ(CRNp)
cause = 501
REFER (Refer-To:sip:
TransferredTo?Replaces=secondaryCall)
501 NotImplemented
gc_InitXfer(CRNp)
GCEV_INIT_
XFER_(CRNp)
gc_InvokeXfer
(CRNs, CNRp)
REFER (Refer-To:sip:TransferredTo?Replaces=primaryCall
GCEV_REQ_XFER
(CRNs)
gc_AcceptXferCRNs)
GCEV_ACCEPT_
XFER(CRNs)
GCEV_INVOKE_
ACCEPTED(CRNs)
(optional)
202 Accepted
Normal attended transfer
transactions not shown.
Post condition: Transferred call between B and C offered (option whether connected or not).
Primary call between A and B dropped and released.
Secondary (consultation) call between A and C dropped and released.
3.3.5.3
Attended Transfer When Contact URI is Not Globally Routable
It is a requirement of RFC3261 that a Contact URI be globally routable even outside the dialog.
However, due to RFC2543 User Agents and some architectures (NAT/firewall traversal, screening
proxies, ALGs, etc.), this will not always be the case. As a result, the methods of attended transfer
shown in Figure 30 and Figure 31 may fail since they use the Contact URI in the Refer-To header
field. Figure 32 shows such a scenario involving a Screening Proxy in which the transfer initially
fails but succeeds on a second try. The failure response (403 Forbidden, 404 Not Found, or a
timeout after no response) is communicated back to the Transferor. Since this may be caused by
routing problems with the Contact URI, the Transferor retries the REFER, this time with Refer-To
containing the Address of Record (AOR) of the Target (the same URI the Transferor used to reach
the Transfer Target). However, the use of the AOR URI may result in routing features being
88
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP Call Scenarios
activated such as forking or sequential searching which may result in the triggered INVITE
reaching the wrong User Agent. To prevent an incorrect UA answering the INVITE, a Require:
replaces header field is included in the Refer-To. This ensures that only the UA which matches the
Replaces dialog will answer the INVITE, since any incorrect UA which supports Replaces will
reply with a 481 and a UA which does not support Replaces will reply with a 420.
Note that there is still no guarantee that the correct endpoint will be reached, and the result of this
second REFER may also be a failure. In that case, the Transferor could fall back to unattended
transfer or give up on the transfer entirely. Since two REFERs are sent within the dialog, creating
two distinct subscriptions, the Transferee uses the ‘id’ parameter in the Event header field to
distinguish notifications for the two subscriptions.
Figure 32. SIP Attended Call Transfer, Recovery from URI Not Routable
Pre condition: Primary call between A and B is connected (not shown).
Secondary (consultation) call between A and C is connected (not shown).
A
(Transferring,
Transferor)
App
A
(Transferring,
Transferor)
IP CCLib
gc_InvokeXfer
(CRNp, CRNs,
TransferredToContact)
GCEV_INVOKE_
XFER_ACCEPTED
(CRNP)
B
(Transferred,
Transferee)
3rd Party
C
(Transferred To,
Transfer Target)
3rd Party
Screening Proxy
REFER (Refer-To:sip:
TransferredToContact?Replaces=secondaryCall)
202 Accepted
INVITE
403 Forbidden
GCEV_INVOKE_
XFER_FAIL
(CRNp, 403)
gc_InvokeXfer
(CRNp, CRNs,
TransferredToAOR)
GCEV_INVOKE_
XFER_ACCEPTED
(CRNP)
GCEV_INVOKE_
XFER(CRNp)
NOTIFY (403 Forbidden)
Subscription-State = terminated
200 OK
REFER (Refer-To:sip:
TransferredToAOR?Replaces=secondaryCall)
202 Accepted
INVITE
INVITE
200 OK
NOTIFY (200 OK)
Subscription-State = terminated
200 OK
200 OK
Normal primary and secondary
call cleanup not shown.
Post condition: Transferred call between B and C is connected.
Primary and secondary calls are dropped and released.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
89
IP Call Scenarios
3.3.6
Unsuccessful Call Transfer Scenarios
All of the scenarios in this section apply to both unattended (blind) transfer and attended
(supervised) SIP call transfers. The gc_InitXfer( ) function call and the corresponding
GCEV_INIT_XFER termination event are “dummy” operations that are only used to synchronize
the Global Call state machine and can safely be ignored in this context.
Transfer failures can be caused by any of transfer endpoints as shown in the scenarios. In all cases,
the transferring endpoint (Transferor or party A) is notified by a GCEV_INVOKE_XFER_REJ
event or a GCEV_INVOKE_XFER_FAIL event. No NOTIFY will be sent from party B to party A
if REFER is not accepted by a 202 Accepted response from party B. The primary call and
secondary call, if any, remain in the connected state after any transfer failure.
The most common transfer failure scenarios are described in the following topics:
• Party B Rejects Call Transfer
• No Response From Party B
• No Initial NOTIFY after REFER Accepted
• REFER Subscription Expires
• No Response From Party C
• Party B Drops Transferred Call Early
• Party C is Busy When Transfer Attempted
3.3.6.1
Party B Rejects Call Transfer
Figure 33, illustrates a scenario in which the application at the transferred endpoint (Transferee or
party B) calls gc_RejectXfer( ) to signal the Transferor (party A) that it cannot participate in a
transfer. The application may specify any valid SIP rejection reason, such as the 480 Temporarily
Unavailable shown in the figure; if no reason is specified, the default reason sent is 603 Decline. As
a result of the rejection, the GCEV_INVOKE_XFER_REJ termination event is received at the
Transferor application (party A). The original primary call is left connected and in the
GCST_CONNECTED state from the perspective of both party A and party B.
90
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP Call Scenarios
Figure 33. SIP Call Transfer Failure - Party B Rejects Call Transfer
Pre condition: Primary call between A and B is connected (not shown).
A
(Transferring,
Transferor)
App
A
(Transferring,
Transferor)
IP CCLib
B
(Transferred,
Transferee)
App
gc_InvokeXfer
(CRNp)
B
(Transferred,
Transferee)
IP CCLib
C
(Transferred To,
Transfer Target)
App
C
(Transferred To,
Transfer Target)
IP CCLib
REFER
GCEV_REQ_
XFER(CRNp)
gc_RejectXfer(CRNp,
IPEC_SIPReason
Status480Temporarily
Unavailable)
Default reject reason is
603 decline if not
specified by application
480 Temporarily Unavailable
GCEV_INVOKE_XFER_
REJ(CRNp)
GCEV_REJ_
XFER(CRNp)
Cause = IPEC_SIPReasonStatus480TemporarilyUnavailable
Post condition: Parties A and B remain connected.
3.3.6.2
No Response From Party B
Figure 34 illustrates a scenario in which the Transferee (party B) does not respond to the REFER,
causing the T3 timer at the party A (configured as 20 seconds) to expire. After the timeout, the
Transferor application receives the GCEV_INVOKE_XFER_FAIL termination event. The original
primary call is left connected and in the GCST_CONNECTED state from the perspective of both
party A and party B.
Figure 34. SIP Call Transfer Failure - No Response from Party B
Pre condition: Primary call between A and B is connected (not shown).
A
(Transferring,
Transferor)
App
A
(Transferring,
Transferor)
IP CCLib
B
(Transferred,
Transferee)
App
gc_InvokeXfer
(CRNp)
B
(Transferred,
Transferee)
IP CCLib
C
(Transferred To,
Transfer Target)
App
C
(Transferred To,
Transfer Target)
IP CCLib
REFER
Timeout/
network error
Cause = IPEC_InternalReasonNoResponse
GCEV_REQ_
XFER(CRNp)
(No response from
B application)
GCEV_INVOKE_
XFER_FAIL(CRNp)
Post condition: Parties A and B remain connected.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
91
IP Call Scenarios
3.3.6.3
No Initial NOTIFY after REFER Accepted
Figure 35 illustrates a scenario in which the Transferee (party B) does not send a NOTIFY after it
accepts the REFER, causing the timer at party A to expire. The original primary call is left
connected and in the GCST_CONNECTED state from the perspective of both party A and party B.
Figure 35. SIP Call Transfer Failure - No Initial NOTIFY After REFER is Accepted
Pre condition: Primary call between A and B is connected (not shown).
A
(Transferring,
Transferor)
App
A
(Transferring,
Transferor)
IP CCLib
B
(Transferred,
Transferee)
non-Global Call
gc_InvokeXfer
(CRNp, CNRs)
C
(Transferred To,
Transfer Target)
App
C
(Transferred To,
Transfer Target)
IP CCLib
REFER
202 Accepted
GCEV_INVOKE_
XFER_ACCEPTED
(CRNp)
No initial NOTIFY
before timeout.
Cause = IPEC_NO_NOTIFY_TIME_OUT
GCEV_INVOKE_
XFER_FAIL(CRNp)
Post condition: Parties A and B remain connected.
92
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP Call Scenarios
3.3.6.4
REFER Subscription Expires
Figure 36 illustrates a scenario in which the REFER subscription expires, causing both party A and
party B to time out. After the timeout, the Transferee application receives a GCEV_XFER_FAIL
termination event and the Transferor application receives a GCEV_INVOKE_XFER_FAIL
termination event. The original primary call is left connected and in the GCST_CONNECTED
state from the perspective of both party A and party B.
Figure 36. SIP Call Transfer Failure - REFER Subscription Expires
Pre condition: Primary call between A and B is connected (not shown).
A
(Transferring,
Transferor)
App
A
(Transferring,
Transferor)
IP CCLib
gc_InvokeXfer
(CRNp)
B
(Transferred,
Transferee)
App
B
(Transferred,
Transferee)
IP CCLib
C
(Transferred To,
Transfer Target)
App
C
(Transferred To,
Transfer Target)
IP CCLib
REFER
GCEV_REQ_
XFER(CRNp)
gc_AcceptXfer
(CRNp)
GCEV_ACCEPT_
XFER(CRNp)
GCEV_
INVOKE_XFER_
ACCEPTED(CRNp)
202 Accepted
NOTIFY(100 Trying)
Subscription-State=active; expires=300
200 OK
Subscription
expires
GCEV_
INVOKE_XFER_
FAIL(CRNp)
Cause = IPEC_SUBS_EXPIRED
Subscription
expires
GCEV_XFER_
FAIL(CRNp)
Cause = IPEC_SUBS_EXPIRED
Post condition: Parties A and B remain connected.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
93
IP Call Scenarios
3.3.6.5
No Response From Party C
Figure 37 illustrates a scenario in which the Transfer Target (party C) does not respond to the
incoming call from the Transferee (party B) which causes the T4 timer at party B (configured as 20
seconds) to expire. As a result, the Transferee application (party B) receives the
GCEV_DISCONNECTED event for the transferred call timeout. The original primary call is left
connected and in the GCST_CONNECTED state from the perspective of both A and B.
Figure 37. SIP Call Transfer Failure - No Response from Party C
Pre condition: Primary call between A and B is connected (not shown).
A
(Transferring,
Transferor)
App
A
(Transferring,
Transferor)
IP CCLib
gc_InvokeXfer
(CRNp)
B
(Transferred,
Transferee)
App
B
(Transferred,
Transferee)
IP CCLib
C
(Transferred To,
Transfer Target)
App
C
(Transferred To,
Transfer Target)
IP CCLib
REFER
GCEV_REQ_
XFER(CRNp)
gc_AcceptXfer
(CRNp)
GCEV_ACCEPT_
XFER(CRNp)
GCEV_
INVOKE_XFER_
ACCEPTED(CRNp)
202 Accepted
NOTIFY(100 Trying)
Subscription-State=active; expires=300
200 OK
gc_MakeCall
(CRNt, CRNp)
GCEV_DIALING
(CRNt)
GCEV_
DISCONNECTED
(CRNt)
GCEV_
INVOKE_XFER_
FAIL(CRNp)
INVITE
Network timeout
GCEV_OFFERED
(CRNt)
No response from C
NOTIFY (408 Request Timeout)
Subscription-State = terminated
200 OK
Cause = IPEC_SIPReasonStatus408 Request Timeout
Cause = IPEC_SIPReasonStatus408 Request Timeout
GCEV_XFER_FAIL
(CRNp)
gc_DropCall(CRNt)
gc_DropCall(CRNt)
GCEV_DROPCALL
(CRNt)
GCEV_DROPCALL
(CRNt)
gc_ReleaseCallEx
(CRNt)
gc_ReleaseCallEx
(CRNt)
GCEV_RELEASECALL
(CRNt)
GCEV_RELEASECALL
(CRNt)
Post condition: Parties A and B remain connected.
94
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP Call Scenarios
3.3.6.6
Party B Drops Transferred Call Early
Figure 38 illustrates a scenario in which the Transferee (party B) drops the transferred call before
receiving a response to the INVITE it sent to party C. As a result, the
GCEV_INVOKE_XFER_FAIL termination event is received at the Transferor (party A) and the
GCEV_XFER_FAIL termination event is received a the Transferee (party B). The original primary
call is left connected and in the GCST_CONNECTED state from the perspective of both A and B.
Figure 38. SIP Call Transfer Failure - Party B Drops Transferred Call Early
Pre condition: Primary call between A and B is connected (not shown).
A
(Transferring,
Transferor)
App
A
(Transferring,
Transferor)
IP CCLib
gc_InvokeXfer
(CRNp)
B
(Transferred,
Transferee)
App
B
(Transferred,
Transferee)
IP CCLib
C
(Transferred To,
Transfer Target)
App
C
(Transferred To,
Transfer Target)
IP CCLib
REFER
GCEV_REQ_
XFER(CRNp)
gc_AcceptXfer
(CRNp)
GCEV_ACCEPT_
XFER(CRNp)
GCEV_
INVOKE_XFER_
ACCEPTED(CRNp)
202 Accepted
NOTIFY(100 Trying)
Subscription-State=active; expires=300
200 OK
gc_MakeCall
(CRNt, CRNp)
INVITE
GCEV_OFFERED
(CRNt)
...before C answers...
gc_DropCall(CRNt)
GCEV_
DISCONNECTED
(CRNt)
CANCEL
200 OK (CANCEL)
487 Request Terminated (INVITE)
GCEV_
INVOKE_XFER_
FAIL(CRNp)
NOTIFY (487 Request Terminated)
Subscription-State = terminated
200 OK
Cause = IPEC_SIPReasonStatus487RequestTerminated
GCEV_XFER_FAIL
(CRNp)
ACK (INVITE)
Cause = IPEC_SIPReasonStatus487RequestTerminated
GCEV_DISCONNECTED
(CRNt)
gc_DropCall(CRNt)
gc_DropCall(CRNt)
GCEV_DROPCALL
(CRNt)
GCEV_DROPCALL
(CRNt)
gc_ReleaseCallEx
(CRNt)
gc_ReleaseCallEx
(CRNt)
GCEV_RELEASECALL
(CRNt)
GCEV_RELEASECALL
(CRNt)
Post condition: Parties A and B remain connected.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
95
IP Call Scenarios
3.3.6.7
Party C is Busy When Transfer Attempted
Figure 39 illustrates a scenario in which the Transfer Target (party C) is busy at the time the
transfer is requested. (This primarily applies to unattended transfers, since the Transferor would be
aware that the Transfer Target is busy in an attended transfer.) In this case, the Transferor (party A)
receives a GCEV_INVOKE_XFER_FAIL termination event and the Transferee (party B) receives
a GCEV_XFER_FAIL termination event. The original primary call is left connected and in the
GCST_CONNECTED state from the perspective of both party A and party B.
Figure 39. SIP Call Transfer Failure - Party C is Busy When Transfer Attempted
Pre condition: Primary call between parties A and B is connected (not shown).
Party C has call connected to another party (not shown).
A
(Transferring)
App
A
(Transferring)
IP CCLib
B
(Transferred)
App
gc_InvokeXfer
(CRNp)
B
(Transferred)
IP CCLib
C
(Transferred To)
App
C
(Transferred To)
IP CCLib
REFER
GCEV_REQ_
XFER(CRNp)
gc_AcceptXfer
(CRNp)
GCEV_ACCEPT_
XFER(CRNp)
GCEV_
INVOKE_XFER_
ACCEPTED(CRNp)
202 Accepted
NOTIFY(100 Trying)
Subscription-State=active; expires=300
200 OK
gc_MakeCall
(CRNt, CRNp)
GCEV_DIALING
(CRNt)
INVITE
Party C is busy (not shown)
486 BusyHere
GCEV_
INVOKE_XFER_
FAIL(CRNp, busy)
NOTIFY (486 Busy Here)
Subscription-State = terminated
200 OK
Cause = IPEC_SIPReasonStatus486BusyHere
ACK
Cause = IPEC_SIPReasonStatus486BusyHere
GCEV_XFER_FAIL
(CRNp)
gc_DropCall(CRNt)
GCEV_DROPCALL
(CRNt)
gc_ReleaseCallEx
(CRNt)
GCEV_RELEASECALL
(CRNt)
Post condition: Parties A and B remain connected.
Party C also remains connected (to another party not shown).
96
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP Call Scenarios
3.4
T.38 Fax Server Call Scenarios
Dialogic® Global Call API supports T.38 fax server as described in Section 4.26, “T.38 Fax
Server”, on page 320. The following scenarios demonstrate the T.38 fax server capabilities
provided when using IP technology (both H.323 and SIP):
• Sending T.38 Fax in an Established Audio Session
• Receiving T.38 Fax in an Established Audio Session
• Sending T.38 Fax Without an Established Audio Session
• Receiving T.38 Fax Without an Established Audio Session
• Sending a Request to Switch From T.38 Fax to Audio
• Receiving a Request to Switch From T.38 Fax to Audio
• Terminating a Call After a T.38 Fax Session
• Recovering from a Session Switching Failure
Note:
In these scenarios, the application must include T.38 Fax capability either when using
gc_MakeCall( ) for an outbound call or when using gc_CallAck( ), gc_AcceptCall( ), or
gc_AnswerCall( ) for an inbound call.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
97
IP Call Scenarios
3.4.1
Sending T.38 Fax in an Established Audio Session
In this scenario, the user application uses the Dialogic® Global Call API to open a Media device,
configures “Manual” mode of operation and establishes an audio session with the remote device.
See Section 4.26.2, “Specifying Manual Operating Mode”, on page 322 for more information on
manual mode. A T.38 Fax device is then opened and the application switches from an audio session
to a T.38 session.
When the application receives notification that the T.38 session is ready, fax information can be
sent. Figure 40 shows the scenario diagram.
Note:
The application must not use both Dialogic® Global Call API and Dialogic® IP Media Library API
functions on the same device. The Dialogic® IP Media Library API calls (ipm_) in Figure 40 are
shown for informational purposes only. Global Call interacts with the IP Media Library on behalf
of the application.
Figure 40. Sending T.38 Fax in an Established Audio Session
App
GC/cclib
IPML
Remote Device Capable of
Signaling, Audio and T.38
FAX
gc_SetConfigData(IP_MANUAL_MODE)
gc_OpenEx(:N_iptB1T1:M_ipmB1C1)
gc_MakeCall()
SETUP with TCS/INVITE to send Origination IP
address and RTP Port number
Call Connected
GCEV_CONNECTED
Audio Data
fx_open(dxxxB23C1)
gc_UnListen()
gc_SetUserInfo(IPSET_FOIP,IPPARM_T38_CONNECT)
gc_Extension(IPSET_SWITCH_CODEC,IPPARM_T38_INITIATE)
Ipm_Stop()
Stop the RTP streaming.
dev_Connect(ipmB1C1, dxxxB23C1)
Ipm_GetLocalMedia()
REINVITE/RequestMode to switch to T.38 Fax. Send local
UDP port and IP Address
GCEV_EXTENSIONCMPLT
200OK/RequestMode Ack
Ipm_StartMedia()
Send UDP port number and IP address to
the firmware
GCEV_EXTENSION (IPSET_SWITCH_CODEC,IPPARM_READY)
Fx_sndfax()
IPVSC/IPML forwards
ipm_StartMedia() to T.38
device based on the
information fro
dev_Connect()
T.38 Data via RTP
98
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP Call Scenarios
3.4.2
Receiving T.38 Fax in an Established Audio Session
In this scenario, the user application uses the Dialogic® Global Call API to open a Media device,
configures “Manual” operating mode and establishes an audio session with the remote device. See
Section 4.26.2, “Specifying Manual Operating Mode”, on page 322 for more information on
manual mode. To prepare to receive fax, the application must also open a T.30 Fax device. During
the audio session, the application can be notified of an incoming request to switch from audio to
T.38 fax.
The application can choose to accept or reject this request. If the user chooses to accept, Dialogic®
Global Call API notifies the application that the T.38 session is ready to receive a fax. Figure 41
shows the scenario diagram.
Note:
The application must not use both Dialogic® Global Call API and Dialogic® IP Media Library API
functions on the same device. The Dialogic® IP Media Library API calls (ipm_) in Figure 41 are
shown for informational purposes only. Global Call interacts with the IP Media Library on behalf
of the application.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
99
IP Call Scenarios
Figure 41. Receiving T.38 Fax in an Established Audio Session
App
GC/cclib
IPML
Remote Device Capable of
Signaling, Audio and T.38
FAX
Fx_open(dxxxB23C1)
gc_SetConfigData(IP_MANUAL_MODE)
gc_OpenEx(:N_iptB1T1:M_ipmB1C1)
SETUPw/TCS/INVITE to send Origination IP
address and RTP Port number
gc_MakeCall()
Call Connected
GCEV_CONNECTED
RTP DATA
REINVITE/RequestMode to switch to T.38 Fax. Send local
UDP port and IP Address
GCEV_EXTENSION(IPSET_SWITCH_CODEC,IPPARM_T38_REQUESTED)
gc_Unlisten()
gc_SetUserInfo(IPSET_FOIP,IPPARM_T38_CONNECT)
gc_Extension(IPSET_SWITCH_CODEC,IPPARM_ACCEPT)*
*Note: Alternatively, application can reject by calling
gc_Extension(IPSET_SWITCH_CODEC, IPPARM_REJECT) with
reason. Appropriate H323/SIP message will be sent to remote
side. remote GC application receives a GCEV_TASKFAIL
event with the reason
Ipm_Stop()
Stop the RTP streaming.
dev_Connect(ipmB1C1, dxxxB23C1)
Ipm_GetLocalMedia()
Ipm_StartMedia()
Send UDP port number and IP address to
the firmware
GCEV_EXTENSIONCMPLT
200OK/RequestMode Ack
GCEV_EXTENSION (IPSET_SWITCH_CODEC,IPPARM_READY)
Fx_recvfax()
IPVSC/IPML forwards
ipm_StartMedia() to T.38
device based on the
information from
dev_Connect()
T.38 Data via RTP
100
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP Call Scenarios
3.4.3
Sending T.38 Fax Without an Established Audio Session
This scenario describes the sending of T.38 Fax in a media session that does not have audio already
established. The application first opens a Media device and a T.38 Fax device and configures
“Manual” mode of operation. See Section 4.26.2, “Specifying Manual Operating Mode”, on
page 322 for more information on manual mode. The Dialogic® Global Call API is then used to
associate the T.38 Fax device with the IP Media device before making a new T.38 call.
Once the call is connected, the application can send a fax. Figure 42 shows the scenario diagram.
Note:
The application must not use both Dialogic® Global Call API and Dialogic® IP Media Library API
functions on the same device. The Dialogic® IP Media Library API calls (ipm_) in Figure 42 are
shown for informational purposes only. Global Call interacts with the IP Media Library on behalf
of the application.
Figure 42. Sending T.38 Fax Without an Established Audio Session
App
GC/cclib
IPML
Remote Device Capable of
Signaling and T.38
FAX
fx_open(dxxxB23C1)
gc_SetConfigData(IP_MANUAL_MODE)
gc_OpenEx(:N_iptB1T1:M_ipmB1C1)
gc_SetUserInfo(T38 capability only)
gc_SetUserInfo(IPSET_FOIP,IPPARM_T38_CONNECT)
gc_MakeCall()
dev_Connect(ipmB1C1, dxxxB23C1)
Ipm_GetLocalMedia(T.38)
SETUP with TCS/INVITE to send Origination IP
address and UDP Port number
Call Connected
Ipm_StartMedia(T.38)
GCEV_CONNECTED
Fx_sndfax()
T.38 Data via RTP
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
101
IP Call Scenarios
3.4.4
Receiving T.38 Fax Without an Established Audio Session
This scenario describes the reception of T.38 Fax in a media session that does not have audio
already established. The application first opens a Media device and a T.38 Fax device and
configures “Manual” operating mode. See Section 4.26.2, “Specifying Manual Operating Mode”,
on page 322 for more information on manual mode. When the application receives a T.38 fax
request, a GCEV_OFFERED event with T.38 extension information is received.
If the application accepts the call, the T.38 Fax device is associated with the Media device before
the T.38 call is answered. Figure 43 shows the scenario diagram.
Notes: 1. The GCEV_OFFERED event with T.38 extension information is only generated if the following
requirements are met. For H.323, the incoming message must be a Q.931 Setup message with
data terminal capability only. For SIP, the incoming message must be an INVITE message with
an SDP that has an image media descriptor only. If this condition is not met, the
GCEV_OFFERED event does not include any T.38 extension information. This limitation
prevents the T.38 server from receiving the T.38 request in H.323 slow start or in a SIP no SDP
INVITE request.
2. The application must not use both Dialogic® Global Call API and Dialogic® IP Media Library
API functions on the same device. The Dialogic® IP Media Library API calls (ipm_) in
Figure 43 are shown for informational purposes only. Global Call interacts with the IP Media
Library on behalf of the application.
Figure 43. Receiving T.38 Fax Without an Established Audio Session
App
GC/cclib
IPML
Remote Device Capable of
Signaling and T.38
FAX
fx_open(dxxxB23C1)
gc_SetConfigData(IP_MANUAL_MODE)
gc_OpenEx(:N_iptB1T1:M_ipmB1C1)
Receive SETUPw/TCS/INVITE with FAX IP
address and RTP Port number
GCEV_OFFERED (IPSET_FOIP,IPPARM_T38_OFFERED)
gc_SetUserInfo(IPSET_FOIP, IPPARM_T38_CONNECT)
gc_AnswerCall()
dev_Connect(ipmB1C1, dxxxB23C1)
Ipm_GetLocalMedia(T.38)
Ipm_StartMedia(T.38)
Call Connected
GCEV_ANSWERED
Fx_recvfax()
T.38 Data via RTP
102
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP Call Scenarios
3.4.5
Sending a Request to Switch From T.38 Fax to Audio
In a fax session, when a fax completes, the application can use the Dialogic® Global Call API to
issue a request to switch from a T.38 fax session back to an audio session after disassociating the
T.38 Fax device from the Media device. When Dialogic® Global Call API notifies the application
that the audio session has been reestablished, the application can once again send and receive
audio. Figure 44 shows the scenario diagram.
Note:
The application must not use both Dialogic® Global Call API and Dialogic® IP Media Library API
functions on the same device. The Dialogic® IP Media Library API calls (ipm_) in Figure 44 are
shown for informational purposes only. Global Call interacts with the IP Media Library on behalf
of the application.
Figure 44. Sending a Request to Switch From T.38 Fax to Audio
App
GC/cclib
IPML
Remote Device Capable of
Signaling, Audio and T.38
FAX
fx_open(dxxxB23C1)
gc_SetConfigData(IP_MANUAL_MODE)
gc_OpenEx(:N_iptB1T1:M_ipmB1C1)
gc_MakeCall()
GCEV_CONNECTED
Audio Data
gc_SetUserInfo(IPSET_FOIP,IPPARM_T38_CONNECT)
gc_Extension(IPSET_SWITCH_CODEC,IPPARM_T38_INITIATE), GCEV_EXTENSIONCMPLT
GCEV_EXTENSION(IPSET_SWITCH_CODEC,IPPARM_READY)
Fx_sndfax()
T.38 Data via RTP
Fx_Stopch()
gc_SetUserInfo(IPSET_FOIP,IPPARM_T38_DISCONNECT)
gc_Extension(IPSET_SWITCH_CODEC, IPPARM_AUDIO_INITIATE)
Ipm_Stop()
dev_Disconnect(ipmB1C1, dxxxB23C1)
Ipm_GetLocalMedia()
REINVITE/RequestMode to switch to audio. Send
audio IP address and RTP Port number
GCEV_EXTENSIONCMPLT
200OK/RequestMode Ack
Ipm_StartMedia()
GCEV_EXTENSION(IPSET_SWITCH_CODEC,IPPARM_READY)
gc_Listen()
Audio Data
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
103
IP Call Scenarios
3.4.6
Receiving a Request to Switch From T.38 Fax to Audio
In a fax session, when a fax completes, the application can receive a request to switch from a T.38
fax session back to an audio session. The application can choose to accept the request after
disassociating the T.38 Fax device from the Media device. When Dialogic® Global Call API
notifies the application that the audio session has been reestablished, the application can once again
send and receive audio. Figure 45 shows the scenario diagram.
Note:
The application must not use both Dialogic® Global Call API and Dialogic® IP Media Library API
functions on the same device. The Dialogic® IP Media Library API calls (ipm_) in Figure 45 are
shown for informational purposes only. Global Call interacts with the IP Media Library on behalf
of the application.
Figure 45. Receiving a Request to Switch From T.38 Fax to Audio
App
GC/cclib
IPML
Remote Device Capable of
Signaling, Audio and T.38
FAX
Fx_open(dxxxB23C1)
gc_SetConfigData(IP_MANUAL_MODE)
gc_OpenEx(:N_iptB1T1:M_ipmB1C1)
gc_MakeCall()
GCEV_CONNECTED
Audio Data
GCEV_EXTENSION(IPSET_SWITCH_CODEC,IPPARM_T38_REQUESTED)
gc_SetUserInfo(IPSET_FOIP,IPPARM_T38_CONNECT)
GCEV_EXTENSION(IPSET_SWITCH_CODEC,IPPARM_READY)
Fx_Recvfax()
T.38 Data via RTP
REINVITE/RequestMode to switch to audio.
Receive IP address and RTP Port number
GCEV_EXTENSION(IPSET_SWITCH_CODEC,IPPARM_AUDIO_REQUESTED)
Fx_Stopch()
gc_SetUserInfo(IPSET_FOIP,IPPARM_T38_DISCONNECT)
gc_Extension(IPSET_SWITCH_CODEC,IPPARM_ACCEPT)*
Ipm_Stop()
*Note: Alternatively, application can reject by calling
gc_Extension(IPSET_SWITCH_CODEC, IPPARM_REJECT)
with reason. Appropriate H323/SIP message will be
sent to remote side. Remote GC application receives a
GCEV_TASKFAIL event with the reason
dev_Disconnect(ipmB1C1, dxxxB23C1)
Ipm_GetLocalMedia()
Ipm_StartMedia()
GCEV_EXTENSIONCMPLT
200OK/RequestMOde Ack
GCEV_EXTENSION(IPSET_SWITCH_CODEC,IPPARM_READY)
gc_Listen()
Audio Data
104
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP Call Scenarios
3.4.7
Terminating a Call After a T.38 Fax Session
In any scenario where a T.38 session is established and fax is complete, the application can
terminate the call without switching to audio. In either outbound or inbound call termination, the
application must disassociate the T.38 Fax device from the Media device before calling
gc_DropCall( ). This ensures the Media device in the correct state for the next call.
Terminating a call after an audio session follows the normal Global Call call procedures.
Note:
The application must not use both Dialogic® Global Call API and Dialogic® IP Media Library API
functions on the same device. The Dialogic® IP Media Library API calls (ipm_) in Figure 46 are
shown for informational purposes only. Global Call interacts with the IP Media Library on behalf
of the application.
Figure 46. Terminating a Call After a T.38 Fax Transfer.
App
GC/cclib
IPML
Remote Device Capable of
Signaling, Audio and T.38
FAX
T.38 Data via RTP
Fx_stopch()
BYE/Release Complete
GCEV_DISCONNECTED
gc_SetUserInfo(IPSET_FOIP,IPPARM_T38_DISCONNECT)
gc_DropCall()
Ipm_Stop()
dev_Disconnect(ipmB1C1)
GCEV_DROPCALL
gc_ReleaseCall()
GCEV_RELEASECALL
3.4.8
Recovering from a Session Switching Failure
Switching to T.38 Fax or audio may fail due to any a number of reasons, for example, rejection or
no response from remote endpoint. It is highly recommended that the application set up a timer for
a minimum of 35 seconds for each switching request. If a timeout occurs while waiting for a
GCEV_EXTENSION event that has an associated IPPARM_READY parameter, the application
has two options:
• Attempt to switch back to original session as if the GCEV_EXTENSION event were received
without media capability.
• Terminate the call as if GCEV_EXTENSION event were received without media capability.
If the application times out when switching to T.38 Fax (that is, it does not receive a
GCEV_EXTENSION event with an IPPARM_READY parameter within the timeout period), it
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
105
IP Call Scenarios
should follow the scenarios described in Section 3.4.5, “Sending a Request to Switch From T.38
Fax to Audio”, on page 103, Section 3.4.6, “Receiving a Request to Switch From T.38 Fax to
Audio”, on page 104, or Section 3.4.7, “Terminating a Call After a T.38 Fax Session”, on page 105.
Note:
The application must call the gc_SetUserInfo( ) function with a GC_PARM_BLK that contains a
set ID of IPSET_FOIP and a parameter ID of IPPARM_T38_DISCONNECT to disassociate the
devices in any of the scenarios.
If the application times out when switching to audio (that is, it does not receive a
GCEV_EXTENSION event with an IPPARM_READY parameter within the timeout period), it
should follow the scenarios described in Section 3.4.1, “Sending T.38 Fax in an Established Audio
Session”, on page 98, Section 3.4.2, “Receiving T.38 Fax in an Established Audio Session”, on
page 99, or drop the call as if in audio session.
106
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
Third Party Call Control (3PCC)
Operations and Multimedia
Support
5.
5
This chapter provides an overview of the libraries and protocols used for third party call control
(3PCC) and describes how to use the Dialogic® Global Call API to perform certain third party call
control operations in a SIP environment. Topics include:
• Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337
• Global Call in Third Party Call Control Mode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 343
• Session Description Protocol Parser/Generator Example . . . . . . . . . . . . . . . . . . . . . . . 353
• Message Sequence Diagrams . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 353
• Processing Intraframe Requests for Video Streams. . . . . . . . . . . . . . . . . . . . . . . . . . . . 371
5.1
Overview
This section provides an overview of third party call control, along with brief descriptions of the
libraries and protocols required to support third party call control. The following topics are
presented in this section:
• Third Party Call Control
• Global Call Library and IP Media Library for Third Party Call Control
• Session Description Protocol
5.1.1
Third Party Call Control
Third party call control enables one entity (for example, a third party call controller) to create,
modify, or terminate a media session between two or more endpoints. Call control signaling and
media exchange are separated and independently managed.
The key attributes of third party call control are:
• A distinct third party call controller initiates the session.
• The third party call controller initiates communications via a SIP signaling interface to each of
the endpoints involved in the session.
• The endpoints do not need to directly establish signaling interfaces between one another;
instead, they have a signaling relationship with the third party call controller.
• The third party call controller does not serve as an endpoint for the media stream; the media
stream flows between the two endpoints.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
337
Third Party Call Control (3PCC) Operations and Multimedia Support
The Internet Engineering Task Force (IETF) has defined RFC 3725 - Best Current Practices for
Third Party Call Control (3pcc) in the Session Initiation Protocol (SIP). RFC 3725 is available at
http://ietf.org/rfc/rfc3725.txt.
Section 5.1.2, “Global Call Library and IP Media Library for Third Party Call Control”, on
page 341 describes how to configure the Dialogic® Global Call API library in third party call
control (3PCC) mode or first party call control (1PCC) mode. Global Call behavior in 3PCC mode
is similar to the behavior in 1PCC mode, except that media and session control are independently
managed in 3PCC mode. This provides greater flexibility to 3PCC mode applications.
Figure 63 shows a basic third party call control connection:
Figure 63. Third Party Call Controller
Third Party
Call
Controller
SIP Signaling
IP Network
RTP Media
SIP Signaling
First Party
Signalling/
Media Endpoint
338
SIP Signaling
First Party
Signalling/
Media Endpoint
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
Third Party Call Control (3PCC) Operations and Multimedia Support
SIP uses the Session Description Protocol (SDP) format for negotiating the media parameters of
third party call control calls. Further information on SDP is available in the Internet Engineering
Task Force (IETF) document RFC 2327 - SDP: Session Description Protocol. RFC 2327 is
available at http://ietf.org/rfc/rfc2327.txt.
Figure 64 shows a basic call setup sequence for third party call control:
Figure 64. Basic Call Setup When Using Third Party Call Control
Third Party
Call Controller
User A
User B
(1) INVITE no SDP
(2) 200 OK offer1
(3) INVITE offer1
(4) 200 OK answer1
(5) ACK
(6) ACK answer1
(7) RTP (media stream)
The call sequence description for Figure 64 is as follows:
1. The third party call controller sends a SIP INVITE method (1). This INVITE does not contain
SDP information. The INVITE method causes User A’s phone to ring.
2. When User A’s phone rings, User A answers. A 200 OK (2) message is sent from User A to the
third party call controller. The 200 OK message contains an SDP offer (offer1).
3. Per SIP rules (RFC 3261), the third party call controller must respond to User A’s 200 OK
message with an ACK method. The ACK method should contain an answer to the offer
(offer1) that was included in User A’s 200 OK message.
4. To obtain the answer, the third party call controller encapsulates the SDP offer (offer1) it
received from User A in an INVITE method. This INVITE method is then sent to User B (3).
This INVITE method causes User B’s phone to ring.
5. When User B’s phone rings, User B answers. A 200 OK (4) message is sent from User B to the
third party call controller. The 200 OK message contains an SDP answer (answer1) to the offer
(offer1).
6. The third party call controller sends an ACK method to User B (5).
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
339
Third Party Call Control (3PCC) Operations and Multimedia Support
7. The third party call controller then encapsulates the answer (answer1) in an ACK method. This
ACK method is then sent to User A (6). User A has now received the ACK message that was
required as part of step 3 above.
8. Because the SDP offer (offer1) was generated by User A and the SDP answer (answer1) was
generated by User B, the RTP (media stream) flows between User A and User B (7).
While the call scenario described in Figure 64 is useful for explaining the fundamentals of third
party call control call, it is not a realistic call scenario. Most significantly, it assumes that User B
will answer the phone. If User B does not answer the phone, User A will never receive an ACK
from the third party controller. This results in a time-out problem that will eventually cause the call
to fail. Figure 65 describes the fundamentals of a more realistic example, using re-INVITE (a
subsequent INVITE on an active dialog) to establish third party call control:
Figure 65. Third Party Call Control Setup using re-INVITE
Third Party
Call Controller
User A
User B
(1) INVITE offer1
no media
(2) 200 OK answer1
no media
(3) ACK
(4) INVITE no SDP
(5) 200 OK offer2
(6) INVITE offer2'
(7) 200 OK answer2'
(8) ACK answer2
(9) ACK
(10) RTP (media stream)
The call sequence description for Figure 65 is as follows:
1. The third party call controller sends a SIP INVITE method (1) to User A. This INVITE
contains an SDP offer (offer1), but the offer does not provide a media level description (no m
lines in the SDP message body) for the session. This implies that the media session will
eventually be coordinated via a re-INVITE at a later time. The initial INVITE method causes
User A’s phone to ring.
340
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
Third Party Call Control (3PCC) Operations and Multimedia Support
Note: Per SDP rules (RFC 3264), if an SDP message body does not contain a media level
description (at least one m line), the message body must contain connection
information (c line must be present). To satisfy this requirement in IPv4 networks, a
“black hole” IP address of 0.0.0.0 is provided as part of the c line in the SDP message
body. IPv4 packets sent to this “black hole” address never leave the host that sent
them; the packets are discarded. Keep in mind that this behavior is specific to IPv4
networks. IPv6 and other networks should use an IP address with similar properties.
2. When User A’s phone rings, User A answers. A 200 OK (2) message is sent from User A to the
third party call controller. The 200 OK message contains an SDP answer (answer1) to the third
party call controller’s offer (offer1). The 200 OK message does not provide a media level
description, much like the INVITE method from (1).
3. The third party call controller responds to User A’s 200 OK message with an ACK.
4. The third party call controller then sends an INVITE method to User B (4). This INVITE does
not contain Session Description Protocol (SDP) information. This INVITE method causes
User B’s phone to ring.
5. When User B’s phone rings, User B answers. A 200 OK (5) message is sent from User B to the
third party call controller. The 200 OK message contains an SDP offer (offer2).
6. The third party call controller encapsulates the SDP offer from User B (offer2) into a reINVITE that is sent to User A (6). The re-INVITE is based on the offer received from User B
(offer2). The only difference between offer2' and offer2 is that the origin line (o line) in offer2'
must be valid based on the o line in offer2.
7. User A responds with a 200 OK message (7). This message contains an answer (answer2') to
the third party call controller’s re-INVITE offer (offer2').
8. The third party call controller encapsulates the SDP answer from User A into an ACK method
(answer2). The only difference between answer2 and answer2 is that the origin line (o line) in
answer2' must be valid based on the o line in answer2. The ACK is sent to User B (8).
9. The third party call controller sends an ACK method to User A (9).
10. The RTP (media stream) flows between User A and User B (10).
5.1.2
Global Call Library and IP Media Library for Third Party Call
Control
The Dialogic® Global Call API library has been extended to support third party call control (3PCC)
mode. Dialogic® Global Call API can be configured to run in either the default first party call
control mode (1PCC) or third party call control mode. The two modes are mutually exclusive.
The Dialogic® Global Call API library supports third party call control for SIP networks only.
When the Dialogic® Global Call API library is initialized in 3PCC mode, H.323 operations will not
be available.
Note:
Multimedia (simultaneous audio and video) record/playback is only supported when the Dialogic®
Global Call API library is initialized in 3PCC mode.
When the Dialogic® Global Call API library is initialized in 1PCC mode, the Dialogic® Global
Call API library provides an abstraction layer for the Dialogic® IP Media Library API library. This
allows the host application to open and close IP media channels for streaming via the Dialogic®
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
341
Third Party Call Control (3PCC) Operations and Multimedia Support
Global Call API library. The host application does not require direct access to the IP Media Library,
as shown in Figure 5, “Dialogic® Global Call API Over IP Architecture”, on page 44.
When the Dialogic® Global Call API library is initialized in 3PCC mode, the host application is
directly responsible for calling the Dialogic® IP Media Library API functions to manage RTP
streams. This relationship is shown in Figure 63. Refer to the Dialogic® IP Media Library API
Programming Guide and Dialogic® IP Media Library API Library Reference for more information
about the IPML API.
Section 5.2, “Global Call in Third Party Call Control Mode”, on page 343 provides a complete
overview of the Dialogic® Global Call API library modifications made to support 3PCC mode.
Figure 66. Global Call over IP Architecture for Third Party Call Control Mode
Host Application
Media
SDP
Global Call
IP Media
Library
Call Control
Signaling
IP Network
Host
NIC
SIP Call
Control Library
(IPTCCLIB)
Host
Board
RTP/RTCP
Media
IP Network
5.1.3
IP Media
Resource
TDM
DTI Network
Device
TDM
PSTN
Session Description Protocol
The session description protocol (SDP) is the method of choice for communicating device
capabilities between SIP endpoints. SDP is used to exchange endpoint capability information such
as coder support, IP address, port information and media stream direction.
When the Dialogic® Global Call API is initialized in 1PCC mode, the SDP content in SIP
messages is not exposed to the application. The call control library (IPCCLIB) controls media
negotiations internally.
342
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
Third Party Call Control (3PCC) Operations and Multimedia Support
When the Dialogic® Global Call API is initialized in 3PCC mode, the call control library
(IPCCLIB) does not internally negotiate media session parameters; the host application is
responsible for negotiating the following:
• coordinating matching audio/video coders
• generating SDP data for outgoing SIP messages. These outgoing SIP messages are created
when certain Dialogic® Global Call API functions are called (as shown in Table 21,
“Summary of IPSET_SDP Parameters and Outbound SIP Messages”, on page 346)
• parsing the SDP data that is attached to incoming Dialogic® Global Call API events (as shown
in Table 22, “Summary of Events That Support Global Call SDP Parameter Sets”, on
page 347)
In third party call control call flows, the host application is entirely responsible for the SDP
contents of SIP messages. The SDP data negotiates media session parameters and connects the
RTP media streams. The SDP data is generated and attached to outbound SIP messages. Likewise,
SDP data is parsed from incoming Global Call events. The SDP data is then passed to and from
host applications in IPSET_SDP parameter set IDs.
There are many open source SDP generator/parser tools that can be used to build Dialogic® Global
Call API-based multimedia applications. The Dialogic® Host Media Processing (HMP) Software
includes an example SDP generator/parser. The example is described in Section 5.3, “Session
Description Protocol Parser/Generator Example”, on page 353.
For complete information about SDP, refer to the Internet Engineering Task Force (IETF)
document RFC 2327 - SDP: Session Description Protocol, which is available at
http://ietf.org/rfc/rfc2327.txt.
5.2
Global Call in Third Party Call Control Mode
This section describes the Dialogic® Global Call API modifications and extensions made to
support 3PCC mode. The topics are as follows:
• Initializing the Library in Third Party Call Control Mode
• Interface Changes
• Device Types and Usage
• Using Fast Start and Slow Start Setup in Third Party Call Control Mode
• Call Transfer Scenarios
• DTMF Transport
• T.38 Fax and Tone Detection
5.2.1
Initializing the Library in Third Party Call Control Mode
The Dialogic® Global Call API library supports two mutually exclusive modes of operation, first
party call control (1PCC) mode and third party call control (3PCC) mode. The mode of operation is
set when the Dialogic® Global Call API library is initialized by calling gc_Start( ). The
IPCCLIB_START_DATA data structure, which is passed to gc_Start( ) via the
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
343
Third Party Call Control (3PCC) Operations and Multimedia Support
CCLIB_START_STRUCT and GC_START_STRUCT structures, contains a
media_operational_mode field that determines the Dialogic® Global Call API library mode of
operation. The default value of this field that is set by the INIT_IPCCLIB_START_DATA( )
initialization function specifies the first party call control (1PCC) mode; applications wishing to
use the 3PCC mode must set the media_operational_mode field to the value
MEDIA_OPERATIONAL_MODE_3PCC before calling gc_Start( ).
The following code snippet shows how an application initializes the CCLIB_START_STRUCT
structure and sets the parameter for 3PCC operating mode.
#include "gclib.h"
..
..
#define BOARDS_NUM 1
..
..
/* initialize start parameters */
IPCCLIB_START_DATA cclibStartData;
memset(&cclibStartData,0,sizeof(IPCCLIB_START_DATA));
IP_VIRTBOARD virtBoards[BOARDS_NUM];
memset(virtBoards,0,sizeof(IP_VIRTBOARD)*BOARDS_NUM);
/* initialize start data structure */
INIT_IPCCLIB_START_DATA(&cclibStartData, BOARDS_NUM, virtBoards);
/* initialize virtual board structure */
INIT_IP_VIRTBOARD(&virtBoards[0]);
// set 3PCC operating mode
cclibStartData.media_operational_mode = MEDIA_OPERATIONAL_MODE_3PCC;
Note:
In order to change the operating mode when the Dialogic® Global Call API library is running, the
library must first be stopped by calling the gc_Stop( ) function. The IP CCLIB does not support the
invocation of any library operations after performing a gc_Stop( ). This function drops all calls,
stops the Dialogic® Global Call API library, and releases all resources so that the library can be
restarted in a different mode. However, the application is responsible for terminating all processes
after calling gc_Stop( ). The application must then be restarted and gc_Start( ) invoked to change
the library and virtual board startup parameters.
Refer to Section 4.1, “Call Control Library Initialization”, on page 108 and Section 8.3.27,
“gc_Start( ) Variances for IP”, on page 491, for more information about initializing the Dialogic®
Global Call API library.
5.2.2
Interface Changes
Several Dialogic® Global Call API changes have been made to support 3PCC mode. Third party
call control-specific changes are as follows:
• IPCCLIB_START_DATA Data Structure
• IPSET_SDP Parameter Set Identifier
• gc_SipAck( )
• gc_Listen( ) and gc_UnListen( )
• gc_SetUserInfo( ) Duration Defines
344
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
Third Party Call Control (3PCC) Operations and Multimedia Support
• Events
• Error Codes
• Global Call Functions Invalid in Third Party Call Control Mode
5.2.2.1
IPCCLIB_START_DATA Data Structure
The IPCCLIB_START_DATA data structure contains a new media_operational_mode field that
determines the Dialogic® Global Call API library mode of operation, first party call control mode
(1PCC) or third party call control mode (3PCC).
5.2.2.2
IPSET_SDP Parameter Set Identifier
The IPSET_SDP parameter set ID and parameter IDs described in this section, along with those in
Section 9, “IP-Specific Parameters”, on page 499, are defined in the gcip.h header file. The
IPSET_SDP parameter set ID is only applicable when the Dialogic® Global Call API library is
initialized in 3PCC mode. Applications using this parameter ID must use the “extended”
gc_util_..._ex( ) utility functions, which are capable of handling parameter data longer than 255
bytes.
The Dialogic® Global Call API 3PCC model transports SDP buffers to and from the host
application through IPSET_SDP parameter set ID parameter blocks that are attached to outbound
SIP messages (generated by Dialogic® Global Call API function calls) and inbound Dialogic®
Global Call API events.
Notes: 1. The SDP offer/answer should be sent only one time during a transaction. Multiple attempts to
send SDP content during a transaction will result in an error.
2. The SDP offer/answer protocol is strictly enforced. If the application receives an SDP offer
within a Dialogic® Global Call API event, the application must respond with an SDP answer.
The SDP answer is included as part of the Dialogic® Global Call API function call that
completes the SIP transaction. For complete information about the offer/answer protocol with
SDP, refer to the Internet Engineering Task Force (IETF) document RFC 3264 - An Offer/Answer
Model with Session Description Protocol (SDP), which is available at
http://ietf.org/rfc/rfc3264.txt.
Table 20 shows the parameter IDs in the IPSET_SDP parameter set. The SDP content string must
adhere to the following:
• consist of an array of variable length records of the form <type>=<value>
• each record must contain an array of ISO-10646 characters in UTF-8 encoding
• a record’s content must not include 0x00, 0x0a or 0x0d characters
• each record must be terminated with a <CR><LF> (0x0D0A)
• maximum SDP content length is determined by IP_CFG_PARM_DATA_MAXLEN symbolic
define
Sample SDP content is shown below:
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
345
Third Party Call Control (3PCC) Operations and Multimedia Support
char sdpMsgFormat[] =
"v=0\r\n"
"o=Dialogic_IPCCLib %d %d IN IP4 %s\r\n"
"s=Dialogic_SIP_CCLIB\r\n"
"i=session information\r\n"
"c=IN IP4 %s\r\n"
"t=0 0\r\n"
"m=audio %d 2000 RTP/AVP %d\r\n";
Note:
The SDP outbound content is generated by the application. The Dialogic® HMP Software includes
an example SDP generator/parser. The example code is described in Section 5.3, “Session
Description Protocol Parser/Generator Example”, on page 353.
Table 20. IPSET_SDP Parameter Set
Parameter ID
Data Type and Size
IPPARM_SDP_ANSWER
Description
Type: string
Size: GC_PARM_DATA_EXTP
IPPARM_SDP_OFFER
Type: string
Size: GC_PARM_DATA_EXTP
IPPARM_SDP_OPTION_ANSWER
Type: string
Size: GC_PARM_DATA_EXTP
IPPARM_SDP_OPTION_OFFER
Type: string
Size: GC_PARM_DATA_EXTP
Indicates the parameter value is an
SDP answer.
Indicates the parameter value is an
SDP offer.
Indicates the parameter data is
associated with SIP OPTIONS
response.
Indicates the parameter data is
associated with SIP OPTIONS
request.
For Global Call parameters of type string, the data size is the length of the string plus 1 (for the null termination).
Table 21 shows the Dialogic® Global Call API functions that can be used to add SDP content to
SIP outbound messages:
Table 21. Summary of IPSET_SDP Parameters and Outbound SIP Messages
Parameter ID
IPPARM_SDP_
ANSWER
Set
Send
Device
Type
Outbound SIP Messages Containing
SDP
gc_SetUserInfo( )†
gc_AcceptCall( )
CRN
180 Ringing or 1xx progress code
---
gc_AcceptModifyCall( )
CRN
200 OK to re-INVITE
gc_SetUserInfo( ) †
gc_AnswerCall( )
CRN
200 OK to INVITE
gc_SetUserInfo( ) †
gc_CallAck( )
CRN
100 Trying
gc_SetUserInfo( ) †
gc_RejectModifyCall( )
CRN
4xx - 6xx response to re-INVITE
---
gc_SipAck( )
CRN
ACK to 200 OK
† The duration parameter must be set to GC_NEXT_OUTBOUND_MSG (to apply on next outbound message).
346
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
Third Party Call Control (3PCC) Operations and Multimedia Support
Table 21. Summary of IPSET_SDP Parameters and Outbound SIP Messages (Continued)
Parameter ID
Set
IPPARM_SDP_
OFFER
Device
Type
Send
Outbound SIP Messages Containing
SDP
gc_SetUserInfo( )†
gc_AcceptCall( )
CRN
180 Ringing or 1xx progress code
---
gc_AcceptModifyCall( )
CRN
200 OK to re-INVITE
gc_SetUserInfo( ) †
gc_AnswerCall( )
CRN
200 OK to INVITE
gc_SetUserInfo( ) †
gc_CallAck( )
CRN
100 Trying
---
gc_MakeCall( )
LD
INVITE
---
gc_ReqModifyCall( )
CRN
re-INVITE
IPPARM_SDP_
OPTION_ANSWER
---
gc_Extension( )
for IPEXTID_SENDMSG,
with GC_PARM_BLK
containing
IPSET_MSG_SIP /
IPPARM_MSGTYPE /
IP_MSGTYPE_SIP_
OPTIONS_OK
CRN
200 OK to OPTIONS
IPPARM_SDP_
OPTION_OFFER
--
gc_Extension( ),
for IPEXTID_SENDMSG
with GC_PARM_BLK
containing
IPSET_MSG_SIP /
IPPARM_MSGTYPE /
IP_MSGTYPE_SIP_
OPTIONS_OK
CRN
OPTIONS message
† The duration parameter must be set to GC_NEXT_OUTBOUND_MSG (to apply on next outbound message).
Table 22 shows the inbound Dialogic® Global Call API events that may have SDP content
attached. The host application must register for all events that may contain SDP content. Host
applications can retrieve the SDP content by parsing the attached parameter block for IPSET_SDP
parameter IDs shown in Table 20, “IPSET_SDP Parameter Set”, on page 346.
Note:
The SDP inbound content is parsed by the application. The Dialogic® HMP Software includes an
example SDP generator/parser. The example code is described in Section 5.3, “Session Description
Protocol Parser/Generator Example”, on page 353.
Table 22. Summary of Events That Support Global Call SDP Parameter Sets
Global Call Event with Possible
SDP Parameter Set Attached†
Device
Type
GCEV_ALERTING
CRN
180 Ringing or 1xx progress code
GCEV_ANSWERED
CRN
ACK
GCEV_CANCEL_MODIFY_CALL
CRN
remote party responded with a 200OK when the application
sent a CANCEL request for a pending re-INVITE
GCEV_CONNECTED
CRN
200 OK to INVITE
Inbound SIP Message with optional SDP
† The Global Call event may contain a pointer to an EXTENSIONEVENTBLK which contains a pointer to a parameter block.
This parameter block may contain SDP content as an IPSET_SDP parameter ID.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
347
Third Party Call Control (3PCC) Operations and Multimedia Support
Table 22. Summary of Events That Support Global Call SDP Parameter Sets (Continued)
Global Call Event with Possible
SDP Parameter Set Attached†
Device
Type
GCEV_EXTENSION (IPEXTID_)
BRD
SIP OPTIONS message (inbound request)
CRN
SIP OPTIONS message’s 200 OK reply (inbound response
success)
Inbound SIP Message with optional SDP
Note: This is for the IXPEXTID_RECEIVEMSG extension
event type only, with a parameter block containing
IPPARM_MSGTYPE parameter value of
IP_MSGTYPE_SIP_OPTIONS.
GCEV_MODIFY_CALL_ACK
CRN
200 OK response to re-INVITE
GCEV_MODIFY_CALL_REJ
CRN
3xx-6xx response to re-INVITE
GCEV_OFFERED
LD
INVITE
GCEV_PROCEEDING
CRN
100 Trying
GCEV_REQ_MODIFY_CALL
CRN
re-INVITE
GCEV_SIP_ACK
CRN
ACK
† The Global Call event may contain a pointer to an EXTENSIONEVENTBLK which contains a pointer to a parameter block.
This parameter block may contain SDP content as an IPSET_SDP parameter ID.
IPSET_SDP Code Example
/*
/* Description: Send a SIP re-INVITE containing an SDP offer
/*
for IP Address, RTP port, coder type.
/*
/* Assumes: 1) caller has verified call to be in connected state
/*
*/
*/
*/
*/
*/
*/
int sendOfferOnReinvite(CRN crn, long time, char *pIpAddr,
short rtpPort, short coderType)
{
int
int
GC_PARM_BLKP
char sdpMsg[512];
dataSize;
rc;
gcParmBlk = NULL;
char sdpMsgFormat[] =
"v=0\r\n"
"o=Dialogic_IPCCLib %d %d IN IP4 %s\r\n"
"s=Dialogic_SIP_CCLIB\r\n"
"i=session information\r\n"
"c=IN IP4 %s\r\n"
"t=0 0\r\n"
"m=audio %d 2000 RTP/AVP %d\r\n";
/* initialize the SDP content */
sprintf(sdpMsg, sdpMsgFormat, time, time + 1,
pIpAddr, pIpAddr, rtpPort, coderType);
/* Add 1 to strlen for null termination */
data_size = strlen(sdpMsg) + 1;
348
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
Third Party Call Control (3PCC) Operations and Multimedia Support
/* put the SDP content into the parameter block */
rc = gc_util_insert_parm_ref_ex(&gcParmBlk,
IPSET_SDP,
IPPARM_SDP_OFFER,
data_size
(void *) sdpMsg);
/* set value */
/* parm value */
if (rc != 0) return FAILURE;
/* send the re-INVITE message */
if (gc_ReqModifyCall(crn, gcParmBlk, EV_ASYNC) != GC_SUCCESS)
return FAILURE;
/* cleanup and exit */
gc_util_delete_parm_blk(gcParmBlk);
return SUCCESS;
}
5.2.2.3
gc_SipAck( )
The gc_SipAck( ) function is used to send an ACK message to the remote party on an outbound
INVITE and re-INVITE transaction. The Dialogic® Global Call API library cannot automatically
send an ACK after it receives a 200 OK message, so the host application must call this function in
response to the reception of a GCEV_SIP_200OK event. The ACK completes the dialog’s
transaction, avoiding time-out/call failure issues. SDP content may be attached to the ACK
message by including a pointer to a parameter block that contains an element with the IPSET_SDP
parameter set ID.
5.2.2.4
gc_Listen( ) and gc_UnListen( )
When the Dialogic® Global Call API library is initialized in 3PCC mode, gc_Listen( ) and
gc_UnListen( ) requests are routed directly to the IPML. Valid IPML device handles are required
for the gc_Listen( ) and gc_UnListen( ) functions, but Dialogic® Global Call API media control
functions are not available when the Dialogic® Global Call API library is initialized in 3PCC
mode.
Refer to Section 5.2.2.8, “Global Call Functions Invalid in Third Party Call Control Mode”, on
page 351 for information about media control functions that are not available when Dialogic®
Global Call API is initialized in 3PCC mode.
5.2.2.5
gc_SetUserInfo( ) Duration Defines
A new duration define, GC_NEXT_OUTBOUND_MSG, is available for the gc_SetUserInfo( )
function. This duration define is only valid when the Dialogic® Global Call API library is
initialized in 3PCC mode. It has been included because the GC_SINGLECALL and
GC_ALLCALLS are not sufficient for the life cycle of an IPSET_SDP parameter data set.
The GC_SINGLE_CALL and GC_ALL_CALLS duration defines are also inadequate for setting
MIME data, and some generic header data. The GC_NEXT_OUTBOUND_MSG duration define
implies that the data set is only valid until the next outbound SIP message is sent. The
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
349
Third Party Call Control (3PCC) Operations and Multimedia Support
GC_SINGLECALL and GC_ALLCALLS duration defines imply that the data set is valid for the
entire length of the call.
Refer to Section 4.3, “Setting Call-Related Information”, on page 121 for an overview of the
GC_SINGLECALL and GC_ALLCALLS duration defines.
Note:
5.2.2.6
If the host application needs to set a CRN's or a device's parameters with different duration defines,
then the application must call gc_SetUserInfo( ) multiple times. All parameters set within a single
gc_SetUserInfo( ) function call have the same duration value.
Events
Table 23 provides information about the events that have been added to the Dialogic® Global Call
API library to support third party call control mode. The application must use the
gc_SetConfigData( ) function to register for the events in Table 23. These events are only valid
when the Dialogic® Global Call API library is initialized in 3PCC mode:
Table 23. Global Call Third Party Call Control Mode Events
Global Call Event
GCEV_SIP_200OK
Description
Unsolicited event posted to application upon
reception of a SIP 200 OK message on an
active dialog (not in received responses to BYE
or OPTIONS messages).
Third Party Call Control
Mode Notes
Application should call
gc_SipAck( ) in response
to this event.
The application must register for this event.
GCEV_SIP_ACK
Unsolicited event posted to application upon
reception of a SIP ACK message on an active
dialog (not posted during BYE or OPTIONS
transactions).
This event may include
IPSET_SDP in attached
parameter block.
The application must register for this event.
5.2.2.7
GCEV_SIP_ACK_FAILED
Failure completion termination event,
associated with the gc_SipAck( ) function.
This event may indicate a
message transport failure.
GCEV_SIP_ACK_OK
Successful completion termination event,
associated with the gc_SipAck( ) function.
Indicates that the SIP ACK
message was sent. It does
not mean the SDP content,
if any, was valid.
Error Codes
Table 24 provides information about the error codes that have been added to the library to support
third party call control mode. These error codes are only valid when the Dialogic® Global Call API
library is initialized in 3PCC mode:
350
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
Third Party Call Control (3PCC) Operations and Multimedia Support
Table 24. Global Call Third Party Call Control Mode Error Codes
Global Call Error
Description
EGC_INVALID_IN_1PCC
Generated when a 3PCC mode-specific function is called while
the Dialogic® Global Call library is initialized in 1PCC mode.
EGC_NO_MEDIA_IN_3PCC
Generated when a media control function is called while the
Dialogic® Global Call library is initialized in 3PCC mode.
Section 5.2.2.8, “Global Call Functions Invalid in Third Party
Call Control Mode”, on page 351 describes the Global Call
media control functions that are not valid when the Dialogic®
Global Call library is initialized in 3PCC mode.
5.2.2.8
EGC_RESOURCE_NOT_LICENSED
Generated when the IPCCLIB library cannot obtain
authorization from the product's license authority to use a
resource (SIP signaling port or third party call control library
instance).
EGC_SDP_ANSWER_MISSING
Generated when an SDP offer was received and no SDP
answer was generated. This indicates a violation of the SDP
offer/answer protocol.
Global Call Functions Invalid in Third Party Call Control Mode
When the Dialogic® Global Call API library is operating in 3PCC mode, the application is
responsible for manipulating media behavior via the IPML. Therefore, the Dialogic® Global Call
API media-specific functions are considered invalid in 3PCC mode. Table 25 lists these invalid
functions:
Table 25. Global Call Functions Invalid in Third Party Call Control Mode
Global Call Function
Device
Type
Parameter Set ID or
Extension IDs (if applicable)
Result when Function is Called in
Third Party Call Control Mode
gc_AttachResource( )
LD
Returns GC_ERROR
gc_Detach( )
LD
Returns GC_ERROR
gc_Extension( )
BRD
CRN
LD
IPEXTID_MEDIAINFO
IPEXTID_SEND_DTMF
IPEXTID_RECEIVE_DTMF
IPEXTID_FOIP
IPEXTID_CHANGEMODE
Returns GC_ERROR
gc_MakeCall( )
CRN
IPSET_MEDIA_STATE
IPSET_FOIP
GCSET_CHAN_CAPABILITY
IPSET_DTMF
IPSET_CALLINFO/IPPARM_
CONNECTIONMETHOD
Parameters using indicated set IDs
are ignored
gc_ReqModifyCall( )
CRN
IPSET_MEDIA_STATE
IPSET_FOIP
GCSET_CHAN_CAPABILITY
IPSET_DTMF
Parameters using indicated set IDs
are ignored
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
351
Third Party Call Control (3PCC) Operations and Multimedia Support
Table 25. Global Call Functions Invalid in Third Party Call Control Mode (Continued)
Global Call Function
5.2.3
Device
Type
Parameter Set ID or
Extension IDs (if applicable)
Result when Function is Called in
Third Party Call Control Mode
gc_SetConfigData( )
LD
IPSET_MEDIA_STATE
IPSET_FOIP
GCSET_CHAN_CAPABILITY
IPSET_DTMF
IPSET_CALLINFO/IPPARM_
CONNECTIONMETHOD
Parameters using indicated set IDs
are ignored
gc_SetUserInfo( )
BRD
CRN
LD
IPSET_MEDIA_STATE
IPSET_FOIP
GCSET_CHAN_CAPABILITY
IPSET_DTMF
IPSET_CALLINFO/IPPARM_
CONNECTIONMETHOD
Parameters using indicated set IDs
are ignored
Device Types and Usage
When using Dialogic® Global Call API in 3PCC mode, the gc_OpenEx( ) and
gc_AttachResource( ) functions cannot be used to attach an IPT network device to an IPM media
device. IPM media devices cannot be opened via Dialogic® Global Call API when the library is
initialized in 3PCC mode. IPM media devices must be opened by the Dialogic® IP Media Library
API library when the Dialogic® Global Call API is initialized in 3PCC mode.
When initialized in 3PCC mode, valid Dialogic® Global Call API devices are limited to IPT board
devices and IPT network devices. Refer to Section 2.3, “Device Types and Usage”, on page 46 for
information about these device types.
5.2.4
Using Fast Start and Slow Start Setup in Third Party Call
Control Mode
When the Dialogic® Global Call API library is initialized in 3PCC mode, the host application
controls whether or not SDP information is included in the outbound INVITE message.
Note:
5.2.5
When initialized in 3PCC mode, the Dialogic® Global Call API library ignores the
IPSET_CALLINFO / IPPARM_CONNECTIONMETHOD parameter; this parameter is only valid
when Dialogic® Global Call API is initialized in 1PCC mode. Refer to Section 4.2, “Fast and Slow
Call Setup Modes”, on page 115 for information.
Call Transfer Scenarios
Call transfer behavior when the Dialogic® Global Call API is initialized in 3PCC mode is identical
to call transfer behavior when the Dialogic® Global Call API is initialized in 1PCC mode. In other
words, no additional interface changes are required to implement call transfer in 3PCC mode. Refer
to Section 3.3, “Call Transfer Scenarios When Using SIP”, on page 74 for more information.
352
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
Third Party Call Control (3PCC) Operations and Multimedia Support
5.2.6
DTMF Transport
The media management interface required to support in-band DTMF transport is not available
when the Dialogic® Global Call API is initialized in 3PCC mode. As a result, the application must
use IP Medai Library functions to specify the type of DTMF transport to use (in-band or out-ofband).
5.2.7
T.38 Fax and Tone Detection
When the Dialogic® Global Call API is initialized in 3PCC mode, the Dialogic® Global Call API
library does not provide support for T.38 fax or in-band tone detection. The host application is
responsible for performing T.38 signaling through re-INVITE functionality and the SDP.
5.3
Session Description Protocol Parser/Generator
Example
The session description protocol (SDP) is the method of choice for communicating device
capabilities between SIP endpoints. SDP is transported as payload in SIP message bodies. SDP is
used to exchange endpoint capability information such as coder support, IP address, port
information and media stream direction. The SDP information is required to manage media
resources, such as IPM devices and RTP media streams.
The host application must parse the SDP information incoming Dialogic® Global Call API events.
Likewise, the host application must insert SDP content into the make call parameter block before
making a call.
The Dialogic® HMP Software includes an example SDP generator/parser. The default installation
path for the example SDP generator/parser is %INTEL_DIALOGIC_DIR%\demos, where
%INTEL_DIALOGIC_DIR% is the environment variable for the directory in which the Dialogic®
HMP Software is installed. The example includes:
• demo application
• source code
• binary code
• design diagrams
5.4
Message Sequence Diagrams
The following third party call control message sequence diagrams are included:
• First Party Call Establishment in Third Party Call Control Mode
• Basic Third Party Call Control Establishment
• Alternate Third Party Call Control Establishment
• Modifying the Coder
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
353
Third Party Call Control (3PCC) Operations and Multimedia Support
• Cancelling a re-INVITE Request
• Receiving an Invalid Answer SDP
• OPTIONS Request on an Active Dialog
5.4.1
First Party Call Establishment in Third Party Call Control
Mode
Figure 67 shows how to implement a simple point-to-point SIP call between two endpoints (party
A and party B). The Dialogic® Global Call API library is initialized in 3PCC mode. A third party
call controller is not used:
Figure 67. First Party Call Control Establishment in Third Party Call Control Mode
IPML
Library A
Application A
Global Call
Library A
(IPCCLIB)
Global Call
Library B
(IPCCLIB)
Application B
gc_MakeCall
SDP Offer 1
GCEV_DIALING
ipm_StartMedia
(RCV_ONLY)
INVITE
SDP Offer 1
GCEV_OFFERED
SDP Offer 1
IPMEV_START_
MEDIA
IPML
Library B
SDP offer has only one
receive coder specified,
allowing IPML to "start early"
on the offering side.
ipm_StartMedia
(TxRx)
RTP
IPMEV_START
_MEDIA
SDP added by the application
in a provisional response will
be automatically included in
the dialog's final response.
The SDP will only be delivered
to the application one time.
gc_SetUserInfo
SDP Answer 1
gc_AcceptCall
GCEV_ACCEPT
180 Ringing
SDP Answer 1
ipm_ModifyMedia
(TxRx)
GCEV_ALERTING
SDP Answer 1
RTP
IPMEV_MODIFY
_MEDIA
gc_AnswerCall
200 OK
SDP Answer 1
GCEV_CONNECTED
No GCEV_SIP_200OK
events are sent to the
application during dialog
dis-establishment.
GCEV_SIP_200OK
gc_SipAck
ACK
GCEV_SIP_ACK_OK
GCEV_ANSWERED
GCEV_SIP_ACK
gc_DropCall
BYE
200 OK
No SDP
GCEV_
DISCONNECTED
GCEV_DROPCALL
ipm_Stop
gc_DropCall
IPMEV_STOP
GCEV_DROPCALL
gc_ReleaseCallEx
ipm_Stop
GCEV_RELEASECALL
IPMEV_STOP
gc_ReleaseCallEx
GCEV_RELEASECALL
354
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
Third Party Call Control (3PCC) Operations and Multimedia Support
5.4.2
Basic Third Party Call Control Establishment
Figure 68 and Figure 69 show how to establish a basic third party call control call. A third party
call controller, party B, establishes signaling connections to two different endpoints, party A and
party C. The third party call controller then establishes RTP media paths between the two
endpoints:
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
355
356
Black Hole SDP
contains m line
IP address 0.0.0.0
IPMEV_START
_MEDIA
GCEV_SIP_ACK
GCEV_ANSWERED
SDP Answer 1 (BH)
gc_AnswerCall
gc_SetUserInfo
SDP Offer 1
Global Call
Library B
(IPCCLIB)
GCEV_DIALING
gc_ReqModifyCall
SDP Offer 2
GCEV_SIP_200OK
GCEV_CONNECTED
SDP Offer 2
GCEV_DIALING
gc_MakeCall 2
no SDP
GCEV_SIP_ACK_OK
ACK
SDP Answer 1(BH)
gc_SipAck
SDP Answer 1(BH)
GCEV_SIP_200OK
GCEV_CONNECTED
SDP Offer 1
200 OK
SDP Offer 1
INVITE
no SDP
gc_MakeCall
no SDP
Application B
200 OK
SDP Offer 2
INVITE
no SDP
gc_SetUserInfo
SDP Offer 2
gc_AnswerCall
SDP Offer 2
IPMEV_START
_MEDIA
ipm_StartMedia
(RCV_ONLY)
SDP offer has only one
receive coder specified,
allowing IPML to "start early"
on the offering side.
Application C
GCEV_OFFERED
no SDP
Global Call
Library C
(IPCCLIB)
continued in Basic Third Party Call Control Establishment (part two) figure
Global Call
Library A
(IPCCLIB)
GCEV_OFFERED
no SDP
Application A
ipm_StartMedia
(RCV_ONLY)
IPML
Library A
IPML
Library C
Third Party Call Control (3PCC) Operations and Multimedia Support
Figure 68. Basic Third Party Call Control Establishment (part one)
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IPMEV_MODIFY
_MEDIA
Global Call
Library A
(IPCCLIB)
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
GCEV_SIP_ACK
no SDP
GCEV_ACCEPT
_MODIFY_CALL
gc_AcceptModifyCall
SDP Answer 2
GCEV_REQ
MODIFY_CALL
SDP Offer 2
Application A
ipm_ModifyMedia
(TxRx)
IPML
Library A
RTP
GCEV_SIP_ACK_OK
ACK
No SDP
RTP
GCEV_SIP_ACK
gc_SipAck
IPMEV_MODIFY
_MEDIA
ipm_ModifyMedia
(TxRx)
Application C
GCEV_ANSWERED
SDP Answer 2
Global Call
Library C
(IPCCLIB)
GCEV_SIP_ACK_OK
gc_SipAck
SDP Answer 2
GCEV_SIP_200OK
ACK
SDP Answer 2
Global Call
Library B
(IPCCLIB)
GCEV_MODIFY
_CALL_ACK
SDP Answer 2
200 OK
SDP Answer 2
re-INVITE
SDP Offer 2
Application B
IPML
Library C
Third Party Call Control (3PCC) Operations and Multimedia Support
Figure 69. Basic Third Party Call Control Establishment (part two)
357
Third Party Call Control (3PCC) Operations and Multimedia Support
5.4.3
Alternate Third Party Call Control Establishment
Figure 70, Figure 71, and Figure 72 show an alternate third party call control flow. In this
sequence, party A, establishes a dialog and media connection with another user agent, party B.
Party B then establishes a dialog with a third user agent, party C. Party B then re-establishes the
media path from A-B to A-C:
358
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IPMEV_MODIFY
_MEDIA
Global Call
Library A
(IPCCLIB)
GCEV_SIP_ACK_OK
gc_SipAck
GCEV_SIP_200OK
GCEV_CONNECTED
GCEV_ALERTING
SDP Answer 1
GCEV_DIALING
gc_MakeCall
SDP Offer 1
Application A
ipm_ModifyMedia
(TxRx)
IPML
Library A
GCEV_ACCEPT
gc_AcceptCall
gc_AnswerCall
GCEV_SIP_ACK
GCEV_ANSWERED
Global Call
Library C
(IPCCLIB)
SDP added by the application
in a provisional response
will be automatically included
in the dialog's final response.
The repeated SDP will be delivered
to the application once.
IPML
Library B
continued in Alternate Third Party Call Control Establishment (part two) figure
ACK
IPMEV_START_MEDIA
ipm_StartMedia
(Tx/Rx)
gc_SetUserInfo
SDP Answer 1
200 OK
SDP Answer 1
RTP
Global Call
Library B
(IPCCLIB)
GCEV_OFFERED
SDP Offer 1
180 Ringing
SDP Answer 1
RTP
INVITE
SDP 1
Application B
Application C
IPML
Library C
Third Party Call Control (3PCC) Operations and Multimedia Support
Figure 70. Alternate Third Party Call Control Establishment (part one)
359
360
IPMEV_MODIFY
_MEDIA
GCEV_REQ
_MODIFY_CALL
SDP Offer 2
Global Call
Library A
(IPCCLIB)
gc_AcceptModifyCall
SDP Answer 2
Destination IP
address changed.
Application A
ipm_ModifyMedia
(TxRx)
IPML
Library A
Global Call
Library B
(IPCCLIB)
RTP
200 OK
SDP Offer 2
INVITE
no SDP
IPML
Library B
continued in Alternate Third Party Call Control Establishment (part three) figure
GCEV_MODIFY
_CALL_ACK
SDP Answer 2
200 OK
SDP Answer 2
re-INVITE
SDP Offer 2
gc_ReqModifyCall
SDP Offer 2
GCEV_SIP_200OK
GCEV_CONNECTED
SDP Offer 2
GCEV_DIALING
gc_MakeCall
no SDP
Application B
gc_SetUserInfo
SDP Offer 2
gc_AnswerCall
SDP Offer 2
IPML
Library C
IPMEV_START
_MEDIA
ipm_StartMedia
(RCV_ONLY)
Application C
GCEV_OFFERED
no SDP
Global Call
Library C
(IPCCLIB)
Third Party Call Control (3PCC) Operations and Multimedia Support
Figure 71. Alternate Third Party Call Control Establishment (part two)
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IPML
Library A
Global Call
Library A
(IPCCLIB)
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
GCEV_SIP_ACK
GCEV_ACCEPT
_MODIFY_CALL
Application A
Global Call
Library B
(IPCCLIB)
GCEV_SIP_ACK_OK
ACK
gc_SipAck
GCEV_SIP_ACK_OK
gc_SipAck
SDP Answer 2
IPMEV_STOP
ipm_Stop
GCEV_SIP_200OK
Application B
RTP
ACK
SDP Answer 2
IPML
Library B
GCEV_SIP_ACK
IPML
Library C
IPMEV_MODIFY
_MEDIA
ipm_ModifyMedia
(Tx/Rx)
Application C
GCEV_ANSWERED
SDP Answer 2
Global Call
Library C
(IPCCLIB)
Third Party Call Control (3PCC) Operations and Multimedia Support
Figure 72. Alternate Third Party Call Control Establishment (part three)
361
Third Party Call Control (3PCC) Operations and Multimedia Support
5.4.4
Modifying the Coder
When running in 3PCC mode, the host application can use the re-INVITE functionality to modify
the coders of an active dialog. This section provides the following message sequence diagrams:
• Successfully Modifying the Coder
• Unsuccessfully Modifying the Coder
5.4.4.1
Successfully Modifying the Coder
Figure 73 and Figure 74 show the message sequence diagram for successfully modifying the
coders of an active dialog:
362
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
Third Party Call Control (3PCC) Operations and Multimedia Support
Figure 73. Successfully Modifying the Coder (part one)
IPML
Library A
Application A
Global Call
Library A
(IPCCLIB)
Global Call
Library B
(IPCCLIB)
Application B
gc_MakeCall
SDP Offer 1
SDP offer has only one
receive coder specified,
allowing IPML to "start early"
on the offering side.
GCEV_DIALING
ipm_StartMedia
(RCV_ONLY)
IPML
Library B
INVITE
SDP Offer 1
GCEV_OFFERED
SDP Offer 1
IPMEV_START_MEDIA
gc_SetUserInfo
SDP Answer 1
ipm_StartMedia(TxRx)
RTP
IPMEV_START_MEDIA
gc_AcceptCall
GCEV_ACCEPT
ipm_ModifyMedia
(TxRx)
180 Ringing
SDP Answer 1
GCEV_ALERTING
SDP Answer 1
RTP
IPMEV_MODIFY
_MEDIA
gc_AnswerCall
200 OK
SDP Answer 1
GCEV_CONNECTED
SDP added by the application
in a provisional response will be
automatically included in
the dialog's final response.
Duplicate SDPs will not be
delivered to the application.
GCEV_SIP_200OK
gc_SipAck
ACK
GCEV_ANSWERED
GCEV_SIP_ACK
GCEV_SIP_ACK_OK
gc_ReqModifyCall
SDP Offer 2
ipm_ModifyMedia
(TxRx)
re-INVITE
SDP Offer 2
GCEV_REQ
_MODIFY_CALL
SDP Offer 2
RTP
IPMEV_MODIFY
_MEDIA
If the application executes ipm_ModifyMedia( )
when the re-INVITEis transmitted
or when the GCEV_MODIFY_CALL_ACK is
received, there will alway be a short media drop.
This is a limitation in the IPML library.
continued in the Successfully Modifying the Coder (part two) figure
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
363
Third Party Call Control (3PCC) Operations and Multimedia Support
Figure 74. Successfully Modifying the Coder (part two)
IPML
Library A
Application A
Global Call
Library A
(IPCCLIB)
Global Call
Library B
(IPCCLIB)
Application B
IPML
Library B
gc AcceptModifyCall
SDP Answer 2
200 OK
SDP Answer 2
GCEV_MODIFY
_CALL_ACK
SDP Answer 2
GCEV_SIP_200OK
ipm_ModifyMedia
(Tx/Rx)
RTP
IPMEV_MODIFY
_MEDIA
gc_SipAck
ACK
GCEV_ACCEPT
_MODIFY_CALL
GCEV_SIP_ACK_OK
GCEV_SIP_ACK
If the application executes ipm_ModifyMedia( )
when the re-INVITE is transmitted or when the
GCEV_MODIFY_CALL_ACKis received,
there will alway be a short media drop.
This is a limitation in the IPML library.
364
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
Third Party Call Control (3PCC) Operations and Multimedia Support
5.4.4.2
Unsuccessfully Modifying the Coder
Figure 75 shows a message sequence diagram for an unsuccessful attempt at modifying the coder
of an active dialog:
Figure 75. Unsuccessfully Modifying the Coder
IPML
Library A
Application A
Global Call
Library A
(IPCCLIB)
Global Call
Library B
(IPCCLIB)
Application B
IPML
Library B
gc_MakeCall
SDP Offer 1
GCEV_DIALING
ipm_StartMedia
(RCV_ONLY)
INVITE
SDP Offer 1
GCEV_OFFERED
SDP Offer 1
IPMEV_START_MEDIA
gc_SetUserInfo
SDP Answer 1
ipm_StartMedia(TxRx)
RTP
IPMEV_START_MEDIA
gc_AcceptCall
GCEV_ACCEPT
ipm_ModifyMedia
(TxRx)
180 Ringing
SDP Answer 1
GCEV_ALERTING
SDP Answer 1
RTP
IPMEV_MODIFY
_MEDIA
gc_AnswerCall
200 OK
SDP Answer 1
GCEV_CONNECTED
SDP added by the application
in a provisional response will be
automatically included in
the dialog's final response.
Duplicate SDPs will not be
delivered to the application.
GCEV_SIP_200OK
gc_SipAck
ACK
GCEV_SIP_ACK_OK
GCEV_ANSWERED
GCEV_SIP_ACK
Per RFC 3264, a stream that is
rejected must not media stream packets.
It is assumed that the original stream
remains intact because
the modification was rejected.
gc_ReqModifyCall
SDP Offer 2
re-INVITE
SDP Offer 2
GCEV_REQ
_MODIFY_CALL
SDP Offer 2
SIP ACK is automatically
generated by Global Call
for INVITE and
re-INVITE failures.
gc_RejectModifyCall
415 - Media Not Supported
GCEV_MODIFY
_CALL_REJ
ACK
GCEV_REJECT
_MODIFY_CALL
GCEV_SIP_ACK
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
365
Third Party Call Control (3PCC) Operations and Multimedia Support
5.4.5
Cancelling a re-INVITE Request
Figure 76 shows the host application behavior when a re-INVITE request has been cancelled. The
re-INVITE request is initially made to modify the coder used by the active dialog:
Figure 76. Cancelling a Coder Switch using re-INVITE
IPML
Library A
Application A
Global Call
Library A
(IPCCLIB)
Global Call
Library B
(IPCCLIB)
Application B
IPML
Library B
gc_MakeCall
SDP Offer 1
GCEV_DIALING
ipm_StartMedia
(RCV_ONLY)
INVITE
SDP Offer 1
GCEV_OFFERED
SDP Offer 1
IPMEV_START_MEDIA
gc_SetUserInfo
SDP Answer 1
ipm_StartMedia(TxRx)
RTP
gc_AnswerCall
200 OK
SDP Answer 1
GCEV_CONNECTED
SDP Answer 1
GCEV_SIP_200OK
ipm_ModifyMedia
(TxRx)
RTP
IPMEV_MODIFY
_MEDIA
gc_SipAck
ACK
GCEV_SIP_ACK_OK
GCEV_ANSWERED
GCEV_SIP_ACK
gc_ReqModifyCall
SDP Offer 2
GCEV_REQ_
MODIFY_CALL
SDP Offer 2
gc_ReqModifyCall
IP_MSGTYPE_
SIP_CANCEL
CANCEL
Per RFC3264, a stream
that is rejected in the answer
must not send media
for that stream.
It is assumed that the original
stream remained intact becuase
the modification was rejected. In
400-600 responses to CANCEL
requests that require SDP,
Global Call will generate the SDP.
200 OK
CSeq number CANCEL
487 - Request Terminated
CSeq number re-INVITE
ACK
GCEV_MODIFY
_CALL_CANCEL
366
re-INVITE
SDP Offer 2
SIP ACK is automatically
generated by Global Call
for INVITE and re-INVITE failures.
If these ACKs require "SDP reject
answers", Global Call will
provide them.
GCEV_CANCEL
_MODIFY_CALL
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
Third Party Call Control (3PCC) Operations and Multimedia Support
5.4.6
Receiving an Invalid Answer SDP
Figure 77 depicts host application behavior when an invalid answer SDP is received. In this
message sequence diagram, the application is responsible for the following:
• determining that the received answer SDP is invalid
• providing a response to satisfy the offer/answer protocol requirements
• calling the gc_ReqModifyCall( ) function to initiate a new offer/answer transaction
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
367
Third Party Call Control (3PCC) Operations and Multimedia Support
Figure 77. Receiving an Invalid Answer SDP
IPML
Library A
Global Call
Library A
(IPCCLIB)
Application A
Global Call
Library B
(IPCCLIB)
Application B
gc_MakeCall
SDP Offer 1
GCEV_DIALING
ipm_StartMedia
(RCV_ONLY)
INVITE
SDP Offer 1
GCEV_OFFERED
SDP Offer 1
IPMEV_START_MEDIA
IPML
Library B
SDP offer has only one
receive coder specified,
allowing IPML to "start early"
on the originating side.
ipm_StartMedia(TxRx)
RTP
IPMEV_START
_MEDIA
gc_SetUserInfo
Bad SDP Answer 1
When the application
receives a Bad SDP Answer,
it does not change its current
media state. Instead, the application
completes the SIP transaction
by sending a SIP ACK message and
issuing a re-INVITE with a new SDP.
gc_AnswerCall
200 OK
Bad SDP Answer 1
GCEV_CONNECTED
Bad SDP Answer 1
GCEV_SIP_200OK
gc_SipAck
ACK
GCEV_SIP_ACK_OK
GCEV_ANSWERED
gc_ReqModifyCall
SDP Offer 2
GCEV_SIP_ACK
re-INVITE SDP Offer 2
GCEV_REQ_
MODIFY_CALL
SDP Offer 2
ipm_ModifyMedia(Tx/Rx)
RTP
IPMEV_MODIFY_MEDIA
GCEV_MODIFY
CALL_ACK
SDP Answer 2
ipm_ModifyMedia
(TxRx)
gc_AcceptModifyCall
SDP Answer 2
200 OK
SDP Answer 2
GCEV_SIP_200OK
RTP
IPMEV_MODIFY
_MEDIA
gc_SipAck
ACK
GCEV_SIP_ACK_OK
GCEV_ACCEPT
_MODIFY_CALL
GCEV_SIP_ACK
5.4.7
OPTIONS Request on an Active Dialog
This section provides message sequence diagrams for the following two scenarios:
• OPTIONS Request Without a MIME Body
• With a MIME Body
368
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
Third Party Call Control (3PCC) Operations and Multimedia Support
5.4.7.1
OPTIONS Request Without a MIME Body
When performing SIP OPTIONS transactions in 3PCC mode, SDP content is always delivered in a
parameter block attached to the Global Call event as an IPSET_SDP /
IPPARAM_OPTION_ANSWER or IPSET_SDP / IPPARM_OPTION_OFFER parameter element
regardless of MIME body inclusion. This is consistent with connection establishment SDP
behavior in this mode, except that there is no offer/answer protocol enforcement in OPTIONS
transactions. Offer/answer protocol enforcement applies to media connection establishment
transactions.
When performing SIP OPTIONS transitions in 1PCC mode, the SDP information is delivered to
the application in the parameter block attached to the Global Call event as an IPSET_MIME /
IPPARM_MIME_PART_BODY parameter element regardless of MIME body inclusion.
Refer to Section 4.14, “Sending and Receiving SIP OPTIONS Messages”, on page 210 for more
information about enabling OPTIONS access
Figure 78 depicts the host application behavior when performing an OPTIONS request on an active
dialog. A MIME body is not attached in Figure 78:
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
369
Third Party Call Control (3PCC) Operations and Multimedia Support
Figure 78. OPTIONS Request without a MIME Body
Global Call
Library B
(IPCCLIB)
Global Call
Library A
(IPCCLIB)
Application A
Application B
gc_Extension
MSG_TYPE_SIP
_OPTIONS
OPTIONS
GCEV_EXTENSION
MSG_TYPE_SIP
_OPTIONS
GCEV
_EXTENSIONCMPLT
gc_Extension
MSG_TYPE_SIP
_OPTIONS_OK
IPSET_SDP
200 OK
SDP Capabilities1
GCEV_EXTENSION
MSG_TYPE_SIP
_OPTIONS
IPSET_SDP
GCEV_
EXTENSIONCMPLT
A GCEV_SIP_200_OK event
is not sent to the application
when a 200 OK is received
on an OPTIONS transaction.
SIP OPTIONS transactions
do not receive an ACK.
In third party call control mode, SDP is included
in the parameter block and attached to the meta-event as
IPSET_SDP/IPPARM_OPTIONS_ANSWER.
Note: There is no offer/answer protocol
enforcement in OPTIONS transactions.
5.4.7.2
With a MIME Body
Figure 79 depicts the host application behavior when performing an OPTIONS request on an active
dialog with the OPTIONS access enabled and a MIME body attached:
370
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
Third Party Call Control (3PCC) Operations and Multimedia Support
Figure 79. OPTIONS Request with a MIME Body
Application A
Global Call
Library B
(IPCCLIB)
Global Call
Library A
(IPCCLIB)
Application B
gc_Extension
MSG_TYPE_SIP_OPTIONS
IPSET_SDP
OPTIONS
MIME (SDP Capabilities 0)
GCEV_EXTENSION
MSG_TYPE_SIP_OPTIONS
IPPARM_MIME_PART_BODY(SDP)
IPSET_SDP
GCEV_EXTENSIONCMPLT
200 OK
MIME (SDP Capabilities 1)
GCEV_EXTENSION
MSG_TYPE_SIP_OPTIONS
IPPARM_MIME_PART_BODY(SDP)
IPSET_SDP
gc_Extension
MSG_TYPE_SIP_OPTIONS_OK
IPSET_SDP
GCEV_EXTENSIONCMPLT
A GCEV_SIP_200_OK event
is not sent to the application
when a 200 OK is received
on an OPTIONS transaction.
SIP OPTIONS transactions
do not receive an ACK.
5.5
Processing Intraframe Requests for Video Streams
This section provides information about processing intraframe requests for video streams. Topics
are as follows:
• Overview
• Requesting an I-Frame in SIP
• Global Call Example Code
5.5.1
Overview
When each frame of video is compressed separately, the type of compression is known as
“intraframe” or “spatial” compression. Intraframes, also known as I-frames (or I-Pictures), are
complete and independent. Video compression systems, however, typically utilize what is known
as “inter-frame” or “temporal” compression as well. Inter-frame compression takes advantage of
the fact that any given frame of video is most likely similar to the frames around it. So, instead of
storing entire frames, the coder implementation can store just the differences between certain
frames, reducing the amount of overall data that needs to be stored or transmitted. I-frames provide
a reference point for dependent Inter-frames (P pictures and B pictures) and allow random access
into the compressed video stream. When recording a video message, the first video frame stored
should ideally be an I-frame. This will insure that the playback will be begin with a visually
complete and recognizable frame.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
371
Third Party Call Control (3PCC) Operations and Multimedia Support
5.5.2
Requesting an I-Frame in SIP
SIP provides a way to request the transmission of an Intraframe as defined by the “expired” IETF
draft draft-levin-mmusic-xml-schema-media-control-03. The draft specification defines an XML
schema (shown below) that is attached as a MIME body to a SIP INFO message:
<?xml version="1.0" encoding="utf-8" ?>
<media_control>
<vc_primitive>
<to_encoder>
<picture_fast_update>
</picture_fast_update>
</to_encoder>
</vc_primitive>
</media_control>
The receiving SIP entity re-transmits an Intraframe and acknowledges the INFO message with a
200 OK message. This process is referred to as video picture fast-update.
5.5.3
Global Call Example Code
Note:
The Dialogic® Global Call API does not support sending of single-part MIME bodies in this
release. The following code example shows sending of a multi-part MIME body.
///////////////////////////////////////////////////////////////////////////////
bool CMMStream::SendIFrameRequest()
{
agwReport(INFO_MSG, s_eType, "SendIFrameRequest()");
GC_PARM_BLKP
gcParmBlk_mime = 0;
GC_PARM_BLKP
gcParmBlk_mime1 = 0;
GC_PARM_BLKP
gcParmBlk_info = 0;
bool bOk = true;
// specify the body type
char *pBodyType = "Content-Type:application/media_control+xml";
if (gc_util_insert_parm_ref(&gcParmBlk_mime,
IPSET_MIME,
IPPARM_MIME_PART_TYPE,
(unsigned char)
(strlen(pBodyType) + 1),
pBodyType) < 0)
{
agwReport(ERROR_GCALL, s_eType, "SendIFrameRequest() -> gc_util_insert_parm_ref()
failed on %s for IPPARM_MIME_PART_TYPE ", m_devName);
bOk = false;
}
// insert the body size
if (gc_util_insert_parm_val(&gcParmBlk_mime,
IPSET_MIME,
IPPARM_MIME_PART_BODY_SIZE,
sizeof(unsigned long),
strlen(c_iFrameRequest)) < 0)
{
agwReport(ERROR_GCALL, s_eType, "SendIFrameRequest() -> gc_util_insert_parm_val()
failed on %s for IPPARM_MIME_PART_BODY_SIZE ", m_devName);
bOk = false;
}
372
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
Third Party Call Control (3PCC) Operations and Multimedia Support
// insert the body
if (gc_util_insert_parm_val(&gcParmBlk_mime,
IPSET_MIME,
IPPARM_MIME_PART_BODY,
sizeof(unsigned long),
(unsigned long)(c_iFrameRequest)) < 0)
{
agwReport(ERROR_GCALL, s_eType, "SendIFrameRequest() -> gc_util_insert_parm_val()
failed on %s for IPPARM_MIME_PART_BODY ", m_devName);
bOk = false;
}
// insert the list of parmBlks into the top level parmBlk
if (gc_util_insert_parm_val(&gcParmBlk_mime1,
IPSET_MIME,
IPPARM_MIME_PART,
sizeof(unsigned long),
(unsigned long)gcParmBlk_mime) < 0)
{
agwReport(ERROR_GCALL, s_eType, "SendIFrameRequest() -> gc_util_insert_parm_val()
failed on %s for IPPARM_MIME_PART", m_devName);
bOk = false;
}
// now set it on the device
if (gc_SetUserInfo(GCTGT_GCLIB_CRN,
m_gcCurrentCrn,
gcParmBlk_mime1,
GC_SINGLECALL) < 0) // for this call only
{
agwReport(ERROR_GCALL, s_eType, "gc_SetUserInfo() failed on %s for MIME body in INFO");
bOk = false;
}
// insert the message type
if (gc_util_insert_parm_val(&gcParmBlk_info,
IPSET_MSG_SIP,
IPPARM_MSGTYPE,
sizeof(int),
IP_MSGTYPE_SIP_INFO) < 0)
{
agwReport(ERROR_GCALL, s_eType, "SendIFrameRequest() -> gc_util_insert_parm_val()
failed on %s for SIP INFO", m_devName);
bOk = false;
}
if (gc_Extension(GCTGT_GCLIB_CRN,
m_gcCurrentCrn,
IPEXTID_SENDMSG,
gcParmBlk_info,
NULL,
EV_ASYNC) < 0)
{
agwReport(ERROR_GCALL, s_eType, "SendIFrameRequest() -> gc_Extension failed");
bOk = false;
}
gc_util_delete_parm_blk(gcParmBlk_info);
gc_util_delete_parm_blk(gcParmBlk_mime);
return bOk;
}
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
373
Third Party Call Control (3PCC) Operations and Multimedia Support
374
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
Building Dialogic® Global Call API
IP Applications
6.
6
This chapter describes the IP-specific header files and libraries required when building
applications.
• Header Files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375
• Required Libraries . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375
• Required System Software . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376
Note:
6.1
For more information about building applications, see the Dialogic® Global Call API
Programming Guide.
Header Files
When compiling Dialogic® Global Call API applications for the IP technology, it is necessary to
include the following header files in addition to the standard Dialogic® Global Call API header
files, which are listed in the Dialogic® Global Call API Library Reference and Dialogic® Global
Call API Programming Guide:
gcip.h
IP-specific data structures
gcip_defs.h
IP-specific type definitions, error codes and IP-specific parameter set IDs and parameter IDs
gccfgparm.h
Dialogic® Global Call API type definitions, configurable parameters in the Dialogic® Global
Call API library and generic parameter set IDs and parameter IDs
gcipmlib.h
for Quality of Service (QoS) features
6.2
Required Libraries
When building Dialogic® Global Call API applications for the IP technology, it is not necessary to
link any libraries other than the standard Dialogic® Global Call API library, libgc.lib. Other
libraries, including IP-specific libraries, are loaded automatically.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
375
Building Dialogic® Global Call API IP Applications
6.3
Required System Software
The Dialogic® Host Media Processing (HMP) Software must be installed on the development
system. See the Dialogic® Software Installation Guide for your Dialogic® HMP Software release
for further information.
376
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
Debugging Dialogic® Global Call
API IP Applications
7.
7
This chapter provides information about debugging Dialogic® Global Call API IP applications:
• Debugging Overview . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
• Configuring the Logging Facility . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378
7.1
Debugging Overview
The Dialogic® Global Call API IP Call Control Library uses the RTF (Runtime Tracing Facility)
system that is used by other Dialogic® Software libraries to write underlying call control library
and stack information to a consolidated log file while an application is running. This information
can help trace the sequence of events and identify the source of a problem. This information is also
useful when reporting problems to technical support personnel.
All libraries and software modules that use RTF write their messages to a single, consolidated log
file, with the default name rftlog.txt. The log file may optionally have a date and time stamp
appended to the filename; for example, rtflog01052005-13h24m19.923s. When compared to the
multiple independent log files used in previous implementations of the IP Call Control library, the
consolidated log file has the advantage of clearly showing the time relationship of events associated
with different software modules without requiring developers to correlate event time stamps.
Note:
The SIP stack may also generate its own log file named sdplog.txt to capture any parsing errors that
may occur.
The RTF facility allows developers to configure which events are written to the log file based on
the importance of the event and the specific software module generating the event. All logging
configuration for all libraries and modules that use RTF (not just the IP Call Control Library) is
contained in a single, consolidated configuration file. This is in contrast to previous Global Call IP
library implementations which used multiple configuration files for the library and the two IP
protocol stacks.
The RTF facility uses the following entities to control which debug print statements are written to
the log file:
module
An RTF module corresponds to a library or software module that has internal RTF APIs
incorporated into its source code. Three separate RTF modules are used by the IP Call Control
library:
• gc_h3r – call control, signal handler, and signal adaptation layer software modules
• sip_stack – SIP protocol stack
• h323_stack – H.323 protocol stack
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
377
Debugging Dialogic® Global Call API IP Applications
client
An entity for identifying a device, component, or function that is to be traced by the RTF. The
RTF modules for the IP Call Control library include a large number of client entities to provide
a high degree of control over what statements are written to the log file; these clients are listed
in the following sections which describe how to configure the logging facility.
label
An attribute associated with a trace statement to categorize the type or level of the information
and to determine whether the statement is written to the log file. Labels are handled as
independent entities and must be enabled or disabled individually; this is in contrast to the
previous IP Call Control library logging implementation, where it was possible to enable log
output for multiple statement levels collectively. Different RTF modules use different subsets
of the overall RTF label set; the labels used for the IP Call Control library include only Error,
Warning, and Debug.
7.2
Configuring the Logging Facility
The following topics provide information about how the user can customize the information
written into the log file by the Global Call IP library:
• Configuration File Overview
• Configuring the gc_h3r Logging Module
• Configuring SIP Stack Logging
• Configuring H.323 Stack Logging
7.2.1
Configuration File Overview
This section describes how the common RTF configuration file is organized and what configuration
is set up in the default configuration file that is supplied with the release software. The default
configuration file may be named RtfConfig.xml or it may have an OS-specific name as appropriate
to the specific release (i.e., RtfConfigWin.xml or RtfConfigLinux.xml); for simplicity, this document
will only refer to the generic name. The entries in this configuration file conform to XML syntax
rules.
Global Section
The global section of the RtfConfig.xml file contains one or more “GLabel” elements, which are
used to globally enable logging of trace statements that are mapped to that RTF label. Globally
enabling or disabling a label affects all RTF modules, but the global setting may be overridden
locally.
The default RtfConfig.xml file globally enables the Error label, so that all error statements from all
RTF modules will be logged unless disabled locally. The statement that globally enables the Error
label is:
<GLabel name="Error" state="1"/>
378
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
Debugging Dialogic® Global Call API IP Applications
Module Sections
The RtfConfig.xml file contains a number of module sections, each of which controls the logging of
trace statements for a specific RTF module. Three RTF modules apply to the IP Call Control
library: gc_h3r, h323_stack, and sip_stack.
Each module section begins with a <Module> tag (with name and state attributes) and ends with a
</Module> tag. Between these two tags, the configuration file contains one or more “MLabel”
elements to locally enable or disable logging of the RTF labels that are used by the specific module.
The behavior of the “MLabel” elements for each of the RTF modules for the IP Call Control library
are described in the following sections of this chapter.
Client Entries
In addition to “MLabel” elements, a module section may also contain a number of “MClient”
elements for any clients that are defined within the module. Each of the three of the RTF modules
for the IP Call Control library include a number of MClient elements, as described in the following
sections of this chapter.
7.2.2
Configuring the gc_h3r Logging Module
The gc_h3r module controls logging of error and debug statements that related to the call control,
signal handling, and signal adaptation layer software modules of the IP Call Control library. These
statements were logged to the gc_h3r.log file in previous implementations.
The RTF gc_h3r module supports three user-maskable RTF labels: Error, Warning, and Debug.
This is in contrast to the previous non-RTF implementation of the GC_H3R module, which used
six debug levels. The old levels are mapped to the new labels as follows:
RTF Label (and default state)
Old GC_H3R Debug Levels
Error (globally enabled)
LEVEL_ERROR
Warning (locally enabled)
LEVEL_WARNING
Debug (locally disabled)
LEVEL_INFO, LEVEL_INFO_EXT, LEVEL_ALL
In addition to the five GC_H3R debug levels that are mapped to RTF labels, there is an additional
level, LEVEL_SPECIAL, which is not mapped to an RTF label and is therefore non-maskable.
Statements marked with LEVEL_SPECIAL are always printed to the log file.
The Error label is normally enabled globally. The Warning label is normally enabled locally, on the
module level. The Debug label is enabled and disabled on the module level, and if the label is
enabled the logging of these statements is controllable on an individual client basis.
The cg_h3r module in the RtfConfig.xml file begins with the statement:
<Module name="gc_h3r" state="1">
Following this statement are “MLabel” statements to set the local state of the Warning and Debug
labels. In the default RtfConfig.xml file, the Warning label is enabled (state="1") and the Debug
label is disabled (state="0").
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
379
Debugging Dialogic® Global Call API IP Applications
<MLabel name="Warning" state="1"/>
<MLabel name="Debug" state="0"/>
In the gc_h3r module, the “MLabel” statement for the Warning label enables or disables the
logging of all statements from the gc_h3r module that have LEVEL_WARNING in them
regardless of the state settings of the “MClient” elements. The “MLabel” statement for the Debug
label, on the other hand, interacts with the state settings of the “MClient” elements. Setting the state
of the Debug label to "0" disables all statements containing LEVEL_INFO, LEVEL_INFO_EXT,
or LEVEL_ALL, regardless of the MClient states. But setting the state of the Debug label to "1"
only enables these statements for software modules that have their client state to "1". By enabling
only the client modules are of interest in a given debug process, users can avoid the very large
output that would result if all low-level statements from all gc_h3r software modules are logged.
Note:
Enabling the Debug label while all of the gc_h3r clients are set to the enabled state may produce a
very large log file and may cause significant loading of the CPU.
The “MClient” statements for each software module in the gc_h3r module follow the “MLabel”
statements in the RtfConfig.xml file. The “MClient” statements are divided into four groups which
correspond to four functional groups covered by this logging module. The prefixes of the client
names also reflect this four-part grouping. A typical “MClient” statement looks like the following:
<MClient name="SH_CRN" state="1"/>
The following list gives the names and basic descriptions of the RTF clients in the GC_H3R
module along with the corresponding module names that were used in the previous, non-RTF
implementation of GC_H3R logging.
SH_CRN (formerly M_CRN)
Sharon Call Reference Number
SH_MGR (formerly M_SH_MAN)
Sharon Manager
SH_LD (formerly M_LD)
Sharon Line Device
SH_MEDIA (formerly M_MEDIA)
Sharon Media
SH_PDL (formerly M_PDL)
Sharon Platform Dependent Layer
SH_PACKER (formerly M_PACKER)
Sharon Packer
SH_DBASE (formerly M_SH_DB)
Sharon Database
SH_DECODER (formerly M_SH_DEC)
Sharon Decoder
SH_ENCODER (formerly M_SH_ENC)
Sharon Encoder
SH_IPC (formerly M_SH_IPC)
Sharon Inter-Process Communication
380
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
Debugging Dialogic® Global Call API IP Applications
SH_UNPACK (formerly M_SH_UNPACK)
Sharon Unpacker
SH_BOARD (formerly M_BOARD)
Sharon Board Device.
SH_MONITOR (formerly M-MON)
Sharon Manager (host LAN monitor)
H323_SIG_MGR (formerly M_SIG_MAN)
H.323 Signal Adaptation Layer (Sigal) Manager
H323_CALL_MGR (formerly M_CALL_MAN)
H.323 Call Manager
H323_SIGNAL (formerly M_SIGNAL)
H.323 Signaling
H323_CONTROL (formerly M_CONTROL)
H.323 Control
H323_CH_MGR (formerly M_CHAN_MAN)
H.323 Channel Manager
H323_CHANNEL (formerly M_CHAN)
H.323 Channel
H323_IE (formerly M_IE)
H.323 Information Elements
H323_SIG_DEC (formerly M_SIG_DEC)
H.323 Signal Adaptation Layer Decoder
H323_SIG_ENC (formerly M_SIG_ENC)
H.323 Signal Adaptation Layer Encoder
H323_SIG_IPC (formerly M_SIG_IPC)
H.323 Inter-Process Communication
H323_RAS (formerly M_RAS)
H.323 Registration and Administration
H323_CAPS (formerly M_CAPS)
H.323 Capabilities
SIP_SIGAL (formerly M_S_SIGAL)
SIP Signal Adaptation Layer (Sigal)
SIP_SALL_MGR (formerly M_S_CALLM)
SIP Call Manager
SIP_SIGNAL (formerly M_S_SIGNL)
SIP Signaling
SIP_CH_MGR (formerly M_S_CHMGR)
SIP Channel Manager
SIP_IE (formerly M_SIP_IE)
SIP Information Elements
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
381
Debugging Dialogic® Global Call API IP Applications
SIP_CAPS (formerly M_SIP_CAP)
SIP Capabilities
SIP_SIG_DEC (formerly M_SIP_DEC)
SIP Signal Adaptation Layer Decoder
SIP_SIG_ENC (formerly M_SIP_ENC)
SIP Signal Adaptation Layer Encoder
SIP_IPC (formerly M_SIP_IPC)
Inter-Process Communication
SIP_INFO (formerly M_INFO)
SIP Information
SIP_REFER (formerly M_REFER)
SIP Refer
SIP_PRACK (formerly M_PRACK)
SIP Protocol Acknowledgement
SIP_AUTHENT (formerly M_AUTHENT)
SIP Authenticator
SIP_SUBSYS (formerly M_S_SUBSM)
SIP Subsystem
COM_MEMMGR (formerly M_MEMMGR)
Common Memory Manager
COM_MIME (formerly M_MIME)
Common Mime
COM_R_MGR (formerly M_R_MGR)
Common “R” Manager
COM_MR_MGR (formerly M_MR_MGR)
Common “MR” Manager
7.2.3
Configuring SIP Stack Logging
The sip_stack RTF module controls logging of debug statements that relate to the SIP protocol
stack used by the IP Call control library. In previous implementations, this logging was configured
via the gc_h3r.cfg file and the statements were logged to the file gc_h3r.log.
Note:
The SIP stack may also generate its own log file named sdplog.txt to capture any parsing errors that
occur.
The sip_stack module supports two user-maskable RTF labels: Error and Debug. This is in contrast
to the previous non-RTF implementation of the GC_H3R module, which used five bit-encoded
debug levels. The old levels are mapped to the new labels as follows:
RTF Label (and default state)
382
Old SIP Debug Levels in GC_H3R
Error (globally enabled)
EXCEP, ERROR, WARN
Debug (locally disabled)
INFO, DEBUG
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
Debugging Dialogic® Global Call API IP Applications
The Error label is normally enabled globally. The Debug label is enabled and disabled on the
module level, and if the label is enabled the logging of these statements is controllable on an
individual client basis. The state of the Warning label has no effect on the sip_stack module.
The sip_stack module in the RtfConfig.xml file begins with the statement:
<Module name="sip_stack" state="1">
Following this statement is an “MLabel” statement to set the local state of the Debug label, which
is disabled (state="0") in the default RtfConfig.xml file:
<MLabel name="Debug" state="0"/>
The “MLabel” statement for the Debug label interacts with the state settings of the “MClient”
elements to enable or disable logging from the individual software modules of the SIP protocol
stack. Setting the state of the Debug label to "0" disables all debug statements from the SIP stack,
regardless of the states of the individual RTF clients. Setting the state of the Debug label to "1"
enables logging of debug statements for any stack modules that have their RTF client state to "1".
Note:
Enabling the Debug label while all of the sip_stack clients are set to the enabled state may produce
a very large log file and may cause significant loading of the CPU.
The “MClient” statements for each software module in the sip_stack module follow the “MLabel”
statement in the RtfConfig.xml file. A typical “MClient” statement in the RtfConfig.xml file looks
like the following, which enables logging for the MESSAGE client if the Debug label is enabled:
<MClient name="MESSAGE" state="1"/>
The names of the RTF clients in the sip_stack module (along with the module names used in the
previous GC_H3R logging implementation) include the following:
• MESSAGE (formerly RvSipStack_Message)
• TRANSPORT (formerly RvSipStack_Transport)
• TRANSACTION (formerly RvSipStack_Transaction)
• CALL (formerly RvSipStack_Call)
• PARSER (formerly RvSipStack_Parser)
• STACK (formerly RvSipStack_Stack)
• MSG BUILDER (formerly RvSipStack_MsgBuilder)
• AUTHENTICATOR (formerly RvSipStack_Authenticator)
• REG CLIENT (formerly RvSipStack_RegClient)
• SUBSCRIPTION
7.2.4
Configuring H.323 Stack Logging
The “h323_stack” RTF module controls logging of debug statements that relate to the H.323
protocol stack used by the IP Call control library. In previous implementations, this logging was
configured via the rvtele.ini file and the statements were logged to the file rvtsp1.log.
The h323_stack RTF module uses a single label, namely Debug. The states of the Error and
Warning labels have no effect on the h323_stack module.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
383
Debugging Dialogic® Global Call API IP Applications
The h323_stack module in the RtfConfig.xml file begins with the statement:
<Module name="h323_stack" state="1">
Following this statement is an “MLabel” statement to set the local state of the Debug label, which
is disabled (state="0") in the default RtfConfig.xml file:
<MLabel name="Debug" state="0"/>
The “MLabel” statement for the Debug label interacts with the state settings of the “MClient”
elements to enable or disable logging from the individual software modules of the H.323 protocol
stack. Setting the state of the Debug label to "0" disables all debug statements from the H.323
stack, regardless of the states of the individual RTF clients. Setting the state of the Debug label to
"1" enables logging of debug statements for any stack modules that have their RTF client state to
"1".
Note:
Enabling the Debug label while all of the h323_stack clients are set to the enabled state may
produce a huge log file and may cause heavy loading of the CPU.
The “MClient” statements for each software module in the h323_stack module follow the
“MLabel” statement in the RtfConfig.xml file. A typical “MClient” statement in the RtfConfig.xml
file looks like the following, which enables logging for the EMA stack module if the Debug label is
also enabled:
<MClient name="EMA" state="1"/>
The names of the RTF clients in the h323_stack module include the following (the † symbol marks
the clients that are most commonly used in debugging):
• EMA
• MEMORY
• RA
• CAT
• CM †
• CMAPI †
• CMAPICB †
• CMERR †
• TPKTCHAN †
• CONFIG †
• APPL
• FASTSTART †
• VT
• UNREG
• RAS †
• UDPCHAN
• TCP
• TRANSPORT
• ETIMER
384
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
Debugging Dialogic® Global Call API IP Applications
• PER †
• PERERR †
• Q931†
• Q931ERR
• LI
• TIMER
• ANNEXE
• SSEERR
• SSEAPI
• SSEAPICB
• SUPS
• SSCHAN
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
385
Debugging Dialogic® Global Call API IP Applications
386
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP-Specific Function Information
8.
8
Certain Dialogic® Global Call API functions have additional functionality or perform differently
when used with IP technology. The generic function descriptions in the Dialogic® Global Call API
Library Reference do not contain detailed information for any specific technology. Detailed
information in terms of the additional functionality or the difference in performance of those
functions when used with IP technology is contained in this chapter. The information provided in
this guide therefore must be used in conjunction with the information presented in the Dialogic®
Global Call API Library Reference to obtain the complete information when developing Dialogic®
Global Call API applications that use IP technology. IP-specific variances are described in the
following topics:
• Dialogic® Global Call API Functions Supported by IP . . . . . . . . . . . . . . . . . . . . . . . . 387
• IP-Specific Dialogic® Global Call API Functions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 394
• Dialogic® Global Call API Function Variances for IP . . . . . . . . . . . . . . . . . . . . . . . . . 444
• Dialogic® Global Call API States Supported by IP. . . . . . . . . . . . . . . . . . . . . . . . . . . . 495
• Dialogic® Global Call API Events Supported by IP . . . . . . . . . . . . . . . . . . . . . . . . . . . 495
Dialogic® Global Call API Functions Supported by
IP
8.1
Note:
Except for gc_Listen( ), gc_OpenEx( ), gc_ReleaseCallEx( ), gc_UnListen( ), all Global Call
functions that nominally support both the synchronous and asynchronous modes are supported in
asynchronous mode only when using the IP technology.
The following is a full list of Dialogic® Global Call API functions that indicates the level of
support when used with IP technology. The list indicates whether the function is supported, not
supported, or supported with variances.
gc_AcceptCall( )
Supported in asynchronous mode only, with variances described in Section 8.3.1,
“gc_AcceptCall( ) Variances for IP”, on page 444
gc_AcceptInitXfer( )
Supported with variances described in Section 8.3.2, “gc_AcceptInitXfer( ) Variances for IP”,
on page 445
gc_AcceptModifyCall( )
IP-specific function. See page 396 for full details.
gc_AcceptXfer( )
Supported with variances described in Section 8.3.3, “gc_AcceptXfer( ) Variances for IP”, on
page 446
gc_AlarmName( )
Supported
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
387
IP-Specific Function Information
gc_AlarmNumber( )
Supported
gc_AlarmNumberToName( )
Supported
gc_AlarmSourceObjectID( )
Supported
gc_AlarmSourceObjectIDToName( )
Supported
gc_AlarmSourceObjectName( )
Supported
gc_AlarmSourceObjectNameToID( )
Supported
gc_AnswerCall( )
Supported in asynchronous mode only, with variances described in Section 8.3.4,
“gc_AnswerCall( ) Variances for IP”, on page 447
gc_Attach( )
Not supported
gc_AttachResource( )
Supported in asynchronous mode only in 1PCC operating mode; not supported in 3PCC
operating mode
gc_BlindTransfer( )
Not supported
gc_CallAck( )
Supported in asynchronous mode only, with variances described in Section 8.3.5,
“gc_CallAck( ) Variances for IP”, on page 448
gc_CallProgress( )
Not supported
gc_CCLibIDToName( )
Supported
gc_CCLibNameToID( )
Supported
gc_CCLibStatus( )
Supported, but deprecated. Use gc_CCLibStatusEx( ).
gc_CCLibStatusAll( )
Supported, but deprecated. Use gc_CCLibStatusEx( ).
gc_CCLibStatusEx( )
Supported
gc_Close( )
Supported with variances described in Section 8.3.6, “gc_Close( ) Variances for IP”, on
page 448
388
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP-Specific Function Information
gc_CompleteTransfer( )
Not supported
gc_CRN2LineDev( )
Supported
gc_Detach( )
Supported in asynchronous mode only in 1PCC operating mode; not supported in 3PCC
operating mode
gc_DropCall( )
Supported in asynchronous mode only, with variances described in Section 8.3.7,
“gc_DropCall( ) Variances for IP”, on page 448
gc_ErrorInfo( )
Supported
gc_ErrorValue( )
Supported, but deprecated. Use gc_ErrorInfo( ).
gc_Extension( )
Supported in asynchronous mode only, with variances described in Section 8.3.8,
“gc_Extension( ) Variances for IP”, on page 449
gc_GetAlarmConfiguration( )
Supported
gc_GetAlarmFlow( )
Supported
gc_GetAlarmParm( )
Supported with variances described in Section 8.3.9, “gc_GetAlarmParm( ) Variances for IP”,
on page 451
gc_GetAlarmSourceObjectList( )
Supported
gc_GetAlarmSourceObjectNetworkID( )
Supported
gc_GetANI( )
Not supported
gc_GetBilling( )
Not supported
gc_GetCallInfo( )
Supported with variances described in Section 8.3.10, “gc_GetCallInfo( ) Variances for IP”, on
page 452
gc_GetCallProgressParm( )
Not supported
gc_GetCallState( )
Supported
gc_GetConfigData( )
Not supported
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
389
IP-Specific Function Information
gc_GetCRN( )
Supported
gc_GetCTInfo( )
Supported with variances described in Section 8.3.11, “gc_GetCTInfo( ) Variances for IP”, on
page 455
gc_GetDNIS( )
Not supported
gc_GetFrame( )
Not supported
gc_GetInfoElem( )
Not supported
gc_GetLineDev( )
Supported
gc_GetLineDevState( )
Not supported
gc_GetMetaEvent( )
Supported
gc_GetMetaEventEx( )
Supported (Windows extended asynchronous programming model only)
gc_GetNetCRV( )
Not supported
gc_GetNetworkH( )
Not supported
gc_GetParm( )
Not supported
gc_GetResourceH( )
Supported with variances described in Section 8.3.12, “gc_GetResourceH( ) Variances for IP”,
on page 455
gc_GetSigInfo( )
Not supported
gc_GetUserInfo( )
Not supported
gc_GetUsrAttr( )
Supported
gc_GetVer( )
Supported
gc_GetVoiceH( )
Not supported
gc_GetXmitSlot( )
Supported with variances described in Section 8.3.13, “gc_GetXmitSlot( ) Variances for IP”,
on page 455
390
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP-Specific Function Information
gc_HoldAck( )
Not supported
gc_HoldCall( )
Not supported
gc_HoldRej( )
Not supported
gc_InitXfer( )
Supported with variances described in Section 8.3.14, “gc_InitXfer( ) Variances for IP”, on
page 455
gc_InvokeXfer( )
Supported with variances described in Section 8.3.15, “gc_InvokeXfer( ) Variances for IP”, on
page 456
gc_LinedevToCCLIBID( )
Supported
gc_Listen( )
Supported with variances described in Section 8.3.16, “gc_Listen( ) Variances for IP”, on
page 460
gc_LoadDxParm( )
Not supported
gc_MakeCall( )
Supported in asynchronous mode only, with variances described in Section 8.3.17,
“gc_MakeCall( ) Variances for IP”, on page 460
gc_Open( )
Not supported
gc_OpenEx( )
Supported with variances described in Section 8.3.18, “gc_OpenEx( ) Variances for IP”, on
page 476
gc_QueryConfigData( )
Not supported
gc_RejectInitXfer( )
Supported with variances described in Section 8.3.19, “gc_RejectInitXfer( ) Variances for IP”,
on page 477
gc_RejectModifyCall( )
IP-specific function. See page 406 for full details.
gc_RejectXfer( )
Supported with variances described in Section 8.3.20, “gc_RejectXfer( ) Variances for IP”, on
page 478
gc_ReleaseCall( )
Not supported
gc_ReleaseCallEx( )
Supported with variances described in Section 8.3.21, “gc_ReleaseCallEx( ) Variances for IP”,
on page 478
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
391
IP-Specific Function Information
gc_ReqANI( )
Not supported
gc_ReqModifyCall( )
IP-specific function. See page 414 for full details.
gc_ReqMoreInfo( )
Not supported
gc_ReqService( )
Supported in asynchronous mode only, with variances described in Section 8.3.22,
“gc_ReqService( ) Variances for IP”, on page 479
gc_ResetLineDev( )
Supported in asynchronous mode only
gc_RespService( )
Supported in asynchronous mode only, with variances described in Section 8.3.23,
“gc_RespService( ) Variances for IP”, on page 482
gc_ResultInfo( )
Supported
gc_ResultMsg( )
Not supported
gc_ResultValue( )
Not supported
gc_RetrieveAck( )
Not supported
gc_RetrieveCall( )
Not supported
gc_RetrieveRej( )
Not supported
gc_SendMoreInfo( )
Not supported
gc_SetAlarmConfiguration( )
Supported
gc_SetAlarmFlow( )
Supported
gc_SetAlarmNotifyAll( )
Supported
gc_SetAlarmParm( )
Supported with variances described in Section 8.3.24, “gc_SetAlarmParm( ) Variances for IP”,
on page 483
gc_SetAuthenticationInfo( )
IP-specific function; see page 421 for complete information
gc_SetBilling( )
Not supported
392
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP-Specific Function Information
gc_SetCallingNum( )
Not supported
gc_SetCallProgressParm( )
Not supported
gc_SetChanState( )
Not supported
gc_SetConfigData( )
Supported in asynchronous mode only, with variances described in Section 8.3.25,
“gc_SetConfigData( ) Variances for IP”, on page 484
gc_SetEvtMask( )
Not supported
gc_SetInfoElem( )
Not supported
gc_SetParm( )
Not supported
gc_SetupTransfer( )
Not supported
gc_SetUserInfo( )
Supported with variances described in Section 8.3.26, “gc_SetUserInfo( ) Variances for IP”,
on page 487
gc_SetUsrAttr( )
Supported
gc_SipAck( )
IP-specific function. Supported in 3PCC operating mode only. See page 424 for full details.
gc_SndFrame( )
Not supported
gc_SndMsg( )
Not supported
gc_Start( )
Supported with variances described in Section 8.3.27, “gc_Start( ) Variances for IP”, on
page 491
gc_StartTrace( )
Not supported
gc_Stop( )
Supported with variances described in Section 8.3.28, “gc_Stop( ) Variances for IP”, on
page 494
gc_StopTrace( )
Not supported
gc_StopTransmitAlarms( )
Not supported
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
393
IP-Specific Function Information
gc_SwapHold( )
Not supported
gc_TransmitAlarms( )
Not supported
gc_UnListen( )
Supported with variances described in Section 8.3.29, “gc_UnListen( ) Variances for IP”, on
page 495
gc_util_copy_parm_blk( )
New supported function; see page 428 for full details
gc_util_delete_parm_blk( )
Supported
gc_util_find_parm( )
Supported
gc_util_find_parm_ex( )
New supported function; see page 430 for full details
gc_util_insert_parm_ref( )
Supported
gc_util_insert_parm_ref( )
New supported function; see page 433 for full details
gc_util_insert_parm_val( )
Supported
gc_util_next_parm( )
Supported
gc_util_next_parm_ex( )
New supported function; see page 436 for full details
gc_WaitCall( )
Supported in asynchronous mode only
8.2
IP-Specific Dialogic® Global Call API Functions
The API reference pages in this section describe the following Dialogic® Global Call API
functions that are specific to the use of IP technology:
• gc_AcceptModifyCall( )
• gc_RejectModifyCall( )
• gc_ReqModifyCall( )
• gc_SetAuthenticationInfo( )
• gc_SipAck( )
• gc_util_copy_parm_blk( )
• gc_util_find_parm_ex( )
• gc_util_insert_parm_ref_ex( )
394
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
IP-Specific Function Information
• gc_util_next_parm_ex( )
• INIT_GC_PARM_DATA_EXT( )
• INIT_IP_VIRTBOARD( )
• INIT_IPCCLIB_START_DATA( )
Note:
The new gc_util_..._ex( ) functions are backwards compatible with existing gc_util_...( ) functions
and may be used with any Dialogic® Global Call API technology, but IP call control is currently
the only technology where these functions must be used to support parameter data longer than 255
bytes. The same information on the gc_util_..._ex( ) functions is also presented in the Dialogic®
Global Call API Library Reference.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
395
gc_AcceptModifyCall( ) — accept proposed modification of call characteristics
gc_AcceptModifyCall( )
accept proposed modification of call characteristics
Name: int gc_AcceptModifyCall (crn, parmblkp, mode)
Inputs: CRN crn
• call reference number of call targeted for modification
GC_PARM_BLK *parmblkp
• pointer to GC_PARM_BLK which contains attributes of
call which are being accepted (optional in 1PCC mode)
unsigned long mode
• completion mode (EV_ASYNC)
Returns: 0 if successful
<0 if unsuccessful
Includes: gclib.h
Category: Call Modification
Mode: Asynchronous only
„ Description
The gc_AcceptModifyCall( ) function is used to accept a request from the network or remote party
to change one or more attributes of the current SIP dialog (call).
This function initiates a 200 OK response code to an incoming re-INVITE request (an INVITE
request on an established call), which has been indicated to the application as an unsolicited
GCEV_REQ_MODIFY_CALL event on the respective call object. The metaevent associated with
this event references a GC_PARM_BLK that contains parameter elements which communicate the
contents of the re-INVITE request to the application. The 200 OK response sent by this function
indicates acceptance of the change(s) proposed in the re-INVITE request.
The changes which may be accepted by the application include:
Note:
396
•
change in DTMF mode
•
additional or changed dialog signaling attributes (SIP header fields)
•
change in media session coder properties
•
change in media session direction (half duplex vs. full duplex vs. suspended streaming)
•
change in remote RTP address
The Dialogic® Global Call API library does not provide a mechanism for requesting a change in
RTP address, so requests to change the RTP address will only be received from remote endpoints
that are not using Global Call.
Parameter
Description
crn
call reference number of call targeted for modification
parmblkp
pointer to GC_PARM_BLK which contains call attributes that are being
accepted (optional in 1PCC operating mode)
mode
completion mode; must be EV_ASYNC
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
accept proposed modification of call characteristics — gc_AcceptModifyCall( )
The function returns either <0 (to indicate failure) or 0 depending only upon the validity of the
parameters. The function return does not indicate any status as to the success or failure of the
sending of the response message. The final result of the attempt to send the response is provided in
termination events.
First Party Call Control (1PCC) Mode
When an application receives a GCEV_REQ_MODIFY_CALL event, it must retrieve the
parameter elements from the associated metaevent and analyze them to determine whether the
proposed changes are acceptable before it calls gc_AcceptModifyCall( ).
In cases where one or more media sessions are present in an SDP offer within the re-INVITE, those
session proposals that are supported by the given media platform are indicated as Global Call
parameter elements associated with the GCEV_REQ_MODIFY_CALL event. Each proposed
media type is indicated by a separate parameter within the parameter block using the following:
GCSET_CHAN_CAPABILITY
IPPARM_LOCAL_CAPABILITY
• value = IP_CAPABILITY structure
For a symmetrical, full-duplex media proposal, at least two such parameters—one for transmit and
one for receive—are forwarded in the parameter block. For a half-duplex proposal or for an onhold request, there may be only a single parameter element with the given set of session attributes.
In addition to being informed of the media session proposals, the application is also informed of the
remote RTP transport addresses. Each RTP port that is proposed in an SDP offer received within a
re-INVITE (one per “m=” line) is indicated as a separate parameter within the parameter block
associated with the GCEV_REQ_MODIFY_CALL event. These remote RTP address parameters
are identified as follows:
IPSET_RTP_ADDRESS
IPPARM_REMOTE
• value = RTP_ADDR structure
Because SDP does not communicate RTCP ports, only RTP ports are exchanged; the RTCP port
will have the typical “plus one” offset from the RTP port.
To accept the changes to the dialog and media session exactly as proposed, the application calls
gc_AcceptModifyCall( ) with a NULL pointer as parmblkp.
An application can also formulate a specific SDP answer by inserting appropriate media session
parameter elements (GCSET_CHAN_CAPABILITY / IPPARM_LOCAL_CAPABILITY) into the
GC_PARM_BLK parameter block that it references in the gc_AcceptModifyCall( ) function call.
A full-duplex connection requires two such parameter elements, one for each direction. A halfduplex connection requires one parameter element with the direction field of the IP_CAPABILITY
structure set appropriately. Accepting an on-hold request requires a single parameter with the
proposed codec capability and one of the direction values that specifies inactive streaming.
If the capabilities to be used in the SDP answer—whether specified by the application or derived
from the initial INVITE—do not match the capabilities that were contained in the SDP offer (both
codec capability and direction), the library treats the situation as a rejection of the call modification
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
397
gc_AcceptModifyCall( ) — accept proposed modification of call characteristics
request. In this case, the library sends a 488 Not Acceptable Here response to the remote party to
terminate the re-INVITE, and generates a GCEV_REJECT_MODIFY_CALL event to notify the
application.
Note:
When accepting a codec change, the local endpoint’s properties are updated immediately when the
application calls this function; all outgoing packets use the new codec, and only incoming packets
that use the new codec will be accepted. This may produce a perceptible artifact (for example, a
click or a brief silence) until the remote endpoint receives the 200 OK response and changes its
codec.
Third Party Call Control (3PCC) Mode
An incoming re-INVITE request generally contains an SDP offer that includes one or more session
attributes that are different from those which were negotiated in the original INVITE dialog. A
third party call control application must extract the SDP from the metaevent associated with the
GCEV_REQ_MODIFY_CALL event as an IPSET_SDP/IPPARM_SDP_OFFER parameter (see
Section 5.2.2.2, “IPSET_SDP Parameter Set Identifier”, on page 345). The application must then
parse and analyze the SDP offer to determine whether it is acceptable.
If the SDP offer is acceptable, the third party call control application must construct an appropriate
SDP answer, then insert that answer into the GC_PARM_BLK referenced by parmblkp as an
IPSET_SDP/IPPARM_SDP_ANSWER parameter element.
„ Termination Events
GCEV_ ACCEPT_MODIFY_CALL
Successful termination event. Indicates that the 200OK response was successfully sent, and an
ACK reply has been received. In 1PCC mode, this event also indicates that the requested call
attribute change(s) has been performed locally.
GCEV_ACCEPT_MODIFY_CALL_FAIL
Unsuccessful termination event. Indicates that the signaling of the modification acceptance
response has failed. This could be caused by a failure in the message transport, a failure in the
attempt to change the call attribute, or the expiration of a response timer for the request. The
re-INVITE transaction is still in progress and the application may make another attempt to
respond via a new call to gc_AcceptModifyCall( ) or gc_RejectModifyCall( ). In 1PCC
mode, no modifications to the existing dialog or media session are performed and the current
state remains as it was prior to the incoming modification request.
GCEV_REJECT_MODIFY_CALL
Unsuccessful termination event. Indicates that the capabilities the application intended to
signal in the SDP answer do not match any of the capabilities that were received in the SDP
offer. This event implies that a 488 Not Acceptable Here final response was sent to the remote
UA and that an ACK has been received, meaning that the re-INVITE dialog is terminated. In
1PCC mode, no modifications to the existing dialog or media session are performed and the
current state remains as it was prior to the incoming modification request.
„ Cautions
•
398
This function is only supported when the value IP_T38_MANUAL_MODIFY_MODE has
been set for the IPSET_CONFIG / IPPARM_OPERATING_MODE parameter using the
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
accept proposed modification of call characteristics — gc_AcceptModifyCall( )
gc_SetConfigData( ) function. If this parameter value has not been set, the function call will
fail with an error value of IPERR_BAD_PARM.
•
Only one modification transaction can be pending in a call at any given time. Until the pending
re-INVITE has been accepted, rejected, or canceled, no additional re-INVITE can be sent by
either party.
•
Only one attempt to send a response to a re-INVITE request can be pending at a time. A
response must fail (as indicated by a failure termination event) before a new response is
attempted, otherwise the function call will fail.
•
The GCEV_REQ_MODIFY_CALL event will only arrive when a call is connected. But if the
call is dropped—either locally via gc_DropCall( ) or remotely as indicated by a
GCEV_DISCONNECTED event—before a response is initiated via gc_AcceptModifyCall( ),
the request is invalid and the response can no longer be sent.
•
The potential for glare situations exist with a CANCEL being received from the remote party
as the local application intends to send 200OK. If the library receives the CANCEL before the
gc_AcceptModifyCall( ), the function call fails because the re-INVITE dialog is terminated
and the application receives an informational GCEV_MODIFY_CALL_CANCEL event.
„ Errors
•
The function returns GC_ERROR if any of the parameters is invalid, if the call is not in the
connected state, if there is no re-INVITE request pending, or if the value of the configuration
parameter IPSET_CONFIG / IPPARM_OPERATING_MODE has not been set to
IP_T38_MANUAL_MODIFY_MODE in 1PCC operating mode. Use the gc_ErrorInfo( )
function to retrieve further information.
•
Upon receiving a GCEV_ACCEPT_MODIFY_FAIL event, use the gc_ResultInfo( ) function
to retrieve information about the failure event. See the “Error Handling” section in the
Dialogic® Global Call API Programming Guide. All Global Call error codes are defined in the
gcerr.h file while IP-specific error codes are specified in gcip_defs.h. On failure, no
modifications to the existing dialog or media session are performed and the current state
remains as it was prior to the attempting the modification request.
„ Example
The following code example illustrates how the gc_AcceptModifyCall( ) function is used in the
first party call control (1PCC) operating mode.
.
.
.
/* Dialogic Header Files */
#include <gcip.h>
#include <gclib.h>
.
.
.
/* SRL event handler: */
for (;;)
{
if (-1 != sr_waitevt(500))
}
process_event();
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
399
gc_AcceptModifyCall( ) — accept proposed modification of call characteristics
void process_event(void)
{
METAEVENT
metaevent;
GC_INFO
t_info;
/* Populate the metaEvent structure */
if(GC_SUCCESS != gc_GetMetaEvent(&metaevent))
/* process GlobalCall events */
if ((metaevent.flags & GCME_GC_EVENT) == 0)
return;
return;
switch (metaevent.evttype)
{
.
.
.
case GCEV_REQ_MODIFY_CALL: /* request to modify call attribute */
{
GC_PARM_BLKP parm_blkp = (GC_PARM_BLKP) metaEvent.extevtdatap;
GC_PARM_BLKP replyParmblkp = NULL;
GC_PARM_DATAP curParm = NULL;
IP_CAPABILITY cap;
RTP_ADDR rtp;
unsigned char proposal_accepted = FALSE;
while ((curParm = gc_util_next_parm(parm_blkp, curParm)) != NULL)
{
if ((curParm->set_ID == GCSET_CHAN_CAPABILITY) &&
(curParm->parm_ID == IPPARM_LOCAL_CAPABILITY))
{
memcpy(&cap, curParm->value_buf, curParm->value_size);
/* determine if capability is acceptable (logic not shown) */
if (isCapabilityAcceptable(cap) == TRUE)
{
/* insert parameter with accepted capability in parameter block reply */
/* (logic not shown) */
insertCapIntoReply(cap,replyParmblkp);
proposal_accepted = TRUE;
}
}
else if ((curParm->set_ID == IPSET_SIP_MSGINFO) &&
(curParm->parm_ID == IPPARM_SIP_HDR))
{
/* parse SIP header and make appropriate updates (logic not shown) */
proposal_accepted = TRUE;
}
else if ((curParm->set_ID == IPSET_RTP_ADDRESS) &&
(curParm->parm_ID == IPPARM_REMOTE))
{
memcpy(&rtp, curParm->value_buf, curParm->value_size);
if (isMediaReRouteAcceptable(rtp) == TRUE)
{
/* update RTP transport addresses in GUI (logic not shown) */
updateRTPGUI(&rtp);
proposal_accepted = TRUE;
}
}
}
/*
/*
/*
if
{
if proposal is acceptable accept the request
*/
format accepted attributes (i.e. media types) in a parmblk (optional, */
NULL if none) */
(proposal_accepted)
if (gc_AcceptModifyCall(crn, replyParmblkp, EV_ASYNC) < 0)
/* failure logic here*/
}
400
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
accept proposed modification of call characteristics — gc_AcceptModifyCall( )
else /* not acceptable so respond with SIP Client Error
*/
/* final response of 488 Not Acceptable Here
*/
if (gc_RejectModifyCall(crn,
IPEC_SIPReasonStatus488NotAcceptableHere,
EV_ASYNC) < 0)
/* failure logic here */
break;
}
case GCEV_ACCEPT_MODIFY_CALL:
.
.
.
/* notify user of changed attribute */
.
.
.
break;
case GCEV_ACCEPT_MODIFY_CALL_FAIL:
/* process failure to change attribute */
if (gc_ResultInfo(&metaevent, &t_info) < 0)
{
/* failure logic here */
}
/* process information contained in t_info */
/* can optionally call gc_RejectModifyCall( ) to retry */
.
.
.
break;
case GCEV_REJECT_MODIFY_CALL:
.
.
.
/* notify user of rejected attribute */
.
.
.
break;
case GCEV_REJECT_MODIFY_CALL_FAIL:
/* process failure to reject request */
if (gc_ResultInfo(&metaevent, &t_info) < 0)
{
/* failure logic here */
}
/* process information contained in t_info */
/* can optionally call gc_RejectModifyCall( ) to retry */
.
.
.
break;
.
.
.
} /* endof switch */
} /* endof process_event function */
The following code example illustrates how the gc_AcceptModifyCall( ) function is used in the
third party call control (3PCC) operating mode.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
401
gc_AcceptModifyCall( ) — accept proposed modification of call characteristics
// Assume application has enabled GCEV_200OK and GCEV_SIP_ACK eventing.
.
.
.
/* Dialogic Header Files */
#include <gcip.h>
#include <gclib.h>
.
.
.
/* SRL event handler: */
for (;;)
{
if (-1 != sr_waitevt(500))
process_event();
}
void process_event(void)
{
METAEVENT
metaevent;
GC_INFO
t_info;
/* Populate the metaEvent structure */
if(GC_SUCCESS != gc_GetMetaEvent(&metaevent))
/* process GlobalCall events */
if ((metaevent.flags & GCME_GC_EVENT) == 0)
return;
return;
switch (metaevent.evttype)
{
.
.
.
case GCEV_REQ_MODIFY_CALL: /* request to modify call attribute */
{
EXTENSIONEVTBLK *extblkp = metaevent.extevtdatap;
GC_PARM_BLKP parm_blkp = &extblkp->parmblk;
GC_PARM_DATA_EXT parm;
GC_PARM_BLKP replyParmblkp = NULL;
GC_PARM_DATAP curParm = NULL;
IP_CAPABILITY cap;
RTP_ADDR rtp;
int
frc;
bool
proposal_accepted;
GC_PARM_BLKP parm_blkp = metaeventp->extevtdatap;
INIT_GC_PARM_DATA_EXT(&parm);
frc = gc_util_find_parm_ex(parm_blkp,
(unsigned long)IPSET_SDP,
(unsigned long)IPPARM_SDP_OFFER,
&parm);
if (frc == GC_SUCCESS)
{
// Raw SDP is in memory location parm.pData and is
// of length parm.data_size.
char sdpResponse[1000];
int sdpResponseSize = 1000;
//
//
//
//
if
applicationModifyMedia(...) is a user supplied function
that analyzes the raw SDP; it starts the media and provides
a raw sdp answer for the remote endpoint if the media offer
is acceptable. This function is not supplied in this sample.
(applicationModifyMedia(parm.pData, parm.data_size
sdpResponse, &sdpResponseSize) == SUCCESS)
{
402
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
accept proposed modification of call characteristics — gc_AcceptModifyCall( )
frc = gc_util_insert_parm_ref_ex(replyParmblkp,
IPSET_SDP,
IPPARM_SDP_ANSWER,
sdpResponse,
sdpResponseSize);
if (frc != GC_SUCCESS)
{
// call application error handler to drop the call and log the error.
applicationHandleError(...);
break;
}
proposal_accepted = true;
}
}
else
{
// No SDP was present in re-Invite. This is a re-Invite delayed offer.
// This re-Invite will be rejected as this sample does not support
// delayed offer call scenario.
proposal_accepted = false;
}
/*
/*
/*
if
{
If proposal is acceptable then accept the request.
Format accepted attributes (i.e. raw sdp answer) in a parmblk
(optional, NULL if none).
(proposal_accepted)
*/
*/
*/
if (gc_AcceptModifyCall(crn, replyParmblkp, EV_ASYNC) < 0)
{
// Invoke the application error handler to drop the call
applicationHandleError(...);
}
gc_util_delete_parm_blk(replyParmblkp);
}
else
{
/* not acceptable so respond with SIP Client Error
*/
/* final response of 488 Not Acceptable Here
*/
if (gc_RejectModifyCall(crn,
IPEC_SIPReasonStatus488NotAcceptableHere,
EV_ASYNC) < 0)
{
// Invoke the application error handler to drop the call
applicationHandleError(...);
}
}
break;
}
case GCEV_ACCEPT_MODIFY_CALL:
.
.
.
/* notify user of changed attribute.
.
.
.
break;
*/
case GCEV_ACCEPT_MODIFY_CALL_FAIL:
/* process failure to change attribute */
if (gc_ResultInfo(&metaevent, &t_info) < 0)
{
/* failure logic here */
}
/* process information contained in t_info */
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
403
gc_AcceptModifyCall( ) — accept proposed modification of call characteristics
/* can optionally call gc_RejectModifyCall( ) to retry */
.
.
.
break;
case GCEV_REJECT_MODIFY_CALL:
.
.
.
/* notify user of rejected attribute */
.
.
.
break;
case GCEV_REJECT_MODIFY_CALL_FAIL:
/* process failure to reject request */
if (gc_ResultInfo(&metaevent, &t_info) < 0)
{
/* failure logic here */
}
/* process information contained in t_info */
/* can optionally call gc_RejectModifyCall( ) to retry */
.
.
.
break;
case GCEV_MODIFY_CALL_ACK:
// indication that re-invite was accepted (200 ok received ) by the remote endpoint.
// This metaevent may have an IPSET_SDP/IPPARM_SDP_OFFER or
// IPSET_SDP/IPPARM_SDP_ANSWER attached.
.
.
.
break;
case GCEV_SIP_200OK:
// indication that the library needs to send a SIP ACK.
// A parameter block containing a IPSET_SDP/IPPARM_SDP_ANSWER would be included
// in the gc_SipAck for an outbound invite/re-invite delayed offer call scenario.
if (gc_SipAck(crn, NULL, EV_ASYNC) != GC_SUCCESS)
{
// Invoke the application error handler to drop the call
applicationHandleError(...);
}
break;
case GCEV_SIP_ACK_FAIL:
// gc_SipAck completion metaevent indicating the Sip Ack could not be sent.
// Invoke the application error handler to drop the call.
applicationHandleError(...);
break;
case GCEV_SIP_ACK_OK:
// gc_SipAck completion metaevent indicating the Sip Ack was successfully sent.
// All is OK.
break;
404
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
accept proposed modification of call characteristics — gc_AcceptModifyCall( )
case GCEV_SIP_ACK:
// Unsolicited event indicating SIP ACK was received on an invite/re-invite request.
// This metaevent will contain an IPSET_SDP/IPPARM_SDP_ANSWER in an inbound
// invite/re-invite delayed offer call scenario.
.
.
.
break;
.
.
.
} /* endof switch */
} /* endof process_event function */
„ See Also
•
gc_RejectModifyCall( )
•
gc_ReqModifyCall( )
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
405
gc_RejectModifyCall( ) — reject proposed modification of call attributes
gc_RejectModifyCall( )
reject proposed modification of call attributes
Name: int gc_RejectModifyCall (crn, reason, mode)
Inputs: CRN crn
• call reference number of call targeted for modification
unsigned long reason
• reason for rejecting request to change call attribute
unsigned long mode
• completion mode (EV_ASYNC)
Returns: 0 if successful
<0 if unsuccessful
Includes: gclib.h
Category: Call Modification
Mode: Asynchronous only
„ Description
The gc_RejectModifyCall( ) function is used to reject a request from the network or remote party
to change an attribute of the current call.
This function initiates a 3xx thorough 6xx response code to an incoming re-INVITE request, as
indicated by an incoming GCEV_REQ_MODIFY_CALL event on the respective call object. The
actual response code that is sent is specified by the reason parameter.
Parameter
Description
crn
call reference number of the call targeted for modification; must match the
CRN contained in the GCEV_REQ_MODIFY_CALL event
reason
the reason for rejecting the request to modify call attributes, specified
using the IPEC_SIPReasonStatusXXX… symbolic defines for SIP reason
codes from 300 through 699. These symbols are defined in gcip_defs.h
and are listed in Section 11.5, “Failure Response Codes When Using SIP”,
on page 584.
mode
must be EV_ASYNC
The function returns either <0 (to indicate failure) or 0, depending only upon the validity of the
parameters. The function return does not indicate any status as to the success or failure of the
sending of the rejection response message. The final result of sending the response is provided to
the application in termination events.
„ Termination Events
GCEV_REJECT_MODIFY_CALL
Successful termination event. Indicates that rejection of the received re-INVITE request has
completed successfully. This event implies that the specified 3xx through 6xx response was
sent and that an ACK was received from the remote party. In 1PCC mode, the requested call
406
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
reject proposed modification of call attributes — gc_RejectModifyCall( )
attribute modifications are not performed and the call state remains as it was prior to receiving
the incoming re-INVITE request.
GCEV_REJECT_MODIFY_CALL_FAIL
Unsuccessful termination event. Indicates that the signaling of the rejection response failed.
The re-INVITE transaction is still in progress and the application may make another attempt to
respond via a new call to gc_AcceptModifyCall( ) or gc_RejectModifyCall( ). In 1PCC
mode, no modifications to the existing dialog or media session are performed and the current
state remains as it was prior to receiving the incoming re-INVITE request.
„ Cautions
•
This function is only supported when the value of the parameter IPSET_CONFIG /
IPPARM_OPERATING_MODE has been set to IP_T38_MANUAL_MODIFY_MODE using
the gc_SetConfigData( ) function. If this parameter value has not been set, the function call
will fail with an error value of IPERR_BAD_PARM.
•
Only one modification transaction can be pending in a call at any given time. Until the pending
re-INVITE has been accepted, rejected, or canceled no additional re-INVITE can be sent by
either party.
•
A GCEV_REQ_MODIFY_CALL event can only arrive when a call is connected. But if the
call is dropped—either locally via gc_DropCall( ) or remotely as indicated by a
GCEV_DISCONNECTED event—before a response is initiated via gc_RejectModifyCall( ),
the request is invalid and the response can no longer be sent.
•
Only one attempt to respond to a re-INVITE request can be pending at a time. A response
attempt must fail (as indicated by a failure termination event) before a new response is
attempted, otherwise the function call will fail.
„ Errors
•
The function returns GC_ERROR if any of the parameters is invalid, if the call is not in the
connected state, if there is no pending re-INVITE request, or if the value of the configuration
parameter IPSET_CONFIG / IPPARM_OPERATING_MODE has not been set to
IP_T38_MANUAL_MODIFY_MODE in 1PCC operating mode. Use the gc_ErrorInfo( )
function to retrieve further information.
•
Upon receiving a GCEV_REJECT_MODIFY_CALL_FAIL event, use the gc_ResultInfo( )
function to retrieve information about the event. See the “Error Handling” section in the
Dialogic® Global Call API Programming Guide. All Global Call error codes are defined in the
gcerr.h file while IP-specific error codes are specified in gcip_defs.h. On failure, no
modifications to the existing dialog or media session are performed and the current state
remains as it was prior to the incoming modification request.
„ Example
The following code example illustrates how the gc_RejectModifyCall( ) function is used in first
party call control (1PCC) operating mode.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
407
gc_RejectModifyCall( ) — reject proposed modification of call attributes
.
.
.
/* Dialogic Header Files */
#include <gcip.h>
#include <gclib.h>
.
.
.
/* SRL event handler: */
for (;;)
{
if (-1 != sr_waitevt(500))
}
process_event();
void process_event(void)
{
METAEVENT
metaevent;
GC_INFO
t_info;
/* Populate the metaEvent structure */
if(GC_SUCCESS != gc_GetMetaEvent(&metaevent))
return;
/* process GlobalCall events */
if ((metaevent.flags & GCME_GC_EVENT) == 0) return;
switch (metaevent.evttype)
{
.
.
.
case GCEV_REQ_MODIFY_CALL: /* request to modify call attribute */
{
GC_PARM_BLKP parm_blkp = (GC_PARM_BLKP) metaEvent.extevtdatap;
GC_PARM_BLKP replyParmblkp = NULL;
GC_PARM_DATAP curParm = NULL;
IP_CAPABILITY cap;
RTP_ADDR rtp;
unsigned char proposal_accepted = FALSE;
while ((curParm = gc_util_next_parm(parm_blkp, curParm)) != NULL)
{
if ((curParm->set_ID == GCSET_CHAN_CAPABILITY) &&
(curParm->parm_ID == IPPARM_LOCAL_CAPABILITY))
{
memcpy(&cap, curParm->value_buf, curParm->value_size);
/* determine if capability is acceptable (logic not shown) */
if (isCapabilityAcceptable(cap) == TRUE)
{
/* insert parameter with accepted capability in parameter block reply */
/* (logic not shown) */
insertCapIntoReply(cap,replyParmblkp);
proposal_accepted = TRUE;
}
else if ((curParm->set_ID == IPSET_SIP_MSGINFO) &&
(curParm->parm_ID == IPPARM_SIP_HDR))
{
/* parse SIP header and make appropriate updates (logic not shown) */
proposal_accepted = TRUE;
}
else if ((curParm->set_ID == IPSET_RTP_ADDRESS) &&
(curParm->parm_ID == IPPARM_REMOTE))
{
memcpy(&rtp, curParm->value_buf, curParm->value_size);
if (isMediaReRouteAcceptable(rtp) == TRUE)
{
/* update RTP transport addresses in application (logic not shown) */
408
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
reject proposed modification of call attributes — gc_RejectModifyCall( )
updateRTPGUI(&rtp);
proposal_accepted = TRUE;
}
}
}
/*
/*
/*
if
{
if proposal is acceptable accept the request */
format accepted attributes (i.e. media types) in a parmblk (optional, */
NULL if none) */
(proposal_accepted)
if (gc_AcceptModifyCall(crn, replyParmblkp, EV_ASYNC) < 0)
/* failure logic here */
}
else /* not acceptable so respond with SIP Client Error */
/* final response of 488 Not Acceptable Here
*/
if (gc_RejectModifyCall(crn,
IPEC_SIPReasonStatus488NotAcceptableHere,
EV_ASYNC) < 0)
/* failure logic here */
break;
}
case GCEV_ACCEPT_MODIFY_CALL:
.
.
.
/* notify user of changed attribute */
.
.
.
break;
case GCEV_ACCEPT_MODIFY_CALL_FAIL:
/* process failure to change attribute */
if (gc_ResultInfo(&metaevent, &t_info) < 0)
/* failure logic here */
/* process information contained in t_info */
/* can optionally call gc_RejectModifyCall( ) to retry */
.
.
.
break;
case GCEV_REJECT_MODIFY_CALL:
.
.
.
/* notify user of rejected attribute */
.
.
.
break;
case GCEV_REJECT_MODIFY_FAIL:
/* process failure to reject request */
if (gc_ResultInfo(&metaevent, &t_info) < 0)
/* failure logic here */
/* process information contained in t_info */
/* can optionally call gc_RejectModifyCall( ) to retry */
.
.
.
break;
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
409
gc_RejectModifyCall( ) — reject proposed modification of call attributes
.
.
.
} /* endof switch */
} /* endof process_event function */
The following code example illustrates how the gc_RejectModifyCall( ) function is used in third
party call control (3PCC) operating mode.
// Assume application has enabled GCEV_200OK and GCEV_SIP_ACK eventing.
.
.
.
/* Dialogic Header Files */
#include <gcip.h>
#include <gclib.h>
.
.
.
/* SRL event handler: */
for (;;)
{
if (-1 != sr_waitevt(500)) process_event();
}
void process_event(void)
{
METAEVENT
metaevent;
GC_INFO
t_info;
/* Populate the metaEvent structure */
if(GC_SUCCESS != gc_GetMetaEvent(&metaevent)) return;
/* process GlobalCall events */
if ((metaevent.flags & GCME_GC_EVENT) == 0)
return;
switch (metaevent.evttype)
{
.
.
.
case GCEV_REQ_MODIFY_CALL: /* request to modify call attribute */
{
EXTENSIONEVTBLK *extblkp = metaevent.extevtdatap;
GC_PARM_BLKP parm_blkp = &extblkp->parmblk;
GC_PARM_BLKP replyParmblkp = NULL;
GC_PARM_DATA_EXT parm;
GC_PARM_DATAP curParm = NULL;
IP_CAPABILITY cap;
RTP_ADDR rtp;
int
frc;
bool
proposal_accepted;
GC_PARM_BLKP parm_blkp = metaeventp->extevtdatap;
INIT_GC_PARM_DATA_EXT(&parm);
frc = gc_util_find_parm_ex(parm_blkp,
(unsigned long)IPSET_SDP,
(unsigned long)IPPARM_SDP_OFFER,
&parm);
if (frc == GC_SUCCESS)
{
// Raw SDP is in memory location parm.pData and is
// of length parm.data_size.
char sdpResponse[1000];
int sdpResponseSize = 1000;
410
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
reject proposed modification of call attributes — gc_RejectModifyCall( )
//
//
//
//
if
applicationModifyMedia is a user supplied function
that analyzes the raw SDP; it starts the media and provides
a raw sdp answer for the remote endpoint if the media offer
is acceptable. This function is not supplied in this sample.
(applicationModifyMedia(parm.pData, parm.data_size
sdpResponse, &sdpResponseSize) == SUCCESS)
{
frc = gc_util_insert_parm_ref_ex(&replyParmblkp,
IPSET_SDP,
IPPARM_SDP_ANSWER,
sdpResponse
sdpResponseSize);
if (frc != GC_SUCCESS)
{
// call application error handler to drop the call and log the error.
applicationHandleError(...);
break;
}
proposal_accepted = true;
}
}
else
{
// No SDP was present in re-Invite. This is a re-Invite delayed offer.
// This re-Invite will be rejected as this sample does not support
// delayed offer call scenario.
proposal_accepted = false;
}
/*
/*
/*
if
{
if proposal is acceptable then accept the request.
Format accepted attributes (i.e. raw sdp answer) in a parmblk
(optional, NULL if none).
(proposal_accepted)
*/
*/
*/
if (gc_AcceptModifyCall(crn, replyParmblkp, EV_ASYNC) < 0)
{
// Invoke the application error handler to drop the call
applicationHandleError(...);
}
gc_util_delete_parm_blk(replyParmblkp);
}
else
{
/* not acceptable so respond with SIP Client Error */
/* final response of 488 Not Acceptable Here
*/
if (gc_RejectModifyCall(crn,
IPEC_SIPReasonStatus488NotAcceptableHere,
EV_ASYNC) < 0)
{
// Invoke the application error handler to drop the call
applicationHandleError(...);
}
}
break;
}
case GCEV_ACCEPT_MODIFY_CALL:
.
.
.
/* notify user of changed attribute */
.
.
.
break;
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
411
gc_RejectModifyCall( ) — reject proposed modification of call attributes
case GCEV_ACCEPT_MODIFY_CALL_FAIL:
/* process failure to change attribute */
if (gc_ResultInfo(&metaevent, &t_info) < 0)
{
/* failure logic here */
}
/* process information contained in t_info */
/* can optionally call gc_RejectModifyCall( ) to retry */
.
.
.
break;
case GCEV_REJECT_MODIFY_CALL:
.
.
.
/* notify user of rejected attribute */
.
.
.
break;
case GCEV_REJECT_MODIFY_FAIL:
/* process failure to reject request */
if (gc_ResultInfo(&metaevent, &t_info) < 0)
{
/* failure logic here */
}
/* process information contained in t_info */
/* can optionally call gc_RejectModifyCall( ) to retry */
.
.
.
break;
case GCEV_MODIFY_CALL_ACK:
// indication that re-invite was accepted (200 ok received ) by the remote endpoint.
// This metaevent may have an IPSET_SDP/IPPARM_SDP_OFFER or
// IPSET_SDP/IPPARM_SDP_ANSWER attached.
.
.
.
break;
case GCEV_SIP_200OK:
// indication that the library needs to send a SIP ACK.
// A parameter block containing a IPSET_SDP/IPPARM_SDP_ANSWER would be included
// in the gc_SipAck for an outbound invite/re-invite delayed offer call scenario.
if (gc_SipAck(crn, NULL, EV_ASYNC) != GC_SUCCESS)
{
// call application error handler to drop the call
applicationHandleError(...);
}
break;
case GCEV_SIP_ACK_FAIL:
// gc_SipAck completion metaevent indicating the Sip Ack could not be sent.
// Invoke the application error handler to drop the call.
applicationHandleError(...);
break;
case GCEV_SIP_ACK_OK:
// gc_SipAck completion metaevent indicating the Sip Ack was successfully sent
break;
412
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
reject proposed modification of call attributes — gc_RejectModifyCall( )
case GCEV_SIP_ACK:
// unsolicited event indicating SIP ACK was received on invite request.
// This metaevent Will contain an IPSET_SDP/IPPARM_SDP_ANSWER in a inbound
// invite/reinvite delayed offer call scenario.
.
.
.
break;
.
.
.
} /* endof switch */
} /* endof process_event function */
„ See Also
•
gc_AcceptModifyCall( )
•
gc_ReqModifyCall( )
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
413
gc_ReqModifyCall( ) — request modification of call attributes
gc_ReqModifyCall( )
request modification of call attributes
Name: int gc_ReqModifyCall (crn, parmblkp, mode)
Inputs: CRN crn
• call reference number of call targeted for modification
GC_PARM_BLK *parmblkp
• pointer to GC_PARM_BLK which contains attributes of
call requested for modifying
unsigned long mode
• completion mode (EV_ASYNC)
Returns: 0 if successful
<0 if unsuccessful
Includes: gclib.h
Category: Call Modification
Mode: Asynchronous
„ Description
The gc_ReqModifyCall( ) function is used to initiate a request to the network or remote party to
change an attribute of the current SIP call.
This function initiates a subsequent INVITE (also known as a re-INVITE) request in the context of
a current dialog (connected call). The re-INVITE can be used to change signaling headers, one or
more attributes of the media session, or the DTMF mode. This function is also used to cancel a
pending re-INVITE that the application previously initiated.
Parameter
Description
crn
call reference number of call targeted for modification
parmblkp
pointer to GC_PARM_BLK which contains attributes of call requested for
modifying. In 1PCC mode, this parameter block may contain a
combination of SIP header fields and Global Call channel capabilities that
will be inserted into the SDP offer that the library formulates. The
parameter block may also contain a parameter element to change the
DTMF mode of the call. In 3PCC mode, this parameter block may contain
a combination of one or more SIP header fields and an SDP offer
explicitly constructed by the third party call control application.
mode
must be EV_ASYNC
The function returns either <0 (to indicate failure) or 0, depending only upon the validity of the
parameters. The function return does not indicate any status as to the success or failure of the
sending of the re-INVITE request message. The final result of the attempt to send the request is
provided in termination events.
The parameters elements contained in the GC_PARM_BLK that is passed to this function
determine the contents of the re-INVITE request message. A special parameter element is also
defined to cancel a pending re-INVITE request.
414
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
request modification of call attributes — gc_ReqModifyCall( )
To set one or more message header fields in the re-INVITE request, the application inserts into the
GC_PARM_BLK a parameter of the following form for each header field to be set:
IPSET_SIP_MSGINFO
IPPARM_SIP_HDR
• value = string representing the complete header field, including field name
Most SIP header fields that are valid in an INVITE request can be modified in a re-INVITE request
without restriction. The most notable exceptions to this generalization are the Call-ID header and
the URI and Tag in the To and From headers, which RFC 3261 specifies must match the headers in
the original INVITE request. The following table specifies the header fields that are subject to
restrictions or that are automatically populated by the SIP stack.
Header Field
Modifiable Parameters
Restricted
Parameters
Automatically Populated Information
Call-ID
None
All
All
Contact
All
None
If not specified, copied from last INVITE or
2xx response transmitted in current dialog
CSeq
None
All
All
From
Display, URI parameters
except: user, ttl, method,
maddr
URI, Tag
URI, Tag
Max-Forwards
All
None
If not specified, 70
To
Display, URI parameters
except: user, ttl, method,
maddr
URI, Tag
URI, Tag
Via
All
None
If not specified, copied from last INVITE or
2xx response transmitted in current dialog
To request a change in the attributes of a media session, the application uses the same parameter
mechanism that is used when offering a session invitation via gc_MakeCall( ). The application
inserts into the GC_PARM_BLK one or more parameter of the following form:
GCSET_CHAN_CAPABILITY
IPPARM_LOCAL_CAPABILITY
• value = IP_CAPABILITY structure containing the details of the proposed media session,
including capability (transcoder type) and direction
To modify the media attributes for a full-duplex connection, the application must insert at least two
of these parameters, one for each direction, with the appropriate value set in the direction field of
each IP_CAPABILITY structure. All fields in each IP_CAPABILITY structure must be fully
specified even if only one characteristic is actually being changed (for example, if only the
direction field is being modified to place a call on hold). If no media capability parameters are
inserted into the GC_PARM_BLK, the library automatically includes the last SDP answer from the
dialog when it constructs the re-INVITE request.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
415
gc_ReqModifyCall( ) — request modification of call attributes
To request a change in the attributes of a media session in 3PCC mode, a call control application
explicitly constructs an SDP offer containing the desired new attributes, and then inserts it into the
GC_PARM_BLK as a parameter element of the following type (see Section 5.2.2.2, “IPSET_SDP
Parameter Set Identifier”, on page 345 for more details):
IPSET_SDP
IPPARM_SDP_OFFER
• value = properly constructed SDP offer
To request a change in the DTMF mode, the application inserts into the GC_PARM_BLK a
parameter element of the following type:
IPSET_DTMF
IPPARM_SUPPORT_DTMF_BITMASK
• value = IP_DTMF_TYPE_INBAND_RTP or IP_DTMF_TYPE_RFC_2833
To cancel a pending re-INVITE request, the application inserts into the GC_PARM_BLK the
following parameter:
IPSET_MSG_SIP
IPPARM_SIP_METHOD
• value = IP_MSGTYPE_SIP_CANCEL, size = sizeof(int)
Note: When using this parameter value, this must be the only parameter element inserted
into the GC_PARM_BLK.
„ Termination Events
GCEV_ MODIFY_CALL_ACK
Successful termination event for call modification request. Indicates that the network or
remote party accepted and acknowledged the request with a 200OK, and that the library has
acknowledged the 200OK. In 1PCC mode, this event also indicates that any media changes
that were proposed and accepted have been completed.
GCEV_MODIFY_CALL_REJ
Unsuccessful termination event for call modification request, indicating that the request was
rejected. The network or remote party declined and rejected the request by sending a 3xx, 4xx,
5xx, or 6xx response code in reply to the re-INVITE, and the library automatically sent an
ACK. The specific response code can be retrieved from the Global Call METAEVENT by
calling gc_ResultInfo( ). If the response code from the remote party was a 408 Request
Timeout or 481 Dialog/Transaction Does Not Exist, the call that was being modified is
disconnected automatically, and a GCEV_DISCONNECTED event is generated to the
application. For all other response codes, no modifications to the existing dialog or media
session are performed and the current state remains as it was prior to the attempting the
modification request.
GCEV_MODIFY_CALL_FAIL
Unsuccessful termination event for call modification request, indicating that the signaling of
the request failed. Some possible reasons include a failure in the message transport, a timeout
awaiting the response from the network or remote party, attempting to modify a call which is
not currently connected, or attempting to initiate a request to modify a call while another
modify request transaction is still pending. More specific information can be retrieved from the
Global Call METAEVENT by calling gc_ResultInfo( ). On failure, no modifications to the
416
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
request modification of call attributes — gc_ReqModifyCall( )
existing dialog or media session are performed and the current state remains as it was prior to
the attempting the modification request.
GCEV_CANCEL_MODIFY_CALL
Successful termination event for a request to cancel a pending call modification request.
Indicates that the remote UA accepted the CANCEL method and sent a 200OK, and the library
automatically sent an ensuing ACK. The previously sent re-INVITE dialog is terminated and
no attribute changes are performed. In this case the application will not receive a termination
event for the original gc_ReqModifyCall( ) call (the one which initiated the re-INVITE
dialog).
GCEV_CANCEL_MODIFY_CALL_FAIL
Unsuccessful termination event for a request to cancel a pending call modification request.
Indicates that the signaling of the CANCEL method failed, likely due to invalid state, such as
having received a final 2xx-6xx response to the subject re-INVITE. In this case, the
application will receive a termination event for the prior gc_ReqModifyCall( ) call (either
before or after this event) to indicate the successful or failed outcome of original re-INVITE
transaction.
„ Cautions
•
This function is only supported when the value of the parameter IPSET_CONFIG /
IPPARM_OPERATING_MODE has been set to IP_T38_MANUAL_MODIFY_MODE using
the gc_SetConfigData( ) function. If this parameter value has not been set, the function call
will fail with an error value of IPERR_BAD_PARM.
•
Only asynchronous mode is supported. Calling the function in synchronous mode will fail and
return an error value of GC_ERROR while setting CCLIB error to IPERR_BAD_PARAM.
•
This function can only be called in the connected call state. If the CRN is not valid, the
function fails and returns GC_ERROR while setting CCLIB error to IPERR_BAD_PARAM.
•
Only one re-INVITE transaction can be pending in a call at any given time. Any re-INVITE
transaction previously issued on the call must terminate (as indicated by a termination event)
before a new one is initiated, otherwise the function will fail.
„ Errors
•
The function returns GC_ERROR (with CCLIB error set to IPERR_BAD_PARM) if the CRN
is not valid, if the mode is not set to EV_ASYNC, or if the value of the configuration
parameter IPSET_CONFIG / IPPARM_OPERATING_MODE has not been set to
IP_T38_MANUAL_MODIFY_MODE in 1PCC operating mode.
•
Upon receiving a termination event that indicates a failure, use the gc_ResultInfo( ) function
to retrieve information about the event. See the “Error Handling” section in the Dialogic®
Global Call API Programming Guide. All Global Call error codes are defined in the gcerr.h
file while IP-specific error codes are specified in gcip_defs.h.
„ Example
The first code example illustrates an application requesting the current media session be changed to
G.729 to limit bandwidth consumption.
The following code illustrates how this coder change is initiated in the first party call control
(1PCC) operating mode using the gc_ReqModifyCall( ) function.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
417
gc_ReqModifyCall( ) — request modification of call attributes
.
.
/* Dialogic Header Files */
#include <gcip.h>
#include <gclib.h>
.
.
.
/* Request remote SIP client to change call to G.729:
/* Assumes: 1) caller has verified call to be in connected state
/*
2) caller has enabled event handler for GCEV_MODIFY_CALL_ACK,
/*
GCEV_MODIFY_CALL_REJ, and GCEV_MODIFY_CALL_FAIL.
*/
*/
*/
*/
int reqChangeToG729(CRN crn)
{
IP_CAPABILITY
ipcap;
GC_PARM_BLK
*parmblkp = NULL;
memset(&ipcap, 0, sizeof(IP_CAPABILITY));
ipcap.capability = GCCAP_AUDIO_g729;
ipcap.type = GCCAPTYPE_AUDIO;
ipcap.extra.audio.frames_per_pkt = 1;
ipcap.extra.audio.VAD = 0;
/* Specify TX direction */
ipcap.direction = IP_CAP_DIR_LCLTRANSMIT;
/* append the GC_PARM_BLK with the respective local TX codec */
gc_util_insert_parm_ref(&parmblkp,
GCSET_CHAN_CAPABILITY,
IPPARM_LOCAL_CAPABILITY,
sizeof(IP_CAPABILITY),
&ipcap);
if (NULL == parmblkp) return FAILURE;
/* Specify local RX direction */
ipcap.direction = IP_CAP_DIR_LCLRECEIVE;
/* append the GC_PARM_BLK with the respective RX codec */
gc_util_insert_parm_ref(&parmblkp,
GCSET_CHAN_CAPABILITY,
IPPARM_LOCAL_CAPABILITY,
sizeof(IP_CAPABILITY),
&ipcap);
if (NULL == parmblkp) return FAILURE;
if (gc_ReqModifyCall(crn, parmblkp, EV_ASYNC) < 0)
return FAILURE;
gc_util_delete_parm_blk(parmblkp);
} /* End of function. */
The following code illustrates how this coder change is initiated in the third party call control
(3PCC) operating mode using the gc_ReqModifyCall( ) function.
.
.
.
/* Dialogic Header Files */
#include <gcip.h>
#include <gclib.h>
.
.
.
418
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
request modification of call attributes — gc_ReqModifyCall( )
/* Request remote SIP client to change call to G.729:
/* Assumes: 1) caller has verified call to be in connected state
int reqChangeToG729(CRN crn)
{
GC_PARM_BLK
*parmblkp = NULL;
*/
*/
char sdpG729[] =
"v=0\r\n" \
"o=Dialogic_IPCCLib 146430240 146430241 IN IP4 169.254.00.01\r\n" \
"s=Dialogic_SIP_CCLLIB\r\n" \
"i=session information\r\n" \
"c=IN IP4 169.254.00.01\r\n" \
"t=0 0\r\n" \
"m=audio 2002 RTP/AVP 18\r\n" \
"a=ptime:10\r\n";
frc = gc_util_insert_parm_ref_ex(&parmblkp,
IPSET_SDP,
IPPARM_SDP_OFFER,
sizeof(sdpG729),
sdpG729);
if (NULL == parmblkp)
return FAILURE;
if (gc_ReqModifyCall(crn, parmblkp, EV_ASYNC) < 0)
return FAILURE;
gc_util_delete_parm_blk(parmblkp);
return SUCCESS;
} /* End of function. */
The following code example illustrates the use of gc_ReqModifyCall( ) to place the current media
session on hold using the SDP media attribute “inactive”.
.
.
/* Dialogic Header Files */
#include <gcip.h>
#include <gclib.h>
.
.
.
/* Request remote SIP client to place call on hold:
/* Assumes: 1) caller has verified call to be in connected state
/*
2) caller has enabled event handler for GCEV_MODIFY_CALL_ACK,
/*
GCEV_MODIFY_CALL_REJ, and GCEV_MODIFY_CALL_FAIL.
*/
*/
*/
*/
int holdReq(CRN crn, IP_CAPABILITY * pIpcap)
{
GC_PARM_BLK *parmblkp = NULL;
/* Change direction to "inactive" direction */
pIpcap->direction = IP_CAP_DIR_LCLRTPINACTIVE;
/* append the GC_PARM_BLK with the respective modified codec direction */
gc_util_insert_parm_ref(&parmblkp,
GCSET_CHAN_CAPABILITY,
IPPARM_LOCAL_CAPABILITY,
sizeof(IP_CAPABILITY),
pIpcap);
if (NULL == parmblkp) return FAILURE;
if (gc_ReqModifyCall(crn, parmblkp, EV_ASYNC) < 0) return FAILURE;
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
419
gc_ReqModifyCall( ) — request modification of call attributes
gc_util_delete_parm_blk(parmblkp);
} /* End of function. */
The following example illustrates the use of gc_ReqModifyCall( ) to refresh the Contact header:
.
.
/* Dialogic Header Files */
#include <gcip.h>
#include <gclib.h>
.
.
.
/* Request Contact refresh:
/* Assumes: 1) caller has verified call to be in connected state
/*
2) caller has enabled event handler for GCEV_MODIFY_CALL_ACK,
/*
GCEV_MODIFY_CALL_REJ, and GCEV_MODIFY_CALL_FAIL.
*/
*/
*/
*/
int refreshToHomeLocation (CRN crn)
{
char *pContactHeader = "Contact: Rich <sip:r.intelligent@myhomeISP.com>";
gc_util_insert_parm_ref(&parmblkp,
IPSET_SIP_MSGINFO,
IPPARM_SIP_HDR,
(unsigned char)strlen(pContactIdHeader) + 1,
pContactHeader);
if (NULL == parmblkp)
return FAILURE;
if (gc_ReqModifyCall(crn, parmblkp, EV_ASYNC) < 0)
return FAILURE;
gc_util_delete_parm_blk(parmblkp);
} /* End of function. */
„ See Also
420
•
gc_AcceptModifyCall( )
•
gc_RejectModifyCall( )
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
set IP authentication information — gc_SetAuthenticationInfo( )
gc_SetAuthenticationInfo( )
set IP authentication information
Name: int gc_SetAuthenticationInfo(target_type, target_id, infoparmblkp)
Inputs: int target_type
• type of target object (virtual board)
long target_id
• target object ID
GC_PARM_BLKP
infoparmblkp
• pointer to GC_PARM_BLK with user information
Returns: 0 if successful
<0 if failure
Includes: gclib.h
gcerr.h
Mode: synchronous
„ Description
The gc_SetAuthenticationInfo( ) function is used to configure or remove authentication
information on an IPT virtual board. This is the only Global Call function that can be used to set
this information; the generic Global Call functions gc_SetConfigData( ) and gc_SetUserInfo( )
functions cannot be used for this IP-specific configuration operation.
This function should be called before using any Global Call function that sends a SIP request
which may provoke a 401/407 response. A 401/407 response to any SIP request that was sent
before authentication is configured causes the request to be terminated (with the reason code
IPEC_SIPReasonStatus401Unauthorized or IPEC_SIPReasonStatus407ProxyAuthenticationRequired),
and Global Call will not attempt to re-send the request.
Parameter
Description
target_type
specifies the type of target object; must be set to GCTGT_CCLIB_NETIF.
target_id
specifies the virtual board ID that the authentication information applies to
infoparmblklp
points to a GC_PARM_BLK structure that contains the authentication
information. The parm block contains one or more parameters that use the
IPSET_CONFIG set ID and IPPARM_AUTHENTICATION_CONFIGURE
or IPPARM_AUTHENTICATION_REMOVE as the parameter ID.
To add a new authentication quadruplet of {realm, identity, username, password} to the Global Call
database, or to update an existing quadruplet, the application inserts a parameter element of the
following type into the infoparmblkp parameter block:
IPSET_CONFIG
IPPARM_AUTHENTICATION_CONFIGURE
• value = IP_AUTHENTICATION data structure specifying the quadruplet to create/update
If the realm and identity strings in the IP_AUTHENTICATION structure are unique, the library
creates a new authentication quadruplet in the database. If both the realm and identity strings match
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
421
gc_SetAuthenticationInfo( ) — set IP authentication information
a quadruplet that already exists, the existing username and password are overwritten with the new
strings. If the identity field in the IP_AUTHENTICATION structure is an empty string, the
function will set the specified username and password as the defaults for the specified realm.
To remove an authentication quadruplet to the Global Call database, the application inserts a
parameter element of the following type into the infoparmblkp parameter block:
IPSET_CONFIG
IPPARM_AUTHENTICATION_REMOVE
• value = IP_AUTHENTICATION data structure identifying the realm and identity of the
quadruplet to remove
In this case, the library will remove the existing authentication quadruplet that matches the realm
and identity strings that are specified in the IP_AUTHENTICATION structure; the username and
password elements in the IP_AUTHENTICATION structure are ignored.
„ Cautions
•
The gc_SetAuthenticationInfo( ) function can only be called on a virtual board device.
•
If the GC_PARM_BLK contains multiple parameter elements with the same realm/identity
pair in their IP_AUTHENTICATION structures, all of those parameters are ignored except for
the one that is last in the GC_PARM_BLK.
„ Errors
If this function returns <0 to indicate failure, use the gc_ErrorInfo( ) function to retrieve the
reason for the error. See the “Error Handling” section in the Dialogic® Global Call API
Programming Guide. All Global Call error codes are defined in the gcerr.h file.
Possible errors include:
IPERR_BAD_PARM
returned if any of the string pointers in an IP_AUTHENTICATION structure is NULL or if
there is any other invalid parameter
IPERR_UNAVAILABLE
returned when the realm/identity does not exist in the Global Call database when the
application attempts to remove the quadruplet
IPERR_UNSUPPORTED
returned when the function is called on a line device or CRN rather than a virtual board
„ Examples
The following code example illustrates how to add or modify a digest authentication quadruplet.
#include <gcip.h>
#include <gclib.h>
/* This example adds or modifies the quadruplet with realm "example.com" and
* identity "sip:bob@example.com". If this realm/identity do not exist on this
* virtual board, this quadruplet will be added. If this realm/identity exist
* already, it will be override by this quadruplet.
*/
422
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
set IP authentication information — gc_SetAuthenticationInfo( )
void configureAuthQuadruplet (long boardDev)
{
GC_PARM_BLK *parmblkp = NULL;
char realm[] = "example.com";
char identity[] = "sip:bob@example.com";
char username[] = "bob";
char password [] = "password1";
IP_AUTHENTICATION authentication;
INIT_IP_AUTHENTICATION (&authentication);
authentication.realm = realm;
authentication.identity = identity;
authentication.username = username;
authentication.password = password;
gc_util_insert_parm_ref(&parmblkp,
IPSET_CONFIG,
IPPARM_AUTHENTICATION_CONFIGURE,
(unsigned char)(sizeof(IP_AUTHENTICATION)),
&authentication);
gc_SetAuthenticationInfo(GCTGT_CCLIB_NETIF, boardDev, parmblkp);
gc_util_delete_parm_blk(parmblkp);
}
The following code example illustrates how to remove a digest authentication quadruplet.
#include <gcip.h>
#include <gclib.h>
/* This example deletes the quadruplet with realm "example.com" and
* identity "sip:bob@example.com".
*/
void removeAuthQuadruplet (long boardDev)
{
GC_PARM_BLK *parmblkp = NULL;
char realm[] = "example.com";
char identity[] = "sip:bob@example.com";
IP_AUTHENTICATION authentication;
INIT_IP_AUTHENTICATION (&authentication);
authentication.realm = realm;
authentication.identity = identity;
gc_util_insert_parm_ref(&parmblkp,
IPSET_CONFIG,
IPPARM_AUTHENTICATION_REMOVE,
(unsigned char)(sizeof(IP_AUTHENTICATION)),
&authentication);
gc_SetAuthenticationInfo(GCTGT_CCLIB_NETIF, boardDev, parmblkp);
gc_util_delete_parm_blk(parmblkp);
}
„ See Also
None.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
423
gc_SipAck( ) — acknowledge a SIP 200OK message in 3PCC mode
gc_SipAck( )
acknowledge a SIP 200OK message in 3PCC mode
Name: int gc_SipAck(crn, parmblk, mode)
Inputs: CRN crn
• call reference number of call targeted for modification
GC_PARM_BLKP parmblk
• pointer to optional parameter block containing SDP content
for the SIP ACK message
unsigned long mode
• completion mode (EV_ASYNC)
Returns: 0 if successful
<0 if unsuccessful
Includes: gclib.h
Category: Third-party Call Control
Mode: Asynchronous only
„ Description
The gc_SipAck( ) function is specific to the SIP protocol, and is used only in the third-party call
control (3PCC) mode. The function is used to send an explicit SIP ACK message to the remote
party on an outbound INVITE or re-INVITE transaction when the library does not automatically
send an ACK. In particular, this function must be called in response to the reception of an
unsolicited GCEV_SIP_200OK event or else the transaction will time out and fail.
SDP content may be included in the ACK message by passing a pointer to a parameter block that
contains a parameter element that uses the IPSET_SDP set ID.
This function is supported only in third-party call control (3PCC) mode. Calling this function when
the library has been started in the default first-party call control (1PCC) mode produces an error.
Parameter
Description
crn
call reference number of the call that is involved in the INVITE or
re-INVITE transaction
parmblk
pointer to a optional parameter block containing SDP content for the SIP
ACK message; must be set to NULL if no SDP content is to be included in
the outbound ACK message.
mode
must be EV_ASYNC
This function returns either GC_SUCCESS or GC_ERROR depending upon the validity of the
parameters. The function return does not indicate any status as to the success or failure of the
sending of the response (that is, the ACK). The final result of sending the response is provided in
termination events.
424
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
acknowledge a SIP 200OK message in 3PCC mode — gc_SipAck( )
„ Termination Events
GCEV_SIP_ACK_OK
Successful termination event for gc_SipAck( ) indicating that the ACK message was
successfully sent
GCEV_ SIP_ACK_FAILED
Unsuccessful termination event for gc_SipAck( ) indicating that the ACK message could not
be sent. The ACK message could not be sent because the dialog state was invalid for the ACK
message generation. No modifications to the existing dialog was performed and the current
state remains as it was prior to the gc_SipAck( ) request.
„ Unsolicited Events
GCEV_SIP_200OK
Unsolicited event indicating the application should call gc_SipAck( ) to complete the SIP
transaction.
GCEV_SIP_ACK
Unsolicited event indicating that a SIP ACK message was received and the SIP transaction is
complete.
„ Cautions
•
When a Global Call third-party call control application receives a GCEV_SIP_200OK event,
the application must call gc_SipAck( ) to complete the dialog’s transaction, or else that
transaction will time out and fail.
„ Errors
•
If the function returns GC_ERROR, one or more of the parameters are invalid.
•
Upon receiving GCEV_SIP_ACK_FAILED event, use the gc_ResultInfo( ) function to
retrieve information about the event. See the “Error Handling” section in the Dialogic® Global
Call API Programming Guide. All Global Call error codes are defined in the gcerr.h file while
IP-specific error codes are specified in gcip_defs.h.
•
On failure, no modifications to the existing dialog or media session are performed and the
current state remains as it was prior to the incoming modification request.
„ Example
/*
/* Description: Application event handler that processes new GC 3PCC events.
/*
/* Assumes: caller has enabled event handler for GCEV_SIP_ACK,
/*
GCEV_SIP_ACK_FAILED, GCEV_SIP_ACK_OK, and GCEV_SIP_200OK
/*
*/
*/
*/
*/
*/
*/
/* Dialogic Header Files */
#include <gcip.h>
#include <gclib.h>
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
425
gc_SipAck( ) — acknowledge a SIP 200OK message in 3PCC mode
/* SRL event handler: */
for (;;)
{
if (-1 != sr_waitevt(500))
process_event();
}
void process_event(void)
{
METAEVENT
metaevent;
GC_INFO
t_info;
/* Populate the metaEvent structure */
if(GC_SUCCESS != gc_GetMetaEvent(&metaevent)) return;
/* process GlobalCall events */
if ((metaevent.flags & GCME_GC_EVENT) == 0)
return;
switch (metaevent.evttype)
{
.
.
.
case GCEV_SIP_200OK: /* request to modify call attribute */
{
EXTENSIONEVTBLK *extblkp = metaevent.extevtdatap;
GC_PARM_BLKP parm_blkp = &extblkp->parmblk;
GC_PARM_DATA_EXT curParm;
INIT_GC_PARM_DATA_EXT(&curParm);
while ((curParm = gc_util_next_parm_ex(parm_blkp, &curParm)) != NULL)
{
.
.
.
/* parse and evaluate each proposed attribute change (code not shown)*/
.
.
.
}
if ( gc_SipAck(metaevent.crn, NULL, EV_ASYNC) != GC_SUCCESS)
{
.
.
.
/* perform error recovery here */
.
.
.
}
break;
}
case GCEV_SIP_ACK_OK:
.
.
.
/* remote dialog transaction complete */
.
.
.
break;
426
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
acknowledge a SIP 200OK message in 3PCC mode — gc_SipAck( )
case GCEV_SIP_ACK_FAILED:
/* process failure to change attribute */
if (gc_ResultInfo(&metaevent, &t_info) < 0)
/* failure logic here */
/* process information contained in t_info */
.
.
.
break;
case GCEV_ACK:
.
.
.
/* local dialog transaction complete */
.
.
.
break;
.
.
.
} /* endof switch */
} /* endof process_event function */
„ See Also
None
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
427
gc_util_copy_parm_blk( ) — copy the specified GC_PARM_BLK
gc_util_copy_parm_blk( )
copy the specified GC_PARM_BLK
Name: int gc_util_copy_parm_blk(parm_blkpp, parm_blkp)
Inputs: GC_PARM_BLKP* parm_blkpp • pointer to the address of the new GC_PARM_BLK
GC_PARM_BLKP parm_blkp
• pointer to a valid GC_PARM_BLK to be copied
Returns: GC_SUCCESS if successful
GC_ERROR if unsuccessful
Includes: gclib.h
gcerr.h
Category: GC_PARM_BLK utility
Mode: synchronous
„ Description
The gc_util_copy_parm_blk( ) function copies the specified GC_PARM_BLK.
This function must be used to copy any GC_PARM_BLK that contains any parameter elements
(setID/parmID pairs) that can have data that is potentially larger than 255 bytes. This function can
be used for any GC_PARM_BLK, regardless of whether it contains setID / parmID pairs that
support parameter data lengths greater than 255 bytes.
Only specific Global Call parameters support values longer than 255 bytes and therefore require
the use of this function. The parameters that currently support extended-length values include:
•
IPSET_MIME (or IPSET_MIME_200OK_TO_BYE) / IPPARM_MIME_PART_HEADER
•
IPSET_MIME (or IPSET_MIME_200OK_TO_BYE) / IPPARM_MIME_PART_TYPE
•
IPSET_NONSTANDARDCONTROL / IPPARM_NONSTANDARDDATA_DATA
•
IPSET_NONSTANDARDDATA / IPPARM_NONSTANDARDDATA_DATA
•
IPSET_SDP / all four parameter IDs (supported in 3PCC operating mode only)
•
IPSET_SIP_MSGINFO / IPPARM_SIP_HDR
•
IPSET_TUNNELEDSIGNALMSG / IPPARM_TUNNELEDSIGNALMSG_DATA
Parameter
Description
parm_blkpp
pointer to the address of the new GC_PARM_BLK that the specified parm
block will be copied to; must be set to NULL
parm_blkp
points to a valid, existing GC_PARM_BLK to be copied
„ Cautions
To avoid a memory leak, any GC_PARM_BLK created must eventually be deleted using the
gc_util_delete_parm_blk( ) function.
428
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
copy the specified GC_PARM_BLK — gc_util_copy_parm_blk( )
„ Errors
If this function returns GC_ERROR(-1) to indicate failure, use the gc_ErrorInfo( ) function to
retrieve the reason for the error. See the “Error Handling” section in the Dialogic® Global Call API
Programming Guide. All Global Call error codes are defined in the gcerr.h file.
„ Example
#include "gclib.h"
#include "gcip.h"
void process_event(void)
{
METAEVENT metaevent;
GC_PARM_BLKP my_blkp = NULL;
if(gc_GetMetaEvent(&metaevent) != GC_SUCCESS)
{
/* process error */
}
Switch(metaevent.evttype)
{
case GCEV_OFFERED:
/* make a copy of the parm blk */
if(metaevent.extevtdatap)
{
if ( gc_util_copy_parm_blk( &my_blkp,(GC_PARM_BLKP)(metaevent.extevtdatap))
!= GC_SUCCESS )
{
/* Process error */
}
}
...
}
...
}
„ See Also
•
gc_util_delete_parm_blk( )
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
429
gc_util_find_parm_ex( ) — find a parameter in a GC_PARM_BLK
gc_util_find_parm_ex( )
find a parameter in a GC_PARM_BLK
Name: int gc_util_find_parm_ex(parm_blk, setID, parmID, parm)
Inputs: GC_PARM_BLKP parm_blk
• pointer to GC_PARM_BLK to search for the parameter
unsigned long setID
• parameter set ID of parameter to be found
unsigned long parmID
• parameter ID of parameter to be found
GC_PARM_DATA_EXTP parm
• pointer to a valid GC_PARM_DATA_EXT structure that
identifies where in the parm block to start searching
Outputs: GC_PARM_DATA_EXTP parm
• if successful, pointer to a GC_PARM_DATA_EXT
structure that contains the ID and value data for the
specified parameter
Returns: GC_SUCCESS if successful
EGC_NO_MORE_PARMS if no more parameters exist in GC_PARM_BLK
GC_ERROR if failure
Includes: gclib.h
gcerr.h
Category: GC_PARM_BLK utility
Mode: synchronous
„ Description
The gc_util_find_parm_ex( ) function is used to find a parameter of a particular type in a
GC_PARM_BLK and retrieve the parameter data into a GC_PARM_DATA_EXT structure.
This function must be used instead of the similar gc_util_find_parm( ) function if the parameter
data can potentially exceed 255 bytes. This function is backward compatible and can be used
instead of gc_util_find_parm( ) for any GC_PARM_BLK, regardless of whether the parameter
block contains setID/parmID pairs that support data lengths greater than 255 bytes.
Only specific Global Call parameters support values longer than 255 bytes and therefore require
the use of this function. The parameters that currently support extended-length values include:
•
IPSET_MIME (or IPSET_MIME_200OK_TO_BYE) / IPPARM_MIME_PART_HEADER
•
IPSET_MIME (or IPSET_MIME_200OK_TO_BYE) / IPPARM_MIME_PART_TYPE
•
IPSET_NONSTANDARDCONTROL / IPPARM_NONSTANDARDDATA_DATA
•
IPSET_NONSTANDARDDATA / IPPARM_NONSTANDARDDATA_DATA
•
IPSET_SDP / all four parameter IDs (supported in 3PCC operating mode only)
•
IPSET_SIP_MSGINFO / IPPARM_SIP_HDR
•
IPSET_TUNNELEDSIGNALMSG / IPPARM_TUNNELEDSIGNALMSG_DATA
The gc_util_find_parm_ex( ) function can be used to determine whether a particular parameter
exists, or to retrieve a particular parameter, or both. If the specified parameter is found in the
430
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
find a parameter in a GC_PARM_BLK — gc_util_find_parm_ex( )
GC_PARM_BLK, the function fills in the GC_PARM_DATA_EXT structure with the parameter
data and returns GC_SUCCESS. If the parameter does not exist in the GC_PARM_BLK, or if no
more parameters of the specified type are found, the function returns EGC_NO_MORE_PARMS.
To search from the beginning of the GC_PARM_BLK, initialize the GC_PARM_DATA_EXT
structure by using INIT_GC_PARM_DATA_EXT(parm) before calling
gc_util_find_parm_ex( ). If the structure pointed to by parm contains parameter information that
was retrieved in a previous call to this function, the function will begin its search at that parameter
rather than the beginning of the parameter block.
Parameter
Description
parm_blk
points to a valid GC_PARM_BLK that will be searched for a parameter of
the specified type
setID
set ID of the parameter to be found
parmID
parameter ID of the parameter to be found
parm
points to a valid GC_PARM_DATA_EXT provided by the application. If a
pointer to a newly initialized structure is passed in the function call, the
function searches from the beginning of the GC_PARM_BLK; if the
structure contains data from a previously found parameter, the function
searches from that parameter onward. When the function completes
successfully, the structure is updated to contain retrieved information for the
parameter that was found.
„ Cautions
•
Unlike the similar gc_util_find_parm( ) function, the parm pointer used in this function
cannot be used to update the parameter itself because it points to a data structure that is in the
application’s memory rather than a location in the GC_PARM_BLK itself.
•
The parm parameter must point to a valid GC_PARM_DATA_EXT structure. If it is desired to
search from the beginning of the parameter block, the application must initialize the structure
via INIT_GC_PARM_DATA_EXT(parm) before calling gc_util_find_parm_ex( ).
„ Errors
If this function returns GC_ERROR to indicate failure, use the gc_ErrorInfo( ) function to retrieve
the reason for the error. See the “Error Handling” section in the Dialogic® Global Call API
Programming Guide. All Global Call error codes are defined in the gcerr.h file.
„ Example
#include "gclib.h"
#include "gcip.h"
void search_parm_block(GC_PARM_BLKP parm_blkp)
{
GC_PARM_DATA_EXT parm_data_ext;
int ret = 0;
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
431
gc_util_find_parm_ex( ) — find a parameter in a GC_PARM_BLK
/* Initialize this structure for two reasons:
* 1. To search from the first parameter in the parm block
* 2. The first time this structure is used it must be initialized
*/
INIT_GC_PARM_DATA_EXT(&parm_data_ext);
/* loop to retrieve all of the parameters and associated data in the
* GC_PARM_BLK that match the set_ID/parm_ID pair for SIP header fields.
*/
while ( GC_SUCCESS == (ret = gc_util_find_parm_ex(parm_blkp, IPSET_SIP_MSGINFO,
IPPARM_SIP_HDR, &parm_data_ext)) )
{
/* process GC_PARM_DATA_EXT structure */
.
.
.
}
/* Check for error */
if ( GC_ERROR == ret)
{
/* process error */
}
.
.
.
}
„ See Also
432
•
gc_util_find_parm( )
•
gc_util_next_parm_ex( )
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
insert a GC_PARM_BLK parameter by reference — gc_util_insert_parm_ref_ex( )
gc_util_insert_parm_ref_ex( )
insert a GC_PARM_BLK parameter by reference
Name: int gc_util_insert_parm_ref_ex(parm_blkpp, setID, parmID, data_size, datap)
Inputs: GC_PARM_BLKP *parm_blkpp
• pointer to the address of a valid GC_PARM_BLK
unsigned long setID
• set ID of parameter to be inserted
unsigned long parmID
• parm ID of parameter to be inserted
unsigned long data_size
• size in bytes of the parameter data
void *datap
• pointer to the parameter data
Returns: GC_SUCCESS if successful
GC_ERROR if failure
Includes: gclib.h
gcerr.h
Category: GC_PARM_BLK utility
Mode: synchronous
„ Description
The gc_util_insert_parm_ref_ex( ) function inserts a parameter element into a GC_PARM_BLK
data structure using a reference to the parameter value data.
The gc_util_insert_parm_ref_ex( ) function must be used rather than the similar
gc_util_insert_parm_ref( ) function whenever the parameter value data exceeds 255 bytes in
length. The gc_util_insert_parm_ref_ex( ) function is backwards compatible and can be used
with any setID/parmID pair regardless of whether that pair supports values longer than 255 bytes.
Only specific Global Call parameters support values longer than 255 bytes and therefore require
the use of this function. The parameters that currently support extended-length values include:
•
IPSET_MIME (or IPSET_MIME_200OK_TO_BYE) / IPPARM_MIME_PART_HEADER
•
IPSET_MIME (or IPSET_MIME_200OK_TO_BYE) / IPPARM_MIME_PART_TYPE
•
IPSET_NONSTANDARDCONTROL / IPPARM_NONSTANDARDDATA_DATA
•
IPSET_NONSTANDARDDATA / IPPARM_NONSTANDARDDATA_DATA
•
IPSET_SDP / all four parameter IDs (supported in 3PCC operating mode only)
•
IPSET_SIP_MSGINFO / IPPARM_SIP_HDR
•
IPSET_TUNNELEDSIGNALMSG / IPPARM_TUNNELEDSIGNALMSG_DATA
A new GC_PARM_BLK can be created by inserting the first parameter with *parm_blkpp set to
NULL. A parameter can be inserted in an existing GC_PARM_BLK by setting *parm_blkpp to
the address of that block.
Note:
Parameters are contained in the GC_PARM_BLK in the order in which they are inserted, and they
will also be retrieved via the gc_util_next_parm_ex( ) function in the same order.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
433
gc_util_insert_parm_ref_ex( ) — insert a GC_PARM_BLK parameter by reference
Parameter
Description
parm_blkpp
points to the address of a valid GC_PARM_BLK where the parameter
element is to be inserted. Set *parm_blkpp to NULL to insert the
parameter into a new block.
setID
set ID of the parameter to be inserted
parmID
parameter ID of the parameter to be inserted
data_size
size, in bytes, of the value data associated with this parameter. For certain
set ID/parm ID pairs the maximum size is configurable at library start-up
using IPCCLIB_START_DATA.max_parm_data_size; for all other
parameters, the maximum size is 255 bytes.
datap
points to the value data associated with this parameter
„ Cautions
•
To avoid a memory leak, any GC_PARM_BLK created must be deleted using the
gc_util_delete_parm_blk( ) function.
•
Insertion of data that exceeds 255 bytes in length is only supported for specific setID/parmID
pairs. Refer to the appropriate Global Call Technology Guide for information on maximum
data length for each setID/parmID pair.
„ Errors
•
If this function returns GC_ERROR to indicate failure, use the gc_ErrorInfo( ) function to
retrieve the reason for the error. See the “Error Handling” section in the Dialogic® Global Call
API Programming Guide. All Global Call error codes are defined in the gcerr.h file.
•
Attempting to insert data greater than 255 bytes in length using a setID/parmID pair that does
not support extended-length data produces an error indication. In this situation, the
gc_ErrorInfo( ) function returns the value EGC_INVPARM.
„ Example
#include "gclib.h"
#include "gcip.h"
void SetHeader(void)
{
GC_PARM_BLKP my_blkp = NULL;
char* pChar = "Remote-Party_ID: This string can be greater than 255 bytes";
/* Add 1 to strlen for null termination */
unsigned long data_size = strlen(pChar) + 1;
/* insert parm and associated data into the GC_PARM_BLK */
if ( gc_util_insert_parm_ref_ex( &my_blkp, IPSET_SIP_MSGINFO, IPPARM_SIP_HDR, data_size,
(void*)( pChar )) != GC_SUCCESS )
{
/* Process error */
}
/* At this point the application can overwrite the data pointed to by pChar. */
pChar = NULL;
434
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
insert a GC_PARM_BLK parameter by reference — gc_util_insert_parm_ref_ex( )
/* Pass the parm block to GC */
if ( gc_SetUserInfo( GCTGT_GCLIB_CRN, crn, &my_blkp, GC_SINGLECALL) != GC_SUCCESS )
{
/* Process error */
}
/* GC_PARM_BLK is no longer needed; delete the block */
gc_util_delete_parm_blk( my_blkp );
}
„ See Also
•
gc_util_delete_parm_blk( )
•
gc_util_insert_parm_ref( )
•
gc_util_insert_parm_val( )
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
435
gc_util_next_parm_ex( ) — retrieve the next parameter in a GC_PARM_BLK
gc_util_next_parm_ex( )
retrieve the next parameter in a GC_PARM_BLK
Name: int gc_util_next_parm_ex(parm_blk, parm )
Inputs: GC_PARM_BLKP parm_blk
• pointer to GC_PARM_BLK
GC_PARM_DATA_EXTP parm
• pointer to valid GC_PARM_DATA_EXT structure
identifying current parameter
Outputs: GC_PARM_DATA_EXTP parm
• pointer to GC_PARM_DATA_EXT structure
containing retrieved next parameter
Returns: GC_SUCCESS if successful
EGC_NO_MORE_PARMS if no more parameters exist in the GC_PARM_BLK
GC_ERROR if failure
Includes: gclib.h
gcerr.h
Category: GC_PARM_BLK utility
Mode: synchronous
„ Description
The gc_util_next_parm_ex( ) function is used to retrieve the next parameter element (relative to a
specified current parameter element) from a GC_PARM_BLK in the form of a
GC_PARM_DATA_EXT data structure. Calling this function repetitively and passing a pointer to
the GC_PARM_DATA_EXT structure that was returned by the previous call allows an application
to sequentially retrieve all of the parameter elements in a GC_PARM_BLK. To begin retrieving
parameter elements at the beginning of the GC_PARM_BLK, the application passes a pointer to a
GC_PARM_DATA_EXT structure that it has just initialized by calling
INIT_GC_PARM_DATA_EXT(parm).
This function must be used instead of gc_util_next_parm( ) if the parameter value can potentially
exceed 255 bytes. This function is backward compatible and can be used instead of
gc_util_next_parm( ) for any GC_PARM_BLK, regardless of whether the parameter block
contains setID/parmID pairs that support values longer than 255 bytes.
Only specific Global Call parameters support values longer than 255 bytes and therefore require
the use of this function. The parameters that currently support extended-length values include:
436
•
IPSET_MIME (or IPSET_MIME_200OK_TO_BYE) / IPPARM_MIME_PART_HEADER
•
IPSET_MIME (or IPSET_MIME_200OK_TO_BYE) / IPPARM_MIME_PART_TYPE
•
IPSET_NONSTANDARDCONTROL / IPPARM_NONSTANDARDDATA_DATA
•
IPSET_NONSTANDARDDATA / IPPARM_NONSTANDARDDATA_DATA
•
IPSET_SDP / all four parameter IDs (supported in 3PCC operating mode only)
•
IPSET_SIP_MSGINFO / IPPARM_SIP_HDR
•
IPSET_TUNNELEDSIGNALMSG / IPPARM_TUNNELEDSIGNALMSG_DATA
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
retrieve the next parameter in a GC_PARM_BLK — gc_util_next_parm_ex( )
The gc_util_next_parm_ex( ) function updates the data structure referenced by the parm pointer
and returns GC_SUCCESS if there is another parameter element in the GC_PARM_BLK
following the element that was identified in the function call. If the current parameter data structure
referenced by parm identifies the last parameter element in the GC_PARM_BLK, the next
function call returns EGC_NO_MORE_PARMS.
Parameter
Description
parm_blk
points to the valid GC_PARM_BLK structure where data is stored
parm
pointer to a valid GC_PARM_DATA_EXT structure provided by the
application. If the pointer that is passed in the function call refers to a structure
that was just initialized with INIT_GC_PARM_DATA_EXT(parm), the
function retrieves the first parameter element in the GC_PARM_BLK. If the
passed pointer references a structure that contains data from a previously
found parameter element, the function retrieves the next parameter element in
the block (if any). When the function completes successfully, the
GC_PARM_DATA_EXT structure is updated to contain the retrieved
information for the parameter element.
„ Cautions
Unlike the similar gc_util_next_parm( ) function, the parm pointer used in this function cannot
be used to update the parameter itself because it references a data structure that is in the
application’s memory rather than pointing to a location within the GC_PARM_BLK itself.
„ Errors
•
If this function returns GC_ERROR to indicate failure, use the gc_ErrorInfo( ) function to
retrieve the reason for the error. See the “Error Handling” section in the Dialogic® Global Call
API Programming Guide. All Global Call error codes are defined in the gcerr.h file.
•
The parm parameter must point to a valid GC_PARM_DATA_EXT structure. If it is desired to
search from the beginning of the parameter block, the application must initialize the structure
via INIT_GC_PARM_DATA_EXT(parm) before calling gc_util_next_parm_ex( ).
„ Example
#include "gclib.h"
#include "gcip.h"
void process_parm_block(GC_PARM_BLKP pparm_blk)
{
GC_PARM_DATA_EXT parm_data_ext;
int ret = 0;
/* Initialize this structure for two reasons:
* 1. To retrieve the first parameter in the parm block
* 2. The first time this structure is used it must be initialized
*/
INIT_GC_PARM_DATA_EXT(&parm_data_ext);
/* Loop to retrieve all of the parameters and associated data from the GC_PARM_BLK
*/
while ( GC_SUCCESS == (ret = gc_util_next_parm_ex( pparm_blk, &parm_dat_ext)) )
{
/* Process set_ID/parm_ID pairs */
switch(parm_data_ext.set_ID);
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
437
gc_util_next_parm_ex( ) — retrieve the next parameter in a GC_PARM_BLK
{
.
.
.
}
}
/* Check for error */
if ( GC_ERROR == ret )
{
/* Process error */
}
.
.
.
}
„ See Also
438
•
gc_util_find_parm_ex( )
•
gc_util_next_parm( )
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
initialize GC_PARM_DATA_EXT structure — INIT_GC_PARM_DATA_EXT( )
INIT_GC_PARM_DATA_EXT( )
initialize GC_PARM_DATA_EXT structure
Name: void INIT_GC_PARM_DATA_EXT(pData)
Inputs: GC_PARM_DATA_EXT *pData
• pointer to the structure to be initialized
Returns: None
Includes: gcip.h
Mode: synchronous
„ Description
The INIT_GC_PARM_DATA_EXT( ) function is used to initialize a GC_PARM_DATA_EXT
data structure, which is used when retrieving parameter elements from the metaevent data
associated with many Global Call events using gc_util_find_parm_ex( ) and
gc_util_next_parm_ex( ) functions. These functions use the GC_PARM_DATA_EXT structure in
order to handle extended-length parameter values (>255 bytes), but always use this structure
regardless of the actual length of the parameter value.
Applications must use this function to initialize the GC_PARM_DATA_EXT structure before
calling gc_util_find_parm_ex( ) or before the initial call to gc_util_next_parm_ex( ).
Parameter
Description
pData
points to the GC_PARM_DATA_EXT structure to be initialized
„ Cautions
Failure to use this function to initialize the GC_PARM_DATA_EXT structure before calling
gc_util_find_parm_ex( ) or before the initial call to gc_util_next_parm_ex( ) may cause an
operational error.
„ Example
#include "gclib.h"
#include "gcip.h"
void process_parm_block(GC_PARM_BLKP pparm_blk)
{
GC_PARM_DATA_EXT parm_data_ext;
int ret = 0;
/* Initialize this structure for two reasons:
* 1. To retrieve the first parameter in the parm block
* 2. The first time this structure is used it must be initialized
*/
INIT_GC_PARM_DATA_EXT(&parm_data_ext);
/* Loop to retrieve all of the parameters and associated data from the GC_PARM_BLK
*/
while ( GC_SUCCESS == (ret = gc_util_next_parm_ex( pparm_blk, &parm_dat_ext)) )
{
/* Process set_ID/parm_ID pairs */
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
439
INIT_GC_PARM_DATA_EXT( ) — initialize GC_PARM_DATA_EXT structure
switch(parm_data_ext.set_ID);
{
.
.
.
}
}
/* Check for error */
if ( GC_ERROR == ret )
{
/* Process error */
}
.
.
.
}
„ See Also
•
440
GC_PARM_DATA_EXT reference page
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
initialize IP_VIRTBOARD data structure — INIT_IP_VIRTBOARD( )
INIT_IP_VIRTBOARD( )
initialize IP_VIRTBOARD data structure
Name: void INIT_IP_VIRTBOARD(pIpVb)
Inputs: IP_VIRTBOARD *pIpVb
• pointer to the structure to be initialized
Returns: None
Includes: gcip.h
Mode: synchronous
„ Description
The INIT_IP_VIRTBOARD( ) function is used to initialize an IP_VIRTBOARD data structure,
which contains configuration data for a specific virtual IPT board. This function must be called to
initialize an IP_VIRTBOARD structure for each virtual board that will be defined by calling
INIT_IPCCLIB_START_DATA( ) before calling gc_Start( ).
After the structure is initialized, an application can overwrite any of the defeat values as
appropriate to the specific requirements. Among the items controlled by the IP_VIRTBOARD
structure and initialized by this function are:
•
maximum number of calls (total, H.323, and SIP)
•
local IP address and signaling ports for H.323 and SIP
•
H.323 Terminal Type (default is Gateway)
•
enable access to H.323 message information fields (default is disabled)
•
enable call transfer supplementary service (default is disabled)
•
enable access to SIP message header fields and MIME-encoded message bodies (default is
access disabled for both headers and MIME bodies)
•
enable and configure a SIP outbound proxy (default is disabled)
•
enable and configure TCP transport for SIP requests (default is disabled)
•
configure SIP request retry behavior (default enables all allowable retries)
•
enable application access to SIP OPTIONS requests (default is disabled)
•
configure maximum number of SIP registrations (default equals max. number of SIP calls)
Parameter
Description
pIpVb
points to the IP_VIRTBOARD data structure to be initialized. See
IP_VIRTBOARD, on page 553, for information on the default values and
optional values that may be after initialization.
„ Cautions
None.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
441
INIT_IP_VIRTBOARD( ) — initialize IP_VIRTBOARD data structure
„ Example
IP_VIRTBOARD ip_virtboard[2];
IPCCLIB_START_DATA ipcclibstart;
INIT_IPCCLIB_START_DATA(&ipcclibstart, 2, ip_virtboard);
INIT_IP_VIRTBOARD(&ip_virtboard[0]);
INIT_IP_VIRTBOARD(&ip_virtboard[1]);
ip_virtboard[0].sup_serv_mask = IP_SUP_SERV_CALL_XFER; /* override supp services default */
ip_virtboard[1].sup_serv_mask = IP_SUP_SERV_CALL_XFER; /* override supp services default */
„ See Also
442
•
INIT_IPCCLIB_START_DATA( )
•
Section 8.3.27, “gc_Start( ) Variances for IP”, on page 491
•
IP_VIRTBOARD, on page 553
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
initialize IPCCLIB_START_DATA structure — INIT_IPCCLIB_START_DATA( )
INIT_IPCCLIB_START_DATA( )
initialize IPCCLIB_START_DATA structure
Name: void INIT_IPCCLIB_START_DATA(pIpStData, numBoards, pIpVb)
Inputs: IPCCLIB_START_DATA *pIpStData • pointer to the structure to be initialized
unsigned char numBoards
• number of boards
IP_VIRTBOARD *pIpVb
• pointer to an array of IP_VIRTBOARD structures
Returns: None
Includes: gcip.h
Mode: synchronous
„ Description
The INIT_IPCCLIB_START_DATA( ) function is used to initialize an IPCCLIB_START_DATA
data structure, which contains configuration information on the virtual IPT boards to be started via
gc_Start( ). All fields are set to default values described in IPCCLIB_START_DATA, on page 558
Applications must use this function to initialize the IPCCLIB_START_DATA structure before
calling gc_Start( ).
Parameter
Description
pIpStData
points to the IPCCLIB_START_DATA structure to be initialized
numBoards
the number of virtual IPT boards being defined (up to a maximum of 8)
pIpVb
points to an array of IP_VIRTBOARD data structures, one for each virtual
IPT board being defined
„ Cautions
None.
„ Example
IP_VIRTBOARD ip_virtboard[2];
IPCCLIB_START_DATA ipcclibstart;
INIT_IPCCLIB_START_DATA(&ipcclibstart, 2, ip_virtboard);
INIT_IP_VIRTBOARD(&ip_virtboard[0]);
INIT_IP_VIRTBOARD(&ip_virtboard[1]);
ip_virtboard[0].sup_serv_mask = IP_SUP_SERV_CALL_XFER; /* override supp services default */
ip_virtboard[1].sup_serv_mask = IP_SUP_SERV_CALL_XFER; /* override supp services default */
„ See Also
•
INIT_IP_VIRTBOARD( )
•
Section 8.3.27, “gc_Start( ) Variances for IP”, on page 491
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
443
Dialogic® Global Call API Function Variances for IP
8.3
Note:
Except for gc_Listen( ), gc_OpenEx( ), gc_ReleaseCallEx( ), gc_UnListen( ), all Dialogic®
Global Call API functions that nominally support synchronous and asynchronous mode are
supported only in asynchronous mode when using the IP technology.
The Dialogic® Global Call API function variances that apply when using IP technology are
described in the following sections. See the Dialogic® Global Call API Library Reference for
generic (technology-independent) descriptions of the Dialogic® Global Call API functions.
8.3.1
gc_AcceptCall( ) Variances for IP
This function is only supported in asynchronous mode.
The rings parameter is ignored.
Variance for H.323
The gc_AcceptCall( ) function is used to send the Q.931 ALERTING message to the originating
endpoint.
In addition to the ALERTING message, the library also generates a Q.931 PROGRESS message.
Variance for SIP
The gc_AcceptCall( ) function is used to send a SIP informational response message to the
originating endpoint. This message will generally be either 180 Ringing or 183 Session Progress,
but the Dialogic® Global Call API library permits any response code in the range 101-199 to be
specified for accept call responses on a given board device. (The 100 Trying response code is not
permitted because it is already mapped to the gc_CallAck( ) function and GCEV_PROCEEDING
event.) If the application does not specify a particular response code for call accept messages, 180
Ringing is used by default.
To set the SIP response code, the application calls gc_SetConfigData( ) for a board device with the
following parameter:
IPSET_SIP_RESPONSE_CODE
IPPARM_ACCEPT_RESP_CODE
• value = unsigned short between 101 and 199
The following code example shows how to set the call accept response code to 183 Session
Progress instead of the default 180 Ringing:
.
.
.
int
GC_PARM_BLK *
unsigned short
.
.
444
rc = GC_SUCCESS;
parmblkp = NULL;
acceptCode = 183;
/* Session Progress*/
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
.
/* Append/create GC_PARM_BLK with specified 183 response code*/
gc_util_insert_parm_val(&parmblkp,
IPSET_SIP_RESPONSE_CODE,
IPPARM_ACCEPT_RESP_CODE,
sizeof(unsigned short, &acceptCode);
rc = gc_SetConfigData(GCTGT_CCLIB_NETIF, boardDev, parmblkp, 0,
GCUPDATE_IMMEDIATE, &request_id, EV_ASYNC);
if (rc != GC_SUCCESS)
{
/* handle error */
}
.
.
.
8.3.2
gc_AcceptInitXfer( ) Variances for IP
This function is only available if the call transfer supplementary service was enabled via the
sup_serv_mask field in the IP_VIRTBOARD structure when the board device was started.
Variance for H.323 (H.450.2)
Either the rerouting_num (of type char*) or rerouting_addrblkp (of type
GCLIB_ADDRESS_BLK*) fields of the GC_REROUTING_INFO structure can be used to
specify the rerouting address string to be signaled back to party A and its final destination to party
B. The sub_address fields of the GCLIB_ADDRESS_BLK are ignored and not used.
Note:
If both fields are used, the rerouting address string will be a concatenation of the information from
both fields.
The GCEV_ACCEPT_INIT_XFER event is received by the application on the
secondary/consultation call CRN once the transferred call is received as notified via the
GCEV_OFFERED event.
If the call transfer is abandoned by parties A or B before the transfer is completed, the
GCEV_ACCEPT_INIT_XFER_FAIL event is received with a CCLIB cause value of
IPEC_H4502CTAbandon and a Dialogic® Global Call API cause value of
GCRV_CALLABANDONED.
If the CTT2 timer (20 seconds) expires before the transfer is completed, the
GCEV_ACCEPT_INIT_XFER_FAIL event is received with a CCLIB cause value of
IPEC_H450CTT2Timeout and a Dialogic® Global Call API cause value of GCRV_TIMEOUT.
Variance for SIP
This function does not apply to SIP call transfer. In SIP, party A does not notify party C in advance
of requesting an attended (supervised) transfer operation with gc_InvokeXfer( ), so there is no
opportunity for party C to accept or reject the transfer at the initiation stage.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
445
8.3.3
gc_AcceptXfer( ) Variances for IP
This function is only available if the call transfer supplementary service was enabled via the
sup_serv_mask field in the IP_VIRTBOARD structure when the board device was started.
The parmblkp parameter is ignored for IP technology and should be set to NULL.
The gc_AcceptXfer( ) function can be used at party B only after receiving a GCEV_REQ_XFER
event. The application can obtain information on the rerouting number or address in a
GC_REROUTING_INFO data structure dereferenced from the extevtdatap in the METAEVENT
structure.
Both the rerouting_num (type char *) and the rerouting_addr (type GCLIB_ADDRESS_BLK)
fields of the GC_REROUTING_INFO structure contain the same rerouting address string that was
explicitly signaled from party A in SIP call transfers or H.450.2 blind call transfers, or from party C
via gc_AcceptInitXfer( ) in H.450.2 supervised call transfers. The rerouting number to be used in
the subsequent gc_MakeCall( ) at party B can be copied from either element, but must not be a
concatenation of both elements because they each contain the same character string.
The remaining elements of the GCLIB_ADDRESS_BLK structure dereferenced from
rerouting_addr contain the following:
address_type
GCADDRTYPE_IP
address_plan
GCADDRPLAN_UNKNOWN
sub_address
0 (unused)
sub_address_type
0 (unused)
sub_address_plan
0 (unused)
Variance for H.323 (H.450.2)
When party B (the Transferred party) accepts a transfer request via gc_AcceptXfer( ) no
notification is sent to party A (the Transferor or Transferring party). No message is sent to party A
until the accepted transfer succeeds or fails.
Variance for SIP
When party B (Transferee or Transferred party) accepts a transfer request via gc_AcceptXfer( ), a
202 Accepted message and a NOTIFY(100 Trying) message with Subscription-State=Active is
sent to party A (the Transferor or Transferring party). The call control library at party A may
optionally generate a GCEV_INVOKE_XFER_ACCEPTED event to notify the application of the
acceptance if that event has been enabled for that line device with gc_SetConfigData( ).
446
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
8.3.4
gc_AnswerCall( ) Variances for IP
This function is only supported in asynchronous mode.
The rings parameter is ignored.
Coders can be set in advance of using gc_AnswerCall( ) by using gc_SetUserInfo( ). See
Section 8.3.26, “gc_SetUserInfo( ) Variances for IP”, on page 487 for more information.
The following code example shows how to use the gc_SetUserInfo( ) function to set coder
information before calls are answered using gc_AnswerCall( ).
/* Specifying coders before answering calls */
LINEDEV ldev;
CRN crn;
GC_PARM_BLK *target_datap;
/* Define Coder */
IP_CAPABILITY a_DefaultCapability;
gc_OpenEx(&ldev, ":N_iptB1T1:M_ipmB1C1:P_H323", EV_ASYNC, 0);
/* wait for GCEV_OPENEX event ... */
/* Set default coder for this ldev */
target_datap = NULL;
memset(&a_DefaultCapability,0,sizeof(IP_CAPABILITY));
a_DefaultCapability.capability = GCCAP_AUDIO_g7231_5_3k;
a_DefaultCapability.direction = IP_CAP_DIR_LCLTRANSMIT;
a_DefaultCapability.type = GCCAPTYPE_AUDIO;
a_DefaultCapability.extra.audio.frames_per_pkt = 1;
a_DefaultCapability.extra.audio.VAD = GCPV_DISABLE;
gc_util_insert_parm_ref(&target_datap, GCSET_CHAN_CAPABILITY,
IPPARM_LOCAL_CAPABILITY, sizeof(IP_CAPABILITY),
&a_DefaultCapability);
/* set both receive and transmit coders to be the same (since
the IPTxxx board does not support asymmetrical coders */
memset(&a_DefaultCapability,0,sizeof(IP_CAPABILITY));
a_DefaultCapability.capability = GCCAP_AUDIO_g7231_5_3k;
a_DefaultCapability.direction = IP_CAP_DIR_LCLRECEIVE;
a_DefaultCapability.type = GCCAPTYPE_AUDIO;
a_DefaultCapability.extra.audio.frames_per_pkt = 1;
a_DefaultCapability.extra.audio.VAD = GCPV_DISABLE;
gc_util_insert_parm_ref(&target_datap, GCSET_CHAN_CAPABILITY,
IPPARM_LOCAL_CAPABILITY, sizeof(IP_CAPABILITY),
&a_DefaultCapability);
gc_SetUserInfo(GCTGT_GCLIB_CHAN, ldev, target_datap, GC_ALLCALLS);
gc_util_delete_parm_blk(target_datap);
gc_WaitCall(ldev, NULL, NULL, 0, EV_ASYNC);
/*... Receive GCEV_OFFERED ... */
/*... Retrieve crn from metaevent... */
gc_AnswerCall(crn, 0, EV_ASYNC);
/*... Receive GCEV_ANSWERED ... */
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
447
Variance for H.323
The gc_AnswerCall( ) function is used to send the Q.931 CONNECT message to the originating
endpoint.
Variance for SIP
The gc_AnswerCall( ) function is used to send the 200 OK message to the originating endpoint.
8.3.5
gc_CallAck( ) Variances for IP
This function is only supported in asynchronous mode.
The callack_blkp parameter must be a pointer to a GC_CALLACK_BLK structure that contains a
type field with a value of GCACK_SERVICE_PROC. The following code example shows how to
set up a GC_CALLACK_BLK structure and issue the gc_CallAck( ) function.
GC_CALLACK_BLK gcCallAckBlk;
memset(&gcCallAckBlk, 0, sizeof(GC_CALLACK_BLK));
gcCallAckBlk.type = GCACK_SERVICE_PROC;
rc = gc_CallAck(crn, &gcCallAckBlk, EV_ASYNC);
The application can configure whether the Proceeding message is sent manually using the
gc_CallAck( ) function or whether it is sent automatically by the stack. See Section 4.4.6,
“Configuring Proceeding Message Generation (H.323)”, on page 141 for more information.
Variance for H.323
The gc_CallAck( ) function is used to send the Proceeding message to the originating endpoint.
Variance for SIP
The gc_CallAck( ) function is used to send the 100 Trying message to the originating endpoint.
8.3.6
gc_Close( ) Variances for IP
Applications should avoid closing and re-opening devices multiple times. Board devices and
channel devices should be opened during initialization and should remain open for the duration of
the application.
8.3.7
gc_DropCall( ) Variances for IP
This function is only supported in asynchronous mode.
The cause parameter can be any of the generic cause codes documented in the gc_DropCall( )
function reference page in the Dialogic® Global Call API Library Reference or a protocol-specific
cause code as described below.
448
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
Variance for H.323
Allowable protocol-specific cause codes are prefixed by IPEC_H225 or IPEC_Q931 in Chapter 11,
“IP-Specific Event Cause Codes”.
Variance for SIP
Cause codes and reasons are only supported when gc_DropCall( ) is issued while the call is in the
Offered state. Allowable protocol-specific cause codes are prefixed by IPEC_SIP in Chapter 11,
“IP-Specific Event Cause Codes”.
Note:
8.3.8
A Global Call application may not always receive a GCEV_DISCONNECTED event when
terminating a call, because BYE messages are not retried if lost due to network errors.
gc_Extension( ) Variances for IP
This function is only supported in asynchronous mode.
The gc_Extension( ) function can be used for the following purposes:
• retrieving call-related information
• getting notification of underlying protocol connection or disconnection state transitions
• getting notification of media streaming initiation and termination in both the transmit and
receive directions [not supported in 3PCC operating mode]
• specifying which DTMF types, when detected, provide notification to the application [not
supported in 3PCC operating mode]
• sending DTMF digits [not supported in 3PCC operating mode]
• retrieving protocol messages (Q.931, H.245, and registration)
• sending protocol messages (Q.931, H.245, and registration)
• performing T.38 fax server operations
Table 26 shows the valid extension IDs and their purpose.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
449
Table 26. Valid Extension IDs for the gc_Extension( ) Function
Extension ID
IPEXTID_CHANGEMODE
Description
Used with gc_Extension( ) for the following T.38 fax server operations:
• initiating a switch from an audio session to a T.38 fax session
• initiating a switch from a T.38 fax session to an audio session
• accepting a request to switch from audio to T.38 fax or vice versa
• rejecting a request to switch from audio to T.38 fax or vice versa
Also used in GCEV_EXTENSION events to provide notification of
incoming messages including:
• a RequestMode (H.323) or re-INVITE (SIP) message indicating a
request to switch from audio to T.38 fax
• a RequestMode (H.323) or re-INVITE (SIP) message indicating a
request to switch from T.38 fax to audio
• a RequestModeAck (H.323) or 200 OK (SIP) message indicating that
a switch to audio or T.38 fax has completed successfully
See Section 4.26, “T.38 Fax Server”, on page 320 for more information.
This extension ID is not supported in 3PCC operating mode.
IPEXTID_FOIP
Used in GCEV_EXTENSION events for notification of information related
to fax. See Section 4.6.1, “Enabling and Disabling Unsolicited Notification
Events”, on page 154 for more information.
This extension ID is not supported in 3PCC operating mode.
IPEXTID_GETINFO
Used to retrieve call-related information. See Section 4.5, “Retrieving
Current Call-Related Information”, on page 141 for more information.
IPEXTID_IPPROTOCOL_STATE
Used in GCEV_EXTENSION events for notification of intermediate
protocol states, such as, Q.931 and H.245 session connections and
disconnections. See Section 4.6.1, “Enabling and Disabling Unsolicited
Notification Events”, on page 154 for more information.
IPEXTID_MEDIAINFO
Used in GCEV_EXTENSION events for notification of the initiation and
termination of media streaming in the transmit and receive directions. In
the case of media streaming connection notification, the datatype of the
parameter is IP_CAPABILITY and consists of the coder configuration that
resulted from the capability exchange with the remote peer. See
Section 4.6.1, “Enabling and Disabling Unsolicited Notification Events”,
on page 154 for more information.
This extension ID is not supported in 3PCC operating mode.
IPEXTID_MSGINFO
Used in GCEV_EXTENSION events for receiving SIP messages with
MIME-encoded information in the message body. See Section 4.10,
“Using MIME Bodies in SIP Messages (SIP-T)”, on page 188, for more
information. The supported parameter sets are:
• IPSET_MIME
• IPSET_MIME_200OK_TO_BYE
IPEXTID_RECEIVE_DTMF
Used to select which DTMF types, when detected, provide notification to
the application. See Section 4.6.1, “Enabling and Disabling Unsolicited
Notification Events”, on page 154 for more information.
This extension ID is not supported in 3PCC operating mode.
IPEXTID_RECEIVEMSG
450
Used in GCEV_EXTENSION events when SIP, Q.931, H.245, and nonstandard registration messages are received.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
Table 26. Valid Extension IDs for the gc_Extension( ) Function
Extension ID
IPEXTID_SEND_DTMF
Description
Used to send DTMF digits. When this call is successful, the sending side
receives a GCEV_EXTENSIONCMPLT event with the same ext_id. The
remote side receives a GCEV_EXTENSION event with
IPEXTID_RECEIVE_DTMF but only when configured for notification of a
specific type of DTMF. See Section 4.6.1, “Enabling and Disabling
Unsolicited Notification Events”, on page 154 for more information.
This extension ID is not supported in 3PCC operating mode.
IPEXTID_SENDMSG
Used to send SIP, H.245, Q.931, and RAS messages. When using this
Extension ID, the first parameter inserted into the GC_PARM_BLK must
be from one of the following parameter sets:
• IPSET_MSG_H245
• IPSET_MSG_Q931
• IPSET_MSG_REGISTRATION
• IPSET_MSG_SIP
• IPSET_PROTOCOL
When the gc_Extension( ) function completes successfully, the sending
side receives a GCEV_EXTENSIONCMPLT event with the same ext_id.
The remote side receives a GCEV_EXTENSION event with an ext_id
field value of IPEXTID_RECEIVEMSG.
The gc_Extension( ) function is only used in the context of a call where the protocol is already
known, therefore the protocol does not need to be specified. When protocol-specific information is
specified and it is not of the correct protocol type, for example, attempting to send a Q.931
FACILITY message in a SIP call, the operation fails.
See the Section 4.5.2, “Examples of Retrieving Call-Related Information”, on page 145 for a code
example showing how to identify the type of extension event and extract the related information.
8.3.9
gc_GetAlarmParm( ) Variances for IP
The gc_GetAlarmParm( ) function can be used to get QoS threshold values. The function
parameter values in this context are:
linedev
The media device handle, retrieved using the gc_GetResourceH( ) function. See
Section 4.21.2, “Retrieving the Media Device Handle”, on page 264 for more information.
aso_id
The alarm source object ID. Set to ALARM_SOURCE_ID_NETWORK_ID.
ParmSetID
Must be set to ParmSetID_qosthreshold_alarm.
alarm_parm_list
A pointer to an ALARM_PARM_FIELD structure. The alarm_parm_number field is not used.
The alarm_parm_data field is of type GC_PARM, which is a union. In this context, the type
used is void *pstruct, and is cast as a pointer to an IPM_QOS_THRESHOLD_INFO structure,
which includes an IPM_QOS_THRESHOLD_DATA structure that contains the parameters
representing threshold values. See the IPM_QOS_THRESHOLD_INFO structure in the
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
451
Dialogic® IP Media Library API Library Reference and the Dialogic® IP Media Library API
Programming Guide for more information. The thresholds supported by Dialogic® Global Call
API for HMP include:
• QOSTYPE_LOSTPACKETS
• QOSTYPE_JITTER
• QOSTYPE_RTCPTIMEOUT
• QOSTYPE_RTPTIMEOUT.
mode
Must be set to EV_SYNC.
Note:
Applications must include the gcipmlib.h header file before Dialogic® Global Call API can be
used to set or retrieve QoS threshold values.
See Section 4.21.3, “Setting QoS Threshold Values”, on page 264 for code examples.
8.3.10
gc_GetCallInfo( ) Variances for IP
The gc_GetCallInfo( ) function can be used to retrieve calling (ANI) or called party (DNIS)
information such as an IP address, an e-mail address, an E.164 number, a URL, or the call identifier
(Call ID) used by the underlying protocol to globally, uniquely identify the call. The values of the
info_id parameter that are supported for both SIP and H.323 are:
ORIGINATION_ADDRESS
the calling party information (equivalent to ANI)
DESTINATION_ADDRESS
the called party information (equivalent to DNIS)
IP_CALLID
the globally unique identifier used by the underlying protocol to identify the call (Call ID or
GUID)
Two additional, SIP-specific values for the info_id parameter that allow retrieval of information
from the From URI and To URI SIP message fields are described below under the “Variance for
SIP” heading.
When an info_id of ORIGINATION_ADDRESS (ANI) is specified and the function completes
successfully, the valuep string is a concatenation of values delimited by a pre-determined
character. (The delimiter character is configurable in the IPCCLIB_START_DATA data structure
that is used by gc_Start( ); the default character is a comma.)
When an info_id of DESTINATION_ADDRESS (DNIS) is specified and the function completes
successfully, the valuep string is a concatenation of values delimited by a pre-determined
character. (The delimiter character is configurable in the IPCCLIB_START_DATA data structure
that is used by gc_Start( ); the default character is a comma.) The IP address of the destination
gateway (that is processing the DNIS) is not included in the string.
When an info_id of IP_CALLID (Call ID) is specified and the function completes successfully, the
buffer pointed to by the valuep argument contains the globally unique identifier used by the
underlying protocol to identify the call. The size and datatype of the Call ID depends on the
protocol. To assure adequate buffer size when the protocol is unknown, use the IP_CALLIDSIZE
452
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
define to allocate a buffer that is large enough to hold any type of Call ID value (i.e., either an
H.323 array of octets or a SIP string).
Note:
For outbound calls the gc_GetCallInfo( ) function can be used to retrieve valid Call ID
information only after the Proceeding state.
The gc_GetCallInfo( ) function can also be used to query the protocol used by a call. The info_id
parameter should be set to CALLPROTOCOL and the valuep parameter returns a pointer to an
integer that is one of the following values:
• CALLPROTOCOL_H323
• CALLPROTOCOL_SIP
Note:
For an inbound call, the gc_GetCallInfo( ) function can be used to determine the protocol any time
after the GCEV_OFFERED event is received and before the GCEV_DISCONNECTED event is
received.
Variance for H.323
When retrieving calling (ANI) information, the following rules apply. Any section in the string that
includes a prefix (TA:, TEL:, or NAME:) has been inserted as an alias by the originating party. Any
section in the string that does not include a prefix has been inserted as a calling party number
(Q.931) by the originating party.
When retrieving called party (DNIS) information, the following rules apply. Any section in the
string that includes a prefix (TA:, TEL:, or NAME:) has been inserted as an alias by the originating
party. Any section in the string that does not include a prefix has been inserted as a called party
number (Q.931) by the originating party.
When retrieving Call ID information, the buffer pointed to by the valuep argument contains an
array of octets. The size of this array is IP_H323_CALLIDSIZE bytes. To assure adequate buffer
size when the protocol is unknown, use the IP_CALLIDSIZE define to create a buffer that is large
enough to hold any type of Call ID value (i.e., for either H.323 or SIP).
Variance for SIP
When retrieving calling party (ANI) or called party (DNIS) information, prefixes (such as TA:,
TEL:, and NAME:) are not used.
When retrieving calling party (ANI) information, the address is taken from the SIP From: header,
and is accessible in one of two forms by using one of the following parameter IDs in the function
call:
ORIGINATION_ADDRESS
Returns the simple origination address in the form
alice@192.168.1.10
ORIGINATION_ADDRESS_SIP
Returns a SIP-specific origination address that includes additional From URI parameters and
tags. The format used is
sip: alice@192.168.1.10;tag=0-13c4-4059c361-23d07406-72fe
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
453
When retrieving called party (DNIS) information, the address is taken from the SIP To: header, and
is accessible in one of two forms by using one of the following parameter IDs in the function call:
DESTINATION_ADDRESS
Returns the simple destination address in the form
user@127.0.0.1
DESTINATION_ADDRESS_SIP
Returns a SIP-specific destination address that includes additional To URI parameters in the
form
sip: userB@127.0.0.1;user=Steve
When retrieving Call ID information, the buffer pointed to by the valuep argument contains a
NULL-terminated string. The maximum size of this string is IP_SIP_CALLIDSIZE bytes. To
assure adequate buffer size when the protocol is unknown, use the IP_CALLIDSIZE define. This
will assure the buffer is large enough to hold any type of Call ID value (i.e., either H.323 or SIP).
Retrieving SIP Call ID via gc_GetCallInfo( )
The following code example illustrates retrieval of the SIP Call ID using a gc_GetCallInfo( ) call.
/*
* Assume the following has been done:
* 1. device has been opened (e.g. :N_iptB1T1:P_SIP, :N_iptB1T2:P_SIP, etc...)
* 2. gc_WaitCall() has been issued to wait for a call.
* 3. gc_GetMetaEvent() or gc_GetMetaEventEx() (Windows) has been called
*
to convert the event into metaevent.
* 4. a GCEV_OFFERED has been detected.
*/
#include
#include
#include
#include
#include
<stdio.h>
<srllib.h>
<gclib.h>
<gcerr.h>
<gcip.h>
/*
* Assume the 'crn' parameter holds the CRN associated with the detected GCEV_OFFERED event.
*/
int print_call_info(CRN crn)
{
GC_INFO gc_error_info;
char cid_buff[IP_SIP_CALLIDSIZE];
/* GlobalCall error information data */
/* buffer large enough to hold SIP Call-ID value */
if(gc_GetCallInfo(crn, IP_CALLID, cid_buff) != GC_SUCCESS)
{
/* process error return as shown */
gc_ErrorInfo( &gc_error_info );
printf ("Error: gc_GetCallInfo(IP_CALLID) on crn: 0x%lx, GC ErrorValue: 0x%hx - %s,"\
" CCLibID: %i - %s, CC ErrorValue: 0x%lx - %s\n",
crn, gc_error_info.gcValue, gc_error_info.gcMsg, gc_error_info.ccLibId,
gc_error_info.ccLibName, gc_error_info.ccValue, gc_error_info.ccMsg);
return (gc_error_info.gcValue);
}
printf ("gc_GetCallInfo(IP_CALLID) on crn: 0x%lx, returned - %s\n", crn, cid_buff);
return(0);
}
454
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
8.3.11
gc_GetCTInfo( ) Variances for IP
The gc_GetCTInfo( ) function can be used to retrieve product information (via the CT_DEVINFO
structure) for the media sub-device (ipm) attached to the network device (ipt). If no media device is
associated with the network device, the function returns as though not supported.
8.3.12
gc_GetResourceH( ) Variances for IP
The gc_GetResourceH( ) function can be used to retrieve the media device (ipm device) handle,
which is required by GCAMS functions, such as, gc_SetAlarmParm( ) and gc_GetAlarmParm( )
to set and retrieve QoS threshold values. The function parameter values in this context are:
linedev
the network device, that is, the Dialogic® Global Call API line device retrieved by the
gc_OpenEx( ) function
resourcehp
the address where the media device handle is stored when the function completes
resourcetype
GC_MEDIADEVICE
Note:
Applications must include the gcipmlib.h header file before Dialogic® Global Call API can be
used to set or retrieve QoS threshold values.
The other resource types including GC_NETWORKDEVICE (for a network device),
GC_VOICEDEVICE (for a voice device), and GC_NET_GCLINEDEVICE (to retrieve the
Dialogic® Global Call API line device handle when the media handle is known) are also supported.
Note:
8.3.13
The GC_VOICEDEVICE option above applies only if the voice device was opened with the line
device or opened separately and subsequently attached to the line device.
gc_GetXmitSlot( ) Variances for IP
The gc_GetXmitSlot( ) function can be used to get the transmit time slot information for an IP
Media device. The function parameter values in this context are:
linedev
The Dialogic® Global Call API line device handle for an IP device (that is, the handle returned
by gc_OpenEx( ) for a device with :N_iptBxTy in the devicename parameter and a media
device attached).
sctsinfop
A pointer to the transmit time slot information for the IP Media device (a pointer to a CT Bus
time slot information structure).
8.3.14
gc_InitXfer( ) Variances for IP
This function is only available if the call transfer supplementary service was enabled via the
sup_serv_mask field in the IP_VIRTBOARD structure when the board device was started.
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
455
The parmblkp and ret_rerouting_infopp parameters are ignored and should be set to NULL. The
gc_InitXfer( ) function returns -1 if invalid parameter are specified.
Variance for H.323 (H.450.2)
The gc_InitXfer( ) function has an associated GCEV_INIT_XFER termination event that is
received on the specified CRN. This termination event indicates that the initiate transfer request
was successful and that party C has sent a positive acknowledgement.
Variance for SIP
The gc_InitXfer( ) function does not cause any SIP message to be sent to either of the remote
parties, and is used only for purposes of synchronizing the Global Call state machine. The
GCEV_INIT_XFER termination event that the Transferor receives on the specified CRN after
calling gc_InitXfer( ) is a “dummy” event whose only purpose is to allow synchronization of the
Global Call state machine.
8.3.15
gc_InvokeXfer( ) Variances for IP
This function is only available if the call transfer supplementary service was enabled via the
sup_serv_mask field in the IP_VIRTBOARD structure when the board device was started.
Variance for H.323 (H.450.2)
The party A application is notified by GCEV_INVOKE_XFER_REJ if the remote party receiving
the call transfer request rejects the request, or by GCEV_INVOKE_XFER_FAIL if the request fails
for some reason, but there is no notification if the request is accepted. The only notification party A
receives in a successful transfer is the GCEV_INVOKE_XFER event, which does not necessarily
mean that the transferred call between party B and party C was connected, only that it was
confirmed to be delivered. Specifically, it indicates that ALERTING or CONNECT was received
from party C on the transferred call.
Table 27 identifies the protocol-specific variances in parameters for gc_InvokeXfer( ).
Table 27. gc_InvokeXfer( ) Supported Parameters for H.450.2
Parameter
Meaning
crn
For all transfers, CRN of primary call.
extracrn
For a supervised call transfer, parameter value must be the CRN of the
secondary/consultation call with party C.
For blind call transfers, parameter value must be zero.
456
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
Table 27. gc_InvokeXfer( ) Supported Parameters for H.450.2 (Continued)
Parameter
numberstr
Meaning
Ignored in supervised call transfer – set to NULL.
For blind call transfer, used to provide address of party C (the rerouting address) as a
string. Signaled to party B in the GCEV_REQ_XFER event. Format can be:
• transport address, for example, “TA:146.152.0.1”
• E.164 alias, for example, “TEL:9739933000”
• host address, for example, “NAME: myhostname”
Note: The prefix must be included in the string to allow correct interpretation.
Note: When using the GC_MAKECALL_BLK *makecallp parameter to specify the
rerouting address via a data structure, this parameter must be set to NULL.
makecallp
Ignored in supervised call transfer – set to NULL.
For blind call transfer, used to provide address of party C (the rerouting address) in a
GC_MAKECALL_BLK data structure. Signaled to party B in the GCEV_REQ_XFER event.
Note: When using the char *numberstr parameter to specify the rerouting address as a
string, this parameter must be set to NULL.
timeout
Ignored. H.450.2 timers (T1, T2, T3, T4) are implicitly maintained at 20 seconds – set to
zero.
Table 28 through Table 31 list the possible event failure cause values.
Table 28. H.450.2 ctInitiate Errors Received from the Network
ctInitiate Error
notAvailable
Result Values
CC: IPEC_H450NotAvailable
GC Event
GCEV_INVOKE_XFER_REJ
GC: GCRV_REMOTEREJ_UNAVAIL
invalidCallState
CC: IPEC_H450InvalidCallState
GCEV_INVOKE_XFER_FAIL
GC: GCRV_REMOTEREJ_NOTALLOWED
invalidReroutingNumber
CC: IPEC_H4502InvalidReroutingNumber
GCEV_INVOKE_XFER_REJ
GC: GCRV_REMOTEREJ_INVADDR
unrecognizedCallIdentity
CC: IPEC_H4502UnrecognizedCallIdentity
GCEV_INVOKE_XFER_FAIL
GC: GCRV_REMOTEREJ_INVADDR
establishmentFailure
CC: IPEC_H4502EstablishmentFailure
GCEV_INVOKE_XFER_FAIL
GC: GCRV_REMOTEREJ_UNSPECIFIED
supplementaryService
InteractionNotAllowed
CC: IPEC_H450SuppServInteractionNotAllowed
unspecified
CC: IPEC_H4502Unspecified
GCEV_INVOKE_XFER_REJ
GC: GCRV_REMOTEREJ_NOTALLOWED
GCEV_INVOKE_XFER_REJ
GC: GCRV_REMOTEREJ_UNSPECIFIED
Table 29. H.450.2 ctIdentify Errors Received From the Network
ctIdentify Error
notAvailable
Result Values
CC: IPEC_H450TRTSENotAvailable
GC: GCRV_REMOTEREJ_UNAVAIL
invalidCallState
CC: IPEC_H450TRTSEInvalidCallState
GC: GCRV_REMOTEREJ_NOTALLOWED
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
GC Event
GCEV_
INVOKE_XFER_REJ
GCEV_
INVOKE_XFER_FAIL
457
Table 29. H.450.2 ctIdentify Errors Received From the Network (Continued)
ctIdentify Error
Result Values
supplementaryService
InteractionNotAllowed
CC: IPEC_H450TRTSESuppServInteractionNotAllowed
unspecified
GC Event
GC: GCRV_REMOTEREJ_NOTALLOWED
CC: IPECH4502TRTSEUnspecified
GCEV_
INVOKE_XFER_REJ
GCEV_
INVOKE_XFER_REJ
GC: GCRV_REMOTEREJ_UNSPECIFIED
Table 30. H.450.2 ctSetup Errors Received From the Network
ctSetup Error
notAvailable
Result Values
CC: IPEC_H450NotAvailable
GC Event
GCEV_INVOKE_XFER_REJ
GC: GCRV_REMOTEREJ_UNAVAIL
invalidCallState
CC: IPEC_H450InvalidCallState
GCEV_INVOKE_XFER_FAIL
GC: GCRV_REMOTEREJ_NOTALLOWED
invalidReroutingNumber
CC: IPEC_H4502InvalidReroutingNumber
GCEV_INVOKE_XFER_REJ
GC: GCRV_REMOTEREJ_INVADDR
unrecognizedCallIdentity
CC: IPEC_H4502UnrecognizedCallIdentity
GCEV_INVOKE_XFER_FAIL
GC: GCRV_REMOTEREJ_INVADDR
supplementaryService
InteractionNotAllowed
unspecified
CC: IPEC_H450SuppServInteractionNotAllowed
GCEV_INVOKE_XFER_REJ
GC: GCRV_REMOTEREJ_NOTALLOWED
CC: IPEC_H4502Unspecified
GCEV_INVOKE_XFER_REJ
GC: GCRV_REMOTEREJ_UNSPECIFIED
Table 31. H.450.2 CT Timer Expiry
Endpoint – Timer
TRGSE – T1
Result Values
CC: IPEC_H450CTT1Timeout
GC Event
GCEV_INVOKE_XFER_FAIL
GC: GCRV_TIMEOUT
TRGSE – T3
CC: IPEC_H450CTT3Timeout
GCEV_INVOKE_XFER_FAIL
GC: GCRV_TIMEOUT
Variance for SIP
The application at party A may optionally be notified by a GCEV_INVOKE_XFER_ACCEPTED
event that the transfer request has been accepted by the remote party to which it was sent. (This
event has no equivalent in H.450.2.) This event is optional, and is disabled by default. The event
may be enabled and disabled on a per-line-device basis via the gc_SetConfigData( ) function as
shown in the following code example.
//enable GCEV_INVOKE_XFER_ACCEPTED event for SIP call transfer
GC_PARM_BLK *t_pParmBlk = NULL;
long
request_id;
gc_util_insert_parm_val(&t_parmBlkl, GCSET_CALLEVENT_MSK, GCACT_ADDMSK,
sizeof(long), GCMSK_INVOKE_XFER_ACCEPTED);
458
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
gc_SetConfigData(GCTGT_GCLIB_CHAN,ldev,t_pParmBlk,0,GCUPDATE_IMMEDIATE,&request_id,EV_SYNC);
gc_util_delete_parm_blk(t_pParmBlk)
The specific meaning of the GCEV_INVOKE_XFER termination event for successful transfers is
dependant on the application and the transfer scenario(s) it uses. The possible outcomes when
Global Call is used by all parties include the following:
• If party A drops the primary call in unattended transfers before the transfer completes, party A
does not receive any GCEV_INVOKE_XFER event at all.
• If party B drops the primary call in unattended transfers before the transfer completes, party A
receives a GCEV_INVOKE_XFER event that only signifies that party B has sent INVITE to
party C.
• For attended transfers or unattended transfers where the primary call is maintained during the
transfer, party A receives a GCEV_INVOKE_XFER event which indicates that the transferred
call was actually connected between party B and party C.
Table 32 identifies the protocol-specific variances in parameters for gc_InvokeXfer( ).
Table 32. gc_InvokeXfer( ) Supported Parameters for SIP
Parameter
Meaning
crn
The CRN of the call between party A and the remote party receiving the transfer request.
This is the primary call in an unattended (blind) call transfer, but may be either call for an
attended (supervised) transfer.
extracrn
For an attended (supervised) call transfer, the CRN of the call between party A and the
remote party not receiving the transfer request (i.e. the call not specified in the crn
parameter).
For unattended (blind) call transfers, must be zero.
numberstr
For attended (supervised) call transfers, this parameter is ignored. Set to NULL.
For an unattended (blind) call transfer, the address of party C (the rerouting address, which
will be signaled to party B) as a string. This address is of the form
user@host; param=value
where
• user is a user name or phone number
• host is a domain name or IP address
• param=value is an optional additional parameter
For additional information on rules for destination addresses, see Section 8.3.17.3,
“Forming a Destination Address String”, on page 465 under the “Variance for SIP” heading.
Note: When using the GC_MAKECALL_BLK *makecallp parameter to specify the
rerouting address, this parameter must be set to NULL.
makecallp
For attended (supervised) call transfers, this parameter is Ignored. Set to NULL.
For an unattended (blind) call transfer, the address of party C (the rerouting address, which
will be signaled to party B) as a GC_MAKECALL_BLK data structure.
Note: When using the char *numberstr parameter to specify the rerouting address, this
parameter must be set to NULL.
timeout
Ignored. Set to NULL.
The application may optionally set the specific information in the header fields of the SIP REFER
message that is sent by this function by configuring a GC_PARM_BLK before calling
gc_InvokeXfer( ), as described in Section 4.9, “Setting and Retrieving SIP Message Header
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
459
Fields”, on page 172. Table 33 lists the header fields that can be set in REFER messages and the
corresponding parameter IDs along with examples of field values.
Table 33. SIP Header Fields Settable in REFER Messages
Field Name
8.3.16
GC Parameter ID
(Set ID: IPSET_SIP_MSGINFO)
Example Field Value
Request URI
IPPARM_REQUEST_URI
146.152.212.67:5060
From
IPPARM_FROM
From: Transferor <sip:146.152.212.43>;tag=013c4-408c7921-1026900f-ed5;myname
To
IPPARM_TO
To: Transferee
<sip:146.152.212.67:5060>;tag=0-13c4408c7921-10268fdd-6a19
From Display
IPPARM_FROM_DISPLAY
Transferor
To Display
IPPARM_TO_DISPLAY
Transferee
Call ID
IPPARM_CALLID_HDR
48cabd0-0-13c4-408c7921-10268fdd1563@146.152.212.67
Contact URI
IPPARM_CONTACT_URI
sip:146.152.212.43
Contact Display
IPPARM_CONTACT_DISPLAY
Transferor
Referred-By
IPPARM_REFERRED_BY
Referred-By: <sip:146.152.212.43>
Replaces
IPPARM_REPLACES
Replaces: 48cae78-0-13c4-408c7923-1026947b1078@146.152.212.67;to-tag=0-13c4-408c7923102694a3-6942;from-tag=0-13c4-408c79231026947b-7b6
gc_Listen( ) Variances for IP
The gc_Listen( ) function is supported in both synchronous and asynchronous modes. The
function is blocking in synchronous mode.
Note:
8.3.17
For line devices that comprise media (ipm) and voice (dxxx) devices, routing is only done on the
media devices. Routing of the voice devices must be done using the Voice API (dx_ functions).
gc_MakeCall( ) Variances for IP
This function is only supported in asynchronous mode.
The Dialogic® Global Call API supports multiple IP protocols on a single IPT Network device. See
Section 2.3.3, “IPT Network Devices”, on page 48 for more information. When using a multiprotocol network device (that is, one opened in P_IP mode), the application specifies the protocol
in the associated GC_MAKECALL_BLK structure, using the set ID IPSET_PROTOCOL, the
parameter ID IPPARM_PROTOCOL_BITMASK, and one of the following values:
• IP_PROTOCOL_SIP
• IP_PROTOCOL_H323
460
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
A network device that is opened in multi-protocol mode defaults to IP_PROTOCOL_H323 if the
protocol is not explicitly set in the makecall block.
Note:
Applications should not use the gc_SetUserInfo( ) function to set the IP protocol.
When making calls on devices that support only one protocol, it is not necessary to include an
IPSET_PROTOCOL element in the makecall block. If the application tries to include an
IPSET_PROTOCOL element in the makecall block that conflicts with the protocol supported by
the device, the application receives an error.
When using SIP, if the remote side does not send a final response to an outgoing INVITE (sent by
the call control library) within 64 seconds, the gc_MakeCall( ) function times out and the library
generates a GCEV_DISCONNECTED event to the application. If the application attempts to drop
the call before the 64 second timeout is reached, the library’s behavior depends on whether a
provisional response was received. If no provisional response was received before the application
cancels the call, the library cleans up the call immediately. But if a provisional response was
received before the application attempts to cancel the call, the library sends a CANCEL to the
remote side and generates a GCEV_DROPCALL event to the application after it receives a 200OK
response to the CANCEL and a 487RequestTerminated response to the original INVITE, or when a
further 32 second timeout expires.
8.3.17.1
Configurable Call Parameters
Call parameters can be specified when using the gc_MakeCall( ) function. The parameters values
specified are only valid for the duration of the current call. At the end of the current call, the default
parameter values for the specific line device override these parameter values. The makecallp
parameter of the gc_MakeCall( ) function is a pointer to the GC_MAKECALL_BLK structure.
The GC_MAKECALL_BLK structure has a gclib field that points to a
GCLIB_MAKECALL_BLK structure. The ext_datap field within the GCLIB_MAKECALL_BLK
structure points to a GC_PARM_BLK structure with a list of the parameters to be set as call values.
The parameters that can be specified through the ext_datap pointer depend on the protocol used
(H.323 or SIP) and are described in the following subsections.
Variance for H.323
Table 34 shows the call parameters that can be specified when using gc_MakeCall( ) with H.323.
Table 34. Configurable Call Parameters When Using H.323
Set ID
GCSET_CHAN_CAPABILITY
Parameter ID(s) and Data Types
IPPARM_LOCAL_CAPABILITY
Data structure, type IP_CAPABILITY. See the reference page for
IP_CAPABILITY on page 543 for more information.
Note: If no transmit/receive coder type is specified, any supported
coder type is accepted.
Notes:
The term “String” implies the normal definition of a character string which can contain letters, numbers, white space, and a null
(for termination).
Dialogic® Global Call IP Technology Guide — November 2007
Dialogic Corporation
461
Table 34. Configurable Call Parameters When Using H.323 (Continued)
Set ID
Parameter ID(s) and Data Types
IPSET_CALLINFO
See Section 9.2.2,
“IPSET_CALLINFO”, on page 512 for
more information.
IPPARM_CONNECTIONMETHOD
Enumeration, with one of the following values:
• IP_CONNECTIONMETHOD_FASTSTART
• IP_CONNECTIONMETHOD_SLOWSTART
See Section 4.2.2, “H.323 Fast Start and Slow Start”, on page 116
for more information.
IPPARM_CALLID
Array of octets, length = MAX_IP_H323_CALLID_LENGTH
IPPARM_DISPLAY
String, max. length = MAX_DISPLAY_LENGTH (82), null-terminated
IPPARM_FASTSTART_MANDATORY_H245CH
Enumeration, with one of the following values:
• IP_FASTSTART_MANDATORY_H245CH_OFF
• IP_FASTSTART_MANDATORY_H245CH_ON
See Section 4.2.3, “H.323 Fast Start with Optional H.245 Channel”,
on page 117 for more information.
IPSET_CALLINFO (cont.)
IPPARM_H245TUNNELING
Enumeration, with one of the following values:
• IP_H245TUNNELING_ON or IP_H245TUNNELING_OFF
See Section 4.1.3, “Enabling and Disabling H.245 Tunneling
(H.323)”, on page 114 for more information.
IPPARM_PHONELIST
String, max. length = 131.
IPPARM_USERUSER_INFO
String, max. length = MAX_USERUSER_INFO_LENGTH (131
bytes)
IPSET_CONFERENCE
IPPARM_CONFERENCE_GOAL
Enumeration with one of the following values:
• IP_CONFERENCEGOAL_UNDEFINED
• IP