Module: sip-router
Branch: pd/outbound
Commit: e00d77f710fe36dca08f099306c837ef7e53309f
URL:    
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=e00d77f710fe36dca08f099306c837ef7e53309f

Author: Peter Dunkley <[email protected]>
Committer: Peter Dunkley <[email protected]>
Date:   Mon Dec 31 15:36:00 2012 +0000

modules_k/outbound: filled in use_outbound() function

---

 modules_k/outbound/ob_mod.c |  122 ++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 116 insertions(+), 6 deletions(-)

diff --git a/modules_k/outbound/ob_mod.c b/modules_k/outbound/ob_mod.c
index 6f16b59..7234044 100644
--- a/modules_k/outbound/ob_mod.c
+++ b/modules_k/outbound/ob_mod.c
@@ -25,11 +25,15 @@
 #include "../../basex.h"
 #include "../../dprint.h"
 #include "../../dset.h"
+#include "../../forward.h"
 #include "../../ip_addr.h"
 #include "../../mod_fix.h"
 #include "../../sr_module.h"
 #include "../../lib/kcore/kstats_wrapper.h"
 #include "../../lib/kmi/mi.h"
+#include "../../parser/contact/parse_contact.h"
+#include "../../parser/parse_rr.h"
+#include "../../parser/parse_uri.h"
 
 #include "api.h"
 
@@ -257,18 +261,124 @@ int decode_flow_token(struct receive_info *rcv, str 
flow_token)
 
 int use_outbound(struct sip_msg *msg)
 {
+       contact_t *contact;
+       rr_t *rt;
+       struct sip_uri puri;
+       param_hooks_t hooks;
+       param_t *params;
+       int ret;
+
        /* If Outbound is forced return success without any further checks */
        if (isbflagset(0, ob_force_bflag) > 0)
+       {
+               LM_INFO("outbound forced\n");
                return 1;
+       }
 
-       /* Use Outbound when:
-           # It's an initial request (out-of-dialog INVITE, REGISTER,
-             SUBSCRIBE, or REFER), with
-           # A single Via:, and
-           # Top Route: points to us and has ;ob parameter _OR_ Contact: has
-             ;ob parameter _OR_ it's a REGISTER with ;+sip.instance
+       /* Use Outbound when there is a single Via: header and:
+           # It's a REGISTER request with a Contact-URI containing a ;reg-id
+             parameter, or
+           # The Contact-URI has an ;ob parameter, or
+           # The top Route-URI points to use and has an ;ob parameter
        */
 
+       /* Check there is a single Via: */
+       if (!(parse_headers(msg, HDR_VIA2_F, 0) == -1 || msg->via2 == 0
+               || msg->via2->error != PARSE_OK))
+       {
+               LM_INFO("second Via: found - outbound not used\n");
+               return 0;
+       }
+
+       /* Look for ;reg-id in REGISTER Contact-URIs and ;ob in any
+          Contact-URIs */
+       if (parse_headers(msg, HDR_CONTACT_F, 0) >= 0 && msg->contact)
+       {
+               if (parse_contact(msg->contact) < 0)
+               {
+                       LM_ERR("parsing Contact: header body\n");
+                       return 0;
+               }
+               contact = ((contact_body_t *) msg->contact->parsed)->contacts;
+               if (!contact)
+               {
+                       LM_ERR("empty Contact:\n");
+                       return 0;
+               }
+               if (parse_uri(contact->uri.s, contact->uri.len, &puri) < 0)
+               {
+                       LM_ERR("parsing Contact-URI\n");
+                       return 0;
+               }
+               if (parse_params(&puri.params, CLASS_CONTACT, &hooks,
+                       &params) != 0)
+               {
+                       LM_ERR("parsing Contact-URI parameters\n");
+                       return 0;
+               }
+
+               if (msg->REQ_METHOD == METHOD_REGISTER && hooks.contact.reg_id)
+               {
+                       LM_INFO("found REGISTER with ;reg_id paramter on"
+                               "Contact-URI - outbound used\n");
+                       return 1;
+               }
+
+               if (hooks.contact.ob)
+               {
+                       LM_INFO("found ;ob parameter on Contact-URI - outbound"
+                               " used\n");
+                       return 1;
+               }
+       }
+
+       /* Check to see if the top Route-URI is me and has a ;ob parameter */
+       if (parse_headers(msg, HDR_ROUTE_F, 0) >= 0 && msg->route)
+       {
+               if (parse_rr(msg->route) < 0)
+               {
+                       LM_ERR("parsing Route: header body\n");
+                       return 0;
+               }
+               rt = (rr_t *) msg->route->parsed;
+               if (!rt)
+               {
+                       LM_ERR("empty Route:\n");
+                       return 0;
+               }
+               if (parse_uri(rt->nameaddr.uri.s, rt->nameaddr.uri.len,
+                               &puri) < 0)
+               {
+                       LM_ERR("parsing Route-URI\n");
+                       return 0;
+               }
+               if (parse_params(&puri.params, CLASS_URI, &hooks,
+                       &params) != 0)
+               {
+                       LM_ERR("parsing Route-URI parameters\n");
+                       return 0;
+               }
+
+               ret = check_self(&puri.host,
+                               puri.port_no ? puri.port_no : SIP_PORT, 0);
+               if (ret < 1 || (ret == 1 && puri.gr.s != NULL))
+               {
+                       /* If the host:port doesn't match, or does but it's
+                          gruu */
+                       LM_INFO("top Route-URI is not me - outbound not"
+                               " used\n");
+                       return 0;
+               }
+
+               if (hooks.uri.ob)
+               {
+                       LM_INFO("found ;ob parameter on Route-URI - outbound"
+                               " used\n");
+                       return 1;
+               }
+       }
+
+       LM_INFO("outbound not used\n");
        return 0;
 }
 


_______________________________________________
sr-dev mailing list
[email protected]
http://lists.sip-router.org/cgi-bin/mailman/listinfo/sr-dev

Reply via email to