[Asterisk-Dev] H.323 channel driver problems
Chih-Wei Huang
cwhuang at citron.com.tw
Thu Mar 17 08:05:11 MST 2005
Hi all,
This is my first mail to the mailing list.
I'm a developer of VoIP, especially in H.323 field,
but I'm totally new to Asterisk.
Recently I began to play Asterisk, including the H323 driver.
I could play IVR, transfer a call, and make an H323 call to
SIP client, and vice versa. What a nice project!!
The version I have tested is 1.0.5.
As Jeremy(the H323 driver author) suggested, I began
to play the CVS head version.
But the latest H323 driver seems totally broken.
Neither inbound nor outbound call can work.
I feel silly about the fact. Here are the problems I found:
* Outbound call problem
There are several problems in
oh323_call of chan_h323.c. First of all, the line
memcpy(addr, dest, strlen(addr));
strlen(addr) should be strlen(dest), or addr will always be
empty and Open323 stack will complain that an invalid URL.
Furthermore, using memcpy in this way is not good since
it's a potential buffer overflow problem.
I suggest use strncpy:
strncpy(addr, dest, INET_ADDRSTRLEN - 1);
(In fact I doubt why copies dest. It seems totally unnecessary)
Second, the following block has many problems:
if (pvt->exten) {
// case 1
snprintf(called_addr, sizeof(called_addr), "%s@%s:%d",
pvt->exten, addr, pvt->options.port);
} else {
// case 2
snprintf(called_addr, sizeof(called_addr), "%s:%d",addr,
pvt->options.port);
}
The if condition is strange. As I tested, pvt->exten was not null but
pointed to an empty string. So you would get a called_addr like
'@addr:port', which is invalid to Openh323. I think it should be
if (!ast_strlen_zero(pvt->exten)) { // non empty extention
Further, both case 1 and 2 form the destination in this form
'addr:port', which is only valid if addr is an IP address.
However, in my tested cases, addr(original dest) is not an IP,
but an extention number(like 601). So it is not a valid destination.
Moreover, the form 'addr:port' is not an appropriate destination
when using with a gatekeeper. The port should be determined by the
gatekeeper in ARQ/ACF procedure. The client should not specified
the port itself. In fact if you use this form of destination in ARQ,
you will get ARJ with calledPartyNotRegistered.
Since I don't know what exact the logic and duty that block wants to do,
I could not provide a proper patch. I just mentioned the problems I
observed: you have to consider
* whether addr is a valid IP address
* whether using with a gatekeeper
to form the final destination.
In fact, I just change the final destination to original dest
and everything works fine:
res = h323_make_call(dest, &(pvt->cd), &pvt->options);
* Inbound call problem
It will never succeed because setup_incoming_call
doesn't return a valid pointer in some cases. The function structured
like this:
if ((!strcasecmp(cd.sourceIp, gatekeeper) ... ) { // usingGK
if (...) {
// case 1
} else {
// case 2
}
} else {
if (...) {
// case 3
} else {
// case 4
}
}
Only in case 4, a proper pointer call_options is returned.
Since I'm using a gatekeeper (case 1 & 2), I can never receive a call.
I don't know how to generate a valid pointer call_options.
I just tried to add the line to case 1 & 2 and it seems work.
call_options = &pvt->options
I hope someone can explain the logic so a proper fix can be found.
To be continued...
--
~ Chih-Wei Huang (cwhuang at citron.com.tw)
'v' CTO, Citron Network Inc. ( http://www.citron.com.tw/ )
// \\ GnuGK Project : http://www.gnugk.org/ (Developer)
/( )\ HomePage : http://www.linux.org.tw/~cwhuang/
^`~'^
More information about the asterisk-dev
mailing list