Forráskód Böngészése

modules/acc: added reason_from_reason_hf module paramater

- in schema, increased size of sip_reason field to 128 chars
Juha Heinanen 11 éve
szülő
commit
7f136429e5

+ 1 - 1
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

+ 1 - 1
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">

+ 1 - 1
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>

+ 25 - 8
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)");

+ 20 - 1
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;
+		}
 	}
 }
 

+ 2 - 0
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      },

+ 1 - 0
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;

+ 20 - 0
modules/acc/doc/acc_admin.xml

@@ -1476,6 +1476,26 @@ modparam("acc", "time_exten", "micorsecs")
 ...
 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>