Просмотр исходного кода

tm: drop replies behaviour based on cfg compat mode

- default behaviour for #!KAMAILIO is to drop replies after failure
  route to avoid selecting same reply during the next failure event
- for the rest of cases all replies are kept and used to select the
  code for new failure route (SER compat mode)
- t_drop_replies() can take one parameter
	- 'n[one]' - do not drop any reply (good for #!KAMAILIO mode)
	- 'l[ast]' - drop replies received during last serial forking step
	- 'a[ll]' - drop all replies

	- if the parameter is missing, then will drop all replies
Daniel-Constantin Mierla 16 лет назад
Родитель
Сommit
3ed668500c
3 измененных файлов с 27 добавлено и 6 удалено
  1. 16 4
      modules/tm/t_reply.c
  2. 1 1
      modules/tm/t_reply.h
  3. 10 1
      modules/tm/tm.c

+ 16 - 4
modules/tm/t_reply.c

@@ -138,6 +138,7 @@
 #include "t_lookup.h"
 #include "t_fwd.h"
 #include "../../fix_lumps.h"
+#include "../../sr_compat.h"
 #include "t_stats.h"
 #include "uac.h"
 
@@ -1124,7 +1125,10 @@ static enum rps t_should_relay_response( struct cell *Trans , int new_code,
 		Trans->flags&=~T_6xx; /* clear the 6xx flag , we want to 
 								 allow new branches from the failure route */
 
-		drop_replies = 0;
+		if(sr_cfg_compat==SR_COMPAT_KAMAILIO)
+			drop_replies = 1;
+		else
+			drop_replies = 0;
 		/* run ON_FAILURE handlers ( route and callbacks) */
 		if (unlikely(has_tran_tmcbs( Trans, TMCB_ON_FAILURE_RO|TMCB_ON_FAILURE)
 						|| Trans->on_negative )) {
@@ -1137,7 +1141,15 @@ static enum rps t_should_relay_response( struct cell *Trans , int new_code,
 									picked_code, extra_flags);
 			if (unlikely(drop_replies)) {
 				/* drop all the replies that we have already saved */
-				for (i=0; i<branch_cnt; i++) {
+				i = 0;
+				if(drop_replies==2)
+				{
+					for(i=branch_cnt-1; i>=0; i--)
+						if(Trans->uac[i].flags&TM_UAC_FLAG_FB)
+							break;
+					if(i<0) i=0;
+				}
+				for (; i<branch_cnt; i++) {
 					if (Trans->uac[i].reply &&
 					(Trans->uac[i].reply != FAKED_REPLY) &&
 					(Trans->uac[i].reply->msg_flags & FL_SHM_CLONE))
@@ -2237,14 +2249,14 @@ error:
 /* drops all the replies to make sure
  * that none of them is picked up again
  */
-void t_drop_replies(void)
+void t_drop_replies(int v)
 {
 	/* It is too risky to free the replies that are in shm mem
 	at the middle of failure_route block, because other functions might
 	need them as well. And it can also happen that the current reply is not yet
 	in shm mem, we are just going to clone it. So better to set a flag
 	and check it after failure_route has ended. (Miklos) */
-	drop_replies = 1;
+	drop_replies = v;
 }
 
 #if 0

+ 1 - 1
modules/tm/t_reply.h

@@ -153,7 +153,7 @@ int t_pick_branch_blind(struct cell *t, int *res_code);
 /* drops all the replies to make sure
  * that none of them is picked up again
  */
-void t_drop_replies(void);
+void t_drop_replies(int v);
 
 extern const char* rpc_reply_doc[2];
 void rpc_reply(rpc_t* rpc, void* c);

+ 10 - 1
modules/tm/tm.c

@@ -381,6 +381,8 @@ static cmd_export_t cmds[]={
 			REQUEST_ROUTE|ONREPLY_ROUTE|FAILURE_ROUTE|BRANCH_ROUTE },
 	{"t_drop_replies",    w_t_drop_replies,         0, 0,
 			FAILURE_ROUTE},
+	{"t_drop_replies",    w_t_drop_replies,         1, 0,
+			FAILURE_ROUTE},
 	{"t_save_lumps",      w_t_save_lumps,           0, 0,
 			REQUEST_ROUTE},
 	{"t_check_trans",	t_check_trans,				0, 0,
@@ -1725,7 +1727,14 @@ int t_grep_status(struct sip_msg* msg, char* status, char* bar)
  * that none of them is picked up again */
 static int w_t_drop_replies(struct sip_msg* msg, char* foo, char* bar)
 {
-	t_drop_replies();
+	if(foo==NULL)
+		t_drop_replies(1);
+	else if(*foo=='n')
+		t_drop_replies(0);
+	else if(*foo=='l')
+		t_drop_replies(2);
+	else
+		t_drop_replies(1);
 	return 1;
 }