From 4f944c0e3d04de23105c00e8112ca79e77614ee6 Mon Sep 17 00:00:00 2001 From: Jeremy McNamara Date: Mon, 25 Aug 2003 09:54:36 +0000 Subject: disable native bridging git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@1424 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- channels/chan_h323.c | 94 ++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 72 insertions(+), 22 deletions(-) diff --git a/channels/chan_h323.c b/channels/chan_h323.c index f02f00ee1..7aa271a24 100755 --- a/channels/chan_h323.c +++ b/channels/chan_h323.c @@ -23,6 +23,7 @@ * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * + * Version Info: $Id$ */ @@ -656,7 +657,7 @@ static struct ast_channel *oh323_new(struct oh323_pvt *i, int state, const char ch->pvt->write = oh323_write; ch->pvt->indicate = oh323_indicate; ch->pvt->fixup = oh323_fixup; - ch->pvt->bridge = ast_rtp_bridge; +// ch->pvt->bridge = ast_rtp_bridge; /* Set the owner of this channel */ i->owner = ch; @@ -895,23 +896,36 @@ int send_digit(unsigned call_reference, char digit) /** * Call-back function that gets called when any H.323 connection is made * - * Returns the local RTP port + * Returns the local RTP information */ -int create_connection(unsigned call_reference) +struct rtp_info *create_connection(unsigned call_reference) { struct oh323_pvt *p; struct sockaddr_in us; + struct sockaddr_in them; + struct rtp_info *info; + + info = malloc(sizeof(struct rtp_info)); p = find_call(call_reference); if (!p) { ast_log(LOG_ERROR, "Unable to allocate private structure, this is very bad.\n"); - return -1; + return NULL; } /* figure out our local RTP port and tell the H.323 stack about it*/ ast_rtp_get_us(p->rtp, &us); - return ntohs(us.sin_port); + ast_rtp_get_peer(p->rtp, &them); + + printf(" us: %s:%d\n", inet_ntoa(us.sin_addr), ntohs(us.sin_port)); + printf("them: %s:%d\n", inet_ntoa(them.sin_addr), ntohs(them.sin_port)); + + info->addr = inet_ntoa(us.sin_addr); + info->port = ntohs(us.sin_port); + + printf("info: %s:%d\n", info->addr, info->port); + return info; } /** @@ -945,10 +959,10 @@ int setup_incoming_call(call_details_t cd) if (h323debug) { printf(" == Setting up Call\n"); - printf(" -- Calling party name: %s\n", p->cd.call_source_aliases); - printf(" -- Calling party number: %s\n", p->cd.call_source_e164); - printf(" -- Called party name: %s\n", p->cd.call_dest_alias); - printf(" -- Called party number: %s\n", p->cd.call_dest_e164); + printf(" -- Calling party name: [%s]\n", p->cd.call_source_aliases); + printf(" -- Calling party number: [%s]\n", p->cd.call_source_e164); + printf(" -- Called party name: [%s]\n", p->cd.call_dest_alias); + printf(" -- Called party number: [%s]\n", p->cd.call_dest_e164); } /* Decide if we are allowing Gatekeeper routed calls*/ @@ -970,14 +984,17 @@ int setup_incoming_call(call_details_t cd) strncpy(p->context, alias->context, sizeof(p->context)-1); } + sprintf(p->callerid, "%s <%s>", p->cd.call_source_aliases, p->cd.call_source_e164); } else { /* Either this call is not from the Gatekeeper or we are not allowing gk routed calls */ + user = find_user(cd.call_source_aliases); - + + if (!user) { sprintf(p->callerid, "%s <%s>", p->cd.call_source_aliases, p->cd.call_source_e164); if (strlen(p->cd.call_dest_e164)) { @@ -991,16 +1008,18 @@ int setup_incoming_call(call_details_t cd) } strncpy(p->context, default_context, sizeof(p->context)-1); ast_log(LOG_DEBUG, "Sending %s to context [%s]\n", cd.call_source_aliases, p->context); - } else { + } else { if (user->host) { if (strcasecmp(cd.sourceIp, inet_ntoa(user->addr.sin_addr))){ if(!strlen(default_context)) { ast_log(LOG_ERROR, "Call from user '%s' rejected due to non-matching IP address of '%s'\n", user->name, cd.sourceIp); - return 0; + return 0; } + strncpy(p->context, default_context, sizeof(p->context)-1); sprintf(p->exten,"i"); + goto exit; } } @@ -1017,13 +1036,14 @@ int setup_incoming_call(call_details_t cd) strncpy(p->callerid, user->callerid, sizeof(p->callerid) - 1); else sprintf(p->callerid, "%s <%s>", p->cd.call_source_aliases, p->cd.call_source_e164); - + if (strlen(p->cd.call_dest_e164)) { strncpy(p->exten, cd.call_dest_e164, sizeof(p->exten)-1); + printf("e164: [%s]\n", p->exten); } else { strncpy(p->exten, cd.call_dest_alias, sizeof(p->exten)-1); + printf("dest alias: %s\n", p->exten); } - if (strlen(user->accountcode)) { strncpy(p->accountcode, user->accountcode, sizeof(p->accountcode)-1); } @@ -1036,6 +1056,7 @@ int setup_incoming_call(call_details_t cd) /* I know this is horrid, don't kill me saddam */ exit: /* allocate a channel and tell asterisk about it */ + printf("exten b4: %s\n", p->exten); c = oh323_new(p, AST_STATE_RINGING, cd.call_token); if (!c) { @@ -1579,9 +1600,9 @@ static struct ast_rtp *oh323_get_rtp_peer(struct ast_channel *chan) { struct oh323_pvt *p; p = chan->pvt->pvt; - if (p && p->rtp && p->bridge) + if (p && p->rtp && p->bridge) { return p->rtp; - ast_log(LOG_ERROR, "No associated RTP structure in pvt???\n"); + } return NULL; } @@ -1590,18 +1611,46 @@ static struct ast_rtp *oh323_get_vrtp_peer(struct ast_channel *chan) return NULL; } +static char *convertcap(int cap) +{ + switch (cap) { + case AST_FORMAT_G723_1: + return "G.723"; + case AST_FORMAT_GSM: + return "GSM"; + case AST_FORMAT_ULAW: + return "ULAW"; + case AST_FORMAT_ALAW: + return "ALAW"; + case AST_FORMAT_ADPCM: + return "G.728"; + case AST_FORMAT_G729A: + return "G.729"; + case AST_FORMAT_SPEEX: + return "SPEEX"; + case AST_FORMAT_ILBC: + return "ILBC"; + default: + ast_log(LOG_NOTICE, "Don't know how to deal with mode %d\n", cap); + return NULL; + } + +} + static int oh323_set_rtp_peer(struct ast_channel *chan, struct ast_rtp *rtp, struct ast_rtp *vrtp) { /* XXX Deal with Video */ - struct oh323_pvt *p; struct sockaddr_in them; struct sockaddr_in us; + char *mode; + + mode = convertcap(chan->writeformat); if (!rtp) { - ast_log(LOG_NOTICE, "RTP is Null\n"); return 0; } + p = chan->pvt->pvt; if (!p) { ast_log(LOG_ERROR, "No Private Structure, this is bad\n"); @@ -1609,12 +1658,13 @@ static int oh323_set_rtp_peer(struct ast_channel *chan, struct ast_rtp *rtp, str } ast_rtp_get_peer(rtp, &them); - printf("peer is now: %s\n", inet_ntoa(them.sin_addr)); + ast_rtp_get_us(rtp, &us); + + printf("peer is now: %s:%d\n", inet_ntoa(them.sin_addr), htons(them.sin_port)); + printf("Us is: %s\n", inet_ntoa(us.sin_addr)); - ast_rtp_set_peer(p->rtp, &them); - ast_rtp_get_us(p->rtp, &us); - h323_native_bridge(p->cd.call_token, inet_ntoa(them.sin_addr), inet_ntoa(us.sin_addr)); + h323_native_bridge(p->cd.call_token, inet_ntoa(them.sin_addr), mode); return 0; -- cgit v1.2.3