Pārlūkot izejas kodu

tm: new parameter reply_relay_mode

- control the behaviour introduced by 18410da0
- if set to 0, the behaviour is like before the commit referenced above,
tm is attemptime to send suspended 200ok after another final response
that was forwarded while 200ok was suspended
- default is 1 (behave as the patch changed the forwarding policy, not
to overwrite the response buffer)
Daniel-Constantin Mierla 4 gadi atpakaļ
vecāks
revīzija
90dfc421da
2 mainītis faili ar 20 papildinājumiem un 4 dzēšanām
  1. 15 4
      src/modules/tm/t_reply.c
  2. 5 0
      src/modules/tm/tm.c

+ 15 - 4
src/modules/tm/t_reply.c

@@ -109,6 +109,10 @@ extern int tm_remap_503_500;
 /* send path and flags in 3xx class reply */
 int tm_rich_redirect = 0;
 
+/* control if reply should be relayed
+ * when transaction reply status is RPS_PUSHED_AFTER_COMPLETION */
+extern int tm_reply_relay_mode;
+
 /* how to deal with winning branch reply selection in failure_route
  * can be overwritten per transaction with t_drop_replies(...)
  * Values:
@@ -2042,7 +2046,8 @@ enum rps relay_reply( struct cell *t, struct sip_msg *p_msg, int branch,
 			goto error02;
 		}
 
-		if (reply_status != RPS_PUSHED_AFTER_COMPLETION) {
+		if (tm_reply_relay_mode == 0
+				|| reply_status != RPS_PUSHED_AFTER_COMPLETION) {
 			/* attempt to copy the message to UAS's shmem:
 			 * - copy to-tag for ACK matching as well
 			 *   -  allocate little a bit more for provisional as
@@ -2102,7 +2107,9 @@ enum rps relay_reply( struct cell *t, struct sip_msg *p_msg, int branch,
 		}
 		if (likely(uas_rb->dst.send_sock)) {
 			if (onsend_route_enabled(SIP_REPLY) && p_msg
-						&& (p_msg != FAKED_REPLY) && (reply_status != RPS_PUSHED_AFTER_COMPLETION)) {
+						&& (p_msg != FAKED_REPLY)
+						&& (tm_reply_relay_mode == 0
+							|| reply_status != RPS_PUSHED_AFTER_COMPLETION)) {
 				if (run_onsend(p_msg, &uas_rb->dst, buf, res_len)==0){
 					su2ip_addr(&ip, &(uas_rb->dst.to));
 					LM_ERR("reply to %s:%d(%d) dropped"
@@ -2118,7 +2125,9 @@ enum rps relay_reply( struct cell *t, struct sip_msg *p_msg, int branch,
 			if (SEND_PR_BUFFER( uas_rb, buf, res_len ) >= 0){
 				LM_DBG("reply buffer sent out\n");
 				if (unlikely(!totag_retr
-							&& has_tran_tmcbs(t, TMCB_RESPONSE_OUT) && (reply_status != RPS_PUSHED_AFTER_COMPLETION))){
+							&& has_tran_tmcbs(t, TMCB_RESPONSE_OUT)
+							&& (tm_reply_relay_mode == 0
+								|| reply_status != RPS_PUSHED_AFTER_COMPLETION))){
 					LOCK_REPLIES( t );
 					if(relayed_code==uas_rb->rbtype) {
 						run_trans_callbacks_with_buf( TMCB_RESPONSE_OUT, uas_rb,
@@ -2130,7 +2139,9 @@ enum rps relay_reply( struct cell *t, struct sip_msg *p_msg, int branch,
 					}
 					UNLOCK_REPLIES( t );
 				}
-				if (unlikely(has_tran_tmcbs(t, TMCB_RESPONSE_SENT) && (reply_status != RPS_PUSHED_AFTER_COMPLETION))){
+				if (unlikely(has_tran_tmcbs(t, TMCB_RESPONSE_SENT)
+							&& (tm_reply_relay_mode == 0
+								|| reply_status != RPS_PUSHED_AFTER_COMPLETION))){
 					INIT_TMCB_ONSEND_PARAMS(onsend_params, t->uas.request,
 									relayed_msg, uas_rb, &uas_rb->dst, buf,
 									res_len,

+ 5 - 0
src/modules/tm/tm.c

@@ -222,6 +222,10 @@ str on_sl_reply_name = {NULL, 0};
 int tm_remap_503_500 = 1;
 str _tm_event_callback_lres_sent = {NULL, 0};
 
+/* control if reply should be relayed
+ * when transaction reply status is RPS_PUSHED_AFTER_COMPLETION */
+int tm_reply_relay_mode = 1;
+
 unsigned long tm_exec_time_check = 0; /* microseconds */
 int tm_exec_time_check_param = 5000; /* milliseconds */
 
@@ -480,6 +484,7 @@ static param_export_t params[]={
 	{"rich_redirect" ,      PARAM_INT, &tm_rich_redirect                     },
 	{"event_callback_lres_sent", PARAM_STR, &_tm_event_callback_lres_sent    },
 	{"exec_time_check" ,    PARAM_INT, &tm_exec_time_check_param             },
+	{"reply_relay_mode",    PARAM_INT, &tm_reply_relay_mode                  },
 	{0,0,0}
 };