Summary:ASTERISK-00929: [patch] chan_sip fails into setting the ipaddr of the mysql peer (sometimes)
Reporter:Matteo Brancaleoni (mbrancaleoni)Labels:
Date Opened:2004-01-28 05:52:51.000-0600Date Closed:2004-09-25 02:55:32
Versions:Frequency of
Environment:Attachments:( 0) chan_sip.patch
Description:sometimes (like 1 call out of 10) a very strange behaviour happens using mysql friends: in sip_create_addr there's a call to mysql_peer that retrieves the data from the db and set peer addr, among others. but returning to sip_create_addr the ip address is !
I mean... doing debug ater inet_aton(rowval[x], &p->addr.sin_addr); (line 730 into chan_sip) the ip addr is *always* correct... then the functions return to line 794... and here sometimes the p->addr.sin_addr is ,even if before was correct... there must be something wrong, but I wasn't able to find out where.
I made that quick patch that uses a temp var to store the ipaddr and all works ok (just to make the addr assignment into create_addr and not mysql_peer).

the same routines into chan_iax2 doesn't have this problem at all.

any idea?
Comments:By: Olle Johansson (oej) 2004-01-28 15:28:53.000-0600

WHEN does this happen? At registration? Or dial out to peer?
mysql_peer sets dynamic=1

Hmmm. This is ugly. Please explain more.

By: Matteo Brancaleoni (mbrancaleoni) 2004-01-28 15:42:18.000-0600

* registrations : always ok, I can register without problems and on the db the values are stored correctly.

that happens when I dialout to the peer, but not always (like above 1 call out of 10) and is more regular if I wait at least 20 secs or more after the last succesfull call. the problem is on the peer side...

Here's the scenario:
* dialout to peer (I assume that call is ok)
-> case A: hangup and quickly redial... no probs. I can always dial the peer
-> case B: hangup, wait some time (30secs ?)... dial again... error.
  on __sip_xmit I see WARNINGs with IP addr ==

so I did some debug.
since with mysql friends, every peer is dynamic and temponly, every time a sip peer is dialed sip_create_addr calls mysq_peer to get peer data
(the peer is registered, so I have all data, like ipaddr & port on the db).
So I added 2 ast_logs:
first in mysql_peer, dumping the ipaddr, after the assignment to the struct
second in sip_create_addr, just after mysql_peer is called, dumping the same
value (ip addr).
They must be the same.
when all is ok , they're the same.
when I get error, the first is ok, the second one is !

but, if I use a temp var like a *char[20] into the peer struct, where I save
the string from the db in mysql_peer and in sip_create_addr I do the real assignment.... all is ok. (see my patch).

my workaround is solid, but still I cannot get why the ipaddr is lost somewhere going back from mysql_peer to sip_create_addr...

By: Rob Gagnon (rgagnon) 2004-02-23 16:01:14.000-0600

isn't the simply being caused by an expired registration check following the read of data from the table?

Current cvs 1.299 shows:

if ((nowtime - regseconds) > default_expiry) memset(&p->addr, 0, sizeof(p->addr));

following the read of the data...

This problem might be fixed by bug ASTERISK-1011052

edited on: 02-24-04 11:10

By: z_smurf (z_smurf) 2004-02-23 16:48:07.000-0600

Yes, this is a fixed in ASTERISK-1011052.

By: Malcolm Davenport (mdavenport) 2004-02-24 15:02:13.000-0600

Changes made in CVS.  Thank you. :)