[asterisk-users] Little t38 bug?

Kevin P. Fleming kpfleming at digium.com
Tue May 25 06:54:50 CDT 2010


On 05/25/2010 05:48 AM, Alexandru Oniciuc wrote:
> Hello List,
> 
>  
> 
>                 I think I’ve discovered a little bug in t.38 bug in
> 1.6.0.22 regarding the speed (T38MaxBitRate) used to send the faxes.
> 
>  
> 
>                 Asterisk always responds  with a=T38MaxBitRate:2400.
> I’ve tried with Patton and Grandstream devices and the result is always
> the same.
> 
>                 Patton ignores the parameter and sends the fax at 9600.
> 
>                 Grandstream doesn’t, and all the faxes are going in and
> out at 2400.
> 
>  
> 
>                 Looking at the code I found this in chan_sip.c (line 7736):
> 
>  
> 
> if ((sscanf(a, "T38FaxMaxBuffer:%30u", &x) == 1)) {
> 
>                 ast_debug(3, "MaxBufferSize:%d\n", x);
> 
>                 found = TRUE;
> 
>         } else if ((sscanf(a, "T38MaxBitRate:%30u", &x) == 1) ||
> (sscanf(a, "T38FaxMaxRate:%30u", &x) == 1)) {
> 
>                 ast_debug(3, "T38MaxBitRate: %d\n", x);
> 
>                 switch (x) {
> 
>                 case 14400:
> 
>                         p->t38.their_parms.rate = AST_T38_RATE_14400;
> 
>                         break;
> 
>                 case 12000:
> 
>                         p->t38.their_parms.rate = AST_T38_RATE_12000;
> 
>                         break;
> 
>                 case 9600:
> 
>                         p->t38.their_parms.rate = AST_T38_RATE_9600;
> 
>                         break;
> 
>                 case 7200:
> 
>                         p->t38.their_parms.rate = AST_T38_RATE_7200;
> 
>                         break;
> 
>                 case 4800:
> 
>                         p->t38.their_parms.rate = AST_T38_RATE_4800;
> 
>                         break;
> 
>                 case 2400:
> 
>                         p->t38.their_parms.rate = AST_T38_RATE_2400;
> 
>                         break;
> 
>                 }
> 
>                 found = TRUE;
> 
> else if {…
> 
>  
> 
>  
> 
>  
> 
> If I’m not misteaking the second “if else” condition will never be true
> if the other device sends “T38FaxMaxBuffer” (wich they all usually do).
> 
>  
> 
> Shouldn’t it be
> 
>  
> 
> if((sscanf(a, "T38FaxMaxBuffer:%30u", &x) == 1) && ((sscanf(a,
> "T38MaxBitRate:%30u", &x) == 0) || (sscanf(a, "T38FaxMaxRate:%30u", &x)
> == 0))) ??

No. You aren't understanding the code :-) It's comparing a string buffer
against various patterns, and the string can't match all the patterns at
the same time.

This code is executed as each line of the SDP is processed, and each one
will match one of the branches of this tree, and it's values will be
extracted and stored for later use.

In other words... this is not the cause of your problem.

-- 
Kevin P. Fleming
Digium, Inc. | Director of Software Technologies
445 Jan Davis Drive NW - Huntsville, AL 35806 - USA
skype: kpfleming | jabber: kfleming at digium.com
Check us out at www.digium.com & www.asterisk.org



More information about the asterisk-users mailing list