[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:1.2.3.4 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.
Jan.
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