rem: {  routed_msg_id = _m->id; routed_params = puri.params;  run_rr_callbacks( _m, &routed_params );
add: ) {  si = grep_sock_info( &puri.host, puri.port_no, puri.proto); if (si) { _m->force_send_socket = si; } else { LOG(L_WARN,"WARNING:rr:after_loose: no socket found for " "match second RR\n"); }
context: static inline int after_strict(struct sip_msg* _m){	int res, rem_len;	struct hdr_field* hdr;	struct sip_uri puri;	rr_t* rt, *prev;	char* rem_off;	str* uri;	hdr = _m->route;	rt = (rr_t*)hdr->parsed;	uri = &rt->nameaddr.uri;	if (parse_uri(uri->s, uri->len, &puri) < 0) {		LOG(L_ERR, "after_strict: Error while parsing the first route URI\n");		return RR_ERROR;	}#ifdef ENABLE_USER_CHECK	if (is_myself(&puri.user, &puri.host, puri.port_no))#else	if (is_myself(&puri.host, puri.port_no))#endif	{		/* set the hooks for the params -bogdan */		routed_msg_id = _m->id;		routed_params = puri.params;		/* run RR callbacks -bogdan */		run_rr_callbacks( _m, &routed_params );		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)) {				LOG(L_ERR, "after_strict: Cannot remove Route HF\n");				return RR_ERROR;			}			res = find_next_route(_m, &hdr);			if (res < 0) {				LOG(L_ERR, "after_strict: Error while searching next route\n");				return RR_ERROR;			}			if (res > 0) { /* No next route found */				DBG("after_strict: No next URI found\n");				return NOT_RR_DRIVEN;			}			rt = (rr_t*)hdr->parsed;		} else rt = rt->next;	}	uri = &rt->nameaddr.uri;	if (parse_uri(uri->s, uri->len, &puri) == -1) {		LOG(L_ERR, "after_strict: Error while parsing URI\n");		return RR_ERROR;	}	if (is_strict(&puri.params)) {		DBG("after_strict: Next hop: '%.*s' is strict router\n",			uri->len, ZSW(uri->s));		/* Previous hop was a strict router and the next hop is strict		 * router too. There is no need to save R-URI again because it		 * is saved already. In fact, in this case we will behave exactly		 * like a strict router. */		/* Note: when there is only one Route URI left (endpoint), it will		 * 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 (rewrite_uri(_m, uri) < 0) {			LOG(L_ERR, "after_strict: Error while rewriting request URI\n");			return RR_ERROR;		}				if (rt->next) {			rem_off = hdr->body.s;			rem_len = rt->next->nameaddr.name.s - hdr->body.s;		} else {			rem_off = hdr->name.s;			rem_len = hdr->len;		}		if (!del_lump(_m, rem_off - _m->buf, rem_len, 0)) {			LOG(L_ERR, "after_strict: Cannot remove Route HF\n");			return RR_ERROR;		}	} else {		DBG("after_strict: Next hop: '%.*s' is loose router\n", uri->len, ZSW(uri->s));		if (set_dst_uri(_m, uri) < 0) {			LOG(L_ERR, "after_strict: Error while setting dst_uri\n");			return RR_ERROR;		}		/* Next hop is a loose router - Which means that is is not endpoint yet		 * In This case we have to recover from previous strict routing, that 		 * means we have to find the last Route URI and put in in R-URI and 		 * remove the last Route URI. */		if (rt != hdr->parsed) {			/* There is a previous route uri which was 2nd uri of mine			 * and must be removed here */			rem_off = hdr->body.s;			rem_len = rt->nameaddr.name.s - hdr->body.s;			if (!del_lump(_m, rem_off - _m->buf, rem_len, 0)) {				LOG(L_ERR, "after_strict: Can't remove Route HF\n");				return RR_ERROR;			}		}		res = find_rem_target(_m, &hdr, &rt, &prev);		if (res < 0) {			LOG(L_ERR, "after_strict: Error while looking for last "				"Route URI\n");			return RR_ERROR;		} else if (res > 0) {			/* No remote target is an error */			return RR_ERROR;		}		uri = &rt->nameaddr.uri;		if (rewrite_uri(_m, uri) < 0) {			LOG(L_ERR, "after_strict: Can't rewrite R-URI\n");			return RR_ERROR;		}		/* The first character if uri will be either '<' when it is the 		 * only URI in a Route header field or ',' if there is more than 		 * one URI in the header field */		DBG("after_strict: The last route URI: '%.*s'\n", 			rt->nameaddr.uri.len, ZSW(rt->nameaddr.uri.s));		if (prev) {			rem_off = prev->nameaddr.name.s + prev->len;			rem_len = rt->nameaddr.name.s + rt->len - rem_off;		} else {			rem_off = hdr->name.s;			rem_len = hdr->len;		}		if (!del_lump(_m, rem_off - _m->buf, rem_len, 0)) {			LOG(L_ERR, "after_strict: Can't remove Route HF\n");			return RR_ERROR;		}	}		return RR_DRIVEN;}