freetdm: update glare.txt doc
This commit is contained in:
parent
3594419622
commit
771caca78d
|
@ -1,29 +1,25 @@
|
|||
Glare is a PITA.
|
||||
|
||||
Although configuration of ISDN links can be done to minimize glare, to be pedantic we must have a clear policy
|
||||
Although configuration of ISDN links can be done to minimize glare, we also must have a clear policy
|
||||
on how the FreeTDM API is supposed to behave on glare across signaling modules.
|
||||
|
||||
There is a well-known race in the FreeTDM API since the beginning. When a user wants to place a call there is 2 APIs that
|
||||
must be used:
|
||||
There is a well-known race in the FreeTDM API since the beginning. When a user wants to place a call with
|
||||
the old APIs:
|
||||
|
||||
1. ftdm_channel_open_xx (to hunt the channel by group, span or select a channel individually)
|
||||
2. ftdm_channel_call_place() to place the actual call.
|
||||
|
||||
Since the user has no access to channel locking, between opening a channel and placing a call, an incoming call could be
|
||||
received. Therefore the user needs to be aware of the following:
|
||||
received. Therefore things can get complicated and that is why you should STOP USING those 2 deprecated functions.
|
||||
|
||||
1. Between ftdm_channel_open_xx and ftdm_channel_call_place() a SIGEVENT_START can be received, if the user application
|
||||
is smart enough, upon receive of SIGEVENT_START it can avoid doing anything else with the channel (from an outgoing call perspective)
|
||||
since that channel is now a channel owned by the incoming call. It can for example hunt another channel using
|
||||
ftdm_channel_open_xx again and avoid calling ftdm_channel_call_place. However, if the app is not smart enough and still calls
|
||||
ftdm_channel_call_place even though already received FTDM_SIGEVENT_START on that channel, ftdm_channel_call_place will return
|
||||
FTDM_BREAK to inform the user the outgoing call could not be placed and that there is already an incoming call on that channel.
|
||||
The replacement is ftdm_call_place().
|
||||
|
||||
2. If SIGEVENT_START was not received before calling ftdm_channel_call_place, it could still come while ftdm_channel_call_place()
|
||||
is being executed, in such situation ftdm_channel_place_call() will return FTDM_BREAK to inform the user the call could
|
||||
not be placed due to glare and the incoming call won the channel, he user should back off since the channel is
|
||||
now owned by the incoming call (it can touch the channel having in mind there is now an incoming call on it)
|
||||
ftdm_call_place receives the information required to hunt the channel and place the call.
|
||||
|
||||
3. After ftdm_channel_call_place returns, if glare is detected and the signaling stack decides to drop the local call, a regular
|
||||
If glare is detected after placing the call and the signaling stack decides to drop the local call, a regular
|
||||
SIGEVENT_STOP will be sent with the hangup cause FTDM_CAUSE_REQUESTED_CHAN_UNAVAIL.
|
||||
|
||||
ftdm_call_place may return FTDM_BREAK if glare is detected while placing the call, in such cases you can try
|
||||
calling ftdm_call_place again to hunt another channel.
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue