Module: sip-router
Branch: master
Commit: dc9f7a7fc8f5f5a7570f9e24c2f59ec77a7d6668
URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=dc9f7a7…
Author: Juha Heinanen <jh(a)tutpro.com>
Committer: Juha Heinanen <jh(a)tutpro.com>
Date: Wed Dec 7 07:53:28 2011 +0200
modules_k/msilo: added storage of extra SIP headers from AVP
---
modules_k/msilo/README | 32 +++++++++++++++++++++-----
modules_k/msilo/doc/msilo_admin.xml | 29 ++++++++++++++++++++++++
modules_k/msilo/msilo.c | 42 +++++++++++++++++++++++++++++++++++
3 files changed, 97 insertions(+), 6 deletions(-)
diff --git a/modules_k/msilo/README b/modules_k/msilo/README
index f9c44b0..e1fe9a3 100644
--- a/modules_k/msilo/README
+++ b/modules_k/msilo/README
@@ -65,6 +65,7 @@ Juha Heinanen
3.26. add_date (int)
3.27. max_messages (int)
3.28. add_contact (int)
+ 3.29. extra_hdrs_avp (str)
4. Functions
@@ -113,9 +114,10 @@ Juha Heinanen
1.26. Set the “add_date” parameter
1.27. Set the “max_messages” parameter
1.28. Set the “add_contact” parameter
- 1.29. m_store usage
- 1.30. m_dump usage
- 1.31. Kamailio config script - sample msilo usage
+ 1.29. Set the “extra_hdrs_avp” parameter
+ 1.30. m_store usage
+ 1.31. m_dump usage
+ 1.32. Kamailio config script - sample msilo usage
Chapter 1. Admin Guide
@@ -157,6 +159,7 @@ Chapter 1. Admin Guide
3.26. add_date (int)
3.27. max_messages (int)
3.28. add_contact (int)
+ 3.29. extra_hdrs_avp (str)
4. Functions
@@ -254,6 +257,7 @@ Chapter 1. Admin Guide
3.26. add_date (int)
3.27. max_messages (int)
3.28. add_contact (int)
+ 3.29. extra_hdrs_avp (str)
3.1. db_url (string)
@@ -596,6 +600,22 @@ modparam("msilo", "max_messages", 0)
modparam("msilo", "add_contact", 1)
...
+3.29. extra_hdrs_avp (str)
+
+ Name of an AVP which may contain extra headers that are stored with the
+ message when m_store() is called. These extra headers (if any) are then
+ included in MESSAGE request generated by m_dump().
+
+ If the parameter is not set, m_store() does not look for extra headers
+ from any AVP.
+
+ Default value is “null”.
+
+ Example 1.29. Set the “extra_hdrs_avp” parameter
+...
+modparam("msilo", "extra_hdrs_avp",
"$avp(msilo_extra_hdrs)")
+...
+
4. Functions
4.1. m_store([owner])
@@ -617,7 +637,7 @@ modparam("msilo", "add_contact", 1)
This function can be used from REQUEST_ROUTE, FAILURE_ROUTE.
- Example 1.29. m_store usage
+ Example 1.30. m_store usage
...
m_store();
m_store("$tu");
@@ -637,7 +657,7 @@ m_store("$tu");
This function can be used from REQUEST_ROUTE.
- Example 1.30. m_dump usage
+ Example 1.31. m_dump usage
...
m_dump();
m_dump("$fu");
@@ -679,7 +699,7 @@ m_dump("$fu");
Next picture displays a sample usage of msilo.
- Example 1.31. Kamailio config script - sample msilo usage
+ Example 1.32. Kamailio config script - sample msilo usage
...
# $Id$
#
diff --git a/modules_k/msilo/doc/msilo_admin.xml b/modules_k/msilo/doc/msilo_admin.xml
index ee975f8..3d02670 100644
--- a/modules_k/msilo/doc/msilo_admin.xml
+++ b/modules_k/msilo/doc/msilo_admin.xml
@@ -566,6 +566,7 @@ modparam("msilo", "snd_time_avp",
"$avp(i:123)")
</programlisting>
</example>
</section>
+
<section>
<title><varname>add_date</varname> (int)</title>
<para>
@@ -626,6 +627,34 @@ modparam("msilo", "add_contact", 1)
</programlisting>
</example>
</section>
+
+ <section>
+ <title><varname>extra_hdrs_avp</varname> (str)</title>
+ <para>
+ Name of an AVP which may contain extra headers that are
+ stored with the message when m_store() is called. These extra
+ headers (if any) are then included in MESSAGE request
+ generated by m_dump().
+ </para>
+ <para>
+ If the parameter is not set, m_store() does not look
+ for extra headers from any AVP.
+ </para>
+ <para>
+ <emphasis>
+ Default value is <quote>null</quote>.
+ </emphasis>
+ </para>
+ <example>
+ <title>Set the <quote>extra_hdrs_avp</quote> parameter</title>
+<programlisting format="linespecific">
+...
+modparam("msilo", "extra_hdrs_avp",
"$avp(msilo_extra_hdrs)")
+...
+</programlisting>
+ </example>
+ </section>
+
</section>
<section>
diff --git a/modules_k/msilo/msilo.c b/modules_k/msilo/msilo.c
index cb23b2b..689b81a 100644
--- a/modules_k/msilo/msilo.c
+++ b/modules_k/msilo/msilo.c
@@ -39,6 +39,7 @@
* 2006-09-10 m_dump now checks if registering UA supports MESSAGE method (jh)
* 2006-10-05 added max_messages module variable (jh)
* 2011-10-19 added storage of extra SIP headers (hpw)
+ * 2011-12-07 added storage of extra SIP headers from AVP (jh)
*/
#include <stdio.h>
@@ -154,6 +155,10 @@ static str ms_snd_time_avp_param = {NULL, 0};
int_str ms_snd_time_avp_name;
unsigned short ms_snd_time_avp_type;
+static str ms_extra_hdrs_avp_param = {NULL, 0};
+int_str ms_extra_hdrs_avp_name;
+unsigned short ms_extra_hdrs_avp_type;
+
str msg_type = str_init("MESSAGE");
/** module functions */
@@ -220,6 +225,7 @@ static param_export_t params[]={
{ "sc_snd_time", STR_PARAM, &sc_snd_time.s },
{ "sc_stored_hdrs", STR_PARAM, &sc_stored_hdrs.s },
{ "snd_time_avp", STR_PARAM, &ms_snd_time_avp_param.s },
+ { "extra_hdrs_avp", STR_PARAM, &ms_extra_hdrs_avp_param.s },
{ "add_date", INT_PARAM, &ms_add_date },
{ "max_messages", INT_PARAM, &ms_max_messages },
{ "add_contact", INT_PARAM, &ms_add_contact },
@@ -303,6 +309,8 @@ static int mod_init(void)
sc_snd_time.len = strlen(sc_snd_time.s);
if (ms_snd_time_avp_param.s)
ms_snd_time_avp_param.len = strlen(ms_snd_time_avp_param.s);
+ if (ms_extra_hdrs_avp_param.s)
+ ms_extra_hdrs_avp_param.len = strlen(ms_extra_hdrs_avp_param.s);
/* binding to mysql module */
if (db_bind_mod(&ms_db_url, &msilo_dbf))
@@ -334,6 +342,22 @@ static int mod_init(void)
}
}
+ if (ms_extra_hdrs_avp_param.s && ms_extra_hdrs_avp_param.len > 0) {
+ if (pv_parse_spec(&ms_extra_hdrs_avp_param, &avp_spec)==0
+ || avp_spec.type!=PVT_AVP) {
+ LM_ERR("malformed or non AVP %.*s AVP definition\n",
+ ms_extra_hdrs_avp_param.len, ms_extra_hdrs_avp_param.s);
+ return -1;
+ }
+
+ if (pv_get_avp_name(0, &(avp_spec.pvp), &ms_extra_hdrs_avp_name,
+ &ms_extra_hdrs_avp_type) != 0) {
+ LM_ERR("[%.*s]- invalid AVP definition\n",
+ ms_extra_hdrs_avp_param.len, ms_extra_hdrs_avp_param.s);
+ return -1;
+ }
+ }
+
db_con = msilo_dbf.init(&ms_db_url);
if (!db_con)
{
@@ -502,6 +526,24 @@ static int get_non_mandatory_headers(struct sip_msg *msg, char *buf,
int buf_len
{
struct hdr_field *hdrs;
int len = 0;
+ int_str avp_value;
+ struct usr_avp *avp;
+
+ if (ms_extra_hdrs_avp_name.n != 0) {
+ avp = NULL;
+ avp = search_first_avp(ms_extra_hdrs_avp_type,
+ ms_extra_hdrs_avp_name, &avp_value, 0);
+ if ((avp != NULL) && is_avp_str_val(avp)) {
+ if (buf_len <= avp_value.s.len) {
+ LM_ERR("insufficient space to store headers in silo\n");
+ return -1;
+ }
+ memcpy(buf, avp_value.s.s, avp_value.s.len);
+ LM_INFO("copied '%.*s' to buf\n", avp_value.s.len,
+ avp_value.s.s);
+ return avp_value.s.len;
+ }
+ }
for (hdrs = msg->headers; hdrs != NULL; hdrs = hdrs->next)
{