[Kamailio-Users] Multiple SIP Proxy Environment / Socket Information

Daniel-Constantin Mierla miconda at gmail.com
Wed Apr 29 11:02:32 CEST 2009


Hello,

On 04/29/2009 10:53 AM, Brandon Armstead wrote:
> Hey guys,
>
>     Still facing a few challenges and seeing if any further input, I'm 
> specifically trying inaki's suggestions / method, but here are the 
> current problems:
>
> sip:/etc/kamailio/m4cfgs# tail -f /var/log/openser.log | grep -v -E 
> 'non-local|repeated' | grep branch_route
> Apr 29 07:38:05 db06 /sbin/kamailio[21279]: 
> [77e4c600-147767fb at 172.16.1.35 
> <mailto:77e4c600-147767fb at 172.16.1.35>][branch_route][1] 
> ru=sip:CALLEE at 99.XX.XX.XX:5079 fu=sip:CALLER at sip.example.com 
> <mailto:sip%3ACALLER at sip.example.com> tu=sip:CALLEE at sip.example.com 
> <mailto:sip%3ACALLEE at sip.example.com> si=99.XX.XX.XX flag=96 du=<null>
>
> This call is not sent to Proxy B (this is a result of bflag not being 
> set) ???
is the proxy B at 99.XX.XX.XX:5079? If not, then set $du to the address 
of that proxy. It is null in the log above.

Cheers,
Daniel

> My question is "Why", I look at the AOR / usrloc and they both have 
> the "same exact flags set", this call is rather sent directly to UAC 
> endpoint.
>
> ---
>
> Apr 29 07:38:05 db06 /sbin/kamailio[21279]: 
> [77e4c600-147767fb at 172.16.1.35 
> <mailto:77e4c600-147767fb at 172.16.1.35>][branch_route][2] 
> ru=sip:CALLEE at 99.XX.XX.XX:5062 fu=sip:CALLER at sip.example.com 
> <mailto:sip%3ACALLER at sip.example.com> tu=sip:CALLEE at sip.example.com 
> <mailto:sip%3ACALLEE at sip.example.com> si=99.XX.XX.XX flag=64 
> du=sip:PROXY_B;transport=udp;
>
> This call is sent to Proxy B (however Proxy B) - however the X-Duri 
> (is null) as it is not existant in Proxy A's branch route? should I 
> save this from right after the lookup("location") result into an avp?
>
>
> Again, thank you for all and any help, thanks!
>
> On Mon, Apr 27, 2009 at 5:42 PM, Brandon Armstead <brandon at cryy.com 
> <mailto:brandon at cryy.com>> wrote:
>
>     Klaus, Inaki, Daniel,
>
>         Thanks!  Sorry I did not see this email come through, I'm
>     going to go ahead and give this method a go, and I'll update with
>     the results, I have optimistic views.
>
>     As for the reason I was rewriting $ru and setting $du to null, is
>     because originally when I just changed $du to the 'destination
>     proxy' it did not seem to work at all (I do not even recall what
>     exactly what was happening) however I decided to just change $ru,
>     and have the other proxy just "lookup" the usrloc information
>     again.  Again, this method looks interesting and I'll let you guys
>     know how it goes, thanks for all the input and help!
>
>     Sincerely,
>     Brandon.
>
>
>     On Fri, Apr 24, 2009 at 1:18 AM, Klaus Darilion
>     <klaus.mailinglists at pernau.at
>     <mailto:klaus.mailinglists at pernau.at>> wrote:
>
>
>
>         Brandon Armstead schrieb:
>
>             Klaus,
>
>                So I took you and Inaki's input and essentially
>             constructed a setup like so after the lookup("location") call:
>
>             if(isbflagset(1)){
>                $du = null;
>                $rd = "P1";
>             } else if(isbflagset(2)){
>                $du = null;
>                $rd = "P2";
>             } else if(isbflagset(3)){
>                $du = null;
>                $rd = "P3";
>             } else if(isbflagset(4)){
>                $du = null;
>                $rd = "P4";
>             }
>
>
>         1. The above code has to be in the branch_route block -
>         otherwise multiple registrations of a single user are not
>         handled correctly.
>
>         2. you are rewriting the RURI. You should not do that as some
>         clients wants to the in the RURI the Contact provided during
>         REGISTER.
>
>         3. probably you use fix_nated_register() to store the public
>         IP:port of the client too. After lookup, this information is
>         written to DURI. Thus, by setting $du you overwrite this info.
>         You should put it into a special header so that you can
>         restore it in the other proxy.
>
>         Here a snippet how it should work (untested, no warranty): ( I
>         use the term "originating" proxy for the proxy which received
>         the INVITE and the term "serving" proxy for the proxy which
>         handles the connection/registration of a certain SIP client).
>
>         e.g:
>         Alice -----INVITE-----> P1------->P2----->Bob2
>                                /  \
>                               /    \
>                              /      V
>                             V       P3---->Bob3
>                          Bob1
>
>         Bob's client Bob1 is connected to P1.
>         Bob's client Bob2 is connected to P2.
>         Bob's client Bob3 is connected to P3.
>
>         So, P1 is the originating proxy. P2 is the serving proxy of
>         Bob2. ....
>
>         We do NAT traversal (note: we must not call
>         fix_nated_contact() for messages sent between the proxies!):
>         the originating proxy for the call-leg to the caller, the
>         serving proxy for the call-leg to the callee.
>         The RTP proxy will be managed by the originating proxy only.
>
>
>
>         route{
>         if (loose_route()) {
>          ... additional loose route processing...
>          if (check_route_param("rtpproxy=yes")) {
>            force_rtp_proxy();
>            setbflag(7);
>          }
>
>          # downstream: in-dialog request is in the same direction as the
>          # initial request
>          if ( (check_route_param("nat=caller") &&
>         is_direction("downstream"))
>            || (check_route_param("nat=callee") &&
>         is_direction("upstream"))) {
>            fix_nated_contact();
>          } else if (check_route_param("nat=both") {
>            fix_nated_contact();
>            setbflag(8);
>          } else {
>            setbflag(8);
>          }
>
>          t_on_reply("1");
>          t_relay();
>          exit();
>         }
>         ...
>
>         # I am proxy 1
>         if ((src_ip=ip.of.proxy.2) || (src_ip=ip.of.proxy.3)...) {
>          # request comes from other proxy, that means I am the
>          # serving proxy
>          # do not lookup(), RURI is already set and
>          # DURI is provided in our X-DURI header
>          $du = $header(X-DURI);
>          # we do not care about an RTP proxy because that's the task
>         of the
>          # proxy which performed the lookup() (the originating proxy)
>          # add some record-route cookie to mark that we should perform
>          # SIP NAT traversal for the callee
>          add_rr_param(";nat=callee");
>          # activate reply_route to fix_nated_contact of callee
>          setbflag(8); # flag 8 = fix contact
>          t_on_reply("1");
>          record_route();
>          t_relay();
>          exit;
>         }
>
>         ...
>         # a new request - thus I am the originating proxy
>
>         if ($dU looks like phone number) {
>           ... route to Gateway....
>          exit;
>         }
>
>         if (!lookup("location")) {
>          sl_send_reply("404","not found");
>          exit;
>         }
>         # activate branch route to have dedicated routing per branch
>         t_on_branch("1");
>
>         # activate reply route to activate RTP proxy
>         t_on_reply("1");
>
>         # NAT traversal
>         fix_nated_contact();
>
>         record_route();
>         t_relay();
>         exit;
>         }
>
>         branch_route[1]{
>          if(isbflagset(1)){
>           # oh, that's me
>
>           # add some record-route cookie to mark that we should perform
>           # SIP NAT traversal for the callee and caller
>           add_rr_param(";nat=both");
>
>           # add some record-route cookie to mark that we are
>           # in charge for the RTP proxy
>           add_rr_param(";rtpproxy=yes");
>
>           force_rtp_proxy();
>           setbflag(7); # flag 7 = RTP proxy
>          } else {
>           # add some record-route cookie to mark that we should perform
>           # SIP NAT traversal for the caller
>           add_rr_param(";nat=caller");
>
>           # we have to route the request to the serving proxy
>           # write DURI in the header
>           append_hf("X-DURI: $du");
>           if(isbflagset(2)){
>               $du = sip:ip.of.proxy.2;transport=udp;
>           } else if(isbflagset(3)){
>               $du = sip:ip.of.proxy.3;transport=udp;
>           } else if(isbflagset(4)){
>               $du = sip:ip.of.proxy.4;transport=udp;
>           }
>          }
>         }
>
>         reply_route[1]{
>          if (isbflagset(7) && has_body("application/sdp")) {
>            force_rtp_proxy()
>          }
>          if (isbflagset(8)) {
>            fix_nated_contact()
>          }
>         }
>
>
>
>         Note: this code does not care about the received socket of the
>         proxy. Thus it works if the proxy listens only on one port.
>
>         regards
>         klaus
>
>
>             On each Proxy, I changed the code appropriately excluding
>             the Proxy from itself (so it does not forward to itself).
>              I'm noticing weird behavior however as it seems as if
>             what is happening is it created other issues such as:
>
>             [INCOMING SERVER] -> P1 -> P2 -> P1 -> (loop?)
>
>             Also I setup this test amongst two development servers (in
>             which case it worked without issues).  Once I included in
>             more development instances into the ring it seemed as if
>             the flags were being set when they should not be?
>
>             I.e. I placed a call FROM UA1 (with bflag 5 SET) From the
>             above example configuration ^ code.  If you notice (flag
>             5) is missing.  To UA2 (Flag 3), again this looked to be
>             doing some strange things such as acting as if another
>             flag was set when it should not have been, thus forwarding
>             to the wrong proxy or the wrong proxy order.  Do you guys
>             have any further thoughts or input on this?  Thanks!
>
>             On Thu, Apr 23, 2009 at 12:31 AM, Klaus Darilion
>             <klaus.mailinglists at pernau.at
>             <mailto:klaus.mailinglists at pernau.at>
>             <mailto:klaus.mailinglists at pernau.at
>             <mailto:klaus.mailinglists at pernau.at>>> wrote:
>
>                Hi Brandon!
>
>                Back to the original email ....
>
>                Brandon Armstead schrieb:
>
>                    Hello guys,
>
>                       Is there a method upon using lookup("location")
>             to also pull
>                    out the "socket" information for the original
>             location the UAC
>                    registered to, for scenarios of this example:
>
>                    P1 & P2 share same usrloc database.
>
>                    UA1 registers to P1
>                    UA2 registers to P2
>
>                    UA1 calls UA2
>
>                    UA1 invites -> P1 -> INVITES -> UA2 (bypassing P2
>             -- where the
>                    actual nat binding is).
>
>                    Now upon P1 looking up usrloc for UA2, I would like
>             to recognize
>                    that P1 is not the Proxy to deliver the call, and
>             forward the
>                    request to P2 to send to UA2.
>
>                    So currently I have:
>
>                    UA1 INVITE -> P1 INVITE -> UA2
>
>                    I wish to have:
>
>                    UA1 INVITE -> P1 INVITE -> P2 INVITE -> UA2
>
>                    Is there an easy method to do this?  I have been
>             looking at the
>                    new nat traversal module it looks like it is doable
>             with this
>                    (any further input as far as that?).  Also is it
>             possible with
>                    the classic Nat Helper module?  Any input is
>             appreciated, thanks!
>
>
>                I think the nat_traversal module can not help you in
>             this case, nor
>                nathelper.
>
>                One possibility would be to spoof at P1 the IP address
>             of P2 -
>                nevertheless this would cause the reply sent back to
>             P2, but the
>                transaction is created in P1. (and you need to hack
>             Kamailio for IP
>                spoofing).
>
>                Another easy solution would be: In P1 set a certain
>             branch-flag when
>                the client registers, e.g. bflag 1. In P2 set a certain
>             branch-flag
>                when the client registers, e.g. bflag 2.
>
>                Now, if a user is called, just make a lookup() and
>             t_relay. Further
>                in the branch_route check if:
>                 in P1: isbflagset(2) --> forward to P2
>                 in P2: isbflagset(1) --> forward to P1
>
>                klaus
>
>
>
>
>
>
>
>                  
>              ------------------------------------------------------------------------
>
>                    _______________________________________________
>                    Kamailio (OpenSER) - Users mailing list
>                    Users at lists.kamailio.org
>             <mailto:Users at lists.kamailio.org>
>             <mailto:Users at lists.kamailio.org
>             <mailto:Users at lists.kamailio.org>>
>
>                  
>              http://lists.kamailio.org/cgi-bin/mailman/listinfo/users
>                  
>              http://lists.openser-project.org/cgi-bin/mailman/listinfo/users
>
>
>
>
> ------------------------------------------------------------------------
>
> _______________________________________________
> Kamailio (OpenSER) - Users mailing list
> Users at lists.kamailio.org
> http://lists.kamailio.org/cgi-bin/mailman/listinfo/users
> http://lists.openser-project.org/cgi-bin/mailman/listinfo/users

-- 
Daniel-Constantin Mierla
http://www.asipto.com/




More information about the Users mailing list