Hi guys..... more specifically, TM experts ;)
I have just committed a tmp branch called tm_async_extensions. We noticed
with the current async impl, it is not possible to do things like forward()
and t_relay() in a continued async route block. This is mainly because the
faked env. created is specifically triggered to be a failure route in the
continuation code.
We have changed this to execute the route block using the original block
type when the transaction was suspended (eg REQUEST_ROUTE, ON_REPLY, etc).
We have also tested using reply blocks (ie suspending replies) but that
code will come later once everyone is happy that we include the current
subset of changes to improve normal async REQUEST processing.
The current changes require some changes to the main TM structure (mainly
for 'backing up' state before suspending). There is also a new mutex used
to prevent multiple concurrent invocations of t_continue (previously we
were using the reply lock).
It would be great if some TM experts could review the code to ensure there
are no use cases that we have missed that could break things. Daniel I
suspect you know TM and its impacts the best, or is there someone else we
should include?
So far for our use cases, these changes work great. We can do things like:
route[INVITE] {
t_newtran();
async_route("INVITERESUME", "10"); #resume transaction in 10
seconds running route block INVITERESUME
exit;
}
route[INVITERESUME] {
t_relay();
}
All upstream reply processing is correctly handled, local ACK generation
and processing works as expected, etc.
The above example may seem absurd (why would we want to delay our proxy of
an INVITE for 10 seconds????) - Well this is just an easy example we use in
our test cases. Actually we are using the async processing in the IMS code
to increase performance when an INVITE for example triggers a long running
process (like a DIAMETER request to get a users profile for example). Using
conventional methods (no async transactions), the SIP worker process will
sit locked up for this time (maybe 100's of milliseconds) unnecessarily. We
found that using t_suspend and t_continue internally in our code improves
performance significantly. I can see many use cases for the async code to
improve performance, especially cases where we use backend DB's, memcached,
radius, diameter, etc before actually "doing SIP routing".....
Any feedback would be greatly appreciated.
Cheers
Jason
THIS IS AN AUTOMATED MESSAGE, DO NOT REPLY.
A new Flyspray task has been opened. Details are below.
User who did this - Stefan Prelle (spr)
Attached to Project - sip-router
Summary - uac_redirect not honoring q-value for max_total = 1
Task Type - Bug Report
Category - Modules kamailio
Status - Unconfirmed
Assigned To -
Operating System - Linux
Severity - Medium
Priority - Normal
Reported Version - 4.0
Due in Version - Undecided
Due Date - Undecided
Details - I am using kamailio 4.0.3 and the uac_redirect module to evaluate the 302 response from a SIP redirect server and establish a call only to the target with the highest priority.
My problem is, that kamailio does not pick the target with the highest priority, but the one with the lowest.
In the 302 the kamailio is receiving, there is a Contact header like this:
<code>Contact:<sip:+49xxx@a.a.a.a:5060;user=phone>;q=0.5,<sip:+49xxx@b.b.b.b:5060;user=phone>;q=0.25</code>
In my failure_route block I basically use the following commands
<code>get_redirects("1");
t_relay();</code>
The call then gets redirected to b.b.b.b whereas I would expect it to goto a.a.a.a
When I change my script to
<code>get_redirects("*");</code>
the call is forked to both IPs in parallel (starting with a.a.a.a)
I tried to strip that down to a minimal config that you will find attached.
One or more files have been attached.
More information can be found at the following URL:
http://sip-router.org/tracker/index.php?do=details&task_id=349
You are receiving this message because you have requested it from the Flyspray bugtracking system. If you did not expect this message or don't want to receive mails in future, you can change your notification settings at the URL shown above.
Module: sip-router
Branch: master
Commit: 378bd71de3b035b497469f89a640931d0792ce4f
URL: http://git.sip-router.org/cgi-bin/gitweb.cgi/sip-router/?a=commit;h=378bd71…
Author: Peter Dunkley <peter.dunkley(a)crocodilertc.net>
Committer: Peter Dunkley <peter.dunkley(a)crocodilertc.net>
Date: Wed Sep 25 16:12:50 2013 +0100
xhttp: added transformation to break a URL into "path" and "querystring"
---
modules/xhttp/xhttp_mod.c | 13 +++++
modules/xhttp/xhttp_trans.c | 125 +++++++++++++++++++++++++++++++++++++++++++
modules/xhttp/xhttp_trans.h | 30 ++++++++++
3 files changed, 168 insertions(+), 0 deletions(-)
diff --git a/modules/xhttp/xhttp_mod.c b/modules/xhttp/xhttp_mod.c
index 23ac3c4..9848892 100644
--- a/modules/xhttp/xhttp_mod.c
+++ b/modules/xhttp/xhttp_mod.c
@@ -45,6 +45,7 @@
#include "../../pvar.h"
#include "api.h"
+#include "xhttp_trans.h"
MODULE_VERSION
@@ -106,6 +107,13 @@ struct module_exports exports= {
0 /* per-child init function */
};
+static tr_export_t mod_trans[] = {
+ { {"url", sizeof("url")-1},
+ xhttp_tr_parse_url },
+
+ { { 0, 0 }, 0 }
+};
+
/**
*
*/
@@ -162,6 +170,11 @@ static int mod_init(void)
return 0;
}
+int mod_register(char *path, int *dlflags, void *p1, void *p2)
+{
+ return register_trans_mod(path, mod_trans);
+}
+
/**
*
*/
diff --git a/modules/xhttp/xhttp_trans.c b/modules/xhttp/xhttp_trans.c
new file mode 100644
index 0000000..35c1609
--- /dev/null
+++ b/modules/xhttp/xhttp_trans.c
@@ -0,0 +1,125 @@
+/*
+ * $Id$
+ *
+ * Copyright (C) 2013 Crocodile RCS Ltd
+ *
+ * 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
+ */
+#include "../../pvar.h"
+#include "../../str.h"
+#include "../../trim.h"
+#include "xhttp_trans.h"
+
+enum _tr_xhttp_type { TR_XHTTP_NONE = 0, TR_XHTTPURL, TR_XHTTPURLQUERYSTRING };
+enum _tr_xhttpurl_subtype { TR_XHTTPURL_NONE = 0, TR_XHTTPURL_PATH,
+ TR_XHTTPURL_QUERYSTRING};
+enum _tr_xhttpquerystring_subtype { TR_XHTTPUTLQUERYSTRING_NONE = 0,
+ TR_XHTTPURLQUERYSTRING_VALUE};
+
+int xhttp_tr_eval_xhttpurl(struct sip_msg *msg, tr_param_t *tp, int subtype,
+ pv_value_t *val)
+{
+ int pos = 0;
+
+ if (val == NULL || val->flags & PV_VAL_NULL)
+ return -1;
+
+ if (!(val->flags & PV_VAL_STR))
+ {
+ val->rs.s = int2str(val->ri, &val->rs.len);
+ val->flags = PV_VAL_STR;
+ }
+
+ switch (subtype)
+ {
+ case TR_XHTTPURL_PATH:
+ while (val->rs.s[pos] != '?' && pos < val->rs.len)
+ pos++;
+
+ val->rs.len = pos;
+ break;
+
+ case TR_XHTTPURL_QUERYSTRING:
+ while (val->rs.s[pos] != '?' && pos < val->rs.len)
+ pos++;
+
+ if (pos >= val->rs.len)
+ {
+ val->rs.s[0] = '\0';
+ val->rs.len = 0;
+ break;
+ }
+
+ val->rs.s = &val->rs.s[pos + 1];
+ val->rs.len = val->rs.len - pos - 1;
+ break;
+
+ default:
+ LM_ERR("unknown subtype %d\n", subtype);
+ return -1;
+ }
+
+ return 0;
+}
+
+char *xhttp_tr_parse_url(str *in, trans_t *t)
+{
+ char *p;
+ str name;
+
+ if (in == NULL || in->s == NULL || t == NULL)
+ return NULL;
+
+ p = in->s;
+ name.s = in->s;
+ t->type = TR_XHTTPURL;
+ t->trf = xhttp_tr_eval_xhttpurl;
+
+ /* find next token */
+ while (is_in_str(p, in) && *p != TR_PARAM_MARKER && *p != TR_RBRACKET)
+ {
+ p++;
+ }
+
+ if (*p == '\0')
+ {
+ LM_ERR("invalid transformation: %.*s\n", in->len, in->s);
+ goto error;
+ }
+ name.len = p - name.s;
+ trim(&name);
+
+ if (name.len == 4 && strncasecmp(name.s, "path", 4) == 0)
+ {
+ t->subtype = TR_XHTTPURL_PATH;
+ goto done;
+ }
+ else if (name.len == 11 && strncasecmp(name.s, "querystring", 11) == 0)
+ {
+ t->subtype = TR_XHTTPURL_QUERYSTRING;
+ goto done;
+ }
+
+ LM_ERR("unknown transformation: %.*s/%.*s/%d!\n", in->len, in->s,
+ name.len, name.s, name.len);
+error:
+ return NULL;
+
+done:
+ t->name = name;
+ return p;
+}
diff --git a/modules/xhttp/xhttp_trans.h b/modules/xhttp/xhttp_trans.h
new file mode 100644
index 0000000..0f27ca8
--- /dev/null
+++ b/modules/xhttp/xhttp_trans.h
@@ -0,0 +1,30 @@
+/*
+ * $Id$
+ *
+ * Copyright (C) 2013 Crocodile RCS Ltd
+ *
+ * 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 XHTTP_TRANS_H_
+#define XHTTP_TRANS_H_
+
+#include "../../pvar.h"
+#include "../../str.h"
+
+char *xhttp_tr_parse_url(str *in, trans_t *t);
+
+#endif /* XHTTP_TRANS_H_ */