Table of Contents
SIP Transaction Timers
The timers of the tm module can be confusing and normally you do not have to (or should) tweak timers except the `fr_inv_timer` (controlling "how long to ring"). The table below gives an overview of the timers that can be changed from SER configuration file and their relationship to the timer names in RFC3261 and how/why you would want to change it.
modparam("tm", "fr_timer", 30000) # default value of 30s.
Timers have a resolution of 1/TIMER_TICKS_HZ. This is by default 62.5 ms. Thus, the timer can fire every 62.5 ms. Note that this also is the error interval (they can fire anywhere in a 62.5 ms interval from their "theoretical" expire point).
fr_timer
This timer is used for all SIP requests. It hits if no reply
for an INVITE request or other request has been received (F in milliseconds).
If a provisional reply is received for an INVITE (any 1xx), then the
fr_inv_timer
will be used instead. And if no replies (at all) for an INVITE
are received before `fr_timer` hits, the transaction is terminated with a 408
in failure route.
See fr_inv_timer
for description of handling of multiple branches and local
generation of 408 vs. 408s received from the network etc.
Intention of the RFC is having this value equal to the time required to send seven requests.
- Corresponding RFC 3261 timers: Timer F and Timer B
- Default value: 30000 ms
- Example: modparam("tm", "fr_timer", 20000)
This timer can also be changed per transaction (INVITE) by calling
t_set_fr(timeout_fr_inv, timeout_fr);
in a route section of the configuration file. If one of the vaules is 0, the
corresponding timer won't be changed (e.g t_set_fr(0, 15000)
changes only the
fr_timer
).
If it was changed using t_set_fr() for a transaction, it can be reset to the default value
using t_reset_fr().
fr_inv_timer
This is the timer which hits if no final reply for an INVITE arrives after a provisional message was received (in milliseconds). This means that this timer controls how long time a phone will ring before a 408 timeout is generated in failure_route. Note that it will not always be the 108 reply that will be seen in the failure_route as SER will choose a reply from all the replies received on all the branches and the "winner" will get to the failure route.
- Corresponding RFC 3261 timers: Timer C
- Default value: 120000 ms
- Example: modparam("tm", "fr_inv_timer", 100000)
This timer can also be changed per transaction (INVITE) by calling
t_set_fr(timer_fr_inv, timeout_fr)
in a route section of the configuration
file. If one of the vaules is 0, the corresponding timer won't be changed (e.g
t_set_fr(0, 15000)
changes only the fr_timer
).
The tm module parameter restart_fr_on_each_reply
controls whether the
fr_inv_timer
is restarted every time a provisonal reply is received, default
is 1 (yes).
Setting the parameter to 0 is not RFC conformant but is very usefull for dealing with phones that will periodically retransmit the 18x Ringing, which otherwise could make the transaction live forever or mess up your voicemail activation.
In the failure route, the new tm module functions:
t_branch_timeout
t_branch_replied
t_any_timeout
t_any_replied
can be used to find out if the failure route is executed as a result of a timeout (even if the selected reply is a 408, it could be something forwarded from downstream and not a local timeout), and if it is a timeout, to find out which kind (no reply or "ringing").
if (!t_branch_timeout() && t_check_status("408")) ... # a 408 received from the network. if (t_branch_timeout() && ! t_branch_replied()) ... # a local transaction timed out w/o any reply received. if (t_branch_timeout() && t_branch_replied()) ... # a local timeout after some provsional reply.
Even more script functions:
t_any_timeout
: true if any of the transaction branches did timeoutt_any_replied
: true if at least one branch received a reply (when used from an on_reply route it will ignore the "current" reply)t_is_canceled
: true if the current transaction has been canceled
For more information see the documentation of tm module (especially t_set_fr() and t_reset_fr()).
wt_timer
Time for which a transaction stays in memory to absorb delayed messages after it is completed. Also, when this timer hits, retransmissions of local CANCELs are stopped.
- Corresponding RFC 3261 timers: Timer I and Timer K
- Default value: 5000 ms
- Example: modparam("tm", "wt_timer", 10000)
Within this time, retransmissions will be absorbed by the server. After this time, the transaction is cleared and late retransmissions not recognized. Increase if there is an extreme problem with late retransmissions.
retr_timer1
Initial retransmission timer (for everything). On the first retransmit of
INVITEs, timer A is set to this value. For each subsequent retransmit, the
timer value is doubled until fr_timer
hits (RFC 3261: Timer B).
For non-INVITE transactions, the timer is set to
MIN(4 * retr_timer1, retr_timer2) until fr_timer
hits (RFC 3261: Timer F).
- Corresponding RFC 3261 timers: Timer T1, initial value for A, E, and G.
- Default value: 500 ms
- Example: modparam("tm", "retr_timer1", 1000)
If you have a network with very long roundtrip time (above 1 sec), you may
increase this value (but change fr_timer
as well).
retr_timer2
The maximum length between two retransmits (for everything).
- Corresponding RFC 3261 timers: Timer T2, maximum value for A, E, and G.
- Default value: 4000 ms
- Example: modparam("tm", "retr_timer2", 8000)
max_inv_lifetime
Maximum time an INVITE transaction is allowed to be active (in milliseconds). After this interval has passed from the transaction creation, the transaction will be either moved into the wait state or in the final response retransmission state, irrespective of the transaction fr_inv_timer and fr_timer values.
An INVITE transaction will be kept in memory for maximum: max_inv_lifetime+fr_timer(from the ack to the final reply wait)+wt_timer.
The main difference between this timer and fr_inv_timer is that the fr_inv_timer is per branch, while max_inv_lifetime is per the whole transaction. Even on a per branch basis fr_inv_timer could be restarted. For example, by default if restart_fr_on_each_reply is not cleared, the fr_inv_timer will be restarted for each received provisional reply. Even if restart_fr_on_each_reply is not set the fr_inv_timer will still be restarted for each increasing reply (e.g. 180, 181, 182, …). Another example when a transaction can live substantially more then its fr_inv_timer and where max_inv_lifetime will help is when dns failover is used (each failed dns destination can introduce a new branch). The default value is 180000 ms (180 seconds - the rfc3261 timer C value).
See also: max_noninv_lifetime, t_set_max_lifetime() (allows changing max_inv_lifetime on a per transaction basis), t_reset_max_lifetime fr_timer, wt_timer, restart_fr_on_each_reply.
Example:
modparam("tm", "max_inv_lifetime", 150000)
max_noninv_lifetime
Maximum time a non-INVITE transaction is allowed to be active (in milliseconds). After this interval has passed from the transaction creation, the transaction will be either moved into the wait state or in the final response retransmission state, irrespective of the transaction fr_timer value. It's the same as max_inv_lifetime, but for non-INVITEs.
A non-INVITE transaction will be kept in memory for maximum: max_noninv_lifetime+wt_timer.
The main difference between this timer and fr_timer is that the fr_timer is per branch, while max_noninv_lifetime is per the whole transaction. An example when a transaction can live substantially more then its fr_timer and where max_noninv_lifetime will help is when dns failover is used (each failed dns destination can introduce a new branch).
The default value is 32000 ms (32 seconds - the rfc3261 timer F value).
See also: max_inv_lifetime, t_set_max_lifetime() (allows changing max_noninv_lifetime on a per transaction basis), t_reset_max_lifetime fr_timer, wt_timer.
delete_timer
This is the amount of time for which the deletion of a transaction will be delayed if the transaction is still use.
- Corresponding RFC 3261 timers: No corresponding timer, SER specific
- Default value: 200 ms
- Example: modparam("tm", "retr_timer1", 1000)
In general there's no need to change it except for testing ways to minimize the memory consumption (setting it to 100ms might help).