Browse Source

registrar(k): new parameter xavp_rcd - store details of UL record

- if set, the internal ruid field will be returned as inner xavp to it
Daniel-Constantin Mierla 13 years ago
parent
commit
2e1a9d5524

+ 41 - 20
modules_k/registrar/README

@@ -56,7 +56,8 @@ Bogdan-Andre Iancu
               3.19. path_use_received (integer)
               3.20. reg_callid_avp (string)
               3.21. xavp_cfg (string)
-              3.22. gruu_enabled (integer)
+              3.22. xavp_rcd (string)
+              3.23. gruu_enabled (integer)
 
         4. Functions
 
@@ -104,15 +105,16 @@ Bogdan-Andre Iancu
    1.18. Set path_use_received parameter
    1.19. Set reg_callid_avp parameter
    1.20. Set xavp_cfg parameter
-   1.21. Set gruu_enabled parameter
-   1.22. save usage
-   1.23. lookup usage
-   1.24. registered usage
-   1.25. add_sock_hdr usage
-   1.26. registered usage
+   1.21. Set xavp_rcd parameter
+   1.22. Set gruu_enabled parameter
+   1.23. save usage
+   1.24. lookup usage
+   1.25. registered usage
+   1.26. add_sock_hdr usage
    1.27. registered usage
    1.28. registered usage
-   1.29. $ulc(name) usage
+   1.29. registered usage
+   1.30. $ulc(name) usage
 
 Chapter 1. Admin Guide
 
@@ -151,7 +153,8 @@ Chapter 1. Admin Guide
         3.19. path_use_received (integer)
         3.20. reg_callid_avp (string)
         3.21. xavp_cfg (string)
-        3.22. gruu_enabled (integer)
+        3.22. xavp_rcd (string)
+        3.23. gruu_enabled (integer)
 
    4. Functions
 
@@ -261,7 +264,8 @@ Chapter 1. Admin Guide
    3.19. path_use_received (integer)
    3.20. reg_callid_avp (string)
    3.21. xavp_cfg (string)
-   3.22. gruu_enabled (integer)
+   3.22. xavp_rcd (string)
+   3.23. gruu_enabled (integer)
 
 3.1. default_expires (integer)
 
@@ -582,7 +586,24 @@ modparam("registrar", "reg_callid_avp", "$avp(s:avp)")
 modparam("registrar", "xavp_cfg", "reg")
 ...
 
-3.22. gruu_enabled (integer)
+3.22. xavp_rcd (string)
+
+   Defines the name of XAVP class to store details from the location
+   records. The values are stored as inner XAVPs, like
+   $xavp(class=>attribute). Valid inner XAVP names:
+     * ruid - the record's internal unique id.
+
+   For example. if this parameter is set to 'ulrcd', then the ruid for
+   contact records are set in $xavp(ulrcd=>ruid).
+
+   Default value is NULL (disabled).
+
+   Example 1.21. Set xavp_rcd parameter
+...
+modparam("registrar", "xavp_cfg", "ulrcd")
+...
+
+3.23. gruu_enabled (integer)
 
    If set to 1 and GRUU "+sip.instance" parameter to Contact header of
    REGISTER is present, then the value of the parameter is saved to
@@ -592,7 +613,7 @@ modparam("registrar", "xavp_cfg", "reg")
 
    Default value is 1 (enabled).
 
-   Example 1.21. Set gruu_enabled parameter
+   Example 1.22. Set gruu_enabled parameter
 ...
 modparam("registrar", "gruu_enabled", 0)
 ...
@@ -644,7 +665,7 @@ modparam("registrar", "gruu_enabled", 0)
 
    This function can be used from REQUEST_ROUTE and REPLY_ROUTE.
 
-   Example 1.22. save usage
+   Example 1.23. save usage
 ...
 save("location");
 save("location", "0x01");
@@ -677,7 +698,7 @@ save("location", "0x00", "sip:[email protected]");
 
    This function can be used from REQUEST_ROUTE, FAILURE_ROUTE.
 
-   Example 1.23. lookup usage
+   Example 1.24. lookup usage
 ...
 lookup("location");
 switch ($retcode) {
@@ -705,7 +726,7 @@ switch ($retcode) {
 
    This function can be used from REQUEST_ROUTE, FAILURE_ROUTE.
 
-   Example 1.24. registered usage
+   Example 1.25. registered usage
 ...
 if (registered("location")) {
         sl_send_reply("100", "Trying");
@@ -725,7 +746,7 @@ if (registered("location")) {
 
    This function can be used from REQUEST_ROUTE.
 
-   Example 1.25. add_sock_hdr usage
+   Example 1.26. add_sock_hdr usage
 ...
 add_sock_hdr("Sock-Info");
 ...
@@ -743,7 +764,7 @@ add_sock_hdr("Sock-Info");
 
    This function can be used from REQUEST_ROUTE, FAILURE_ROUTE.
 
-   Example 1.26. registered usage
+   Example 1.27. registered usage
 ...
 unregister("location", "$ru");
 unregister("location", "sip:[email protected]");
@@ -765,7 +786,7 @@ unregister("location", "sip:[email protected]");
 
    This function can be used from REQUEST_ROUTE, FAILURE_ROUTE.
 
-   Example 1.27. registered usage
+   Example 1.28. registered usage
 ...
 reg_fetch_contacts("location", "$ru", "callee");
 reg_fetch_contacts("location", "sip:[email protected]", "caller");
@@ -784,7 +805,7 @@ reg_fetch_contacts("location", "sip:[email protected]", "caller");
 
    This function can be used from REQUEST_ROUTE, FAILURE_ROUTE.
 
-   Example 1.28. registered usage
+   Example 1.29. registered usage
 ...
 reg_free_contacts("callee");
 ...
@@ -850,7 +871,7 @@ reg_free_contacts("callee");
    The pseudo-variable accepts positive index value to access a specific
    contact record.
 
-   Example 1.29. $ulc(name) usage
+   Example 1.30. $ulc(name) usage
 ...
 if(reg_fetch_contacts("location", "$fu", "caller"))
 {

+ 34 - 0
modules_k/registrar/doc/registrar_admin.xml

@@ -659,6 +659,40 @@ modparam("registrar", "xavp_cfg", "reg")
 		</example>
 	</section>
 
+	<section>
+		<title><varname>xavp_rcd</varname> (string)</title>
+		<para>
+			Defines the name of XAVP class to store details from the
+			location records. The values are stored as inner XAVPs, like
+			$xavp(class=&gt;attribute). Valid inner XAVP names:
+		</para>
+		<itemizedlist>
+		<listitem>
+			<para>
+				<emphasis>ruid</emphasis> - the record's internal unique
+				id.
+			</para>
+		</listitem>
+		</itemizedlist>
+		<para>
+			For example. if this parameter is set to 'ulrcd', then the ruid
+			for contact records are set in $xavp(ulrcd=&gt;ruid).
+		</para>
+		<para>
+		<emphasis>
+			Default value is NULL (disabled).
+		</emphasis>
+		</para>
+		<example>
+		<title>Set <varname>xavp_rcd</varname> parameter</title>
+		<programlisting format="linespecific">
+...
+modparam("registrar", "xavp_cfg", "ulrcd")
+...
+		</programlisting>
+		</example>
+	</section>
+
 	<section>
 		<title><varname>gruu_enabled</varname> (integer)</title>
 		<para>

+ 22 - 0
modules_k/registrar/lookup.c

@@ -36,6 +36,7 @@
 #include "../../ut.h"
 #include "../../dset.h"
 #include "../../str.h"
+#include "../../xavp.h"
 #include "../../config.h"
 #include "../../action.h"
 #include "../../mod_fix.h"
@@ -99,6 +100,10 @@ int lookup(struct sip_msg* _m, udomain_t* _d, str* _uri)
 	int i;
 	str inst = {0};
 	unsigned int ahash = 0;
+	sr_xavp_t *xavp=NULL;
+	sr_xavp_t *list=NULL;
+	str xname = {"ruid", 4};
+	sr_xval_t xval;
 
 	ret = -1;
 
@@ -216,6 +221,23 @@ int lookup(struct sip_msg* _m, udomain_t* _d, str* _uri)
 		/* reset next hop address */
 		reset_dst_uri(_m);
 
+		/* add xavp with details of the record (ruid, ...) */
+		if(reg_xavp_rcd.s!=NULL)
+		{
+			list = xavp_get(&reg_xavp_rcd, NULL);
+			xavp = list;
+			memset(&xval, 0, sizeof(sr_xval_t));
+			xval.type = SR_XTYPE_STR;
+			xval.v.s = ptr->ruid;
+			xavp_add_value(&xname, &xval, &xavp);
+			if(list==NULL)
+			{
+				/* no reg_xavp_rcd xavp in root list - add it */
+				xval.type = SR_XTYPE_XAVP;
+				xval.v.xavp = xavp;
+				xavp_add_value(&reg_xavp_rcd, &xval, NULL);
+			}
+		}
 		/* If a Path is present, use first path-uri in favour of
 		 * received-uri because in that case the last hop towards the uac
 		 * has to handle NAT. - agranig */

+ 5 - 0
modules_k/registrar/reg_mod.c

@@ -129,6 +129,7 @@ unsigned short rcv_avp_type = 0;
 int_str rcv_avp_name;
 
 str reg_xavp_cfg = {0};
+str reg_xavp_rcd = {0};
 
 int reg_use_domain = 0;
 
@@ -216,6 +217,7 @@ static param_export_t params[] = {
 	{"path_mode",          INT_PARAM, &path_mode           					},
 	{"path_use_received",  INT_PARAM, &path_use_params     					},
 	{"xavp_cfg",           STR_PARAM, &reg_xavp_cfg.s     					},
+	{"xavp_rcd",           STR_PARAM, &reg_xavp_rcd.s     					},
 	{"gruu_enabled",       INT_PARAM, &reg_gruu_enabled    					},
 	{0, 0, 0}
 };
@@ -375,6 +377,9 @@ static int mod_init(void)
 	if (reg_xavp_cfg.s) {
 		reg_xavp_cfg.len = strlen(reg_xavp_cfg.s);
 	}
+	if (reg_xavp_rcd.s) {
+		reg_xavp_rcd.len = strlen(reg_xavp_rcd.s);
+	}
 	return 0;
 }
 

+ 1 - 0
modules_k/registrar/reg_mod.h

@@ -89,6 +89,7 @@ extern str sock_hdr_name;
 extern int sock_flag;
 
 extern str reg_xavp_cfg;
+extern str reg_xavp_rcd;
 
 extern usrloc_api_t ul;/*!< Structure containing pointers to usrloc functions*/
 

+ 32 - 0
modules_k/registrar/reply.c

@@ -37,6 +37,7 @@
 
 #include <stdio.h>
 #include "../../ut.h"
+#include "../../xavp.h"
 #include "../../parser/msg_parser.h"
 #include "../../lib/kcore/parse_supported.h"
 #include "../../data_lump_rpl.h"
@@ -179,6 +180,11 @@ int build_contact(sip_msg_t *msg, ucontact_t* c, str *host)
 	unsigned int ahash;
 	unsigned short digit;
 	int mode;
+	sr_xavp_t *xavp=NULL;
+	sr_xavp_t *list=NULL;
+	str xname = {"ruid", 4};
+	sr_xval_t xval;
+
 
 
 	if(msg!=NULL && parse_supported(msg)==0
@@ -209,6 +215,13 @@ int build_contact(sip_msg_t *msg, ucontact_t* c, str *host)
 	memcpy(p, CONTACT_BEGIN, CONTACT_BEGIN_LEN);
 	p += CONTACT_BEGIN_LEN;
 
+	/* add xavp with details of the record (ruid, ...) */
+	if(reg_xavp_rcd.s!=NULL)
+	{
+		list = xavp_get(&reg_xavp_rcd, NULL);
+		xavp = list;
+	}
+
 	fl = 0;
 	while(c) {
 		if (VALID_CONTACT(c, act_time)) {
@@ -323,11 +336,30 @@ int build_contact(sip_msg_t *msg, ucontact_t* c, str *host)
 				memcpy(p, cp, len);
 				p += len;
 			}
+			if(reg_xavp_rcd.s!=NULL)
+			{
+				memset(&xval, 0, sizeof(sr_xval_t));
+				xval.type = SR_XTYPE_STR;
+				xval.v.s = c->ruid;
+				xavp_add_value(&xname, &xval, &xavp);
+			}
 		}
 
 		c = c->next;
 	}
 
+	/* add xavp with details of the record (ruid, ...) */
+	if(reg_xavp_rcd.s!=NULL)
+	{
+		if(list==NULL)
+		{
+			/* no reg_xavp_rcd xavp in root list - add it */
+			xval.type = SR_XTYPE_XAVP;
+			xval.v.xavp = xavp;
+			xavp_add_value(&reg_xavp_rcd, &xval, NULL);
+		}
+	}
+
 	memcpy(p, CRLF, CRLF_LEN);
 	p += CRLF_LEN;