OVERVIEW:
authorBogdan-Andrei Iancu <bogdan@voice-system.ro>
Tue, 9 Jan 2007 11:12:57 +0000 (11:12 +0000)
committerBogdan-Andrei Iancu <bogdan@voice-system.ro>
Tue, 9 Jan 2007 11:12:57 +0000 (11:12 +0000)
-following some discussions with Juha regarding some extension for the branch flags, we decided it is better to have a re-design of flags in openser to allow a better flexibility and extensibility without any consistency penalties.

What we had so far:
- message flags (or transaction flags) which are transaction persistent
- a pseudo-branch flags - a set of flags from the message flags were handled by TM as branch flags (saved per branch and not only per transaction).

What we have now:
- message flags (or transaction flags) will works as they do now, but without the branch mask (as in 0.9.x versions), and the setflag, resetflag, isflagset() will be used.
- branch flags (NEW) will be saved in transaction (per branch) and saved in usrloc (per contact). A new set of functions will be added for manipulating these flags from script.
- script flags (NEW) will be no-message-related flags - they will be only script persistent and you can strictly use them for scripting. Once you exit a top level route, they will be lost. These flags are useful and they offer an option to de-congest the message flags - many flags have no need to be saved as they just reflect some scripting status.

What changes brings this:
- NAT flag will become a branch flag all the time)
- you can have custom flags to be saved into usrloc (via branch flags)
- more flags in script (via script flags)

CORE:

new script functions for operation on script and branch flags:
"setbflag"|"setbranchflag"
"resetbflag"|"resetbranchflag"
"isbflagset"|"isbranchflagset"
"setsflag"|"setscriptflag"
"resetsflag"|"resetscriptflag"
"issflagset"|"isscriptflagset"

small optimization for message flags :
do the flag range and param type checks only once at startup, instead of doing each time at runtime.

new pseudo-variables added for accessing the script and branch flags:
$bf - branch 0 flags in decimal format
$bF - branch 0 flags in hexa format
$sf - script flags in decimal format
$sF - script 0 flags in hexa format

SCRIPTS:

- location ans aliases tables have an extra column (cflags)
- increased version for these tables

CPL-C Module:

- nat_flag module parameter removed as now it is automatically imported from USRLOC module
- use for nat_flag the branch flags

MEDIAPROXY Module:

- use the nat_flag imported from usrloc in order to fetch the natted contacts

MEDIAPROXY Module:

- use the nat_flag imported from usrloc in order to fetch the natted contacts

REGISTRAR Module:

- nat_flag module parameter removed as now it is automatically imported from USRLOC module
- use_branch_flags module parameter removed as now the nat flag is all the time pushed into branch flags
- store the branch flags into usrloc when save() and restore them during lookup()

TM Module:

- branch_flag_mask module parameter removed as now there are separate branch flags which do not overlap with the message flags
- branch flags are properly restored in onreply, branch and failure route as branch 0.

USRLOC Module

- contact structure stores the branch/contact flags - these are the flags used from script and not the internal flags (which are still kept)
- branch flags are saved into DB -> extra column "cflags"
- new module parameter "cflags_column" for setting the column used for saving the branch/contact flags
- new module parameter "nat_bflag" - the branch/contact NAT flags - this is not directly used by the USRLOC module, but it is just exported to other modules which need it -> you need to configure it only one, instead of doing it for 5 modules
- simplify the loading function of the USRLOC API (no need for find_export())
- table version increased to 1004

git-svn-id: https://openser.svn.sourceforge.net/svnroot/openser/trunk@1468 689a6050-402a-0410-94f2-e92a70836424

32 files changed:
modules_k/cpl-c/README
modules_k/cpl-c/cpl.c
modules_k/cpl-c/cpl_env.h
modules_k/cpl-c/cpl_run.c
modules_k/cpl-c/cpl_sig.c
modules_k/cpl-c/doc/cpl-c_user.sgml
modules_k/mediaproxy/functions.h
modules_k/nathelper/nathelper.c
modules_k/registrar/README
modules_k/registrar/doc/registrar_user.sgml
modules_k/registrar/lookup.c
modules_k/registrar/reg_mod.c
modules_k/registrar/reg_mod.h
modules_k/registrar/save.c
modules_k/tm/h_table.c
modules_k/tm/t_fwd.c
modules_k/tm/t_fwd.h
modules_k/tm/t_reply.c
modules_k/tm/tm.c
modules_k/usrloc/README
modules_k/usrloc/dlist.c
modules_k/usrloc/doc/usrloc_user.sgml
modules_k/usrloc/ucontact.c
modules_k/usrloc/ucontact.h
modules_k/usrloc/udomain.c
modules_k/usrloc/ul_fifo.c
modules_k/usrloc/ul_mi.c
modules_k/usrloc/ul_mod.c
modules_k/usrloc/ul_mod.h
modules_k/usrloc/ul_unixsock.c
modules_k/usrloc/usrloc.c
modules_k/usrloc/usrloc.h

index 61fefd3..6b2b046 100644 (file)
@@ -36,10 +36,9 @@ Bogdan-Andrei Iancu
               1.3.11. case_sensitive (int)
               1.3.12. realm_prefix (string)
               1.3.13. timer_avp (string)
-              1.3.14. nat_flag (int)
-              1.3.15. lookup_domain (string)
-              1.3.16. lookup_append_branches (int)
-              1.3.17. use_domain (integer)
+              1.3.14. lookup_domain (string)
+              1.3.15. lookup_append_branches (int)
+              1.3.16. use_domain (integer)
 
         1.4. Exported Functions
 
@@ -66,13 +65,12 @@ Bogdan-Andrei Iancu
    1-11. Set case_sensitive parameter
    1-12. Set realm_prefix parameter
    1-13. Set timer_avp parameter
-   1-14. Set nat_flag parameter
-   1-15. Set lookup_domain parameter
-   1-16. Set lookup_append_branches parameter
-   1-17. Set use_domain parameter
-   1-18. cpl_run_script usage
-   1-19. cpl_process_register usage
-   1-20. cpl_process_register_norpl usage
+   1-14. Set lookup_domain parameter
+   1-15. Set lookup_append_branches parameter
+   1-16. Set use_domain parameter
+   1-17. cpl_run_script usage
+   1-18. cpl_process_register usage
+   1-19. cpl_process_register_norpl usage
      _________________________________________________________
 
 Chapter 1. User's Guide
@@ -300,21 +298,7 @@ modparam("cpl_c","timer_avp","i:14")
 ...
      _________________________________________________________
 
-1.3.14. nat_flag (int)
-
-   Sets the flag used for marking calls via NAT. Used by lookup
-   tag when retrieving a contact behind a NAT (this flag will be
-   set).
-
-   Default value is -1 (disabled). 
-
-   Example 1-14. Set nat_flag parameter
-...
-modparam("cpl_c","nat_flag",6)
-...
-     _________________________________________________________
-
-1.3.15. lookup_domain (string)
+1.3.14. lookup_domain (string)
 
    Used by lookup tag to indicate where to perform user location.
    Basically this is the name of the usrloc domain (table) where
@@ -325,13 +309,13 @@ modparam("cpl_c","nat_flag",6)
 
    Default value of this parameter is NULL. 
 
-   Example 1-15. Set lookup_domain parameter
+   Example 1-14. Set lookup_domain parameter
 ...
 modparam("cpl_c","lookup_domain","location")
 ...
      _________________________________________________________
 
-1.3.16. lookup_append_branches (int)
+1.3.15. lookup_append_branches (int)
 
    Tells if the lookup tag should append branches (to do parallel
    forking) if user_location lookup returns more than one
@@ -340,20 +324,20 @@ modparam("cpl_c","lookup_domain","location")
 
    Default value of this parameter is 0. 
 
-   Example 1-16. Set lookup_append_branches parameter
+   Example 1-15. Set lookup_append_branches parameter
 ...
 modparam("cpl_c","lookup_append_branches",1)
 ...
      _________________________________________________________
 
-1.3.17. use_domain (integer)
+1.3.16. use_domain (integer)
 
    Indicates if the domain part of the URI should be used in user
    identification (otherwise only username part will be used).
 
    Default value is "0 (disabled)". 
 
-   Example 1-17. Set use_domain parameter
+   Example 1-16. Set use_domain parameter
 ...
 modparam("cpl_c","use_domain",1)
 ...
@@ -417,7 +401,7 @@ modparam("cpl_c","use_domain",1)
 
    This function can be used from REQUEST_ROUTE.
 
-   Example 1-18. cpl_run_script usage
+   Example 1-17. cpl_run_script usage
 ...
 cpl_run_script("incoming","force_stateful");
 ...
@@ -447,7 +431,7 @@ cpl_run_script("incoming","force_stateful");
 
    This function can be used from REQUEST_ROUTE.
 
-   Example 1-19. cpl_process_register usage
+   Example 1-18. cpl_process_register usage
 ...
 if (method=="REGISTER") {
         cpl_process_register();
@@ -466,7 +450,7 @@ if (method=="REGISTER") {
 
    This function can be used from REQUEST_ROUTE.
 
-   Example 1-20. cpl_process_register_norpl usage 
+   Example 1-19. cpl_process_register_norpl usage 
 ...
 if (method=="REGISTER") {
         cpl_process_register();
index 5be125b..0e64b82 100644 (file)
@@ -83,7 +83,6 @@ struct cpl_enviroment    cpl_env = {
                0, /* no cpl logging */
                0, /* recurse proxy level is 0 */
                0, /* no script route to be run before proxy */
-               -1,/* nat mask */
                0, /* user part is not case sensitive */
                {0,0},   /* no domain prefix to be ignored */
                {-1,-1}, /* communication pipe to aux_process */
@@ -136,7 +135,6 @@ static param_export_t params[] = {
        {"cpl_dtd_file",   STR_PARAM, &dtd_file                          },
        {"proxy_recurse",  INT_PARAM, &cpl_env.proxy_recurse             },
        {"proxy_route",    INT_PARAM, &cpl_env.proxy_route               },
-       {"nat_flag",       INT_PARAM, &cpl_env.nat_flag                  },
        {"log_dir",        STR_PARAM, &cpl_env.log_dir                   },
        {"case_sensitive", INT_PARAM, &cpl_env.case_sensitive            },
        {"realm_prefix",   STR_PARAM, &cpl_env.realm_prefix.s            },
@@ -407,9 +405,6 @@ static int cpl_init(void)
                strlower( &cpl_env.realm_prefix );
        }
 
-       /* fix the flags */
-       cpl_env.nat_flag = (cpl_env.nat_flag>-1)?(1<<cpl_env.nat_flag):0;
-
        return 0;
 error:
        return -1;
index 31ee2d0..0449716 100644 (file)
@@ -36,7 +36,6 @@ struct cpl_enviroment {
        char  *log_dir;         /* dir where the user log should be dumped */
        int    proxy_recurse;   /* numbers of proxy redirection accepted */
        int    proxy_route;     /* script route to be run before proxy */
-       int    nat_flag;        /* flag for marking looked up contact as NAT */
        int    case_sensitive;  /* is user part case sensitive ? */
        str    realm_prefix;    /* domain prefix to be ignored */
        int    cmd_pipe[2];     /* communication pipe with aux. process */
index cec4950..a5d914d 100644 (file)
@@ -298,7 +298,8 @@ static inline char *run_lookup( struct cpl_interpreter *intr )
                                                contact->c.len,contact->c.s,(int)(10*contact->q));
                                        if (add_location( &(intr->loc_set), &contact->c, 
                                        &contact->received, (int)(10*contact->q),
-                                       CPL_LOC_DUPL|((contact->flags & FL_NAT)*CPL_LOC_NATED)
+                                       CPL_LOC_DUPL|
+                                               ((contact->flags & cpl_fct.ulb.nat_flag)*CPL_LOC_NATED)
                                        )==-1) {
                                                LOG(L_ERR,"ERROR:cpl-c:run_lookup: unable to add "
                                                        "location to set :-(\n");
index a7f0b3c..3ec7fcc 100644 (file)
@@ -80,8 +80,7 @@ int cpl_proxy_to_loc_set( struct sip_msg *msg, struct location **locs,
                }
                /* is the location NATED? */
                if ((*locs)->flags&CPL_LOC_NATED)
-                       /* for RURI branch, the nat flag goes into msg */
-                       msg->flags |= cpl_env.nat_flag;
+                       setbflag( 0, cpl_fct.ulb.nat_flag );
                /* free the location and point to the next one */
                foo = (*locs)->next;
                free_location( *locs );
@@ -90,7 +89,7 @@ int cpl_proxy_to_loc_set( struct sip_msg *msg, struct location **locs,
 
        /* add the rest of the locations as branches */
        while(*locs) {
-               bflags = ((*locs)->flags&CPL_LOC_NATED) ? cpl_env.nat_flag : 0 ;
+               bflags = ((*locs)->flags&CPL_LOC_NATED) ? cpl_fct.ulb.nat_flag : 0 ;
                DBG("DEBUG:cpl_c:cpl_proxy_to_loc_set: appending branch "
                        "<%.*s>, flags %d\n",
                        (*locs)->addr.uri.len, (*locs)->addr.uri.s, bflags);
index 543ea86..f250287 100644 (file)
@@ -356,27 +356,6 @@ modparam("cpl_c","realm_prefix","sip.")
 ...
 modparam("cpl_c","timer_avp","i:14")
 ...
-</programlisting>
-                       </example>
-               </section>
-               <section>
-                       <title><varname>nat_flag</varname> (int)</title>
-                       <para>
-                               Sets the flag used for marking calls via NAT. Used by lookup
-                               tag when retrieving a contact behind a NAT (this flag will be 
-                               set).
-                       </para>
-                       <para>
-                               <emphasis>
-                                       Default value is -1 (disabled).
-                               </emphasis>
-                       </para>
-                       <example>
-                               <title>Set <varname>nat_flag</varname> parameter</title>
-                               <programlisting format="linespecific">
-...
-modparam("cpl_c","nat_flag",6)
-...
 </programlisting>
                        </example>
                </section>
index 2da9ffc..41ceeca 100644 (file)
@@ -41,7 +41,7 @@ pingClients(unsigned int ticks, void *param)
         LOG(L_ERR, "error: mediaproxy/pingClients(): out of memory\n");
         return;
     }
-    needed = userLocation.get_all_ucontacts(buf, length, FL_NAT);
+    needed = userLocation.get_all_ucontacts(buf, length,userLocation.nat_flag);
     if (needed > 0) {
         // make sure we alloc more than actually we were told is missing
         // (some clients may register while we are making these calls)
@@ -55,7 +55,8 @@ pingClients(unsigned int ticks, void *param)
             buf = ptr;
         }
         // try again. we may fail again if _many_ clients register in between
-        needed = userLocation.get_all_ucontacts(buf, length, FL_NAT);
+        needed = userLocation.get_all_ucontacts(buf, length ,
+            userLocation.nat_flag);
         if (needed != 0) {
             pkg_free(buf);
             return;
index 30b29d1..42ed4f6 100644 (file)
@@ -2102,7 +2102,7 @@ nh_timer(unsigned int ticks, void *param)
                        return;
                }
        }
-       rval = ul.get_all_ucontacts(buf, cblen, (ping_nated_only ? FL_NAT : 0));
+       rval = ul.get_all_ucontacts(buf, cblen, (ping_nated_only?ul.nat_flag:0));
        if (rval > 0) {
                if (buf != NULL)
                        pkg_free(buf);
@@ -2112,7 +2112,7 @@ nh_timer(unsigned int ticks, void *param)
                        LOG(L_ERR, "ERROR:nathelper:nh_timer: out of memory\n");
                        return;
                }
-               rval = ul.get_all_ucontacts(buf, cblen, (ping_nated_only ? FL_NAT : 0));
+               rval = ul.get_all_ucontacts(buf,cblen,(ping_nated_only?ul.nat_flag:0));
                if (rval != 0) {
                        pkg_free(buf);
                        return;
index 23a8e78..dd8683e 100644 (file)
@@ -32,24 +32,22 @@ Bogdan-Andre Iancu
               1.3.2. min_expires (integer)
               1.3.3. max_expires (integer)
               1.3.4. default_q (integer)
-              1.3.5. nat_flag (integer)
-              1.3.6. sip_natping_flag (integer)
-              1.3.7. tcp_persistent_flag (integer)
-              1.3.8. realm_prefix (string)
-              1.3.9. append_branches (integer)
-              1.3.10. aor_avp_id (integer)
-              1.3.11. case_sensitive (integer)
-              1.3.12. received_avp (integer)
-              1.3.13. received_param (string)
-              1.3.14. max_contacts (integer)
-              1.3.15. retry_after (integer)
-              1.3.16. sock_flag (integer)
-              1.3.17. sock_hdr_name (string)
-              1.3.18. use_branch_flags (integer)
-              1.3.19. method_filtering (integer)
-              1.3.20. use_path (integer)
-              1.3.21. path_mode (integer)
-              1.3.22. path_use_received (integer)
+              1.3.5. sip_natping_flag (integer)
+              1.3.6. tcp_persistent_flag (integer)
+              1.3.7. realm_prefix (string)
+              1.3.8. append_branches (integer)
+              1.3.9. aor_avp_id (integer)
+              1.3.10. case_sensitive (integer)
+              1.3.11. received_avp (integer)
+              1.3.12. received_param (string)
+              1.3.13. max_contacts (integer)
+              1.3.14. retry_after (integer)
+              1.3.15. sock_flag (integer)
+              1.3.16. sock_hdr_name (string)
+              1.3.17. method_filtering (integer)
+              1.3.18. use_path (integer)
+              1.3.19. path_mode (integer)
+              1.3.20. path_use_received (integer)
 
         1.4. Exported Functions
 
@@ -67,29 +65,27 @@ Bogdan-Andre Iancu
    1-2. Set min_expires parameter
    1-3. Set max_expires parameter
    1-4. Set default_q parameter
-   1-5. Set nat_flag parameter
-   1-6. Set sip_natping_flag parameter
-   1-7. Set tcp_persistent_flag parameter
-   1-8. Set realm_prefix parameter
-   1-9. Set append_branches parameter
-   1-10. Set aor_avp_id parameter
-   1-11. Set case_sensitive parameter
-   1-12. Set received_avp parameter
-   1-13. Set received_param parameter
-   1-14. Set max_contacts parameter
-   1-15. Set retry_after parameter
-   1-16. Set sock_flag parameter
-   1-17. Set sock_hdr_namer parameter
-   1-18. Set use_branch_flags parameter
-   1-19. Set method_filtering parameter
-   1-20. Set use_path parameter
-   1-21. Set path_mode parameter
-   1-22. Set path_use_received parameter
-   1-23. save usage
-   1-24. save usage
-   1-25. lookup usage
-   1-26. registered usage
-   1-27. add_sock_hdr usage
+   1-5. Set sip_natping_flag parameter
+   1-6. Set tcp_persistent_flag parameter
+   1-7. Set realm_prefix parameter
+   1-8. Set append_branches parameter
+   1-9. Set aor_avp_id parameter
+   1-10. Set case_sensitive parameter
+   1-11. Set received_avp parameter
+   1-12. Set received_param parameter
+   1-13. Set max_contacts parameter
+   1-14. Set retry_after parameter
+   1-15. Set sock_flag parameter
+   1-16. Set sock_hdr_namer parameter
+   1-17. Set method_filtering parameter
+   1-18. Set use_path parameter
+   1-19. Set path_mode parameter
+   1-20. Set path_use_received parameter
+   1-21. save usage
+   1-22. save usage
+   1-23. lookup usage
+   1-24. registered usage
+   1-25. add_sock_hdr usage
      _________________________________________________________
 
 Chapter 1. User's Guide
@@ -210,22 +206,7 @@ modparam("registrar", "default_q", 100)
 ...
      _________________________________________________________
 
-1.3.5. nat_flag (integer)
-
-   The parameter specifies the flag to be used as NAT marker. The
-   idea is to set this flag if a register come behind a NAT; the
-   "save()" functions will save the flag in the usrloc, flag that
-   will be restore by the "lookup()" function.
-
-   Default value is -1 (disabled). 
-
-   Example 1-5. Set nat_flag parameter
-...
-modparam("registrar", "nat_flag", 6)
-...
-     _________________________________________________________
-
-1.3.6. sip_natping_flag (integer)
+1.3.5. sip_natping_flag (integer)
 
    The parameter specifies the flat to be used to mark the
    contacts to be NAT pinged via a SIP request instead if dummy
@@ -235,13 +216,13 @@ modparam("registrar", "nat_flag", 6)
 
    Default value is -1 (disabled). 
 
-   Example 1-6. Set sip_natping_flag parameter
+   Example 1-5. Set sip_natping_flag parameter
 ...
 modparam("registrar", "sip_natping_flag", 7)
 ...
      _________________________________________________________
 
-1.3.7. tcp_persistent_flag (integer)
+1.3.6. tcp_persistent_flag (integer)
 
    The parameter specifies the flat to be used to control the
    module behaviour regarding TCP connections. If the flag is set
@@ -252,13 +233,13 @@ modparam("registrar", "sip_natping_flag", 7)
 
    Default value is -1 (disabled). 
 
-   Example 1-7. Set tcp_persistent_flag parameter
+   Example 1-6. Set tcp_persistent_flag parameter
 ...
 modparam("registrar", "tcp_persistent_flag", 7)
 ...
      _________________________________________________________
 
-1.3.8. realm_prefix (string)
+1.3.7. realm_prefix (string)
 
    Prefix to be automatically strip from realm. As an alternative
    to SRV records (not all SIP clients support SRV lookup), a
@@ -270,13 +251,13 @@ modparam("registrar", "tcp_persistent_flag", 7)
 
    Default value is NULL (none). 
 
-   Example 1-8. Set realm_prefix parameter
+   Example 1-7. Set realm_prefix parameter
 ...
 modparam("registrar", "realm_prefix", "sip.")
 ...
      _________________________________________________________
 
-1.3.9. append_branches (integer)
+1.3.8. append_branches (integer)
 
    The parameter controls how lookup function processes multiple
    contacts. If there are multiple contacts for the given
@@ -289,13 +270,13 @@ modparam("registrar", "realm_prefix", "sip.")
 
    Default value is 1. 
 
-   Example 1-9. Set append_branches parameter
+   Example 1-8. Set append_branches parameter
 ...
 modparam("registrar", "append_branches", 0)
 ...
      _________________________________________________________
 
-1.3.10. aor_avp_id (integer)
+1.3.9. aor_avp_id (integer)
 
    If set, the module will try first to get the AOR from the AVP
    ID instead of fetching it form the processed request.
@@ -306,13 +287,13 @@ modparam("registrar", "append_branches", 0)
 
    Default value is 0 (disabled). 
 
-   Example 1-10. Set aor_avp_id parameter
+   Example 1-9. Set aor_avp_id parameter
 ...
 modparam("registrar", "aor_avp_id", 3223)
 ...
      _________________________________________________________
 
-1.3.11. case_sensitive (integer)
+1.3.10. case_sensitive (integer)
 
    If set to 1 then AOR comparison will be case sensitive, if set
    to 0 then AOR comparison will be case insensitive--This is
@@ -320,13 +301,13 @@ modparam("registrar", "aor_avp_id", 3223)
 
    Default value is 0. 
 
-   Example 1-11. Set case_sensitive parameter
+   Example 1-10. Set case_sensitive parameter
 ...
 modparam("registrar", "case_sensitive", 1)
 ...
      _________________________________________________________
 
-1.3.12. received_avp (integer)
+1.3.11. received_avp (integer)
 
    Registrar will store the value of the AVP configured by this
    parameter in the received column in the user location
@@ -341,26 +322,26 @@ modparam("registrar", "case_sensitive", 1)
 
    Default value is 42. 
 
-   Example 1-12. Set received_avp parameter
+   Example 1-11. Set received_avp parameter
 ...
 modparam("registrar", "received_avp", 43)
 ...
      _________________________________________________________
 
-1.3.13. received_param (string)
+1.3.12. received_param (string)
 
    The name of the parameter that will be appended to Contacts of
    200 OK when the received URI was set by nathelper module.
 
    Default value is "received". 
 
-   Example 1-13. Set received_param parameter
+   Example 1-12. Set received_param parameter
 ...
 modparam("registrar", "received_param", "rcv")
 ...
      _________________________________________________________
 
-1.3.14. max_contacts (integer)
+1.3.13. max_contacts (integer)
 
    The parameter can be used to limit the number of contacts per
    AOR (Address of Record) in the user location database. Value 0
@@ -368,14 +349,14 @@ modparam("registrar", "received_param", "rcv")
 
    Default value is 0. 
 
-   Example 1-14. Set max_contacts parameter
+   Example 1-13. Set max_contacts parameter
 ...
 # Allow no more than 10 contacts per AOR
 modparam("registrar", "max_contacts", 10)
 ...
      _________________________________________________________
 
-1.3.15. retry_after (integer)
+1.3.14. retry_after (integer)
 
    The registrar can generate 5xx reply to REGISTER in various
    situations. It can, for example, happen when the max_contacts
@@ -390,13 +371,13 @@ modparam("registrar", "max_contacts", 10)
 
    Default value is 0 (disabled). 
 
-   Example 1-15. Set retry_after parameter
+   Example 1-14. Set retry_after parameter
 ...
 modparam("registrar", "retry_after", 30)
 ...
      _________________________________________________________
 
-1.3.16. sock_flag (integer)
+1.3.15. sock_flag (integer)
 
    Flag to signal to register module to look into REGISTER
    request for a header which contains a socket description
@@ -407,13 +388,13 @@ modparam("registrar", "retry_after", 30)
 
    Default value is -1 (no flag). 
 
-   Example 1-16. Set sock_flag parameter
+   Example 1-15. Set sock_flag parameter
 ...
 modparam("registrar", "sock_flag", 18)
 ...
      _________________________________________________________
 
-1.3.17. sock_hdr_name (string)
+1.3.16. sock_hdr_name (string)
 
    Header which contains a socket description (proto:IP:port) to
    overide the the received socket info. The heaer will be read
@@ -423,32 +404,13 @@ modparam("registrar", "sock_flag", 18)
 
    Default value is NULL. 
 
-   Example 1-17. Set sock_hdr_namer parameter
+   Example 1-16. Set sock_hdr_namer parameter
 ...
 modparam("registrar", "sock_hdr_name", "Sock-Info")
 ...
      _________________________________________________________
 
-1.3.18. use_branch_flags (integer)
-
-   If enabled (has a non zero value), the NAT flag for the
-   additional branches will be pushed in branch flags (in
-   dset/branch array). Otherwise it will be pushed in the message
-   flags. In both cases, the NAT flag for the RURI will be push
-   into message flags.
-
-   This make sens to be enabled only if branch route will be
-   used.
-
-   Default value is 0 (disabled). 
-
-   Example 1-18. Set use_branch_flags parameter
-...
-modparam("registrar", "use_branch_flags", 1)
-...
-     _________________________________________________________
-
-1.3.19. method_filtering (integer)
+1.3.17. method_filtering (integer)
 
    Tells if the contact filtering based on supported methods
    should be performed during lookup. It's enabled only if it has
@@ -456,26 +418,26 @@ modparam("registrar", "use_branch_flags", 1)
 
    Default value is 0 (disabled). 
 
-   Example 1-19. Set method_filtering parameter
+   Example 1-17. Set method_filtering parameter
 ...
 modparam("registrar", "method_filtering", 1)
 ...
      _________________________________________________________
 
-1.3.20. use_path (integer)
+1.3.18. use_path (integer)
 
    If set to 1, the Path header is handled according to the
    parameter "path_mode".
 
    Default value is 0 (disabled). 
 
-   Example 1-20. Set use_path parameter
+   Example 1-18. Set use_path parameter
 ...
 modparam("registrar", "use_path", 1)
 ...
      _________________________________________________________
 
-1.3.21. path_mode (integer)
+1.3.19. path_mode (integer)
 
    The registrar module implements three different modes
    regarding the response to a registration which includes one or
@@ -497,13 +459,13 @@ modparam("registrar", "use_path", 1)
 
    Default value is 2. 
 
-   Example 1-21. Set path_mode parameter
+   Example 1-19. Set path_mode parameter
 ...
 modparam("registrar", "path_mode", 0)
 ...
      _________________________________________________________
 
-1.3.22. path_use_received (integer)
+1.3.20. path_use_received (integer)
 
    If set to 1, the "received" parameter of the first Path uri of
    a registration is set as received-uri and the NAT flag is set
@@ -513,7 +475,7 @@ modparam("registrar", "path_mode", 0)
 
    Default value is 0 (disabled). 
 
-   Example 1-22. Set path_use_received parameter
+   Example 1-20. Set path_use_received parameter
 ...
 modparam("registrar", "path_use_received", 1)
 ...
@@ -538,7 +500,7 @@ modparam("registrar", "path_use_received", 1)
 
    This function can be used from REQUEST_ROUTE.
 
-   Example 1-23. save usage
+   Example 1-21. save usage
 ...
 save("location");
 ...
@@ -564,7 +526,7 @@ save("location");
 
    This function can be used from REQUEST_ROUTE.
 
-   Example 1-24. save usage
+   Example 1-22. save usage
 ...
 save("location","0x01");
 ...
@@ -597,7 +559,7 @@ save("location","0x01");
 
    This function can be used from REQUEST_ROUTE, FAILURE_ROUTE.
 
-   Example 1-25. lookup usage
+   Example 1-23. lookup usage
 ...
 lookup("location");
 switch ($?) {
@@ -625,7 +587,7 @@ switch ($?) {
 
    This function can be used from REQUEST_ROUTE, FAILURE_ROUTE.
 
-   Example 1-26. registered usage
+   Example 1-24. registered usage
 ...
 if (registered("location")) {
         sl_send_reply("100", "Trying");
@@ -648,7 +610,7 @@ if (registered("location")) {
 
    This function can be used from REQUEST_ROUTE.
 
-   Example 1-27. add_sock_hdr usage
+   Example 1-25. add_sock_hdr usage
 ...
 add_sock_hdr("Sock-Info");
 ...
index 7c04a75..cd98d86 100644 (file)
@@ -195,29 +195,6 @@ modparam("registrar", "default_q", 100)
                </example>
        </section>
 
-       <section>
-               <title><varname>nat_flag</varname> (integer)</title>
-               <para>
-               The parameter specifies the flag to be used as NAT marker. The idea is
-               to set this flag if a register come behind a NAT; the 
-               <quote>save()</quote> functions will save the flag in the usrloc, flag
-               that will be restore by the <quote>lookup()</quote> function.
-               </para>
-               <para>
-               <emphasis>
-                       Default value is -1 (disabled).
-               </emphasis>
-               </para>
-               <example>
-               <title>Set <varname>nat_flag</varname> parameter</title>
-               <programlisting format="linespecific">
-...
-modparam("registrar", "nat_flag", 6)
-...
-</programlisting>
-               </example>
-       </section>
-
        <section>
                <title><varname>sip_natping_flag</varname> (integer)</title>
                <para>
@@ -519,32 +496,6 @@ modparam("registrar", "sock_hdr_name", "Sock-Info")
                </example>
        </section>
 
-       <section>
-               <title><varname>use_branch_flags</varname> (integer)</title>
-               <para>
-               If enabled (has a non zero value), the NAT flag for the additional
-               branches will be pushed in branch flags (in dset/branch array).
-               Otherwise it will be pushed in the message flags. In both cases, the
-               NAT flag for the RURI will be push into message flags.
-               </para>
-               <para>
-               This make sens to be enabled only if branch route will be used.
-               </para>
-               <para>
-               <emphasis>
-                       Default value is 0 (disabled).
-               </emphasis>
-               </para>
-               <example>
-               <title>Set <varname>use_branch_flags</varname> parameter</title>
-               <programlisting format="linespecific">
-...
-modparam("registrar", "use_branch_flags", 1)
-...
-               </programlisting>
-               </example>
-       </section>
-
        <section>
                <title><varname>method_filtering</varname> (integer)</title>
                <para>
index bba40ee..ecea8c3 100644 (file)
@@ -57,7 +57,6 @@ int lookup(struct sip_msg* _m, char* _t, char* _s)
        str aor, uri;
        ucontact_t* ptr;
        int res;
-       int bflags;
        int ret;
        str path_dst;
 
@@ -126,9 +125,7 @@ int lookup(struct sip_msg* _m, char* _t, char* _s)
 
                set_ruri_q(ptr->q);
 
-               /* for RURI branch, the nat flag goes into msg */
-               if ( ptr->flags&FL_NAT )
-                       _m->flags |= nat_flag;
+               setbflag( 0, ptr->cflags);
 
                if (ptr->sock)
                        _m->force_send_socket = ptr->sock;
@@ -141,27 +138,21 @@ int lookup(struct sip_msg* _m, char* _t, char* _s)
 
        for( ; ptr ; ptr = ptr->next ) {
                if (VALID_CONTACT(ptr, act_time) && allowed_method(_m, ptr)) {
-                       /* for additional branches, the nat flag goes into dset */
-                       bflags = (use_branch_flags && (ptr->flags & FL_NAT))?nat_flag:0;
-
                        path_dst.len = 0;
                        if(ptr->path.s && ptr->path.len 
                        && get_path_dst_uri(&ptr->path, &path_dst) < 0) {
                                LOG(L_ERR, "lookup(): Failed to get dst_uri for Path\n");
                                continue;
                        }
-               
+
                        /* The same as for the first contact applies for branches 
                         * regarding path vs. received. */
                        if (append_branch(_m,&ptr->c,path_dst.len?&path_dst:&ptr->received,
-                       &ptr->path, ptr->q, bflags, ptr->sock) == -1) {
+                       &ptr->path, ptr->q, ptr->cflags, ptr->sock) == -1) {
                                LOG(L_ERR, "lookup(): Error while appending a branch\n");
                                /* Also give a chance to the next branches*/
                                continue;
                        }
-                       
-                       if (!use_branch_flags && (ptr->flags & FL_NAT))
-                               _m->flags |= nat_flag;
                }
        }
 
index ab1839b..f07ede1 100644 (file)
@@ -80,8 +80,6 @@ qvalue_t default_q  = Q_UNSPECIFIED;
 int append_branches = 1;
 /* If set to 1, username in aor will be case sensitive */
 int case_sensitive  = 0;
-/* flag marking contacts behind NAT */
-int nat_flag        = -1;
 /* if the TCP connection should be kept open */
 int tcp_persistent_flag = -1;
 /* flag marking nated contacts to be pinged with SIP method  */
@@ -96,8 +94,6 @@ int max_expires     = 0;
 int max_contacts = 0;
 /* The value of Retry-After HF in 5xx replies */
 int retry_after = 0;
-/* if the NAT flag should be pushed in branch flags or msg flags */
-int use_branch_flags = 0;
 /* if the looked up contacts should be filtered based on supported methods */
 int method_filtering = 0;
 /* if the Path HF should be handled */
@@ -165,7 +161,6 @@ static param_export_t params[] = {
        {"default_q",          INT_PARAM, &default_q           },
        {"append_branches",    INT_PARAM, &append_branches     },
        {"case_sensitive",     INT_PARAM, &case_sensitive      },
-       {"nat_flag",           INT_PARAM, &nat_flag            },
        {"sip_natping_flag",   INT_PARAM, &sip_natping_flag    },
        {"tcp_persistent_flag",INT_PARAM, &tcp_persistent_flag },
        {"realm_prefix",       STR_PARAM, &realm_pref          },
@@ -178,7 +173,6 @@ static param_export_t params[] = {
        {"retry_after",        INT_PARAM, &retry_after         },
        {"sock_flag",          INT_PARAM, &sock_flag           },
        {"sock_hdr_name",      STR_PARAM, &sock_hdr_name.s     },
-       {"use_branch_flags",   INT_PARAM, &use_branch_flags    },
        {"method_filtering",   INT_PARAM, &method_filtering    },
        {"use_path",           INT_PARAM, &path_enabled        },
        {"path_mode",          INT_PARAM, &path_mode           },
@@ -187,10 +181,7 @@ static param_export_t params[] = {
 };
 
 
-/* We expose internal variables via the statistic framework below.  Since these
- * variables are meant to be set through only exported module parameters, we
- * implement the statistic collection as a function.  This way it can be set up
- * to be read only. */
+/* We expose internal variables via the statistic framework below.*/
 stat_export_t mod_stats[] = {
        {"max_expires",       STAT_NO_RESET, &max_expires_stat        },
        {"max_contacts",      STAT_NO_RESET, &max_contacts_stat       },
@@ -291,7 +282,6 @@ static int mod_init(void)
 
        /* fix the flags */
        sock_flag = (sock_flag!=-1)?(1<<sock_flag):0;
-       nat_flag = (nat_flag!=-1)?(1<<nat_flag):0;
        sip_natping_flag = (sip_natping_flag!=-1)?(1<<sip_natping_flag):0;
        tcp_persistent_flag = (tcp_persistent_flag!=-1)?(1<<tcp_persistent_flag):0;
 
index 8f6e34a..84ee82b 100644 (file)
@@ -76,7 +76,6 @@ extern str rcv_param;
 extern int_str rcv_avp;
 extern int max_contacts;
 extern int retry_after;
-extern int use_branch_flags;
 extern int method_filtering;
 extern int path_enabled;
 extern int path_mode;
index e84b06f..d2e8d22 100644 (file)
@@ -48,6 +48,7 @@
 #include "../../trim.h"
 #include "../../ut.h"
 #include "../../qvalue.h"
+#include "../../dset.h"
 #ifdef USE_TCP
 #include "../../tcp_server.h"
 #endif
@@ -192,7 +193,7 @@ static inline int no_contacts(udomain_t* _d, str* _a)
  * Fills the common part (for all contacts) of the info structure
  */
 static inline ucontact_info_t* pack_ci( struct sip_msg* _m, contact_t* _c,
-                                                                                                       int _e, int _f1, int _f2)
+                                                                                       unsigned int _e, unsigned int _f)
 {
        static ucontact_info_t ci;
        static str no_ua = str_init("n/a");
@@ -261,6 +262,16 @@ static inline ucontact_info_t* pack_ci( struct sip_msg* _m, contact_t* _c,
 
                ci.last_modified = act_time;
 
+               /* set flags */
+               ci.flags  = _f;
+               ci.cflags =  getb0flags();
+
+               /* get received */
+               if (path_received.len && path_received.s) {
+                       ci.cflags |= ul.nat_flag;
+                       ci.received = path_received;
+               }
+
                allow_parsed = 0; /* not parsed yet */
                received_found = 0; /* not found yet */
                m = _m; /* remember the message */
@@ -277,10 +288,6 @@ static inline ucontact_info_t* pack_ci( struct sip_msg* _m, contact_t* _c,
                /* set expire time */
                ci.expires = _e;
 
-               /* set flags */
-               ci.flags1 = _f1;
-               ci.flags2 = _f2;
-
                /* Get methods of contact */
                if (_c->methods) {
                        if (parse_methods(&(_c->methods->body), &ci.methods) < 0) {
@@ -303,30 +310,27 @@ static inline ucontact_info_t* pack_ci( struct sip_msg* _m, contact_t* _c,
                }
 
                /* get received */
-               if (path_received.len && path_received.s) {
-                       ci.flags1 |= FL_NAT;
-                       ci.flags2 &= ~FL_NAT;
-                       ci.received = path_received;
-               }
-               else if (_c->received) {
-                       ci.received = _c->received->body;
-               } else {
-                       if (received_found==0) {
-                               if (search_first_avp(0, rcv_avp, &val, 0) && val.s.s) {
-                                       if (val.s.len>RECEIVED_MAX_SIZE) {
-                                               rerrno = R_CONTACT_LEN;
-                                               LOG(L_ERR,"ERROR:registrar:pack_ci: received "
-                                                       "too long\n");
-                                               goto error;
+               if (ci.received.len==0) {
+                       if (_c->received) {
+                               ci.received = _c->received->body;
+                       } else {
+                               if (received_found==0) {
+                                       if (search_first_avp(0, rcv_avp, &val, 0) && val.s.s) {
+                                               if (val.s.len>RECEIVED_MAX_SIZE) {
+                                                       rerrno = R_CONTACT_LEN;
+                                                       LOG(L_ERR,"ERROR:registrar:pack_ci: received "
+                                                               "too long\n");
+                                                       goto error;
+                                               }
+                                               received = val.s;
+                                       } else {
+                                               received.s = 0;
+                                               received.len = 0;
                                        }
-                                       received = val.s;
-                               } else {
-                                       received.s = 0;
-                                       received.len = 0;
+                                       received_found = 1;
                                }
-                               received_found = 1;
+                               ci.received = received;
                        }
-                       ci.received = received;
                }
 
        }
@@ -359,14 +363,11 @@ static inline int insert_contacts(struct sip_msg* _m, contact_t* _c,
        struct sip_uri uri;
 #endif
 
-       /* is nated flag */
-       if (_m->flags&nat_flag)
-               flags = FL_NAT;
-       else
-               flags = FL_NONE;
        /* nat type flag */
        if (_m->flags&sip_natping_flag)
-               flags |= FL_NAT_SIPPING;
+               flags = FL_NAT_SIPPING;
+       else
+               flags = FL_NONE;
 
        flags |= mem_only;
 #ifdef USE_TCP
@@ -404,7 +405,7 @@ static inline int insert_contacts(struct sip_msg* _m, contact_t* _c,
                }
 
                /* pack the contact_info */
-               if ( (ci=pack_ci( (ci==0)?_m:0, _c, e, flags, 0))==0 ) {
+               if ( (ci=pack_ci( (ci==0)?_m:0, _c, e, flags))==0 ) {
                        LOG(L_ERR, "ERROR:registrar:insert_contacts: failed to extract "
                                "contact info\n");
                        goto error;
@@ -534,7 +535,6 @@ static inline int update_contacts(struct sip_msg* _m, urecord_t* _r,
        ucontact_info_t *ci;
        ucontact_t* c;
        int e;
-       int set, reset;
        unsigned int flags;
        int ret;
 #ifdef USE_TCP
@@ -543,19 +543,16 @@ static inline int update_contacts(struct sip_msg* _m, urecord_t* _r,
        struct sip_uri uri;
 #endif
 
-       /* is nated flag */
-       if (_m->flags&nat_flag)
-               flags = FL_NAT;
-       else
-               flags = FL_NONE;
        /* nat type flag */
        if (_m->flags&sip_natping_flag)
-               flags |= FL_NAT_SIPPING;
+               flags = FL_NAT_SIPPING;
+       else
+               flags = FL_NONE;
        /* mem flag */
        flags |= mem_only;
 
        /* pack the contact_info */
-       if ( (ci=pack_ci( _m, 0, 0, 0, 0))==0 ) {
+       if ( (ci=pack_ci( _m, 0, 0, flags))==0 ) {
                LOG(L_ERR, "ERROR:registrar:update_contacts: failed to "
                        "initial pack contact info\n");
                goto error;
@@ -595,7 +592,7 @@ static inline int update_contacts(struct sip_msg* _m, urecord_t* _r,
                                continue;
 
                        /* pack the contact_info */
-                       if ( (ci=pack_ci( 0, _c, e, flags, 0))==0 ) {
+                       if ( (ci=pack_ci( 0, _c, e, 0))==0 ) {
                                LOG(L_ERR, "ERROR:registrar:update_contacts: failed to "
                                        "extract contact info\n");
                                goto error;
@@ -625,11 +622,8 @@ static inline int update_contacts(struct sip_msg* _m, urecord_t* _r,
                                }
                        } else {
                                /* do update */
-                               set = flags | mem_only;
-                               reset = ~(flags | mem_only) & (FL_NAT|FL_MEM|FL_NAT_SIPPING);
-
                                /* pack the contact specific info */
-                               if ( (ci=pack_ci( 0, _c, e, set, reset))==0 ) {
+                               if ( (ci=pack_ci( 0, _c, e, 0))==0 ) {
                                        LOG(L_ERR, "ERROR:registrar:update_contacts: failed to "
                                                "pack contact specific info\n");
                                        goto error;
index 977e9a4..39ec9c0 100644 (file)
@@ -269,8 +269,6 @@ struct cell*  build_cell( struct sip_msg* p_msg )
                if (!new_cell->uas.request)
                        goto error;
                new_cell->uas.end_request=((char*)new_cell->uas.request)+sip_msg_len;
-               /* keep in UAS side only the global flags */
-               new_cell->uas.request->flags &= gflags_mask;
        }
 
        /* UAC */
index ae1df9e..b0cf874 100644 (file)
@@ -62,7 +62,6 @@
 
 /* route to execute for the branches */
 static int goto_on_branch;
-unsigned int gflags_mask = 0xffffffff;
 int _tm_branch_index = 0;
 
 void t_on_branch( unsigned int go_to )
@@ -199,8 +198,6 @@ static inline void post_print_uac_request(struct sip_msg *request,
        /* delete inserted branch lumps */
        del_flaged_lumps( &request->add_rm, LUMPFLAG_BRANCH);
        del_flaged_lumps( &request->body_lumps, LUMPFLAG_BRANCH);
-       /* reset branch flags */
-       request->flags &= gflags_mask;
        /* free any potential new uri */
        if (request->new_uri.s!=org_uri->s) {
                pkg_free(request->new_uri.s);
@@ -264,8 +261,8 @@ int add_blind_uac( /*struct cell *t*/ )
    or error (<0); it doesn't send a message yet -- a reply to it
    might interfere with the processes of adding multiple branches
 */
-int add_uac( struct cell *t, struct sip_msg *request, str *uri, str* next_hop, str* path,
-       struct proxy_l *proxy)
+static int add_uac( struct cell *t, struct sip_msg *request, str *uri, 
+                                                       str* next_hop, str* path, struct proxy_l *proxy)
 {
        int ret;
        short temp_proxy;
@@ -349,7 +346,7 @@ int add_uac( struct cell *t, struct sip_msg *request, str *uri, str* next_hop, s
        t->uac[branch].uri.s=t->uac[branch].request.buffer.s+
                request->first_line.u.request.method.len+1;
        t->uac[branch].uri.len=request->new_uri.len;
-       t->uac[branch].br_flags = request->flags&(~gflags_mask);
+       t->uac[branch].br_flags = getb0flags();
        t->nr_of_outgoings++;
 
        /* update stats */
@@ -421,7 +418,7 @@ int e2e_cancel_branch( struct sip_msg *cancel_msg, struct cell *t_cancel,
        t_cancel->uac[branch].uri.s=t_cancel->uac[branch].request.buffer.s+
                cancel_msg->first_line.u.request.method.len+1;
        t_cancel->uac[branch].uri.len=t_invite->uac[branch].uri.len;
-       t_cancel->uac[branch].br_flags = cancel_msg->flags&(~gflags_mask);
+       t_cancel->uac[branch].br_flags = cancel_msg->flags;
 
        /* success */
        ret=1;
@@ -445,7 +442,6 @@ void e2e_cancel( struct sip_msg *cancel_msg,
        int lowest_error;
        str backup_uri;
        str reason;
-       int rurib_flags;
        int ret;
 
        cancel_bm=0;
@@ -454,8 +450,6 @@ void e2e_cancel( struct sip_msg *cancel_msg,
        /* e2e_cancel_branch() makes no RURI parsing, so no need to 
         * save the -> parse_uri_ok */
        backup_uri = cancel_msg->new_uri;
-       /* branch flags specific to RURI */
-       rurib_flags = cancel_msg->flags&(~gflags_mask);
 
        /* determine which branches to cancel ... */
        which_cancel( t_invite, &cancel_bm );
@@ -476,8 +470,7 @@ void e2e_cancel( struct sip_msg *cancel_msg,
        cancel_msg->parsed_uri_ok = 0;
 
        /* set flags */
-       cancel_msg->flags = (cancel_msg->flags&gflags_mask)|rurib_flags;
-       t_cancel->uas.request->flags = cancel_msg->flags&gflags_mask;
+       t_cancel->uas.request->flags = cancel_msg->flags;
 
        /* send them out */
        for (i=t_cancel->first_branch; i<t_cancel->nr_of_outgoings; i++) {
@@ -591,8 +584,8 @@ int t_forward_nonack( struct cell *t, struct sip_msg* p_msg ,
        int try_new;
        str dst_uri;
        struct socket_info *bk_sock;
-       int rurib_flags;
-       int br_flags;
+       unsigned int br_flags;
+       unsigned int bk_br_flags;
        int idx;
        str path;
 
@@ -616,11 +609,11 @@ int t_forward_nonack( struct cell *t, struct sip_msg* p_msg ,
                return -1;
        }
 
-       /* backup current uri, sock and flags ... add_uac changes it */
+       /* backup current uri, sock and flags... add_uac changes it */
        backup_uri = p_msg->new_uri;
        backup_dst = p_msg->dst_uri;
        bk_sock = p_msg->force_send_socket;
-       rurib_flags = p_msg->flags&(~gflags_mask);
+       bk_br_flags = getb0flags();
 
        /* if no more specific error code is known, use this */
        lowest_ret=E_BUG;
@@ -646,8 +639,8 @@ int t_forward_nonack( struct cell *t, struct sip_msg* p_msg ,
        for( idx=0; (current_uri.s=get_branch( idx, &current_uri.len, &q,
        &dst_uri, &path, &br_flags, &p_msg->force_send_socket))!=0 ; idx++ ) {
                try_new++;
-               p_msg->flags = (p_msg->flags&gflags_mask) | br_flags;
-               branch_ret=add_uac( t, p_msg, &current_uri, &dst_uri, &path, proxy);
+               setb0flags(br_flags);
+               branch_ret = add_uac( t, p_msg, &current_uri, &dst_uri, &path, proxy);
                /* pick some of the errors in case things go wrong;
                   note that picking lowest error is just as good as
                   any other algorithm which picks any other negative
@@ -665,13 +658,9 @@ int t_forward_nonack( struct cell *t, struct sip_msg* p_msg ,
        p_msg->parsed_uri_ok = 0;/* just to be sure; add_uac may parse other uris*/
        p_msg->dst_uri = backup_dst;
        p_msg->force_send_socket = bk_sock;
+       setb0flags(bk_br_flags);
        /* update on_branch, if modified */
        t->on_branch = get_on_branch();
-       /* set flags */
-       p_msg->flags = (p_msg->flags&gflags_mask)|rurib_flags;
-       t->uas.request->flags = p_msg->flags&gflags_mask;
-
-       /* don't forget to clear all branches processed so far */
 
        /* things went wrong ... no new branch has been fwd-ed at all */
        if (added_branches==0) {
index 672c554..4a131a4 100644 (file)
@@ -31,8 +31,6 @@
 #include "../../proxy.h"
 #include "../../str.h"
 
-extern unsigned int gflags_mask;
-
 typedef int (*tfwd_f)(struct sip_msg* p_msg , struct proxy_l * proxy );
 typedef int (*taddblind_f)( /*struct cell *t */ );
 
@@ -42,9 +40,6 @@ void e2e_cancel( struct sip_msg *cancel_msg, struct cell *t_cancel,
 int e2e_cancel_branch( struct sip_msg *cancel_msg, struct cell *t_cancel,
                struct cell *t_invite, int branch );
 
-int add_uac( struct cell *t, struct sip_msg *request, str *uri, 
-               str* next_hop, str* path, struct proxy_l *proxy);
-
 int add_blind_uac( );
 
 int t_replicate(struct sip_msg *p_msg, str *dst);
index e440344..30c70b0 100644 (file)
@@ -514,8 +514,10 @@ static inline int fake_req(struct sip_msg *faked_req, struct sip_msg *shm_msg,
        /* dst_set is imposible to restore (since it's not saved),
         * so let it set to NULL */
 
-       /* set as flags the global flags and the flags from the elected branch */
-       faked_req->flags = uas->request->flags | uac->br_flags;
+       /* set as flags the global flags and the branch flags from the 
+        * elected branch */
+       faked_req->flags = uas->request->flags;
+       setb0flags( uac->br_flags);
 
        return 1;
 error:
@@ -606,7 +608,9 @@ static inline int run_failure_handlers(struct cell *t)
        free_faked_req(&faked_req,t);
 
        /* if failure handler changed flag, update transaction context */
-       shmem_msg->flags = faked_req.flags & gflags_mask;
+       shmem_msg->flags = faked_req.flags;
+       /* branch flags do not need to be updated as this branch will be never
+        * used again */
        return 1;
 }
 
@@ -1262,8 +1266,8 @@ int reply_received( struct sip_msg  *p_msg )
        /* processing of on_reply block */
        if (t->on_reply) {
                /* transfer transaction flag to branch context */
-               p_msg->flags = ((p_msg->flags | t->uas.request->flags) & gflags_mask) |
-                       t->uac[branch].br_flags;
+               p_msg->flags = t->uas.request->flags;
+               setb0flags(t->uac[branch].br_flags);
                /* set the as avp_list the one from transaction */
                backup_list = set_avp_list(&t->user_avps);
                /* run block */
@@ -1274,8 +1278,8 @@ int reply_received( struct sip_msg  *p_msg )
                        goto done;
                }
                /* transfer current message context back to t */
-               t->uac[branch].br_flags = p_msg->flags & (~gflags_mask);
-               t->uas.request->flags = p_msg->flags & gflags_mask;
+               t->uac[branch].br_flags = getb0flags();
+               t->uas.request->flags = p_msg->flags;
                /* restore original avp list */
                set_avp_list( backup_list );
        }
index 0a7ab67..45e5303 100644 (file)
@@ -124,7 +124,6 @@ static char *fr_timer_param = FR_TIMER_AVP;
 static char *fr_inv_timer_param = FR_INV_TIMER_AVP;
 
 /* module parameteres */
-static char *bf_mask_param = NULL;
 int tm_enable_stats = 1;
 
 /* statistic variables */
@@ -225,8 +224,6 @@ static param_export_t params[]={
                &fr_inv_timer_param},
        {"tw_append",                 STR_PARAM|USE_FUNC_PARAM,
                (void*)parse_tw_append },
-       {"branch_flag_mask",          STR_PARAM,
-               &bf_mask_param },
        { "enable_stats",             INT_PARAM,
                &tm_enable_stats },
        { "pass_provisional_replies", INT_PARAM,
@@ -577,38 +574,6 @@ static int script_init( struct sip_msg *foo, void *bar)
 }
 
 
-static int init_gf_mask( char* bf_mask )
-{
-       long long int l;
-       char *end;
-
-       if (bf_mask==0)
-               return 0;
-
-       errno = 0;
-       /* try bases 2, 10 and 16 */
-       if (bf_mask[0]=='b' || bf_mask[0]=='B') {
-               l = strtoll( bf_mask+1, &end, 2);
-               if (*end==0 && errno==0)
-                       goto ok;
-       }
-       if (bf_mask[0]=='0' && bf_mask[1]=='x') {
-               l = strtoll( bf_mask+2, &end, 16);
-               if (*end==0 && errno==0)
-                       goto ok;
-       }
-       l = strtoll( bf_mask, &end, 10);
-       if (*end==0 && errno==0)
-               goto ok;
-
-       return -1;
-ok:
-       gflags_mask = ~((unsigned int)l);
-       DBG("DEBUG:tm:init_gf_mask: gflags_mask is %x\n",gflags_mask);
-       return 0;
-}
-
-
 static int mod_init(void)
 {
        LOG(L_INFO,"TM - initializing...\n");
@@ -724,12 +689,6 @@ static int mod_init(void)
                return -1;
        }
 
-       if ( init_gf_mask( bf_mask_param )<0 ) {
-               LOG(L_ERR,"ERROR:tm:mod_init: failed to process "
-                       "\"branch_flag_mask\" param\n");
-               return -1;
-       }
-
        return 0;
 }
 
@@ -858,7 +817,7 @@ static int t_flush_flags(struct sip_msg* msg, char *foo, char *bar)
        }
 
        /* do the flush */
-       t->uas.request->flags = msg->flags&gflags_mask;
+       t->uas.request->flags = msg->flags;
        return 1;
 }
 
index 970e707..d91810a 100644 (file)
@@ -30,27 +30,28 @@ Bogdan-Andrei Iancu
 
         1.3. Exported Parameters
 
-              1.3.1. user_column (string)
-              1.3.2. domain_column (string)
-              1.3.3. contact_column (string)
-              1.3.4. expires_column (string)
-              1.3.5. q_column (string)
-              1.3.6. callid_column (string)
-              1.3.7. cseq_column (string)
-              1.3.8. methods_column (string)
-              1.3.9. flags_column (string)
-              1.3.10. user_agent_column (string)
-              1.3.11. received_column (string)
-              1.3.12. socket_column (string)
-              1.3.13. use_domain (integer)
-              1.3.14. desc_time_order (integer)
-              1.3.15. timer_interval (integer)
-              1.3.16. db_url (string)
-              1.3.17. db_mode (integer)
-              1.3.18. matching_mode (integer)
-              1.3.19. cseq_delay (integer)
-              1.3.20. fetch_rows (integer)
-              1.3.21. hash_size (integer)
+              1.3.1. nat_bflag (integer)
+              1.3.2. user_column (string)
+              1.3.3. domain_column (string)
+              1.3.4. contact_column (string)
+              1.3.5. expires_column (string)
+              1.3.6. q_column (string)
+              1.3.7. callid_column (string)
+              1.3.8. cseq_column (string)
+              1.3.9. methods_column (string)
+              1.3.10. flags_column (string)
+              1.3.11. user_agent_column (string)
+              1.3.12. received_column (string)
+              1.3.13. socket_column (string)
+              1.3.14. use_domain (integer)
+              1.3.15. desc_time_order (integer)
+              1.3.16. timer_interval (integer)
+              1.3.17. db_url (string)
+              1.3.18. db_mode (integer)
+              1.3.19. matching_mode (integer)
+              1.3.20. cseq_delay (integer)
+              1.3.21. fetch_rows (integer)
+              1.3.22. hash_size (integer)
 
         1.4. Exported Functions
 
@@ -80,27 +81,28 @@ Bogdan-Andrei Iancu
    3. Frequently Asked Questions
 
    List of Examples
-   1-1. Set user_column parameter
+   1-1. Set nat_bflag parameter
    1-2. Set user_column parameter
-   1-3. Set contact_column parameter
-   1-4. Set expires_column parameter
-   1-5. Set q_column parameter
-   1-6. Set callid_column parameter
-   1-7. Set cseq_column parameter
-   1-8. Set methods_column parameter
-   1-9. Set flags_column parameter
-   1-10. Set user_agent_column parameter
-   1-11. Set received_column parameter
-   1-12. Set socket_column parameter
-   1-13. Set use_domain parameter
-   1-14. Set desc_time_order parameter
-   1-15. Set timer_interval parameter
-   1-16. Set db_url parameter
-   1-17. Set db_mode parameter
-   1-18. Set matching_mode parameter
-   1-19. Set cseq_delay parameter
-   1-20. Set fetch_rows parameter
-   1-21. Set hash_size parameter
+   1-3. Set user_column parameter
+   1-4. Set contact_column parameter
+   1-5. Set expires_column parameter
+   1-6. Set q_column parameter
+   1-7. Set callid_column parameter
+   1-8. Set cseq_column parameter
+   1-9. Set methods_column parameter
+   1-10. Set flags_column parameter
+   1-11. Set user_agent_column parameter
+   1-12. Set received_column parameter
+   1-13. Set socket_column parameter
+   1-14. Set use_domain parameter
+   1-15. Set desc_time_order parameter
+   1-16. Set timer_interval parameter
+   1-17. Set db_url parameter
+   1-18. Set db_mode parameter
+   1-19. Set matching_mode parameter
+   1-20. Set cseq_delay parameter
+   1-21. Set fetch_rows parameter
+   1-22. Set hash_size parameter
      _________________________________________________________
 
 Chapter 1. User's Guide
@@ -139,7 +141,7 @@ Chapter 1. User's Guide
        how you deal with REGISTER retransmissions in this case.
 
    How to control/select the contact maching algorithm, please
-   see the module parameter matching_mode at Section 1.3.18.
+   see the module parameter matching_mode at Section 1.3.19.
      _________________________________________________________
 
 1.2. Dependencies
@@ -161,153 +163,168 @@ Chapter 1. User's Guide
 
 1.3. Exported Parameters
 
-1.3.1. user_column (string)
+1.3.1. nat_bflag (integer)
+
+   The index of the flag to be used as NAT marker (if the contact
+   is or not natted). This is a branch flag and it will be
+   imported and used by all other modules depending of usrloc
+   module.
+
+   Default value is "not set". 
+
+   Example 1-1. Set nat_bflag parameter
+...
+modparam("usrloc", "nat_bflag", 3)
+...
+     _________________________________________________________
+
+1.3.2. user_column (string)
 
    Name of column containing usernames.
 
    Default value is "username". 
 
-   Example 1-1. Set user_column parameter
+   Example 1-2. Set user_column parameter
 ...
 modparam("usrloc", "user_column", "username")
 ...
      _________________________________________________________
 
-1.3.2. domain_column (string)
+1.3.3. domain_column (string)
 
    Name of column containing domains.
 
    Default value is "domain". 
 
-   Example 1-2. Set user_column parameter
+   Example 1-3. Set user_column parameter
 ...
 modparam("usrloc", "domain_column", "domain")
 ...
      _________________________________________________________
 
-1.3.3. contact_column (string)
+1.3.4. contact_column (string)
 
    Name of column containing contacts.
 
    Default value is "contact". 
 
-   Example 1-3. Set contact_column parameter
+   Example 1-4. Set contact_column parameter
 ...
 modparam("usrloc", "contact_column", "contact")
 ...
      _________________________________________________________
 
-1.3.4. expires_column (string)
+1.3.5. expires_column (string)
 
    Name of column containing expires value.
 
    Default value is "expires". 
 
-   Example 1-4. Set expires_column parameter
+   Example 1-5. Set expires_column parameter
 ...
 modparam("usrloc", "expires_column", "expires")
 ...
      _________________________________________________________
 
-1.3.5. q_column (string)
+1.3.6. q_column (string)
 
    Name of column containing q values.
 
    Default value is "q". 
 
-   Example 1-5. Set q_column parameter
+   Example 1-6. Set q_column parameter
 ...
 modparam("usrloc", "q_column", "q")
 ...
      _________________________________________________________
 
-1.3.6. callid_column (string)
+1.3.7. callid_column (string)
 
    Name of column containing callid values.
 
    Default value is "callid". 
 
-   Example 1-6. Set callid_column parameter
+   Example 1-7. Set callid_column parameter
 ...
 modparam("usrloc", "callid_column", "callid")
 ...
      _________________________________________________________
 
-1.3.7. cseq_column (string)
+1.3.8. cseq_column (string)
 
    Name of column containing cseq numbers.
 
    Default value is "cseq". 
 
-   Example 1-7. Set cseq_column parameter
+   Example 1-8. Set cseq_column parameter
 ...
 modparam("usrloc", "cseq_column", "cseq")
 ...
      _________________________________________________________
 
-1.3.8. methods_column (string)
+1.3.9. methods_column (string)
 
    Name of column containing supported methods.
 
    Default value is "methods". 
 
-   Example 1-8. Set methods_column parameter
+   Example 1-9. Set methods_column parameter
 ...
 modparam("usrloc", "methods_column", "methods")
 ...
      _________________________________________________________
 
-1.3.9. flags_column (string)
+1.3.10. flags_column (string)
 
    Name of column to save the internal flags of the record.
 
    Default value is "flags". 
 
-   Example 1-9. Set flags_column parameter
+   Example 1-10. Set flags_column parameter
 ...
 modparam("usrloc", "flags_column", "flags")
 ...
      _________________________________________________________
 
-1.3.10. user_agent_column (string)
+1.3.11. user_agent_column (string)
 
    Name of column containing user-agent values.
 
    Default value is "user_agent". 
 
-   Example 1-10. Set user_agent_column parameter
+   Example 1-11. Set user_agent_column parameter
 ...
 modparam("usrloc", "user_agent_column", "user_agent")
 ...
      _________________________________________________________
 
-1.3.11. received_column (string)
+1.3.12. received_column (string)
 
    Name of column containing the source IP, port, and protocol
    from the REGISTER message.
 
    Default value is "received". 
 
-   Example 1-11. Set received_column parameter
+   Example 1-12. Set received_column parameter
 ...
 modparam("usrloc", "received_column", "received")
 ...
      _________________________________________________________
 
-1.3.12. socket_column (string)
+1.3.13. socket_column (string)
 
    Name of column containing the received socket information
    (IP:port) for the REGISTER message.
 
    Default value is "socket". 
 
-   Example 1-12. Set socket_column parameter
+   Example 1-13. Set socket_column parameter
 ...
 modparam("usrloc", "socket_column", "socket")
 ...
      _________________________________________________________
 
-1.3.13. use_domain (integer)
+1.3.14. use_domain (integer)
 
    If the domain part of the user should be also saved and used
    for identifing the user (along with the username part). Useful
@@ -315,13 +332,13 @@ modparam("usrloc", "socket_column", "socket")
 
    Default value is "0 (false)". 
 
-   Example 1-13. Set use_domain parameter
+   Example 1-14. Set use_domain parameter
 ...
 modparam("usrloc", "use_domain", 1)
 ...
      _________________________________________________________
 
-1.3.14. desc_time_order (integer)
+1.3.15. desc_time_order (integer)
 
    If the user's contacts should be kept timestamp ordered;
    otherwise the contact will be ordered based on q value. Non 0
@@ -329,13 +346,13 @@ modparam("usrloc", "use_domain", 1)
 
    Default value is "0 (false)". 
 
-   Example 1-14. Set desc_time_order parameter
+   Example 1-15. Set desc_time_order parameter
 ...
 modparam("usrloc", "desc_time_order", 1)
 ...
      _________________________________________________________
 
-1.3.15. timer_interval (integer)
+1.3.16. timer_interval (integer)
 
    Number of seconds between two timer runs. The module uses
    timer to delete expired contacts, synchronize with database
@@ -343,27 +360,27 @@ modparam("usrloc", "desc_time_order", 1)
 
    Default value is 60. 
 
-   Example 1-15. Set timer_interval parameter
+   Example 1-16. Set timer_interval parameter
 ...
 modparam("usrloc", "timer_interval", 120)
 ...
      _________________________________________________________
 
-1.3.16. db_url (string)
+1.3.17. db_url (string)
 
    URL of the database that should be used.
 
    Default value is
    "mysql://openser:openserrw@localhost/openser". 
 
-   Example 1-16. Set db_url parameter
+   Example 1-17. Set db_url parameter
 ...
 modparam("usrloc", "db_url", "mysql://username:password@localhost/opens
 er")
 ...
      _________________________________________________________
 
-1.3.17. db_mode (integer)
+1.3.18. db_mode (integer)
 
    The usrloc module can utilize database for persistent contact
    storage. If you use database, your contacts will survive
@@ -411,13 +428,13 @@ er")
 
    Default value is 0. 
 
-   Example 1-17. Set db_mode parameter
+   Example 1-18. Set db_mode parameter
 ...
 modparam("usrloc", "db_mode", 2)
 ...
      _________________________________________________________
 
-1.3.18. matching_mode (integer)
+1.3.19. matching_mode (integer)
 
    What contact matching algorithm to be used. Refer to section
    Section 1.1.1 for the description of the algorithms.
@@ -429,13 +446,13 @@ modparam("usrloc", "db_mode", 2)
 
    Default value is 0 (CONTACT_ONLY). 
 
-   Example 1-18. Set matching_mode parameter
+   Example 1-19. Set matching_mode parameter
 ...
 modparam("usrloc", "matching_mode", 1)
 ...
      _________________________________________________________
 
-1.3.19. cseq_delay (integer)
+1.3.20. cseq_delay (integer)
 
    Delay (in seconds) for accepting as retransmissions register
    requests with same Call-ID and Cseq. The delay is calculated
@@ -450,13 +467,13 @@ modparam("usrloc", "matching_mode", 1)
 
    Default value is "20 seconds". 
 
-   Example 1-19. Set cseq_delay parameter
+   Example 1-20. Set cseq_delay parameter
 ...
 modparam("usrloc", "cseq_delay", 5)
 ...
      _________________________________________________________
 
-1.3.20. fetch_rows (integer)
+1.3.21. fetch_rows (integer)
 
    The number of the rows to be fetched at once from database
    when loading the location records. This value can be used to
@@ -466,13 +483,13 @@ modparam("usrloc", "cseq_delay", 5)
 
    Default value is "2000". 
 
-   Example 1-20. Set fetch_rows parameter
+   Example 1-21. Set fetch_rows parameter
 ...
 modparam("usrloc", "fetch_rows", 3000)
 ...
      _________________________________________________________
 
-1.3.21. hash_size (integer)
+1.3.22. hash_size (integer)
 
    The number of entries of the hash table used by usrloc to
    store the location records is 2^hash_size. For hash_size=4,
@@ -480,7 +497,7 @@ modparam("usrloc", "fetch_rows", 3000)
 
    Default value is "9". 
 
-   Example 1-21. Set hash_size parameter
+   Example 1-22. Set hash_size parameter
 ...
 modparam("usrloc", "hash_size", 10)
 ...
index 1c87fa6..5c824e8 100644 (file)
@@ -386,7 +386,7 @@ int register_udomain(const char* _n, udomain_t** _d)
                return -1;
        }
 
-       /* Preload domain with data from database if we are gonna
+       /* Test tables from database if we are gonna
         * to use database
         */
        if (db_mode != NO_DB) {
@@ -408,25 +408,12 @@ int register_udomain(const char* _n, udomain_t** _d)
                                "(use openser_mysql.sh reinstall)\n");
                        goto err;
                }
-#if 0
-               if (db_mode!= DB_ONLY) {
-                       /* if cache is used, populate it from DB */
-                       if (preload_udomain(con, d->d) < 0) {
-                               LOG(L_ERR, "register_udomain(): Error while preloading "
-                                       "domain '%.*s'\n", s.len, ZSW(s.s));
-                               goto err;
-                       }
-               } else {
-#endif
-                       /* test if DB really exists */
-                       if (testdb_udomain(con, d->d) < 0) {
-                               LOG(L_ERR, "register_udomain(): Error while testing "
-                                       "domain '%.*s'\n", s.len, ZSW(s.s));
-                               goto err;
-                       }
-#if 0
+               /* test if DB really exists */
+               if (testdb_udomain(con, d->d) < 0) {
+                       LOG(L_ERR, "register_udomain(): Error while testing "
+                               "domain '%.*s'\n", s.len, ZSW(s.s));
+                       goto err;
                }
-#endif
 
                ul_dbf.close(con);
        }
index 371cce7..7f6e91c 100644 (file)
        </section>
        <section>
        <title>Exported Parameters</title>
+       <section>
+               <title><varname>nat_bflag</varname> (integer)</title>
+               <para>
+               The index of the flag to be used as NAT marker (if the contact is or 
+               not natted). This is a branch flag and it will be imported and used by
+               all other modules depending of usrloc module.
+               </para>
+               <para>
+               <emphasis>
+                       Default value is <quote>not set</quote>.
+               </emphasis>
+               </para>
+               <example>
+               <title>Set <varname>nat_bflag</varname> parameter</title>
+               <programlisting format="linespecific">
+...
+modparam("usrloc", "nat_bflag", 3)
+...
+</programlisting>
+               </example>
+       </section>
+
        <section>
                <title><varname>user_column</varname> (string)</title>
                <para>
index 2c6c359..98e3bc5 100644 (file)
@@ -88,7 +88,8 @@ ucontact_t* new_ucontact(str* _dom, str* _aor, str* _contact,
        c->sock = _ci->sock;
        c->cseq = _ci->cseq;
        c->state = CS_NEW;
-       c->flags = _ci->flags1;
+       c->flags = _ci->flags;
+       c->cflags = _ci->cflags;
        c->methods = _ci->methods;
        c->last_modified = _ci->last_modified;
 
@@ -225,8 +226,8 @@ int mem_update_ucontact(ucontact_t* _c, ucontact_info_t* _ci)
        _c->cseq = _ci->cseq;
        _c->methods = _ci->methods;
        _c->last_modified = _ci->last_modified;
-       _c->flags |= _ci->flags1;
-       _c->flags &= ~_ci->flags2;
+       _c->flags = _ci->flags;
+       _c->cflags = _ci->cflags;
 
        return 0;
 }
@@ -384,8 +385,8 @@ int st_flush_ucontact(ucontact_t* _c)
 int db_insert_ucontact(ucontact_t* _c)
 {
        char* dom;
-       db_key_t keys[14];
-       db_val_t vals[14];
+       db_key_t keys[15];
+       db_val_t vals[15];
        
        if (_c->flags & FL_MEM) {
                return 0;
@@ -398,13 +399,14 @@ int db_insert_ucontact(ucontact_t* _c)
        keys[4] = callid_col.s;
        keys[5] = cseq_col.s;
        keys[6] = flags_col.s;
-       keys[7] = user_agent_col.s;
-       keys[8] = received_col.s;
-       keys[9] = path_col.s;
-       keys[10] = sock_col.s;
-       keys[11] = methods_col.s;
-       keys[12] = last_mod_col.s;
-       keys[13] = domain_col.s;
+       keys[7] = cflags_col.s;
+       keys[8] = user_agent_col.s;
+       keys[9] = received_col.s;
+       keys[10] = path_col.s;
+       keys[11] = sock_col.s;
+       keys[12] = methods_col.s;
+       keys[13] = last_mod_col.s;
+       keys[14] = domain_col.s;
 
        vals[0].type = DB_STR;
        vals[0].nul = 0;
@@ -437,61 +439,65 @@ int db_insert_ucontact(ucontact_t* _c)
        vals[6].nul = 0;
        vals[6].val.bitmap_val = _c->flags;
 
-       vals[7].type = DB_STR;
+       vals[7].type = DB_INT;
        vals[7].nul = 0;
-       vals[7].val.str_val.s = _c->user_agent.s;
-       vals[7].val.str_val.len = _c->user_agent.len;
+       vals[7].val.bitmap_val = _c->cflags;
 
        vals[8].type = DB_STR;
+       vals[8].nul = 0;
+       vals[8].val.str_val.s = _c->user_agent.s;
+       vals[8].val.str_val.len = _c->user_agent.len;
+
+       vals[9].type = DB_STR;
        if (_c->received.s == 0) {
-               vals[8].nul = 1;
+               vals[9].nul = 1;
        } else {
-               vals[8].nul = 0;
-               vals[8].val.str_val.s = _c->received.s;
-               vals[8].val.str_val.len = _c->received.len;
+               vals[9].nul = 0;
+               vals[9].val.str_val.s = _c->received.s;
+               vals[9].val.str_val.len = _c->received.len;
        }
        
-       vals[9].type = DB_STR;
+       vals[10].type = DB_STR;
        if (_c->path.s == 0) {
-               vals[9].nul = 1;
+               vals[10].nul = 1;
        } else {
-               vals[9].nul = 0;
-               vals[9].val.str_val.s = _c->path.s;
-               vals[9].val.str_val.len = _c->path.len;
+               vals[10].nul = 0;
+               vals[10].val.str_val.s = _c->path.s;
+               vals[10].val.str_val.len = _c->path.len;
        }
 
-       vals[10].type = DB_STR;
+       vals[11].type = DB_STR;
        if (_c->sock) {
-               vals[10].val.str_val = _c->sock->sock_str;
-               vals[10].nul = 0;
+               vals[11].val.str_val = _c->sock->sock_str;
+               vals[11].nul = 0;
        } else {
-               vals[10].nul = 1;
+               vals[11].nul = 1;
        }
 
-       vals[11].type = DB_BITMAP;
+       vals[12].type = DB_BITMAP;
        if (_c->methods == 0xFFFFFFFF) {
-               vals[11].nul = 1;
+               vals[12].nul = 1;
        } else {
-               vals[11].val.bitmap_val = _c->methods;
-               vals[11].nul = 0;
+               vals[12].val.bitmap_val = _c->methods;
+               vals[12].nul = 0;
        }
 
-       vals[12].type = DB_DATETIME;
-       vals[12].nul = 0;
-       vals[12].val.time_val = _c->last_modified;
+       vals[13].type = DB_DATETIME;
+       vals[13].nul = 0;
+       vals[13].val.time_val = _c->last_modified;
 
        if (use_domain) {
-               vals[13].type = DB_STR;
-               vals[13].nul = 0;
+               vals[14].type = DB_STR;
+               vals[14].nul = 0;
 
                dom = q_memchr(_c->aor->s, '@', _c->aor->len);
                if (dom==0) {
                        vals[0].val.str_val.len = 0;
-                       vals[13].val.str_val = *_c->aor;
+                       vals[14].val.str_val = *_c->aor;
                } else {
                        vals[0].val.str_val.len = dom - _c->aor->s;
-                       vals[13].val.str_val.s = dom + 1;
-                       vals[13].val.str_val.len = _c->aor->s + _c->aor->len - dom - 1;
+                       vals[14].val.str_val.s = dom + 1;
+                       vals[14].val.str_val.len = _c->aor->s + _c->aor->len - dom - 1;
                }
        }
 
@@ -500,7 +506,7 @@ int db_insert_ucontact(ucontact_t* _c)
                return -1;
        }
 
-       if (ul_dbf.insert(ul_dbh, keys, vals, (use_domain) ? (14) : (13)) < 0) {
+       if (ul_dbf.insert(ul_dbh, keys, vals, (use_domain) ? (15) : (14)) < 0) {
                LOG(L_ERR, "db_insert_ucontact(): Error while inserting contact\n");
                return -1;
        }
@@ -518,8 +524,8 @@ int db_update_ucontact(ucontact_t* _c)
        db_key_t keys1[3];
        db_val_t vals1[3];
 
-       db_key_t keys2[11];
-       db_val_t vals2[11];
+       db_key_t keys2[12];
+       db_val_t vals2[12];
 
        if (_c->flags & FL_MEM) {
                return 0;
@@ -533,12 +539,13 @@ int db_update_ucontact(ucontact_t* _c)
        keys2[2] = callid_col.s;
        keys2[3] = cseq_col.s;
        keys2[4] = flags_col.s;
-       keys2[5] = user_agent_col.s;
-       keys2[6] = received_col.s;
-       keys2[7] = path_col.s;
-       keys2[8] = sock_col.s;
-       keys2[9] = methods_col.s;
-       keys2[10] = last_mod_col.s;
+       keys2[5] = cflags_col.s;
+       keys2[6] = user_agent_col.s;
+       keys2[7] = received_col.s;
+       keys2[8] = path_col.s;
+       keys2[9] = sock_col.s;
+       keys2[10] = methods_col.s;
+       keys2[11] = last_mod_col.s;
 
        vals1[0].type = DB_STR;
        vals1[0].nul = 0;
@@ -568,45 +575,49 @@ int db_update_ucontact(ucontact_t* _c)
        vals2[4].nul = 0;
        vals2[4].val.bitmap_val = _c->flags;
 
-       vals2[5].type = DB_STR;
+       vals2[5].type = DB_INT;
        vals2[5].nul = 0;
-       vals2[5].val.str_val = _c->user_agent;
+       vals2[5].val.bitmap_val = _c->cflags;
 
        vals2[6].type = DB_STR;
+       vals2[6].nul = 0;
+       vals2[6].val.str_val = _c->user_agent;
+
+       vals2[7].type = DB_STR;
        if (_c->received.s == 0) {
-               vals2[6].nul = 1;
+               vals2[7].nul = 1;
        } else {
-               vals2[6].nul = 0;
-               vals2[6].val.str_val = _c->received;
+               vals2[7].nul = 0;
+               vals2[7].val.str_val = _c->received;
        }
        
-       vals2[7].type = DB_STR;
+       vals2[8].type = DB_STR;
        if (_c->path.s == 0) {
-               vals2[7].nul = 1;
+               vals2[8].nul = 1;
        } else {
-               vals2[7].nul = 0;
-               vals2[7].val.str_val = _c->path;
+               vals2[8].nul = 0;
+               vals2[8].val.str_val = _c->path;
        }
 
-       vals2[8].type = DB_STR;
+       vals2[9].type = DB_STR;
        if (_c->sock) {
-               vals2[8].val.str_val = _c->sock->sock_str;
-               vals2[8].nul = 0;
+               vals2[9].val.str_val = _c->sock->sock_str;
+               vals2[9].nul = 0;
        } else {
-               vals2[8].nul = 1;
+               vals2[9].nul = 1;
        }
 
-       vals2[9].type = DB_BITMAP;
+       vals2[10].type = DB_BITMAP;
        if (_c->methods == 0xFFFFFFFF) {
-               vals2[9].nul = 1;
+               vals2[10].nul = 1;
        } else {
-               vals2[9].val.bitmap_val = _c->methods;
-               vals2[9].nul = 0;
+               vals2[10].val.bitmap_val = _c->methods;
+               vals2[10].nul = 0;
        }
 
-       vals2[10].type = DB_DATETIME;
-       vals2[10].nul = 0;
-       vals2[10].val.time_val = _c->last_modified;
+       vals2[11].type = DB_DATETIME;
+       vals2[11].nul = 0;
+       vals2[11].val.time_val = _c->last_modified;
 
        if (use_domain) {
                dom = q_memchr(_c->aor->s, '@', _c->aor->len);
@@ -624,7 +635,7 @@ int db_update_ucontact(ucontact_t* _c)
        }
 
        if (ul_dbf.update(ul_dbh, keys1, 0, vals1, keys2, vals2, 
-       (use_domain) ? (3) : (2), 11) < 0) {
+       (use_domain) ? (3) : (2), 12) < 0) {
                LOG(L_ERR, "db_upd_ucontact(): Error while updating database\n");
                return -1;
        }
index cc012d7..7922757 100644 (file)
@@ -52,9 +52,8 @@ typedef enum cstate {
  */
 typedef enum flags {
        FL_NONE        = 0,          /* No flags set */
-       FL_NAT         = 1 << 0,     /* Contact is behind NAT */
-       FL_MEM         = 1 << 1,     /* Update memory only -- used for REGISTER replication */
-       FL_NAT_SIPPING = 1 << 2,     /* Use SIP ping if nated */
+       FL_MEM         = 1 << 0,     /* Update memory only */
+       FL_NAT_SIPPING = 1 << 1,     /* Use SIP ping if nated */
        FL_ALL         = (int)0xFFFFFFFF  /* All flags set */
 } flags_t;
 
@@ -70,7 +69,8 @@ typedef struct ucontact {
        str callid;             /* Call-ID header field */
        int cseq;               /* CSeq value */
        cstate_t state;         /* State of the contact */
-       unsigned int flags;     /* Various flags (NAT, supported methods etc) */
+       unsigned int flags;     /* Various flags (NAT, ping type, etc) */
+       unsigned int cflags;    /* custom contact flags (from script) */
        str user_agent;         /* User-Agent header field */
        struct socket_info *sock; /* received soket */
        time_t last_modified;   /* when the record was last modified */
@@ -86,8 +86,8 @@ typedef struct ucontact_info {
        qvalue_t q;
        str* callid;
        int cseq;
-       unsigned int flags1;
-       unsigned int flags2;
+       unsigned int flags;
+       unsigned int cflags;
        str *user_agent;
        struct socket_info *sock;
        unsigned int methods;
index f66f57d..8191ea5 100644 (file)
@@ -257,10 +257,16 @@ static inline ucontact_info_t* dbrow2info( db_val_t *vals, str *contact)
                LOG(L_CRIT, "ERROR:usrloc:dbrow2info: empty flag\n");
                return 0;
        }
-       ci.flags1  = VAL_BITMAP(vals+5);
+       ci.flags  = VAL_BITMAP(vals+5);
 
-       ua.s  = (char*)VAL_STRING(vals+6);
-       if (VAL_NULL(vals+6) || !ua.s || !ua.s[0]) {
+       if (VAL_NULL(vals+6)) {
+               LOG(L_CRIT, "ERROR:usrloc:dbrow2info: empty cflag\n");
+               return 0;
+       }
+       ci.cflags  = VAL_BITMAP(vals+6);
+
+       ua.s  = (char*)VAL_STRING(vals+7);
+       if (VAL_NULL(vals+7) || !ua.s || !ua.s[0]) {
                ua.s = 0;
                ua.len = 0;
        } else {
@@ -268,8 +274,8 @@ static inline ucontact_info_t* dbrow2info( db_val_t *vals, str *contact)
        }
        ci.user_agent = &ua;
 
-       received.s  = (char*)VAL_STRING(vals+7);
-       if (VAL_NULL(vals+7) || !received.s || !received.s[0]) {
+       received.s  = (char*)VAL_STRING(vals+8);
+       if (VAL_NULL(vals+8) || !received.s || !received.s[0]) {
                received.len = 0;
                received.s = 0;
        } else {
@@ -277,8 +283,8 @@ static inline ucontact_info_t* dbrow2info( db_val_t *vals, str *contact)
        }
        ci.received = received;
        
-       path.s  = (char*)VAL_STRING(vals+8);
-               if (VAL_NULL(vals+8) || !path.s || !path.s[0]) {
+       path.s  = (char*)VAL_STRING(vals+9);
+               if (VAL_NULL(vals+9) || !path.s || !path.s[0]) {
                        path.len = 0;
                        path.s = 0;
                } else {
@@ -287,8 +293,8 @@ static inline ucontact_info_t* dbrow2info( db_val_t *vals, str *contact)
        ci.path= &path;
 
        /* socket name */
-       p  = (char*)VAL_STRING(vals+9);
-       if (VAL_NULL(vals+9) || p==0 || p[0]==0){
+       p  = (char*)VAL_STRING(vals+10);
+       if (VAL_NULL(vals+10) || p==0 || p[0]==0){
                ci.sock = 0;
        } else {
                if (parse_phostport( p, strlen(p), &host.s, &host.len, 
@@ -304,15 +310,15 @@ static inline ucontact_info_t* dbrow2info( db_val_t *vals, str *contact)
        }
 
        /* supported methods */
-       if (VAL_NULL(vals+10)) {
+       if (VAL_NULL(vals+11)) {
                ci.methods = ALL_METHODS;
        } else {
-               ci.methods = VAL_BITMAP(vals+10);
+               ci.methods = VAL_BITMAP(vals+11);
        }
 
        /* last modified time */
-       if (!VAL_NULL(vals+11)) {
-               ci.last_modified = VAL_TIME(vals+11);
+       if (!VAL_NULL(vals+12)) {
+               ci.last_modified = VAL_TIME(vals+12);
        }
 
        return &ci;
@@ -324,7 +330,7 @@ int preload_udomain(db_con_t* _c, udomain_t* _d)
        char uri[MAX_URI_SIZE];
        ucontact_info_t *ci;
        db_row_t *row;
-       db_key_t columns[14];
+       db_key_t columns[15];
        db_res_t* res = NULL;
        str user, contact;
        char* domain;
@@ -341,13 +347,14 @@ int preload_udomain(db_con_t* _c, udomain_t* _d)
        columns[4] = callid_col.s;
        columns[5] = cseq_col.s;
        columns[6] = flags_col.s;
-       columns[7] = user_agent_col.s;
-       columns[8] = received_col.s;
-       columns[9] = path_col.s;
-       columns[10] = sock_col.s;
-       columns[11] = methods_col.s;
-       columns[12] = last_mod_col.s;
-       columns[13] = domain_col.s;
+       columns[7] = cflags_col.s;
+       columns[8] = user_agent_col.s;
+       columns[9] = received_col.s;
+       columns[10] = path_col.s;
+       columns[11] = sock_col.s;
+       columns[12] = methods_col.s;
+       columns[13] = last_mod_col.s;
+       columns[14] = domain_col.s;
 
        if (ul_dbf.use_table(_c, _d->name->s) < 0) {
                LOG(L_ERR, "preload_udomain(): Error in use_table\n");
@@ -360,8 +367,8 @@ int preload_udomain(db_con_t* _c, udomain_t* _d)
 #endif
 
        if (DB_CAPABILITY(ul_dbf, DB_CAP_FETCH)) {
-               if (ul_dbf.query(_c, 0, 0, 0, columns, 0, (use_domain) ? (14) : (13), 0,
-                               0) < 0) {
+               if (ul_dbf.query(_c, 0, 0, 0, columns, 0, (use_domain)?(15):(14), 0,
+               0) < 0) {
                        LOG(L_ERR, "preload_udomain(): Error while doing db_query (1)\n");
                        return -1;
                }
@@ -370,8 +377,8 @@ int preload_udomain(db_con_t* _c, udomain_t* _d)
                        return -1;
                }
        } else {
-               if (ul_dbf.query(_c, 0, 0, 0, columns, 0, (use_domain) ? (14) : (13), 0,
-                               &res) < 0) {
+               if (ul_dbf.query(_c, 0, 0, 0, columns, 0, (use_domain)?(15):(14), 0,
+               &res) < 0) {
                        LOG(L_ERR, "preload_udomain(): Error while doing db_query\n");
                        return -1;
                }
@@ -406,8 +413,8 @@ int preload_udomain(db_con_t* _c, udomain_t* _d)
                        }
 
                        if (use_domain) {
-                               domain = (char*)VAL_STRING(ROW_VALUES(row) + 13);
-                               if (VAL_NULL(ROW_VALUES(row)+12) || domain==0 || domain[0]==0) {
+                               domain = (char*)VAL_STRING(ROW_VALUES(row) + 14);
+                               if (VAL_NULL(ROW_VALUES(row)+13) || domain==0 || domain[0]==0){
                                        LOG(L_CRIT, "ERROR:usrloc:preload_udomain: empty domain "
                                        "record for user %.*s...skipping\n", user.len, user.s);
                                        continue;
@@ -446,11 +453,8 @@ int preload_udomain(db_con_t* _c, udomain_t* _d)
                        c->state = CS_SYNC;
                        unlock_udomain(_d, &user);
                }
-               
+
                if (DB_CAPABILITY(ul_dbf, DB_CAP_FETCH)) {
-                       /* give a bigger chance to other processes to access usrloc
-                        *  -- check first if usleep(s) is portable -- */
-                       /* usleep(10); */
                        if(ul_dbf.fetch_result(_c, &res, ul_fetch_rows)<0) {
                                LOG(L_ERR, "ul:preload_udomain(): Error fetching rows (1)\n");
                                ul_dbf.free_result(_c, res);
@@ -482,7 +486,7 @@ error:
 urecord_t* db_load_urecord(db_con_t* _c, udomain_t* _d, str *_aor)
 {
        ucontact_info_t *ci;
-       db_key_t columns[12];
+       db_key_t columns[13];
        db_key_t keys[2];
        db_key_t order;
        db_val_t vals[2];
@@ -521,12 +525,13 @@ urecord_t* db_load_urecord(db_con_t* _c, udomain_t* _d, str *_aor)
        columns[3] = callid_col.s;
        columns[4] = cseq_col.s;
        columns[5] = flags_col.s;
-       columns[6] = user_agent_col.s;
-       columns[7] = received_col.s;
-       columns[8] = path_col.s;
-       columns[9] = sock_col.s;
-       columns[10] = methods_col.s;
-       columns[11] = last_mod_col.s;
+       columns[6] = cflags_col.s;
+       columns[7] = user_agent_col.s;
+       columns[8] = received_col.s;
+       columns[9] = path_col.s;
+       columns[10] = sock_col.s;
+       columns[11] = methods_col.s;
+       columns[12] = last_mod_col.s;
 
        if (desc_time_order)
                order = last_mod_col.s;
@@ -538,7 +543,7 @@ urecord_t* db_load_urecord(db_con_t* _c, udomain_t* _d, str *_aor)
                return 0;
        }
 
-       if (ul_dbf.query(_c, keys, 0, vals, columns, (use_domain)?2:1, 12, order,
+       if (ul_dbf.query(_c, keys, 0, vals, columns, (use_domain)?2:1, 13, order,
                                &res) < 0) {
                LOG(L_ERR, "ERROR:usrloc:db_load_urecord: db_query failed\n");
                return 0;
index 673ff49..06373f1 100644 (file)
@@ -258,7 +258,7 @@ static int ul_add(FILE* pipe, char* response_file)
                        return 1;
                }
 
-               if (str2int(&flags, (unsigned int*)&ci.flags1) < 0) {
+               if (str2int(&flags, (unsigned int*)&ci.flags) < 0) {
                        fifo_reply(response_file, "400 Invalid flags format\n");
                        return 1;
                }
index 991b264..44ddd53 100644 (file)
@@ -442,7 +442,7 @@ struct mi_root* mi_usrloc_add(struct mi_root *cmd, void *param)
 
        /* flags value (param 7) */
        node = node->next;
-       if (str2int( &node->value, (unsigned int*)&ci.flags1) < 0)
+       if (str2int( &node->value, (unsigned int*)&ci.flags) < 0)
                goto bad_syntax;
 
        /* flags value (param 8) */
index 06aa7b0..d59fc1f 100644 (file)
@@ -62,6 +62,7 @@ MODULE_VERSION
 #define CSEQ_COL       "cseq"
 #define METHOD_COL     "method"
 #define FLAGS_COL      "flags"
+#define CFLAGS_COL     "cflags"
 #define USER_AGENT_COL "user_agent"
 #define RECEIVED_COL   "received"
 #define PATH_COL       "path"
@@ -97,8 +98,10 @@ str callid_col      = str_init(CALLID_COL);
 str cseq_col        = str_init(CSEQ_COL);
 /* Name of column containing supported method */
 str method_col      = str_init(METHOD_COL);
-/* Name of column containing flags */
+/* Name of column containing internal flags */
 str flags_col       = str_init(FLAGS_COL);
+/* Name of column containing contact flags */
+str cflags_col      = str_init(CFLAGS_COL);
 /* Name of column containing user agent string */
 str user_agent_col  = str_init(USER_AGENT_COL);
 /* Name of column containing transport info of REGISTER */
@@ -127,6 +130,10 @@ int desc_time_order = 0;
 int ul_fetch_rows = 2000;
 int ul_hash_size = 9;
 
+/* flag */
+unsigned int nat_bflag = (unsigned int)-1;
+unsigned int init_flag = 0;
+
 db_con_t* ul_dbh = 0; /* Database connection handle */
 db_func_t ul_dbf;
 
@@ -170,6 +177,7 @@ static param_export_t params[] = {
        {"cseq_column",       STR_PARAM, &cseq_col.s      },
        {"method_column",     STR_PARAM, &method_col.s    },
        {"flags_column",      STR_PARAM, &flags_col.s     },
+       {"cflags_column",     STR_PARAM, &cflags_col.s    },
        {"db_url",            STR_PARAM, &db_url.s        },
        {"timer_interval",    INT_PARAM, &timer_interval  },
        {"db_mode",           INT_PARAM, &db_mode         },
@@ -183,7 +191,8 @@ static param_export_t params[] = {
        {"matching_mode",     INT_PARAM, &matching_mode   },
        {"cseq_delay",        INT_PARAM, &cseq_delay      },
        {"fetch_rows",        INT_PARAM, &ul_fetch_rows   },
-       {"hash_size",         INT_PARAM, &ul_hash_size   },
+       {"hash_size",         INT_PARAM, &ul_hash_size    },
+       {"nat_bflag",         INT_PARAM, &nat_bflag       },
        {0, 0, 0}
 };
 
@@ -243,6 +252,7 @@ static int mod_init(void)
        cseq_col.len = strlen(cseq_col.s);
        method_col.len = strlen(method_col.s);
        flags_col.len = strlen(flags_col.s);
+       cflags_col.len = strlen(cflags_col.s);
        user_agent_col.len = strlen(user_agent_col.s);
        received_col.len = strlen(received_col.s);
        path_col.len = strlen(path_col.s);
@@ -311,6 +321,18 @@ static int mod_init(void)
                }
        }
 
+       if (nat_bflag==(unsigned int)-1) {
+               nat_bflag = 0;
+       } else if ( nat_bflag>=8*sizeof(nat_bflag) ) {
+               LOG(L_ERR,"ERROR:usrloc:mod_init: bflag index (%d) too big!\n",
+                       nat_bflag);
+               return -1;
+       } else {
+               nat_bflag = 1<<nat_bflag;
+       }
+
+       init_flag = 1;
+
        return 0;
 }
 
index 5e674ec..767f2e1 100644 (file)
@@ -44,7 +44,7 @@
 #define WRITE_BACK    2
 #define DB_ONLY       3
 
-#define UL_TABLE_VERSION 1003
+#define UL_TABLE_VERSION 1004
 
 extern str user_col;
 extern str domain_col;
@@ -55,6 +55,7 @@ extern str callid_col;
 extern str cseq_col;
 extern str method_col;
 extern str flags_col;
+extern str cflags_col;
 extern str user_agent_col;
 extern str received_col;
 extern str path_col;
index 26fc5b7..a7374b0 100644 (file)
@@ -380,7 +380,7 @@ static int ul_add(str* msg)
                        goto err;
                }
                
-               if (str2int(&flags, (unsigned int*)&ci.flags1) < 0) {
+               if (str2int(&flags, (unsigned int*)&ci.flags) < 0) {
                        unixsock_reply_asciiz("400 Invalid flags format\n");
                        goto err;
                }
index 7cc40d1..c2ebb77 100644 (file)
 #include "../../sr_module.h"
 #include "ul_mod.h"
 
+extern unsigned int nat_bflag;
+extern unsigned int init_flag;
+
+
 int bind_usrloc(usrloc_api_t* api)
 {
        if (!api) {
-               LOG(L_ERR, "bind_usrloc(): Invalid parameter value\n");
-               return -1;
-       }
-
-       api->register_udomain = (register_udomain_t)find_export
-               ("ul_register_udomain", 1, 0);
-       if (api->register_udomain == 0) {
-               LOG(L_ERR, "bind_usrloc(): Can't bind register_udomain\n");
-               return -1;
-       }
-
-       api->get_all_ucontacts = (get_all_ucontacts_t)find_export
-               ("ul_get_all_ucontacts", 1, 0);
-       if (api->get_all_ucontacts == 0) {
-               LOG(L_ERR, "bind_usrloc(): Can't bind get_all_ucontacts\n");
-               return -1;
-       }
-
-       api->insert_urecord = (insert_urecord_t)find_export
-               ("ul_insert_urecord", 1, 0);
-       if (api->insert_urecord == 0) {
-               LOG(L_ERR, "bind_usrloc(): Can't bind insert_urecord\n");
+               LOG(L_ERR, "ERROR:usrloc:bind_usrloc: invalid parameter value\n");
                return -1;
        }
-
-       api->delete_urecord = (delete_urecord_t)find_export
-               ("ul_delete_urecord", 1, 0);
-       if (api->delete_urecord == 0) {
-               LOG(L_ERR, "bind_usrloc(): Can't bind delete_urecord\n");
-               return -1;
-       }
-
-       api->get_urecord = (get_urecord_t)find_export
-               ("ul_get_urecord", 1, 0);
-       if (api->get_urecord == 0) {
-               LOG(L_ERR, "bind_usrloc(): Can't bind get_urecord\n");
+       if (init_flag==0) {
+               LOG(L_ERR, "ERROR:usrloc:bind_usrloc: configuration error - trying "
+                       "to bind to usrlo module before being initialized\n");
                return -1;
        }
 
-       api->lock_udomain = (lock_udomain_t)find_export
-               ("ul_lock_udomain", 1, 0);
-       if (api->lock_udomain == 0) {
-               LOG(L_ERR, "bind_usrloc(): Can't bind loc_udomain\n");
-               return -1;
-       }
-       
-       api->unlock_udomain = (unlock_udomain_t)find_export
-               ("ul_unlock_udomain", 1, 0);
-       if (api->unlock_udomain == 0) {
-               LOG(L_ERR, "bind_usrloc(): Can't bind unlock_udomain\n");
-               return -1;
-       }
-
-       api->release_urecord = (release_urecord_t)find_export
-               ("ul_release_urecord", 1, 0);
-       if (api->release_urecord == 0) {
-               LOG(L_ERR, "bind_usrloc(): Can't bind release_urecord\n");
-               return -1;
-       }
-
-       api->insert_ucontact = (insert_ucontact_t)find_export
-               ("ul_insert_ucontact", 1, 0);
-       if (api->insert_ucontact == 0) {
-               LOG(L_ERR, "bind_usrloc(): Can't bind insert_ucontact\n");
-               return -1;
-       }
-
-       api->delete_ucontact = (delete_ucontact_t)find_export
-               ("ul_delete_ucontact", 1, 0);
-       if (api->delete_ucontact == 0) {
-               LOG(L_ERR, "bind_usrloc(): Can't bind delete_ucontact\n");
-               return -1;
-       }
-
-       api->get_ucontact = (get_ucontact_t)find_export
-               ("ul_get_ucontact", 1, 0);
-       if (api->get_ucontact == 0) {
-               LOG(L_ERR, "bind_usrloc(): Can't bind get_ucontact\n");
-               return -1;
-       }
-
-       api->update_ucontact = (update_ucontact_t)find_export
-               ("ul_update_ucontact", 1, 0);
-       if (api->update_ucontact == 0) {
-               LOG(L_ERR, "bind_usrloc(): Can't bind update_ucontact\n");
-               return -1;
-       }
-
-       api->register_watcher = (register_watcher_t)find_export
-               ("ul_register_watcher", 1, 0);
-       if (api->register_watcher == 0) {
-               LOG(L_ERR, "bind_usrloc(): Can't bind register_watcher\n");
-               return -1;
-       }
-
-       api->unregister_watcher = (unregister_watcher_t)find_export
-               ("ul_unregister_watcher", 1, 0);
-       if (api->unregister_watcher == 0) {
-               LOG(L_ERR, "bind_usrloc(): Can't bind unregister_watcher\n");
-               return -1;
-       }
-
-       api->register_ulcb = (register_ulcb_t)find_export
-               ("ul_register_ulcb", 1, 0);
-       if (api->register_ulcb == 0) {
-               LOG(L_ERR, "bind_usrloc(): Can't bind register_ulcb\n");
-               return -1;
-       }
+       api->register_udomain = (register_udomain_t)register_udomain;
+       api->get_all_ucontacts = (get_all_ucontacts_t)get_all_ucontacts;
+       api->insert_urecord = (insert_urecord_t)insert_urecord;
+       api->delete_urecord = (delete_urecord_t)delete_urecord;
+       api->get_urecord = (get_urecord_t)get_urecord;
+       api->lock_udomain = (lock_udomain_t)lock_udomain;
+       api->unlock_udomain = (unlock_udomain_t)unlock_udomain;
+       api->release_urecord = (release_urecord_t)release_urecord;
+       api->insert_ucontact = (insert_ucontact_t)insert_ucontact;
+       api->delete_ucontact = (delete_ucontact_t)delete_ucontact;
+       api->get_ucontact = (get_ucontact_t)get_ucontact;
+       api->update_ucontact = (update_ucontact_t)update_ucontact;
+       api->register_watcher = (register_watcher_t)register_watcher;
+       api->unregister_watcher = (unregister_watcher_t)unregister_watcher;
+       api->register_ulcb = (register_ulcb_t)register_ulcb;
 
        api->use_domain = use_domain;
        api->db_mode = db_mode;
+       api->nat_flag = nat_bflag;
 
        return 0;
 }
index 000f493..92953c8 100644 (file)
 
 
 typedef struct usrloc_api {
-       int use_domain;
-       int db_mode;
+       int           use_domain;
+       int           db_mode;
+       unsigned int  nat_flag;
+
        register_udomain_t   register_udomain;
        get_all_ucontacts_t  get_all_ucontacts;