[sr-dev] git:master: core: added timeval field inside sip_msg_t

Daniel-Constantin Mierla miconda at gmail.com
Wed Apr 18 20:03:08 CEST 2012


Module: sip-router
Branch: master
Commit: d4ed4771938ac490a4df2b320236b7b0d462a636
URL:    http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=d4ed4771938ac490a4df2b320236b7b0d462a636

Author: Daniel-Constantin Mierla <miconda at gmail.com>
Committer: Daniel-Constantin Mierla <miconda at gmail.com>
Date:   Wed Apr 18 19:54:41 2012 +0200

core: added timeval field inside sip_msg_t

- new parameter msg_time to set the timeval value at receive time (1
  (on) by default, set to 0 to disable)
- the value is set automatically at received time based if msg_time=1 or
  first time when it is accessed
- the field should bring coherence regarting time of the message - it
  should be the same no matter where is processed

---

 cfg.lex             |    3 +++
 cfg.y               |    3 +++
 globals.h           |    1 +
 main.c              |    3 +++
 parser/msg_parser.c |   13 +++++++++++++
 parser/msg_parser.h |    9 +++++++++
 receive.c           |    2 ++
 7 files changed, 34 insertions(+), 0 deletions(-)

diff --git a/cfg.lex b/cfg.lex
index 8769cfc..a626c8c 100644
--- a/cfg.lex
+++ b/cfg.lex
@@ -510,6 +510,8 @@ LATENCY_LOG				latency_log
 LATENCY_LIMIT_DB		latency_limit_db
 LATENCY_LIMIT_ACTION	latency_limit_action
 
+MSG_TIME	msg_time
+
 CFG_DESCRIPTION		"description"|"descr"|"desc"
 
 LOADMODULE	loadmodule
@@ -976,6 +978,7 @@ IMPORTFILE      "import_file"
 									return HTTP_REPLY_HACK; }
 <INITIAL>{SERVER_ID}  { count(); yylval.strval=yytext; return SERVER_ID;}
 <INITIAL>{LATENCY_LOG}  { count(); yylval.strval=yytext; return LATENCY_LOG;}
+<INITIAL>{MSG_TIME}  { count(); yylval.strval=yytext; return MSG_TIME;}
 <INITIAL>{LATENCY_LIMIT_DB}  { count(); yylval.strval=yytext; return LATENCY_LIMIT_DB;}
 <INITIAL>{LATENCY_LIMIT_ACTION}  { count(); yylval.strval=yytext; return LATENCY_LIMIT_ACTION;}
 <INITIAL>{CFG_DESCRIPTION}	{ count(); yylval.strval=yytext; return CFG_DESCRIPTION; }
diff --git a/cfg.y b/cfg.y
index 1c62c10..cdd03fc 100644
--- a/cfg.y
+++ b/cfg.y
@@ -565,6 +565,7 @@ extern char *finame;
 %token LATENCY_LOG
 %token LATENCY_LIMIT_DB
 %token LATENCY_LIMIT_ACTION
+%token MSG_TIME
 
 %token FLAGS_DECL
 %token AVPFLAGS_DECL
@@ -1701,6 +1702,8 @@ assign_stm:
 	| LATENCY_LIMIT_DB EQUAL error  { yyerror("number  expected"); }
     | LATENCY_LIMIT_ACTION EQUAL NUMBER { default_core_cfg.latency_limit_action=$3; }
 	| LATENCY_LIMIT_ACTION EQUAL error  { yyerror("number  expected"); }
+    | MSG_TIME EQUAL NUMBER { sr_msg_time=$3; }
+	| MSG_TIME EQUAL error  { yyerror("number  expected"); }
 	| UDP_MTU EQUAL NUMBER { default_core_cfg.udp_mtu=$3; }
 	| UDP_MTU EQUAL error { yyerror("number expected"); }
 	| FORCE_RPORT EQUAL NUMBER 
diff --git a/globals.h b/globals.h
index 49b8345..6793aff 100644
--- a/globals.h
+++ b/globals.h
@@ -128,6 +128,7 @@ extern int sock_mode;
 extern char* chroot_dir;
 extern char* working_dir;
 extern int sr_auto_aliases;
+extern int sr_msg_time;
 
 #ifdef USE_MCAST
 extern int mcast_loopback;
diff --git a/main.c b/main.c
index 07be3c1..306e409 100644
--- a/main.c
+++ b/main.c
@@ -418,6 +418,9 @@ int sock_mode= S_IRUSR| S_IWUSR| S_IRGRP| S_IWGRP; /* rw-rw---- */
 
 int server_id = 0; /* Configurable unique ID of the server */
 
+/* set timeval for each received sip message */
+int sr_msg_time = 1;
+
 /* more config stuff */
 int disable_core_dump=0; /* by default enabled */
 int open_files_limit=-1; /* don't touch it by default */
diff --git a/parser/msg_parser.c b/parser/msg_parser.c
index 29495d9..929d69d 100644
--- a/parser/msg_parser.c
+++ b/parser/msg_parser.c
@@ -55,6 +55,7 @@
 
 #include <string.h>
 #include <stdlib.h>
+#include <sys/time.h>
 
 #include "../comp_defs.h"
 #include "msg_parser.h"
@@ -892,3 +893,15 @@ int msg_ctx_id_match(sip_msg_t *msg, msg_ctx_id_t *mid)
 		return 0;
 	return 1;
 }
+
+/**
+ * set msg time value
+ */
+int msg_set_time(sip_msg_t *msg)
+{
+	if(unlikely(msg==NULL))
+		return -2;
+	if(msg->tval.tv_sec!=0)
+		return 0;
+	return gettimeofday(&msg->tval, NULL);
+}
diff --git a/parser/msg_parser.h b/parser/msg_parser.h
index c633fed..6718b7a 100644
--- a/parser/msg_parser.h
+++ b/parser/msg_parser.h
@@ -251,10 +251,14 @@ typedef struct msg_body {
 } msg_body_t;
 
 
+/* pre-declaration, to include sys/time.h in .c */
+struct timeval;
+
 /*! \brief The SIP message */
 typedef struct sip_msg {
 	unsigned int id;               /*!< message id, unique/process*/
 	int pid;                       /*!< process id */
+	struct timeval tval;           /*!< time value associated to message */
 	snd_flags_t fwd_send_flags;    /*!< send flags for forwarding */
 	snd_flags_t rpl_send_flags;    /*!< send flags for replies */
 	struct msg_start first_line;   /*!< Message first line */
@@ -483,4 +487,9 @@ int msg_ctx_id_set(sip_msg_t *msg, msg_ctx_id_t *mid);
  */
 int msg_ctx_id_match(sip_msg_t *msg, msg_ctx_id_t *mid);
 
+/**
+ * set msg time value
+ */
+int msg_set_time(sip_msg_t *msg);
+
 #endif
diff --git a/receive.c b/receive.c
index c701dd8..4426b6d 100644
--- a/receive.c
+++ b/receive.c
@@ -139,6 +139,8 @@ int receive_msg(char* buf, unsigned int len, struct receive_info* rcv_info)
 	msg->set_global_address=default_global_address;
 	msg->set_global_port=default_global_port;
 	
+	if(likely(sr_msg_time==1)) msg_set_time(msg);
+
 	if (parse_msg(buf,len, msg)!=0){
 		LOG(cfg_get(core, core_cfg, corelog),
 				"ERROR: receive_msg: parse_msg failed\n");




More information about the sr-dev mailing list