[Serusers] loose routing of BYE from UDP to TCP

Jiri Kuthan jiri at iptel.org
Fri Sep 30 18:36:22 CEST 2005


At 07:19 PM 9/29/2005, Jan Janak wrote:
>The two Route header fields belong to SER (because it inserted
>corresponding Record-Route header fields), thus SER would only remove
>them -- the two Route header fields will be not used when SER decides
>where to send the request (and what transport to use).
>
>If there are no more Route header fields in the message then SER would
>forward to the URI specified in the Request-URI. If that URI contains no
>transport=tcp parameter then SER will forward over UDP.
>
>That is the explanation of what happens -- but I am not saying that this
>is the correct behavior. SER inserts two Route header field because the
>transport protocol has changed (the request was received over TCP but
>then was forwarded over UDP). In this case SER should probably forward
>the request over TCP regardless of the transport suggested by the
>Request-URI (former Contact). But I have to think about it a bit more. 

I beg to disagree. Route specifies how to get to SER (and is two-fold to
make sure SER is reachable from both sides), Contact dictates how to get to 
the next hop. Contacts may even get updated during dialog duration. 

-jiri


>I created a bug (SER-78) in the bug tracking system at 
>http://bugs.sip-router.org for now. But it is likely that this case 
>(two Route header fields inserted by SER) is not handled properly.
>
>Thanks for pointing this out.
>
>  Jan.
>
>On 29-09-2005 11:52, Mark Aiken wrote:
>> The problem is the other way. BYE from UDP to TCP. However I do see the
>> problem now.
>> 
>> Thanks Klaus for pointing me to the URI as it that is indeed the problem.
>> 
>> The TCP UA has transport=tcp in the Contact: header and SER correctly leave
>> that intact when forwarding to UDP. The UDP UA, when sending the loose
>> routed BYE back to SER, does not correctly add the URI param from the
>> Contact URI to the RURI.
>> 
>> I expected SER to not care about this because the rr params clearly have the
>> transport=tcp coming back in the local route header. Its also my
>> understanding thet URI params in Contact headers are optional so the UDP UA
>> need not return them.
>> 
>> Anyway, I've fix my problem by adding the transport=tcp param to the RURI in
>> the loose route section of the script prior to t_relay.
>> 
>> I dont know who is at fault here - the TCP UA, the UDP UA, or SER but since
>> there are many of these UAs in the field I needed to fix the problem.
>> 
>> I would like to know why transport=tcp is ignored in the Route header by
>> SER. If the RURI must have transport=tcp then why bother having it in the
>> Route header at all? I would think that information in the Route would trump
>> lack of information in the RURI.
>> 
>> Mark
>> 
>> 
>> On 9/29/05, Cesc <cesc.santa at gmail.com> wrote:
>> >
>> > I would say that as long as your UA's contact header registered in ser
>> > specifies UDP, t_relay should do the trick when receiving the bye (tcp) and
>> > relaying it (udp).
>> > It works in my lab :) I cannot be more specific as i am away now ...
>> > sorry.
>> >  Cesc
>> >
>> >  On 9/29/05, Mark Aiken <aiken.mark at gmail.com> wrote:
>> >
>> > > HI,
>> > >
>> > > The original RURI does have but when SER relays to UDP UA it places
>> > > transport=tcp in the Record-Route but not in the RURI to the UDP UA, which
>> > > seems correct to me.
>> > >
>> > > I guess the problem is when using relay_to_udp on an INVITE from a TCP
>> > > UA, to force SER to act as a TCP to UDP proxy, SER cant handle loose routing
>> > > new requests in the same dialog back via TCP.
>> > >
>> > > There seems to be no code in SER to handle this, from the small bits
>> > > I've looked at anyway. The information is in the rr params that SER added,
>> > > but SER just ignores the information on loose routed requests when the route
>> > > is a local one.
>> > >
>> > > Does anyone know if there is some special trick to get SER to handle
>> > > TCP<->UDP conversion of loose routed requests? Should the UA be adding the
>> > > transport=tcp from the rr param to the RURI of the BYE ( I would not think
>> > > so, since its the 2nd route added by SER anyway, not the topmost).
>> > >
>> > > For SER to work as a TCP<=>UDP proxy, one needs to "search" for the
>> > > transport=tcp, somehow be sure its in a local route header, and add the
>> > > transport=tcp to the uri before calling t_relay, I guess. I haven't tried
>> > > that yet. All this for loose routed requests.
>> > >
>> > > This seems like a lot of work in the .cfg file which is better done in
>> > > rr/tm module.
>> > >
>> > > I still think I must be doing something wrong as SER should handle this
>> > > automatically for loose routed requests.
>> > >
>> > > Is using relay_to_udp not the proper way to force TCP to UDP proxy of an
>> > > INVITE?
>> > >
>> > > Mark
>> > >
>> > > On 9/29/05, Klaus Darilion <klaus.mailinglists at pernau.at > wrote:
>> > > >
>> > > > Hi Mark!
>> > > >
>> > > > I do not know it exactly, but I think the important thing is the
>> > > > contact
>> > > > header URI of the INVITE. Does it contain a transport=tcp parameter?
>> > > > Otherwise, ser is correct when using UDP.
>> > > >
>> > > > klaus
>> > > >
>> > > > Mark Aiken wrote:
>> > > > > Hi,
>> > > > >
>> > > > > I'm having problems getting SER to (loose) route requests from UDP
>> > > > to
>> > > > > TCP. I'm not sure if the UA is at fault here or some SER config
>> > > > issue.
>> > > > >
>> > > > > SER receives an INVITE over TCP, record_route() is called and then
>> > > > the
>> > > > > request is relayed via UDP (t_relay_to_udp) to the UA. The
>> > > > > INVITE relayed to the UDP UA now has 2 Record-Route headers added by
>> > > >
>> > > > > SER. One has the transport=tcp parameter.
>> > > > >
>> > > > > Record-Route: <sip: xx.xx.xx.xx;r2=on;ftag=xyz;lr=on>
>> > > > > Record-Route: <sip:xx.xx.xx.xx;transport=tcp;r2=on;ftag=xyz>
>> > > > >
>> > > > > When the UA sends the BYE to SER, it has the 2 Route headers like so
>> > > > (on
>> > > > > a single line):
>> > > > >
>> > > > > Route:
>> > > > > <sip:xx.xx.xx.xx;r2=on;ftag=xyz;lr=on>,<sip:xx.xx.xx.xx
>> > > > ;transport=tcp;r2=on;ftag=xyz;lr=on>
>> > > > >
>> > > > > The SER script simply calls t_relay() in the loose_route section of
>> > > > the
>> > > > > script.
>> > > > >
>> > > > > I expected t_relay() to relay the BYE via TCP, since the Route
>> > > > header
>> > > > > has transport=tcp, but it sends the BYE via UDP instead.
>> > > > >
>> > > > > Anyone seen this problem before? Do I need to check for
>> > > > transport=tcp
>> > > > > and call t_relay_to_tcp, rather than using t_relay after
>> > > > loose_route()?
>> > > > >
>> > > > > Mark
>> > > > >
>> > > > >
>> > > > >
>> > > > ------------------------------------------------------------------------
>> > > > >
>> > > > > _______________________________________________
>> > > > > Serusers mailing list
>> > > > > serusers at lists.iptel.org
>> > > > > http://lists.iptel.org/mailman/listinfo/serusers
>> > > >
>> > > >
>> > >
>> > > _______________________________________________
>> > > Serusers mailing list
>> > > serusers at lists.iptel.org
>> > > http://lists.iptel.org/mailman/listinfo/serusers
>> > >
>> > >
>> > >
>> >
>
>> _______________________________________________
>> Serusers mailing list
>> serusers at lists.iptel.org
>> http://lists.iptel.org/mailman/listinfo/serusers
>
>_______________________________________________
>Serusers mailing list
>serusers at lists.iptel.org
>http://lists.iptel.org/mailman/listinfo/serusers

--
Jiri Kuthan            http://iptel.org/~jiri/ 




More information about the sr-users mailing list