Module: kamailio
Branch: 5.1
Commit: 942445c2c3844ae5d2692d7c734cb1375caed849
URL:
https://github.com/kamailio/kamailio/commit/942445c2c3844ae5d2692d7c734cb13…
Author: valentin <christoph.valentin(a)kapsch.net>
Committer: Daniel-Constantin Mierla <miconda(a)gmail.com>
Date: 2018-06-04T15:06:15+02:00
ims_isc: initial fix of issue #1168
Function isc_match_filter() got a new local variable firstflag in
order to handle the case where a FAILURE_ROUTE callback is
received before the first AS has been contacted.
The firstflag is also forwarded to function isc_forward() as
parameter.
---
Modified: src/modules/ims_isc/ims_isc_mod.c
Modified: src/modules/ims_isc/isc.c
Modified: src/modules/ims_isc/isc.h
---
Diff:
https://github.com/kamailio/kamailio/commit/942445c2c3844ae5d2692d7c734cb13…
Patch:
https://github.com/kamailio/kamailio/commit/942445c2c3844ae5d2692d7c734cb13…
---
diff --git a/src/modules/ims_isc/ims_isc_mod.c b/src/modules/ims_isc/ims_isc_mod.c
index e0f7b940ee..4618ca7db1 100644
--- a/src/modules/ims_isc/ims_isc_mod.c
+++ b/src/modules/ims_isc/ims_isc_mod.c
@@ -224,6 +224,8 @@ int isc_match_filter(struct sip_msg *msg, char *str1, udomain_t* d) {
//sometimes s is populated by an ims_getter method cscf_get_terminating_user that
alloc memory that must be free-ed at the end
int free_s = 0;
+ //the callback from the Cx interface in case of unreg terminating initial message is
a FAILURE_ROUTE. Hence we need an addl. flag
+ int firstflag = 0;
int ret = ISC_RETURN_FALSE;
isc_mark new_mark, old_mark;
@@ -245,9 +247,10 @@ int isc_match_filter(struct sip_msg *msg, char *str1, udomain_t* d)
{
LM_DBG("Message returned s=%d;h=%d;d=%d;a=%.*s\n", old_mark.skip,
old_mark.handling, old_mark.direction, old_mark.aor.len, old_mark.aor.s);
} else {
LM_DBG("Starting triggering\n");
+ firstflag = 1;
}
- if (is_route_type(FAILURE_ROUTE)) {
+ if (is_route_type(FAILURE_ROUTE) && !firstflag) {
/* need to find the handling for the failed trigger */
if (dir == DLG_MOBILE_ORIGINATING) {
k = cscf_get_originating_user(msg, &s);
@@ -345,7 +348,7 @@ int isc_match_filter(struct sip_msg *msg, char *str1, udomain_t* d) {
new_mark.skip = m->index + 1;
new_mark.handling = m->default_handling;
new_mark.aor = s;
- ret = isc_forward(msg, m, &new_mark);
+ ret = isc_forward(msg, m, &new_mark, firstflag);
isc_free_match(m);
goto done;
}
@@ -383,7 +386,7 @@ int isc_match_filter(struct sip_msg *msg, char *str1, udomain_t* d) {
new_mark.skip = m->index + 1;
new_mark.handling = m->default_handling;
new_mark.aor = s;
- ret = isc_forward(msg, m, &new_mark);
+ ret = isc_forward(msg, m, &new_mark, firstflag);
isc_free_match(m);
goto done;
}
diff --git a/src/modules/ims_isc/isc.c b/src/modules/ims_isc/isc.c
index 3d1fdf5c46..a095e054e7 100644
--- a/src/modules/ims_isc/isc.c
+++ b/src/modules/ims_isc/isc.c
@@ -56,7 +56,7 @@
* @param mark - the isc_mark that should be used to mark the message
* @returns #ISC_RETURN_TRUE if OK, #ISC_RETURN_ERROR if not
*/
-int isc_forward(struct sip_msg *msg, isc_match *m, isc_mark *mark) {
+int isc_forward(struct sip_msg *msg, isc_match *m, isc_mark *mark, int firstflag) {
struct cell *t;
unsigned int hash, label;
ticks_t fr_timeout, fr_inv_timeout;
@@ -75,7 +75,7 @@ int isc_forward(struct sip_msg *msg, isc_match *m, isc_mark *mark) {
memcpy(msg->dst_uri.s, m->server_name.s, m->server_name.len);
/* append branch if last trigger failed */
- if (is_route_type(FAILURE_ROUTE))
+ if (is_route_type(FAILURE_ROUTE) && !firstflag)
append_branch(msg, &(msg->first_line.u.request.uri), &(msg->dst_uri), 0,
Q_UNSPECIFIED, 0, 0, 0, 0, 0, 0);
// Determines the tm transaction identifiers.
diff --git a/src/modules/ims_isc/isc.h b/src/modules/ims_isc/isc.h
index 8c3715e347..ac012162fd 100644
--- a/src/modules/ims_isc/isc.h
+++ b/src/modules/ims_isc/isc.h
@@ -66,7 +66,7 @@ extern int isc_fr_inv_timeout; /**< default ISC INVITE response
timeout in ms *
/** SIP Status Code to send to client on Session Termination because AS did not respond
*/
-int isc_forward( struct sip_msg *msg, isc_match *m,isc_mark *mark);
+int isc_forward( struct sip_msg *msg, isc_match *m,isc_mark *mark, int firstflag);
#endif