[asterisk-dev] ToDo for chan_skinny

Dan Austin Dan_Austin at Phoenix.com
Fri Jun 1 09:20:37 MST 2007


Damien wrote:
> Simon Lockhart wrote:
<Snip>

>> I'm fairly certain that chan_skinny already replies 
>> to Keepalive messages from the phone (otherwise it 
>> wouldn't work at all).
>>
>> Th problem is that if the phone stops sending keepalives
>> (i.e. it goes away), then chan_skinny doesn't notice and
>> still tries sending calls to the now non-existent phone.
>>
>> Simon
>   
>  My bad, it does too. Funny thing, it is one of the 
> things that calls do_housekeeping, the others being 
> hangups. So I guess you can't reliably use 
> do_housekeeping to check if keepalives have been 
> received as it relies on receiving keepalives for 
> do_housekeeping to be called.

All true.  The phone sends the keep-alive.  Chan_skinny
responds.  It looked like it should go in do_housekeeping,
but that won't work as it is not called unless it receives
a keep-alive.

But I believe I did find the issue.  In get_input() the
code was using poll() with timeouts disabled.  Code to check
for a dropped connection looked for a timeout, it was also
in a section of code that was unlikely to be reached but
not impossible.

IF the phone dropped while sending a request, the current
code would detect it and de-register the device.

My fix was to add a timeout to the poll() call based on
the configured keep_alive value +10% to handle network
congestion, and to move the code that tested for timeouts
into a code path that would regularly be reached.

Light testing has been positive (I have one 7940 and one
7920).  Both have stayed registered overnight since I
implemented the patch, and unplugging the network from the
7940 has it being de-registered in less than the 30 second
keep_alive I used for testing.

Dan


More information about the asterisk-dev mailing list