In some situations ser inserts two Route header fields (for example UDP->TCP traversal). Such route header fields have a special parameter so that ser knows that there are two of them and it should remove both of them when processing the message, example:
Route: sip:12@ser.host;lr;r2 Route: sip:23@ser.host;lr;r2
Unfortunately there are many broken implementations that remove unknown parameter from Route header fields and even such that remove lr parameter so ser can receive:
Route: sip:12@ser.host Route: sip:23@ser.host
If a previous host was a strict router, you will receive:
METHOD sip:12@ser.host SIP/2.0 Route: sip:23@ser.host
loose_route will rewrite the Request-URI with the route header field and you will have a message with the IP of your server in the Request-URI.
Now imagine what happends if uri == myself follows.
That's one case, another case is when you receive message like this:
METHOD sip:1.2.3.4@callee Route: sip:your_server;lr Route: sip:foreing_server;lr
Route containing your_server will be removed because it belongs to your server and the message will be forwarded to "foreign_server". But the Request-URI does contain a different value -- so all subsequent tests in the config file which operate on the Request-URI will be wrong.
loose_route returns 1 in those two cases and 0 in all other. When loose_route returns 1, you know that you should just apply all security restrictions (like when forwarding to a PSTN gateway) and send the message. All the tests and modification which are performed when you are processing a request establishing a dialog should not be applied here.
Jan.
On 26-02 17:23, Klaus Darilion wrote:
Andrei Pelinescu-Onciul wrote:
On Feb 25, 2004 at 18:56, Klaus Darilion klaus.mailinglists@pernau.at wrote:
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?
No, it checks the "new" uri, so in the strict router case you are right, it won't match (of course assuming the new uri!= proxy). In the loose router case, the message will be sent to the loose route uri (not to the request uri) and the request uri will not be changed, so your uri==myself could match although the message will be sent elsewhere.
I'm still confused ... the BYE request from Windows Messenger with a route-set will be handled be the if(loose_route()){...} block, but not the BYE request from Xlite with a route-set. But shouldn't also the BYE from Xlite be processed in the if(loose_route()){...} block? I don't want to care about in-dialog requests in my routing logic which deals with voicemail, hunt groups ...
An other possibility would be to remove the t_relay in the loose_route block, so that all in-dialog requests (Messenger and xlite) are processed by the following routing logic.
thanks, klaus