I'm still confused. I try to write it down in my own words as far as I understand it and hope that somebody will confirm or correct my statements:
So, loose_route does the rewritting of the req-URI (strict routing) and removing of route headers if there are Route: headers in the request. After that, the request should be routable by t_relay.
The loose_route function will rewrite the req-URI of "strict_routing" messages. So the if(uri==myself) statement shouldn't be TRUE anymore, or does this statement checks the original req-URI?
What is the reason why the BYE message from xlite (loose route) does not trigger the execution of the (loose_route()){...} block. This would be nice, so I could do the security checks before forwarding to the PSTN gateway for both UAs at the same place. Otherwise I would have to do it 2 times (1x for Messenger in the loose_route{ } block, and 1x for xlite after the loose_route{ } block.
regards, klaus
Jan Janak wrote:
On 25-02 17:26, Klaus Darilion wrote:
Hi!
Once again I'm stucked in the loose routing topic, maybe some can answer my question!
I have ser configured to use RR. At the top of my ser.cfg I have:
# loose-route processing log(1, "check loose_route ..."); if (loose_route()) { log(1, "loose_route processing, finished routing!\n"); t_relay(); break; }; log(1, "no loose_route processing\n");
...
Client A is xlite, which is a loose router, and Client B is Windows Messenger 4.7, which is a strict router. One client calls the other client, which accepts the call. Then the client hangs up.
If client A hangs up (xlite, loose router) the loose_route(){...} block will not be processed and the BYE is handled by the following routing logic. If client B (strict router) hangs up, the loose_route(){...} block will be executed.
So, why is the request from xlite (loose router) not treated in the loose_route block?
IMHO, I would suggest that both requests (loose and strict) should be handled be the loose_route block. Also RFC3261 (16.4) says that "strict router" request should be transformed into a loose routing request (writing the last Route header field into the req-URI and remove this route header field) and than be handled like all other requests.
First of all loose routing or strict routing (depends on the Route header fields) is performed even if loose_route function returns 0.
There are some situations in which the message will have the IP address of the server in the Request-URI and the message, in fact, will be routed elsewhere (to the IP in the topmost Route header field).
In this case subsequent if (uri==myself) would match which is wrong. Therefore loose_route will return 1 in this situation. Note well that inside the if (loose_route()) condition the message will be not sent to the host from Request-URI (!).
loose_route function is RFC3261 compliant, it performs both loose and strict routing, depending on the routeset.
Please speak up if I did not explain it clearly enough and I will try to make some examples. I am aware that this is hard to understand but you should understand it well otherwise you might introduce some security holes to your config (especially when routing to a PSTN gateway).
Jan.