[asterisk-users] asterisk 13.16 / pjsip / t.38: res_pjsip_t38.c:207 t38_automatic_reject: Automatically rejecting T.38 request on channel 'PJSIP/91-00000007'

Joshua Colp jcolp at digium.com
Sun Jun 11 11:51:13 CDT 2017


On Sun, Jun 11, 2017, at 01:47 PM, Joshua Colp wrote:
> On Sun, Jun 11, 2017, at 01:31 PM, Michael Maier wrote:
> > On 06/11/2017 at 04:39 PM Joshua Colp wrote:
> > > On Sun, Jun 11, 2017, at 11:34 AM, Michael Maier wrote:
> > > 
> > > <snip>
> > > 
> > >>>
> > >>> PJSIP uses a dispatch model. The request is queued up, acted on, and
> > >>> then that's it. The act of acting on it removes it from the queue.
> > >>
> > >> That's the *expected* behavior ... . I rechecked again and again. All
> > >> existing tcpdumps. The "resent" package isn't part of any tcpdump
> > >> (wireshark doesn't show it) - and during tcpdump no package was dropped.
> > >>
> > >>> The
> > >>> only reason I'd expect to see it again is if there was a retransmission
> > >>> or something somehow requeued it up - but I don't think we do that
> > >>> anywhere. Not quite sure why it would be happening...
> > >>
> > >> But even if this package would have really been sent (as retransmission)
> > >> - shouldn't there be another response? T.38 has been successfully
> > >> enabled before and the faxclient has already sent a valid 200 ok
> > >> including complete SDP information to asterisk.
> > >>
> > >> All in all it looks really odd to me.
> > > 
> > > Depends on how we handle that scenario. I don't think we have any tests
> > > to cover it, so it's entirely possible that we wouldn't respond like
> > > that. Why it's happening in the first place I still don't know though,
> > > haven't seen anything like it.
> > 
> > Do you have any idea where to check if acted packages are really
> > removed? Is there a way to check the pjsip-queue? Where could I start to
> > look at? How does asterisk get them from the queue? And how does pjsip
> > know that asterisk has processed them?
> 
> The distributor is in res/res_pjsip/pjsip_distributor.c, the distributor
> function being the entry point. That function returning PJ_TRUE
> indicates to PJSIP that it has been handled and no subsequent modules
> should be called by that running thread. The distributor itself, though,
> ends up executing things further in a worker thread using the distribute
> function.

To be more detailed - PJSIP maintains no queue, a message comes in from
a transport and is given to modules until one says it has handled the
message. We place our distributor close to the transport and it puts the
message into a queue for handling in Asterisk ensuring serialization as
appropriate, returning that it has handled the message so no other
modules handle it at that time. Once the message is handled from the
queue it picks back up invoking modules at the point where the original
thread left off. This ensures messages are handled as quickly as
possible without blocking the transport but also provides guarantees on
ordering and simultaneous execution. (Two messages for the same call
will be handled in order, one at a time).

-- 
Joshua Colp
Digium, Inc. | Senior Software Developer
445 Jan Davis Drive NW - Huntsville, AL 35806 - US
Check us out at: www.digium.com & www.asterisk.org



More information about the asterisk-users mailing list