[sr-dev] git:master: modules/rr: Double-route and outbound support in loose.c

Peter Dunkley peter.dunkley at crocodile-rcs.com
Wed Apr 24 17:35:48 CEST 2013


Module: sip-router
Branch: master
Commit: 1e84948d120ef2b1206f90458d47486239cfd81b
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=1e84948d120ef2b1206f90458d47486239cfd81b

Author: Peter Dunkley <peter.dunkley at crocodile-rcs.com>
Committer: Peter Dunkley <peter.dunkley at crocodile-rcs.com>
Date:   Wed Apr 24 14:24:45 2013 +0100

modules/rr: Double-route and outbound support in loose.c

- Have removed outbound support from strict routing for now as it was incorrect
  and I don't have a system to test with.

---

 modules/rr/loose.c |  110 +++++++++++++++++++++++-----------------------------
 1 files changed, 49 insertions(+), 61 deletions(-)

diff --git a/modules/rr/loose.c b/modules/rr/loose.c
index 50c4774..ad19e81 100644
--- a/modules/rr/loose.c
+++ b/modules/rr/loose.c
@@ -571,7 +571,7 @@ static inline int after_strict(struct sip_msg* _m)
 	char* rem_off;
 	str uri;
 	struct socket_info *si;
-	int use_ob, next_is_strict;
+	int next_is_strict;
 
 	hdr = _m->route;
 	rt = (rr_t*)hdr->parsed;
@@ -588,14 +588,11 @@ static inline int after_strict(struct sip_msg* _m)
 	}
 
 	next_is_strict = is_strict(&puri.params);
-	if ((use_ob = process_outbound(_m, puri.user, &uri)) < 0) {
-		LM_ERR("processing outbound flow-token\n");
-		return FLOW_TOKEN_BROKEN;
-	}
 
-	if (!use_ob && enable_double_rr && is_2rr(&puri.params) && is_myself(&puri)) {
+	if (enable_double_rr && is_2rr(&puri.params) && is_myself(&puri)) {
 		/* double route may occure due different IP and port, so force as
 		 * send interface the one advertise in second Route */
+
 		si = grep_sock_info( &puri.host, puri.port_no, puri.proto);
 		if (si) {
 			set_force_socket(_m, si);
@@ -650,11 +647,9 @@ static inline int after_strict(struct sip_msg* _m)
 		 * always be a strict router because endpoints don't use ;lr parameter
 		 * In this case we will simply put the URI in R-URI and forward it, 
 		 * which will work perfectly */
-		if (!use_ob) {
-			if(get_maddr_uri(&uri, &puri)!=0) {
-				LM_ERR("failed to check maddr\n");
-				return RR_ERROR;
-			}
+		if(get_maddr_uri(&uri, &puri)!=0) {
+			LM_ERR("failed to check maddr\n");
+			return RR_ERROR;
 		}
 		if (rewrite_uri(_m, &uri) < 0) {
 			LM_ERR("failed to rewrite request URI\n");
@@ -676,11 +671,9 @@ static inline int after_strict(struct sip_msg* _m)
 		LM_DBG("Next hop: '%.*s' is loose router\n",
 			uri.len, ZSW(uri.s));
 
-		if (!use_ob) {
-			if(get_maddr_uri(&uri, &puri)!=0) {
-				LM_ERR("failed to check maddr\n");
-				return RR_ERROR;
-			}
+		if(get_maddr_uri(&uri, &puri)!=0) {
+			LM_ERR("failed to check maddr\n");
+			return RR_ERROR;
 		}
 		if (set_dst_uri(_m, &uri) < 0) {
 			LM_ERR("failed to set dst_uri\n");
@@ -745,10 +738,7 @@ static inline int after_strict(struct sip_msg* _m)
 	if(routed_params.len > 0)
 		run_rr_callbacks( _m, &routed_params );
 
-	if (use_ob == 1)
-	    return RR_OB_DRIVEN;
-	else
-	    return RR_DRIVEN;
+	return RR_DRIVEN;
 }
 
 
@@ -767,7 +757,8 @@ static inline int after_loose(struct sip_msg* _m, int preloaded)
 	int status;
 	str uri;
 	struct socket_info *si;
-	int uri_is_myself, use_ob, next_is_strict;
+	int uri_is_myself, next_is_strict;
+	int use_ob = 0;
 
 	hdr = _m->route;
 	rt = (rr_t*)hdr->parsed;
@@ -784,12 +775,6 @@ static inline int after_loose(struct sip_msg* _m, int preloaded)
 	next_is_strict = is_strict(&puri.params);
 	routed_params = puri.params;
 	uri_is_myself = is_myself(&puri);
-	if ((use_ob = process_outbound(_m, puri.user, &uri)) < 0) {
-		LM_ERR("processing outbound flow-token\n");
-		return FLOW_TOKEN_BROKEN;
-	}
-
-	LM_DBG("process_outbound returned <%d>\n", use_ob);
 
 	/* IF the URI was added by me, remove it */
 	if (uri_is_myself>0)
@@ -799,6 +784,11 @@ static inline int after_loose(struct sip_msg* _m, int preloaded)
 		/* set the hooks for the params */
 		routed_msg_id = _m->id;
 
+		if ((use_ob = process_outbound(_m, puri.user, &uri)) < 0) {
+			LM_ERR("processing outbound flow-token\n");
+			return FLOW_TOKEN_BROKEN;
+		}
+
 		if (!rt->next) {
 			/* No next route in the same header, remove the whole header
 			 * field immediately
@@ -808,10 +798,6 @@ static inline int after_loose(struct sip_msg* _m, int preloaded)
 				return RR_ERROR;
 			}
 
-			/* When using outbound skip past all this stuff and just set
- 			   the destination */
-			if (use_ob) goto got_uri;
-
 			res = find_next_route(_m, &hdr);
 			if (res < 0) {
 				LM_ERR("failed to find next route\n");
@@ -825,14 +811,15 @@ static inline int after_loose(struct sip_msg* _m, int preloaded)
 			rt = (rr_t*)hdr->parsed;
 		} else rt = rt->next;
 
-		if (!use_ob) {
-			if (enable_double_rr && is_2rr(&puri.params)) {
-				/* double route may occure due different IP and port, so force as
-				 * send interface the one advertise in second Route */
-				if (parse_uri(rt->nameaddr.uri.s,rt->nameaddr.uri.len,&puri)<0) {
-					LM_ERR("failed to parse the double route URI\n");
-					return RR_ERROR;
-				}
+		if (enable_double_rr && is_2rr(&puri.params)) {
+			/* double route may occure due different IP and port, so force as
+			 * send interface the one advertise in second Route */
+			if (parse_uri(rt->nameaddr.uri.s,rt->nameaddr.uri.len,&puri)<0) {
+				LM_ERR("failed to parse the double route URI\n");
+				return RR_ERROR;
+			}
+
+			if (!use_ob) {
 				si = grep_sock_info( &puri.host, puri.port_no, puri.proto);
 				if (si) {
 					set_force_socket(_m, si);
@@ -840,28 +827,30 @@ static inline int after_loose(struct sip_msg* _m, int preloaded)
 					if (enable_socket_mismatch_warning)
 						LM_WARN("no socket found for match second RR\n");
 				}
-	
-				if (!rt->next) {
-					/* No next route in the same header, remove the whole header
-					 * field immediately */
-					if (!del_lump(_m, hdr->name.s - _m->buf, hdr->len, 0)) {
-						LM_ERR("failed to remove Route HF\n");
-						return RR_ERROR;
-					}
-					res = find_next_route(_m, &hdr);
-					if (res < 0) {
-						LM_ERR("failed to find next route\n");
-						return RR_ERROR;
-						}
-					if (res > 0) { /* No next route found */
-						LM_DBG("no next URI found\n");
-						status = (preloaded ? NOT_RR_DRIVEN : RR_DRIVEN);
-						goto done;
-					}
-					rt = (rr_t*)hdr->parsed;
-				} else rt = rt->next;
 			}
-			
+
+			if (!rt->next) {
+				/* No next route in the same header, remove the whole header
+				 * field immediately */
+				if (!del_lump(_m, hdr->name.s - _m->buf, hdr->len, 0)) {
+					LM_ERR("failed to remove Route HF\n");
+					return RR_ERROR;
+				}
+				res = find_next_route(_m, &hdr);
+				if (res < 0) {
+					LM_ERR("failed to find next route\n");
+					return RR_ERROR;
+					}
+				if (res > 0) { /* No next route found */
+					LM_DBG("no next URI found\n");
+					status = (preloaded ? NOT_RR_DRIVEN : RR_DRIVEN);
+					goto done;
+				}
+				rt = (rr_t*)hdr->parsed;
+			} else rt = rt->next;
+		}
+		
+		if (!use_ob) {
 			uri = rt->nameaddr.uri;
 			if (parse_uri(uri.s, uri.len, &puri) < 0) {
 				LM_ERR("failed to parse the first route URI\n");
@@ -889,7 +878,6 @@ static inline int after_loose(struct sip_msg* _m, int preloaded)
 	} else {
 		/* Next hop is loose router */
 		LM_DBG("Next URI is a loose router\n");
-got_uri:
 
 		if (!use_ob) {
 			if(get_maddr_uri(&uri, &puri)!=0) {




More information about the sr-dev mailing list