[asterisk-dev] DAHDI_CHECK_HOOKSTATE and setting rxisoffhook

Tzafrir Cohen tzafrir.cohen at xorcom.com
Tue Oct 6 17:04:26 CDT 2009


On Sun, Sep 13, 2009 at 05:18:16PM +0300, Tzafrir Cohen wrote:
> The following has been a subject of a bug report or two, but sadly I
> still fail to understand the rationale of them.
> 
> The following is code from available() in chan_dahdi.c . This function
> returns 1 if a channel can be used for an outgoing call or 0 otherwise.
> 
> Code from 1.4.21 (chan_zap.c):
> 
>                         if (!p->sig || (p->sig == SIG_FXSLS))
>                                 return 1;
>                         /* Check hook state */
>                         if (p->subs[SUB_REAL].zfd > -1)
>                                 res = ioctl(p->subs[SUB_REAL].zfd, ZT_GET_PARAMS
>                         else {
>                                 /* Assume not off hook on CVRS */
>                                 res = 0;
>                                 par.rxisoffhook = 0;
>                         }
>                         if (res) {
>                                 ast_log(LOG_WARNING, "Unable to check hook state
>                         } else if ((p->sig == SIG_FXSKS) || (p->sig == SIG_FXSGS
>                                 /* When "onhook" that means no battery on the li
>                                   it is out of service..., if it's on a TDM card
>                                   bank, there is no telling... */
>                                 if (par.rxbits > -1)
>                                         return 1;
>                                 if (par.rxisoffhook)
>                                         return 1;
>                                 else
> #ifdef ZAP_CHECK_HOOKSTATE
>                                         return 0;
> #else
>                                         return 1;
> #endif
>                         } else if (par.rxisoffhook) {
>                                 ast_log(LOG_DEBUG, "Channel %d off hook, can't u
>                                 /* Not available when the other end is off hook
>                                 return 0;
>                         }
>                 }
>                 return 1;
> 
> As you can see, '0' may only be returned here if ZAP_CHECK_HOOKSTATE is
> defined or if the signalling is not fxs_ls, fxs_ks or fxs_gs (that is: 
> not an FXO with LS, KS or GS)
> 
> Code in recent 1.4 is very similar.
> 
> 
> The code in 1.6.0, however, is slightly different:
> 
>                         if (!p->sig || (p->sig == SIG_FXSLS))
>                                 return 1;
>                         /* Check hook state */
>                         if (p->subs[SUB_REAL].dfd > -1) {
>                                 memset(&par, 0, sizeof(par));
>                                 res = ioctl(p->subs[SUB_REAL].dfd, DAHDI_GET_PAR
>                         } else {
>                                 /* Assume not off hook on CVRS */
>                                 res = 0;
>                                 par.rxisoffhook = 0;
>                         }
>                         if (res) {
>                                 ast_log(LOG_WARNING, "Unable to check hook state
>                         } else if ((p->sig == SIG_FXSKS) || (p->sig == SIG_FXSGS
>                                 /* When "onhook" that means no battery on the li
>                                   it is out of service..., if it's on a TDM card
>                                   bank, there is no telling... */
>                                 if (par.rxbits > -1)
>                                         return 1;
>                                 if (par.rxisoffhook)
>                                         return 1;
>                                 else
>                                         return 0;
>                         } else if (par.rxisoffhook) {
>                                 ast_debug(1, "Channel %d off hook, can't use\n",
>                                 /* Not available when the other end is off hook
> #ifdef DAHDI_CHECK_HOOKSTATE
>                                 return 0;
> #else
>                                 return 1;
> #endif
>                         }
>                 }
>                 return 1;
> 
> As you can see, this code may also return 0 (fail) if signalling was 
> fxs_ks or fxs_gs, if the rxisoffhook flag is not set. This flag gets
> set by asking the driver.
> 
> So far I have failed to get any explanation as to why this test is
> needed. It is said to be some issue with channel bank, but when I asked
> how it can be reproduced, I failed to get more information.
> 
> The impact of this issue is that FXO interfaces fail to work with
> Asterisk >= 1.6.0 unless set to use LS signalling or unless there is an
> incoming call before.
> 
> There is a related issue that rxisoffhook is not properly reported for
> various drivers. It gets reset to an "uninitialized" value after
> dahdi_cfg but the low-level driver has no decent way of setting it, as
> it is called right after the optional span startup hook.
> 
> Sean Ruffel fixed the Digium analog drivers to properly set it. However
> as he could not use any hook, he had to check for an unintialized state
> at the code run at interrupt time. I don't think this is such a good
> idea to add extra code at this place, which is the most timing critical
> part of the driver. I would prefer to just avoid testing it in Asterisk
> if I don't have to.

So, any reason why I should not apply 
http://patch-tracker.debian.org/patch/series/view/asterisk/1:1.6.2.0~dfsg~rc1-1/dahdi-fxsks-hookstate

?

It's a clear regression. Nobody has yet come up with the rationale for
it.

-- 
               Tzafrir Cohen
icq#16849755              jabber:tzafrir.cohen at xorcom.com
+972-50-7952406           mailto:tzafrir.cohen at xorcom.com
http://www.xorcom.com  iax:guest at local.xorcom.com/tzafrir



More information about the asterisk-dev mailing list