瀏覽代碼

rr: new parameter force_send_socket

- if set to 1, the socket is also forced for single rr
- default is 0, socket is forced only for doubgle rr
- if use outbound is set, socket is not forced
Daniel-Constantin Mierla 7 年之前
父節點
當前提交
93739c0b86
共有 2 個文件被更改,包括 37 次插入18 次删除
  1. 32 15
      src/modules/rr/loose.c
  2. 5 3
      src/modules/rr/rr_mod.c

+ 32 - 15
src/modules/rr/loose.c

@@ -60,6 +60,7 @@ static unsigned int routed_msg_id = 0;
 static int routed_msg_pid = 0;
 static str routed_params = {0,0};
 
+extern int rr_force_send_socket;
 
 /*!
  * \brief Test whether we are processing pre-loaded route set by looking at the To tag
@@ -736,7 +737,7 @@ static inline int after_strict(struct sip_msg* _m)
 			return RR_ERROR;
 		}
 	}
-	
+
 	/* run RR callbacks only if we have Route URI parameters */
 	if(routed_params.len > 0)
 		run_rr_callbacks( _m, &routed_params );
@@ -745,6 +746,30 @@ static inline int after_strict(struct sip_msg* _m)
 }
 
 
+static inline void rr_do_force_send_socket(sip_msg_t *_m, sip_uri_t *puri,
+		rr_t* rt, int rr2on)
+{
+	socket_info_t *si;
+
+	if ((si = grep_sock_info(&puri->host,
+				puri->port_no?puri->port_no:proto_default_port(puri->proto),
+				puri->proto)) != 0) {
+		set_force_socket(_m, si);
+	} else if ((si = grep_sock_info(&puri->host, puri->port_no,
+					puri->proto)) != 0) {
+		set_force_socket(_m, si);
+	} else {
+		if (enable_socket_mismatch_warning && rr2on) {
+			LM_WARN("no socket found to match second RR (%.*s)\n",
+					rt->nameaddr.uri.len, ZSW(rt->nameaddr.uri.s));
+			if(!is_myself(puri)) {
+				LM_WARN("second RR uri is not myself (%.*s)\n",
+						rt->nameaddr.uri.len, ZSW(rt->nameaddr.uri.s));
+			}
+		}
+	}
+}
+
 /*!
  * \brief Previous hop was a loose router, handle this case
  * \param _m SIP message
@@ -795,6 +820,11 @@ static inline int after_loose(struct sip_msg* _m, int preloaded)
 			return FLOW_TOKEN_BROKEN;
 		}
 
+		if (rr_force_send_socket && !use_ob) {
+			if (!enable_double_rr || !is_2rr(&puri.params)) {
+				rr_do_force_send_socket(_m, &puri, rt, 0);
+			}
+		}
 		if (!rt->next) {
 			/* No next route in the same header, remove the whole header
 			 * field immediately
@@ -827,20 +857,7 @@ static inline int after_loose(struct sip_msg* _m, int preloaded)
 			}
 
 			if (!use_ob) {
-				if ((si = grep_sock_info( &puri.host, puri.port_no?puri.port_no:proto_default_port(puri.proto), puri.proto)) != 0) {
-					set_force_socket(_m, si);
-				} else if ((si = grep_sock_info( &puri.host, puri.port_no, puri.proto)) != 0) {
-					set_force_socket(_m, si);
-				} else {
-					if (enable_socket_mismatch_warning) {
-						LM_WARN("no socket found to match second RR (%.*s)\n",
-								rt->nameaddr.uri.len, ZSW(rt->nameaddr.uri.s));
-						if(!is_myself(&puri)) {
-							LM_WARN("second RR uri is not myself (%.*s)\n",
-								rt->nameaddr.uri.len, ZSW(rt->nameaddr.uri.s));
-						}
-					}
-				}
+				rr_do_force_send_socket(_m, &puri, rt, 1);
 			}
 
 			if (!rt->next) {

+ 5 - 3
src/modules/rr/rr_mod.c

@@ -57,6 +57,7 @@ int append_fromtag = 1;		/*!< append from tag by default */
 int enable_double_rr = 1;	/*!< enable using of 2 RR by default */
 int enable_full_lr = 0;		/*!< compatibilty mode disabled by default */
 int add_username = 0;	 	/*!< do not add username by default */
+int rr_force_send_socket = 0; /*!< control if socket is forced by rr */
 int enable_socket_mismatch_warning = 1; /*!< enable socket mismatch warning */
 static str custom_user_spec = {NULL, 0};
 pv_spec_t custom_user_avp;
@@ -120,15 +121,16 @@ static cmd_export_t cmds[] = {
  * \brief Exported parameters
  */
 static param_export_t params[] ={
-	{"append_fromtag",	INT_PARAM, &append_fromtag},
+	{"append_fromtag",	    INT_PARAM, &append_fromtag},
 	{"enable_double_rr",	INT_PARAM, &enable_double_rr},
 	{"enable_full_lr",		INT_PARAM, &enable_full_lr},
 #ifdef ENABLE_USER_CHECK
-	{"ignore_user",		PARAM_STR, &i_user},
+	{"ignore_user",		    PARAM_STR, &i_user},
 #endif
 	{"add_username",		INT_PARAM, &add_username},
 	{"enable_socket_mismatch_warning",INT_PARAM,&enable_socket_mismatch_warning},
-	{"custom_user_avp",           PARAM_STR, &custom_user_spec},
+	{"custom_user_avp",     PARAM_STR, &custom_user_spec},
+	{"force_send_socket",   PARAM_INT, &rr_force_send_socket},
 	{0, 0, 0 }
 };