rem: reset_timer( hash_table, &uac->local_cancel.fr_timer);
add: reset_timer( &uac->local_cancel.fr_timer);
context: int t_on_reply( struct sip_msg  *p_msg ){	int msg_status;	char *ack;	unsigned int ack_len;	int branch;	/* has the transaction completed now and we need to clean-up? */	int reply_status;	branch_bm_t cancel_bitmap;	struct ua_client *uac;	struct cell *t;	/* make sure we know the assosociated transaction ... */	if (t_check( p_msg  , &branch )==-1)		return 1;	/*... if there is none, tell the core router to fwd statelessly */	t=get_t();	if ( t<=0 ) return 1;	cancel_bitmap=0;	msg_status=p_msg->REPLY_STATUS;	uac=&t->uac[branch];	DBG("DEBUG: t_on_reply: org. status uas=%d, "		"uac[%d]=%d local=%d is_invite=%d)\n",		t->uas.status, branch, uac->last_received, 		t->local, t->is_invite);	/* it's a cancel ... ? */	if (get_cseq(p_msg)->method.len==CANCEL_LEN 		&& memcmp( get_cseq(p_msg)->method.s, CANCEL, CANCEL_LEN)==0		/* .. which is not e2e ? ... */		&& t->is_invite ) {			/* ... then just stop timers */			reset_timer( hash_table, &uac->local_cancel.retr_timer);			if ( msg_status >= 200 )				reset_timer( hash_table, &uac->local_cancel.fr_timer);			DBG("DEBUG: reply to local CANCEL processed\n");			goto done;	}	/* *** stop timers *** */	/* stop retransmission */	reset_timer( hash_table, &uac->request.retr_timer);	/* stop final response timer only if I got a final response */	if ( msg_status >= 200 )		reset_timer( hash_table, &uac->request.fr_timer);	LOCK_REPLIES( t );	if (t->local) {		reply_status=local_reply( t, p_msg, branch, msg_status, &cancel_bitmap );	} else {		reply_status=relay_reply( t, p_msg, branch, msg_status, 			&cancel_bitmap );	}	if (reply_status==RPS_ERROR)		goto done;	/* acknowledge negative INVITE replies */		if (t->is_invite && (msg_status>=300 || (t->local && msg_status>=200))) {		ack = build_ack( p_msg, t, branch , &ack_len);		if (ack) {			SEND_PR_BUFFER( &uac->request, ack, ack_len );			shm_free(ack);		}	} /* ack-ing negative INVITE replies */	/* clean-up the transaction when transaction completed */	if (reply_status==RPS_COMPLETED) {		/* no more UAC FR/RETR (if I received a 2xx, there may		   be still pending branches ...		*/		cleanup_uac_timers( t );			if (t->is_invite) cancel_uacs( t, cancel_bitmap );		/* FR for negative INVITES, WAIT anything else */		set_final_timer( /* hash_table,*/ t );	} 	/* 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( hash_table, & uac->request.fr_timer,				FR_INV_TIMER_LIST );		} else {			/* non-invite: restart retransmisssions (slow now) */			uac->request.retr_list=RT_T2;			set_timer( hash_table, 				& uac->request.retr_timer, RT_T2 );		}	} /* provisional replies */done:#ifdef _OBSOLETED	/* moved to  script callback */	UNREF( t );	T=T_UNDEFINED;#endif	/* don't try to relay statelessly neither on success       (we forwarded statefuly) nor on error; on troubles, 	   simply do nothing; that will make the other party to 	   retransmit; hopefuly, we'll then be better off */	return 0;}