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