Hello,
I just updated the kamailio-3.0 git repository, changes include:
* kamailio statistics code is now in libkcore
* snmpstats module has been updated and compiles
* Hennings' new memcached module is in the repository.
I also pulled latest changes from all repositories involved and
updated all branches.
Make sure that you use -f option when you do git pull or git fetch
(the repository has branches that use git-rebase and so the -f option
will most likely be necessary).
Jan.
Daniel-Constantin Mierla writes:
> > thanks for that. there is still work to do regarding t_relay failures
> > (also applies to fork.cfg). based on today's tests (that i wrote
> > another message about), i'm totally confused regarding tm's t_relay
> > behavior. there is no documentation on de-arming of route blocks,
> you have to give "0" as parameter to functions arming tm route
> > blocks.
yes, i know that. i meant automatic de-arming when t_relay is called.
at least in some case i have noticed earlier that if i don't set again
failure/branck/reply routes in failure route, they are not necessarily
set when t_relay is called in failure route.
> Probably different codes should be returned in case of errors, to
> differentiate the behavior in the config.
i would prefer that the default behavior is that failure route is called
no matter what error happened. there could be a way to override that if
someone wants to have more manual control.
for example, lets say that there is a syntax error in r-uri of a
branch that is being t_relayed. if failure route is set, it should get
called with error "400 Bad Request".
i cc this to sr-dev lists, since in my opinion sip-router tm module
should allow user friendly, simple handling of t_relay failures.
-- juha
Hello,
There are two functions in the implementation of timers in kamailio,
register_timer and register_timer_process. What is the different between those
two functions and which should be used when? I noticed that, for example, the
htable module seems to be using them interchangeably, there is a modparam
which controls which function is gonna be used.
Can we replace register_timer_process with register_timer function from the
sip-router core?
thanks, Jan.
Module: sip-router
Branch: master
Commit: 45df9f7e49450e27507977fa71a67dd98d381d9e
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=45df9f7…
Author: Andrei Pelinescu-Onciul <andrei(a)iptel.org>
Committer: Andrei Pelinescu-Onciul <andrei(a)iptel.org>
Date: Tue Mar 10 22:35:33 2009 +0100
timers: helpers for forking separate timer procs
Helper functions for forking simple separate timer processes:
fork_dummy_timer(...) - forks a process that will just sleep()
for the required interval and then will call the provided
timer function, all that in a loop.
Care must be taken to use it only when fork_process() is
allowed (e.g.: module child_init function, when
rank==PROC_MAIN; see doc/modules_init.txt for more details)
It can be used to replace kamailio register_timer_process()
(but note that it's not a "drop-in" replacement).
fork_local_timer_process() - forks a process, initializes a
local_timer for it, and returns the local_timer handler both
to the parent and to the child process, so both of them can
add/del timers (if appropriate locking is used).
Example usage:
struct local_timer* lt_h;
pid=fork_local_timer_process(...., <_h);
if (pid==0){
timer_init(&my_timer1, my_timer_f1, 0, 0);
...
local_timer_add(<_h, &my_timer, S_TO_TICKS(10), get_ticks_raw());
...
while(1) { sleep(1); local_timer_run(lt, get_ticks_raw()); }
}
(note that instead of sleep()-ing the process can do some useful work,
like polling some fds a.s.o.)
---
timer_proc.c | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
timer_proc.h | 43 +++++++++++++++++++++
2 files changed, 159 insertions(+), 0 deletions(-)
diff --git a/timer_proc.c b/timer_proc.c
new file mode 100644
index 0000000..7d0abb7
--- /dev/null
+++ b/timer_proc.c
@@ -0,0 +1,116 @@
+/*
+ * $Id$
+ *
+ * Copyright (C) 2009 iptelorg GmbH
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/*
+ * timer_proc.c - separate process timers
+ * (unrelated to the main fast and slow timers)
+ */
+/*
+ * History:
+ * --------
+ * 2009-03-10 initial version (andrei)
+*/
+
+#include "timer_proc.h"
+#include "pt.h"
+#include "mem/shm_mem.h"
+
+#include <unistd.h>
+
+
+/** forks a separate simple sleep() periodic timer.
+ * Forks a very basic periodic timer process, that just sleep()s for
+ * the specified interval and then calls the timer function.
+ * The new "dummy timer" process execution start immediately, the sleep()
+ * is called first (so the first call to the timer function will happen
+ * <interval> seconds after the call to fork_dummy_timer)
+ * @param child_id - @see fork_process()
+ * @param desc - @see fork_process()
+ * @param make_sock - @see fork_process()
+ * @param f - timer function/callback
+ * @param param - parameter passed to the timer function
+ * @param interval - interval in seconds.
+ * @return - pid of the new process on success, -1 on error
+ * (doesn't return anything in the child process)
+ */
+int fork_dummy_timer(int child_id, char* desc, int make_sock,
+ timer_function* f, void* param, int interval)
+{
+ int pid;
+
+ pid=fork_process(child_id, desc, make_sock);
+ if (pid<0) return -1;
+ if (pid==0){
+ /* child */
+ for(;;){
+ sleep(interval);
+ f(get_ticks(), param); /* ticks in s for compatibility with old
+ timers */
+ }
+ }
+ /* parent */
+ return pid;
+}
+
+
+
+/** forks a timer process based on the local timer.
+ * Forks a separate timer process running a local_timer.h type of timer
+ * A pointer to the local_timer handle (allocated in shared memory) is
+ * returned in lt_h. It can be used to add/delete more timers at runtime
+ * (via local_timer_add()/local_timer_del() a.s.o).
+ * If timers are added from separate processes, some form of locking must be
+ * used (all the calls to local_timer* must be enclosed by locks if it
+ * cannot be guaranteed that they cannot execute in the same time)
+ * The timer "engine" must be run manually from the child process. For
+ * example a very simple local timer process that just runs a single
+ * periodic timer can be started in the following way:
+ * struct local_timer* lt_h;
+ *
+ * pid=fork_local_timer_process(...., <_h);
+ * if (pid==0){
+ * timer_init(&my_timer, my_timer_f, 0, 0);
+ * local_timer_add(<_h, &my_timer, S_TO_TICKS(10), get_ticks_raw());
+ * while(1) { sleep(1); local_timer_run(lt, get_ticks_raw()); }
+ * }
+ *
+ * @param child_id - @see fork_process()
+ * @param desc - @see fork_process()
+ * @param make_sock - @see fork_process()
+ * @param lt_h - local_timer handler
+ * @return - pid to the parent, 0 to the child, -1 if error.
+ */
+int fork_local_timer_process(int child_id, char* desc, int make_sock,
+ struct local_timer** lt_h)
+{
+ int pid;
+ struct local_timer* lt;
+
+ lt=shm_malloc(sizeof(*lt));
+ if (lt==0) goto error;
+ if (init_local_timer(lt, get_ticks_raw())<0) goto error;
+ pid=fork_process(child_id, desc, make_sock);
+ if (pid<0) goto error;
+ *lt_h=lt;
+ return pid;
+error:
+ if (lt) shm_free(lt);
+ return -1;
+}
+
+
+/* vi: set ts=4 sw=4 tw=79:ai:cindent: */
diff --git a/timer_proc.h b/timer_proc.h
new file mode 100644
index 0000000..e68e146
--- /dev/null
+++ b/timer_proc.h
@@ -0,0 +1,43 @@
+/*
+ * $Id$
+ *
+ * Copyright (C) 2009 iptelorg GmbH
+ *
+ * Permission to use, copy, modify, and distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+/*
+ * timer_proc.h - separate process timers
+ * (unrelated to the main fast and slow timers)
+ */
+/*
+ * History:
+ * --------
+ * 2009-03-10 initial version (andrei)
+*/
+
+#ifndef __timer_proc_h
+#define __timer_proc_h
+
+#include "local_timer.h"
+
+/* forks a separate simple sleep() periodic timer */
+int fork_dummy_timer(int child_id, char* desc, int make_sock,
+ timer_function* f, void* param, int interval);
+
+/* forks a timer process based on the local timer */
+int fork_local_timer_process(int child_id, char* desc, int make_sock,
+ struct local_timer** lt_h);
+
+#endif /*__timer_proc_h*/
+
+/* vi: set ts=4 sw=4 tw=79:ai:cindent: */
Daniel-Constantin Mierla writes:
> what I was saying is that many errors can happen before actually
> creating the transaction. And if there is a bad formatted sip message
> then the transaction is not created. Without a transaction, failure
> route cannot be called.
but in case of tcp forwarding failure, failure route is not called even
when transaction is created. i consider that a bug.
what comes to not creating transaction is sip request is badly
formatted, are you saying that if i call t_newtran() in script when sip
request has syntax error, the call fails? if not, what you say is not
true.
> There will be lot to debate on sip transaction specs and handling.
> sr-dev is the right to discuss the future of this one.
yes, i cc'ed sr-dev.
-- juha
Module: sip-router
Branch: janakj/kcore
Commit: d13c2c41f9dc331cf22008c6d7ebd470a0df5525
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=d13c2c4…
Author: Jan Janak <jan(a)iptel.org>
Committer: Jan Janak <jan(a)iptel.org>
Date: Sun Mar 8 23:42:13 2009 +0100
Adding faked_msg.[ch] from kamailio core
These files are missing in the sip-router core
---
lib/kcore/faked_msg.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++
lib/kcore/faked_msg.h | 31 +++++++++++++++++++++++
2 files changed, 95 insertions(+), 0 deletions(-)
diff --git a/lib/kcore/faked_msg.c b/lib/kcore/faked_msg.c
new file mode 100644
index 0000000..9a51723
--- /dev/null
+++ b/lib/kcore/faked_msg.c
@@ -0,0 +1,64 @@
+/**
+ * $Id$
+ *
+ * Copyright (C) 2009 Daniel-Constantin Mierla (asipto.com)
+ *
+ * This file is part of kamailio, a free SIP server.
+ *
+ * openser is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version
+ *
+ * openser is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include "../../dprint.h"
+#include "../../globals.h"
+#include "../../dset.h"
+
+#include "faked_msg.h"
+
+#define FAKED_SIP_MSG "OPTIONS sip:you@kamailio.org SIP/2.0\r\nVia: SIP/2.0/UDP 127.0.0.1\r\nFrom: <you(a)kamailio.org>;tag=123\r\nTo: <you(a)kamailio.org>\r\nCall-ID: 123\r\nCSeq: 1 OPTIONS\r\nContent-Length: 0\r\n\r\n"
+#define FAKED_SIP_MSG_LEN (sizeof(FAKED_SIP_MSG)-1)
+static char _faked_sip_buf[FAKED_SIP_MSG_LEN+1];
+static struct sip_msg _faked_msg;
+static unsigned int _faked_msg_no = 0;
+
+int faked_msg_init(void)
+{
+ if(_faked_msg_no>0)
+ return 0;
+ /* init faked sip msg */
+ memcpy(_faked_sip_buf, FAKED_SIP_MSG, FAKED_SIP_MSG_LEN);
+ _faked_sip_buf[FAKED_SIP_MSG_LEN] = '\0';
+
+ memset(&_faked_msg, 0, sizeof(struct sip_msg));
+
+ _faked_msg.buf=_faked_sip_buf;
+ _faked_msg.len=FAKED_SIP_MSG_LEN;
+
+ _faked_msg.set_global_address=default_global_address;
+ _faked_msg.set_global_port=default_global_port;
+
+ if (parse_msg(_faked_msg.buf, _faked_msg.len, &_faked_msg)!=0)
+ {
+ LM_ERR("parse_msg failed\n");
+ return -1;
+ }
+ return 0;
+}
+
+struct sip_msg* faked_msg_next(void)
+{
+ _faked_msg.id=_faked_msg_no++;
+ clear_branches();
+ return &_faked_msg;
+}
diff --git a/lib/kcore/faked_msg.h b/lib/kcore/faked_msg.h
new file mode 100644
index 0000000..55a4daa
--- /dev/null
+++ b/lib/kcore/faked_msg.h
@@ -0,0 +1,31 @@
+/**
+ * $Id$
+ *
+ * Copyright (C) 2009 Daniel-Constantin Mierla (asipto.com)
+ *
+ * This file is part of kamailio, a free SIP server.
+ *
+ * kamailio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version
+ *
+ * kamailio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#ifndef _FAKED_SIP_MSG_H_
+#define _FAKED_SIP_MSG_H_
+
+#include "../../parser/msg_parser.h"
+
+int faked_msg_init(void);
+struct sip_msg* faked_msg_next(void);
+
+#endif
Module: sip-router
Branch: master
Commit: 00c747a1b113b8af4f9e96f99dcde6b14e36eebd
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=00c747a…
Author: Jan Janak <jan(a)iptel.org>
Committer: Jan Janak <jan(a)iptel.org>
Date: Tue Mar 10 17:44:42 2009 +0100
Export get_sock_info_list function to modules
---
socket_info.c | 2 +-
socket_info.h | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/socket_info.c b/socket_info.c
index 1b260dd..abd3064 100644
--- a/socket_info.c
+++ b/socket_info.c
@@ -301,7 +301,7 @@ static char* get_proto_name(unsigned short proto)
/* returns 0 if support for the protocol is not compiled or if proto is
invalid */
-static struct socket_info** get_sock_info_list(unsigned short proto)
+struct socket_info** get_sock_info_list(unsigned short proto)
{
switch(proto){
diff --git a/socket_info.h b/socket_info.h
index bf36ddb..627e3db 100644
--- a/socket_info.h
+++ b/socket_info.h
@@ -88,7 +88,7 @@ struct socket_info* grep_sock_info_by_port(unsigned short port,
struct socket_info* find_si(struct ip_addr* ip, unsigned short port,
unsigned short proto);
-
+struct socket_info** get_sock_info_list(unsigned short proto);
/* helper function:
* returns next protocol, if the last one is reached return 0