a59da67fca28d60e84b2581a7632bb6182fb4f30
[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 #include <arpa/inet.h>
30
31 /** call_option struct holds various bits
32  *         of information for each call */
33 typedef struct call_options {
34         char            cid_num[80];
35         char            cid_name[80];
36         int             noFastStart;
37         int             noH245Tunneling;
38         int             noSilenceSuppression;
39         unsigned int    port;
40         int             progress_setup;
41         int             progress_alert;
42         int             progress_audio;
43         int             dtmfcodec;
44 } call_options_t;
45
46 /* structure to hold the valid asterisk users */
47 struct oh323_user {
48         char name[80];
49         char context[80];
50         char secret[80];
51         char callerid[80];
52         char accountcode[20];
53         int amaflags;
54         int bridge;
55         int nat;
56         int dtmfmode;
57         int host;
58         call_options_t options;
59         struct ast_ha *ha;
60         struct sockaddr_in addr;
61         struct oh323_user *next;
62 };
63
64 /* structure to hold the valid asterisk peers 
65    All peers are registered to a GK if there is one */
66 struct oh323_peer {
67         char name[80];
68         char mailbox[80];
69         int capability;
70         int bridge;
71         int nat;
72         int dtmfmode;
73         int delme;
74         struct sockaddr_in addr;
75         struct ast_ha *ha;
76         call_options_t options;
77         struct oh323_peer *next;
78 };
79
80 /* structure to hold the H.323 aliases which get registered to 
81    the H.323 endpoint and gatekeeper */
82 struct oh323_alias {
83         char name[80];
84         char e164[20];                          /* tells a GK to route this E.164 to this alias */
85         char prefix[500];                       /* tells a GK this alias supports these prefixes */
86         char secret[20];                        /* the H.235 password to send to the GK for authentication */
87         char context[80];
88         struct oh323_alias *next;       
89 };
90
91 /** call_details struct call detail records 
92         to asterisk for processing and used for matching up 
93         asterisk channels to acutal h.323 connections */
94 typedef struct call_details {   
95         unsigned int call_reference;
96         char *call_token;                               
97         char *call_source_aliases;
98         char *call_dest_alias;
99         char *call_source_name;
100         char *call_source_e164;
101         char *call_dest_e164;
102         int presentation;
103         int screening;
104         char *sourceIp;
105 } call_details_t;
106
107 typedef struct rtp_info {
108         const char *addr;
109         unsigned int port;
110 } rtp_info_t;
111
112 /* This is a callback prototype function, called pass
113    DTMF down the RTP. */
114 typedef int (*send_digit_cb)(unsigned, char, const char *);
115 extern send_digit_cb on_send_digit; 
116
117 /* This is a callback prototype function, called to collect
118    the external RTP port from Asterisk. */
119 typedef rtp_info_t *(*on_rtp_cb)(unsigned, const char *);
120 extern on_rtp_cb on_external_rtp_create; 
121
122 /* This is a callback prototype function, called to send
123    the remote IP and RTP port from H.323 to Asterisk */ 
124 typedef void (*start_rtp_cb)(unsigned int, const char *, int, const char *, int);
125 extern start_rtp_cb on_start_rtp_channel; 
126
127 /* This is a callback that happens when call progress is
128  * made, and handles inband progress */
129 typedef int (*progress_cb)(unsigned, const char *, int);
130 extern progress_cb on_progress;
131
132 /* This is a callback prototype function, called upon
133    an incoming call happens. */
134 typedef call_options_t *(*setup_incoming_cb)(call_details_t);
135 extern setup_incoming_cb on_incoming_call;
136
137 /* This is a callback prototype function, called upon
138    an outbound call. */
139 typedef int (*setup_outbound_cb)(call_details_t);
140 extern setup_outbound_cb on_outgoing_call; 
141
142 /* This is a callback prototype function, called when
143    OnAlerting is invoked */
144 typedef void (*chan_ringing_cb)(unsigned, const char *);
145 extern chan_ringing_cb on_chan_ringing;
146
147 /* This is a callback protoype function, called when
148    OnConnectionEstablished is inovked */
149 typedef void (*con_established_cb)(unsigned, const char *);
150 extern con_established_cb on_connection_established;
151
152 /* This is a callback prototype function, called when
153    OnConnectionCleared callback is invoked */
154 typedef void (*clear_con_cb)(call_details_t);
155 extern clear_con_cb on_connection_cleared;
156
157 /* This is a callback prototype function, called when
158     an H.323 call is answered */
159 typedef int (*answer_call_cb)(unsigned, const char *);
160 extern answer_call_cb on_answer_call;
161
162 /* This is a callback prototype function, called when
163    we know which RTP payload type RFC2833 will be
164    transmitted */
165 typedef void (*rfc2833_cb)(unsigned, const char *, int);
166 extern rfc2833_cb on_set_rfc2833_payload;
167
168 /* debug flag */
169 extern int h323debug;
170
171 #define H323_DTMF_RFC2833       (1 << 0)
172 #define H323_DTMF_INBAND        (1 << 1)
173
174 #ifndef BOOL
175 #define BOOL int
176 #endif
177
178 #ifdef __cplusplus
179 extern "C" {
180 #endif   
181     
182         void h323_gk_urq(void);
183         void h323_end_point_create(void);
184         void h323_end_process(void);
185         int  h323_end_point_exist(void);
186     
187         void h323_debug(int, unsigned);
188
189         /* callback function handler*/
190         void h323_callback_register(setup_incoming_cb,  
191                                     setup_outbound_cb,
192                                     on_rtp_cb,
193                                     start_rtp_cb,
194                                     clear_con_cb,
195                                     chan_ringing_cb,
196                                     con_established_cb,
197                                     send_digit_cb,
198                                     answer_call_cb,
199                                     progress_cb,
200                                     rfc2833_cb);
201         int h323_set_capability(int, int);
202         int h323_set_alias(struct oh323_alias *);
203         int h323_set_gk(int, char *, char *);
204         void h323_set_id(char *);
205         void h323_show_tokens(void);
206
207         /* H323 listener related funcions */
208         int h323_start_listener(int, struct sockaddr_in);
209
210         void h323_native_bridge(const char *, const char *, char *);
211
212         /* Send a DTMF tone to remote endpoint */
213         void h323_send_tone(const char *call_token, char tone);
214
215         /* H323 create and destroy sessions */
216         int h323_make_call(char *dest, call_details_t *cd, call_options_t *);
217         int h323_clear_call(const char *, int cause);
218         
219         /* H.323 alerting and progress */
220         int h323_send_alerting(const char *token);
221         int h323_send_progress(const char *token);
222         int h323_answering_call(const char *token, int);
223         int h323_soft_hangup(const char *data); 
224         int h323_show_codec(int fd, int argc, char *argv[]);
225
226 #ifdef __cplusplus
227 }
228 #endif
229
230
231