[Serusers] loose routing problem

Jan Janak jan at iptel.org
Thu Feb 26 23:23:16 CET 2004

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 at ser.host;lr;r2>
Route: <sip:23 at 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 at ser.host>
Route: <sip:23 at ser.host>

If a previous host was a strict router, you will receive:

METHOD sip:12 at ser.host SIP/2.0
Route: <sip:23 at 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: at 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.


On 26-02 17:23, Klaus Darilion wrote:
> Andrei Pelinescu-Onciul wrote:
> >On Feb 25, 2004 at 18:56, Klaus Darilion <klaus.mailinglists at 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

More information about the sr-users mailing list