[Asterisk-cvs] asterisk/channels chan_h323.c,1.74,1.75
jeremy at lists.digium.com
jeremy at lists.digium.com
Thu Sep 30 15:34:32 CDT 2004
Update of /usr/cvsroot/asterisk/channels
In directory mongoose.digium.com:/tmp/cvs-serv23200
Modified Files:
chan_h323.c
Log Message:
massive changes, very broken, do not use (from airport)
Index: chan_h323.c
===================================================================
RCS file: /usr/cvsroot/asterisk/channels/chan_h323.c,v
retrieving revision 1.74
retrieving revision 1.75
diff -u -d -r1.74 -r1.75
--- chan_h323.c 21 Sep 2004 18:42:37 -0000 1.74
+++ chan_h323.c 30 Sep 2004 19:36:46 -0000 1.75
@@ -5,8 +5,8 @@
* By Jeremy McNamara
* For The NuFone Network
*
- * This code has been derived from code created by
- * Michael Manousos and Mark Spencer
+ * chan_h323 has been derived from code created by
+ * Michael Manousos and Mark Spencer
*
* This file is part of the chan_h323 driver for Asterisk
*
@@ -26,7 +26,6 @@
* Version Info: $Id$
*/
-
#include <sys/socket.h>
#include <sys/signal.h>
#include <sys/param.h>
@@ -72,50 +71,44 @@
#endif
#include "h323/chan_h323.h"
-send_digit_cb on_send_digit;
-on_connection_cb on_create_connection;
-setup_incoming_cb on_incoming_call;
-setup_outbound_cb on_outgoing_call;
-start_logchan_cb on_start_logical_channel;
-chan_ringing_cb on_chan_ringing;
-con_established_cb on_connection_established;
-clear_con_cb on_connection_cleared;
-answer_call_cb on_answer_call;
+send_digit_cb on_send_digit;
+on_connection_cb on_create_connection;
+setup_incoming_cb on_incoming_call;
+setup_outbound_cb on_outgoing_call;
+start_logchan_cb on_start_logical_channel;
+chan_ringing_cb on_chan_ringing;
+con_established_cb on_connection_established;
+clear_con_cb on_connection_cleared;
+answer_call_cb on_answer_call;
+/* global debug flag */
int h323debug;
-/** String variables required by ASTERISK */
-static char *type = "H323";
-static char *desc = "The NuFone Network's Open H.323 Channel Driver";
-static char *tdesc = "The NuFone Network's Open H.323 Channel Driver";
+/** Variables required by Asterisk */
+static char *type = "H323";
+static char *desc = "The NuFone Network's Open H.323 Channel Driver";
+static char *tdesc = "The NuFone Network's Open H.323 Channel Driver";
static char *config = "h323.conf";
-
-static char default_context[AST_MAX_EXTENSION];
+static char default_context[AST_MAX_EXTENSION] = "default";
/** H.323 configuration values */
+static int DEFAULT_H323_PORT = 1720;
static char gatekeeper[100];
-static int gatekeeper_disable = 1;
-static int gatekeeper_discover = 0;
-static int usingGk;
-static int port = 1720;
-static int gkroute = 0;
-
-static int noFastStart = 1;
+static int gatekeeper_disable = 1;
+static int gatekeeper_discover = 0;
+static int usingGk;
+static int gkroute = 0;
+static int noFastStart = 0;
static int noH245Tunneling = 0;
-
-/* to find user by alias is default, alternative is the incomming call's source IP address*/
+/* Assume we can native bridge by default */
+static int bridging = 1;
+/* Find user by alias (h.323 id) is default, alternative is the incomming call's source IP address*/
static int userbyalias = 1;
-
-static int bridge_default = 1;
-
/* Just about everybody seems to support ulaw, so make it a nice default */
static int capability = AST_FORMAT_ULAW;
-
/* TOS flag */
static int tos = 0;
-
static int dtmfmode = H323_DTMF_RFC2833;
-
static char secret[50];
/** Private structure of a OpenH323 channel */
@@ -139,6 +132,9 @@
char callerid[80]; /* Caller*ID if available */
struct ast_rtp *rtp; /* RTP Session */
int dtmfmode; /* What DTMF Mode is being used */
+ int noFastStart; /* Determines if this call will utilize FastStart or not */
+ int noH245Tunneling; /* Determines if H.245 Tunneling is used or not */
+ int noSilenceSuppression; /* Determines if Silence Suppression will be used or not */
struct ast_dsp *vad; /* Used for in-band DTMF detection */
struct oh323_pvt *next; /* Next channel in list */
} *iflist = NULL;
@@ -158,11 +154,11 @@
ast_mutex_t lock;
} aliasl;
-/** Asterisk RTP stuff*/
+/** Asterisk RTP stuff */
static struct sched_context *sched;
static struct io_context *io;
-/** Protect the interface list (of oh323_pvt's) */
+/** Protect the interface list (oh323_pvt) */
AST_MUTEX_DEFINE_STATIC(iflock);
/** Usage counter and associated lock */
@@ -173,7 +169,7 @@
when it's doing something critical. */
AST_MUTEX_DEFINE_STATIC(monlock);
-/* Avoid two chan to pass capabilities simultaneaously to the h323 stack. */
+/* Protect the H.323 capabilities list, to avoid more than one channel to set the capabilities simultaneaously in the h323 stack. */
AST_MUTEX_DEFINE_STATIC(caplock);
/* This is the thread for the monitor which checks for input on the channels
@@ -266,8 +262,9 @@
/* set the usage flag to a sane starting value*/
user->inUse = 0;
- /* Assume we can native bridge */
- user->bridge = bridge_default;
+ /* set the native brigding default */
+ user->bridge = bridging;
+ user->context = default_context;
while(v) {
if (!strcasecmp(v->name, "context")) {
@@ -294,7 +291,7 @@
user->incominglimit = 0;
} else if (!strcasecmp(v->name, "host")) {
if (!strcasecmp(v->value, "dynamic")) {
- ast_log(LOG_ERROR, "Dynamic host configuration not implemented, yet!\n");
+ ast_log(LOG_ERROR, "A dynamic host on a type=user does not make any sense\n");
free(user);
return NULL;
} else if (ast_get_ip(&user->addr, v->value)) {
@@ -317,11 +314,12 @@
return user;
}
-
static struct oh323_peer *build_peer(char *name, struct ast_variable *v)
{
struct oh323_peer *peer;
struct oh323_peer *prev;
+ struct ast_ha *oldha = NULL:
+ int format;
int found=0;
prev = NULL;
@@ -353,29 +351,41 @@
if (peer) {
if (!found) {
strncpy(peer->name, name, sizeof(peer->name)-1);
+ peer->addr.sin_port = htons(DEFAULT_H323_PORT);
+ peer->addr.sin_family = AF_INET;
}
-
- /* set the usage flag to a sane starting value*/
- peer->inUse = 0;
+ oldha = peer->ha;
+ peer->ha = NULL:
+ peer->addr.sin_family = AF_INET;
+ peer->capability = capability;
while(v) {
- if (!strcasecmp(v->name, "context")) {
- strncpy(peer->context, v->value, sizeof(peer->context)-1);
- } else if (!strcasecmp(v->name, "bridge")) {
+ if (!strcasecmp(v->name, "bridge")) {
peer->bridge = ast_true(v->value);
} else if (!strcasecmp(v->name, "noFastStart")) {
peer->noFastStart = ast_true(v->value);
+ } else if (!strcasecmp(v->name, "nat")) {
+ peer->nat = ast_true(v->value);
} else if (!strcasecmp(v->name, "noH245Tunneling")) {
peer->noH245Tunneling = ast_true(v->value);
} else if (!strcasecmp(v->name, "noSilenceSuppression")) {
peer->noSilenceSuppression = ast_true(v->value);
+ } else if (!strcasecmp(v->name, "dtmfmode")) {
+ if (!strcasecmp(v->value, "inband") {
+ peer->dtmfmode = H323_DTMF_INBAND;
+ } elsif (!strcasecmp(v->value, "rfc2833") {
+ peer->dtmfmode = H323_DTMF_RFC2833;
+ } else {
+ ast_log(LOG_WARNING, "Unknown DTMF Mode %s, using RFC2833\n", v->value);
+ peer->dtmfmode = H323_DTMF_RFC2833;
+ }
} else if (!strcasecmp(v->name, "outgoinglimit")) {
peer->outgoinglimit = atoi(v->value);
if (peer->outgoinglimit > 0)
peer->outgoinglimit = 0;
} else if (!strcasecmp(v->name, "host")) {
if (!strcasecmp(v->value, "dynamic")) {
- ast_log(LOG_ERROR, "Dynamic host configuration not implemented, yet!\n");
+ ast_log(LOG_ERROR, "Dynamic host configuration not implemented.\n");
free(peer);
return NULL;
}
@@ -390,8 +400,6 @@
return peer;
}
-
-
/**
* Send (play) the specified digit to the channel.
*
@@ -408,7 +416,6 @@
return 0;
}
-
/**
* Make a call over the specified channel to the specified
* destination. This function will parse the destination string
@@ -423,7 +430,6 @@
char *tmp, *cid, *cidname, oldcid[256];
strtok_r(dest, "/", &(tmp));
-
ast_log(LOG_DEBUG, "dest=%s, timeout=%d.\n", dest, timeout);
if (strlen(dest) > sizeof(called_addr) - 1) {
@@ -436,67 +442,66 @@
return -1;
}
- /* outgoing call */
+ /* this is an outgoing call */
p->outgoing = 1;
- /* Clear the call token */
- if ((p->cd).call_token == NULL)
+ /* Ensure the call token is allocated */
+ if ((p->cd).call_token == NULL) {
(p->cd).call_token = (char *)malloc(128);
-
+ }
memset((char *)(p->cd).call_token, 0, 128);
- if (p->cd.call_token == NULL) {
- ast_log(LOG_ERROR, "Not enough memory.\n");
+ if (!p->cd.call_token) {
+ ast_log(LOG_ERROR, "Not enough memory to alocate call token\n");
return -1;
}
- /* Build the address to call */
+ /* Clear and then set the address to call */
memset(called_addr, 0, sizeof(called_addr));
memcpy(called_addr, dest, strlen(dest));
/* Copy callerid, if there is any */
- if (c->callerid) {
+ if (!ast_strlen_zero(c->callerid)) {
memset(oldcid, 0, sizeof(oldcid));
memcpy(oldcid, c->callerid, strlen(c->callerid));
oldcid[sizeof(oldcid)-1] = '\0';
ast_callerid_parse(oldcid, &cidname, &cid);
- if (p->calloptions.callerid) {
+ if (!ast_strlen_zero(p->calloptions.callerid)) {
free(p->calloptions.callerid);
p->calloptions.callerid = NULL;
}
- if (p->calloptions.callername) {
+ if (!ast_strlen_zero(p->calloptions.callername)) {
free(p->calloptions.callername);
p->calloptions.callername = NULL;
}
p->calloptions.callerid = (char*)malloc(256);
- if (p->calloptions.callerid == NULL) {
- ast_log(LOG_ERROR, "Not enough memory.\n");
+ if (!p->calloptions.callerid) {
+ ast_log(LOG_ERROR, "Not enough memory to allocate callerid\n");
return(-1);
}
memset(p->calloptions.callerid, 0, 256);
- if ((cid != NULL)&&(strlen(cid) > 0))
- strncpy(p->calloptions.callerid, cid, 255);
-
+ if ((!ast_strlen_zero(cid))&&(!ast_strlen_zero(cid)) {
+ strncpy(p->calloptions.callerid, cid, sizeof(p->calloptions.callerid)-1);
+ }
p->calloptions.callername = (char*)malloc(256);
- if (p->calloptions.callername == NULL) {
+ if (!p->calloptions.callername) {
ast_log(LOG_ERROR, "Not enough memory.\n");
return(-1);
}
memset(p->calloptions.callername, 0, 256);
- if ((cidname != NULL)&&(strlen(cidname) > 0))
- strncpy(p->calloptions.callername, cidname, 255);
-
+ if (!ast_strlen_zero(cidname) && (!ast_strlen_zero(cidname)) {
+ strncpy(p->calloptions.callername, cidname, sizeof(p->calloptions.callername)-1);
+ }
} else {
- if (p->calloptions.callerid) {
+ if (!ast_strlen_zero(p->calloptions.callerid)) {
free(p->calloptions.callerid);
p->calloptions.callerid = NULL;
}
- if (p->calloptions.callername) {
+ if (!ast_strlen_zero(p->calloptions.callername)) {
free(p->calloptions.callername);
p->calloptions.callername = NULL;
}
}
-
p->calloptions.noFastStart = noFastStart;
p->calloptions.noH245Tunneling = noH245Tunneling;
@@ -512,7 +517,6 @@
static int oh323_answer(struct ast_channel *c)
{
int res;
-
struct oh323_pvt *p = (struct oh323_pvt *) c->pvt->pvt;
res = h323_answering_call(p->cd.call_token, 0);
@@ -807,7 +811,7 @@
ast_mutex_init(&p->lock);
p->cd.call_reference = callid;
- p->bridge = bridge_default;
+ p->bridge = bridgeing;
p->dtmfmode = dtmfmode;
if (p->dtmfmode & H323_DTMF_RFC2833)
@@ -850,29 +854,82 @@
}
-static struct ast_channel *oh323_request(char *type, int format, void *data)
+static int create_addr(struct oh323_pvt *r, char *opeer)
{
+ struct hostent *hp;
+ struct ast_hostent ahp;
+ struct oh323_peer *p;
+ int found = 0;
+ char *port;
+ char *callhost;
+ int portno;
+ char host[256], *hostn;
+ char peer[256] = "";
+ strncpy(peer, opeer, sizeof(peer) - 1);
+ port = strchr(peer, ':');
+ if (port) {
+ *port = '\0';
+ port++;
+ }
+ r->sa.sin_family = AF_INET;
+ ast_mutex_lock(&peerl.lock);
+ p = find_peer(peer, NULL);
+ if (p) {
+ found++;
+ r->capability = p->capability;
+ r->nat = p->nat;
+ if (r->rtp) {
+ ast_log(LOG_DEBUG, "Setting NAT on RTP to %d\n," r->nat);
+ ast_rtp_setnat(r->rtp, r->nat);
+ }
+ r->noFastStart = p->noFastStart;
+ r->noH245Tunneling = p->noH245Tunneling;
+ r->noSilenceSuppression = p->noSilenceSuppression;
+
+ if (p->dtmfmode) {
+ r->dtmfmode = p->dtmfmode;
+ if (r->dtmfmode & H323_DTMF_RFC2833) {
+ p->nonCodecCapability |= AST_RTP_DTMF;
+ } else {
+ p->nonCodecCapability &= ~AST_RTP_DTMF;
+ }
+ }
+
+}
+static struct ast_channel *oh323_request(char *type, int format, void *data)
+{
int oldformat;
struct oh323_pvt *p;
struct ast_channel *tmpc = NULL;
- char *dest = (char *) data;
+ char *dest = (char *)data;
char *ext, *host;
char *h323id = NULL;
char tmp[256];
-
ast_log(LOG_DEBUG, "type=%s, format=%d, data=%s.\n", type, format, (char *)data);
+ p = oh323_alloc(0);
+ if (!p) {
+ ast_log(LOG_WARNING, "Unable to build pvt data for '%s'\n", (char *)data);
+ return NULL;
+ }
oldformat = format;
format &= capability;
if (!format) {
ast_log(LOG_NOTICE, "Asked to get a channel of unsupported format '%d'\n", format);
return NULL;
}
+
+ /* Assign a default capability */
+ p->capability = capability;
+
+ /* pass on our preferred codec to the H.323 stack */
+ ast_mutex_lock(&caplock);
+ h323_set_capability(format, dtmfmode);
+ ast_mutex_unlock(&caplock);
- strncpy(tmp, dest, sizeof(tmp) - 1);
-
+ strncpy(tmp, dest, sizeof(tmp) - 1);
host = strchr(tmp, '@');
if (host) {
*host = '\0';
@@ -882,46 +939,27 @@
host = tmp;
ext = NULL;
}
-
- strtok_r(host, "/", &(h323id));
-
+ strtok_r(host, "/", &(h323id));
if (h323id && !ast_strlen_zero(h323id)) {
h323_set_id(h323id);
}
-
- p = oh323_alloc(0);
-
- if (!p) {
- ast_log(LOG_WARNING, "Unable to build pvt data for '%s'\n", (char *)data);
- return NULL;
- }
-
- /* Assign a default capability */
- p->capability = capability;
-
- if (p->dtmfmode) {
- if (p->dtmfmode & H323_DTMF_RFC2833) {
- p->nonCodecCapability |= AST_RTP_DTMF;
- } else {
- p->nonCodecCapability &= ~AST_RTP_DTMF;
- }
- }
- /* pass on our preferred codec to the H.323 stack */
- ast_mutex_lock(&caplock);
- h323_set_capability(format, dtmfmode);
- ast_mutex_unlock(&caplock);
-
if (ext) {
strncpy(p->username, ext, sizeof(p->username) - 1);
}
ast_log(LOG_DEBUG, "Host: %s\tUsername: %s\n", host, p->username);
+ if (create_addr(p, host) {
+ oh323_destroy(p);
+ return NULL;
+ }
+ ast_mutex_lock(&p->lock);
tmpc = oh323_new(p, AST_STATE_DOWN, host);
- if (!tmpc)
+ ast_mutex_unlock(&p->lock);
+ if (!tmpc) {
oh323_destroy(p);
-
+ }
+ ast_update_use_count();
restart_monitor();
-
return tmpc;
}
@@ -1700,7 +1738,7 @@
} else if (!strcasecmp(v->name, "UserByAlias")) {
userbyalias = ast_true(v->value);
} else if (!strcasecmp(v->name, "bridge")) {
- bridge_default = ast_true(v->value);
+ bridging = ast_true(v->value);
} else if (!strcasecmp(v->name, "noFastStart")) {
noFastStart = ast_true(v->value);
} else if (!strcasecmp(v->name, "noH245Tunneling")) {
More information about the svn-commits
mailing list