[Serusers] Re: INVITE timeout
Greg Fausak
greg at august.net
Sun Feb 8 17:34:34 CET 2004
I'm thinking about a timer variable. Something like:
in h_table.h, add this:
typedef struct cell
{
/* linking data */
struct cell* next_cell;
struct cell* prev_cell;
....omitted.....
unsigned int inv_timer;
}
Then, in tm.c, something like (with the appropriate hooks):
inline static int w_t_inv_timeout( struct sip_msg* msg, char *go_to,
char *foo )
{
struct cell *t;
t = get_t();
if (!t || t==T_UNDEFINED) {
LOG(L_CRIT, "BUG: w_t_on_negative entered without t\n");
return -1;
}
t->inv_timer = (unsigned int)(long)go_to;
return 1;
}
Then, in timer.c, create a new function set_timer_val()
which is exactly like set_timer() except the timeout
value is passed to it:
void set_timer_val( struct timer_link *new_tl, enum lists list_id,
unsigned int timeout )
{
struct timer* list;
if (list_id<FR_TIMER_LIST || list_id>=NR_OF_TIMER_LISTS) {
LOG(L_CRIT, "ERROR: set_timer: unkown list: %d\n",
list_id);
#ifdef EXTRA_DEBUG
abort();
#endif
return;
}
list= &(timertable->timers[ list_id ]);
lock(list->mutex);
/* check first if we are on the "detached" timer_routine list,
* if so do nothing, the timer is not valid anymore
* (sideffect: reset_timer ; set_timer is not safe, a reseted timer
* might be lost, depending on this race condition ) */
if (new_tl->timer_list==DETACHED_LIST){
LOG(L_CRIT, "WARNING: set_timer called on a
\"detached\" timer"
" -- ignoring: %p\n", new_tl);
goto end;
}
/* make sure I'm not already on a list */
remove_timer_unsafe( new_tl );
add_timer_unsafe( list, new_tl, get_ticks()+timeout);
end:
unlock(list->mutex);
}
Then, in t_reply.c, something like:
int reply_received( struct sip_msg *p_msg )
{
....omitted.....
/* update FR/RETR timers on provisional replies */
if (msg_status<200) { /* provisional now */
if (t->is_invite) {
/* invite: change FR to longer FR_INV, do not
attempt to restart retransmission any more
*/
set_timer_val( & uac->request.fr_timer,
FR_INV_TIMER_LIST, t->inv_timer );
}
.....
Then, in your ser.cfg file you would do:
t_inv_timeout(120);
t_relay();
this would override the global, ie:
modparam("tm","fr_inv_timer",25)
What do you think? I think I can get it to work. It is in
the tm module. Is this desirable? I think it would solve
my problem. Also, I think it would allow for some other neat
things, like user controllable timeout before voicemail is
called.
---greg
Greg Fausak wrote:
> I have an INVITE timeout problem.
>
> My SIP layout includes:
>
>
> +---------------+
> | EXTERNAL PSTN |
> | SIP SERVERS |
> +---------------+
> |
> |
> +---------------+
> | MAIN INCOMING |
> | SIP SERVER |
> +---------------+
> | |
> | |
> +------------+ +-----------------+
> | SIP SERVER | | SIP SERVER |
> | DOMAINA.com| | OtherDom.com |
> +------------+ +-----------------+
> | |
> | |
> +----------+ +---------+
> | customerA| |otherCust|
> +----------+ +---------+
>
> I hope the ASCII drawing worked!
>
> Calls come in from the top down.
> The MAIN INCOMING server uses internal ENUM
> to deliver the call to the correct domain
> server. Once delivered to that server,
> if the customer does not answer his phone before
> an INVITE timeout occurs the call is forwarded to
> voicemail.
>
> This works great when the call is from an external PSTN
> server. It also works great if a user in DOMAINA.com calls another
> user in DOMAINA.com.
>
> I am experiencing difficulty when a user in DOMAINA.com
> calls a user in OtherDom.com. The SER at DOMAINA.com
> recognizes that INVITE is going to a foreign domain, and it
> t_relays() the INVITE to the MAIN INCOMING SER. It then gets
> t_relayed() to OtherDom.com where the call is delivered.
>
> The problem is both use the same INVITE timer, so the TIMEOUT
> on DOMAINA.com occurs *before* the TIMEOUT on OtherDom.com, which
> means that the call is not delivered to voicemail.
>
> Any ideas?
>
> ---greg
>
>
>
>
More information about the sr-users
mailing list