[Serusers] loose routing of BYE from UDP to TCP

Klaus Darilion klaus.mailinglists at pernau.at
Fri Sep 30 09:58:37 CEST 2005


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

no, as described in my previous email

> understanding thet URI params in Contact headers are optional so the UDP 
> UA need not return them.

They are not. Because as you see in your setup it will break things!

> 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.

That's a bad hack. Try to get a fix for the broken UA.

> 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.

Sounds like the UDP UA is broken.

> 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.


as described, it tells how to reach the hop targeted in the route 
header, not the next hop. See the following example:
UA1 has the contact: ip;t(ransport)=xxx


UA1        proxy1         proxy2      proxy3    proxy4   UA2
ip;t=xxx
            rr;t=TCP
                           rr;t=UDP
                                      rr;t=SCTP
                                                 rr;t=UDP


If now UA2 sends a BYE, we have the following protocols:

                                                    <--UDP--
                                           <--SCTP--
                                 <--UDP--
                 <----TCP------
<----XXX-----


hope this helps.
klaus

> 
> Mark
> 
> 
> On 9/29/05, *Cesc* <cesc.santa at gmail.com <mailto: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
>     <mailto: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
>         <mailto: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 <mailto:serusers at lists.iptel.org>
>>  http://lists.iptel.org/mailman/listinfo/serusers
> 
> 
> 
>         _______________________________________________
>         Serusers mailing list
>         serusers at lists.iptel.org <mailto:serusers at lists.iptel.org>
>         http://lists.iptel.org/mailman/listinfo/serusers
> 
> 
> 
> 




More information about the sr-users mailing list