2
0
Эх сурвалжийг харах

rr: new function loose_route_mode(vmode)

- if vmode==1, then do only loose routing (do not test if r-uri==myself
to do strict routing, always do loose routing, with preloaded check like
loose_route())
- if vmode==0, then behave like loose_route()
Daniel-Constantin Mierla 5 жил өмнө
parent
commit
9c97c700a7

+ 13 - 2
src/modules/rr/loose.c

@@ -990,9 +990,10 @@ done:
 /*!
  * \brief Do loose routing as per RFC3261
  * \param _m SIP message
+ * \param _mode - 0: try loose or strict routing; 1: try loose routing only
  * \return negative on failure or preloaded, 1 on success
  */
-int loose_route(struct sip_msg* _m)
+int loose_route_mode(sip_msg_t* _m, int _mode)
 {
 	int ret;
 
@@ -1012,7 +1013,7 @@ int loose_route(struct sip_msg* _m)
 	} else if (ret == 1) {
 		return after_loose(_m, 1);
 	} else {
-		if (is_myself(&_m->parsed_uri)) {
+		if ((_mode==0) && (is_myself(&_m->parsed_uri))) {
 			return after_strict(_m);
 		} else {
 			return after_loose(_m, 0);
@@ -1020,6 +1021,16 @@ int loose_route(struct sip_msg* _m)
 	}
 }
 
+/*!
+ * \brief Do loose routing as per RFC3261
+ * \param _m SIP message
+ * \return negative on failure or preloaded, 1 on success
+ */
+int loose_route(struct sip_msg* _m)
+{
+	return loose_route_mode(_m, 0);
+}
+
 /**
  *
  */

+ 11 - 2
src/modules/rr/loose.h

@@ -13,8 +13,8 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  *
- * You should have received a copy of the GNU General Public License 
- * along with this program; if not, write to the Free Software 
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
  */
 
@@ -44,6 +44,15 @@
 #define RR_PRELOADED -3		/*!< The next hop is determined from a preloaded route set */
 
 
+/*!
+ * \brief Do loose routing as per RFC3261
+ * \param _m SIP message
+ * \param _mode - 0: try loose or strict routing; 1: try loose routing only
+ * \return negative on failure or preloaded, 1 on success
+ */
+int loose_route_mode(sip_msg_t* _m, int _mode);
+
+
 /*!
  * \brief Do loose routing as per RFC3261
  * \param _m SIP message

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

@@ -75,6 +75,7 @@ static int it_list_fixup(void** param, int param_no);
 /* wrapper functions */
 static int w_loose_route(struct sip_msg *, char *, char *);
 static int w_loose_route_preloaded(struct sip_msg *, char *, char *);
+static int w_loose_route_mode(struct sip_msg *, char *, char *);
 static int w_record_route(struct sip_msg *, char *, char *);
 static int w_record_route_preset(struct sip_msg *,char *, char *);
 static int w_record_route_advertised_address(struct sip_msg *, char *, char *);
@@ -100,6 +101,8 @@ static cmd_export_t cmds[] = {
 			REQUEST_ROUTE},
 	{"loose_route_preloaded", (cmd_function)w_loose_route_preloaded,0, 0, 0,
 			REQUEST_ROUTE},
+	{"loose_route_mode", (cmd_function)w_loose_route_mode, 1, fixup_igp_null, fixup_free_igp_null,
+			REQUEST_ROUTE},
 	{"record_route",         (cmd_function)w_record_route,		0, 0, 0,
 			REQUEST_ROUTE|BRANCH_ROUTE|FAILURE_ROUTE},
 	{"record_route",         (cmd_function)w_record_route, 		1, it_list_fixup, 0,
@@ -273,7 +276,7 @@ static int direction_fixup(void** param, int param_no)
  */
 static int w_loose_route(struct sip_msg *msg, char *p1, char *p2)
 {
-	return loose_route(msg);
+	return loose_route_mode(msg, 0);
 }
 
 /**
@@ -282,7 +285,7 @@ static int w_loose_route(struct sip_msg *msg, char *p1, char *p2)
 static int w_loose_route_preloaded(sip_msg_t *msg, char *p1, char *p2)
 {
 	int ret;
-	ret = loose_route(msg);
+	ret = loose_route_mode(msg, 0);
 	if(ret == RR_PRELOADED) {
 		return 1;
 	}
@@ -290,7 +293,20 @@ static int w_loose_route_preloaded(sip_msg_t *msg, char *p1, char *p2)
 }
 
 /**
- * wrapper for loose_route_(msg)
+ * wrapper for loose_route_mode(msg, mode)
+ */
+static int w_loose_route_mode(struct sip_msg *msg, char *pmode, char *p2)
+{
+	int vmode = 0;
+	if(fixup_get_ivalue(msg, (gparam_t*)pmode, &vmode) < 0) {
+		LM_ERR("failed to get the mode parameter\n");
+		return -1;
+	}
+	return loose_route_mode(msg, vmode);
+}
+
+/**
+ * wrapper for loose_route_preloaded(msg)
  */
 static int ki_loose_route_preloaded(sip_msg_t *msg)
 {
@@ -302,6 +318,14 @@ static int ki_loose_route_preloaded(sip_msg_t *msg)
 	return -1;
 }
 
+/**
+ * wrapper for loose_route_mode(msg, vmode)
+ */
+static int ki_loose_route_mode(sip_msg_t *msg, int vmode)
+{
+	return loose_route_mode(msg, vmode);
+}
+
 /**
  * common wrapper for record_route(msg, sparams)
  */
@@ -852,6 +876,11 @@ static sr_kemi_t sr_kemi_rr_exports[] = {
 		{ SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE,
 			SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
 	},
+	{ str_init("rr"), str_init("loose_route_mode"),
+		SR_KEMIP_INT, ki_loose_route_mode,
+		{ SR_KEMIP_INT, SR_KEMIP_NONE, SR_KEMIP_NONE,
+			SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
+	},
 	{ str_init("rr"), str_init("remove_record_route"),
 		SR_KEMIP_INT, remove_record_route,
 		{ SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE,