963cbd6de00a996e456b7a8b3795787ba9a33509
[asterisk/asterisk.git] / channels / h323 / chan_h323.h
1 /*
2  * chan_h323.h
3  *
4  * OpenH323 Channel Driver for ASTERISK PBX.
5  *                      By Jeremy McNamara
6  *                      For The NuFone Network
7  *      
8  * This code has been derived from code created by 
9  *              Michael Manousos and Mark Spencer
10  *
11  * This file is part of the chan_h323 driver for Asterisk
12  *
13  * chan_h323 is free software; you can redistribute it and/or modify
14  * it under the terms of the GNU General Public License as published by
15  * the Free Software Foundation; either version 2 of the License, or
16  * (at your option) any later version. 
17  *
18  * chan_h323 is distributed WITHOUT ANY WARRANTY; without even 
19  * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 
20  * PURPOSE. See the GNU General Public License for more details. 
21  *
22  * You should have received a copy of the GNU General Public License
23  * along with this program; if not, write to the Free Software
24  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 
25  *
26  * Version Info: $Id$
27  */
28
29 #define AST_MAX_ACCOUNTCODE 20
30
31 #include <arpa/inet.h>
32
33 /** call_option struct holds various bits
34  *         of information for each call */
35 typedef struct call_options {
36         char                    cid_num[80];
37         char                    cid_name[80];
38         int                             noFastStart;
39         int                             noH245Tunneling;
40         int                             noSilenceSuppression;
41         int                             progress_setup;
42         int                             progress_alert;
43         int                             progress_audio;
44         int                             dtmfcodec;
45         int                             dtmfmode;
46         int                             capability;
47         int                             bridge;
48         int                             nat;
49 } call_options_t;
50
51 /* structure to hold the valid asterisk users */
52 struct oh323_user {
53         char name[80];
54         char context[80];
55         char secret[80];
56         char callerid[80];
57         char accountcode[AST_MAX_ACCOUNT_CODE];
58         int amaflags;
59         int host;
60         struct sockaddr_in addr;
61         struct ast_ha *ha;
62         call_options_t options;
63         struct oh323_user *next;
64 };
65
66 /* structure to hold the valid asterisk peers 
67    All peers are registered to a GK if there is one */
68 struct oh323_peer {
69         char name[80];
70         char mailbox[80];
71         int delme;
72         struct sockaddr_in addr;
73         struct ast_ha *ha;
74         call_options_t options;
75         struct oh323_peer *next;
76 };
77
78 /* structure to hold the H.323 aliases which get registered to 
79    the H.323 endpoint and gatekeeper */
80 struct oh323_alias {
81         char name[80];
82         char e164[20];                          /* tells a GK to route this E.164 to this alias */
83         char prefix[500];                       /* tells a GK this alias supports these prefixes */
84         char secret[20];                        /* the H.235 password to send to the GK for authentication */
85         char context[80];
86         struct oh323_alias *next;       
87 };
88
89 /** call_details struct call detail records 
90         to asterisk for processing and used for matching up 
91         asterisk channels to acutal h.323 connections */
92 typedef struct call_details {   
93         unsigned int call_reference;
94         char *call_token;                               
95         char *call_source_aliases;
96         char *call_dest_alias;
97         char *call_source_name;
98         char *call_source_e164;
99         char *call_dest_e164;
100         int presentation;
101         int screening;
102         char *sourceIp;
103 } call_details_t;
104
105 typedef struct rtp_info {
106         char addr[32];
107         unsigned int port;
108 } rtp_info_t;
109
110 /* This is a callback prototype function, called pass
111    DTMF down the RTP. */
112 typedef int (*send_digit_cb)(unsigned, char, const char *);
113 extern send_digit_cb on_send_digit; 
114
115 /* This is a callback prototype function, called to collect
116    the external RTP port from Asterisk. */
117 typedef rtp_info_t *(*on_rtp_cb)(unsigned, const char *);
118 extern on_rtp_cb on_external_rtp_create; 
119
120 /* This is a callback prototype function, called to send
121    the remote IP and RTP port from H.323 to Asterisk */ 
122 typedef void (*start_rtp_cb)(unsigned int, const char *, int, const char *, int);
123 extern start_rtp_cb on_start_rtp_channel; 
124
125 /* This is a callback that happens when call progress is
126  * made, and handles inband progress */
127 typedef int (*progress_cb)(unsigned, const char *, int);
128 extern progress_cb on_progress;
129
130 /* This is a callback prototype function, called upon
131    an incoming call happens. */
132 typedef call_options_t *(*setup_incoming_cb)(call_details_t *);
133 extern setup_incoming_cb on_incoming_call;
134
135 /* This is a callback prototype function, called upon
136    an outbound call. */
137 typedef int (*setup_outbound_cb)(call_details_t *);
138 extern setup_outbound_cb on_outgoing_call; 
139
140 /* This is a callback prototype function, called when
141    OnAlerting is invoked */
142 typedef void (*chan_ringing_cb)(unsigned, const char *);
143 extern chan_ringing_cb on_chan_ringing;
144
145 /* This is a callback protoype function, called when
146    OnConnectionEstablished is inovked */
147 typedef void (*con_established_cb)(unsigned, const char *);
148 extern con_established_cb on_connection_established;
149
150 /* This is a callback prototype function, called when
151    OnConnectionCleared callback is invoked */
152 typedef void (*clear_con_cb)(unsigned, const char *);
153 extern clear_con_cb on_connection_cleared;
154
155 /* This is a callback prototype function, called when
156     an H.323 call is answered */
157 typedef int (*answer_call_cb)(unsigned, const char *);
158 extern answer_call_cb on_answer_call;
159
160 /* This is a callback prototype function, called when
161    we know which RTP payload type RFC2833 will be
162    transmitted */
163 typedef void (*rfc2833_cb)(unsigned, const char *, int);
164 extern rfc2833_cb on_set_rfc2833_payload;
165
166 typedef void (*hangup_cb)(unsigned, const char *, int);
167 extern hangup_cb on_hangup;
168
169 typedef void (*setcapabilities_cb)(unsigned, const char *);
170 extern setcapabilities_cb on_setcapabilities;
171
172 /* debug flag */
173 extern int h323debug;
174
175 #define H323_DTMF_RFC2833       (1 << 0)
176 #define H323_DTMF_INBAND        (1 << 1)
177
178 #ifndef BOOL
179 #define BOOL int
180 #endif
181
182 #ifdef __cplusplus
183 extern "C" {
184 #endif   
185     
186         void h323_gk_urq(void);
187         void h323_end_point_create(void);
188         void h323_end_process(void);
189         int  h323_end_point_exist(void);
190     
191         void h323_debug(int, unsigned);
192
193         /* callback function handler*/
194         void h323_callback_register(setup_incoming_cb,  
195                                     setup_outbound_cb,
196                                     on_rtp_cb,
197                                     start_rtp_cb,
198                                     clear_con_cb,
199                                     chan_ringing_cb,
200                                     con_established_cb,
201                                     send_digit_cb,
202                                     answer_call_cb,
203                                     progress_cb,
204                                     rfc2833_cb,
205                                     hangup_cb,
206                                     setcapabilities_cb);
207         int h323_set_capabilities(const char *, int, int);
208         int h323_set_alias(struct oh323_alias *);
209         int h323_set_gk(int, char *, char *);
210         void h323_set_id(char *);
211         void h323_show_tokens(void);
212
213         /* H323 listener related funcions */
214         int h323_start_listener(int, struct sockaddr_in);
215
216         void h323_native_bridge(const char *, const char *, char *);
217
218         /* Send a DTMF tone to remote endpoint */
219         void h323_send_tone(const char *call_token, char tone);
220
221         /* H323 create and destroy sessions */
222         int h323_make_call(char *dest, call_details_t *cd, call_options_t *);
223         int h323_clear_call(const char *, int cause);
224         
225         /* H.323 alerting and progress */
226         int h323_send_alerting(const char *token);
227         int h323_send_progress(const char *token);
228         int h323_answering_call(const char *token, int);
229         int h323_soft_hangup(const char *data); 
230         int h323_show_codec(int fd, int argc, char *argv[]);
231
232 #ifdef __cplusplus
233 }
234 #endif