Bläddra i källkod

- recover all avps in failure and onreply routers
- fixed small nit in an error message

Jan Janak 19 år sedan
förälder
incheckning
d002d02daa
5 ändrade filer med 75 tillägg och 24 borttagningar
  1. 18 6
      modules/tm/h_table.c
  2. 6 2
      modules/tm/h_table.h
  3. 18 6
      modules/tm/t_hooks.c
  4. 32 9
      modules/tm/t_reply.c
  5. 1 1
      modules/tm/tm_load.c

+ 18 - 6
modules/tm/h_table.c

@@ -160,8 +160,10 @@ void free_cell( struct cell* dead_cell )
 	}
 
 	/* free the avp list */
-	if (dead_cell->user_avps)
-		destroy_avp_list_unsafe( &dead_cell->user_avps );
+	if (dead_cell->user_avps_from)
+		destroy_avp_list_unsafe( &dead_cell->user_avps_from );
+	if (dead_cell->user_avps_to)
+		destroy_avp_list_unsafe( &dead_cell->user_avps_to );
 
 	/* the cell's body */
 	shm_free_unsafe( dead_cell );
@@ -240,11 +242,20 @@ struct cell*  build_cell( struct sip_msg* p_msg )
 	/* timers */
 	init_cell_timers(new_cell);
 
-	/* move the current avp list to transaction -bogdan */
-	old = set_avp_list(AVP_TRACK_FROM | AVP_CLASS_USER,  &new_cell->user_avps );
-	new_cell->user_avps = *old;
+	old = set_avp_list(AVP_TRACK_FROM | AVP_CLASS_USER,  &new_cell->user_avps_from );
+	new_cell->user_avps_from = *old;
 	*old = 0;
 
+	old = set_avp_list(AVP_TRACK_TO | AVP_CLASS_USER,  &new_cell->user_avps_to );
+	new_cell->user_avps_to = *old;
+	*old = 0;
+
+	     /* We can just store pointer to domain avps in the transaction context,
+	      * because they are read-only
+	      */
+	new_cell->domain_avps_from = get_avp_list(AVP_TRACK_FROM | AVP_CLASS_DOMAIN);
+	new_cell->domain_avps_to = get_avp_list(AVP_TRACK_TO | AVP_CLASS_DOMAIN);
+
 	/* enter callback, which may potentially want to parse some stuff,
 	 * before the request is shmem-ized */
 	if ( p_msg && has_reqin_tmcbs() )
@@ -271,7 +282,8 @@ struct cell*  build_cell( struct sip_msg* p_msg )
 	return new_cell;
 
 error:
-	destroy_avp_list(&new_cell->user_avps);
+	destroy_avp_list(&new_cell->user_avps_from);
+	destroy_avp_list(&new_cell->user_avps_to);
 	shm_free(new_cell);
 	/* unlink transaction AVP list and link back the global AVP list (bogdan)*/
 	reset_avps();

+ 6 - 2
modules/tm/h_table.h

@@ -239,8 +239,12 @@ typedef struct cell
 	 * forwarded or passed to UAC; note that there can be arbitrarily 
 	 * many due to downstream forking; */
 	struct totag_elem *fwded_totags;
-	/* list with user avp */
-	struct usr_avp *user_avps;
+
+	     /* list with avp */
+	struct usr_avp *user_avps_from;
+	struct usr_avp *user_avps_to;
+	struct usr_avp *domain_avps_from;
+	struct usr_avp *domain_avps_to;
 	
 	/* protection against concurrent reply processing */
 	ser_lock_t   reply_mutex;

+ 18 - 6
modules/tm/t_hooks.c

@@ -172,7 +172,7 @@ void run_trans_callbacks( int type , struct cell *trans,
 {
 	static struct tmcb_params params = {0,0,0,0};
 	struct tm_callback    *cbp;
-	avp_list_t* backup;
+	avp_list_t* backup_from, *backup_to, *backup_dom_from, *backup_dom_to;
 
 	params.req = req;
 	params.rpl = rpl;
@@ -181,7 +181,10 @@ void run_trans_callbacks( int type , struct cell *trans,
 	if (trans->tmcb_hl.first==0 || ((trans->tmcb_hl.reg_types)&type)==0 )
 		return;
 
-	backup = set_avp_list(AVP_CLASS_USER | AVP_TRACK_FROM, &trans->user_avps );
+	backup_from = set_avp_list(AVP_CLASS_USER | AVP_TRACK_FROM, &trans->user_avps_from );
+	backup_to = set_avp_list(AVP_CLASS_USER | AVP_TRACK_TO, &trans->user_avps_to );
+	backup_dom_from = set_avp_list(AVP_CLASS_DOMAIN | AVP_TRACK_FROM, &trans->domain_avps_from);
+	backup_dom_to = set_avp_list(AVP_CLASS_DOMAIN | AVP_TRACK_TO, &trans->domain_avps_to);
 	for (cbp=trans->tmcb_hl.first; cbp; cbp=cbp->next)  {
 		if ( (cbp->types)&type ) {
 			DBG("DBG: trans=%p, callback type %d, id %d entered\n",
@@ -190,7 +193,10 @@ void run_trans_callbacks( int type , struct cell *trans,
 			cbp->callback( trans, type, &params );
 		}
 	}
-	set_avp_list(AVP_CLASS_USER | AVP_TRACK_FROM, backup );
+	set_avp_list(AVP_CLASS_DOMAIN | AVP_TRACK_TO, backup_dom_to );
+	set_avp_list(AVP_CLASS_DOMAIN | AVP_TRACK_FROM, backup_dom_from );
+	set_avp_list(AVP_CLASS_USER | AVP_TRACK_TO, backup_to );
+	set_avp_list(AVP_CLASS_USER | AVP_TRACK_FROM, backup_from );
 }
 
 
@@ -199,7 +205,7 @@ void run_reqin_callbacks( struct cell *trans, struct sip_msg *req, int code )
 {
 	static struct tmcb_params params = {0,0,0,0};
 	struct tm_callback    *cbp;
-        avp_list_t* backup;
+	avp_list_t* backup_from, *backup_to, *backup_dom_from, *backup_dom_to;
 
 	params.req = req;
 	params.code = code;
@@ -207,12 +213,18 @@ void run_reqin_callbacks( struct cell *trans, struct sip_msg *req, int code )
 	if (req_in_tmcb_hl->first==0)
 		return;
 
-	backup = set_avp_list(AVP_CLASS_USER | AVP_TRACK_FROM, &trans->user_avps );
+	backup_from = set_avp_list(AVP_CLASS_USER | AVP_TRACK_FROM, &trans->user_avps_from );
+	backup_to = set_avp_list(AVP_CLASS_USER | AVP_TRACK_TO, &trans->user_avps_to );
+	backup_dom_from = set_avp_list(AVP_CLASS_DOMAIN | AVP_TRACK_FROM, &trans->domain_avps_from);
+	backup_dom_to = set_avp_list(AVP_CLASS_DOMAIN | AVP_TRACK_TO, &trans->domain_avps_to);
 	for (cbp=req_in_tmcb_hl->first; cbp; cbp=cbp->next)  {
 		DBG("DBG: trans=%p, callback type %d, id %d entered\n",
 			trans, cbp->types, cbp->id );
 		params.param = &(cbp->param);
 		cbp->callback( trans, cbp->types, &params );
 	}
-	set_avp_list(AVP_CLASS_USER | AVP_TRACK_FROM, backup );
+	set_avp_list(AVP_CLASS_DOMAIN | AVP_TRACK_TO, backup_dom_to );
+	set_avp_list(AVP_CLASS_DOMAIN | AVP_TRACK_FROM, backup_dom_from );
+	set_avp_list(AVP_CLASS_USER | AVP_TRACK_TO, backup_to );
+	set_avp_list(AVP_CLASS_USER | AVP_TRACK_FROM, backup_from );
 }

+ 32 - 9
modules/tm/t_reply.c

@@ -491,7 +491,8 @@ static inline void faked_env( struct cell *t,struct sip_msg *msg)
 	static enum route_mode backup_mode;
 	static struct cell *backup_t;
 	static unsigned int backup_msgid;
-	static avp_list_t* backup_list;
+	static avp_list_t* backup_user_from, *backup_user_to;
+	static avp_list_t* backup_domain_from, *backup_domain_to;
 	static struct socket_info* backup_si;
 
 	if (msg) {
@@ -514,7 +515,11 @@ static inline void faked_env( struct cell *t,struct sip_msg *msg)
 		global_msg_id=msg->id;
 		set_t(t);
 		/* make available the avp list from transaction */
-		backup_list = set_avp_list(AVP_TRACK_FROM | AVP_CLASS_USER, &t->user_avps );
+
+		backup_user_from = set_avp_list(AVP_TRACK_FROM | AVP_CLASS_USER, &t->user_avps_from );
+		backup_user_to = set_avp_list(AVP_TRACK_TO | AVP_CLASS_USER, &t->user_avps_to );
+		backup_domain_from = set_avp_list(AVP_TRACK_FROM | AVP_CLASS_DOMAIN, &t->domain_avps_from );
+		backup_domain_to = set_avp_list(AVP_TRACK_TO | AVP_CLASS_DOMAIN, &t->domain_avps_to );
 		/* set default send address to the saved value */
 		backup_si=bind_address;
 		bind_address=t->uac[0].request.dst.send_sock;
@@ -524,7 +529,10 @@ static inline void faked_env( struct cell *t,struct sip_msg *msg)
 		global_msg_id=backup_msgid;
 		rmode=backup_mode;
 		/* restore original avp list */
-		set_avp_list(AVP_TRACK_FROM | AVP_CLASS_USER, backup_list );
+		set_avp_list(AVP_TRACK_FROM | AVP_CLASS_USER, backup_user_from );
+		set_avp_list(AVP_TRACK_TO | AVP_CLASS_USER, backup_user_to );
+		set_avp_list(AVP_TRACK_FROM | AVP_CLASS_DOMAIN, backup_domain_from );
+		set_avp_list(AVP_TRACK_TO | AVP_CLASS_DOMAIN, backup_domain_to );
 		bind_address=backup_si;
 	}
 }
@@ -1270,7 +1278,8 @@ int reply_received( struct sip_msg  *p_msg )
 	struct ua_client *uac;
 	struct cell *t;
 	str next_hop;
-	avp_list_t* backup_list;
+	avp_list_t* backup_user_from, *backup_user_to;
+	avp_list_t* backup_domain_from, *backup_domain_to;
 
 	/* make sure we know the associated transaction ... */
 	if (t_check( p_msg  , &branch )==-1)
@@ -1342,13 +1351,20 @@ int reply_received( struct sip_msg  *p_msg )
 		/* transfer transaction flag to message context */
 		if (t->uas.request) p_msg->flags=t->uas.request->flags;
 		/* set the as avp_list the one from transaction */
-		backup_list = set_avp_list(AVP_TRACK_FROM | AVP_CLASS_USER, &t->user_avps );
+
+		backup_user_from = set_avp_list(AVP_TRACK_FROM | AVP_CLASS_USER, &t->user_avps_from );
+		backup_user_to = set_avp_list(AVP_TRACK_TO | AVP_CLASS_USER, &t->user_avps_to );
+		backup_domain_from = set_avp_list(AVP_TRACK_FROM | AVP_CLASS_DOMAIN, &t->domain_avps_from );
+		backup_domain_to = set_avp_list(AVP_TRACK_TO | AVP_CLASS_DOMAIN, &t->domain_avps_to );
 		if (run_actions(onreply_rt.rlist[t->on_reply], p_msg)<0)
 			LOG(L_ERR, "ERROR: on_reply processing failed\n");
 		/* transfer current message context back to t */
 		if (t->uas.request) t->uas.request->flags=p_msg->flags;
 		/* restore original avp list */
-		set_avp_list( AVP_TRACK_FROM | AVP_CLASS_USER, backup_list );
+		set_avp_list( AVP_TRACK_FROM | AVP_CLASS_USER, backup_user_from );
+		set_avp_list( AVP_TRACK_TO | AVP_CLASS_USER, backup_user_to );
+		set_avp_list( AVP_TRACK_FROM | AVP_CLASS_DOMAIN, backup_domain_from );
+		set_avp_list( AVP_TRACK_TO | AVP_CLASS_DOMAIN, backup_domain_to );
 	}
 	LOCK_REPLIES( t );
 	if ( is_local(t) ) {
@@ -1390,11 +1406,18 @@ int reply_received( struct sip_msg  *p_msg )
 					((msg_status>=180) || (last_uac_status==0)) )
 			) ) { /* provisional now */
 		if (is_invite(t)) {
-			backup_list = set_avp_list(AVP_TRACK_FROM | AVP_CLASS_USER, 
-										&t->user_avps );
+			backup_user_from = set_avp_list(AVP_TRACK_FROM | AVP_CLASS_USER, &t->user_avps_from );
+			backup_user_to = set_avp_list(AVP_TRACK_TO | AVP_CLASS_USER, &t->user_avps_to );
+			backup_domain_from = set_avp_list(AVP_TRACK_FROM | AVP_CLASS_DOMAIN, &t->domain_avps_from );
+			backup_domain_to = set_avp_list(AVP_TRACK_TO | AVP_CLASS_DOMAIN, &t->domain_avps_to );
+
 			restart_rb_fr(& uac->request, t->fr_inv_timeout);
 			uac->request.flags|=F_RB_FR_INV; /* mark fr_inv */
-			set_avp_list(AVP_TRACK_FROM | AVP_CLASS_USER,  backup_list );
+
+			set_avp_list( AVP_TRACK_FROM | AVP_CLASS_USER, backup_user_from );
+			set_avp_list( AVP_TRACK_TO | AVP_CLASS_USER, backup_user_to );
+			set_avp_list( AVP_TRACK_FROM | AVP_CLASS_DOMAIN, backup_domain_from );
+			set_avp_list( AVP_TRACK_TO | AVP_CLASS_DOMAIN, backup_domain_to );
 		}
 	} /* provisional replies */
 

+ 1 - 1
modules/tm/tm_load.c

@@ -44,7 +44,7 @@ int load_tm( struct tm_binds *tmb)
 {
 	if (!tm_init) {
 		LOG(L_ERR, "tm:load_tm: Module not initialized yet, make sure that all modules that need"
-		    " tm module are loaded before tm in the configuration file\n");
+		    " tm module are loaded after tm in the configuration file\n");
 		return -1;
 	}