2
0
Andrei Pelinescu-Onciul 17 жил өмнө
parent
commit
294a2d10e4
1 өөрчлөгдсөн 161 нэмэгдсэн , 103 устгасан
  1. 161 103
      modules_s/registrar/README

+ 161 - 103
modules_s/registrar/README

@@ -1,4 +1,3 @@
-
 1. Registrar Module
 1. Registrar Module
 
 
 Jan Janak
 Jan Janak
@@ -8,16 +7,34 @@ Jan Janak
    Copyright © 2003 FhG FOKUS
    Copyright © 2003 FhG FOKUS
    Revision History
    Revision History
    Revision $Revision$ $Date$
    Revision $Revision$ $Date$
-     _________________________________________________________________
-
-   Table of Contents
+     __________________________________________________________________
 
 
    1.1. Overview
    1.1. Overview
    1.2. NAT Support In Registrar
    1.2. NAT Support In Registrar
    1.3. Synchronizing UA Internal Clock
    1.3. Synchronizing UA Internal Clock
-   1.4. Dependencies
-   1.5. Parameters
-   1.6. Functions
+   1.4. Processing +sip.instance parameter
+   1.5. Dependencies
+   1.6. Parameters
+
+        1.6.1. default_expires (integer)
+        1.6.2. min_expires (integer)
+        1.6.3. max_expires (integer)
+        1.6.4. default_q (integer)
+        1.6.5. append_branches (integer)
+        1.6.6. use_domain (integer)
+        1.6.7. case_sensitive (integer)
+        1.6.8. desc_time_order (integer)
+        1.6.9. received_avp (integer)
+        1.6.10. received_param (integer)
+        1.6.11. max_contacts (integer)
+        1.6.12. retry_after (integer)
+
+   1.7. Functions
+
+        1.7.1. save(domain)
+        1.7.2. save_noreply(domain)
+        1.7.3. lookup(domain)
+        1.7.4. registered(domain)
 
 
 1.1. Overview
 1.1. Overview
 
 
@@ -33,17 +50,16 @@ Jan Janak
    REGISTER is usually the first message sent from the user agent to the
    REGISTER is usually the first message sent from the user agent to the
    SIP server. A small example follows.
    SIP server. A small example follows.
 
 
-   Let's suppose that we have a single SER instance listening on two
-   ports -- 5060 and 5090. Using a different port seems to be often
-   necessary because of broken SIP ALGs (Application Level Gateways) that
-   are often built into DSL routers or other devices. Such ALGs would
-   mangle SIP requests and responses coming to and from port 5060 and the
-   only option how to avoid such mangling is using a different port
-   number.
-
-   Let's suppose that we have two UAs beind NAT, one of them is
-   configured to reach SER on port 5060, the other one is configured to
-   use port 5090 (due to the reasons described above):
+   Let's suppose that we have a single SER instance listening on two ports
+   -- 5060 and 5090. Using a different port seems to be often necessary
+   because of broken SIP ALGs (Application Level Gateways) that are often
+   built into DSL routers or other devices. Such ALGs would mangle SIP
+   requests and responses coming to and from port 5060 and the only option
+   how to avoid such mangling is using a different port number.
+
+   Let's suppose that we have two UAs beind NAT, one of them is configured
+   to reach SER on port 5060, the other one is configured to use port 5090
+   (due to the reasons described above):
                       SER
                       SER
                   +---------+
                   +---------+
 UA1 ---- NAT1 ----| 5060    |
 UA1 ---- NAT1 ----| 5060    |
@@ -54,16 +70,16 @@ UA2 ---- NAT2 ----| 5090    |
    Registrar and usrloc would store the public IP of NAT with each
    Registrar and usrloc would store the public IP of NAT with each
    registered contact, thus it would know how to reach both user agents.
    registered contact, thus it would know how to reach both user agents.
 
 
-   In addition to the publi IP and port of the NAT device, registrar
-   would also remember the destination IP and port of the REGISTER
-   request (the IP and port used in SER). If registrar did not store this
-   information, it would not know what outbound socket it should use when
-   sending SIP messages to the registered contact. It would use the
-   default port number (often 5060) for such outgoing requests.
+   In addition to the publi IP and port of the NAT device, registrar would
+   also remember the destination IP and port of the REGISTER request (the
+   IP and port used in SER). If registrar did not store this information,
+   it would not know what outbound socket it should use when sending SIP
+   messages to the registered contact. It would use the default port
+   number (often 5060) for such outgoing requests.
 
 
    When an INVITE for UA1 comes, everything would work because UA1 used
    When an INVITE for UA1 comes, everything would work because UA1 used
-   port 5060 when registering and that is also the destination port in
-   the pinhole being kept open in NAT1:
+   port 5060 when registering and that is also the destination port in the
+   pinhole being kept open in NAT1:
                                  SER
                                  SER
                  INVITE UA1  +--------+     INVITE UA1
                  INVITE UA1  +--------+     INVITE UA1
 UA1 ---- NAT1 <------------- |  5060  | <----------------
 UA1 ---- NAT1 <------------- |  5060  | <----------------
@@ -73,8 +89,8 @@ UA2 ---- NAT2                |  5090  |
 
 
    When an INVITE for UA2 comes, SER would again use port 5060 as the
    When an INVITE for UA2 comes, SER would again use port 5060 as the
    default outgoing source port number, but this time the message will be
    default outgoing source port number, but this time the message will be
-   dropped by NAT2, because the pinhole opened during the registration
-   has 5060 as the destination port number:
+   dropped by NAT2, because the pinhole opened during the registration has
+   5060 as the destination port number:
                                  SER
                                  SER
                  INVITE UA2  +--------+     INVITE UA2
                  INVITE UA2  +--------+     INVITE UA2
 UA1 ---- NAT1        +------ |  5060  | <---------------
 UA1 ---- NAT1        +------ |  5060  | <---------------
@@ -94,21 +110,21 @@ UA2 ---- NAT2 <------------- |  5090  |
 
 
 Note
 Note
 
 
-   The X next to NAT2 has disappeared in this picture which means that
-   the message will be lucky enough to make it through.
+   The X next to NAT2 has disappeared in this picture which means that the
+   message will be lucky enough to make it through.
 
 
    SER would encode this information into a SIP URI when saving contacts
    SER would encode this information into a SIP URI when saving contacts
    in database and later, after restart of SER, this information will be
    in database and later, after restart of SER, this information will be
    restored. The URI looks like:
    restored. The URI looks like:
 sip:1.2.3.4:5060;dstip=5.6.7.8;dstport=5090
 sip:1.2.3.4:5060;dstip=5.6.7.8;dstport=5090
 
 
-   Where the hostname part is the public IP of the NAT, the port (5060)
-   is the port allocated by the NAT, "dstip" parameter is the IP used on
-   SER side and "dstport" parameter is the port number used on SER side
-   during registration. This information is later used to find the
-   correct outgoing socket in SER. If no such socket can be found (it can
-   happen if you reconfigure SER to use different ports or IPs), it will
-   use the default IP/port again.
+   Where the hostname part is the public IP of the NAT, the port (5060) is
+   the port allocated by the NAT, "dstip" parameter is the IP used on SER
+   side and "dstport" parameter is the port number used on SER side during
+   registration. This information is later used to find the correct
+   outgoing socket in SER. If no such socket can be found (it can happen
+   if you reconfigure SER to use different ports or IPs), it will use the
+   default IP/port again.
 
 
 1.3. Synchronizing UA Internal Clock
 1.3. Synchronizing UA Internal Clock
 
 
@@ -126,8 +142,8 @@ Call-ID: [email protected]
 Date: Fri, 02 Sep 2005 11:20:12 GMT
 Date: Fri, 02 Sep 2005 11:20:12 GMT
 
 
    You can use append_time function from textops module to append the
    You can use append_time function from textops module to append the
-   header field to the reply. Put the function before save("location");
-   in the configuration file.
+   header field to the reply. Put the function before save("location"); in
+   the configuration file.
 
 
    Example 1. Adding Date header to Replies
    Example 1. Adding Date header to Replies
 if (uri == myself) {
 if (uri == myself) {
@@ -138,32 +154,75 @@ if (uri == myself) {
     };
     };
 };
 };
 
 
-1.4. Dependencies
+1.4. Processing +sip.instance parameter
+
+   The GRUU extension for SIP (draft-ietf-sip-gruu-04) adds a new
+   parameter to the URI of the Contact header in the REGISTER request to
+   identify a UA instance globaly unique in the world. This is reached by
+   adding a globaly unqiue identifier, the so called sip instace, as a
+   parameter to the Contact URI within all REGISTER requests.
+
+   Example 2. A Contact header with sip instance parameter
+Contact: <sip:[email protected]:2532>;q=1.0;+sip.instance="<urn:uuid:6a66f3bd-5
+b1f-448a-a8be-e29572ea3bee>"
+
+   By looking at this sip instance parameter the registrar can decide if
+   the incoming request is just an update of an existing Contact URI or if
+   a new Contact URI has to be added to the AOR of this account. Thus even
+   after a reboot of the UA the new REGISTER can be determined the request
+   as an update of an old, already existing entry.
+
+   The registrar module now looks for the sip instance parameter in the
+   Contact URI:
+     * If the sip instance parameter is not present in the URI of the
+       Contact header the algorithm stays the same as like before the GRUU
+       extension. Which means the registrar only compares the SIP URI from
+       the Contact header with the existing URIs for the AOR (account). If
+       exactly the same URI already exists the existing entry will be
+       updated, otherwise the URI will be added to the list.
+     * If the sip instace parameter is present in the URI of the Contact
+       header it will be first searched for an existing Contact with
+       exactly the same sip instance value. If an URI with exactly the
+       same sip instance value exists already in the database, the
+       existing entry will be replaced with the new value, no matter if
+       they differ or not. If no Contact with this sip instance value
+       exists a new entry for it will be added.
+
+   For example the following Contact would replace the Contact value from
+   the example above in the usrloc database because the sip instance value
+   is the same, although the Contact URI differs. Without the sip instance
+   this would have created two entries in the usrloc database.
+
+   Example 3.
+Contact: <sip:[email protected]:2500>;q=1.0;+sip.instance="<urn:uuid:6a66f3bd-5b
+1f-448a-a8be-e29572ea3bee>"
+
+1.5. Dependencies
 
 
    Registrar module depends on the following SER modules:
    Registrar module depends on the following SER modules:
      * usrloc - User Location Module.
      * usrloc - User Location Module.
      * sl - Stateless Replies.
      * sl - Stateless Replies.
 
 
-1.5. Parameters
+1.6. Parameters
 
 
    Revision History
    Revision History
    Revision $Revision$ $Date$
    Revision $Revision$ $Date$
 
 
-1.5.1. default_expires (integer)
+1.6.1. default_expires (integer)
 
 
    If the processed message contains neither Expires HFs nor expires
    If the processed message contains neither Expires HFs nor expires
    contact parameters, this value will be used for newly created usrloc
    contact parameters, this value will be used for newly created usrloc
-   records. The parameter contains number of second to expire (for
-   example use 3600 for one hour).
+   records. The parameter contains number of second to expire (for example
+   use 3600 for one hour).
 
 
    Default value is 3600.
    Default value is 3600.
 
 
-   Example 2. Set default_expires parameter
+   Example 4. Set default_expires parameter
 ...
 ...
 modparam("registrar", "default_expires", 1800)
 modparam("registrar", "default_expires", 1800)
 ...
 ...
 
 
-1.5.2. min_expires (integer)
+1.6.2. min_expires (integer)
 
 
    The minimum expires value of a Contact, values lower than this minimum
    The minimum expires value of a Contact, values lower than this minimum
    will be automatically set to the minimum. Value 0 disables the
    will be automatically set to the minimum. Value 0 disables the
@@ -171,25 +230,25 @@ modparam("registrar", "default_expires", 1800)
 
 
    Default value is 60.
    Default value is 60.
 
 
-   Example 3. Set min_expires parameter
+   Example 5. Set min_expires parameter
 ...
 ...
 modparam("registrar", "min_expires", 60)
 modparam("registrar", "min_expires", 60)
 ...
 ...
 
 
-1.5.3. max_expires (integer)
+1.6.3. max_expires (integer)
 
 
-   The maximum expires value of a Contact, values higher than this
-   maximum will be automatically set to the maximum. Value 0 disables the
+   The maximum expires value of a Contact, values higher than this maximum
+   will be automatically set to the maximum. Value 0 disables the
    checking.
    checking.
 
 
    Default value is 0.
    Default value is 0.
 
 
-   Example 4. Set max_expires parameter
+   Example 6. Set max_expires parameter
 ...
 ...
 modparam("registrar", "max_expires", 120)
 modparam("registrar", "max_expires", 120)
 ...
 ...
 
 
-1.5.4. default_q (integer)
+1.6.4. default_q (integer)
 
 
    The parameter represents default q value for new contacts. Because ser
    The parameter represents default q value for new contacts. Because ser
    doesn't support float parameter types, the value in the parameter is
    doesn't support float parameter types, the value in the parameter is
@@ -198,29 +257,29 @@ modparam("registrar", "max_expires", 120)
 
 
    Default value is 0.
    Default value is 0.
 
 
-   Example 5. Set default_q parameter
+   Example 7. Set default_q parameter
 ...
 ...
 modparam("registrar", "default_q", 100)
 modparam("registrar", "default_q", 100)
 ...
 ...
 
 
-1.5.5. append_branches (integer)
+1.6.5. append_branches (integer)
 
 
-   The parameter controls how lookup function processes multiple
-   contacts. If there are multiple contacts for the given username in
-   usrloc and this parameter is set to 1, Request-URI will be overwritten
-   with the highest-q rated contact and the rest will be appended to
-   sip_msg structure and can be later used by tm for forking. If the
-   parameter is set to 0, only Request-URI will be overwritten with the
-   highest-q rated contact and the rest will be left unprocessed.
+   The parameter controls how lookup function processes multiple contacts.
+   If there are multiple contacts for the given username in usrloc and
+   this parameter is set to 1, Request-URI will be overwritten with the
+   highest-q rated contact and the rest will be appended to sip_msg
+   structure and can be later used by tm for forking. If the parameter is
+   set to 0, only Request-URI will be overwritten with the highest-q rated
+   contact and the rest will be left unprocessed.
 
 
    Default value is 1.
    Default value is 1.
 
 
-   Example 6. Set append_branches parameter
+   Example 8. Set append_branches parameter
 ...
 ...
 modparam("registrar", "append_branches", 0)
 modparam("registrar", "append_branches", 0)
 ...
 ...
 
 
-1.5.6. use_domain (integer)
+1.6.6. use_domain (integer)
 
 
    If set to 1 then the registrar will use username@domain as address of
    If set to 1 then the registrar will use username@domain as address of
    record. If the variable is set to 0 then only username will be used as
    record. If the variable is set to 0 then only username will be used as
@@ -228,43 +287,43 @@ modparam("registrar", "append_branches", 0)
 
 
    Default value is 0.
    Default value is 0.
 
 
-   Example 7. Set use_domain parameter
+   Example 9. Set use_domain parameter
 ...
 ...
 modparam("registrar", "use_domain", 1)
 modparam("registrar", "use_domain", 1)
 ...
 ...
 
 
-1.5.7. case_sensitive (integer)
+1.6.7. case_sensitive (integer)
 
 
    If set to 1 then AOR comparison will be case sensitive, if set to 0
    If set to 1 then AOR comparison will be case sensitive, if set to 0
    then AOR comparison will be case insensitive--This is recommended.
    then AOR comparison will be case insensitive--This is recommended.
 
 
    Default value is 0.
    Default value is 0.
 
 
-   Example 8. Set case_sensitive parameter
+   Example 10. Set case_sensitive parameter
 ...
 ...
 modparam("registrar", "case_sensitive", 1)
 modparam("registrar", "case_sensitive", 1)
 ...
 ...
 
 
-1.5.8. desc_time_order (integer)
+1.6.8. desc_time_order (integer)
 
 
    If set to 1 then all contacts will be ordered in descending
    If set to 1 then all contacts will be ordered in descending
-   modification time order. In this case the most recently
-   updated/created contact will be used.
+   modification time order. In this case the most recently updated/created
+   contact will be used.
 
 
    Default value is 0.
    Default value is 0.
 
 
-   Example 9. Set desc_time_order parameter
+   Example 11. Set desc_time_order parameter
 ...
 ...
 modparam("registrar", "desc_time_order", 1)
 modparam("registrar", "desc_time_order", 1)
 ...
 ...
 
 
-1.5.9. received_avp (integer)
+1.6.9. received_avp (integer)
 
 
    Registrar will store the value of the AVP configured by this parameter
    Registrar will store the value of the AVP configured by this parameter
-   in the received column in the user location database. It will leave
-   the column empty if the AVP is empty. The AVP should contain a SIP URI
-   consisting of the source IP, port, and protocol of the REGISTER
-   message being processed.
+   in the received column in the user location database. It will leave the
+   column empty if the AVP is empty. The AVP should contain a SIP URI
+   consisting of the source IP, port, and protocol of the REGISTER message
+   being processed.
 
 
 Note
 Note
 
 
@@ -273,44 +332,43 @@ Note
 
 
    Default value is 42.
    Default value is 42.
 
 
-   Example 10. Set received_avp parameter
+   Example 12. Set received_avp parameter
 ...
 ...
 modparam("registrar", "received_avp", 43)
 modparam("registrar", "received_avp", 43)
 ...
 ...
 
 
-1.5.10. received_param (integer)
+1.6.10. received_param (integer)
 
 
    The name of the parameter that will be appended to Contacts of 200 OK
    The name of the parameter that will be appended to Contacts of 200 OK
    when the received URI was set by nathelper module.
    when the received URI was set by nathelper module.
 
 
    Default value is "received".
    Default value is "received".
 
 
-   Example 11. Set received_param parameter
+   Example 13. Set received_param parameter
 ...
 ...
 modparam("registrar", "received_param", "rcv")
 modparam("registrar", "received_param", "rcv")
 ...
 ...
 
 
-1.5.11. max_contacts (integer)
+1.6.11. max_contacts (integer)
 
 
    The parameter can be used to limit the number of contacts per AOR
    The parameter can be used to limit the number of contacts per AOR
-   (Address of Record) in the user location database. Value 0 disables
-   the check.
+   (Address of Record) in the user location database. Value 0 disables the
+   check.
 
 
    Default value is 0.
    Default value is 0.
 
 
-   Example 12. Set max_contacts parameter
+   Example 14. Set max_contacts parameter
 ...
 ...
 # Allow no more than 10 contacts per AOR
 # Allow no more than 10 contacts per AOR
 modparam("registrar", "max_contacts", 10)
 modparam("registrar", "max_contacts", 10)
 ...
 ...
 
 
-1.5.12. retry_after (integer)
+1.6.12. retry_after (integer)
 
 
-   The registrar can generate 5xx reply to REGISTER in various
-   situations. It can, for example, happen when the max_contacts
-   parameter is set and the processing of REGISTER request would exceed
-   the limit. In this case the registrar would generate "503 Service
-   Unavailable" response.
+   The registrar can generate 5xx reply to REGISTER in various situations.
+   It can, for example, happen when the max_contacts parameter is set and
+   the processing of REGISTER request would exceed the limit. In this case
+   the registrar would generate "503 Service Unavailable" response.
 
 
    If you want to add the Retry-After header field in 5xx replies, set
    If you want to add the Retry-After header field in 5xx replies, set
    this parameter to a value grater than zero (0 means do not add the
    this parameter to a value grater than zero (0 means do not add the
@@ -318,34 +376,34 @@ modparam("registrar", "max_contacts", 10)
 
 
    Default value is 0 (disabled).
    Default value is 0 (disabled).
 
 
-   Example 13. Set retry_after parameter
+   Example 15. Set retry_after parameter
 ...
 ...
 modparam("registrar", "retry_after", 30)
 modparam("registrar", "retry_after", 30)
 ...
 ...
 
 
-1.6. Functions
+1.7. Functions
 
 
    Revision History
    Revision History
    Revision $Revision$ $Date$
    Revision $Revision$ $Date$
 
 
-1.6.1.  save(domain)
+1.7.1.  save(domain)
 
 
-   The function processes a REGISTER message. It can add, remove or
-   modify usrloc records depending on Contact and Expires HFs in the
-   REGISTER message. On success, 200 OK will be returned listing all
-   contacts that are currently in usrloc. On an error, error message will
-   be send with a short description in reason phrase.
+   The function processes a REGISTER message. It can add, remove or modify
+   usrloc records depending on Contact and Expires HFs in the REGISTER
+   message. On success, 200 OK will be returned listing all contacts that
+   are currently in usrloc. On an error, error message will be send with a
+   short description in reason phrase.
 
 
    Meaning of the parameters is as follows:
    Meaning of the parameters is as follows:
      * domain - Logical domain within registrar. If database is used then
      * domain - Logical domain within registrar. If database is used then
        this must be name of the table which stores the contacts.
        this must be name of the table which stores the contacts.
 
 
-   Example 14. save usage
+   Example 16. save usage
 ...
 ...
 save("location");
 save("location");
 ...
 ...
 
 
-1.6.2.  save_noreply(domain)
+1.7.2.  save_noreply(domain)
 
 
    Same as save() but it doesn't send a reply.
    Same as save() but it doesn't send a reply.
 
 
@@ -353,12 +411,12 @@ save("location");
      * domain - Logical domain within registrar. If database is used then
      * domain - Logical domain within registrar. If database is used then
        this must be na e of the table which stores the contacts.
        this must be na e of the table which stores the contacts.
 
 
-   Example 15. save_noreply usage
+   Example 17. save_noreply usage
 ...
 ...
 save_noreply("location");
 save_noreply("location");
 ...
 ...
 
 
-1.6.3.  lookup(domain)
+1.7.3.  lookup(domain)
 
 
    The functions extracts username from Request-URI and tries to find all
    The functions extracts username from Request-URI and tries to find all
    contacts for the username in usrloc. If there are no such contacts, -1
    contacts for the username in usrloc. If there are no such contacts, -1
@@ -370,12 +428,12 @@ save_noreply("location");
    Meaning of the parameters is as follows:
    Meaning of the parameters is as follows:
      * domain - Name of table that should be used for the lookup.
      * domain - Name of table that should be used for the lookup.
 
 
-   Example 16. lookup usage
+   Example 18. lookup usage
 ...
 ...
 lookup("location");
 lookup("location");
 ...
 ...
 
 
-1.6.4.  registered(domain)
+1.7.4.  registered(domain)
 
 
    The function returns true if the AOR in the Request-URI is registered,
    The function returns true if the AOR in the Request-URI is registered,
    false otherwise. The function does not modify the message being
    false otherwise. The function does not modify the message being
@@ -385,7 +443,7 @@ lookup("location");
    Meaning of the parameters is as follows:
    Meaning of the parameters is as follows:
      * domain - Name of table that should be used for the lookup.
      * domain - Name of table that should be used for the lookup.
 
 
-   Example 17. registered usage
+   Example 19. registered usage
 ...
 ...
 if (registered("location")) {
 if (registered("location")) {
     sl_send_reply("100", "Trying");
     sl_send_reply("100", "Trying");