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