Module: sip-router
Branch: master
Commit: 7f136429e5b676077c4f71c5cc178dd0c125951b
URL:
http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=7f13642…
Author: Juha Heinanen <jh(a)tutpro.com>
Committer: Juha Heinanen <jh(a)tutpro.com>
Date: Sat May 31 10:34:19 2014 +0300
modules/acc: added reason_from_reason_hf module paramater
- in schema, increased size of sip_reason field to 128 chars
---
lib/srdb1/schema/acc.xml | 2 +-
lib/srdb1/schema/entities.xml | 2 +-
lib/srdb1/schema/missed_calls.xml | 2 +-
modules/acc/README | 33 +++++++++++++++++++++++++--------
modules/acc/acc_logic.c | 21 ++++++++++++++++++++-
modules/acc/acc_mod.c | 2 ++
modules/acc/acc_mod.h | 1 +
modules/acc/doc/acc_admin.xml | 20 ++++++++++++++++++++
8 files changed, 71 insertions(+), 12 deletions(-)
diff --git a/lib/srdb1/schema/acc.xml b/lib/srdb1/schema/acc.xml
index 719298e..2d8d66b 100644
--- a/lib/srdb1/schema/acc.xml
+++ b/lib/srdb1/schema/acc.xml
@@ -9,7 +9,7 @@
<table id="acc"
xmlns:db="http://docbook.org/ns/docbook">
<name>acc</name>
- <version>4</version>
+ <version>5</version>
<type db="mysql">&MYSQL_TABLE_TYPE;</type>
<description>
<db:para>This table is used by the ACC module to report on transactions -
accounted calls. More information is available at: &KAMAILIO_MOD_DOC;acc.html
diff --git a/lib/srdb1/schema/entities.xml b/lib/srdb1/schema/entities.xml
index 526ac55..bb3ddf3 100644
--- a/lib/srdb1/schema/entities.xml
+++ b/lib/srdb1/schema/entities.xml
@@ -13,7 +13,7 @@
<!ENTITY avp_val_len "128">
<!ENTITY ip_add_len "50">
<!ENTITY sip_code_len "3">
-<!ENTITY sip_reason_len "32">
+<!ENTITY sip_reason_len "128">
<!ENTITY cseq_len "11">
<!ENTITY callid_len "255">
<!ENTITY expires_len "11">
diff --git a/lib/srdb1/schema/missed_calls.xml b/lib/srdb1/schema/missed_calls.xml
index 7a66440..8c824ab 100644
--- a/lib/srdb1/schema/missed_calls.xml
+++ b/lib/srdb1/schema/missed_calls.xml
@@ -9,7 +9,7 @@
<table id="missed_calls"
xmlns:db="http://docbook.org/ns/docbook">
<name>missed_calls</name>
- <version>3</version>
+ <version>4</version>
<type db="mysql">&MYSQL_TABLE_TYPE;</type>
<description>
<db:para>This table is used by the ACC module for keeping track of missed
calls. This table is similar to the 'acc' table. More information is available at:
&KAMAILIO_MOD_DOC;acc.html</db:para>
diff --git a/modules/acc/README b/modules/acc/README
index ea72fd6..8316b52 100644
--- a/modules/acc/README
+++ b/modules/acc/README
@@ -131,6 +131,7 @@ Sven Knoblich
6.48. time_attr (str)
6.49. time_exten (str)
6.50. time_format (str)
+ 6.51. reason_from_reason_hf (int)
7. Functions
@@ -193,10 +194,11 @@ Sven Knoblich
1.48. time_attr example
1.49. time_exten example
1.50. time_format example
- 1.51. acc_log_request usage
- 1.52. acc_db_request usage
- 1.53. acc_rad_request usage
- 1.54. acc_diam_request usage
+ 1.51. reason_from_reason_hf
+ 1.52. acc_log_request usage
+ 1.53. acc_db_request usage
+ 1.54. acc_rad_request usage
+ 1.55. acc_diam_request usage
Chapter 1. Admin Guide
@@ -291,6 +293,7 @@ Chapter 1. Admin Guide
6.48. time_attr (str)
6.49. time_exten (str)
6.50. time_format (str)
+ 6.51. reason_from_reason_hf (int)
7. Functions
@@ -705,6 +708,7 @@ $dlg_var(callee) = $avp(callee); #callee='C'
6.48. time_attr (str)
6.49. time_exten (str)
6.50. time_format (str)
+ 6.51. reason_from_reason_hf (int)
6.1. early_media (integer)
@@ -1350,6 +1354,19 @@ modparam("acc", "time_exten",
"micorsecs")
modparam("acc", "time_format", "%Y/%m/%d %H:%M:%S")
...
+6.51. reason_from_reason_hf (int)
+
+ Tells where to take sip_reason from. If value is 0, sip_reason is taken
+ from status line. Otherwise, sip_reason is taken from Reason header
+ field(s) if present. Currently only the first Reason header is used.
+
+ Default value is 0.
+
+ Example 1.51. reason_from_reason_hf
+...
+modparam("acc", "reason_from_reason_hf", 1)
+...
+
7. Functions
7.1. acc_log_request(comment)
@@ -1370,7 +1387,7 @@ modparam("acc", "time_format", "%Y/%m/%d
%H:%M:%S")
This function can be used from ANY_ROUTE.
- Example 1.51. acc_log_request usage
+ Example 1.52. acc_log_request usage
...
acc_log_request("Some comment");
$var(code) = 404;
@@ -1392,7 +1409,7 @@ acc_log_request("$var(code) Error: $avp(reason)");
This function can be used from ANY_ROUTE.
- Example 1.52. acc_db_request usage
+ Example 1.53. acc_db_request usage
...
acc_db_request("Some comment", "SomeTable");
acc_db_request("Some comment", "acc_$time(year)_$time(mon)");
@@ -1410,7 +1427,7 @@ acc_db_request("$var(code) Error: $avp(reason)",
"SomeTable");
This function can be used from ANY_ROUTE.
- Example 1.53. acc_rad_request usage
+ Example 1.54. acc_rad_request usage
...
acc_rad_request("Some comment");
acc_rad_request("$var(code) Error: $avp(reason)");
@@ -1427,7 +1444,7 @@ acc_rad_request("$var(code) Error: $avp(reason)");
This function can be used from ANY_ROUTE.
- Example 1.54. acc_diam_request usage
+ Example 1.55. acc_diam_request usage
...
acc_diam_request("Some comment");
acc_diam_request("$var(code) Error: $avp(reason)");
diff --git a/modules/acc/acc_logic.c b/modules/acc/acc_logic.c
index 0641388..452e171 100644
--- a/modules/acc/acc_logic.c
+++ b/modules/acc/acc_logic.c
@@ -42,6 +42,7 @@
#include "../../sr_module.h"
#include "../../parser/parse_from.h"
#include "../../parser/parse_content.h"
+#include "../../lib/kcore/cmpapi.h"
#include "../../modules/tm/tm_load.h"
#include "../rr/api.h"
#include "../../flags.h"
@@ -132,6 +133,8 @@ static inline void env_set_text(char *p, int len)
static inline void env_set_code_status( int code, struct sip_msg *reply)
{
static char code_buf[INT2STR_MAX_LEN];
+ str reason = {"Reason", 6};
+ struct hdr_field *hf;
acc_env.code = code;
if (reply==FAKED_REPLY || reply==NULL) {
@@ -143,7 +146,23 @@ static inline void env_set_code_status( int code, struct sip_msg
*reply)
acc_env.reason.len = strlen(acc_env.reason.s);
} else {
acc_env.code_s = reply->first_line.u.reply.status;
- acc_env.reason = reply->first_line.u.reply.reason;
+ hf = NULL;
+ if (reason_from_reason_hf) {
+ /* TODO: take reason from all Reason headers */
+ if(parse_headers(reply, HDR_EOH_F, 0) < 0) {
+ LM_ERR("error parsing headers\n");
+ } else {
+ for (hf=reply->headers; hf; hf=hf->next) {
+ if (cmp_hdrname_str(&hf->name, &reason)==0)
+ break;
+ }
+ }
+ }
+ if (hf == NULL) {
+ acc_env.reason = reply->first_line.u.reply.reason;
+ } else {
+ acc_env.reason = hf->body;
+ }
}
}
diff --git a/modules/acc/acc_mod.c b/modules/acc/acc_mod.c
index ff94baa..347e054 100644
--- a/modules/acc/acc_mod.c
+++ b/modules/acc/acc_mod.c
@@ -110,6 +110,7 @@ static char* leg_info_str = 0; /*!< multi call-leg support */
struct acc_extra *leg_info = 0;
int acc_prepare_flag = -1; /*!< should the request be prepared for later acc */
char *acc_time_format = "%Y-%m-%d %H:%M:%S";
+int reason_from_reason_hf = 0; /*!< assign reason from reason hf if present */
/* ----- time mode variables ------- */
/*! \name AccTimeModeVariables Time Mode Variables */
@@ -258,6 +259,7 @@ static param_export_t params[] = {
{"multi_leg_info", STR_PARAM, &leg_info_str },
{"detect_direction", INT_PARAM, &detect_direction },
{"acc_prepare_flag", INT_PARAM, &acc_prepare_flag },
+ {"reason_from_reason_hf", INT_PARAM, &reason_from_reason_hf },
/* syslog specific */
{"log_flag", INT_PARAM, &log_flag },
{"log_missed_flag", INT_PARAM, &log_missed_flag },
diff --git a/modules/acc/acc_mod.h b/modules/acc/acc_mod.h
index 98cef33..68911dc 100644
--- a/modules/acc/acc_mod.h
+++ b/modules/acc/acc_mod.h
@@ -50,6 +50,7 @@ extern int failed_transaction_flag;
extern unsigned short failed_filter[];
extern int detect_direction;
extern int acc_prepare_flag;
+extern int reason_from_reason_hf;
extern int log_facility;
extern int log_level;
diff --git a/modules/acc/doc/acc_admin.xml b/modules/acc/doc/acc_admin.xml
index 54b9517..b0a1217 100644
--- a/modules/acc/doc/acc_admin.xml
+++ b/modules/acc/doc/acc_admin.xml
@@ -1479,6 +1479,26 @@ modparam("acc", "time_format", "%Y/%m/%d
%H:%M:%S")
</programlisting>
</example>
</section>
+ <section id="acc.p.reason_from_reason_hf">
+ <title><varname>reason_from_reason_hf</varname> (int)</title>
+ <para>
+ Tells where to take sip_reason from. If value is 0,
+ sip_reason is taken from status line. Otherwise, sip_reason
+ is taken from Reason header field(s) if present.
+ Currently only the first Reason header is used.
+ </para>
+ <para>
+ Default value is 0.
+ </para>
+ <example>
+ <title>reason_from_reason_hf</title>
+ <programlisting format="linespecific">
+...
+modparam("acc", "reason_from_reason_hf", 1)
+...
+</programlisting>
+ </example>
+ </section>
</section>
<section>