2003-03-31 07:13:36 +00:00
|
|
|
/*
|
2003-06-20 06:03:34 +00:00
|
|
|
* chan_h323.h
|
2003-03-31 07:13:36 +00:00
|
|
|
*
|
|
|
|
* OpenH323 Channel Driver for ASTERISK PBX.
|
|
|
|
* By Jeremy McNamara
|
|
|
|
* For The NuFone Network
|
2006-09-19 17:07:22 +00:00
|
|
|
*
|
|
|
|
* This code has been derived from code created by
|
2003-03-31 07:13:36 +00:00
|
|
|
* Michael Manousos and Mark Spencer
|
|
|
|
*
|
2004-03-04 01:57:32 +00:00
|
|
|
* This file is part of the chan_h323 driver for Asterisk
|
2003-03-31 07:13:36 +00:00
|
|
|
*
|
2003-05-12 00:55:52 +00:00
|
|
|
* chan_h323 is free software; you can redistribute it and/or modify
|
2003-03-31 07:13:36 +00:00
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation; either version 2 of the License, or
|
2006-09-19 17:07:22 +00:00
|
|
|
* (at your option) any later version.
|
2003-03-31 07:13:36 +00:00
|
|
|
*
|
2006-09-19 17:07:22 +00:00
|
|
|
* chan_h323 is distributed WITHOUT ANY WARRANTY; without even
|
|
|
|
* the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
|
|
* PURPOSE. See the GNU General Public License for more details.
|
2003-03-31 07:13:36 +00:00
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
2006-09-19 17:07:22 +00:00
|
|
|
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
2003-03-31 07:13:36 +00:00
|
|
|
*
|
2003-08-25 18:34:10 +00:00
|
|
|
* Version Info: $Id$
|
2003-03-31 07:13:36 +00:00
|
|
|
*/
|
|
|
|
|
|
|
|
#include <arpa/inet.h>
|
|
|
|
|
2006-09-19 17:07:22 +00:00
|
|
|
/*
|
|
|
|
* Enable support for sending/reception of tunnelled Q.SIG messages and
|
|
|
|
* some sort of IEs (especially RedirectingNumber) which Cisco CallManager
|
|
|
|
* isn't like to pass in standard Q.931 message.
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
#define TUNNELLING
|
|
|
|
|
|
|
|
#define H323_TUNNEL_CISCO (1 << 0)
|
|
|
|
#define H323_TUNNEL_QSIG (1 << 1)
|
|
|
|
|
2006-09-28 10:41:38 +00:00
|
|
|
#define H323_HOLD_NOTIFY (1 << 0)
|
|
|
|
#define H323_HOLD_Q931ONLY (1 << 1)
|
|
|
|
#define H323_HOLD_H450 (1 << 2)
|
|
|
|
|
2004-12-15 23:24:13 +00:00
|
|
|
/** call_option struct holds various bits
|
|
|
|
* of information for each call */
|
|
|
|
typedef struct call_options {
|
2005-05-02 18:46:36 +00:00
|
|
|
char cid_num[80];
|
|
|
|
char cid_name[80];
|
2006-09-19 17:07:22 +00:00
|
|
|
char cid_rdnis[80];
|
|
|
|
int redirect_reason;
|
2006-09-29 18:35:44 +00:00
|
|
|
int presentation;
|
|
|
|
int type_of_number;
|
2006-10-07 14:48:32 +00:00
|
|
|
int transfer_capability;
|
2006-09-19 17:07:22 +00:00
|
|
|
int fastStart;
|
|
|
|
int h245Tunneling;
|
|
|
|
int silenceSuppression;
|
2005-05-02 18:46:36 +00:00
|
|
|
int progress_setup;
|
|
|
|
int progress_alert;
|
|
|
|
int progress_audio;
|
2006-09-25 09:03:14 +00:00
|
|
|
int dtmfcodec[2];
|
2005-05-21 17:09:30 +00:00
|
|
|
int dtmfmode;
|
|
|
|
int capability;
|
|
|
|
int bridge;
|
|
|
|
int nat;
|
2006-09-19 17:07:22 +00:00
|
|
|
int tunnelOptions;
|
2006-09-28 10:41:38 +00:00
|
|
|
int holdHandling;
|
2006-09-19 17:07:22 +00:00
|
|
|
struct ast_codec_pref prefs;
|
2004-12-15 23:24:13 +00:00
|
|
|
} call_options_t;
|
2004-03-04 01:57:32 +00:00
|
|
|
|
2003-03-31 07:13:36 +00:00
|
|
|
/* structure to hold the valid asterisk users */
|
|
|
|
struct oh323_user {
|
2006-09-19 17:07:22 +00:00
|
|
|
ASTOBJ_COMPONENTS(struct oh323_user);
|
|
|
|
// char name[80];
|
2003-03-31 07:13:36 +00:00
|
|
|
char context[80];
|
|
|
|
char secret[80];
|
2005-05-25 17:18:05 +00:00
|
|
|
char accountcode[AST_MAX_ACCOUNT_CODE];
|
2003-03-31 07:13:36 +00:00
|
|
|
int amaflags;
|
2003-03-31 20:26:08 +00:00
|
|
|
int host;
|
2003-03-31 07:13:36 +00:00
|
|
|
struct sockaddr_in addr;
|
2005-05-21 17:09:30 +00:00
|
|
|
struct ast_ha *ha;
|
|
|
|
call_options_t options;
|
2003-03-31 07:13:36 +00:00
|
|
|
};
|
|
|
|
|
2006-09-19 17:07:22 +00:00
|
|
|
/* structure to hold the valid asterisk peers
|
2003-03-31 07:13:36 +00:00
|
|
|
All peers are registered to a GK if there is one */
|
|
|
|
struct oh323_peer {
|
2006-09-19 17:07:22 +00:00
|
|
|
ASTOBJ_COMPONENTS(struct oh323_peer);
|
2004-10-04 10:18:06 +00:00
|
|
|
char mailbox[80];
|
2003-03-31 07:13:36 +00:00
|
|
|
int delme;
|
2004-07-17 19:38:30 +00:00
|
|
|
struct sockaddr_in addr;
|
2004-09-30 19:30:49 +00:00
|
|
|
struct ast_ha *ha;
|
2004-12-15 23:24:13 +00:00
|
|
|
call_options_t options;
|
2003-03-31 07:13:36 +00:00
|
|
|
};
|
|
|
|
|
2006-09-19 17:07:22 +00:00
|
|
|
/* structure to hold the H.323 aliases which get registered to
|
2003-03-31 07:13:36 +00:00
|
|
|
the H.323 endpoint and gatekeeper */
|
|
|
|
struct oh323_alias {
|
2006-09-19 17:07:22 +00:00
|
|
|
ASTOBJ_COMPONENTS(struct oh323_alias);
|
2003-03-31 07:13:36 +00:00
|
|
|
char e164[20]; /* tells a GK to route this E.164 to this alias */
|
|
|
|
char prefix[500]; /* tells a GK this alias supports these prefixes */
|
|
|
|
char secret[20]; /* the H.235 password to send to the GK for authentication */
|
|
|
|
char context[80];
|
|
|
|
};
|
|
|
|
|
2006-09-19 17:07:22 +00:00
|
|
|
/** call_details struct call detail records
|
|
|
|
to asterisk for processing and used for matching up
|
2003-03-31 07:13:36 +00:00
|
|
|
asterisk channels to acutal h.323 connections */
|
2006-09-19 17:07:22 +00:00
|
|
|
typedef struct call_details {
|
2003-03-31 07:13:36 +00:00
|
|
|
unsigned int call_reference;
|
2006-09-19 17:07:22 +00:00
|
|
|
char *call_token;
|
2004-07-21 00:49:06 +00:00
|
|
|
char *call_source_aliases;
|
|
|
|
char *call_dest_alias;
|
|
|
|
char *call_source_name;
|
|
|
|
char *call_source_e164;
|
|
|
|
char *call_dest_e164;
|
2006-09-19 17:07:22 +00:00
|
|
|
char *redirect_number;
|
|
|
|
int redirect_reason;
|
2004-12-21 00:07:56 +00:00
|
|
|
int presentation;
|
2006-09-29 18:35:44 +00:00
|
|
|
int type_of_number;
|
2006-10-07 14:48:32 +00:00
|
|
|
int transfer_capability;
|
2004-07-21 00:49:06 +00:00
|
|
|
char *sourceIp;
|
2003-03-31 07:13:36 +00:00
|
|
|
} call_details_t;
|
|
|
|
|
2003-08-25 18:34:10 +00:00
|
|
|
typedef struct rtp_info {
|
2005-05-03 15:47:35 +00:00
|
|
|
char addr[32];
|
2003-08-25 18:34:10 +00:00
|
|
|
unsigned int port;
|
|
|
|
} rtp_info_t;
|
|
|
|
|
2003-03-31 07:13:36 +00:00
|
|
|
/* This is a callback prototype function, called pass
|
|
|
|
DTMF down the RTP. */
|
2006-09-19 17:07:22 +00:00
|
|
|
typedef int (*receive_digit_cb)(unsigned, char, const char *, int);
|
|
|
|
extern receive_digit_cb on_receive_digit;
|
2003-03-31 07:13:36 +00:00
|
|
|
|
|
|
|
/* This is a callback prototype function, called to collect
|
|
|
|
the external RTP port from Asterisk. */
|
2004-10-10 12:20:18 +00:00
|
|
|
typedef rtp_info_t *(*on_rtp_cb)(unsigned, const char *);
|
2006-09-19 17:07:22 +00:00
|
|
|
extern on_rtp_cb on_external_rtp_create;
|
2004-10-10 12:20:18 +00:00
|
|
|
|
|
|
|
/* This is a callback prototype function, called to send
|
2006-09-19 17:07:22 +00:00
|
|
|
the remote IP and RTP port from H.323 to Asterisk */
|
2004-12-21 00:07:56 +00:00
|
|
|
typedef void (*start_rtp_cb)(unsigned int, const char *, int, const char *, int);
|
2006-09-19 17:07:22 +00:00
|
|
|
extern start_rtp_cb on_start_rtp_channel;
|
2003-03-31 07:13:36 +00:00
|
|
|
|
2004-12-15 23:24:13 +00:00
|
|
|
/* This is a callback that happens when call progress is
|
|
|
|
* made, and handles inband progress */
|
|
|
|
typedef int (*progress_cb)(unsigned, const char *, int);
|
|
|
|
extern progress_cb on_progress;
|
|
|
|
|
2003-03-31 07:13:36 +00:00
|
|
|
/* This is a callback prototype function, called upon
|
|
|
|
an incoming call happens. */
|
2005-05-19 16:17:08 +00:00
|
|
|
typedef call_options_t *(*setup_incoming_cb)(call_details_t *);
|
2004-10-10 12:20:18 +00:00
|
|
|
extern setup_incoming_cb on_incoming_call;
|
2003-03-31 07:13:36 +00:00
|
|
|
|
|
|
|
/* This is a callback prototype function, called upon
|
|
|
|
an outbound call. */
|
2005-05-19 16:17:08 +00:00
|
|
|
typedef int (*setup_outbound_cb)(call_details_t *);
|
2006-09-19 17:07:22 +00:00
|
|
|
extern setup_outbound_cb on_outgoing_call;
|
2003-03-31 07:13:36 +00:00
|
|
|
|
2004-10-23 02:43:41 +00:00
|
|
|
/* This is a callback prototype function, called when
|
2004-05-20 07:07:18 +00:00
|
|
|
OnAlerting is invoked */
|
2004-09-19 16:53:01 +00:00
|
|
|
typedef void (*chan_ringing_cb)(unsigned, const char *);
|
2004-10-10 12:20:18 +00:00
|
|
|
extern chan_ringing_cb on_chan_ringing;
|
2004-05-20 07:07:18 +00:00
|
|
|
|
2004-10-23 02:43:41 +00:00
|
|
|
/* This is a callback protoype function, called when
|
2003-03-31 07:13:36 +00:00
|
|
|
OnConnectionEstablished is inovked */
|
2004-09-19 16:53:01 +00:00
|
|
|
typedef void (*con_established_cb)(unsigned, const char *);
|
2004-10-10 12:20:18 +00:00
|
|
|
extern con_established_cb on_connection_established;
|
2003-03-31 07:13:36 +00:00
|
|
|
|
2004-10-23 02:43:41 +00:00
|
|
|
/* This is a callback prototype function, called when
|
2003-03-31 07:13:36 +00:00
|
|
|
OnConnectionCleared callback is invoked */
|
2005-05-19 16:17:08 +00:00
|
|
|
typedef void (*clear_con_cb)(unsigned, const char *);
|
2004-10-10 12:20:18 +00:00
|
|
|
extern clear_con_cb on_connection_cleared;
|
2003-03-31 07:13:36 +00:00
|
|
|
|
2004-10-23 02:43:41 +00:00
|
|
|
/* This is a callback prototype function, called when
|
2006-09-19 17:07:22 +00:00
|
|
|
an H.323 call is answered */
|
2004-09-19 16:53:01 +00:00
|
|
|
typedef int (*answer_call_cb)(unsigned, const char *);
|
2004-10-10 12:20:18 +00:00
|
|
|
extern answer_call_cb on_answer_call;
|
2004-06-15 20:56:06 +00:00
|
|
|
|
2004-12-15 23:24:13 +00:00
|
|
|
/* This is a callback prototype function, called when
|
|
|
|
we know which RTP payload type RFC2833 will be
|
|
|
|
transmitted */
|
2006-09-25 09:03:14 +00:00
|
|
|
typedef void (*rfc2833_cb)(unsigned, const char *, int, int);
|
2004-12-15 23:24:13 +00:00
|
|
|
extern rfc2833_cb on_set_rfc2833_payload;
|
|
|
|
|
2005-04-04 07:06:26 +00:00
|
|
|
typedef void (*hangup_cb)(unsigned, const char *, int);
|
|
|
|
extern hangup_cb on_hangup;
|
|
|
|
|
2005-05-19 19:13:19 +00:00
|
|
|
typedef void (*setcapabilities_cb)(unsigned, const char *);
|
|
|
|
extern setcapabilities_cb on_setcapabilities;
|
|
|
|
|
2006-09-20 16:24:00 +00:00
|
|
|
typedef void (*setpeercapabilities_cb)(unsigned, const char *, int, struct ast_codec_pref *);
|
2006-09-19 17:07:22 +00:00
|
|
|
extern setpeercapabilities_cb on_setpeercapabilities;
|
|
|
|
|
2006-09-28 10:41:38 +00:00
|
|
|
typedef void (*onhold_cb)(unsigned, const char *, int);
|
|
|
|
extern onhold_cb on_hold;
|
|
|
|
|
2003-03-31 07:13:36 +00:00
|
|
|
/* debug flag */
|
2004-06-26 03:50:14 +00:00
|
|
|
extern int h323debug;
|
2003-03-31 07:13:36 +00:00
|
|
|
|
|
|
|
#define H323_DTMF_RFC2833 (1 << 0)
|
2006-09-25 09:03:14 +00:00
|
|
|
#define H323_DTMF_CISCO (1 << 1)
|
|
|
|
#define H323_DTMF_SIGNAL (1 << 2)
|
|
|
|
#define H323_DTMF_INBAND (1 << 3)
|
2003-03-31 07:13:36 +00:00
|
|
|
|
2006-09-24 18:12:35 +00:00
|
|
|
#define H323_DTMF_RFC2833_PT 101
|
|
|
|
#define H323_DTMF_CISCO_PT 121
|
|
|
|
|
2004-12-15 23:24:13 +00:00
|
|
|
#ifndef BOOL
|
|
|
|
#define BOOL int
|
|
|
|
#endif
|
|
|
|
|
2003-03-31 07:13:36 +00:00
|
|
|
#ifdef __cplusplus
|
|
|
|
extern "C" {
|
2006-09-19 17:07:22 +00:00
|
|
|
#endif
|
|
|
|
|
2003-03-31 07:13:36 +00:00
|
|
|
void h323_gk_urq(void);
|
2004-10-04 10:18:06 +00:00
|
|
|
void h323_end_point_create(void);
|
2003-03-31 07:13:36 +00:00
|
|
|
void h323_end_process(void);
|
2003-12-18 19:54:18 +00:00
|
|
|
int h323_end_point_exist(void);
|
2006-09-19 17:07:22 +00:00
|
|
|
|
2003-03-31 07:13:36 +00:00
|
|
|
void h323_debug(int, unsigned);
|
|
|
|
|
|
|
|
/* callback function handler*/
|
2006-09-19 17:07:22 +00:00
|
|
|
void h323_callback_register(setup_incoming_cb,
|
|
|
|
setup_outbound_cb,
|
|
|
|
on_rtp_cb,
|
|
|
|
start_rtp_cb,
|
|
|
|
clear_con_cb,
|
|
|
|
chan_ringing_cb,
|
|
|
|
con_established_cb,
|
|
|
|
receive_digit_cb,
|
|
|
|
answer_call_cb,
|
|
|
|
progress_cb,
|
|
|
|
rfc2833_cb,
|
|
|
|
hangup_cb,
|
|
|
|
setcapabilities_cb,
|
2006-09-28 10:41:38 +00:00
|
|
|
setpeercapabilities_cb,
|
|
|
|
onhold_cb);
|
2006-09-19 17:07:22 +00:00
|
|
|
int h323_set_capabilities(const char *, int, int, struct ast_codec_pref *, int);
|
2003-03-31 07:13:36 +00:00
|
|
|
int h323_set_alias(struct oh323_alias *);
|
|
|
|
int h323_set_gk(int, char *, char *);
|
2003-06-03 07:11:52 +00:00
|
|
|
void h323_set_id(char *);
|
2004-01-06 16:43:24 +00:00
|
|
|
void h323_show_tokens(void);
|
2003-06-03 07:11:52 +00:00
|
|
|
|
2003-03-31 07:13:36 +00:00
|
|
|
/* H323 listener related funcions */
|
2003-05-31 18:42:09 +00:00
|
|
|
int h323_start_listener(int, struct sockaddr_in);
|
2003-03-31 07:13:36 +00:00
|
|
|
|
2004-07-22 04:24:50 +00:00
|
|
|
void h323_native_bridge(const char *, const char *, char *);
|
2003-03-31 07:13:36 +00:00
|
|
|
|
|
|
|
/* Send a DTMF tone to remote endpoint */
|
|
|
|
void h323_send_tone(const char *call_token, char tone);
|
|
|
|
|
|
|
|
/* H323 create and destroy sessions */
|
2004-12-15 23:24:13 +00:00
|
|
|
int h323_make_call(char *dest, call_details_t *cd, call_options_t *);
|
|
|
|
int h323_clear_call(const char *, int cause);
|
2006-09-19 17:07:22 +00:00
|
|
|
|
2004-05-20 07:07:18 +00:00
|
|
|
/* H.323 alerting and progress */
|
|
|
|
int h323_send_alerting(const char *token);
|
|
|
|
int h323_send_progress(const char *token);
|
2003-03-31 07:13:36 +00:00
|
|
|
int h323_answering_call(const char *token, int);
|
2006-09-19 17:07:22 +00:00
|
|
|
int h323_soft_hangup(const char *data);
|
2003-03-31 07:13:36 +00:00
|
|
|
int h323_show_codec(int fd, int argc, char *argv[]);
|
2006-09-28 10:41:38 +00:00
|
|
|
int h323_hold_call(const char *token, int);
|
2004-09-21 18:42:37 +00:00
|
|
|
|
2003-03-31 07:13:36 +00:00
|
|
|
#ifdef __cplusplus
|
|
|
|
}
|
|
|
|
#endif
|