Browse Source

modules_k/msilo: added storage of extra SIP headers from AVP

Juha Heinanen 13 years ago
parent
commit
dc9f7a7fc8
3 changed files with 97 additions and 6 deletions
  1. 26 6
      modules_k/msilo/README
  2. 29 0
      modules_k/msilo/doc/msilo_admin.xml
  3. 42 0
      modules_k/msilo/msilo.c

+ 26 - 6
modules_k/msilo/README

@@ -65,6 +65,7 @@ Juha Heinanen
               3.26. add_date (int)
               3.26. add_date (int)
               3.27. max_messages (int)
               3.27. max_messages (int)
               3.28. add_contact (int)
               3.28. add_contact (int)
+              3.29. extra_hdrs_avp (str)
 
 
         4. Functions
         4. Functions
 
 
@@ -113,9 +114,10 @@ Juha Heinanen
    1.26. Set the “add_date” parameter
    1.26. Set the “add_date” parameter
    1.27. Set the “max_messages” parameter
    1.27. Set the “max_messages” parameter
    1.28. Set the “add_contact” 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
 Chapter 1. Admin Guide
 
 
@@ -157,6 +159,7 @@ Chapter 1. Admin Guide
         3.26. add_date (int)
         3.26. add_date (int)
         3.27. max_messages (int)
         3.27. max_messages (int)
         3.28. add_contact (int)
         3.28. add_contact (int)
+        3.29. extra_hdrs_avp (str)
 
 
    4. Functions
    4. Functions
 
 
@@ -254,6 +257,7 @@ Chapter 1. Admin Guide
    3.26. add_date (int)
    3.26. add_date (int)
    3.27. max_messages (int)
    3.27. max_messages (int)
    3.28. add_contact (int)
    3.28. add_contact (int)
+   3.29. extra_hdrs_avp (str)
 
 
 3.1. db_url (string)
 3.1. db_url (string)
 
 
@@ -596,6 +600,22 @@ modparam("msilo", "max_messages", 0)
 modparam("msilo", "add_contact", 1)
 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. Functions
 
 
    4.1. m_store([owner])
    4.1. m_store([owner])
@@ -617,7 +637,7 @@ modparam("msilo", "add_contact", 1)
 
 
    This function can be used from REQUEST_ROUTE, FAILURE_ROUTE.
    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();
 m_store("$tu");
 m_store("$tu");
@@ -637,7 +657,7 @@ m_store("$tu");
 
 
    This function can be used from REQUEST_ROUTE.
    This function can be used from REQUEST_ROUTE.
 
 
-   Example 1.30. m_dump usage
+   Example 1.31. m_dump usage
 ...
 ...
 m_dump();
 m_dump();
 m_dump("$fu");
 m_dump("$fu");
@@ -679,7 +699,7 @@ m_dump("$fu");
 
 
    Next picture displays a sample usage of msilo.
    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$
 # $Id$
 #
 #

+ 29 - 0
modules_k/msilo/doc/msilo_admin.xml

@@ -566,6 +566,7 @@ modparam("msilo", "snd_time_avp", "$avp(i:123)")
 </programlisting>
 </programlisting>
 		</example>
 		</example>
 	</section>
 	</section>
+
 	<section>
 	<section>
 		<title><varname>add_date</varname> (int)</title>
 		<title><varname>add_date</varname> (int)</title>
 		<para>
 		<para>
@@ -626,6 +627,34 @@ modparam("msilo", "add_contact", 1)
 </programlisting>
 </programlisting>
 		</example>
 		</example>
 	</section>
 	</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>
 
 
 	<section>
 	<section>

+ 42 - 0
modules_k/msilo/msilo.c

@@ -39,6 +39,7 @@
  * 2006-09-10 m_dump now checks if registering UA supports MESSAGE method (jh)
  * 2006-09-10 m_dump now checks if registering UA supports MESSAGE method (jh)
  * 2006-10-05 added max_messages module variable (jh)
  * 2006-10-05 added max_messages module variable (jh)
  * 2011-10-19 added storage of extra SIP headers (hpw)
  * 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>
 #include <stdio.h>
@@ -154,6 +155,10 @@ static str ms_snd_time_avp_param = {NULL, 0};
 int_str ms_snd_time_avp_name;
 int_str ms_snd_time_avp_name;
 unsigned short ms_snd_time_avp_type;
 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");
 str msg_type = str_init("MESSAGE");
 
 
 /** module functions */
 /** module functions */
@@ -220,6 +225,7 @@ static param_export_t params[]={
 	{ "sc_snd_time",      STR_PARAM, &sc_snd_time.s           },
 	{ "sc_snd_time",      STR_PARAM, &sc_snd_time.s           },
 	{ "sc_stored_hdrs",   STR_PARAM, &sc_stored_hdrs.s        },
 	{ "sc_stored_hdrs",   STR_PARAM, &sc_stored_hdrs.s        },
 	{ "snd_time_avp",     STR_PARAM, &ms_snd_time_avp_param.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             },
 	{ "add_date",         INT_PARAM, &ms_add_date             },
 	{ "max_messages",     INT_PARAM, &ms_max_messages         },
 	{ "max_messages",     INT_PARAM, &ms_max_messages         },
 	{ "add_contact",      INT_PARAM, &ms_add_contact          },
 	{ "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);
 	sc_snd_time.len = strlen(sc_snd_time.s);
 	if (ms_snd_time_avp_param.s)
 	if (ms_snd_time_avp_param.s)
 		ms_snd_time_avp_param.len = strlen(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  */
 	/* binding to mysql module  */
 	if (db_bind_mod(&ms_db_url, &msilo_dbf))
 	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);
 	db_con = msilo_dbf.init(&ms_db_url);
 	if (!db_con)
 	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;
 	struct hdr_field *hdrs;
 	int len = 0;
 	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)
 	for (hdrs = msg->headers; hdrs != NULL; hdrs = hdrs->next)
 	{
 	{