--- channels/chan_ooh323.c 2008-06-04 21:35:29.000000000 +0400 +++ ../../asterisk-addons-1.6.1.0/channels/chan_ooh323.c 2009-06-03 06:52:33.000000000 +0400 @@ -32,6 +32,7 @@ #define H323_ALREADYGONE (1<<5) #define H323_NEEDDESTROY (1<<6) #define H323_DISABLEGK (1<<7) +#define H323_NEEDSTART (1<<8) /* Channel description */ static const char type[] = "OOH323"; @@ -58,10 +59,8 @@ struct ast_rtp *vrtp, struct ast_rtp *trtp, int codecs, int nat_active); static void print_codec_to_cli(int fd, struct ast_codec_pref *pref); - -#if 0 static void ast_ooh323c_exit(); -#endif + static const struct ast_channel_tech ooh323_tech = { .type = type, @@ -79,7 +78,7 @@ .indicate = ooh323_indicate, .fixup = ooh323_fixup, .send_html = 0, - .bridge = ast_rtp_bridge, + /* .bridge = ast_rtp_bridge, */ }; static struct ast_rtp_protocol ooh323_rtp = { @@ -89,12 +88,18 @@ .set_rtp_peer = ooh323_set_rtp_peer }; +struct ooh323_user; + /* H.323 channel private structure */ static struct ooh323_pvt { ast_mutex_t lock; /* Channel private lock */ struct ast_rtp *rtp; struct ast_rtp *vrtp; /* Placeholder for now */ struct ast_channel *owner; /* Master Channel */ + union { + char *user; /* cooperating user/peer */ + char *peer; + } neighbor; time_t lastrtptx; time_t lastrtprx; unsigned int flags; @@ -124,6 +129,7 @@ char accountcode[256]; /* Account code */ int nat; int amaflags; + int progsent; /* progress is sent */ struct ast_dsp *vad; struct ooh323_pvt *next; /* Next entity */ } *iflist = NULL; @@ -193,6 +199,9 @@ AST_MUTEX_DEFINE_STATIC(ooh323c_cmd_lock); +static long callnumber = 0; +AST_MUTEX_DEFINE_STATIC(ooh323c_cn_lock); + /* stack callbacks */ int onAlerting(ooCallData *call); int onNewCallCreated(ooCallData *call); @@ -202,7 +211,7 @@ static char gLogFile[256] = DEFAULT_LOGFILE; static int gPort = 1720; static char gIP[20]; -static char gCallerID[AST_MAX_EXTENSION] = DEFAULT_H323ID; +static char gCallerID[AST_MAX_EXTENSION] = ""; static struct ooAliases *gAliasList; static int gCapability = AST_FORMAT_ULAW; static struct ast_codec_pref gPrefs; @@ -219,10 +228,16 @@ static char gAccountcode[80] = DEFAULT_H323ACCNT; static int gAMAFLAGS; static char gContext[AST_MAX_EXTENSION] = DEFAULT_CONTEXT; -static int gIncomingLimit = 4; -static int gOutgoingLimit = 4; +static int gIncomingLimit = 1024; +static int gOutgoingLimit = 1024; OOBOOL gH323Debug = FALSE; +static int t35countrycode = 0; +static int t35extensions = 0; +static int manufacturer = 0; +static char vendor[AST_MAX_EXTENSION] = ""; +static char version[AST_MAX_EXTENSION] = ""; + static struct ooh323_config { int mTCPPortStart; @@ -254,7 +269,11 @@ /* Don't hold a h323 pvt lock while we allocate a channel */ ast_mutex_unlock(&i->lock); - ch = ast_channel_alloc(1, state, i->callerid_num, i->callerid_name, i->accountcode, i->exten, i->context, i->amaflags, "OOH323/%s-%08x", host, i); + ch = ast_channel_alloc(1, state, i->callerid_num, i->callerid_name, i->accountcode, i->exten, i->context, i->amaflags, "OOH323/%s-%ld", host, callnumber); + ast_mutex_lock(&ooh323c_cn_lock); + callnumber++; + ast_mutex_unlock(&ooh323c_cn_lock); + ast_mutex_lock(&i->lock); if (ch) { @@ -272,9 +291,9 @@ ch->rings = 1; ch->adsicpe = AST_ADSI_UNAVAILABLE; - ch->writeformat = fmt; + ch->writeformat = AST_FORMAT_SLINEAR; ch->rawwriteformat = fmt; - ch->readformat = fmt; + ch->readformat = AST_FORMAT_SLINEAR; ch->rawreadformat = fmt; ch->tech_pvt = i; i->owner = ch; @@ -296,15 +315,19 @@ ast_copy_string(ch->exten, i->exten, sizeof(ch->exten)); ch->priority = 1; - if (i->callerid_name) { + + /* Leak! it's done by ast_channel_alloc */ + /* if (i->callerid_name) + { ch->cid.cid_name = strdup(i->callerid_name); } if (i->callerid_num) { ch->cid.cid_num = strdup(i->callerid_num); - } + } */ - if (!ast_test_flag(i, H323_OUTGOING)) { + if(!ast_test_flag(i, H323_OUTGOING)) + { if (!ast_strlen_zero(i->caller_h323id)) { pbx_builtin_setvar_helper(ch, "_CALLER_H323ID", i->caller_h323id); @@ -331,19 +354,20 @@ ast_setstate(ch, state); if (state != AST_STATE_DOWN) { - if (ast_pbx_start(ch)) { + if (ast_pbx_start(ch)) { ast_log(LOG_WARNING, "Unable to start PBX on %s\n", ch->name); - ast_channel_unlock(ch); + ast_channel_unlock(ch); ast_hangup(ch); ch = NULL; - } - } + } + /* ast_set_flag(i, H323_NEEDSTART); + restart_monitor(); */ + } } else ast_log(LOG_WARNING, "Unable to allocate channel structure\n"); - if (ch) - ast_channel_unlock(ch); + if(ch) ast_channel_unlock(ch); if (gH323Debug) ast_verbose("+++ h323_new\n"); @@ -368,6 +392,7 @@ ast_mutex_init(&pvt->lock); ast_mutex_lock(&pvt->lock); + if (!inet_aton(gIP, &ipAddr)) { ast_log(LOG_ERROR, "Invalid OOH323 driver ip address\n"); ast_mutex_unlock(&pvt->lock); @@ -376,6 +401,7 @@ return NULL; } + if (!(pvt->rtp = ast_rtp_new_with_bindaddr(sched, io, 1, 0, ipAddr))) { ast_log(LOG_WARNING, "Unable to create RTP session: %s\n", strerror(errno)); @@ -398,6 +424,7 @@ pvt->dtmfmode = gDTMFMode; ast_copy_string(pvt->context, gContext, sizeof(pvt->context)); ast_copy_string(pvt->accountcode, gAccountcode, sizeof(pvt->accountcode)); + pvt->amaflags = gAMAFLAGS; pvt->capability = gCapability; memcpy(&pvt->prefs, &gPrefs, sizeof(pvt->prefs)); @@ -420,7 +447,8 @@ Possible data values - peername, exten/peername, exten@ip */ static struct ast_channel *ooh323_request(const char *type, int format, - void *data, int *cause) + void *data, int *cause) + { struct ast_channel *chan = NULL; struct ooh323_pvt *p = NULL; @@ -455,7 +483,8 @@ /* This is an outgoing call, since ooh323_request is called */ ast_set_flag(p, H323_OUTGOING); - ast_copy_string(tmp, data, sizeof(data)); + + ast_copy_string(tmp, data, sizeof(tmp)); dest = strchr(tmp, '/'); @@ -531,6 +560,23 @@ ast_mutex_lock(&iflock); ooh323_destroy(p); ast_mutex_unlock(&iflock); + } else { + ast_mutex_lock(&p->lock); + p->callToken = (char*)malloc(AST_MAX_EXTENSION); + if(!p->callToken) + { + ast_mutex_unlock(&p->lock); + ast_mutex_lock(&iflock); + ooh323_destroy(p); + ast_mutex_unlock(&iflock); + ast_log(LOG_ERROR, "Failed to allocate memory for callToken\n"); + return NULL; /* TODO: need to clean/hangup?? */ + } + + ast_mutex_unlock(&p->lock); + ast_mutex_lock(&ooh323c_cmd_lock); + ooMakeCall(data, p->callToken, AST_MAX_EXTENSION, NULL); + ast_mutex_unlock(&ooh323c_cmd_lock); } restart_monitor(); @@ -569,9 +615,10 @@ struct ooh323_user *user; if (gH323Debug) - ast_verbose("--- find_user\n"); + ast_verbose("--- find_user: %s, %s\n",name,ip); ast_mutex_lock(&userl.lock); + for (user = userl.users; user; user = user->next) { if (ip && user->mUseIP && !strcmp(user->mIP, ip)) { break; @@ -580,6 +627,7 @@ break; } } + ast_mutex_unlock(&userl.lock); if (gH323Debug) @@ -627,6 +675,7 @@ if (gH323Debug) ast_verbose("--- find_peer \"%s\"\n", name); + ast_mutex_lock(&peerl.lock); for (peer = peerl.peers; peer; peer = peer->next) { if (gH323Debug) { @@ -677,9 +726,9 @@ (p->dtmfmode & H323_DTMF_H245SIGNAL))) { dtmf[0] = digit; dtmf[1] = '\0'; - ast_mutex_lock(&ooh323c_cmd_lock); + /* ast_mutex_lock(&ooh323c_cmd_lock); */ ooSendDTMFDigit(p->callToken, dtmf); - ast_mutex_unlock(&ooh323c_cmd_lock); + /* ast_mutex_unlock(&ooh323c_cmd_lock); */ } ast_mutex_unlock(&p->lock); if (gH323Debug) @@ -715,18 +764,21 @@ { struct ooh323_pvt *p = ast->tech_pvt; char destination[256]; - int res = 0; + int res=0, i; const char *val = NULL; ooCallOptions opts = { .fastStart = TRUE, .tunneling = TRUE, .disableGk = TRUE, - .callMode = OO_CALLMODE_AUDIOCALL + .callMode = OO_CALLMODE_AUDIOCALL, + .transfercap = 0 }; if (gH323Debug) ast_verbose("--- ooh323_call- %s\n", dest); - if ((ast->_state != AST_STATE_DOWN) && (ast->_state != AST_STATE_RESERVED)) { + + if ((ast->_state != AST_STATE_DOWN) && (ast->_state != AST_STATE_RESERVED)) + { ast_log(LOG_WARNING, "ooh323_call called on %s, neither down nor " "reserved\n", ast->name); return -1; @@ -734,23 +786,17 @@ ast_mutex_lock(&p->lock); ast_set_flag(p, H323_OUTGOING); if (ast->cid.cid_num) { - if (p->callerid_num) { - free(p->callerid_num); - } + if(p->callerid_num) free(p->callerid_num); p->callerid_num = strdup(ast->cid.cid_num); } if (ast->cid.cid_name) { - if (p->callerid_name) { - free(p->callerid_name); - } + if(p->callerid_name) free(p->callerid_name); p->callerid_name = strdup(ast->cid.cid_name); } else{ ast->cid.cid_name = strdup(gCallerID); - if (p->callerid_name) { - free(p->callerid_name); - } + if(p->callerid_name) free(p->callerid_name); p->callerid_name = strdup(ast->cid.cid_name); } @@ -763,9 +809,7 @@ if ((val = pbx_builtin_getvar_helper(ast, "CALLER_H323DIALEDDIGITS"))) { ast_copy_string(p->caller_dialedDigits, val, sizeof(p->caller_dialedDigits)); - if (!p->callerid_num) { - p->callerid_num = strdup(val); - } + if(!p->callerid_num) p->callerid_num = strdup(val); } if ((val = pbx_builtin_getvar_helper(ast, "CALLER_H323EMAIL"))) { @@ -776,13 +820,6 @@ ast_copy_string(p->caller_url, val, sizeof(p->caller_url)); } - - if (!(p->callToken = (char*)malloc(AST_MAX_EXTENSION))) { - ast_mutex_unlock(&p->lock); - ast_log(LOG_ERROR, "Failed to allocate memory for callToken\n"); - return -1; /* TODO: need to clean/hangup?? */ - } - if (p->host && p->port != 0) snprintf(destination, sizeof(destination), "%s:%d", p->host, p->port); else if (p->host) @@ -790,17 +827,27 @@ else ast_copy_string(destination, dest, sizeof(destination)); - ast_mutex_lock(&ooh323c_cmd_lock); - if (OO_TESTFLAG(p->flags, H323_DISABLEGK)) - res = ooMakeCall(destination, p->callToken, AST_MAX_EXTENSION, &opts); - else - res = ooMakeCall(destination, p->callToken, AST_MAX_EXTENSION, NULL); - ast_mutex_unlock(&ooh323c_cmd_lock); + destination[sizeof(destination)-1]='\0'; + + opts.transfercap = ast->transfercapability; + + if(OO_TESTFLAG(p->flags, H323_DISABLEGK)) { + + for (i=0;i<160 && !isRunning(p->callToken);i++) usleep(12000); + + res = ooRunCall(destination, p->callToken, AST_MAX_EXTENSION, &opts); + + } else { + + for (i=0;i<160 && !isRunning(p->callToken);i++) usleep(12000); + + res = ooRunCall(destination, p->callToken, AST_MAX_EXTENSION, NULL); + } ast_mutex_unlock(&p->lock); if (res != OO_OK) { ast_log(LOG_ERROR, "Failed to make call\n"); - return -1; /* TODO: cleanup */ + return -1; /* ToDO: cleanup */ } if (gH323Debug) ast_verbose("+++ ooh323_call\n"); @@ -811,6 +858,7 @@ static int ooh323_hangup(struct ast_channel *ast) { struct ooh323_pvt *p = ast->tech_pvt; + int q931cause = AST_CAUSE_NORMAL_CLEARING; if (gH323Debug) ast_verbose("--- ooh323_hangup\n"); @@ -818,19 +866,39 @@ if (p) { ast_mutex_lock(&p->lock); + if (ast->hangupcause) { + q931cause = ast->hangupcause; + } else { + const char *cause = pbx_builtin_getvar_helper(ast, "DIALSTATUS"); + if (cause) { + if (!strcmp(cause, "CONGESTION")) { + q931cause = AST_CAUSE_NORMAL_CIRCUIT_CONGESTION; + } else if (!strcmp(cause, "BUSY")) { + q931cause = AST_CAUSE_USER_BUSY; + } else if (!strcmp(cause, "CHANISUNVAIL")) { + q931cause = AST_CAUSE_REQUESTED_CHAN_UNAVAIL; + } else if (!strcmp(cause, "NOANSWER")) { + q931cause = AST_CAUSE_NO_ANSWER; + } else if (!strcmp(cause, "CANCEL")) { + q931cause = AST_CAUSE_CALL_REJECTED; + } + } + } + + + if (gH323Debug) - ast_verbose(" hanging %s\n", p->username); + ast_verbose(" hanging %s with cause: %d\n", p->username, q931cause); ast->tech_pvt = NULL; if (!ast_test_flag(p, H323_ALREADYGONE)) { ast_mutex_lock(&ooh323c_cmd_lock); - ooHangCall(p->callToken, - ooh323_convert_hangupcause_asteriskToH323(p->owner->hangupcause)); + ooHangCall(p->callToken, + ooh323_convert_hangupcause_asteriskToH323(q931cause), q931cause); ast_mutex_unlock(&ooh323c_cmd_lock); ast_set_flag(p, H323_ALREADYGONE); /* ast_mutex_unlock(&p->lock); */ - } else { + } else ast_set_flag(p, H323_NEEDDESTROY); - } /* detach channel here */ if (p->owner) { p->owner->tech_pvt = NULL; @@ -847,7 +915,7 @@ } else { ast_log(LOG_ERROR, "No call to hangup\n" ); - return -1; + /* return -1; */ } if (gH323Debug) @@ -867,11 +935,12 @@ if (ast->_state != AST_STATE_UP) { ast_channel_lock(ast); ast_setstate(ast, AST_STATE_UP); + if (option_debug) ast_debug(1, "ooh323_answer(%s)\n", ast->name); ast_channel_unlock(ast); - ast_mutex_lock(&ooh323c_cmd_lock); + /* ast_mutex_lock(&ooh323c_cmd_lock); */ ooAnswerCall(p->callToken); - ast_mutex_unlock(&ooh323c_cmd_lock); + /* ast_mutex_unlock(&ooh323c_cmd_lock); */ } ast_mutex_unlock(&p->lock); @@ -901,6 +970,7 @@ { struct ooh323_pvt *p = ast->tech_pvt; int res = 0; + char *callToken = (char *)NULL; if (f->frametype == AST_FRAME_VOICE) { if (!(f->subclass & ast->nativeformats)) { @@ -908,9 +978,22 @@ "formats is %d (read/write = %d/%d)\n", f->subclass, ast->nativeformats, ast->readformat, ast->writeformat); + /* ast_set_write_format(ast, f->subclass); */ return 0; } if (p) { +/* sending progress for first */ + if (!ast_test_flag(p, H323_OUTGOING) && !p->progsent) { + ast_mutex_lock(&p->lock); + callToken = (p->callToken ? strdup(p->callToken) : NULL); + ast_mutex_unlock(&p->lock); + + /* ast_mutex_lock(&ooh323c_cmd_lock); */ + ooManualProgress(callToken); + /* ast_mutex_unlock(&ooh323c_cmd_lock); */ + p->progsent = 1; + free(callToken); + } ast_mutex_lock(&p->lock); if (p->rtp) res = ast_rtp_write(p->rtp, f); @@ -946,12 +1029,12 @@ if (gH323Debug) ast_verbose("----- ooh323_indicate %d on call %s\n", condition, callToken); - + ast_mutex_lock(&p->lock); switch (condition) { case AST_CONTROL_CONGESTION: if (!ast_test_flag(p, H323_ALREADYGONE)) { ast_mutex_lock(&ooh323c_cmd_lock); - ooHangCall(callToken, OO_REASON_LOCAL_CONGESTED); + ooHangCall(callToken, OO_REASON_LOCAL_CONGESTED, AST_CAUSE_SWITCH_CONGESTION); ast_mutex_unlock(&ooh323c_cmd_lock); ast_set_flag(p, H323_ALREADYGONE); } @@ -959,7 +1042,7 @@ case AST_CONTROL_BUSY: if (!ast_test_flag(p, H323_ALREADYGONE)) { ast_mutex_lock(&ooh323c_cmd_lock); - ooHangCall(callToken, OO_REASON_LOCAL_BUSY); + ooHangCall(callToken, OO_REASON_LOCAL_BUSY, AST_CAUSE_USER_BUSY); ast_mutex_unlock(&ooh323c_cmd_lock); ast_set_flag(p, H323_ALREADYGONE); } @@ -970,9 +1053,26 @@ case AST_CONTROL_UNHOLD: ast_moh_stop(ast); break; - case AST_CONTROL_PROCEEDING: - case AST_CONTROL_RINGING: case AST_CONTROL_PROGRESS: + if (!p->progsent) { + /* ast_mutex_lock(&ooh323c_cmd_lock); */ + if (gH323Debug) + ast_log(LOG_DEBUG,"Sending manual progress for %s, res = %d\n", callToken, + ooManualProgress(callToken)); else + ooManualProgress(callToken); + p->progsent = 1; + /* ast_mutex_unlock(&ooh323c_cmd_lock); */ + } + break; + case AST_CONTROL_RINGING: + /* ast_mutex_lock(&ooh323c_cmd_lock); */ + if (gH323Debug) + ast_log(LOG_DEBUG,"Sending manual ringback for %s, res = %d\n", callToken, + ooManualRingback(callToken)); else + ooManualRingback(callToken); + /* ast_mutex_unlock(&ooh323c_cmd_lock); */ + break; + case AST_CONTROL_PROCEEDING: case -1: break; default: @@ -980,10 +1080,12 @@ condition, callToken); } + ast_mutex_unlock(&p->lock); + if (gH323Debug) ast_verbose("++++ ooh323_indicate %d on %s\n", condition, callToken); - + free(callToken); return -1; } @@ -1018,13 +1120,12 @@ void ooh323_set_write_format(ooCallData *call, int fmt) { -#if 0 struct ooh323_pvt *p = NULL; char formats[512]; -#ifdef print_debug - printf("--- ooh323_update_writeformat %s\n", - ast_getformatname_multiple(formats,512, fmt)); -#endif + + if (gH323Debug) + ast_verbose("--- ooh323_update_writeformat %s\n", + ast_getformatname_multiple(formats,512, fmt)); p = find_call(call); if (!p) { @@ -1035,34 +1136,45 @@ ast_mutex_lock(&p->lock); p->writeformat = fmt; - ast_mutex_unlock(&p->lock); if (p->owner) { - printf("Writeformat before update %s\n", + while (p->owner && ast_channel_trylock(p->owner)) { + ast_debug(1,"Failed to grab lock, trying again\n"); + ast_mutex_unlock(&p->lock); + usleep(1); + ast_mutex_lock(&p->lock); + } + if (!p->owner) { + ast_mutex_unlock(&p->lock); + ast_log(LOG_ERROR, "Channel has no owner\n"); + return; + } + if (gH323Debug) + ast_verbose("Writeformat before update %s\n", ast_getformatname_multiple(formats,512, p->owner->writeformat)); - ast_set_write_format(p->owner, fmt); - } - else - ast_log(LOG_ERROR, "No owner found\n"); + p->owner->nativeformats = fmt; + ast_set_write_format(p->owner, p->owner->writeformat); + ast_set_read_format(p->owner, p->owner->readformat); + ast_channel_unlock(p->owner); + } else + ast_log(LOG_ERROR, "No owner found\n"); -#ifdef print_debug - printf("+++ ooh323_update_writeformat\n"); -#endif -#endif -} + ast_mutex_unlock(&p->lock); + if (gH323Debug) + ast_verbose("+++ ooh323_update_writeformat\n"); +} void ooh323_set_read_format(ooCallData *call, int fmt) { -#if 0 struct ooh323_pvt *p = NULL; char formats[512]; -#ifdef print_debug - printf("--- ooh323_update_readformat %s\n", - ast_getformatname_multiple(formats,512, fmt)); -#endif + if (gH323Debug) + ast_verbose("--- ooh323_update_readformat %s\n", + ast_getformatname_multiple(formats,512, fmt)); + p = find_call(call); if (!p) { ast_log(LOG_ERROR, "No matching call found for %s\n", call->callToken); @@ -1070,16 +1182,40 @@ } ast_mutex_lock(&p->lock); + p->readformat = fmt; + + + if (p->owner) { + while (p->owner && ast_channel_trylock(p->owner)) { + ast_debug(1,"Failed to grab lock, trying again\n"); + ast_mutex_unlock(&p->lock); + usleep(1); + ast_mutex_lock(&p->lock); + } + if (!p->owner) { + ast_mutex_unlock(&p->lock); + ast_log(LOG_ERROR, "Channel has no owner\n"); + return; + } + + if (gH323Debug) + ast_verbose("Readformat before update %s\n", + ast_getformatname_multiple(formats,512, p->owner->readformat)); + p->owner->nativeformats = fmt; + ast_set_read_format(p->owner, p->owner->readformat); + ast_set_write_format(p->owner, p->owner->writeformat); + ast_channel_unlock(p->owner); + } else + ast_log(LOG_ERROR, "No owner found\n"); + ast_mutex_unlock(&p->lock); - ast_set_read_format(p->owner, fmt); - -#ifdef print_debug - printf("+++ ooh323_update_readformat\n"); -#endif -#endif + + if (gH323Debug) + ast_verbose("+++ ooh323_update_readformat\n"); } + int onAlerting(ooCallData *call) { struct ooh323_pvt *p = NULL; @@ -1088,31 +1224,34 @@ if (gH323Debug) ast_verbose("--- onAlerting %s\n", call->callToken); - if (!(p = find_call(call))) { + p = find_call(call); + + if(!p) { ast_log(LOG_ERROR, "No matching call found\n"); return -1; } ast_mutex_lock(&p->lock); - if (!ast_test_flag(p, H323_OUTGOING)) { - if (!(c = ooh323_new(p, AST_STATE_RING, p->username))) { - ast_mutex_unlock(&p->lock); - ast_log(LOG_ERROR, "Could not create ast_channel\n"); - return -1; - } + if (!p->owner) { ast_mutex_unlock(&p->lock); - } else { - if (!p->owner) { - ast_mutex_unlock(&p->lock); - ast_log(LOG_ERROR, "Channel has no owner\n"); - return 0; - } - c = p->owner; + ast_log(LOG_ERROR, "Channel has no owner\n"); + return 0; + } + while (p->owner && ast_channel_trylock(p->owner)) { + ast_debug(1,"Failed to grab lock, trying again\n"); ast_mutex_unlock(&p->lock); - ast_channel_lock(c); - ast_setstate(c, AST_STATE_RINGING); - ast_channel_unlock(c); - ast_queue_control(c, AST_CONTROL_RINGING); + usleep(1); + ast_mutex_lock(&p->lock); + } + if (!p->owner) { + ast_mutex_unlock(&p->lock); + ast_log(LOG_ERROR, "Channel has no owner\n"); + return 0; } + c = p->owner; + ast_setstate(c, AST_STATE_RINGING); + ast_queue_control(c, AST_CONTROL_RINGING); + ast_channel_unlock(c); + ast_mutex_unlock(&p->lock); if (gH323Debug) ast_verbose("+++ onAlerting %s\n", call->callToken); @@ -1150,8 +1289,21 @@ f.data.ptr = NULL; f.mallocd = 0; f.src = "SEND_DIGIT"; - ast_mutex_unlock(&p->lock); + + while (p->owner && ast_channel_trylock(p->owner)) { + ast_debug(1,"Failed to grab lock, trying again\n"); + ast_mutex_unlock(&p->lock); + usleep(1); + ast_mutex_lock(&p->lock); + } + if (!p->owner) { + ast_mutex_unlock(&p->lock); + ast_log(LOG_ERROR, "Channel has no owner\n"); + return 0; + } res = ast_queue_frame(p->owner, &f); + ast_channel_unlock(p->owner); + ast_mutex_unlock(&p->lock); return res; } @@ -1159,6 +1311,7 @@ { struct ooh323_pvt *p = NULL; struct ooh323_user *user = NULL; + struct ast_channel *c = NULL; ooAliases *alias = NULL; char *at = NULL; char number [OO_MAX_NUMBER_LENGTH]; @@ -1190,30 +1343,35 @@ p->callerid_name = strdup(alias->value); } ast_copy_string(p->caller_h323id, alias->value, sizeof(p->caller_h323id)); - } else if (alias->type == T_H225AliasAddress_dialedDigits) { - if (!p->callerid_num) { - p->callerid_num = strdup(alias->value); } + else if(alias->type == T_H225AliasAddress_dialedDigits) + { + if(!p->callerid_num) + p->callerid_num = strdup(alias->value); ast_copy_string(p->caller_dialedDigits, alias->value, sizeof(p->caller_dialedDigits)); - } else if (alias->type == T_H225AliasAddress_email_ID) { + } + else if(alias->type == T_H225AliasAddress_email_ID) + { ast_copy_string(p->caller_email, alias->value, sizeof(p->caller_email)); - } else if (alias->type == T_H225AliasAddress_url_ID) { + } + else if(alias->type == T_H225AliasAddress_url_ID) + { ast_copy_string(p->caller_url, alias->value, sizeof(p->caller_url)); } } } number[0] = '\0'; - if (ooCallGetCalledPartyNumber(call, number, OO_MAX_NUMBER_LENGTH) == OO_OK) { - ast_copy_string(p->exten, number, sizeof(p->exten)); - } else { + if(ooCallGetCalledPartyNumber(call, number, OO_MAX_NUMBER_LENGTH)== OO_OK) { + strncpy(p->exten, number, sizeof(p->exten)-1); + } else { update_our_aliases(call, p); if (!ast_strlen_zero(p->callee_dialedDigits)) { - ast_copy_string(p->exten, p->callee_dialedDigits, sizeof(p->exten)); - } else if (!ast_strlen_zero(p->callee_h323id)) { + ast_copy_string(p->exten, p->callee_dialedDigits, sizeof(p->exten)); + } else if(!ast_strlen_zero(p->callee_h323id)) { ast_copy_string(p->exten, p->callee_h323id, sizeof(p->exten)); - } else if (!ast_strlen_zero(p->callee_email)) { + } else if(!ast_strlen_zero(p->callee_email)) { ast_copy_string(p->exten, p->callee_email, sizeof(p->exten)); if ((at = strchr(p->exten, '@'))) { *at = '\0'; @@ -1223,7 +1381,8 @@ /* if no extension found, set to default 's' */ if (ast_strlen_zero(p->exten)) { - ast_copy_string(p->exten, "s", sizeof(p->exten)); + p->exten[0]='s'; + p->exten[1]='\0'; } if (!p->callerid_name) { @@ -1231,9 +1390,12 @@ } if (p->callerid_name) { - if ((user = find_user(p->callerid_name, call->remoteIP))) { + user = find_user(p->callerid_name, call->remoteIP); + if(user && (user->incominglimit == 0 || user->inUse < user->incominglimit)) { ast_mutex_lock(&user->lock); p->username = strdup(user->name); + p->neighbor.user = user->mUseIP ? ast_strdup(user->mIP) : + ast_strdup(user->name); ast_copy_string(p->context, user->context, sizeof(p->context)); ast_copy_string(p->accountcode, user->accountcode, sizeof(p->accountcode)); p->amaflags = user->amaflags; @@ -1243,7 +1405,23 @@ /* Since, call is coming from a pbx user, no need to use gk */ OO_SETFLAG(p->flags, H323_DISABLEGK); OO_SETFLAG(call->flags, OO_M_DISABLEGK); + if (user->incominglimit) user->inUse++; ast_mutex_unlock(&user->lock); + } else { + if (!OO_TESTFLAG(p->flags,H323_DISABLEGK)) { + p->username = strdup(call->remoteIP); + } else { + ast_mutex_unlock(&p->lock); + ast_log(LOG_ERROR, "Unacceptable ip %s\n", call->remoteIP); + ast_mutex_lock(&ooh323c_cmd_lock); + if (!user) + ooHangCall(call->callToken, ooh323_convert_hangupcause_asteriskToH323(AST_CAUSE_CALL_REJECTED), AST_CAUSE_CALL_REJECTED); + else + ooHangCall(call->callToken, ooh323_convert_hangupcause_asteriskToH323(AST_CAUSE_NORMAL_CIRCUIT_CONGESTION), AST_CAUSE_NORMAL_CIRCUIT_CONGESTION); + ast_mutex_unlock(&ooh323c_cmd_lock); + ast_set_flag(p, H323_NEEDDESTROY); + return -1; + } } } @@ -1251,6 +1429,13 @@ ooh323c_set_capability_for_call(call, &p->prefs, p->capability, p->dtmfmode); configure_local_rtp(p, call); +/* Incoming call */ + c = ooh323_new(p, AST_STATE_RING, p->username); + if(!c) { + ast_mutex_unlock(&p->lock); + ast_log(LOG_ERROR, "Could not create ast_channel\n"); + return -1; + } ast_mutex_unlock(&p->lock); if (gH323Debug) @@ -1268,32 +1453,37 @@ int i = 0; if (gH323Debug) - ast_verbose("--- onNewCallCreated %s\n", call->callToken); + ast_verbose("--- onNewCallCreated %lx: %s\n", call, call->callToken); + + ast_mutex_lock(&call->Lock); + if (ooh323c_start_call_thread(call)) { + ast_log(LOG_ERROR,"Failed to create call thread.\n"); + ast_mutex_unlock(&call->Lock); + return -1; + } if (!strcmp(call->callType, "outgoing")) { p = find_call(call); if (!p) { - ast_log(LOG_ERROR, "No matching call found for outgoing call\n"); + ast_log(LOG_ERROR, "Failed to find a matching call.\n"); return -1; } ast_mutex_lock(&p->lock); + if (p->callerid_name) { ooCallSetCallerId(call, p->callerid_name); } if (p->callerid_num) { i = 0; while (*(p->callerid_num + i) != '\0') { - if (!isdigit(*(p->callerid_num + i))) { - break; - } - i++; + if(!isdigit(*(p->callerid_num+i))) { break; } + i++; } - if (*(p->callerid_num + i) == '\0') { + if(*(p->callerid_num+i) == '\0') ooCallSetCallingPartyNumber(call, p->callerid_num); - } else { - if (!p->callerid_name) { + else{ + if(!p->callerid_name) ooCallSetCallerId(call, p->callerid_num); - } } } @@ -1330,17 +1520,19 @@ char prefsBuf[256]; ast_codec_pref_string(&p->prefs, prefsBuf, sizeof(prefsBuf)); ast_verbose(" Outgoing call %s(%s) - Codec prefs - %s\n", - p->username?p->username:"NULL", call->callToken, prefsBuf); + p->username?p->username:"NULL", call->callToken, prefsBuf); } - ooh323c_set_capability_for_call(call, &p->prefs, p->capability, p->dtmfmode); + ooh323c_set_capability_for_call(call, &p->prefs, p->capability, + p->dtmfmode); configure_local_rtp(p, call); ast_mutex_unlock(&p->lock); } + + ast_mutex_unlock(&call->Lock); if (gH323Debug) ast_verbose("+++ onNewCallCreated %s\n", call->callToken); - return OO_OK; } @@ -1351,33 +1543,33 @@ if (gH323Debug) ast_verbose("--- onCallEstablished %s\n", call->callToken); + if (!(p = find_call(call))) { ast_log(LOG_ERROR, "Failed to find a matching call.\n"); return -1; } - ast_mutex_lock(&p->lock); - if (!p->owner) { - ast_mutex_unlock(&p->lock); - ast_log(LOG_ERROR, "Channel has no owner\n"); - return -1; - } - - while (ast_channel_trylock(p->owner)) { - ast_debug(1,"Failed to grab lock, trying again\n"); - ast_mutex_unlock(&p->lock); - usleep(1); + + if(ast_test_flag(p, H323_OUTGOING)) { ast_mutex_lock(&p->lock); - } - if (p->owner->_state != AST_STATE_UP) { - ast_setstate(p->owner, AST_STATE_UP); - } - ast_channel_unlock(p->owner); - if (ast_test_flag(p, H323_OUTGOING)) { - struct ast_channel* c = p->owner; - ast_mutex_unlock(&p->lock); - ast_queue_control(c, AST_CONTROL_ANSWER); - } else { + if (!p->owner) { + ast_mutex_unlock(&p->lock); + ast_log(LOG_ERROR, "Channel has no owner\n"); + return -1; + } + + while (p->owner && ast_channel_trylock(p->owner)) { + ast_debug(1,"Failed to grab lock, trying again\n"); + ast_mutex_unlock(&p->lock); + usleep(1); + ast_mutex_lock(&p->lock); + } + if (p->owner) { + struct ast_channel* c = p->owner; + ast_queue_control(c, AST_CONTROL_ANSWER); + ast_channel_unlock(p->owner); + } ast_mutex_unlock(&p->lock); + } if (gH323Debug) @@ -1394,42 +1586,48 @@ if (gH323Debug) ast_verbose("--- onCallCleared %s \n", call->callToken); - p = find_call(call); - if (!p) { - return 0; - } + + if ((p = find_call(call))) { ast_mutex_lock(&p->lock); while (p->owner) { if (ast_channel_trylock(p->owner)) { ooTrace(OOTRCLVLINFO, "Failed to grab lock, trying again\n"); - ast_debug(1,"Failed to grab lock, trying again\n"); + ast_log(LOG_DEBUG,"Failed to grab lock, trying again\n"); ast_mutex_unlock(&p->lock); usleep(1); ast_mutex_lock(&p->lock); } else { - ownerLock = 1; - break; + ownerLock = 1; break; } } if (ownerLock) { if (!ast_test_flag(p, H323_ALREADYGONE)) { - /* NOTE: Channel is not detached yet */ ast_set_flag(p, H323_ALREADYGONE); - p->owner->hangupcause = - ooh323_convert_hangupcause_h323ToAsterisk(call->callEndReason); + p->owner->hangupcause = call->q931cause; p->owner->_softhangup |= AST_SOFTHANGUP_DEV; - ast_channel_unlock(p->owner); - ast_queue_hangup(p->owner); - ast_mutex_unlock(&p->lock); - return OO_OK; + ast_queue_hangup_with_cause(p->owner,call->q931cause); } + } + + if(p->owner) { + p->owner->tech_pvt = NULL; ast_channel_unlock(p->owner); + p->owner = NULL; } + ast_set_flag(p, H323_NEEDDESTROY); + + ooh323c_stop_call_thread(call); + ast_mutex_unlock(&p->lock); + ast_mutex_lock(&usecnt_lock); + usecnt--; + ast_mutex_unlock(&usecnt_lock); + + } if (gH323Debug) ast_verbose("+++ onCallCleared\n"); @@ -1437,7 +1635,6 @@ return OO_OK; } -#if 0 static void ooh323_delete_user(struct ooh323_user *user) { struct ooh323_user *prev = NULL, *cur = NULL; @@ -1469,7 +1666,6 @@ ast_verbose("+++ ooh323_delete_user\n"); } -#endif void ooh323_delete_peer(struct ooh323_peer *peer) { @@ -1479,36 +1675,33 @@ ast_verbose("--- ooh323_delete_peer\n"); if (peer) { + cur = peerl.peers; ast_mutex_lock(&peerl.lock); - for (cur = peerl.peers; cur; prev = cur, cur = cur->next) { - if (cur == peer) { - break; - } + while(cur) { + if(cur==peer) break; + prev = cur; + cur = cur->next; } if (cur) { - if (prev) { + if(prev) prev->next = cur->next; - } else { + else peerl.peers = cur->next; } - } ast_mutex_unlock(&peerl.lock); - if (peer->h323id) - free(peer->h323id); - if (peer->email) - free(peer->email); - if (peer->url) - free(peer->url); - if (peer->e164) - free(peer->e164); + if(peer->h323id) free(peer->h323id); + if(peer->email) free(peer->email); + if(peer->url) free(peer->url); + if(peer->e164) free(peer->e164); free(peer); } if (gH323Debug) ast_verbose("+++ ooh323_delete_peer\n"); + } @@ -1520,7 +1713,7 @@ if (gH323Debug) ast_verbose("--- build_user\n"); - user = ast_calloc(1, sizeof(*user)); + user = ast_calloc(1,sizeof(struct ooh323_user)); if (user) { ast_mutex_init(&user->lock); ast_copy_string(user->name, name, sizeof(user->name)); @@ -1541,7 +1734,7 @@ if (user->incominglimit < 0) user->incominglimit = 0; } else if (!strcasecmp(v->name, "accountcode")) { - ast_copy_string(user->accountcode, v->value, sizeof(user->accountcode)); + strncpy(user->accountcode, v->value, sizeof(user->accountcode)-1); } else if (!strcasecmp(v->name, "rtptimeout")) { user->rtptimeout = atoi(v->value); if (user->rtptimeout < 0) @@ -1559,7 +1752,11 @@ } else if (!strcasecmp(v->name, "amaflags")) { user->amaflags = ast_cdr_amaflags2int(v->value); } else if (!strcasecmp(v->name, "ip")) { - ast_copy_string(user->mIP, v->value, sizeof(user->mIP)); + strncpy(user->mIP, v->value, sizeof(user->mIP)-1); + user->mUseIP = 1; + } + else if (!strcasecmp(v->name, "host")) { + strncpy(user->mIP, v->value, sizeof(user->mIP)-1); user->mUseIP = 1; } else if (!strcasecmp(v->name, "dtmfmode")) { if (!strcasecmp(v->value, "rfc2833")) @@ -1594,18 +1791,19 @@ ast_mutex_init(&peer->lock); ast_copy_string(peer->name, name, sizeof(peer->name)); peer->capability = gCapability; - memcpy(&peer->prefs, &gPrefs, sizeof(struct ast_codec_pref)); + memcpy(&peer->prefs, &gPrefs, sizeof(peer->prefs)); peer->rtptimeout = gRTPTimeout; ast_copy_string(peer->accountcode, gAccountcode, sizeof(peer->accountcode)); peer->amaflags = gAMAFLAGS; peer->dtmfmode = gDTMFMode; + peer->port = 1720; if (0 == friend_type) { peer->mFriend = 1; } while (v) { if (!strcasecmp(v->name, "h323id")) { - if (!(peer->h323id = ast_strdup(v->value))) { + if (!(peer->h323id = ast_strdup(v->value))) { ast_log(LOG_ERROR, "Could not allocate memory for h323id of " "peer %s\n", name); ooh323_delete_peer(peer); @@ -1636,16 +1834,18 @@ peer->port = atoi(v->value); } else if (!strcasecmp(v->name, "ip")) { ast_copy_string(peer->ip, v->value, sizeof(peer->ip)); + } else if (!strcasecmp(v->name, "host")) { + ast_copy_string(peer->ip, v->value, sizeof(peer->ip)); } else if (!strcasecmp(v->name, "outgoinglimit")) { - if ((peer->outgoinglimit = atoi(v->value)) < 0) { + peer->outgoinglimit = atoi(v->value); + if (peer->outgoinglimit < 0) peer->outgoinglimit = 0; - } } else if (!strcasecmp(v->name, "accountcode")) { ast_copy_string(peer->accountcode, v->value, sizeof(peer->accountcode)); } else if (!strcasecmp(v->name, "rtptimeout")) { - if ((peer->rtptimeout = atoi(v->value)) < 0) { + peer->rtptimeout = atoi(v->value); + if(peer->rtptimeout < 0) peer->rtptimeout = gRTPTimeout; - } } else if (!strcasecmp(v->name, "disallow")) { ast_parse_allow_disallow(&peer->prefs, &peer->capability, v->value, 0); @@ -1684,7 +1884,7 @@ ast_verbose("--- ooh323_do_reload\n"); } - reload_config(1); + reload_config(1); if (gH323Debug) { ast_verbose("+++ ooh323_do_reload\n"); @@ -1693,19 +1893,32 @@ return 0; } -#if 0 /*--- h323_reload: Force reload of module from cli ---*/ -static int ooh323_reload(int fd, int argc, char *argv[]) + +static char *handle_cli_ooh323_reload(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) { + switch (cmd) { + case CLI_INIT: + e->command = "ooh323 reload"; + e->usage = + "Usage: ooh323 reload\n" + " Reload OOH323 config.\n"; + return NULL; + case CLI_GENERATE: + return NULL; + } + + if (a->argc != 2) + return CLI_SHOWUSAGE; + if (gH323Debug) ast_verbose("--- ooh323_reload\n"); ast_mutex_lock(&h323_reload_lock); if (h323_reloading) { ast_verbose("Previous OOH323 reload not yet done\n"); - } - else { + } else { h323_reloading = 1; } ast_mutex_unlock(&h323_reload_lock); @@ -1716,19 +1929,16 @@ return 0; } -#endif -#if 0 static int reload(void *mod) { return ooh323_reload(0, 0, NULL); } -#endif int reload_config(int reload) { int format; - struct ooAliases *pNewAlias = NULL; + struct ooAliases *pNewAlias = NULL, *cur, *prev; struct ast_config *cfg; struct ast_variable *v; struct ast_flags config_flags = { reload ? CONFIG_FLAG_FILEUNCHANGED : 0 }; @@ -1752,6 +1962,17 @@ if (reload) { delete_users(); delete_peers(); + if (gH323Debug) { + ast_verbose(" reload_config - Freeing up alias list\n"); + } + cur = gAliasList; + while (cur) { + prev = cur; + cur = cur->next; + free(prev->value); + free(prev); + } + gAliasList = NULL; } /* Inintialize everything to default */ @@ -1759,7 +1980,7 @@ gPort = 1720; gIP[0] = '\0'; strcpy(gCallerID, DEFAULT_H323ID); - gCapability = AST_FORMAT_ULAW; + gCapability = AST_FORMAT_ALAW; memset(&gPrefs, 0, sizeof(struct ast_codec_pref)); gDTMFMode = H323_DTMF_RFC2833; gRasGkMode = RasNoGatekeeper; @@ -1784,7 +2005,7 @@ ast_copy_string(gIP, v->value, sizeof(gIP)); } else if (!strcasecmp(v->name, "h225portrange")) { char* endlimit = 0; - char temp[256]; + char temp[512]; ast_copy_string(temp, v->value, sizeof(temp)); endlimit = strchr(temp, ','); if (endlimit) { @@ -1793,16 +2014,12 @@ ooconfig.mTCPPortStart = atoi(temp); ooconfig.mTCPPortEnd = atoi(endlimit); - if (ooH323EpSetTCPPortRange(ooconfig.mTCPPortStart, - ooconfig.mTCPPortEnd) == OO_FAILED) { - ast_log(LOG_ERROR, "h225portrange: Failed to set range\n"); - } } else { ast_log(LOG_ERROR, "h225portrange: Invalid format, separate port range with \",\"\n"); } } else if (!strcasecmp(v->name, "gateway")) { gIsGateway = ast_true(v->value); - } else if (!strcasecmp(v->name, "faststart")) { + } else if (!strcasecmp(v->name, "faststart")) { gFastStart = ast_true(v->value); if (gFastStart) ooH323EpEnableFastStart(); @@ -1821,18 +2038,21 @@ else ooH323EpDisableH245Tunneling(); } else if (!strcasecmp(v->name, "h323id")) { - pNewAlias = malloc(sizeof(*pNewAlias)); + pNewAlias = malloc(sizeof(struct ooAliases)); if (!pNewAlias) { ast_log(LOG_ERROR, "Failed to allocate memory for h323id alias\n"); return 1; } + if (gAliasList == NULL) { /* first h323id - set as callerid if callerid is not set */ + ast_copy_string(gCallerID, v->value, sizeof(gCallerID)); + } pNewAlias->type = T_H225AliasAddress_h323_ID; pNewAlias->value = strdup(v->value); pNewAlias->next = gAliasList; gAliasList = pNewAlias; pNewAlias = NULL; } else if (!strcasecmp(v->name, "e164")) { - pNewAlias = malloc(sizeof(*pNewAlias)); + pNewAlias = malloc(sizeof(struct ooAliases)); if (!pNewAlias) { ast_log(LOG_ERROR, "Failed to allocate memory for e164 alias\n"); return 1; @@ -1843,7 +2063,7 @@ gAliasList = pNewAlias; pNewAlias = NULL; } else if (!strcasecmp(v->name, "email")) { - pNewAlias = malloc(sizeof(*pNewAlias)); + pNewAlias = malloc(sizeof(struct ooAliases)); if (!pNewAlias) { ast_log(LOG_ERROR, "Failed to allocate memory for email alias\n"); return 1; @@ -1853,6 +2073,16 @@ pNewAlias->next = gAliasList; gAliasList = pNewAlias; pNewAlias = NULL; + } else if (!strcasecmp(v->name, "t35country")) { + t35countrycode = atoi(v->value); + } else if (!strcasecmp(v->name, "t35extensions")) { + t35extensions = atoi(v->value); + } else if (!strcasecmp(v->name, "manufacturer")) { + manufacturer = atoi(v->value); + } else if (!strcasecmp(v->name, "vendorid")) { + ast_copy_string(vendor, v->value, sizeof(vendor)); + } else if (!strcasecmp(v->name, "versionid")) { + ast_copy_string(version, v->value, sizeof(version)); } else if (!strcasecmp(v->name, "callerid")) { ast_copy_string(gCallerID, v->value, sizeof(gCallerID)); } else if (!strcasecmp(v->name, "incominglimit")) { @@ -1866,13 +2096,14 @@ gRasGkMode = RasDiscoverGatekeeper; } else { gRasGkMode = RasUseSpecificGatekeeper; - ast_copy_string(gGatekeeper, v->value, sizeof(gGatekeeper)); + strncpy(gGatekeeper, v->value, sizeof(gGatekeeper)-1); } } else if (!strcasecmp(v->name, "logfile")) { - ast_copy_string(gLogFile, v->value, sizeof(gLogFile)); + strncpy(gLogFile, v->value, sizeof(gLogFile)-1); } else if (!strcasecmp(v->name, "context")) { - ast_copy_string(gContext, v->value, sizeof(gContext)); - ast_verb(3, " == Setting default context to %s\n", gContext); + strncpy(gContext, v->value, sizeof(gContext)-1); + ast_verbose(VERBOSE_PREFIX_3 " == Setting default context to %s\n", + gContext); } else if (!strcasecmp(v->name, "rtptimeout")) { gRTPTimeout = atoi(v->value); if (gRTPTimeout <= 0) @@ -1897,7 +2128,7 @@ } else if (!strcasecmp(v->name, "amaflags")) { gAMAFLAGS = ast_cdr_amaflags2int(v->value); } else if (!strcasecmp(v->name, "accountcode")) { - ast_copy_string(gAccountcode, v->value, sizeof(gAccountcode)-1); + ast_copy_string(gAccountcode, v->value, sizeof(gAccountcode)); } else if (!strcasecmp(v->name, "disallow")) { ast_parse_allow_disallow(&gPrefs, &gCapability, v->value, 0); } else if (!strcasecmp(v->name, "allow")) { @@ -1918,7 +2149,8 @@ else if (!strcasecmp(v->value, "h245signal")) gDTMFMode = H323_DTMF_H245SIGNAL; else { - ast_log(LOG_WARNING, "Unknown dtmf mode '%s', using rfc2833\n", v->value); + ast_log(LOG_WARNING, "Unknown dtmf mode '%s', using rfc2833\n", + v->value); gDTMFMode = H323_DTMF_RFC2833; } } @@ -1973,8 +2205,10 @@ ast_verbose("+++ reload_config\n"); return 0; + } + static char *handle_cli_ooh323_show_peer(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) { char ip_port[30]; @@ -1994,11 +2228,12 @@ if (a->argc != 4) return CLI_SHOWUSAGE; + ast_mutex_lock(&peerl.lock); peer = peerl.peers; while (peer) { ast_mutex_lock(&peer->lock); - if (!strcmp(peer->name, a->argv[3])) + if(!strcmp(peer->name, a->argv[3])) break; else { prev = peer; @@ -2008,32 +2243,32 @@ } if (peer) { - snprintf(ip_port, sizeof(ip_port), "%s:%d", peer->ip, peer->port); - ast_cli(a->fd, "%-15.15s%s\n", "Name: ", peer->name); - ast_cli(a->fd, "%-15.15s%s", "Format Prefs: ", "("); - print_codec_to_cli(a->fd, &peer->prefs); - ast_cli(a->fd, ")\n"); - ast_cli(a->fd, "%-15.15s", "DTMF Mode: "); + sprintf(ip_port, "%s:%d", peer->ip, peer->port); + ast_cli(a->fd, "%-15.15s%s\n", "Name: ", peer->name); + ast_cli(a->fd, "%-15.15s%s", "Format Prefs: ", "("); + print_codec_to_cli(a->fd, &peer->prefs); + ast_cli(a->fd, ")\n"); + ast_cli(a->fd, "%-15.15s", "DTMF Mode: "); if (peer->dtmfmode & H323_DTMF_RFC2833) - ast_cli(a->fd, "%s\n", "rfc2833"); + ast_cli(a->fd, "%s\n", "rfc2833"); else if (peer->dtmfmode & H323_DTMF_Q931) - ast_cli(a->fd, "%s\n", "q931keypad"); + ast_cli(a->fd, "%s\n", "q931keypad"); else if (peer->dtmfmode & H323_DTMF_H245ALPHANUMERIC) - ast_cli(a->fd, "%s\n", "h245alphanumeric"); + ast_cli(a->fd, "%s\n", "h245alphanumeric"); else if (peer->dtmfmode & H323_DTMF_H245SIGNAL) - ast_cli(a->fd, "%s\n", "h245signal"); + ast_cli(a->fd, "%s\n", "h245signal"); else - ast_cli(a->fd, "%s\n", "unknown"); - ast_cli(a->fd, "%-15.15s%s\n", "AccountCode: ", peer->accountcode); - ast_cli(a->fd, "%-15.15s%s\n", "AMA flags: ", + ast_cli(a->fd, "%s\n", "unknown"); + ast_cli(a->fd, "%-15.15s%s\n", "AccountCode: ", peer->accountcode); + ast_cli(a->fd, "%-15.15s%s\n", "AMA flags: ", ast_cdr_flags2str(peer->amaflags)); - ast_cli(a->fd, "%-15.15s%s\n", "Ip:Port: ", ip_port); - ast_cli(a->fd, "%-15.15s%d\n", "OutgoingLimit: ", peer->outgoinglimit); - ast_cli(a->fd, "%-15.15s%d\n", "rtptimeout: ", peer->rtptimeout); + ast_cli(a->fd, "%-15.15s%s\n", "IP:Port: ", ip_port); + ast_cli(a->fd, "%-15.15s%d\n", "OutgoingLimit: ", peer->outgoinglimit); + ast_cli(a->fd, "%-15.15s%d\n", "rtptimeout: ", peer->rtptimeout); ast_mutex_unlock(&peer->lock); } else { - ast_cli(a->fd, "Peer %s not found\n", a->argv[3]); - ast_cli(a->fd, "\n"); + ast_cli(a->fd, "Peer %s not found\n", a->argv[3]); + ast_cli(a->fd, "\n"); } ast_mutex_unlock(&peerl.lock); @@ -2042,10 +2277,9 @@ static char *handle_cli_ooh323_show_peers(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) { - char ip_port[30]; - char formats[512]; struct ooh323_peer *prev = NULL, *peer = NULL; - + char formats[512]; + char ip_port[30]; #define FORMAT "%-15.15s %-15.15s %-23.23s %-s\n" switch (cmd) { @@ -2062,25 +2296,24 @@ if (a->argc != 3) return CLI_SHOWUSAGE; - ast_cli(a->fd, FORMAT, "Name", "Accountcode", "ip:port", "Formats"); + ast_cli(a->fd, FORMAT, "Name", "Accountcode", "ip:port", "Formats"); ast_mutex_lock(&peerl.lock); peer = peerl.peers; while (peer) { ast_mutex_lock(&peer->lock); snprintf(ip_port, sizeof(ip_port), "%s:%d", peer->ip, peer->port); - ast_cli(a->fd, FORMAT, peer->name, + ast_cli(a->fd, FORMAT, peer->name, peer->accountcode, ip_port, - ast_getformatname_multiple(formats, sizeof(formats), peer->capability)); + ast_getformatname_multiple(formats,512,peer->capability)); prev = peer; peer = peer->next; ast_mutex_unlock(&prev->lock); + } ast_mutex_unlock(&peerl.lock); - #undef FORMAT - return CLI_SUCCESS; } @@ -2120,13 +2353,14 @@ if (a->argc != 4) return CLI_SHOWUSAGE; + ast_mutex_lock(&userl.lock); user = userl.users; while (user) { ast_mutex_lock(&user->lock); - if (!strcmp(user->name, a->argv[3])) + if(!strcmp(user->name, a->argv[3])) { break; - else { + } else { prev = user; user = user->next; ast_mutex_unlock(&prev->lock); @@ -2134,30 +2368,32 @@ } if (user) { - ast_cli(a->fd, "%-15.15s%s\n", "Name: ", user->name); - ast_cli(a->fd, "%-15.15s%s", "Format Prefs: ", "("); - print_codec_to_cli(a->fd, &user->prefs); - ast_cli(a->fd, ")\n"); - ast_cli(a->fd, "%-15.15s", "DTMF Mode: "); + ast_cli(a->fd, "%-15.15s%s\n", "Name: ", user->name); + ast_cli(a->fd, "%-15.15s%s", "Format Prefs: ", "("); + print_codec_to_cli(a->fd, &user->prefs); + ast_cli(a->fd, ")\n"); + ast_cli(a->fd, "%-15.15s", "DTMF Mode: "); if (user->dtmfmode & H323_DTMF_RFC2833) - ast_cli(a->fd, "%s\n", "rfc2833"); + ast_cli(a->fd, "%s\n", "rfc2833"); else if (user->dtmfmode & H323_DTMF_Q931) - ast_cli(a->fd, "%s\n", "q931keypad"); + ast_cli(a->fd, "%s\n", "q931keypad"); else if (user->dtmfmode & H323_DTMF_H245ALPHANUMERIC) - ast_cli(a->fd, "%s\n", "h245alphanumeric"); + ast_cli(a->fd, "%s\n", "h245alphanumeric"); else if (user->dtmfmode & H323_DTMF_H245SIGNAL) - ast_cli(a->fd, "%s\n", "h245signal"); + ast_cli(a->fd, "%s\n", "h245signal"); else - ast_cli(a->fd, "%s\n", "unknown"); - ast_cli(a->fd, "%-15.15s%s\n", "AccountCode: ", user->accountcode); - ast_cli(a->fd, "%-15.15s%s\n", "AMA flags: ", ast_cdr_flags2str(user->amaflags)); - ast_cli(a->fd, "%-15.15s%s\n", "Context: ", user->context); - ast_cli(a->fd, "%-15.15s%d\n", "IncomingLimit: ", user->incominglimit); - ast_cli(a->fd, "%-15.15s%d\n", "rtptimeout: ", user->rtptimeout); + ast_cli(a->fd, "%s\n", "unknown"); + ast_cli(a->fd, "%-15.15s%s\n", "AccountCode: ", user->accountcode); + ast_cli(a->fd, "%-15.15s%s\n", "AMA flags: ", + ast_cdr_flags2str(user->amaflags)); + ast_cli(a->fd, "%-15.15s%s\n", "Context: ", user->context); + ast_cli(a->fd, "%-15.15s%d\n", "IncomingLimit: ", user->incominglimit); + ast_cli(a->fd, "%-15.15s%d\n", "InUse: ", user->inUse); + ast_cli(a->fd, "%-15.15s%d\n", "rtptimeout: ", user->rtptimeout); ast_mutex_unlock(&user->lock); } else { - ast_cli(a->fd, "User %s not found\n", a->argv[3]); - ast_cli(a->fd, "\n"); + ast_cli(a->fd, "User %s not found\n", a->argv[3]); + ast_cli(a->fd, "\n"); } ast_mutex_unlock(&userl.lock); @@ -2166,9 +2402,8 @@ static char *handle_cli_ooh323_show_users(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) { - char formats[512]; struct ooh323_user *prev = NULL, *user = NULL; - + char formats[512]; #define FORMAT1 "%-15.15s %-15.15s %-15.15s %-s\n" switch (cmd) { @@ -2185,24 +2420,26 @@ if (a->argc != 3) return CLI_SHOWUSAGE; - ast_cli(a->fd, FORMAT1, "Username", "Accountcode", "Context", "Formats"); + + ast_cli(a->fd, FORMAT1, "Username", "Accountcode", "Context", "Formats"); ast_mutex_lock(&userl.lock); user = userl.users; - while (user) { + while(user) + { ast_mutex_lock(&user->lock); - ast_cli(a->fd, FORMAT1, user->name, + ast_cli(a->fd, FORMAT1, user->name, user->accountcode, user->context, ast_getformatname_multiple(formats, 512, user->capability)); prev = user; user = user->next; ast_mutex_unlock(&prev->lock); + } ast_mutex_unlock(&userl.lock); - #undef FORMAT1 + return RESULT_SUCCESS; - return CLI_SUCCESS; } static char *handle_cli_ooh323_set_debug(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a) @@ -2255,25 +2492,27 @@ if (a->argc != 3) return CLI_SHOWUSAGE; + + + ast_cli(a->fd, "\nObjective Open H.323 Channel Driver's Config:\n"); snprintf(value, sizeof(value), "%s:%d", gIP, gPort); - ast_cli(a->fd, "\nObjective Open H.323 Channel Driver's Config:\n"); - ast_cli(a->fd, "%-20s%s\n", "IP:Port: ", value); - ast_cli(a->fd, "%-20s%s\n", "FastStart", gFastStart?"yes":"no"); - ast_cli(a->fd, "%-20s%s\n", "Tunneling", gTunneling?"yes":"no"); - ast_cli(a->fd, "%-20s%s\n", "CallerId", gCallerID); - ast_cli(a->fd, "%-20s%s\n", "MediaWaitForConnect", gMediaWaitForConnect ? "yes" : "no"); + ast_cli(a->fd, "%-20s%s\n", "IP:Port: ", value); + ast_cli(a->fd, "%-20s%d-%d\n", "H.225 port range: ", + ooconfig.mTCPPortStart, ooconfig.mTCPPortEnd); + ast_cli(a->fd, "%-20s%s\n", "FastStart", gFastStart?"yes":"no"); + ast_cli(a->fd, "%-20s%s\n", "Tunneling", gTunneling?"yes":"no"); + ast_cli(a->fd, "%-20s%s\n", "CallerId", gCallerID); + ast_cli(a->fd, "%-20s%s\n", "MediaWaitForConnect", + gMediaWaitForConnect?"yes":"no"); -#if 0 - { +#if (0) extern OOH323EndPoint gH323ep; - - ast_cli(a->fd, "%-20s%s\n", "FASTSTART", + ast_cli(a->fd, "%-20s%s\n", "FASTSTART", (OO_TESTFLAG(gH323ep.flags, OO_M_FASTSTART) != 0) ? "yes" : "no"); - ast_cli(a->fd, "%-20s%s\n", "TUNNELING", + ast_cli(a->fd, "%-20s%s\n", "TUNNELING", (OO_TESTFLAG(gH323ep.flags, OO_M_TUNNELING) != 0) ? "yes" : "no"); - ast_cli(a->fd, "%-20s%s\n", "MEDIAWAITFORCONN", + ast_cli(a->fd, "%-20s%s\n", "MEDIAWAITFORCONN", (OO_TESTFLAG(gH323ep.flags, OO_M_MEDIAWAITFORCONN) != 0) ? "yes" : "no"); - } #endif if (gRasGkMode == RasNoGatekeeper) @@ -2283,38 +2522,47 @@ else snprintf(value, sizeof(value), "%s", gGatekeeper); - ast_cli(a->fd, "%-20s%s\n", "Gatekeeper:", value); - ast_cli(a->fd, "%-20s%s\n", "H.323 LogFile:", gLogFile); - ast_cli(a->fd, "%-20s%s\n", "Context:", gContext); - ast_cli(a->fd, "%-20s%s\n", "Capability:", ast_getformatname_multiple(value, sizeof(value), gCapability)); - ast_cli(a->fd, "%-20s", "DTMF Mode: "); + ast_cli(a->fd, "%-20s%s\n", "Gatekeeper:", value); + + ast_cli(a->fd, "%-20s%s\n", "H.323 LogFile:", gLogFile); + + ast_cli(a->fd, "%-20s%s\n", "Context:", gContext); + + ast_cli(a->fd, "%-20s%s\n", "Capability:", + ast_getformatname_multiple(value,512,gCapability)); + + ast_cli(a->fd, "%-20s", "DTMF Mode: "); if (gDTMFMode & H323_DTMF_RFC2833) - ast_cli(a->fd, "%s\n", "rfc2833"); + ast_cli(a->fd, "%s\n", "rfc2833"); else if (gDTMFMode & H323_DTMF_Q931) - ast_cli(a->fd, "%s\n", "q931keypad"); + ast_cli(a->fd, "%s\n", "q931keypad"); else if (gDTMFMode & H323_DTMF_H245ALPHANUMERIC) - ast_cli(a->fd, "%s\n", "h245alphanumeric"); + ast_cli(a->fd, "%s\n", "h245alphanumeric"); else if (gDTMFMode & H323_DTMF_H245SIGNAL) - ast_cli(a->fd, "%s\n", "h245signal"); + ast_cli(a->fd, "%s\n", "h245signal"); else - ast_cli(a->fd, "%s\n", "unknown"); - ast_cli(a->fd, "%-20s%s\n", "AccountCode: ", gAccountcode); - ast_cli(a->fd, "%-20s%s\n", "AMA flags: ", ast_cdr_flags2str(gAMAFLAGS)); + ast_cli(a->fd, "%s\n", "unknown"); + + ast_cli(a->fd, "%-20s%ld\n", "Call counter: ", callnumber); + ast_cli(a->fd, "%-20s%s\n", "AccountCode: ", gAccountcode); + + ast_cli(a->fd, "%-20s%s\n", "AMA flags: ", ast_cdr_flags2str(gAMAFLAGS)); pAlias = gAliasList; - if (pAlias) - ast_cli(a->fd, "%-20s\n", "Aliases: "); + if(pAlias) { + ast_cli(a->fd, "%-20s\n", "Aliases: "); + } while (pAlias) { pAliasNext = pAlias->next; if (pAliasNext) { - ast_cli(a->fd, "\t%-30s\t%-30s\n", pAlias->value, pAliasNext->value); + ast_cli(a->fd,"\t%-30s\t%-30s\n",pAlias->value, pAliasNext->value); pAlias = pAliasNext->next; - } else { - ast_cli(a->fd, "\t%-30s\n", pAlias->value); + } + else{ + ast_cli(a->fd,"\t%-30s\n",pAlias->value); pAlias = pAlias->next; } } - return CLI_SUCCESS; } @@ -2325,8 +2573,10 @@ AST_CLI_DEFINE(handle_cli_ooh323_show_peers, "Show defined OOH323 peers"), AST_CLI_DEFINE(handle_cli_ooh323_show_user, "Show details on specific OOH323 user"), AST_CLI_DEFINE(handle_cli_ooh323_show_users, "Show defined OOH323 users"), + AST_CLI_DEFINE(handle_cli_ooh323_reload, "reload ooh323 config") }; + static int load_module(void) { int res; @@ -2383,19 +2633,28 @@ /* fire up the H.323 Endpoint */ if (OO_OK != ooH323EpInitialize(OO_CALLMODE_AUDIOCALL, gLogFile)) { - ast_log(LOG_ERROR, "Failed to initialize OOH323 endpoint-OOH323 Disabled\n"); + ast_log(LOG_ERROR, "Failed to initialize OOH323 endpoint-" + "OOH323 Disabled\n"); return 1; } if (gIsGateway) ooH323EpSetAsGateway(); + ooH323EpSetVersionInfo(t35countrycode, t35extensions, manufacturer, vendor, version); + ooH323EpDisableAutoAnswer(); ooH323EpSetH225MsgCallbacks(h225Callbacks); - ooH323EpSetTraceLevel(OOTRCLVLDBGC); + /* ooH323EpSetTraceLevel(OOTRCLVLDBGC); */ + ooH323EpSetTraceLevel(OOTRCLVLERR); ooH323EpSetLocalAddress(gIP, gPort); ooH323EpSetCallerID(gCallerID); + if(ooH323EpSetTCPPortRange(ooconfig.mTCPPortStart, + ooconfig.mTCPPortEnd) == OO_FAILED) { + ast_log(LOG_ERROR, "h225portrange: Failed to set range\n"); + } + /* Set aliases if any */ for (pNewAlias = gAliasList; pNewAlias; pNewAlias = pNewAlias->next) { switch (pNewAlias->type) { @@ -2408,20 +2667,18 @@ case T_H225AliasAddress_email_ID: ooH323EpAddAliasEmailID(pNewAlias->value); break; + default: + ; } } ast_mutex_lock(&peerl.lock); peer = peerl.peers; while (peer) { - if (peer->h323id) - ooH323EpAddAliasH323ID(peer->h323id); - if (peer->email) - ooH323EpAddAliasEmailID(peer->email); - if (peer->e164) - ooH323EpAddAliasDialedDigits(peer->e164); - if (peer->url) - ooH323EpAddAliasURLID(peer->url); + if(peer->h323id) ooH323EpAddAliasH323ID(peer->h323id); + if(peer->email) ooH323EpAddAliasEmailID(peer->email); + if(peer->e164) ooH323EpAddAliasDialedDigits(peer->e164); + if(peer->url) ooH323EpAddAliasURLID(peer->url); peer = peer->next; } ast_mutex_unlock(&peerl.lock); @@ -2441,6 +2698,8 @@ if (!gTunneling) ooH323EpDisableH245Tunneling(); + ooH323EpEnableManualRingback(); + /* Gatekeeper */ if (gRasGkMode == RasUseSpecificGatekeeper) ooGkClientInit(gRasGkMode, gGatekeeper, 0); @@ -2456,17 +2715,18 @@ return 1; } - /* Create H.323 listener */ if (ooCreateH323Listener() != OO_OK) { - ast_log(LOG_ERROR, "OOH323 Listener Creation failure. OOH323 DISABLED\n"); + ast_log(LOG_ERROR, "OOH323 Listener Creation failure. " + "OOH323 DISABLED\n"); ooH323EpDestroy(); return 1; } if (ooh323c_start_stack_thread() < 0) { - ast_log(LOG_ERROR, "Failed to start OOH323 stack thread. OOH323 DISABLED\n"); + ast_log(LOG_ERROR, "Failed to start OOH323 stack thread. " + "OOH323 DISABLED\n"); ooH323EpDestroy(); return 1; } @@ -2496,6 +2756,7 @@ ast_verb(1, "Reloading H.323\n"); ooh323_do_reload(); } + /* Check for interfaces needing to be killed */ ast_mutex_lock(&iflock); time(&t); @@ -2506,11 +2767,21 @@ /* TODO: Need to add rtptimeout keepalive support */ if (ast_test_flag(h323, H323_NEEDDESTROY)) { ooh323_destroy (h323); - } + } /* else if (ast_test_flag(h323, H323_NEEDSTART) && h323->owner) { + ast_channel_lock(h323->owner); + if (ast_pbx_start(h323->owner)) { + ast_log(LOG_WARNING, "Unable to start PBX on %s\n", h323->owner->name); + ast_channel_unlock(h323->owner); + ast_hangup(h323->owner); + } + ast_channel_unlock(h323->owner); + ast_clear_flag(h323, H323_NEEDSTART); + } */ h323 = h323_next; } ast_mutex_unlock(&iflock); pthread_testcancel(); + /* Wait for sched or io */ res = ast_sched_wait(sched); if ((res < 0) || (res > 1000)) { @@ -2567,7 +2838,7 @@ { /* NOTE: Assumes iflock already acquired */ struct ooh323_pvt *prev = NULL, *cur = NULL; - + struct ooh323_user *user = NULL; if (gH323Debug) { ast_verbose("--- ooh323_destroy \n"); @@ -2591,6 +2862,7 @@ iflist = cur->next; if (cur->callToken) { + if (gH323Debug) ast_verbose(" Destroying %s\n", cur->callToken); free(cur->callToken); cur->callToken = 0; } @@ -2623,7 +2895,12 @@ /* Unlink us from the owner if we have one */ if (cur->owner) { - ast_channel_lock(cur->owner); + while(ast_channel_trylock(cur->owner)) { + ast_debug(1,"Failed to grab lock, trying again\n"); + ast_mutex_unlock(&cur->lock); + usleep(1); + ast_mutex_lock(&cur->lock); + } ast_debug(1, "Detaching from %s\n", cur->owner->name); cur->owner->tech_pvt = NULL; ast_channel_unlock(cur->owner); @@ -2634,6 +2911,23 @@ ast_dsp_free(cur->vad); cur->vad = NULL; } + +/* decrement user/peer count */ + + if(!ast_test_flag(cur, H323_OUTGOING)) { + if (cur->neighbor.user) { + user = find_user(p->callerid_name, cur->neighbor.user); + if(user && user->inUse > 0) { + ast_mutex_lock(&user->lock); + user->inUse--; + ast_mutex_unlock(&user->lock); + } + free(cur->neighbor.user); + } + } else { +/* outgoing limit decrement here !!! */ + } + ast_mutex_unlock(&cur->lock); ast_mutex_destroy(&cur->lock); @@ -2656,14 +2950,10 @@ cur = cur->next; ast_mutex_destroy(&prev->lock); - if (prev->h323id) - free(prev->h323id); - if (prev->email) - free(prev->email); - if (prev->url) - free(prev->url); - if (prev->e164) - free(prev->e164); + if(prev->h323id) free(prev->h323id); + if(prev->email) free(prev->email); + if(prev->url) free(prev->url); + if(prev->e164) free(prev->e164); free(prev); if (cur == peerl.peers) { @@ -2706,7 +2996,6 @@ ast_cli_unregister_multiple(cli_ooh323, sizeof(cli_ooh323) / sizeof(struct ast_cli_entry)); ast_rtp_proto_unregister(&ooh323_rtp); ast_channel_unregister(&ooh323_tech); - #if 0 ast_unregister_atexit(&ast_ooh323c_exit); #endif @@ -2888,7 +3177,7 @@ return OO_H263VIDEO; default: ast_log(LOG_NOTICE, "Don't know how to deal with mode %s\n", - ast_getformatname_multiple(formats, sizeof(formats), cap)); + ast_getformatname_multiple(formats,512,cap)); return -1; } } @@ -2968,6 +3257,7 @@ { struct ooh323_pvt *p = NULL; struct sockaddr_in them; + char *callToken = (char *)NULL; if (gH323Debug) ast_verbose("--- setup_rtp_connection\n"); @@ -2985,9 +3275,9 @@ them.sin_port = htons(remotePort); ast_rtp_set_peer(p->rtp, &them); - if (gH323Debug) { + if(gH323Debug) ast_verbose("+++ setup_rtp_connection\n"); - } + return; } @@ -2996,13 +3286,13 @@ { struct ooh323_pvt *p = NULL; - if (gH323Debug) { + if(gH323Debug) ast_verbose("--- close_rtp_connection\n"); - } p = find_call(call); if (!p) { - ast_log(LOG_ERROR, "Couldn't find matching call to close rtp connection\n"); + ast_log(LOG_ERROR, "Couldn't find matching call to close rtp " + "connection\n"); return; } ast_mutex_lock(&p->lock); @@ -3011,9 +3301,8 @@ } ast_mutex_unlock(&p->lock); - if (gH323Debug) { + if(gH323Debug) ast_verbose("+++ close_rtp_connection\n"); - } return; } @@ -3032,7 +3321,8 @@ updated = 1; } if (psAlias->type == T_H225AliasAddress_dialedDigits) { - ast_copy_string(p->callee_dialedDigits, psAlias->value, sizeof(p->callee_dialedDigits)); + ast_copy_string(p->callee_dialedDigits, psAlias->value, + sizeof(p->callee_dialedDigits)); updated = 1; } if (psAlias->type == T_H225AliasAddress_url_ID) { @@ -3068,24 +3358,24 @@ default: f = &null_frame; } + /* Don't send RFC2833 if we're not supposed to */ - if (f && (f->frametype == AST_FRAME_DTMF) && !(p->dtmfmode & H323_DTMF_RFC2833)) { - return &null_frame; - } + /* if (f && (f->frametype == AST_FRAME_DTMF) && !(p->dtmfmode & H323_DTMF_RFC2833)) { + return &null_frame; */ + if (p->owner) { /* We already hold the channel lock */ if (f->frametype == AST_FRAME_VOICE) { if (f->subclass != p->owner->nativeformats) { - ast_debug(1, "Oooh, format changed to %d\n", f->subclass); + ast_debug(1, "Oooh, format changed to %d\n", f->subclass); p->owner->nativeformats = f->subclass; ast_set_read_format(p->owner, p->owner->readformat); ast_set_write_format(p->owner, p->owner->writeformat); } if ((p->dtmfmode & H323_DTMF_INBAND) && p->vad) { f = ast_dsp_process(p->owner, p->vad, f); - if (f && (f->frametype == AST_FRAME_DTMF)) { - ast_debug(1, "* Detected inband DTMF '%c'\n", f->subclass); - } + if (f && (f->frametype == AST_FRAME_DTMF)) + ast_log(LOG_DEBUG, "* Detected inband DTMF '%c'\n",f->subclass); } } } @@ -3116,6 +3406,8 @@ } return 0; + + } int ooh323_convert_hangupcause_h323ToAsterisk(int cause) --- channels/ooh323cDriver.c 2008-05-28 18:45:23.000000000 +0400 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323cDriver.c 2009-05-30 21:48:26.000000000 +0400 @@ -18,11 +18,15 @@ #include #include -#include + +#undef AST_BACKGROUND_STACKSIZE +#define AST_BACKGROUND_STACKSIZE 768 * 1024 extern OOBOOL gH323Debug; +extern OOH323EndPoint gH323ep; /* ooh323c stack thread. */ static pthread_t ooh323c_thread = AST_PTHREADT_NULL; +static pthread_t ooh323cmd_thread = AST_PTHREADT_NULL; static int grxframes = 240; static int gtxframes = 20; @@ -39,13 +43,70 @@ return dummy; } +void* ooh323c_cmd_thread(void* dummy) +{ + + ooMonitorCmdChannels(); + return dummy; +} + +void* ooh323c_call_thread(void* dummy) +{ + ooMonitorCallChannels((ooCallData*)dummy); + /* ast_mutex_lock(&call->Lock); + ast_mutex_unlock(&call->Lock); + ast_mutex_destroy(&call->Lock); + memFreePtr(&gH323ep.ctxt, call); */ + return dummy; +} + +/* int ooh323c_start_call_thread(ooCallData *call) { + if(ast_pthread_create(&call->callThread, NULL, ooh323c_call_thread, call) < 0) + { + ast_log(LOG_ERROR, "Unable to start ooh323c call thread for call %s\n", call->callToken); + return -1; + } + return 0; +} */ + +int ooh323c_start_call_thread(ooCallData *call) { + pthread_attr_t attr; + + pthread_attr_init(&attr); + pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED); + + if(ast_pthread_create_background(&call->callThread, &attr, ooh323c_call_thread, call) < 0) + { + ast_log(LOG_ERROR, "Unable to start ooh323c call thread for call %s\n", call->callToken); + pthread_attr_destroy(&attr); + return -1; + } + pthread_attr_destroy(&attr); + return 0; +} + + +int ooh323c_stop_call_thread(ooCallData *call) { + if (call->callThread != AST_PTHREADT_NULL) { + ooStopMonitorCallChannels(call); + /* pthread_join(call->callThread, NULL); + call->callThread = AST_PTHREADT_NULL;*/ + } + return 0; +} + int ooh323c_start_stack_thread() { - if(ast_pthread_create(&ooh323c_thread, NULL, ooh323c_stack_thread, NULL) < 0) + if(ast_pthread_create_background(&ooh323c_thread, NULL, ooh323c_stack_thread, NULL) < 0) { ast_log(LOG_ERROR, "Unable to start ooh323c thread.\n"); return -1; } + if(ast_pthread_create_background(&ooh323cmd_thread, NULL, ooh323c_cmd_thread, NULL) < 0) + { + ast_log(LOG_ERROR, "Unable to start ooh323cmd thread.\n"); + return -1; + } return 0; } @@ -56,6 +117,8 @@ ooStopMonitor(); pthread_join(ooh323c_thread, NULL); ooh323c_thread = AST_PTHREADT_NULL; + pthread_join(ooh323cmd_thread, NULL); + ooh323cmd_thread = AST_PTHREADT_NULL; } return 0; } @@ -165,11 +228,11 @@ if(gH323Debug) ast_verbose("\tAdding capabilities to call(%s, %s)\n", call->callType, call->callToken); - if(dtmf & H323_DTMF_RFC2833) + if(dtmf & H323_DTMF_RFC2833 || 1) ret |= ooCallEnableDTMFRFC2833(call,0); - else if(dtmf & H323_DTMF_H245ALPHANUMERIC) + if(dtmf & H323_DTMF_H245ALPHANUMERIC || 1) ret |= ooCallEnableDTMFH245Alphanumeric(call); - else if(dtmf & H323_DTMF_H245SIGNAL) + if(dtmf & H323_DTMF_H245SIGNAL || 1) ret |= ooCallEnableDTMFH245Signal(call); --- channels/ooh323c/src/ooq931.h 2008-02-07 23:59:47.000000000 +0300 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/ooq931.h 2009-05-30 06:40:48.000000000 +0400 @@ -45,7 +45,7 @@ #define OO_MAX_NUMBER_LENGTH 50 /* Maximum value for a call token identifier */ -#define OO_MAX_CALL_TOKEN 9999 +#define OO_MAX_CALL_TOKEN 999999 /* Q.931 packet must be at least 5 bytes long */ #define Q931_E_TOOSHORT (-1001) @@ -346,7 +346,7 @@ * * @return OO_OK, on success. OO_FAILED, on failure. */ -EXTERN int ooDecodeUUIE(Q931Message *q931Msg); +EXTERN int ooDecodeUUIE(OOCTXT* pctxt, Q931Message *q931Msg); /** * This function is used to encode the UUIE field of the Q931 message. @@ -356,7 +356,7 @@ * * @return OO_OK, on success. OO_FAILED, on failure. */ -EXTERN int ooEncodeUUIE(Q931Message *q931msg); +EXTERN int ooEncodeUUIE(OOCTXT* pctxt, Q931Message *q931msg); /** * This function is invoked to retrieve an IE element from a Q931 message. @@ -388,7 +388,7 @@ * * @return Completion status - 0 on success, -1 on failure */ -EXTERN int ooCreateQ931Message(Q931Message **msg, int msgType); +EXTERN int ooCreateQ931Message(OOCTXT* pctxt, Q931Message **msg, int msgType); /** * This function is invoked to generate a unique call reference number. @@ -414,7 +414,7 @@ * * @return Completion status - 0 on success, -1 on failure */ -EXTERN int ooFreeQ931Message(Q931Message *q931Msg); +EXTERN int ooFreeQ931Message(OOCTXT* pctxt, Q931Message *q931Msg); /** * This function is invoked to retrive the outgoing message buffer for @@ -549,7 +549,7 @@ * * @return OO_OK, on success. OO_FAILED, on failure. */ -EXTERN int ooH323HangCall(char * callToken, OOCallClearReason reason); +EXTERN int ooH323HangCall(char * callToken, OOCallClearReason reason, int q931); /** @@ -648,7 +648,7 @@ * * @return OO_OK on success, OO_FAILED, on failure. */ -EXTERN int ooQ931SetKeypadIE(Q931Message *pmsg, const char* data); +EXTERN int ooQ931SetKeypadIE(OOCTXT* pctxt, Q931Message *pmsg, const char* data); /** * This function is used to add a bearer capability IE to a Q931 message. @@ -663,7 +663,7 @@ * @return OO_OK on success, OO_FAILED, on failure. */ EXTERN int ooSetBearerCapabilityIE - (Q931Message *pmsg, enum Q931CodingStandard codingStandard, + (OOCTXT* pctxt, Q931Message *pmsg, enum Q931CodingStandard codingStandard, enum Q931InformationTransferCapability capability, enum Q931TransferMode transferMode, enum Q931TransferRate transferRate, enum Q931UserInfoLayer1Protocol userInfoLayer1); @@ -679,7 +679,7 @@ * @return OO_OK, on success. OO_FAILED, on failure. */ EXTERN int ooQ931SetCalledPartyNumberIE - (Q931Message *pmsg, const char *number, unsigned plan, unsigned type); + (OOCTXT *pctxt, Q931Message *pmsg, const char *number, unsigned plan, unsigned type); /** @@ -696,7 +696,7 @@ * @return OO_OK, on success. OO_FAILED, on failure. */ EXTERN int ooQ931SetCallingPartyNumberIE - (Q931Message *pmsg, const char *number, unsigned plan, unsigned type, + (OOCTXT* pctxt, Q931Message *pmsg, const char *number, unsigned plan, unsigned type, unsigned presentation, unsigned screening); /** @@ -709,7 +709,7 @@ * @return OO_OK, on success. OO_FAILED, on failure. */ EXTERN int ooQ931SetCauseIE - (Q931Message *pmsg,enum Q931CauseValues cause, unsigned coding, + (OOCTXT *pctxt, Q931Message *pmsg,enum Q931CauseValues cause, unsigned coding, unsigned location); /** --- channels/ooh323c/src/oochannels.c 2008-06-04 21:35:29.000000000 +0400 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/oochannels.c 2009-06-02 05:29:32.000000000 +0400 @@ -13,6 +13,8 @@ * maintain this copyright notice. * *****************************************************************************/ +#include +#include #include "ooports.h" #include "oochannels.h" @@ -30,8 +32,11 @@ #include "ooCmdChannel.h" #include "ootypes.h" + /** Global endpoint structure */ extern OOH323EndPoint gH323ep; +extern ast_mutex_t callListLock; +extern ast_mutex_t monitorLock; extern DList g_TimerList; @@ -60,7 +65,7 @@ *(call->h245listenport) = ret; call->h245listener = (OOSOCKET*)memAlloc(call->pctxt, sizeof(OOSOCKET)); *(call->h245listener) = channelSocket; - ret = ooSocketListen(*(call->h245listener), 20); + ret = ooSocketListen(*(call->h245listener), 4096); if(ret != ASN_OK) { OOTRACEERR3("Error:Unable to listen on H.245 socket (%s, %s)\n", @@ -228,8 +233,9 @@ int ooCreateH225Connection(OOH323CallData *call) { - int ret=0; + int ret=0, i; OOSOCKET channelSocket=0; + for (i=0;i<3;i++) { if((ret=ooSocketCreate (&channelSocket))!=ASN_OK) { OOTRACEERR3("Failed to create socket for transmit H2250 channel (%s, %s)" @@ -314,19 +320,22 @@ } else { - OOTRACEERR3("ERROR:Failed to connect to remote destination for " - "transmit H2250 channel(%s, %s)\n",call->callType, - call->callToken); + OOTRACEERR5("ERROR:Failed to connect to remote destination for " + "transmit H2250 channel(%s, %s, %d, %s)\n",call->callType, + call->callToken, channelSocket, call->localIP); + close(channelSocket); + if(call->callState < OO_CALL_CLEAR) { /* No one is listening at remote end */ call->callState = OO_CALL_CLEAR; call->callEndReason = OO_REASON_NOUSER; } - return OO_FAILED; + if (i>=2) return OO_FAILED; else continue; } return OO_FAILED; - } + } + } } int ooCloseH225Connection (OOH323CallData *call) @@ -364,7 +373,7 @@ gH323ep.listener = (OOSOCKET*)memAlloc(&gH323ep.ctxt,sizeof(OOSOCKET)); *(gH323ep.listener) = channelSocket; - ooSocketListen(channelSocket,20); /*listen on socket*/ + ooSocketListen(channelSocket,2048); /*listen on socket*/ OOTRACEINFO1("H323 listener creation - successful\n"); return OO_OK; } @@ -475,6 +484,44 @@ } +int ooSetCmdFDSETs(fd_set *pReadfds, fd_set *pWritefds, int *nfds) +{ + OOH323CallData *call=NULL; + + if(gH323ep.cmdSock) + { + FD_SET(gH323ep.cmdSock, pReadfds); + if(*nfds < (int)gH323ep.cmdSock) + *nfds = (int)gH323ep.cmdSock; + } + + + if(*nfds != 0) *nfds = *nfds+1; + + return OO_OK; + +} + +int ooProcessCmdFDSETsAndTimers + (fd_set *pReadfds, fd_set *pWritefds, struct timeval *pToMin) +{ + OOH323CallData *call, *prev=NULL; + struct timeval toNext; + + if(gH323ep.cmdSock) { + if(FD_ISSET(gH323ep.cmdSock, pReadfds)) { + if(ooReadAndProcessStackCommand() != OO_OK) { + /* ooReadAndProcessStackCommand prints an error message */ + return OO_FAILED; + } + } + } + + return OO_OK; + +} + + int ooSetFDSETs(fd_set *pReadfds, fd_set *pWritefds, int *nfds) { OOH323CallData *call=NULL; @@ -492,60 +539,61 @@ *nfds = *((int*)gH323ep.listener); } - if(gH323ep.cmdSock) - { - FD_SET(gH323ep.cmdSock, pReadfds); - if(*nfds < (int)gH323ep.cmdSock) - *nfds = (int)gH323ep.cmdSock; - } + if(*nfds != 0) *nfds = *nfds+1; + return OO_OK; - - if(gH323ep.callList) - { - call = gH323ep.callList; - while(call) - { - if (0 != call->pH225Channel && 0 != call->pH225Channel->sock) - { - FD_SET (call->pH225Channel->sock, pReadfds); - if (call->pH225Channel->outQueue.count > 0 || - (OO_TESTFLAG (call->flags, OO_M_TUNNELING) && - 0 != call->pH245Channel && - call->pH245Channel->outQueue.count>0)) - FD_SET (call->pH225Channel->sock, pWritefds); - if(*nfds < (int)call->pH225Channel->sock) - *nfds = call->pH225Channel->sock; - } +} + +int ooSetCallFDSETs(OOH323CallData* call, fd_set *pReadfds, fd_set *pWritefds, int *nfds) +{ + + if(call) + { + + if(call->cmdSock && call->callState < OO_CALL_CLEAR) + { + FD_SET(call->cmdSock, pReadfds); + if(*nfds < (int)call->cmdSock) + *nfds = (int)call->cmdSock; + } + if (0 != call->pH225Channel && 0 != call->pH225Channel->sock) + { + FD_SET (call->pH225Channel->sock, pReadfds); + if (call->pH225Channel->outQueue.count > 0 || + (OO_TESTFLAG (call->flags, OO_M_TUNNELING) && + 0 != call->pH245Channel && + call->pH245Channel->outQueue.count>0)) + FD_SET (call->pH225Channel->sock, pWritefds); + if(*nfds < (int)call->pH225Channel->sock) + *nfds = call->pH225Channel->sock; + } - if (0 != call->pH245Channel && call->pH245Channel->sock != 0) - { - FD_SET(call->pH245Channel->sock, pReadfds); - if (call->pH245Channel->outQueue.count>0) - FD_SET(call->pH245Channel->sock, pWritefds); - if(*nfds < (int)call->pH245Channel->sock) - *nfds = call->pH245Channel->sock; - } - else if(call->h245listener) - { - OOTRACEINFO3("H.245 Listerner socket being monitored " - "(%s, %s)\n", call->callType, call->callToken); - FD_SET(*(call->h245listener), pReadfds); - if(*nfds < (int)*(call->h245listener)) - *nfds = *(call->h245listener); - } - call = call->next; - - }/* while(call) */ - }/*if(gH323ep.callList) */ + if (0 != call->pH245Channel && call->pH245Channel->sock != 0) + { + FD_SET(call->pH245Channel->sock, pReadfds); + if (call->pH245Channel->outQueue.count>0) + FD_SET(call->pH245Channel->sock, pWritefds); + if(*nfds < (int)call->pH245Channel->sock) + *nfds = call->pH245Channel->sock; + } + else if(call->h245listener) + { + OOTRACEINFO3("H.245 Listerner socket being monitored " + "(%s, %s)\n", call->callType, call->callToken); + FD_SET(*(call->h245listener), pReadfds); + if(*nfds < (int)*(call->h245listener)) + *nfds = *(call->h245listener); + } + } + if(*nfds != 0) *nfds = *nfds+1; return OO_OK; - } - + int ooProcessFDSETsAndTimers (fd_set *pReadfds, fd_set *pWritefds, struct timeval *pToMin) { @@ -576,15 +624,6 @@ } } - if(gH323ep.cmdSock) { - if(FD_ISSET(gH323ep.cmdSock, pReadfds)) { - if(ooReadAndProcessStackCommand() != OO_OK) { - /* ooReadAndProcessStackCommand prints an error message */ - return OO_FAILED; - } - } - } - /* Manage ready descriptors after select */ if(0 != gH323ep.gkClient && 0 != gH323ep.gkClient->rasSocket) @@ -609,97 +648,182 @@ } - if(gH323ep.callList) - { - call = gH323ep.callList; - while(call) - { - ooTimerFireExpired(call->pctxt, &call->timerList); - if (0 != call->pH225Channel && 0 != call->pH225Channel->sock) - { - if(FD_ISSET(call->pH225Channel->sock, pReadfds)) - { - if(ooH2250Receive(call) != OO_OK) - { - OOTRACEERR3("ERROR:Failed ooH2250Receive - Clearing call " - "(%s, %s)\n", call->callType, call->callToken); - if(call->callState < OO_CALL_CLEAR) - { - call->callEndReason = OO_REASON_INVALIDMESSAGE; - call->callState = OO_CALL_CLEAR; - } - } - } - } + return OO_OK; +} +int ooProcessCallFDSETsAndTimers + (OOH323CallData *call, fd_set *pReadfds, fd_set *pWritefds, struct timeval *pToMin) +{ + struct timeval toNext; - if (0 != call->pH245Channel && 0 != call->pH245Channel->sock) - { - if(FD_ISSET(call->pH245Channel->sock, pReadfds)) - { - ooH245Receive(call); - } - } - - if (0 != call->pH245Channel && 0 != call->pH245Channel->sock) - { - if(FD_ISSET(call->pH245Channel->sock, pWritefds)) - { - if(call->pH245Channel->outQueue.count>0) - ooSendMsg(call, OOH245MSG); - } - } - else if(call->h245listener) - { - if(FD_ISSET(*(call->h245listener), pReadfds)) - { - OOTRACEDBGC3("Incoming H.245 connection (%s, %s)\n", - call->callType, call->callToken); - ooAcceptH245Connection(call); - } - } + if(call) + { - if (0 != call->pH225Channel && 0 != call->pH225Channel->sock) - { - if(FD_ISSET(call->pH225Channel->sock, pWritefds)) - { - if(call->pH225Channel->outQueue.count>0) - { - OOTRACEDBGC3("Sending H225 message (%s, %s)\n", - call->callType, call->callToken); - ooSendMsg(call, OOQ931MSG); - } - if(call->pH245Channel && - call->pH245Channel->outQueue.count>0 && - OO_TESTFLAG (call->flags, OO_M_TUNNELING)) - { - OOTRACEDBGC3("H245 message needs to be tunneled. " - "(%s, %s)\n", call->callType, - call->callToken); - ooSendMsg(call, OOH245MSG); - } - } - } + if(call->cmdSock) { + if(FD_ISSET(call->cmdSock, pReadfds)) { + ast_mutex_lock(&call->Lock); + if(ooReadAndProcessCallStackCommand(call) != OO_OK) { + /* ooReadAndProcessStackCommand prints an error message */ + ast_mutex_unlock(&call->Lock); + return OO_FAILED; + } + ast_mutex_unlock(&call->Lock); + } + } - if(ooTimerNextTimeout(&call->timerList, &toNext)) - { - if(ooCompareTimeouts(pToMin, &toNext) > 0) - { - pToMin->tv_sec = toNext.tv_sec; - pToMin->tv_usec = toNext.tv_usec; - } - } - prev = call; - call = call->next; - if(prev->callState >= OO_CALL_CLEAR) - ooEndCall(prev); - }/* while(call) */ - }/* if(gH323ep.callList) */ + ooTimerFireExpired(call->pctxt, &call->timerList); + if (0 != call->pH225Channel && 0 != call->pH225Channel->sock) + { + if(FD_ISSET(call->pH225Channel->sock, pReadfds)) + { + if(ooH2250Receive(call) != OO_OK) + { + OOTRACEERR3("ERROR:Failed ooH2250Receive - Clearing call " + "(%s, %s)\n", call->callType, call->callToken); + if(call->callState < OO_CALL_CLEAR) + { + call->callEndReason = OO_REASON_INVALIDMESSAGE; + call->callState = OO_CALL_CLEAR; + } + } + } + } + + if (0 != call->pH245Channel && 0 != call->pH245Channel->sock) + { + if(FD_ISSET(call->pH245Channel->sock, pReadfds)) + { + ooH245Receive(call); + } + } + + if (0 != call->pH245Channel && 0 != call->pH245Channel->sock) + { + if(FD_ISSET(call->pH245Channel->sock, pWritefds)) + { + if(call->pH245Channel->outQueue.count>0) + ooSendMsg(call, OOH245MSG); + } + } + else if(call->h245listener) + { + if(FD_ISSET(*(call->h245listener), pReadfds)) + { + OOTRACEDBGC3("Incoming H.245 connection (%s, %s)\n", + call->callType, call->callToken); + ooAcceptH245Connection(call); + } + } + + if (0 != call->pH225Channel && 0 != call->pH225Channel->sock) + { + if(FD_ISSET(call->pH225Channel->sock, pWritefds)) + { + if(call->pH225Channel->outQueue.count>0) + { + OOTRACEDBGC3("Sending H225 message (%s, %s)\n", + call->callType, call->callToken); + ooSendMsg(call, OOQ931MSG); + } + if(call->pH245Channel && + call->pH245Channel->outQueue.count>0 && + OO_TESTFLAG (call->flags, OO_M_TUNNELING)) + { + OOTRACEDBGC3("H245 message needs to be tunneled. " + "(%s, %s)\n", call->callType, + call->callToken); + ooSendMsg(call, OOH245MSG); + } + } + } + + if(ooTimerNextTimeout(&call->timerList, &toNext)) + { + if(ooCompareTimeouts(pToMin, &toNext) > 0) + { + pToMin->tv_sec = toNext.tv_sec; + pToMin->tv_usec = toNext.tv_usec; + } + } + + if(call->callState >= OO_CALL_CLEAR && call->callState < OO_CALL_CLEARED) { + ast_mutex_lock(&call->Lock); + ooEndCall(call); + ast_mutex_unlock(&call->Lock); + } else if(call->callState == OO_CALL_CLEARED) { + ast_mutex_lock(&call->Lock); + ooEndCall(call); + ast_mutex_unlock(&call->Lock); + ooStopMonitorCallChannels(call); + } + } return OO_OK; } +int ooMonitorCmdChannels() +{ + int ret=0, nfds=0; + struct timeval toMin, toNext; + fd_set readfds, writefds; + + gMonitor = TRUE; + + toMin.tv_sec = 3; + toMin.tv_usec = 0; + + while(1) + { + FD_ZERO(&readfds); + FD_ZERO(&writefds); + nfds = 0; + ooSetCmdFDSETs(&readfds, &writefds, &nfds); + + if(!gMonitor) { + OOTRACEINFO1("Ending Monitor thread\n"); + break; + } + + + if(nfds == 0) +#ifdef _WIN32 + Sleep(10); +#else + { + toMin.tv_sec = 0; + toMin.tv_usec = 10000; + ooSocketSelect(1, 0, 0, 0, &toMin); + } +#endif + else + ret = ooSocketSelect(nfds, &readfds, &writefds, + NULL, &toMin); + + if(ret == -1) + { + + OOTRACEERR1("Error in select ...exiting\n"); + exit(-1); + continue; + } + + toMin.tv_sec = 0; + toMin.tv_usec = 100000; /* 100ms*/ + + ast_mutex_lock(&monitorLock); + if(ooProcessCmdFDSETsAndTimers(&readfds, &writefds, &toMin) != OO_OK) + { + /* ooStopMonitorCalls(); */ + ast_mutex_unlock(&monitorLock); + continue; + } + ast_mutex_unlock(&monitorLock); + + }/* while(1)*/ + return OO_OK; +} + int ooMonitorChannels() { int ret=0, nfds=0; @@ -759,6 +883,7 @@ toMin.tv_usec = 100000; /* 100ms*/ /*This is for test application. Not part of actual stack */ + ast_mutex_lock(&monitorLock); ooTimerFireExpired(&gH323ep.ctxt, &g_TimerList); if(ooTimerNextTimeout(&g_TimerList, &toNext)) { @@ -771,13 +896,94 @@ if(ooProcessFDSETsAndTimers(&readfds, &writefds, &toMin) != OO_OK) { + ast_mutex_unlock(&monitorLock); ooStopMonitorCalls(); continue; } + ast_mutex_unlock(&monitorLock); }/* while(1)*/ return OO_OK; } +int ooMonitorCallChannels(OOH323CallData *call) +{ + int ret=0, nfds=0; + struct timeval toMin, toNext; + fd_set readfds, writefds; + pthread_t thread; + + OOCTXT* pctxt; + + call->Monitor = TRUE; + + toMin.tv_sec = 3; + toMin.tv_usec = 0; + + while(1) + { + if(!call->Monitor) { + OOTRACEINFO1("Ending Call Monitor thread\n"); + break; + } + + FD_ZERO(&readfds); + FD_ZERO(&writefds); + nfds = 0; + ooSetCallFDSETs(call, &readfds, &writefds, &nfds); + + + if(nfds == 0) +#ifdef _WIN32 + Sleep(10); +#else + { + toMin.tv_sec = 0; + toMin.tv_usec = 10000; + ooSocketSelect(1, 0, 0, 0, &toMin); + } +#endif + else + ret = ooSocketSelect(nfds, &readfds, &writefds, + NULL, &toMin); + + if(ret == -1) + { + + OOTRACEERR2("Error in select %d ...exiting\n", errno); + call->callEndReason = OO_REASON_INVALIDMESSAGE; + call->callState = OO_CALL_CLEARED; + ooCleanCall(call); break; + + /* continue; + exit(-1); */ + } + + toMin.tv_sec = 0; + toMin.tv_usec = 100000; /* 100ms*/ + /*This is for test application. Not part of actual stack */ + + if(ooProcessCallFDSETsAndTimers(call, &readfds, &writefds, &toMin) != OO_OK) + { + ooStopMonitorCallChannels(call); + continue; + } + + }/* while(1)*/ + + if (call->cmdSock) + ooCloseCallCmdConnection(call); + + ast_mutex_lock(&call->Lock); + ast_mutex_unlock(&call->Lock); + ast_mutex_destroy(&call->Lock); + thread = call->callThread; + pctxt = call->pctxt; + freeContext(pctxt); + free(pctxt); + /* pthread_exit(&thread); */ + + return OO_OK; +} int ooH2250Receive(OOH323CallData *call) { @@ -785,7 +991,9 @@ ASN1OCTET message[MAXMSGLEN], message1[MAXMSGLEN]; int len; Q931Message *pmsg; - OOCTXT *pctxt = &gH323ep.msgctxt; + /* OOCTXT *pctxt = &gH323ep.msgctxt; */ + OOCTXT *pctxt = call->pctxt; + struct timeval timeout; fd_set readfds; @@ -795,7 +1003,8 @@ { OOTRACEERR3("ERROR:Failed to allocate memory for incoming H.2250 message" " (%s, %s)\n", call->callType, call->callToken); - memReset(&gH323ep.msgctxt); + /* memReset(&gH323ep.msgctxt); */ + memReset(call->pctxt); return OO_FAILED; } memset(pmsg, 0, sizeof(Q931Message)); @@ -818,7 +1027,7 @@ call->callState = OO_CALL_CLEARED; } - ooFreeQ931Message(pmsg); + ooFreeQ931Message(pctxt, pmsg); return OO_OK; } OOTRACEDBGC3("Receiving H.2250 message (%s, %s)\n", @@ -832,7 +1041,7 @@ OOTRACEERR4("Error: Reading TPKT header for H225 message " "recvLen= %d (%s, %s)\n", recvLen, call->callType, call->callToken); - ooFreeQ931Message(pmsg); + ooFreeQ931Message(pctxt, pmsg); if(call->callState < OO_CALL_CLEAR) { call->callEndReason = OO_REASON_INVALIDMESSAGE; @@ -874,7 +1083,7 @@ OOTRACEERR3("Error in select while receiving H.2250 message - " "clearing call (%s, %s)\n", call->callType, call->callToken); - ooFreeQ931Message(pmsg); + ooFreeQ931Message(pctxt, pmsg); if(call->callState < OO_CALL_CLEAR) { call->callEndReason = OO_REASON_TRANSPORTFAILURE; @@ -888,7 +1097,7 @@ { OOTRACEERR3("Error: Incomplete H.2250 message received - clearing " "call (%s, %s)\n", call->callType, call->callToken); - ooFreeQ931Message(pmsg); + ooFreeQ931Message(pctxt, pmsg); if(call->callState < OO_CALL_CLEAR) { call->callEndReason = OO_REASON_INVALIDMESSAGE; @@ -926,7 +1135,8 @@ ASN1OCTET message[MAXMSGLEN], message1[MAXMSGLEN]; ASN1BOOL aligned = TRUE; H245Message *pmsg; - OOCTXT *pctxt = &gH323ep.msgctxt; + /* OOCTXT *pctxt = &gH323ep.msgctxt; */ + OOCTXT *pctxt = call->pctxt; struct timeval timeout; fd_set readfds; @@ -1362,8 +1572,8 @@ case OOAlert: OOTRACEINFO3("Sent Message - Alerting (%s, %s) \n", call->callType, call->callToken); - if(gH323ep.h323Callbacks.onAlerting && call->callState < OO_CALL_CLEAR) - gH323ep.h323Callbacks.onAlerting(call); + /* if(gH323ep.h323Callbacks.onAlerting && call->callState < OO_CALL_CLEAR) + gH323ep.h323Callbacks.onAlerting(call); */ break; case OOConnect: OOTRACEINFO3("Sent Message - Connect (%s, %s)\n", call->callType, @@ -1702,6 +1912,12 @@ return OO_OK; } +int ooStopMonitorCallChannels(OOH323CallData * call) { + if (call->Monitor) + call->Monitor = FALSE; + /* if (call->cmdSock) + ooCloseCallCmdConnection(call); */ +} int ooStopMonitorCalls() { --- channels/ooh323c/src/errmgmt.c 2008-02-07 23:59:47.000000000 +0300 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/errmgmt.c 2009-05-31 00:18:57.000000000 +0400 @@ -16,6 +16,8 @@ /* Error management functions */ +#include +#include #include #include "ooasn1.h" @@ -86,7 +88,8 @@ { #if defined(_NO_THREADS) || !defined(_NO_MALLOC) if (pErrInfo->parmcnt < ASN_K_MAXERRP) { - char* tmpstr = (char*) ASN1CRTMALLOC0 (strlen(errprm_p)+1); + /* char* tmpstr = (char*) ASN1CRTMALLOC0 (strlen(errprm_p)+1); */ + char* tmpstr = (char*) malloc (strlen(errprm_p)+1); strcpy (tmpstr, errprm_p); pErrInfo->parms[pErrInfo->parmcnt] = tmpstr; pErrInfo->parmcnt++; @@ -114,7 +117,8 @@ int i; for (i = 0; i < pErrInfo->parmcnt; i++) - ASN1CRTFREE0 ((char*)pErrInfo->parms[i]); + /* ASN1CRTFREE0 ((char*)pErrInfo->parms[i]); */ + free ((char*)pErrInfo->parms[i]); #endif pErrInfo->parmcnt = 0; --- channels/ooh323c/src/ooCalls.c 2008-02-07 23:59:47.000000000 +0300 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/ooCalls.c 2009-05-31 00:22:25.000000000 +0400 @@ -14,6 +14,9 @@ * *****************************************************************************/ +#include +#include + #include "ootrace.h" #include "ootypes.h" #include "ooCalls.h" @@ -28,11 +31,14 @@ /** Global endpoint structure */ extern OOH323EndPoint gH323ep; +extern ast_mutex_t callListLock; +extern ast_mutex_t newCallLock; OOH323CallData* ooCreateCall(char* type, char*callToken) { OOH323CallData *call=NULL; OOCTXT *pctxt=NULL; + OOCTXT *msgctxt=NULL; pctxt = newContext(); if(!pctxt) @@ -40,14 +46,25 @@ OOTRACEERR1("ERROR:Failed to create OOCTXT for new call\n"); return NULL; } + msgctxt = newContext(); + if(!msgctxt) + { + OOTRACEERR1("ERROR:Failed to create OOCTXT for new call\n"); + return NULL; + } + ast_mutex_lock(&newCallLock); + /* call = (OOH323CallData*)memAlloc(&gH323ep.ctxt, sizeof(OOH323CallData)); */ call = (OOH323CallData*)memAlloc(pctxt, sizeof(OOH323CallData)); + ast_mutex_unlock(&newCallLock); if(!call) { OOTRACEERR1("ERROR:Memory - ooCreateCall - call\n"); return NULL; } - /* memset(call, 0, sizeof(OOH323CallData));*/ + memset(call, 0, sizeof(OOH323CallData)); + ast_mutex_init(&call->Lock); call->pctxt = pctxt; + call->msgctxt = msgctxt; call->callMode = gH323ep.callMode; sprintf(call->callToken, "%s", callToken); sprintf(call->callType, "%s", type); @@ -158,6 +175,8 @@ int ooAddCallToList(OOH323CallData *call) { + ast_mutex_lock(&callListLock); + if(!gH323ep.callList) { gH323ep.callList = call; @@ -170,6 +189,9 @@ gH323ep.callList->prev = call; gH323ep.callList = call; } + + ast_mutex_unlock(&callListLock); + return OO_OK; } @@ -180,9 +202,16 @@ ooGetCallStateText(call->callState), call->callType, call->callToken); + if(call->callState == OO_CALL_REMOVED) { + OOTRACEINFO2("Call already removed %s\n", + call->callToken); + return OO_OK; + } + if(call->callState == OO_CALL_CLEARED) { ooCleanCall(call); + call->callState = OO_CALL_REMOVED; return OO_OK; } @@ -230,6 +259,11 @@ if(!call) return OO_OK; + ast_mutex_lock(&callListLock); + + OOTRACEINFO3("Removing call %lx: %s\n", call, call->callToken); + + if (!gH323ep.callList) return OO_OK; if(call == gH323ep.callList) { if(!call->next) @@ -244,6 +278,9 @@ if(call->next) call->next->prev = call->prev; } + + ast_mutex_unlock(&callListLock); + return OO_OK; } @@ -314,9 +351,13 @@ gH323ep.h323Callbacks.onCallCleared(call); } - pctxt = call->pctxt; + pctxt = call->msgctxt; freeContext(pctxt); - ASN1CRTFREE0(pctxt); + free(pctxt); + call->msgctxt = NULL; +/* May !!!! Fix it !! */ + /* free(pctxt); */ + return OO_OK; } @@ -628,7 +669,7 @@ } -OOH323CallData* ooFindCallByToken(char *callToken) +OOH323CallData* ooFindCallByToken(const char *callToken) { OOH323CallData *call; if(!callToken) @@ -636,9 +677,13 @@ OOTRACEERR1("ERROR:Invalid call token passed - ooFindCallByToken\n"); return NULL; } + + ast_mutex_lock(&callListLock); + if(!gH323ep.callList) { OOTRACEERR1("ERROR: Empty calllist - ooFindCallByToken failed\n"); + ast_mutex_lock(&callListLock); return NULL; } call = gH323ep.callList; @@ -653,8 +698,14 @@ if(!call) { OOTRACEERR2("ERROR:Call with token %s not found\n", callToken); + ast_mutex_unlock(&callListLock); return NULL; } + + ast_mutex_unlock(&callListLock); + + OOTRACEINFO3("INFO: FinCall returned %lx for call: %s\n", call, callToken); + return call; } --- channels/ooh323c/src/ooCmdChannel.h 2008-06-04 21:35:29.000000000 +0400 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/ooCmdChannel.h 2009-05-30 06:40:48.000000000 +0400 @@ -52,6 +52,7 @@ * @return OO_OK, on success; OO_FAILED, on failure */ EXTERN int ooCreateCmdConnection(); +EXTERN int ooCreateCallCmdConnection(OOH323CallData*); /** * This function is used to close a command channel setup with the stack @@ -60,6 +61,7 @@ * @return OO_OK, on success; OO_FAILED, on failure */ EXTERN int ooCloseCmdConnection(); +EXTERN int ooCloseCallCmdConnection(OOH323CallData*); /** @@ -69,6 +71,7 @@ * @return OO_OK, on success; OO_FAILED, on failure */ EXTERN int ooWriteStackCommand(OOStackCommand *cmd); +EXTERN int ooWriteCallStackCommand(OOH323CallData* call, OOStackCommand *cmd); /** * This function is used by stack thread to read and process stack commands @@ -77,6 +80,7 @@ * @return OO_OK, on success; OO_FAILED, on failure */ EXTERN int ooReadAndProcessStackCommand(); +EXTERN int ooReadAndProcessCallStackCommand(OOH323CallData*); /** --- channels/ooh323c/src/ooasn1.h 2008-02-07 23:59:47.000000000 +0300 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/ooasn1.h 2009-05-31 00:24:11.000000000 +0400 @@ -22,6 +22,9 @@ #ifndef _OOASN1_H_ #define _OOASN1_H_ +#include +#include + #include #include #include @@ -406,6 +409,7 @@ struct EventHandler* pEventHandler; /* event handler object */ ASN1USINT flags; /* flag bits */ ASN1OCTET spare[2]; + ast_mutex_t pLock; } OOCTXT; /* macros and function prototypes */ @@ -512,8 +516,8 @@ #endif /* EXTERN */ #ifndef _NO_MALLOC -#define ASN1CRTMALLOC0(nbytes) malloc(nbytes) -#define ASN1CRTFREE0(ptr) free(ptr) +/*#define ASN1CRTMALLOC0(nbytes) malloc(nbytes) +#define ASN1CRTFREE0(ptr) free(ptr) */ #else #ifdef _NO_THREADS --- channels/ooh323c/src/memheap.c 2008-02-07 23:59:47.000000000 +0300 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/memheap.c 2009-05-31 00:19:07.000000000 +0400 @@ -13,18 +13,12 @@ * maintain this copyright notice. * *****************************************************************************/ - +#include +#include #include #include "memheap.h" ASN1UINT g_defBlkSize = XM_K_MEMBLKSIZ; -OSMallocFunc g_malloc_func = malloc; -#ifndef _NO_REALLOC -OSReallocFunc g_realloc_func = realloc; -#else -OSReallocFunc g_realloc_func = 0; -#endif -OSFreeFunc g_free_func = free; static OSMemLink* memHeapAddBlock (OSMemLink** ppMemLink, void* pMemBlk, int blockType); @@ -172,6 +166,7 @@ nunits = (((unsigned)(nbytes + 7)) >> 3); pMemHeap = (OSMemHeap*) *ppvMemHeap; + ast_mutex_lock(&pMemHeap->pLock); ppMemLink = &pMemHeap->phead; /* if size is greater than 2**19, then allocate as RAW block */ @@ -181,17 +176,18 @@ /* allocate raw block */ - data = g_malloc_func (nbytes); + data = malloc (nbytes); if (data == NULL) { return NULL; } pMemLink = memHeapAddBlock (ppMemLink, data, RTMEMMALLOC | RTMEMRAW); if (pMemLink == 0) { - g_free_func (data); + free (data); return NULL; } /* save size of the RAW memory block behind the pMemLink */ *(int*)(((char*)pMemLink) + sizeof (OSMemLink)) = nbytes; + ast_mutex_unlock(&pMemHeap->pLock); return data; } @@ -337,7 +333,7 @@ ((((ASN1UINT)dataUnits) * 8u) + sizeof (OSMemBlk)); } - pmem = (ASN1OCTET*) g_malloc_func (allocSize + sizeof (OSMemLink)); + pmem = (ASN1OCTET*) malloc (allocSize + sizeof (OSMemLink)); if (0 != pmem) { OSMemElemDescr* pElem; @@ -361,7 +357,8 @@ if (memHeapAddBlock (ppMemLink, pMemBlk, RTMEMSTD | RTMEMLINK) == 0) { - g_free_func (pmem); + free (pmem); + ast_mutex_unlock(&pMemHeap->pLock); return NULL; } @@ -374,8 +371,10 @@ CHECKMEMELEM (pMemBlk, pElem); CHECKMEMBLOCK (pMemHeap, pMemBlk); } - else + else { + ast_mutex_unlock(&pMemHeap->pLock); return NULL; + } } RTMEMDIAG2 ("memHeapAlloc: pMemBlk = 0x%x\n", pMemBlk); RTMEMDIAG2 ("memHeapAlloc: pMemBlk->free_x = %d\n", pMemBlk->free_x); @@ -384,6 +383,7 @@ RTMEMDIAG2 ("memHeapAlloc: mem_p = 0x%x\n", mem_p); RTMEMDIAG2 ("memHeapAlloc: sizeof (short) = %d\n", sizeof(short)); + ast_mutex_unlock(&pMemHeap->pLock); return (mem_p); } @@ -407,6 +407,9 @@ if (mem_p == 0 || ppvMemHeap == 0 || *ppvMemHeap == 0) return; pMemHeap = *(OSMemHeap**)ppvMemHeap; + + ast_mutex_lock(&pMemHeap->pLock); + ppMemLink = &pMemHeap->phead; /* look for chain of RAW blocks first */ @@ -434,13 +437,14 @@ if ((pMemLink->blockType & RTMEMLINK) && (pMemLink->blockType & RTMEMMALLOC)) { - g_free_func (pMemLink); + free (pMemLink); } else { if (pMemLink->blockType & RTMEMMALLOC) - g_free_func (pMemLink->pMemBlk); - g_free_func (pMemLink); + free (pMemLink->pMemBlk); + free (pMemLink); } + ast_mutex_unlock(&pMemHeap->pLock); return; } pPrevMemLink = pMemLink; @@ -455,6 +459,7 @@ if (ISFREE (pElem)) { /* already freed! */ RTMEMDIAG2 ("memHeapFreePtr: " "the element 0x%x is already freed!\n", pElem); + ast_mutex_unlock(&pMemHeap->pLock); return; } @@ -548,11 +553,11 @@ FILLFREEMEM (pMemBlk->plink, sizeof (*pMemBlk->plink)); FILLFREEMEM (pMemBlk->data, (pMemBlk->nunits * 8u)); - g_free_func (pMemBlk->plink); + free (pMemBlk->plink); if (!(blockType & RTMEMLINK)) { FILLFREEMEM (pMemBlk, sizeof (*pMemBlk)); - g_free_func (pMemBlk); + free (pMemBlk); } RTMEMDIAG2 ("memHeapFreePtr: pMemBlk = 0x%x was freed\n", pMemBlk); @@ -642,6 +647,7 @@ CHECKMEMELEM (pMemBlk, pElem); CHECKMEMBLOCK (pMemHeap, pMemBlk); } + ast_mutex_unlock(&pMemHeap->pLock); } static void initNewFreeElement (OSMemBlk* pMemBlk, @@ -742,8 +748,8 @@ pMemLink->pMemBlk == mem_p) { if (pMemLink->blockType & RTMEMMALLOC) - if (g_realloc_func != 0) { - void *newMemBlk = g_realloc_func (pMemLink->pMemBlk, nbytes_); + if (1) { + void *newMemBlk = realloc (pMemLink->pMemBlk, nbytes_); if (newMemBlk == 0) return 0; pMemLink->pMemBlk = newMemBlk; @@ -754,7 +760,7 @@ int oldSize = *(int*)(((char*)pMemLink) + sizeof (OSMemLink)); if (oldSize == -1) return 0; - newBuf = (ASN1OCTET*)g_malloc_func (nbytes_); + newBuf = (ASN1OCTET*) malloc (nbytes_); if (newBuf == 0) return 0; memcpy (newBuf, pMemLink->pMemBlk, ASN1MIN (oldSize, nbytes_)); @@ -994,6 +1000,8 @@ if (ppvMemHeap == 0 || *ppvMemHeap == 0) return; pMemHeap = *(OSMemHeap**)ppvMemHeap; + ast_mutex_lock(&pMemHeap->pLock); + pMemLink = pMemHeap->phead; RTMEMDIAG2 ("memHeapFreeAll: pMemHeap = 0x%x\n", pMemHeap); @@ -1045,10 +1053,11 @@ if (((pMemLink2->blockType & RTMEMSTD) || (pMemLink2->blockType & RTMEMMALLOC)) && !(pMemLink2->blockType & RTMEMLINK)) - g_free_func (pMemLink2->pMemBlk); - g_free_func (pMemLink2); + free (pMemLink2->pMemBlk); + free (pMemLink2); } } + ast_mutex_unlock(&pMemHeap->pLock); } /* increments internal refCnt. use memHeapRelease to decrement and release */ @@ -1058,7 +1067,9 @@ if (ppvMemHeap == 0 || *ppvMemHeap == 0) return; pMemHeap = *(OSMemHeap**)ppvMemHeap; + ast_mutex_lock(&pMemHeap->pLock); pMemHeap->refCnt++; + ast_mutex_unlock(&pMemHeap->pLock); } /* Frees all memory and heap structure as well (if was allocated) */ @@ -1106,6 +1117,9 @@ return 0; pMemHeap = *(OSMemHeap**)ppvMemHeap; + + ast_mutex_lock(&pMemHeap->pLock); + pMemLink = pMemHeap->phead; /* look for chain of RAW blocks first */ @@ -1128,6 +1142,8 @@ if (ISFREE (pElem)) { /* already freed! */ RTMEMDIAG2 ("memHeapMarkSaved: the element 0x%x is " "already free!\n", pElem); + + ast_mutex_unlock(&pMemHeap->pLock); return 0; } @@ -1147,12 +1163,15 @@ nsaved = pMemBlk->nsaved; } else + ast_mutex_unlock(&pMemHeap->pLock); return 0; } if (saved && nsaved > 0) pMemLink->blockType |= RTMEMSAVED; else if (nsaved == 0) pMemLink->blockType &= (~RTMEMSAVED); + + ast_mutex_unlock(&pMemHeap->pLock); return pMemLink->pMemBlk; } @@ -1167,6 +1186,8 @@ if (ppvMemHeap == 0 || *ppvMemHeap == 0) return; pMemHeap = *(OSMemHeap**)ppvMemHeap; + ast_mutex_lock(&pMemHeap->pLock); + pMemLink = pMemHeap->phead; TRACEFREE (pMemHeap, "memHeapReset\n\n"); while (pMemLink) { @@ -1190,6 +1211,7 @@ } pMemLink = pMemLink->pnext; } + ast_mutex_unlock(&pMemHeap->pLock); } /* add memory block to list */ @@ -1206,7 +1228,7 @@ if (blockType & RTMEMLINK) pMemLink = (OSMemLink*) (((ASN1OCTET*)pMemBlk) - sizeof (OSMemLink)); else { - pMemLink = (OSMemLink*) g_malloc_func ( + pMemLink = (OSMemLink*) malloc ( sizeof(OSMemLink) + sizeof (int)); if (pMemLink == 0) return 0; /* An extra integer is necessary to save a size of a RAW memory block @@ -1257,6 +1279,8 @@ return 0; pMemHeap = *(OSMemHeap**)ppvMemHeap; + ast_mutex_lock(&pMemHeap->pLock); + pMemLink = pMemHeap->phead; for (; pMemLink != 0; pMemLink = pMemLink->pnext) { @@ -1264,8 +1288,10 @@ /* if RAW block, the pointer should be stored in pMemBlk */ - if (pMemLink->pMemBlk == mem_p) + if (pMemLink->pMemBlk == mem_p) { + ast_mutex_unlock(&pMemHeap->pLock); return 1; + } } else { OSMemBlk* pMemBlk = (OSMemBlk*)pMemLink->pMemBlk; @@ -1281,12 +1307,16 @@ for (; pElem != 0; pElem = GETNEXT (pElem)) { void* curMem_p = (void*) pElem_data (pElem); - if (curMem_p == mem_p && !ISFREE (pElem)) + if (curMem_p == mem_p && !ISFREE (pElem)) { + ast_mutex_unlock(&pMemHeap->pLock); return 1; + } } } } } + + ast_mutex_unlock(&pMemHeap->pLock); return 0; } @@ -1301,6 +1331,8 @@ memHeapCreate (ppvMemHeap); pMemHeap = *(OSMemHeap**)ppvMemHeap; + ast_mutex_lock(&pMemHeap->pLock); + switch (propId) { case OSRTMH_PROPID_DEFBLKSIZE: pMemHeap->defBlkSize = *(ASN1UINT*)pProp; @@ -1312,6 +1344,7 @@ pMemHeap->flags &= ((~(*(ASN1UINT*)pProp)) | RT_MH_INTERNALMASK); break; } + ast_mutex_unlock(&pMemHeap->pLock); } int memHeapCreate (void** ppvMemHeap) @@ -1319,12 +1352,13 @@ OSMemHeap* pMemHeap; if (ppvMemHeap == 0) return ASN_E_INVPARAM; - pMemHeap = (OSMemHeap*) g_malloc_func (sizeof (OSMemHeap)); + pMemHeap = (OSMemHeap*) malloc (sizeof (OSMemHeap)); if (pMemHeap == NULL) return ASN_E_NOMEM; memset (pMemHeap, 0, sizeof (OSMemHeap)); pMemHeap->defBlkSize = g_defBlkSize; pMemHeap->refCnt = 1; pMemHeap->flags = RT_MH_FREEHEAPDESC; + ast_mutex_init(&pMemHeap->pLock); *ppvMemHeap = (void*)pMemHeap; return ASN_OK; } --- channels/ooh323c/src/rtctype.c 2008-02-07 23:59:47.000000000 +0300 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/rtctype.c 2009-05-31 00:23:24.000000000 +0400 @@ -16,6 +16,9 @@ /* Run-time ctype substitution */ +#include +#include + #include "ooasn1.h" #include "rtctype.h" --- channels/ooh323c/src/ooStackCmds.h 2008-02-07 23:59:47.000000000 +0300 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/ooStackCmds.h 2009-06-03 00:48:04.000000000 +0400 @@ -65,6 +65,7 @@ OO_CMD_HANGCALL, /*!< Terminate call */ OO_CMD_SENDDIGIT, /*!< Send dtmf */ OO_CMD_MANUALRINGBACK, /*!< Send Alerting - ringback */ + OO_CMD_MANUALPROGRESS, /*!< Send progress */ OO_CMD_STOPMONITOR /*!< Stop the event monitor */ } OOStackCmdID; @@ -76,8 +77,11 @@ typedef struct OOStackCommand { OOStackCmdID type; void* param1; + int plen1; void* param2; + int plen2; void* param3; + int plen3; } OOStackCommand; #define ooCommand OOStackCommand; @@ -105,6 +109,7 @@ * @return Returns OOStkCmdStat value indication success or failure. */ EXTERN OOStkCmdStat ooManualRingback(const char *callToken); +EXTERN OOStkCmdStat ooManualProgress(const char *callToken); /** * This function is used to answer a call @@ -131,7 +136,7 @@ * * @return Returns OOStkCmdStat value indication success or failure. */ -EXTERN OOStkCmdStat ooHangCall(const char* callToken, OOCallClearReason reason); +EXTERN OOStkCmdStat ooHangCall(const char* callToken, OOCallClearReason reason, int q931cause); /** * This command function can be used by an user application to send a DTMF --- channels/ooh323c/src/ooh323ep.c 2008-06-04 21:35:29.000000000 +0400 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/ooh323ep.c 2009-05-31 00:22:53.000000000 +0400 @@ -13,6 +13,9 @@ * maintain this copyright notice. * *****************************************************************************/ +#include +#include + #include "ooh323ep.h" #include "ootrace.h" #include "ooCalls.h" @@ -23,6 +26,10 @@ /** Global endpoint structure */ ooEndPoint gH323ep; +ast_mutex_t monitorLock; +ast_mutex_t callListLock; +ast_mutex_t newCallLock; +ast_mutex_t bindPortLock; extern DList g_TimerList; @@ -104,6 +111,10 @@ gH323ep.myCaps = NULL; gH323ep.noOfCaps = 0; gH323ep.callList = NULL; + ast_mutex_init(&monitorLock); + ast_mutex_init(&callListLock); + ast_mutex_init(&newCallLock); + ast_mutex_init(&bindPortLock); gH323ep.dtmfmode = 0; gH323ep.callingPartyNumber[0]='\0'; gH323ep.callMode = callMode; @@ -135,6 +146,16 @@ return OO_OK; } +EXTERN int ooH323EpSetVersionInfo(int t35cc, int t35ext, int manc, char* prodid, char* verid) { + + if (t35cc) gH323ep.t35CountryCode = t35cc; + if (t35ext) gH323ep.t35Extension = t35ext; + if (manc) gH323ep.manufacturerCode = manc; + if (prodid != NULL && prodid[0]) gH323ep.productID = prodid; + if (verid != NULL && verid[0]) gH323ep.versionID = verid; +} + + int ooH323EpSetLocalAddress(const char* localip, int listenport) { @@ -364,6 +385,7 @@ } freeContext(&(gH323ep.ctxt)); + freeContext(&(gH323ep.msgctxt)); OO_CLRFLAG(gH323ep.flags, OO_M_ENDPOINTCREATED); } --- channels/ooh323c/src/ooStackCmds.c 2008-02-07 23:59:47.000000000 +0300 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/ooStackCmds.c 2009-06-03 01:04:44.000000000 +0400 @@ -13,6 +13,8 @@ * maintain this copyright notice. * *****************************************************************************/ +#include +#include #include "ooStackCmds.h" #include "ooh323ep.h" @@ -20,18 +22,21 @@ #include "ooCmdChannel.h" extern OOSOCKET gCmdChan; +extern ast_mutex_t newCallLock; + +static int counter = 1; int ooGenerateOutgoingCallToken (char *callToken, size_t size) { - static int counter = 1; char aCallToken[200]; int ret = 0; - + ast_mutex_lock(&newCallLock); sprintf (aCallToken, "ooh323c_o_%d", counter++); if (counter > OO_MAX_CALL_TOKEN) counter = 1; + ast_mutex_unlock(&newCallLock); if ((strlen(aCallToken)+1) < size) strcpy (callToken, aCallToken); @@ -42,6 +47,14 @@ return ret; } +int isRunning(char *callToken) { + OOH323CallData *call; + + if((call = ooFindCallByToken(callToken))) + if (call->Monitor) + return 1; + return 0; +} OOStkCmdStat ooMakeCall (const char* dest, char* callToken, size_t bufsiz, ooCallOptions *opts) @@ -108,18 +121,102 @@ return OO_STKCMD_SUCCESS; } +OOStkCmdStat ooRunCall + (const char* dest, char* callToken, size_t bufsiz, ooCallOptions *opts) +{ + OOStackCommand cmd; + OOH323CallData *call; + + if(!callToken) + { + return OO_STKCMD_INVALIDPARAM; + } + + if(!(call = ooFindCallByToken(callToken))) { + return OO_STKCMD_INVALIDPARAM; + } + + if(call->CmdChan == 0) + { + if(ooCreateCallCmdConnection(call) != OO_OK) + return OO_STKCMD_CONNECTIONERR; + } + + if(!callToken) + return OO_STKCMD_INVALIDPARAM; + + + memset(&cmd, 0, sizeof(OOStackCommand)); + cmd.type = OO_CMD_MAKECALL; + cmd.param1 = (void*) malloc(strlen(dest)+1); + if(!cmd.param1) + { + return OO_STKCMD_MEMERR; + } + strcpy((char*)cmd.param1, dest); + cmd.plen1 = strlen(dest); + + + cmd.param2 = (void*) malloc(strlen(callToken)+1); + if(!cmd.param2) + { + free(cmd.param1); + return OO_STKCMD_MEMERR; + } + + strcpy((char*)cmd.param2, callToken); + cmd.plen2 = strlen(callToken); + + if(!opts) + { + cmd.param3 = 0; + } + else { + cmd.param3 = (void*) malloc(sizeof(ooCallOptions)); + if(!cmd.param3) + { + free(cmd.param1); + free(cmd.param2); + return OO_STKCMD_MEMERR; + } + memcpy((void*)cmd.param3, opts, sizeof(ooCallOptions)); + cmd.plen3 = sizeof(ooCallOptions); + } + + if(ooWriteCallStackCommand(call, &cmd) != OO_OK) + { + free(cmd.param1); + free(cmd.param2); + if(cmd.param3) free(cmd.param3); + return OO_STKCMD_WRITEERR; + } + + + free(cmd.param1); + free(cmd.param2); + if(cmd.param3) free(cmd.param3); + + return OO_STKCMD_SUCCESS; +} + OOStkCmdStat ooManualRingback(const char *callToken) { OOStackCommand cmd; + OOH323CallData *call; + if(!callToken) { return OO_STKCMD_INVALIDPARAM; } - if(gCmdChan == 0) + if(!(call = ooFindCallByToken(callToken))) { + return OO_STKCMD_INVALIDPARAM; + } + + if(call->CmdChan == 0) { - if(ooCreateCmdConnection() != OO_OK) + if(ooCreateCallCmdConnection(call) != OO_OK) return OO_STKCMD_CONNECTIONERR; } @@ -131,28 +228,77 @@ return OO_STKCMD_MEMERR; } strcpy((char*)cmd.param1, callToken); + cmd.plen1 = strlen(callToken); - if(ooWriteStackCommand(&cmd) != OO_OK) + if(ooWriteCallStackCommand(call,&cmd) != OO_OK) + { + free(cmd.param1); + return OO_STKCMD_WRITEERR; + } + + free(cmd.param1); + + return OO_STKCMD_SUCCESS; +} + +OOStkCmdStat ooManualProgress(const char *callToken) +{ + OOStackCommand cmd; + OOH323CallData *call; + + if(!callToken) + { + return OO_STKCMD_INVALIDPARAM; + } + + if(!(call = ooFindCallByToken(callToken))) { + return OO_STKCMD_INVALIDPARAM; + } + + if(call->CmdChan == 0) + { + if(ooCreateCallCmdConnection(call) != OO_OK) + return OO_STKCMD_CONNECTIONERR; + } + + memset(&cmd, 0, sizeof(OOStackCommand)); + cmd.type = OO_CMD_MANUALPROGRESS; + cmd.param1 = (void*) malloc(strlen(callToken)+1); + if(!cmd.param1) + { + return OO_STKCMD_MEMERR; + } + strcpy((char*)cmd.param1, callToken); + cmd.plen1 = strlen(callToken); + + if(ooWriteCallStackCommand(call, &cmd) != OO_OK) { free(cmd.param1); return OO_STKCMD_WRITEERR; } + free(cmd.param1); + return OO_STKCMD_SUCCESS; } OOStkCmdStat ooAnswerCall(const char *callToken) { OOStackCommand cmd; + OOH323CallData *call; if(!callToken) { return OO_STKCMD_INVALIDPARAM; } - if(gCmdChan == 0) + if(!(call = ooFindCallByToken(callToken))) { + return OO_STKCMD_INVALIDPARAM; + } + + if(call->CmdChan == 0) { - if(ooCreateCmdConnection() != OO_OK) + if(ooCreateCallCmdConnection(call) != OO_OK) return OO_STKCMD_CONNECTIONERR; } @@ -165,31 +311,38 @@ return OO_STKCMD_MEMERR; } strcpy((char*)cmd.param1, callToken); - - if(ooWriteStackCommand(&cmd) != OO_OK) + cmd.plen1 = strlen(callToken); + + if(ooWriteCallStackCommand(call, &cmd) != OO_OK) { free(cmd.param1); return OO_STKCMD_WRITEERR; } + free(cmd.param1); + return OO_STKCMD_SUCCESS; } OOStkCmdStat ooForwardCall(const char* callToken, char *dest) { OOStackCommand cmd; + OOH323CallData *call; if(!callToken || !dest) { return OO_STKCMD_INVALIDPARAM; } - if(gCmdChan == 0) + if(!(call = ooFindCallByToken(callToken))) { + return OO_STKCMD_INVALIDPARAM; + } + + if(call->CmdChan == 0) { - if(ooCreateCmdConnection() != OO_OK) + if(ooCreateCallCmdConnection(call) != OO_OK) return OO_STKCMD_CONNECTIONERR; } - memset(&cmd, 0, sizeof(OOStackCommand)); cmd.type = OO_CMD_FWDCALL; @@ -202,31 +355,41 @@ return OO_STKCMD_MEMERR; } strcpy((char*)cmd.param1, callToken); + cmd.plen1 = strlen(callToken); strcpy((char*)cmd.param2, dest); + cmd.plen2 = strlen(dest); - if(ooWriteStackCommand(&cmd) != OO_OK) + if(ooWriteCallStackCommand(call, &cmd) != OO_OK) { free(cmd.param1); free(cmd.param2); return OO_STKCMD_WRITEERR; } + free(cmd.param1); + free(cmd.param2); return OO_STKCMD_SUCCESS; } -OOStkCmdStat ooHangCall(const char* callToken, OOCallClearReason reason) +OOStkCmdStat ooHangCall(const char* callToken, OOCallClearReason reason, int q931cause) { OOStackCommand cmd; + OOH323CallData *call; + if(!callToken) { return OO_STKCMD_INVALIDPARAM; } - if(gCmdChan == 0) + if(!(call = ooFindCallByToken(callToken))) { + return OO_STKCMD_INVALIDPARAM; + } + + if(call->CmdChan == 0) { - if(ooCreateCmdConnection() != OO_OK) + if(ooCreateCallCmdConnection(call) != OO_OK) return OO_STKCMD_CONNECTIONERR; } @@ -234,21 +397,31 @@ cmd.type = OO_CMD_HANGCALL; cmd.param1 = (void*) malloc(strlen(callToken)+1); cmd.param2 = (void*) malloc(sizeof(OOCallClearReason)); - if(!cmd.param1 || !cmd.param2) + cmd.param3 = (void*) malloc(sizeof(int)); + if(!cmd.param1 || !cmd.param2 || !cmd.param3) { if(cmd.param1) free(cmd.param1); /* Release memory */ if(cmd.param2) free(cmd.param2); + if(cmd.param3) free(cmd.param3); return OO_STKCMD_MEMERR; } strcpy((char*)cmd.param1, callToken); + cmd.plen1 = strlen(callToken); *((OOCallClearReason*)cmd.param2) = reason; + cmd.plen2 = sizeof(OOCallClearReason); + *(int *)cmd.param3 = q931cause; + cmd.plen3 = sizeof(int); - if(ooWriteStackCommand(&cmd) != OO_OK) + if(ooWriteCallStackCommand(call, &cmd) != OO_OK) { free(cmd.param1); free(cmd.param2); + free(cmd.param3); return OO_STKCMD_WRITEERR; } + free(cmd.param1); + free(cmd.param2); + free(cmd.param3); return OO_STKCMD_SUCCESS; } @@ -276,15 +449,20 @@ OOStkCmdStat ooSendDTMFDigit(const char *callToken, const char* dtmf) { OOStackCommand cmd; + OOH323CallData *call; if(!callToken) { return OO_STKCMD_INVALIDPARAM; } - if(gCmdChan == 0) + if(!(call = ooFindCallByToken(callToken))) { + return OO_STKCMD_INVALIDPARAM; + } + + if(call->CmdChan == 0) { - if(ooCreateCmdConnection() != OO_OK) + if(ooCreateCallCmdConnection(call) != OO_OK) return OO_STKCMD_CONNECTIONERR; } @@ -300,14 +478,18 @@ return OO_STKCMD_MEMERR; } strcpy((char*)cmd.param1, callToken); + cmd.plen1 = strlen(callToken); strcpy((char*)cmd.param2, dtmf); + cmd.plen2 = strlen(dtmf); - if(ooWriteStackCommand(&cmd) != OO_OK) + if(ooWriteCallStackCommand(call,&cmd) != OO_OK) { free(cmd.param1); free(cmd.param2); return OO_STKCMD_WRITEERR; } + free(cmd.param1); + free(cmd.param2); return OO_STKCMD_SUCCESS; } --- channels/ooh323c/src/ooUtils.c 2008-02-07 23:59:47.000000000 +0300 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/ooUtils.c 2009-05-31 00:14:40.000000000 +0400 @@ -14,6 +14,8 @@ * *****************************************************************************/ +#include +#include #include "ooUtils.h" const char* ooUtilsGetText (OOUINT32 idx, const char** table, size_t tabsiz) --- channels/ooh323c/src/ooh323.c 2008-05-28 18:45:23.000000000 +0400 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/ooh323.c 2009-05-31 00:22:42.000000000 +0400 @@ -14,6 +14,9 @@ * *****************************************************************************/ +#include +#include + #include "ootypes.h" #include "ooq931.h" #include "ootrace.h" @@ -93,6 +96,7 @@ if(call->callEndReason == OO_REASON_UNKNOWN) call->callEndReason = ooGetCallClearReasonFromCauseAndReasonCode(cause, reasonCode); + call->q931cause = cause; #if 0 if (q931Msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent && q931Msg->userInfo->h323_uu_pdu.h245Tunneling && @@ -1065,12 +1069,14 @@ /* H225 message callback */ if(gH323ep.h225Callbacks.onReceivedSetup) - gH323ep.h225Callbacks.onReceivedSetup(call, q931Msg); + ret = gH323ep.h225Callbacks.onReceivedSetup(call, q931Msg); /* Free up the mem used by the received message, as it's processing is done. */ - ooFreeQ931Message(q931Msg); + if (ret == OO_OK) { + + ooFreeQ931Message(call->msgctxt, q931Msg); ooSendCallProceeding(call);/* Send call proceeding message*/ @@ -1096,6 +1102,7 @@ else { ret = ooH323CallAdmitted (call); } + } break; @@ -1104,7 +1111,7 @@ call->callType, call->callToken); ooOnReceivedCallProceeding(call, q931Msg); - ooFreeQ931Message(q931Msg); + ooFreeQ931Message(call->msgctxt, q931Msg); break; @@ -1116,7 +1123,7 @@ if(gH323ep.h323Callbacks.onAlerting && call->callStatemsgctxt, q931Msg); break; @@ -1151,12 +1158,12 @@ if(gH323ep.h323Callbacks.onCallEstablished) gH323ep.h323Callbacks.onCallEstablished(call); } - ooFreeQ931Message(q931Msg); + ooFreeQ931Message(call->msgctxt, q931Msg); break; case Q931InformationMsg: OOTRACEINFO3("H.225 Information msg received (%s, %s)\n", call->callType, call->callToken); - ooFreeQ931Message(q931Msg); + ooFreeQ931Message(call->msgctxt, q931Msg); break; @@ -1166,44 +1173,44 @@ ooOnReceivedReleaseComplete(call, q931Msg); - ooFreeQ931Message(q931Msg); + ooFreeQ931Message(call->msgctxt, q931Msg); break; case Q931FacilityMsg: OOTRACEINFO3("H.225 Facility message Received (%s, %s)\n", call->callType, call->callToken); ooOnReceivedFacility(call, q931Msg); - ooFreeQ931Message(q931Msg); + ooFreeQ931Message(call->msgctxt, q931Msg); break; case Q931ProgressMsg: OOTRACEINFO3("H.225 Progress message received (%s, %s)\n", call->callType, call->callToken); - ooFreeQ931Message(q931Msg); + ooFreeQ931Message(call->msgctxt, q931Msg); break; case Q931StatusMsg: OOTRACEINFO3("H.225 Status message received (%s, %s)\n", call->callType, call->callToken); - ooFreeQ931Message(q931Msg); + ooFreeQ931Message(call->msgctxt, q931Msg); break; case Q931StatusEnquiryMsg: OOTRACEINFO3("H.225 Status Inquiry message Received (%s, %s)\n", call->callType, call->callToken); - ooFreeQ931Message(q931Msg); + ooFreeQ931Message(call->msgctxt, q931Msg); break; case Q931SetupAckMsg: OOTRACEINFO3("H.225 Setup Ack message received (%s, %s)\n", call->callType, call->callToken); - ooFreeQ931Message(q931Msg); + ooFreeQ931Message(call->msgctxt, q931Msg); break; case Q931NotifyMsg: OOTRACEINFO3("H.225 Notify message Received (%s, %s)\n", call->callType, call->callToken); - ooFreeQ931Message(q931Msg); + ooFreeQ931Message(call->msgctxt, q931Msg); break; default: OOTRACEWARN3("Invalid H.225 message type received (%s, %s)\n", call->callType, call->callToken); - ooFreeQ931Message(q931Msg); + ooFreeQ931Message(call->msgctxt, q931Msg); } return ret; } @@ -1396,7 +1403,8 @@ (OOH323CallData *call, H225H323_UU_PDU * pH323UUPdu) { H245Message *pmsg; - OOCTXT *pctxt = &gH323ep.msgctxt; + /* OOCTXT *pctxt = &gH323ep.msgctxt; */ + OOCTXT *pctxt = call->msgctxt; int ret=0,i=0; OOTRACEDBGC3("Checking for tunneled H.245 messages (%s, %s)\n", --- channels/ooh323c/src/ooports.c 2008-02-07 23:59:47.000000000 +0300 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/ooports.c 2009-05-31 00:21:10.000000000 +0400 @@ -14,6 +14,8 @@ * *****************************************************************************/ +#include +#include #include "ooports.h" #include "ooh323ep.h" @@ -21,6 +23,7 @@ /** Global endpoint structure */ extern OOH323EndPoint gH323ep; +extern ast_mutex_t bindPortLock; /* Get the next port of type TCP/UDP/RTP */ int ooGetNextPort (OOH323PortType type) @@ -63,6 +66,8 @@ int initialPort, bindPort, ret; OOIPADDR ipAddrs; + ast_mutex_lock(&bindPortLock); + initialPort = ooGetNextPort (type); bindPort = initialPort; @@ -72,12 +77,13 @@ { if((ret=ooSocketBind(socket, ipAddrs, bindPort))==0) { + ast_mutex_unlock(&bindPortLock); return bindPort; } else { bindPort = ooGetNextPort (type); - if (bindPort == initialPort) return OO_FAILED; + if (bindPort == initialPort) { ast_mutex_unlock(&bindPortLock); return OO_FAILED; } } } } --- channels/ooh323c/src/ooh245.h 2008-02-07 23:59:47.000000000 +0300 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/ooh245.h 2009-05-30 06:40:48.000000000 +0400 @@ -69,7 +69,7 @@ * @return Completion status of operation: 0 (OO_OK) = success, * negative return value is error. */ -EXTERN int ooCreateH245Message(H245Message **msg, int type); +EXTERN int ooCreateH245Message(OOH323CallData* call, H245Message **msg, int type); /** * Frees up the memory used by the H245 message. --- channels/ooh323c/src/ooCalls.h 2008-02-07 23:59:47.000000000 +0300 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/ooCalls.h 2009-05-30 06:40:48.000000000 +0400 @@ -67,7 +67,8 @@ OO_CALL_CLEAR, /*!< Call marked for clearing */ OO_CALL_CLEAR_RELEASERECVD, /*!< Release command received. */ OO_CALL_CLEAR_RELEASESENT, /*!< Release sent */ - OO_CALL_CLEARED /*!< Call cleared */ + OO_CALL_CLEARED, /*!< Call cleared */ + OO_CALL_REMOVED /* call removed */ } OOCallState; /** @@ -136,9 +137,17 @@ */ typedef struct OOH323CallData { OOCTXT *pctxt; + OOCTXT *msgctxt; + pthread_t callThread; + ast_mutex_t Lock; + OOBOOL Monitor; + OOSOCKET CmdChan; + OOSOCKET cmdSock; + void* CmdChanLock; char callToken[20]; /* ex: ooh323c_call_1 */ char callType[10]; /* incoming/outgoing */ OOCallMode callMode; + int transfercap; ASN1USINT callReference; char ourCallerId[256]; H225CallIdentifier callIdentifier;/* The call identifier for the active @@ -149,6 +158,7 @@ ASN1UINT flags; OOCallState callState; OOCallClearReason callEndReason; + int q931cause; unsigned h245ConnectionAttempts; OOH245SessionState h245SessionState; int dtmfmode; @@ -717,7 +727,7 @@ * * @return Pointer to the call if found, NULL otherwise. */ -EXTERN OOH323CallData* ooFindCallByToken(char *callToken); +EXTERN OOH323CallData* ooFindCallByToken(const char *callToken); /** * This function is used to end a call. Based on what stage of clearance the --- channels/ooh323c/src/oochannels.h 2008-02-07 23:59:47.000000000 +0300 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/oochannels.h 2009-05-30 06:40:48.000000000 +0400 @@ -130,6 +130,8 @@ * */ EXTERN int ooMonitorChannels(void); +EXTERN int ooMonitorCmdChannels(void); +EXTERN int ooMonitorCallChannels(OOH323CallData *); /** * This function is called to stop the monitor channels event loop. @@ -138,6 +140,7 @@ * @return OO_OK, on success. OO_FAILED, on failure */ EXTERN int ooStopMonitorCalls(void); +EXTERN int ooStopMonitorCallChannels(OOH323CallData *); /** * This function is used to receive an H.2250 message received on a calls --- channels/ooh323c/src/ooq931.c 2008-05-28 18:45:23.000000000 +0400 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/ooq931.c 2009-06-01 21:33:05.000000000 +0400 @@ -14,6 +14,9 @@ * *****************************************************************************/ +#include +#include + #include "ooq931.h" #include "ootrace.h" #include "ooasn1.h" @@ -33,6 +36,7 @@ /** Global endpoint structure */ extern OOH323EndPoint gH323ep; +extern ast_mutex_t newCallLock; static ASN1OBJID gProtocolID = { 6, { 0, 0, 8, 2250, 0, 4 } @@ -44,7 +48,8 @@ int offset, x; int rv = ASN_OK; char number[128]; - OOCTXT *pctxt = &gH323ep.msgctxt; + /* OOCTXT *pctxt = &gH323ep.msgctxt; */ + OOCTXT *pctxt = call->msgctxt; dListInit (&msg->ies); /* clear information elements list */ @@ -229,7 +234,7 @@ we just ignore notify message as of now as handling is optional for end point*/ if(msg->messageType != Q931NotifyMsg) - rv = ooDecodeUUIE(msg); + rv = ooDecodeUUIE(pctxt, msg); return rv; } @@ -364,9 +369,9 @@ } } -int ooCreateQ931Message(Q931Message **q931msg, int msgType) +int ooCreateQ931Message(OOCTXT* pctxt, Q931Message **q931msg, int msgType) { - OOCTXT *pctxt = &gH323ep.msgctxt; + /* OOCTXT *pctxt = &gH323ep.msgctxt; */ *q931msg = (Q931Message*)memAllocZ(pctxt, sizeof(Q931Message)); @@ -397,10 +402,12 @@ char aCallToken[200]; int ret = 0; + ast_mutex_lock(&newCallLock); sprintf (aCallToken, "ooh323c_%d", counter++); if (counter > OO_MAX_CALL_TOKEN) counter = 1; + ast_mutex_unlock(&newCallLock); if ((strlen(aCallToken)+1) < size) strcpy (callToken, aCallToken); @@ -479,23 +486,24 @@ } -int ooFreeQ931Message(Q931Message *q931Msg) +int ooFreeQ931Message(OOCTXT* pctxt, Q931Message *q931Msg) { if(!q931Msg) { - memReset(&gH323ep.msgctxt); + /* memReset(&gH323ep.msgctxt); */ + memReset(pctxt); } return OO_OK; } -int ooEncodeUUIE(Q931Message *q931msg) +int ooEncodeUUIE(OOCTXT* pctxt, Q931Message *q931msg) { ASN1OCTET msgbuf[1024]; ASN1OCTET * msgptr=NULL; int len; ASN1BOOL aligned = TRUE; Q931InformationElement* ie=NULL; - OOCTXT *pctxt = &gH323ep.msgctxt; + /* OOCTXT *pctxt = &gH323ep.msgctxt; */ /* memset(msgbuf, 0, sizeof(msgbuf));*/ if(!q931msg) { @@ -547,14 +555,14 @@ return OO_OK; } -int ooDecodeUUIE(Q931Message *q931Msg) +int ooDecodeUUIE(OOCTXT* pctxt, Q931Message *q931Msg) { DListNode* curNode; unsigned int i; ASN1BOOL aligned=TRUE; int stat; Q931InformationElement *ie; - OOCTXT *pctxt = &gH323ep.msgctxt; + /* OOCTXT *pctxt = &gH323ep.msgctxt; */ if(q931Msg ==NULL) { OOTRACEERR1("Error: ooDecodeUUIE failed - NULL q931 message\n"); @@ -566,7 +574,7 @@ i++, curNode = curNode->next) { ie = (Q931InformationElement*) curNode->data; - if(ie->discriminator == Q931UserUserIE) + if(ie && ie->discriminator == Q931UserUserIE) break; } if(i == q931Msg->ies.count) @@ -602,7 +610,8 @@ (OOH323CallData* call, ASN1OCTET *msgbuf, ASN1UINT msglen) { - OOCTXT *pctxt = &gH323ep.msgctxt; + /* OOCTXT *pctxt = &gH323ep.msgctxt; */ + OOCTXT *pctxt = call->msgctxt; Q931Message q931Msg; int ret; @@ -650,7 +659,8 @@ else if(pq931Msg->messageType == Q931CallProceedingMsg){ msgbuf[i++] = OOCallProceeding; } - else if(pq931Msg->messageType == Q931AlertingMsg){ + else if(pq931Msg->messageType == Q931AlertingMsg || + pq931Msg->messageType == Q931ProgressMsg){ msgbuf[i++] = OOAlert; } else if(pq931Msg->messageType == Q931ReleaseCompleteMsg){ @@ -671,7 +681,7 @@ return OO_FAILED; } - stat = ooEncodeUUIE(pq931Msg); + stat = ooEncodeUUIE(call->msgctxt, pq931Msg); if(stat != OO_OK) { OOTRACEERR3("Error:Failed to encode uuie. (%s, %s)\n", call->callType, @@ -829,7 +839,8 @@ int ooSetFastStartResponse(OOH323CallData *pCall, Q931Message *pQ931msg, ASN1UINT *fsCount, ASN1DynOctStr **fsElem) { - OOCTXT *pctxt = &gH323ep.msgctxt; + /* OOCTXT *pctxt = &gH323ep.msgctxt; */ + OOCTXT *pctxt = pCall->msgctxt; int ret = 0, i=0, j=0, remoteMediaPort=0, remoteMediaControlPort = 0, dir=0; char remoteMediaIP[20], remoteMediaControlIP[20]; DListNode *pNode = NULL; @@ -1115,7 +1126,7 @@ { OOTRACEERR3("ERROR:Encoding of olc failed for faststart " "(%s, %s)\n", pCall->callType, pCall->callToken); - ooFreeQ931Message(pQ931msg); + ooFreeQ931Message(pctxt, pQ931msg); if(pCall->callState < OO_CALL_CLEAR) { pCall->callEndReason = OO_REASON_LOCAL_CLEARED; @@ -1136,7 +1147,7 @@ { OOTRACEERR3("Error: Failed decoding FastStart Element (%s, %s)\n", pCall->callType, pCall->callToken); - ooFreeQ931Message(pQ931msg); + ooFreeQ931Message(pctxt, pQ931msg); if(pCall->callState < OO_CALL_CLEAR) { pCall->callEndReason = OO_REASON_LOCAL_CLEARED; @@ -1201,11 +1212,12 @@ H225VendorIdentifier *vendor; H225CallProceeding_UUIE *callProceeding; Q931Message *q931msg=NULL; - OOCTXT *pctxt = &gH323ep.msgctxt; + /* OOCTXT *pctxt = &gH323ep.msgctxt; */ + OOCTXT *pctxt = call->msgctxt; OOTRACEDBGC3("Building CallProceeding (%s, %s)\n", call->callType, call->callToken); - ret = ooCreateQ931Message(&q931msg, Q931CallProceedingMsg); + ret = ooCreateQ931Message(pctxt, &q931msg, Q931CallProceedingMsg); if(ret != OO_OK) { OOTRACEERR1("Error: In allocating memory for - H225 Call " @@ -1288,7 +1300,8 @@ OOTRACEERR3("Error:Failed to enqueue CallProceeding message to outbound queue.(%s, %s)\n", call->callType, call->callToken); } - memReset(&gH323ep.msgctxt); + /* memReset(&gH323ep.msgctxt); */ + memReset(call->msgctxt); return ret; } @@ -1299,9 +1312,10 @@ H225Alerting_UUIE *alerting; H225VendorIdentifier *vendor; Q931Message *q931msg=NULL; - OOCTXT *pctxt = &gH323ep.msgctxt; + /* OOCTXT *pctxt = &gH323ep.msgctxt; */ + OOCTXT *pctxt = call->msgctxt; - ret = ooCreateQ931Message(&q931msg, Q931AlertingMsg); + ret = ooCreateQ931Message(pctxt, &q931msg, Q931AlertingMsg); if(ret != OO_OK) { OOTRACEERR1("Error: In allocating memory for - H225 " @@ -1416,7 +1430,115 @@ OOTRACEERR3("Error: Failed to enqueue Alerting message to outbound queue. (%s, %s)\n", call->callType, call->callToken); } - memReset(&gH323ep.msgctxt); + /* memReset(&gH323ep.msgctxt); */ + memReset(call->msgctxt); + + return ret; +} + +int ooSendProgress(OOH323CallData *call) +{ + int ret; + H225Progress_UUIE *progress; + H225VendorIdentifier *vendor; + Q931Message *q931msg=NULL; + /* OOCTXT *pctxt = &gH323ep.msgctxt; */ + OOCTXT *pctxt = call->msgctxt; + + ret = ooCreateQ931Message(pctxt, &q931msg, Q931ProgressMsg); + if(ret != OO_OK) + { + OOTRACEERR1("Error: In allocating memory for - H225 " + "Alerting message\n"); + return OO_FAILED; + } + + q931msg->callReference = call->callReference; + + q931msg->userInfo = (H225H323_UserInformation*)memAlloc(pctxt, + sizeof(H225H323_UserInformation)); + if(!q931msg->userInfo) + { + OOTRACEERR1("ERROR:Memory - ooSendAlerting - userInfo\n"); + return OO_FAILED; + } + memset (q931msg->userInfo, 0, sizeof(H225H323_UserInformation)); + q931msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent=1; + q931msg->userInfo->h323_uu_pdu.h245Tunneling = OO_TESTFLAG(gH323ep.flags, + OO_M_TUNNELING); + q931msg->userInfo->h323_uu_pdu.h323_message_body.t = + T_H225H323_UU_PDU_h323_message_body_progress; + + progress = (H225Progress_UUIE*)memAlloc(pctxt, + sizeof(H225Progress_UUIE)); + if(!progress) + { + OOTRACEERR1("ERROR:Memory - ooSendProgress- alerting\n"); + return OO_FAILED; + } + memset(progress, 0, sizeof(H225Progress_UUIE)); + q931msg->userInfo->h323_uu_pdu.h323_message_body.u.progress = progress; + progress->m.multipleCallsPresent = 1; + progress->m.maintainConnectionPresent = 1; + progress->multipleCalls = FALSE; + progress->maintainConnection = FALSE; + + progress->callIdentifier.guid.numocts = + call->callIdentifier.guid.numocts; + memcpy(progress->callIdentifier.guid.data, + call->callIdentifier.guid.data, + call->callIdentifier.guid.numocts); + progress->protocolIdentifier = gProtocolID; + + /* Pose as Terminal or Gateway */ + if(gH323ep.isGateway) + progress->destinationInfo.m.gatewayPresent = TRUE; + else + progress->destinationInfo.m.terminalPresent = TRUE; + + progress->destinationInfo.m.vendorPresent = 1; + vendor = &progress->destinationInfo.vendor; + if(gH323ep.productID) + { + vendor->m.productIdPresent = 1; + vendor->productId.numocts = ASN1MIN(strlen(gH323ep.productID), + sizeof(vendor->productId.data)); + strncpy(vendor->productId.data, gH323ep.productID, + vendor->productId.numocts); + } + if(gH323ep.versionID) + { + vendor->m.versionIdPresent = 1; + vendor->versionId.numocts = ASN1MIN(strlen(gH323ep.versionID), + sizeof(vendor->versionId.data)); + strncpy(vendor->versionId.data, gH323ep.versionID, + vendor->versionId.numocts); + } + + vendor->vendor.t35CountryCode = gH323ep.t35CountryCode; + vendor->vendor.t35Extension = gH323ep.t35Extension; + vendor->vendor.manufacturerCode = gH323ep.manufacturerCode; + + ret = ooSetFastStartResponse(call, q931msg, + &progress->fastStart.n, &progress->fastStart.elem); + if(ret != ASN_OK) { return ret; } + if(progress->fastStart.n > 0) { + progress->m.fastStartPresent = TRUE; + } + else { + progress->m.fastStartPresent = FALSE; + } + + OOTRACEDBGA3("Built Alerting (%s, %s)\n", call->callType, call->callToken); + + ret = ooSendH225Msg(call, q931msg); + if(ret != OO_OK) + { + OOTRACEERR3("Error: Failed to enqueue Alerting message to outbound queue. (%s, %s)\n", call->callType, call->callToken); + } + + /* memReset(&gH323ep.msgctxt); */ + memReset(call->msgctxt); return ret; } @@ -1427,11 +1549,12 @@ int ret=0; Q931Message *pQ931Msg = NULL; H225Facility_UUIE *facility=NULL; - OOCTXT *pctxt = &gH323ep.msgctxt; + /* OOCTXT *pctxt = &gH323ep.msgctxt; */ + OOCTXT *pctxt = call->msgctxt; OOTRACEDBGA3("Building Facility message (%s, %s)\n", call->callType, call->callToken); - ret = ooCreateQ931Message(&pQ931Msg, Q931FacilityMsg); + ret = ooCreateQ931Message(pctxt, &pQ931Msg, Q931FacilityMsg); if(ret != OO_OK) { OOTRACEERR3 @@ -1490,7 +1613,8 @@ ("Error:Failed to enqueue Facility message to outbound " "queue.(%s, %s)\n", call->callType, call->callToken); } - memReset (&gH323ep.msgctxt); + /* memReset (&gH323ep.msgctxt); */ + memReset (call->msgctxt); return ret; } @@ -1502,10 +1626,11 @@ enum Q931CauseValues cause = Q931ErrorInCauseIE; unsigned h225ReasonCode = T_H225ReleaseCompleteReason_undefinedReason; - OOCTXT *pctxt = &gH323ep.msgctxt; + /* OOCTXT *pctxt = &gH323ep.msgctxt; */ + OOCTXT *pctxt = call->msgctxt; OOTRACEDBGA3("Building Release Complete message to send(%s, %s)\n", call->callType, call->callToken); - ret = ooCreateQ931Message(&q931msg, Q931ReleaseCompleteMsg); + ret = ooCreateQ931Message(pctxt, &q931msg, Q931ReleaseCompleteMsg); if(ret != OO_OK) { OOTRACEERR3("Error: In ooCreateQ931Message - H225 Release Complete " @@ -1548,7 +1673,7 @@ ooQ931GetCauseAndReasonCodeFromCallClearReason(call->callEndReason, &cause, &h225ReasonCode); /* Set Cause IE */ - ooQ931SetCauseIE(q931msg, cause, 0, 0); + ooQ931SetCauseIE(pctxt, q931msg, call->q931cause, 0, 0); /* Set H225 releaseComplete reasonCode */ releaseComplete->m.reasonPresent = TRUE; @@ -1579,7 +1704,8 @@ OOTRACEERR3("Error:Failed to enqueue ReleaseComplete message to outbound" " queue.(%s, %s)\n", call->callType, call->callToken); } - memReset(&gH323ep.msgctxt); + /* memReset(&gH323ep.msgctxt); */ + memReset(call->msgctxt); return ret; } @@ -1598,9 +1724,10 @@ H225TransportAddress_ipAddress *h245IpAddr; H225VendorIdentifier *vendor; Q931Message *q931msg=NULL; - OOCTXT *pctxt = &gH323ep.msgctxt; + /* OOCTXT *pctxt = &gH323ep.msgctxt; */ + OOCTXT *pctxt = call->msgctxt; - ret = ooCreateQ931Message(&q931msg, Q931ConnectMsg); + ret = ooCreateQ931Message(pctxt, &q931msg, Q931ConnectMsg); if(ret != OO_OK) { OOTRACEERR1("Error: In allocating memory for - H225 " @@ -1610,11 +1737,11 @@ q931msg->callReference = call->callReference; /* Set bearer capability */ - if(OO_OK != ooSetBearerCapabilityIE(q931msg, Q931CCITTStd, - Q931TransferUnrestrictedDigital, Q931TransferPacketMode, - Q931TransferRatePacketMode, Q931UserInfoLayer1G722G725)) - // Q931TransferSpeech, Q931TransferCircuitMode, - // Q931TransferRate64Kbps, Q931UserInfoLayer1G711ULaw)) + if(OO_OK != ooSetBearerCapabilityIE(pctxt, q931msg, Q931CCITTStd, + // Q931TransferUnrestrictedDigital, Q931TransferPacketMode, + // Q931TransferRatePacketMode, Q931UserInfoLayer1G722G725)) + Q931TransferSpeech, Q931TransferCircuitMode, + Q931TransferRate64Kbps, Q931UserInfoLayer1G711ALaw)) { OOTRACEERR3("Error: Failed to set bearer capability ie. (%s, %s)\n", call->callType, call->callToken); @@ -1765,10 +1892,12 @@ if(ret != OO_OK) { OOTRACEERR3("Error:Failed to enqueue Connect message to outbound queue.(%s, %s)\n", call->callType, call->callToken); - memReset(&gH323ep.msgctxt); + /* memReset(&gH323ep.msgctxt);*/ + memReset(call->msgctxt); return OO_FAILED; } - memReset(&gH323ep.msgctxt); + /* memReset(&gH323ep.msgctxt); */ + memReset(call->msgctxt); #if 0 if (OO_TESTFLAG (call->flags, OO_M_TUNNELING)) @@ -1861,6 +1990,23 @@ } +int ooH323NewCall(char *callToken) { + OOH323CallData* call; + if(!callToken) + { + OOTRACEERR1("ERROR: Invalid callToken parameter to make call\n"); + return OO_FAILED; + } + call = ooCreateCall("outgoing", callToken); + if (!call) + { + OOTRACEERR1("ERROR: Can't create call %s\n"); + return OO_FAILED; + } + + return OO_OK; +} + int ooH323MakeCall(char *dest, char *callToken, ooCallOptions *opts) { OOCTXT *pctxt; @@ -1880,7 +2026,14 @@ return OO_FAILED; } - call = ooCreateCall("outgoing", callToken); + /* call = ooCreateCall("outgoing", callToken); */ + call = ooFindCallByToken(callToken); + if (!call) + { + OOTRACEERR1("ERROR: Can't create call %s\n"); + return OO_FAILED; + } + pctxt = call->pctxt; if(opts) { @@ -1900,10 +2053,11 @@ OO_CLRFLAG(call->flags, OO_M_DISABLEGK); call->callMode = opts->callMode; + call->transfercap = opts->transfercap; } - ret = ooParseDestination(call, dest, tmp, 30, &call->remoteAliases); + ret = ooParseDestination(call, dest, tmp, 24, &call->remoteAliases); if(ret != OO_OK) { OOTRACEERR2("Error: Failed to parse the destination string %s for " @@ -1941,7 +2095,13 @@ } else { /* Send as H225 message to calling endpoint */ - ret = ooH323CallAdmitted (call); + ast_mutex_lock(&call->Lock); + if (call->callState < OO_CALL_CLEAR) + if ((ret = ooH323CallAdmitted (call)) != OO_OK) { + ast_mutex_unlock(&call->Lock); + return ret; + } + ast_mutex_unlock(&call->Lock); } return OO_OK; @@ -2012,9 +2172,10 @@ ASN1BOOL aligned = 1; ooAliases *pAlias = NULL; - pctxt = &gH323ep.msgctxt; + /* pctxt = &gH323ep.msgctxt; */ + pctxt = call->msgctxt; - ret = ooCreateQ931Message(&q931msg, Q931SetupMsg); + ret = ooCreateQ931Message(pctxt, &q931msg, Q931SetupMsg); if(ret != OO_OK) { OOTRACEERR1("ERROR:Failed to Create Q931 SETUP Message\n "); @@ -2024,10 +2185,11 @@ q931msg->callReference = call->callReference; /* Set bearer capability */ - if(OO_OK != ooSetBearerCapabilityIE(q931msg, Q931CCITTStd, - Q931TransferUnrestrictedDigital, Q931TransferPacketMode, - Q931TransferRatePacketMode, Q931UserInfoLayer1G722G725)) -// Q931TransferRate64Kbps, Q931UserInfoLayer1G711ULaw)) + if(OO_OK != ooSetBearerCapabilityIE(pctxt, q931msg, Q931CCITTStd, + // Q931TransferUnrestrictedDigital, Q931TransferPacketMode, + call->transfercap, Q931TransferCircuitMode, + // Q931TransferRatePacketMode, Q931UserInfoLayer1G722G725)) + Q931TransferRate64Kbps, Q931UserInfoLayer1G711ALaw)) { OOTRACEERR3("Error: Failed to set bearer capability ie.(%s, %s)\n", call->callType, call->callToken); @@ -2036,13 +2198,13 @@ /* Set calling party number Q931 IE */ if(call->callingPartyNumber) - ooQ931SetCallingPartyNumberIE(q931msg, + ooQ931SetCallingPartyNumberIE(pctxt, q931msg, (const char*)call->callingPartyNumber, 1, 0, 0, 0); /* Set called party number Q931 IE */ if(call->calledPartyNumber) - ooQ931SetCalledPartyNumberIE(q931msg, + ooQ931SetCalledPartyNumberIE(pctxt, q931msg, (const char*)call->calledPartyNumber, 1, 0); else if(call->remoteAliases) { pAlias = call->remoteAliases; @@ -2063,7 +2225,7 @@ return OO_FAILED; } strcpy(call->calledPartyNumber, pAlias->value); - ooQ931SetCalledPartyNumberIE(q931msg, + ooQ931SetCalledPartyNumberIE(pctxt, q931msg, (const char*)call->calledPartyNumber, 1, 0); } @@ -2270,7 +2432,7 @@ { OOTRACEERR3("ERROR:Memory - ooH323MakeCall_helper - olc(%s, %s)" "\n", call->callType, call->callToken); - ooFreeQ931Message(q931msg); + ooFreeQ931Message(pctxt, q931msg); if(call->callState < OO_CALL_CLEAR) { call->callEndReason = OO_REASON_LOCAL_CLEARED; @@ -2290,7 +2452,7 @@ { OOTRACEERR3("ERROR:Encoding of olc failed for faststart(%s, %s)" "\n", call->callType, call->callToken); - ooFreeQ931Message(q931msg); + ooFreeQ931Message(pctxt, q931msg); if(call->callState < OO_CALL_CLEAR) { call->callEndReason = OO_REASON_LOCAL_CLEARED; @@ -2311,7 +2473,7 @@ { OOTRACEERR3("Error: Failed decoding FastStart Element." "(%s, %s)\n", call->callType, call->callToken); - ooFreeQ931Message(q931msg); + ooFreeQ931Message(pctxt, q931msg); if(call->callState < OO_CALL_CLEAR) { call->callEndReason = OO_REASON_LOCAL_CLEARED; @@ -2338,7 +2500,7 @@ { OOTRACEERR3("ERROR:Memory - ooH323MakeCall_helper - olc(%s, %s)" "\n", call->callType, call->callToken); - ooFreeQ931Message(q931msg); + ooFreeQ931Message(pctxt, q931msg); if(call->callState < OO_CALL_CLEAR) { call->callEndReason = OO_REASON_LOCAL_CLEARED; @@ -2358,7 +2520,7 @@ { OOTRACEERR3("ERROR:Encoding of olc failed for faststart(%s, %s)" "\n", call->callType, call->callToken); - ooFreeQ931Message(q931msg); + ooFreeQ931Message(pctxt, q931msg); if(call->callState < OO_CALL_CLEAR) { call->callEndReason = OO_REASON_LOCAL_CLEARED; @@ -2378,7 +2540,7 @@ { OOTRACEERR3("Error: Failed decoding FastStart Element." "(%s, %s)\n", call->callType, call->callToken); - ooFreeQ931Message(q931msg); + ooFreeQ931Message(pctxt, q931msg); if(call->callState < OO_CALL_CLEAR) { call->callEndReason = OO_REASON_LOCAL_CLEARED; @@ -2457,7 +2619,8 @@ { OOTRACEERR3("Error:Failed to enqueue SETUP message to outbound queue. (%s, %s)\n", call->callType, call->callToken); } - memReset(&gH323ep.msgctxt); + /* memReset(&gH323ep.msgctxt);*/ + memReset(call->msgctxt); return ret; } @@ -2469,9 +2632,10 @@ int ret; H225Information_UUIE *information=NULL; Q931Message *q931msg=NULL; - OOCTXT *pctxt = &gH323ep.msgctxt; + /* OOCTXT *pctxt = &gH323ep.msgctxt; */ + OOCTXT *pctxt = call->msgctxt; - ret = ooCreateQ931Message(&q931msg, Q931InformationMsg); + ret = ooCreateQ931Message(pctxt, &q931msg, Q931InformationMsg); if(ret != OO_OK) { OOTRACEERR3("Error: In allocating memory for - H225 Information message." @@ -2487,7 +2651,8 @@ { OOTRACEERR3("ERROR:Memory - ooQ931SendDTMFAsKeypadIE - userInfo" "(%s, %s)\n", call->callType, call->callToken); - memReset(&gH323ep.msgctxt); + /* memReset(&gH323ep.msgctxt); */ + memReset(call->msgctxt); return OO_FAILED; } q931msg->userInfo->h323_uu_pdu.m.h245TunnelingPresent=1; @@ -2502,7 +2667,8 @@ { OOTRACEERR3("ERROR:Memory - ooQ931SendDTMFAsKeypadIE - information" "(%s, %s)\n", call->callType, call->callToken); - memReset(&gH323ep.msgctxt); + /* memReset(&gH323ep.msgctxt); */ + memReset(call->msgctxt); return OO_FAILED; } q931msg->userInfo->h323_uu_pdu.h323_message_body.u.information = @@ -2516,12 +2682,13 @@ information->protocolIdentifier = gProtocolID; /*Add keypad IE*/ - ret = ooQ931SetKeypadIE(q931msg, data); + ret = ooQ931SetKeypadIE(pctxt, q931msg, data); if(ret != OO_OK) { OOTRACEERR3("Error:Creating keypad IE for (%s, %s)\n", call->callType, call->callToken); - memReset(&gH323ep.msgctxt); + /* memReset(&gH323ep.msgctxt); */ + memReset(call->msgctxt); return OO_FAILED; } @@ -2531,7 +2698,8 @@ OOTRACEERR3("Error:Failed to enqueue Information message to outbound " "queue. (%s, %s)\n", call->callType, call->callToken); } - memReset(&gH323ep.msgctxt); + /* memReset(&gH323ep.msgctxt); */ + memReset(call->msgctxt); return ret; @@ -2586,7 +2754,7 @@ strcpy(call->pCallFwdData->ip, ip); } - ret = ooCreateQ931Message(&pQ931Msg, Q931FacilityMsg); + ret = ooCreateQ931Message(pctxt, &pQ931Msg, Q931FacilityMsg); if(ret != OO_OK) { OOTRACEERR3 @@ -2683,7 +2851,7 @@ return ret; } -int ooH323HangCall(char * callToken, OOCallClearReason reason) +int ooH323HangCall(char * callToken, OOCallClearReason reason, int q931cause) { OOH323CallData *call; @@ -2698,19 +2866,20 @@ if(call->callState < OO_CALL_CLEAR) { call->callEndReason = reason; + call->q931cause = q931cause; call->callState = OO_CALL_CLEAR; } return OO_OK; } int ooSetBearerCapabilityIE - (Q931Message *pmsg, enum Q931CodingStandard codingStandard, + (OOCTXT* pctxt, Q931Message *pmsg, enum Q931CodingStandard codingStandard, enum Q931InformationTransferCapability capability, enum Q931TransferMode transferMode, enum Q931TransferRate transferRate, enum Q931UserInfoLayer1Protocol userInfoLayer1) { unsigned size = 3; - OOCTXT *pctxt = &gH323ep.msgctxt; + /* OOCTXT *pctxt = &gH323ep.msgctxt; */ if(pmsg->bearerCapabilityIE) { @@ -2738,10 +2907,10 @@ return OO_OK; } -int ooQ931SetKeypadIE(Q931Message *pmsg, const char* data) +int ooQ931SetKeypadIE(OOCTXT* pctxt, Q931Message *pmsg, const char* data) { unsigned len = 0; - OOCTXT *pctxt = &gH323ep.msgctxt; + /* OOCTXT *pctxt = &gH323ep.msgctxt; */ len = strlen(data); pmsg->keypadIE = (Q931InformationElement*) @@ -2762,11 +2931,11 @@ int ooQ931SetCallingPartyNumberIE - (Q931Message *pmsg, const char *number, unsigned plan, unsigned type, + (OOCTXT* pctxt, Q931Message *pmsg, const char *number, unsigned plan, unsigned type, unsigned presentation, unsigned screening) { unsigned len = 0; - OOCTXT *pctxt = &gH323ep.msgctxt; + /* OOCTXT *pctxt = &gH323ep.msgctxt; */ if(pmsg->callingPartyNumberIE) { @@ -2793,10 +2962,10 @@ } int ooQ931SetCalledPartyNumberIE - (Q931Message *pmsg, const char *number, unsigned plan, unsigned type) + (OOCTXT* pctxt, Q931Message *pmsg, const char *number, unsigned plan, unsigned type) { unsigned len = 0; - OOCTXT *pctxt = &gH323ep.msgctxt; + /* OOCTXT *pctxt = &gH323ep.msgctxt; */ if(pmsg->calledPartyNumberIE) { @@ -2822,10 +2991,10 @@ } int ooQ931SetCauseIE - (Q931Message *pmsg, enum Q931CauseValues cause, unsigned coding, + (OOCTXT* pctxt, Q931Message *pmsg, enum Q931CauseValues cause, unsigned coding, unsigned location) { - OOCTXT *pctxt = &gH323ep.msgctxt; + /* OOCTXT *pctxt = &gH323ep.msgctxt; */ if(pmsg->causeIE){ memFreePtr(pctxt, pmsg->causeIE); @@ -2859,12 +3028,13 @@ ASN1DynOctStr * elem; int ret =0; H225Facility_UUIE *facility=NULL; - OOCTXT *pctxt = &gH323ep.msgctxt; + /* OOCTXT *pctxt = &gH323ep.msgctxt; */ + OOCTXT *pctxt = call->msgctxt; OOTRACEDBGA4("Building Facility message for tunneling %s (%s, %s)\n", ooGetMsgTypeText(h245MsgType), call->callType, call->callToken); - ret = ooCreateQ931Message(&pQ931Msg, Q931FacilityMsg); + ret = ooCreateQ931Message(pctxt, &pQ931Msg, Q931FacilityMsg); if(ret != OO_OK) { OOTRACEERR3("ERROR: In allocating memory for facility message " @@ -2880,7 +3050,8 @@ { OOTRACEERR3("ERROR:Memory - ooSendAsTunneledMessage - userInfo" " (%s, %s)\n", call->callType, call->callToken); - memReset(&gH323ep.msgctxt); + /* memReset(&gH323ep.msgctxt);*/ + memReset(call->msgctxt); return OO_FAILED; } memset (pQ931Msg->userInfo, 0, sizeof(H225H323_UserInformation)); @@ -2899,7 +3070,8 @@ { OOTRACEERR3("ERROR:Memory - ooSendAsTunneledMessage - facility (%s, %s)" "\n", call->callType, call->callToken); - memReset(&gH323ep.msgctxt); + /* memReset(&gH323ep.msgctxt); */ + memReset(call->msgctxt); return OO_FAILED; } @@ -2951,7 +3123,8 @@ main received H225 message processing is finished. Rule. No reset when tunneling */ - memFreePtr(&gH323ep.msgctxt, pQ931Msg); + /* memFreePtr(&gH323ep.msgctxt, pQ931Msg); */ + memFreePtr(call->msgctxt, pQ931Msg); return ret; } --- channels/ooh323c/src/decode.c 2008-02-07 23:59:47.000000000 +0300 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/decode.c 2009-05-31 00:15:23.000000000 +0400 @@ -14,6 +14,9 @@ * *****************************************************************************/ +#include +#include + #include "ooasn1.h" static int decode16BitConstrainedString --- channels/ooh323c/src/ooSocket.c 2008-07-30 07:07:14.000000000 +0400 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/ooSocket.c 2009-05-31 00:21:38.000000000 +0400 @@ -13,6 +13,8 @@ * maintain this copyright notice. * *****************************************************************************/ +#include +#include #include "ooSocket.h" #include "ootrace.h" @@ -303,7 +305,7 @@ if(ret != 0) return ASN_E_INVSOCKET; - host = inet_ntoa(addr.sin_addr); + host = ast_inet_ntoa(addr.sin_addr); if(host && strlen(host) < (unsigned)len) strcpy(ip, host); @@ -338,7 +340,7 @@ if (pNewSocket == 0) return ASN_E_INVPARAM; *pNewSocket = accept (socket, (struct sockaddr *) (void*) &m_addr, - (socklen_t *) &addr_length); + &addr_length); if (*pNewSocket <= 0) return ASN_E_INVSOCKET; if (destAddr != 0) @@ -444,7 +446,7 @@ *remoteport = ntohs(m_addr.sin_port); if(remotehost) { - host = inet_ntoa(m_addr.sin_addr); + host = ast_inet_ntoa(m_addr.sin_addr); if(strlen(host) < (hostBufLen-1)) strcpy(remotehost, host); else @@ -469,21 +471,28 @@ int ooGetLocalIPAddress(char * pIPAddrs) { int ret; - struct hostent *phost; + struct hostent phost; + struct hostent* reshost; + int h_errnop; struct in_addr addr; char hostname[100]; + char buf[2048]; if(pIPAddrs == NULL) return -1; /* Need to find suitable return value */ ret = gethostname(hostname, 100); if(ret == 0) { - phost = gethostbyname(hostname); - if(phost == NULL) + if (!gethostbyname_r(hostname, + &phost, buf, sizeof(buf), + &reshost, &h_errnop)) { + if(reshost == NULL) return -1; /* Need to define a return value if made part of rtsrc */ - memcpy(&addr, phost->h_addr_list[0], sizeof(struct in_addr)); - strcpy(pIPAddrs, inet_ntoa(addr)); - + memcpy(&addr, &phost.h_addr_list[0], sizeof(struct in_addr)); + strcpy(pIPAddrs, ast_inet_ntoa(addr)); + } else { + return -1; + } } else{ return -1; @@ -608,10 +617,7 @@ int flags; for (ifName = ifc.ifc_req; (void*)ifName < ifEndList; ifName++) { char *pName=NULL; - char addr[50]; -#ifdef ifr_netmask - char mask[50]; -#endif + char addr[50], mask[50]; pIf = (struct OOInterface*)memAlloc(pctxt, sizeof(struct OOInterface)); pName = (char*)memAlloc(pctxt, strlen(ifName->ifr_name)+1); @@ -653,7 +659,7 @@ memFreePtr(pctxt, pIf); continue; } - strcpy(addr, inet_ntoa(((struct sockaddr_in*)&ifReq.ifr_addr)->sin_addr)); + strcpy(addr, ast_inet_ntoa(((struct sockaddr_in*)&ifReq.ifr_addr)->sin_addr)); OOTRACEDBGA2("\tIP address is %s\n", addr); pIf->addr = (char*)memAlloc(pctxt, strlen(addr)+1); if(!pIf->addr) @@ -676,7 +682,7 @@ memFreePtr(pctxt, pIf); continue; } - strcpy(mask, inet_ntoa(((struct sockaddr_in *)&ifReq.ifr_netmask)->sin_addr)); + strcpy(mask, ast_inet_ntoa(((struct sockaddr_in *)&ifReq.ifr_netmask)->sin_addr)); OOTRACEDBGA2("\tMask is %s\n", mask); pIf->mask = (char*)memAlloc(pctxt, strlen(mask)+1); if(!pIf->mask) --- channels/ooh323c/src/ootypes.h 2008-05-28 18:45:23.000000000 +0400 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/ootypes.h 2009-05-30 06:40:48.000000000 +0400 @@ -61,7 +61,7 @@ -#define OOH323C_VERSION "v0.8.3" +#define OOH323C_VERSION "v0.8.3m" #ifndef EXTERN #ifdef MAKE_DLL @@ -238,6 +238,7 @@ OOBOOL tunneling; /*!< Use H.245 tunneling */ OOBOOL disableGk; /*!< Disable use of gatekeeper */ OOCallMode callMode; /*!< Type of channel to setup with FastStart */ + int transfercap; /* q931 cap */ }ooCallOptions; --- channels/ooh323c/src/dlist.c 2008-02-07 23:59:47.000000000 +0300 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/dlist.c 2009-05-31 00:15:34.000000000 +0400 @@ -14,6 +14,9 @@ * *****************************************************************************/ +#include +#include + #include "ooasn1.h" void dListInit (DList* pList) --- channels/ooh323c/src/ooCmdChannel.c 2008-12-22 20:01:00.000000000 +0300 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/ooCmdChannel.c 2009-06-03 23:05:09.000000000 +0400 @@ -14,6 +14,8 @@ * *****************************************************************************/ +#include +#include #include "ooStackCmds.h" #include "ootrace.h" #include "ooq931.h" @@ -23,11 +25,12 @@ #include "ooCalls.h" #include "ooCmdChannel.h" + /** Global endpoint structure */ extern OOH323EndPoint gH323ep; OOSOCKET gCmdChan = 0; -pthread_mutex_t gCmdChanLock; +ast_mutex_t gCmdChanLock; int ooCreateCmdConnection() { @@ -37,7 +40,7 @@ if ((ret = pipe(thePipe)) == -1) { return OO_FAILED; } - pthread_mutex_init(&gCmdChanLock, NULL); + ast_mutex_init(&gCmdChanLock); gH323ep.cmdSock = dup(thePipe[0]); close(thePipe[0]); @@ -46,6 +49,29 @@ return OO_OK; } +int ooCreateCallCmdConnection(OOH323CallData* call) +{ + int ret = 0; + int thePipe[2]; + + OOTRACEINFO2("INFO: create cmd connect for call: %lx\n", call); + + call->CmdChanLock = malloc(sizeof(ast_mutex_t)); + ast_mutex_init((ast_mutex_t *)call->CmdChanLock); + + + if ((ret = pipe(thePipe)) == -1) { + return OO_FAILED; + } + ast_mutex_lock((ast_mutex_t *)call->CmdChanLock); + call->cmdSock = dup(thePipe[0]); + close(thePipe[0]); + call->CmdChan = dup(thePipe[1]); + close(thePipe[1]); + ast_mutex_unlock((ast_mutex_t *)call->CmdChanLock); + return OO_OK; +} + int ooCloseCmdConnection() { @@ -53,7 +79,21 @@ gH323ep.cmdSock = 0; close(gCmdChan); gCmdChan = 0; - pthread_mutex_destroy(&gCmdChanLock); + ast_mutex_destroy(&gCmdChanLock); + + return OO_OK; +} +int ooCloseCallCmdConnection(OOH323CallData* call) +{ + ast_mutex_lock(call->CmdChanLock); + close(call->cmdSock); + call->cmdSock = 0; + close(call->CmdChan); + call->CmdChan = 0; + ast_mutex_unlock(call->CmdChanLock); + ast_mutex_destroy((ast_mutex_t *)call->CmdChanLock); + free(call->CmdChanLock); + call->CmdChanLock = NULL; return OO_OK; } @@ -61,12 +101,47 @@ int ooWriteStackCommand(OOStackCommand *cmd) { - pthread_mutex_lock(&gCmdChanLock); + ast_mutex_lock(&gCmdChanLock); if (write(gCmdChan, (char*)cmd, sizeof(OOStackCommand)) == -1) { - pthread_mutex_unlock(&gCmdChanLock); + ast_mutex_unlock(&gCmdChanLock); + return OO_FAILED; + } + ast_mutex_unlock(&gCmdChanLock); + + return OO_OK; +} +int ooWriteCallStackCommand(OOH323CallData* call, OOStackCommand *cmd) +{ + unsigned char buffer[MAXMSGLEN]; + unsigned char* bPoint; + + memcpy(buffer, cmd, sizeof(OOStackCommand)); + bPoint = buffer + sizeof(OOStackCommand); + if (cmd->param1 && cmd->plen1 > 0) { + if (bPoint + cmd->plen1 >= buffer + MAXMSGLEN) + return OO_FAILED; + memcpy(bPoint, cmd->param1, cmd->plen1); + bPoint += cmd->plen1; + } + if (cmd->param2 && cmd->plen2 > 0) { + if (bPoint + cmd->plen2 >= buffer + MAXMSGLEN) + return OO_FAILED; + memcpy(bPoint, cmd->param2, cmd->plen2); + bPoint += cmd->plen2; + } + if (cmd->param3 && cmd->plen3 > 0) { + if (bPoint + cmd->plen3 >= buffer + MAXMSGLEN) + return OO_FAILED; + memcpy(bPoint, cmd->param3, cmd->plen3); + bPoint += cmd->plen3; + } + + ast_mutex_lock((ast_mutex_t *)call->CmdChanLock); + if (write(call->CmdChan, buffer, bPoint - buffer) == -1) { + ast_mutex_unlock((ast_mutex_t *)call->CmdChanLock); return OO_FAILED; } - pthread_mutex_unlock(&gCmdChanLock); + ast_mutex_unlock((ast_mutex_t *)call->CmdChanLock); return OO_OK; } @@ -79,7 +154,9 @@ int i, recvLen = 0; OOStackCommand cmd; memset(&cmd, 0, sizeof(OOStackCommand)); + ast_mutex_lock(&gCmdChanLock); recvLen = read(gH323ep.cmdSock, buffer, MAXMSGLEN); + ast_mutex_unlock(&gCmdChanLock); if(recvLen <= 0) { OOTRACEERR1("Error:Failed to read CMD message\n"); @@ -104,8 +181,19 @@ OOTRACEINFO2("Processing MakeCall command %s\n", (char*)cmd.param2); - ooH323MakeCall ((char*)cmd.param1, (char*)cmd.param2, - (ooCallOptions*)cmd.param3); + ooH323NewCall ((char*)cmd.param2); + break; + + case OO_CMD_MANUALPROGRESS: + pCall = ooFindCallByToken((char*)cmd.param1); + if(!pCall) { + OOTRACEINFO2("Call \"%s\" does not exist\n", + (char*)cmd.param1); + OOTRACEINFO1("Call migth be cleared/closed\n"); + } + else { + ooSendProgress(ooFindCallByToken((char*)cmd.param1)); + } break; case OO_CMD_MANUALRINGBACK: @@ -147,10 +235,10 @@ break; case OO_CMD_HANGCALL: - OOTRACEINFO2("Processing Hang call command %s\n", + OOTRACEINFO2("Processing Hang call command %s with q931 cause %d\n", (char*)cmd.param1); ooH323HangCall((char*)cmd.param1, - *(OOCallClearReason*)cmd.param2); + *(OOCallClearReason*)cmd.param2, *(int *) cmd.param3); break; case OO_CMD_SENDDIGIT: @@ -190,4 +278,133 @@ return OO_OK; } +int ooReadAndProcessCallStackCommand(OOH323CallData* call) +{ + OOH323CallData *pCall = NULL; + unsigned char buffer[MAXMSGLEN]; + unsigned char *bPoint; + int i, recvLen = 0; + OOStackCommand cmd; + memset(&cmd, 0, sizeof(OOStackCommand)); + if (call->CmdChanLock) { + ast_mutex_lock((ast_mutex_t *)call->CmdChanLock); + recvLen = read(call->cmdSock, buffer, MAXMSGLEN); + ast_mutex_unlock((ast_mutex_t *)call->CmdChanLock); + } else { + recvLen = read(call->cmdSock, buffer, MAXMSGLEN); + } + if(recvLen <= 0) + { + OOTRACEERR1("Error:Failed to read CMD message\n"); + return OO_FAILED; + } + + bPoint = buffer; + while (bPoint < buffer + recvLen - sizeof(OOStackCommand)) { + + memcpy(&cmd, bPoint, sizeof(OOStackCommand)); + bPoint += sizeof(OOStackCommand); + + if (cmd.plen1 > 0) { + cmd.param1 = malloc(cmd.plen1 + 1); + if (!cmd.param1) + return OO_FAILED; + memset(cmd.param1, 0, cmd.plen1 + 1); + memcpy(cmd.param1, bPoint, cmd.plen1); + bPoint += cmd.plen1; + } + + if (cmd.plen2 > 0) { + cmd.param2 = malloc(cmd.plen2 + 1); + if (!cmd.param2) + return OO_FAILED; + memset(cmd.param2, 0, cmd.plen2 + 1); + memcpy(cmd.param2, bPoint, cmd.plen2); + bPoint += cmd.plen2; + } + + if (cmd.plen3 > 0) { + cmd.param3 = malloc(cmd.plen3 + 1); + if (!cmd.param3) + return OO_FAILED; + memset(cmd.param3, 0, cmd.plen3 + 1); + memcpy(cmd.param3, bPoint, cmd.plen3); + bPoint += cmd.plen3; + } + + if(cmd.type == OO_CMD_NOOP) + continue; + + if(gH323ep.gkClient && gH323ep.gkClient->state != GkClientRegistered) + { + OOTRACEINFO1("Ignoring stack command as Gk Client is not registered" + " yet\n"); + } + else { + switch(cmd.type) { + case OO_CMD_MAKECALL: + OOTRACEINFO2("Processing MakeCall command %s\n", + (char*)cmd.param2); + + ooH323MakeCall ((char*)cmd.param1, (char*)cmd.param2, + (ooCallOptions*)cmd.param3); + break; + + case OO_CMD_MANUALPROGRESS: + ooSendProgress(call); + break; + + case OO_CMD_MANUALRINGBACK: + if(OO_TESTFLAG(gH323ep.flags, OO_M_MANUALRINGBACK)) + { + ooSendAlerting(call); + if(OO_TESTFLAG(gH323ep.flags, OO_M_AUTOANSWER)) { + ooSendConnect(call); + } + } + break; + + case OO_CMD_ANSCALL: + ooSendConnect(call); + break; + + case OO_CMD_FWDCALL: + OOTRACEINFO3("Forwarding call %s to %s\n", (char*)cmd.param1, + (char*)cmd.param2); + ooH323ForwardCall((char*)cmd.param1, (char*)cmd.param2); + break; + + case OO_CMD_HANGCALL: + OOTRACEINFO2("Processing Hang call command %s with q931 cause %d\n", + (char*)cmd.param1); + ooH323HangCall((char*)cmd.param1, + *(OOCallClearReason*)cmd.param2, *(int *) cmd.param3); + break; + + case OO_CMD_SENDDIGIT: + if(call->jointDtmfMode & OO_CAP_DTMF_H245_alphanumeric) { + ooSendH245UserInputIndication_alphanumeric( + call, (const char*)cmd.param2); + } + else if(call->jointDtmfMode & OO_CAP_DTMF_H245_signal) { + ooSendH245UserInputIndication_signal( + call, (const char*)cmd.param2); + } + else { + ooQ931SendDTMFAsKeyPadIE(call, (const char*)cmd.param2); + } + + break; + + default: OOTRACEERR1("ERROR:Unknown command\n"); + } + } + if(cmd.param1) free(cmd.param1); + if(cmd.param2) free(cmd.param2); + if(cmd.param3) free(cmd.param3); + } + + + return OO_OK; +} --- channels/ooh323c/src/ooTimer.c 2008-02-07 23:59:47.000000000 +0300 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/ooTimer.c 2009-05-31 00:23:35.000000000 +0400 @@ -14,6 +14,9 @@ * *****************************************************************************/ +#include +#include + #include "ooDateTime.h" #include "ooTimer.h" #include "ootrace.h" --- channels/ooh323c/src/ooLogChan.c 2008-05-28 18:45:23.000000000 +0400 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/ooLogChan.c 2009-05-31 00:00:17.000000000 +0400 @@ -14,6 +14,9 @@ * *****************************************************************************/ +#include +#include + #include "ooCalls.h" #include "ooh323ep.h" --- channels/ooh323c/src/printHandler.c 2008-02-07 23:59:47.000000000 +0300 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/printHandler.c 2009-05-31 00:23:04.000000000 +0400 @@ -17,10 +17,13 @@ the fields of an encoded PER message to stdout in a structured output format.. */ +#include +#include + #include -#ifdef HAVE_MALLOC_H +/* #ifdef HAVE_MALLOC_H #include -#endif +#endif */ #include "printHandler.h" #include "ootypes.h" #include "rtctype.h" --- channels/ooh323c/src/encode.c 2008-02-07 23:59:47.000000000 +0300 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/encode.c 2009-05-31 00:18:38.000000000 +0400 @@ -14,7 +14,10 @@ * *****************************************************************************/ +#include +#include #include + #include "ooasn1.h" static int encode16BitConstrainedString --- channels/ooh323c/src/context.c 2008-02-07 23:59:47.000000000 +0300 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/context.c 2009-05-31 00:15:12.000000000 +0400 @@ -13,9 +13,12 @@ * maintain this copyright notice. * *****************************************************************************/ +#include +#include #include "ooasn1.h" #include +#include int initContext (OOCTXT* pctxt) { @@ -25,6 +28,9 @@ pctxt->pMsgMemHeap = pctxt->pTypeMemHeap; memHeapAddRef (&pctxt->pMsgMemHeap); + + ast_mutex_init(&pctxt->pLock); + return ASN_OK; } @@ -55,6 +61,8 @@ int initSubContext (OOCTXT* pctxt, OOCTXT* psrc) { + /* ast_mutex_lock(&pctxt->pLock); */ + ast_mutex_lock(&psrc->pLock); int stat = ASN_OK; memset (pctxt, 0, sizeof(OOCTXT)); pctxt->pTypeMemHeap = psrc->pTypeMemHeap; @@ -65,11 +73,15 @@ pctxt->buffer.dynamic = TRUE; pctxt->buffer.byteIndex = 0; pctxt->buffer.bitOffset = 8; + + ast_mutex_unlock(&psrc->pLock); + /* ast_mutex_unlock(&pctxt->pLock); */ return stat; } void freeContext (OOCTXT* pctxt) { + ast_mutex_lock(&pctxt->pLock); ASN1BOOL saveBuf = (pctxt->flags & ASN1SAVEBUF) != 0; if (pctxt->buffer.dynamic && pctxt->buffer.data) { @@ -85,26 +97,36 @@ memHeapRelease (&pctxt->pTypeMemHeap); memHeapRelease (&pctxt->pMsgMemHeap); + + ast_mutex_unlock(&pctxt->pLock); + ast_mutex_destroy(&pctxt->pLock); } void copyContext (OOCTXT* pdest, OOCTXT* psrc) { + /* ast_mutex_lock(&pdest->pLock); ast_mutex_lock(&psrc->pLock); */ memcpy (&pdest->buffer, &psrc->buffer, sizeof(ASN1BUFFER)); pdest->flags = psrc->flags; + /* ast_mutex_unlock(&psrc->pLock); ast_mutex_unlock(&pdest->pLock); */ } void setCtxtFlag (OOCTXT* pctxt, ASN1USINT mask) { + ast_mutex_lock(&pctxt->pLock); pctxt->flags |= mask; + ast_mutex_unlock(&pctxt->pLock); } void clearCtxtFlag (OOCTXT* pctxt, ASN1USINT mask) { + ast_mutex_lock(&pctxt->pLock); pctxt->flags &= ~mask; + ast_mutex_unlock(&pctxt->pLock); } int setPERBufferUsingCtxt (OOCTXT* pTarget, OOCTXT* pSource) { + ast_mutex_lock(&pTarget->pLock); ast_mutex_lock(&pSource->pLock); int stat = initContextBuffer (pTarget, pSource->buffer.data, pSource->buffer.size); @@ -113,13 +135,16 @@ pTarget->buffer.bitOffset = pSource->buffer.bitOffset; } + ast_mutex_unlock(&pSource->pLock); ast_mutex_unlock(&pTarget->pLock); return stat; } int setPERBuffer (OOCTXT* pctxt, ASN1OCTET* bufaddr, ASN1UINT bufsiz, ASN1BOOL aligned) { + ast_mutex_lock(&pctxt->pLock); int stat = initContextBuffer (pctxt, bufaddr, bufsiz); + ast_mutex_unlock(&pctxt->pLock); if(stat != ASN_OK) return stat; @@ -128,10 +153,12 @@ OOCTXT* newContext () { - OOCTXT* pctxt = (OOCTXT*) ASN1CRTMALLOC0 (sizeof(OOCTXT)); + /* OOCTXT* pctxt = (OOCTXT*) ASN1CRTMALLOC0 (sizeof(OOCTXT)); */ + OOCTXT* pctxt = (OOCTXT*) malloc (sizeof(OOCTXT)); if (pctxt) { if (initContext(pctxt) != ASN_OK) { - ASN1CRTFREE0 (pctxt); + /* ASN1CRTFREE0 (pctxt); */ + free(pctxt); pctxt = 0; } pctxt->flags |= ASN1DYNCTXT; --- channels/ooh323c/src/perutil.c 2008-02-07 23:59:47.000000000 +0300 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/perutil.c 2009-05-31 00:22:03.000000000 +0400 @@ -14,6 +14,9 @@ * *****************************************************************************/ +#include +#include + #include "ooasn1.h" #include "ooper.h" --- channels/ooh323c/src/ootrace.h 2008-06-04 21:35:29.000000000 +0400 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/ootrace.h 2009-05-30 06:40:48.000000000 +0400 @@ -52,10 +52,11 @@ #define TRACELVL 1 #endif -#define OOTRACEERR1(a) ooTrace(OOTRCLVLERR,"%s", a) +#define OOTRACEERR1(a) ooTrace(OOTRCLVLERR,a) #define OOTRACEERR2(a,b) ooTrace(OOTRCLVLERR,a,b) #define OOTRACEERR3(a,b,c) ooTrace(OOTRCLVLERR,a,b,c) #define OOTRACEERR4(a,b,c,d) ooTrace(OOTRCLVLERR,a,b,c,d) +#define OOTRACEERR5(a,b,c,d,e) ooTrace(OOTRCLVLERR,a,b,c,d,e) #define OOTRACEWARN1(a) ooTrace(OOTRCLVLWARN,a) #define OOTRACEWARN2(a,b) ooTrace(OOTRCLVLWARN,a,b) #define OOTRACEWARN3(a,b,c) ooTrace(OOTRCLVLWARN,a,b,c) @@ -72,7 +73,7 @@ #define OOTRACEDBGA3(a,b,c) ooTrace(OOTRCLVLDBGA,a,b,c) #define OOTRACEDBGA4(a,b,c,d) ooTrace(OOTRCLVLDBGA,a,b,c,d) #define OOTRACEDBGA5(a,b,c,d,e) ooTrace(OOTRCLVLDBGA,a,b,c,d,e) -#define OOTRACEDBGB1(a) ooTrace(OOTRCLVLDBGB,"%s",a) +#define OOTRACEDBGB1(a) ooTrace(OOTRCLVLDBGB,a) #define OOTRACEDBGB2(a,b) ooTrace(OOTRCLVLDBGB,a,b) #define OOTRACEDBGB3(a,b,c) ooTrace(OOTRCLVLDBGB,a,b,c) #define OOTRACEDBGB4(a,b,c,d) ooTrace(OOTRCLVLDBGB,a,b,c,d) @@ -129,7 +130,7 @@ * * @return - none */ -EXTERN void ooTrace(OOUINT32 traceLevel, const char * fmtspec, ...)__attribute__((format(printf, 2, 3))); +EXTERN void ooTrace(OOUINT32 traceLevel, const char * fmtspec, ...); /** * Helper function for the trace function. This function performs actual --- channels/ooh323c/src/ooh245.c 2008-02-07 23:59:47.000000000 +0300 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/ooh245.c 2009-05-31 00:21:02.000000000 +0400 @@ -13,7 +13,8 @@ * maintain this copyright notice. * *****************************************************************************/ - +#include +#include #include "ooh245.h" #include "ooCalls.h" #include "printHandler.h" @@ -34,9 +35,10 @@ 6, { 0, 0, 8, 245, 0, 8 } }; -int ooCreateH245Message(H245Message **pph245msg, int type) +int ooCreateH245Message(OOH323CallData* call, H245Message **pph245msg, int type) { - OOCTXT* pctxt = &gH323ep.msgctxt; + /* OOCTXT* pctxt = &gH323ep.msgctxt; */ + OOCTXT* pctxt = call->msgctxt; *pph245msg = (H245Message*) memAlloc (pctxt, sizeof(H245Message)); @@ -121,7 +123,8 @@ OOTRACEDBGC1("msgCtxt Reset?"); if (0 != pmsg) { if(!OO_TESTFLAG (call->flags, OO_M_TUNNELING)){ - memReset (&gH323ep.msgctxt); + /* memReset (&gH323ep.msgctxt); */ + memReset (call->msgctxt); OOTRACEDBGC3(" Done (%s, %s)\n", call->callType, call->callToken); return OO_OK; } @@ -166,7 +169,8 @@ int stat=0; ASN1OCTET* encodePtr=NULL; H245MultimediaSystemControlMessage *multimediaMsg; - OOCTXT *pctxt = &gH323ep.msgctxt; + /* OOCTXT *pctxt = &gH323ep.msgctxt; */ + OOCTXT *pctxt = call->msgctxt; multimediaMsg = &(ph245Msg->h245Msg); if(!msgbuf || size<200) @@ -198,13 +202,15 @@ setPERBuffer (pctxt, msgbuf+i, (size-i), TRUE); - stat = asn1PE_H245MultimediaSystemControlMessage (&gH323ep.msgctxt, + /* stat = asn1PE_H245MultimediaSystemControlMessage (&gH323ep.msgctxt, */ + stat = asn1PE_H245MultimediaSystemControlMessage (call->msgctxt, multimediaMsg); if (stat != ASN_OK) { OOTRACEERR3 ("ERROR: H245 Message encoding failed (%s, %s)\n", call->callType, call->callToken); - OOTRACEERR1 (errGetText (&gH323ep.msgctxt)); + /* OOTRACEERR1 (errGetText (&gH323ep.msgctxt)); */ + OOTRACEERR1 (errGetText (call->msgctxt)); return OO_FAILED; } @@ -333,7 +339,7 @@ return OO_OK; } - ret = ooCreateH245Message(&ph245msg, + ret = ooCreateH245Message(call, &ph245msg, T_H245MultimediaSystemControlMessage_request); if(ret == OO_FAILED) @@ -345,7 +351,8 @@ /* Set request type as TerminalCapabilitySet */ request = ph245msg->h245Msg.u.request; - pctxt = &gH323ep.msgctxt; + /* pctxt = &gH323ep.msgctxt; */ + pctxt = call->msgctxt; ph245msg->msgType = OOTerminalCapabilitySet; memset(request, 0, sizeof(H245RequestMessage)); if(request == NULL) @@ -816,7 +823,8 @@ int ret; H245Message* ph245msg=NULL; H245RequestMessage *request; - OOCTXT *pctxt=&gH323ep.msgctxt; + /* OOCTXT *pctxt=&gH323ep.msgctxt; */ + OOCTXT *pctxt=call->msgctxt; H245MasterSlaveDetermination* pMasterSlave; /* Check whether Master Slave Determination already in progress */ @@ -827,7 +835,7 @@ return OO_OK; } - ret = ooCreateH245Message(&ph245msg, + ret = ooCreateH245Message(call, &ph245msg, T_H245MultimediaSystemControlMessage_request); if(ret != OO_OK) { @@ -873,9 +881,10 @@ int ret=0; H245ResponseMessage * response=NULL; H245Message *ph245msg=NULL; - OOCTXT *pctxt=&gH323ep.msgctxt; + /* OOCTXT *pctxt=&gH323ep.msgctxt; */ + OOCTXT *pctxt=call->msgctxt; - ret = ooCreateH245Message(&ph245msg, + ret = ooCreateH245Message(call, &ph245msg, T_H245MultimediaSystemControlMessage_response); if(ret != OO_OK) { @@ -918,10 +927,11 @@ int ret=0; H245ResponseMessage* response=NULL; H245Message *ph245msg=NULL; - OOCTXT *pctxt=&gH323ep.msgctxt; + /* OOCTXT *pctxt=&gH323ep.msgctxt; */ + OOCTXT *pctxt=call->msgctxt; ret = ooCreateH245Message - (&ph245msg, T_H245MultimediaSystemControlMessage_response); + (call, &ph245msg, T_H245MultimediaSystemControlMessage_response); if (ret != OO_OK) { OOTRACEERR3("Error:H245 message creation failed for - MasterSlave " @@ -963,10 +973,11 @@ int ret=0; H245IndicationMessage* indication=NULL; H245Message *ph245msg=NULL; - OOCTXT *pctxt=&gH323ep.msgctxt; + /* OOCTXT *pctxt=&gH323ep.msgctxt; */ + OOCTXT *pctxt=call->msgctxt; ret = ooCreateH245Message - (&ph245msg, T_H245MultimediaSystemControlMessage_indication); + (call, &ph245msg, T_H245MultimediaSystemControlMessage_indication); if (ret != OO_OK) { OOTRACEERR3("Error:H245 message creation failed for - MasterSlave " @@ -1168,7 +1179,7 @@ return OO_FAILED; } /* Generate an Ack for the open channel request */ - ret = ooCreateH245Message(&ph245msg, + ret = ooCreateH245Message(call, &ph245msg, T_H245MultimediaSystemControlMessage_response); if(ret != OO_OK) { @@ -1183,7 +1194,8 @@ ph245msg->msgType = OOOpenLogicalChannelAck; ph245msg->logicalChannelNo = olc->forwardLogicalChannelNumber; response = ph245msg->h245Msg.u.response; - pctxt = &gH323ep.msgctxt; + /* pctxt = &gH323ep.msgctxt; */ + pctxt = call->msgctxt; memset(response, 0, sizeof(H245ResponseMessage)); response->t = T_H245ResponseMessage_openLogicalChannelAck; response->u.openLogicalChannelAck = (H245OpenLogicalChannelAck*) @@ -1292,10 +1304,11 @@ int ret=0; H245ResponseMessage* response=NULL; H245Message *ph245msg=NULL; - OOCTXT *pctxt=&gH323ep.msgctxt; + /* OOCTXT *pctxt=&gH323ep.msgctxt; */ + OOCTXT *pctxt=call->msgctxt; ret = ooCreateH245Message - (&ph245msg, T_H245MultimediaSystemControlMessage_response); + (call, &ph245msg, T_H245MultimediaSystemControlMessage_response); if (ret != OO_OK) { OOTRACEERR3("Error:H245 message creation failed for - OpenLogicalChannel" @@ -1567,7 +1580,7 @@ H245CommandMessage * command; OOCTXT *pctxt; H245Message *ph245msg=NULL; - ret = ooCreateH245Message(&ph245msg, + ret = ooCreateH245Message(call, &ph245msg, T_H245MultimediaSystemControlMessage_command); if(ret != OO_OK) { @@ -1578,7 +1591,8 @@ ph245msg->msgType = OOEndSessionCommand; command = ph245msg->h245Msg.u.command; - pctxt = &gH323ep.msgctxt; + /* pctxt = &gH323ep.msgctxt; */ + pctxt = call->msgctxt; memset(command, 0, sizeof(H245CommandMessage)); command->t = T_H245CommandMessage_endSessionCommand; command->u.endSessionCommand = (H245EndSessionCommand*) ASN1MALLOC(pctxt, @@ -1728,7 +1742,7 @@ H245RequestMessage *request; H245CloseLogicalChannel* clc; - ret = ooCreateH245Message(&ph245msg, + ret = ooCreateH245Message(call, &ph245msg, T_H245MultimediaSystemControlMessage_request); if(ret != OO_OK) { @@ -1738,7 +1752,8 @@ } ph245msg->msgType = OOCloseLogicalChannel; ph245msg->logicalChannelNo = logicalChan->channelNo; - pctxt = &gH323ep.msgctxt; + /* pctxt = &gH323ep.msgctxt; */ + pctxt = call->msgctxt; request = ph245msg->h245Msg.u.request; request->t = T_H245RequestMessage_closeLogicalChannel; @@ -1795,7 +1810,7 @@ H245RequestMessage *request; H245RequestChannelClose *rclc; - ret = ooCreateH245Message(&ph245msg, + ret = ooCreateH245Message(call, &ph245msg, T_H245MultimediaSystemControlMessage_request); if(ret != OO_OK) { @@ -1806,7 +1821,8 @@ } ph245msg->msgType = OORequestChannelClose; ph245msg->logicalChannelNo = logicalChan->channelNo; - pctxt = &gH323ep.msgctxt; + /* pctxt = &gH323ep.msgctxt; */ + pctxt = call->msgctxt; request = ph245msg->h245Msg.u.request; request->t = T_H245RequestMessage_requestChannelClose; @@ -1848,7 +1864,7 @@ OOCTXT *pctxt; H245IndicationMessage *indication; - ret = ooCreateH245Message(&ph245msg, + ret = ooCreateH245Message(call, &ph245msg, T_H245MultimediaSystemControlMessage_indication); if(ret != OO_OK) { @@ -1859,7 +1875,8 @@ } ph245msg->msgType = OORequestChannelCloseRelease; ph245msg->logicalChannelNo = channelNum; - pctxt = &gH323ep.msgctxt; + /* pctxt = &gH323ep.msgctxt; */ + pctxt = call->msgctxt; indication = ph245msg->h245Msg.u.indication; indication->t = T_H245IndicationMessage_requestChannelCloseRelease; indication->u.requestChannelCloseRelease = (H245RequestChannelCloseRelease*) @@ -1919,7 +1936,7 @@ return OO_FAILED; } } - ret = ooCreateH245Message(&ph245msg, + ret = ooCreateH245Message(call, &ph245msg, T_H245MultimediaSystemControlMessage_response); if(ret != OO_OK) { @@ -1927,7 +1944,8 @@ "failed (%s, %s)\n", call->callType, call->callToken); return OO_FAILED; } - pctxt = &gH323ep.msgctxt; + /* pctxt = &gH323ep.msgctxt; */ + pctxt = call->msgctxt; ph245msg->msgType = OORequestChannelCloseAck; ph245msg->logicalChannelNo = rclc->forwardLogicalChannelNumber; response = ph245msg->h245Msg.u.response; @@ -2055,7 +2073,7 @@ return OO_FAILED; } - ret = ooCreateH245Message(&ph245msg, + ret = ooCreateH245Message(call, &ph245msg, T_H245MultimediaSystemControlMessage_response); if(ret != OO_OK) { @@ -2064,7 +2082,8 @@ call->callToken); return OO_FAILED; } - pctxt = &gH323ep.msgctxt; + /* pctxt = &gH323ep.msgctxt; */ + pctxt = call->msgctxt; ph245msg->msgType = OOCloseLogicalChannelAck; ph245msg->logicalChannelNo = clc->forwardLogicalChannelNumber; response = ph245msg->h245Msg.u.response; @@ -2527,7 +2546,7 @@ H245Message *ph245msg=NULL; H245ResponseMessage * response=NULL; OOCTXT *pctxt=NULL; - int ret = ooCreateH245Message(&ph245msg, + int ret = ooCreateH245Message(call, &ph245msg, T_H245MultimediaSystemControlMessage_response); if(ret != OO_OK) { @@ -2538,7 +2557,8 @@ ph245msg->msgType = OOTerminalCapabilitySetReject; response = ph245msg->h245Msg.u.response; memset(response, 0, sizeof(H245ResponseMessage)); - pctxt = &gH323ep.msgctxt; + /* pctxt = &gH323ep.msgctxt; */ + pctxt = call->msgctxt; response->t = T_H245ResponseMessage_terminalCapabilitySetReject; response->u.terminalCapabilitySetReject = (H245TerminalCapabilitySetReject*) @@ -2570,7 +2590,7 @@ H245Message *ph245msg=NULL; H245ResponseMessage * response=NULL; OOCTXT *pctxt=NULL; - int ret = ooCreateH245Message(&ph245msg, + int ret = ooCreateH245Message(call, &ph245msg, T_H245MultimediaSystemControlMessage_response); if(ret != OO_OK) { @@ -2581,7 +2601,8 @@ ph245msg->msgType = OOTerminalCapabilitySetAck; response = ph245msg->h245Msg.u.response; memset(response, 0, sizeof(H245ResponseMessage)); - pctxt = &gH323ep.msgctxt; + /* pctxt = &gH323ep.msgctxt; */ + pctxt = call->msgctxt; response->t = T_H245ResponseMessage_terminalCapabilitySetAck; response->u.terminalCapabilitySetAck = (H245TerminalCapabilitySetAck*) @@ -2612,10 +2633,11 @@ int ret=0; H245IndicationMessage* indication=NULL; H245Message *ph245msg=NULL; - OOCTXT *pctxt=&gH323ep.msgctxt; + /* OOCTXT *pctxt=&gH323ep.msgctxt; */ + OOCTXT *pctxt=call->msgctxt; ret = ooCreateH245Message - (&ph245msg, T_H245MultimediaSystemControlMessage_indication); + (call, &ph245msg, T_H245MultimediaSystemControlMessage_indication); if (ret != OO_OK) { OOTRACEERR3("Error:H245 message creation failed for - Terminal" @@ -2662,10 +2684,11 @@ int ret=0; H245IndicationMessage* indication=NULL; H245Message *ph245msg=NULL; - OOCTXT *pctxt=&gH323ep.msgctxt; + /* OOCTXT *pctxt=&gH323ep.msgctxt; */ + OOCTXT *pctxt=call->msgctxt; ret = ooCreateH245Message - (&ph245msg, T_H245MultimediaSystemControlMessage_indication); + (call, &ph245msg, T_H245MultimediaSystemControlMessage_indication); if (ret != OO_OK) { OOTRACEERR3("Error:H245 message creation failed for - H245UserInput" @@ -2721,10 +2744,11 @@ int ret=0; H245IndicationMessage* indication=NULL; H245Message *ph245msg=NULL; - OOCTXT *pctxt=&gH323ep.msgctxt; + /* OOCTXT *pctxt=&gH323ep.msgctxt; */ + OOCTXT *pctxt=call->msgctxt; ret = ooCreateH245Message - (&ph245msg, T_H245MultimediaSystemControlMessage_indication); + (call, &ph245msg, T_H245MultimediaSystemControlMessage_indication); if (ret != OO_OK) { OOTRACEERR3("Error:H245 message creation failed for - H245UserInput" @@ -2860,7 +2884,8 @@ */ OOTRACEINFO3("Looking for matching capabilities. (%s, %s)\n", call->callType, call->callToken); - if(call->masterSlaveState == OO_MasterSlave_Master) +/* May */ + if(call->masterSlaveState == OO_MasterSlave_Master && 0) { for(k=0; kcapPrefs.index; k++) { @@ -2899,7 +2924,7 @@ } } - else if(call->masterSlaveState == OO_MasterSlave_Slave) + else if(call->masterSlaveState == OO_MasterSlave_Slave || 1) { epCap = call->jointCaps; @@ -2963,7 +2988,7 @@ ooGetCapTypeText(epCap->cap), call->callType, call->callToken); - ret = ooCreateH245Message(&ph245msg, + ret = ooCreateH245Message(call, &ph245msg, T_H245MultimediaSystemControlMessage_request); if(ret != OO_OK) { @@ -2980,7 +3005,8 @@ call->logicalChanNoCur = call->logicalChanNoBase; request = ph245msg->h245Msg.u.request; - pctxt = &gH323ep.msgctxt; + /* pctxt = &gH323ep.msgctxt; */ + pctxt = call->msgctxt; memset(request, 0, sizeof(H245RequestMessage)); request->t = T_H245RequestMessage_openLogicalChannel; --- channels/ooh323c/src/ootrace.c 2008-06-04 21:35:29.000000000 +0400 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/ootrace.c 2009-05-31 00:19:24.000000000 +0400 @@ -14,6 +14,8 @@ * *****************************************************************************/ +#include +#include #include #include #include @@ -70,7 +72,7 @@ #else struct tm *ptime; - char dateString[15]; + char dateString[10]; time_t t = time(NULL); ptime = localtime(&t); strftime(timeString, 100, "%H:%M:%S", ptime); @@ -100,7 +102,7 @@ if(printDate) { printDate = 0; - strftime(dateString, 15, "%m/%d/%Y", ptime); + strftime(dateString, 10, "%D", ptime); fprintf(gH323ep.fptraceFile, "---------Date %s---------\n", dateString); } --- channels/ooh323c/src/eventHandler.c 2008-02-07 23:59:47.000000000 +0300 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/eventHandler.c 2009-05-31 00:22:13.000000000 +0400 @@ -14,6 +14,9 @@ * *****************************************************************************/ +#include +#include + #include "eventHandler.h" void setEventHandler (OOCTXT* pctxt, EventHandler* pHandler) --- channels/ooh323c/src/ooh323ep.h 2008-06-04 21:35:29.000000000 +0400 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/ooh323ep.h 2009-05-30 06:40:48.000000000 +0400 @@ -26,12 +26,12 @@ #include "ooq931.h" #define DEFAULT_TRACEFILE "trace.log" -#define DEFAULT_TERMTYPE 50 -#define DEFAULT_PRODUCTID "objsys" +#define DEFAULT_TERMTYPE 60 +#define DEFAULT_PRODUCTID "ooh323" #define DEFAULT_CALLERID "objsyscall" -#define DEFAULT_T35COUNTRYCODE 1 +#define DEFAULT_T35COUNTRYCODE 184 #define DEFAULT_T35EXTENSION 0 -#define DEFAULT_MANUFACTURERCODE 71 +#define DEFAULT_MANUFACTURERCODE 39 #define DEFAULT_H245CONNECTION_RETRYTIMEOUT 2 #define DEFAULT_CALLESTB_TIMEOUT 60 #define DEFAULT_MSD_TIMEOUT 30 @@ -58,8 +58,8 @@ * @{ */ /* Default port ranges */ -#define TCPPORTSSTART 12030 /*!< Starting TCP port number */ -#define TCPPORTSEND 12230 /*!< Ending TCP port number */ +#define TCPPORTSSTART 12000 /*!< Starting TCP port number */ +#define TCPPORTSEND 62230 /*!< Ending TCP port number */ #define UDPPORTSSTART 13030 /*!< Starting UDP port number */ #define UDPPORTSEND 13230 /*!< Ending UDP port number */ #define RTPPORTSSTART 14030 /*!< Starting RTP port number */ @@ -172,6 +172,9 @@ */ EXTERN int ooH323EpSetAsGateway(); +EXTERN int ooH323EpSetVersionInfo(int t35countrycode, int t35extensions, int manufacturer, + char* vendor, char* version); + /** * This function is used to assign a local ip address to be used for call * signalling. --- channels/ooh323c/src/ooGkClient.c 2008-05-28 18:45:23.000000000 +0400 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/ooGkClient.c 2009-05-31 00:15:00.000000000 +0400 @@ -20,6 +20,9 @@ * This file contains functions to support RAS protocol. * */ +#include +#include + #include "ooGkClient.h" #include "ootypes.h" #include "ootrace.h" --- channels/ooh323c/src/memheap.h 2008-02-07 23:59:47.000000000 +0300 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/memheap.h 2009-05-30 06:40:48.000000000 +0400 @@ -50,6 +50,7 @@ ASN1UINT defBlkSize; ASN1UINT refCnt; ASN1UINT flags; + ast_mutex_t pLock; } OSMemHeap; /* see rtMemDefs.c file */ --- channels/ooh323c/src/ooCapability.c 2008-06-04 21:35:29.000000000 +0400 +++ ../../asterisk-addons-1.6.1.0/channels/ooh323c/src/ooCapability.c 2009-06-08 00:25:13.000000000 +0400 @@ -13,6 +13,9 @@ * maintain this copyright notice. * *****************************************************************************/ +#include +#include + #include "ooCapability.h" #include "ootrace.h" #include "ooCalls.h"