TT#84508 kamailio 5.3.5

* refresh patches
* remove patches already applied on 5.3.5

Change-Id: Ibf787ce7a4588c9e860dceff1589cc9888de9a6e
changes/41/41141/1
Victor Seva 6 years ago
parent 4f64f36925
commit ac3631e7de

17
debian/changelog vendored

@ -1,10 +1,21 @@
ngcp-kamailio (5.3.4-1+0~mr8.5.0.0) unstable; urgency=medium
ngcp-kamailio (5.3.5-1+0~mr8.5.0.0) unstable; urgency=medium
[ Kirill Solomko ]
* TT#81803 add pv_headers case insensitive support
* TT#81803 pv_headers use str_hash_case_get
[ Victor Seva ]
* [c2c59c7] TT#81263 cfgt fix from upstream
* [18503c0] TT#81182 jansson fix
-- Sipwise Jenkins Builder <jenkins@sipwise.com> Tue, 19 May 2020 11:07:51 +0200
* TT#81803 pv_headers use $xavi instead of $xavp
* TT#81803 pv_headers rework
* TT#79400 dialplan: don't stop loading rules on error
* TT#71906 sca: clang-format
* TT#81208 export missing KEMI functions
* TT#84508 New upstream version 5.3.5
* TT#84508 refresh patches
-- Victor Seva <vseva@debian.org> Tue, 23 Jun 2020 11:15:02 +0200
ngcp-kamailio (5.3.4-1+0~mr8.4.0.0) unstable; urgency=medium

@ -7,7 +7,7 @@ Subject: no_lib64_on_64_bits
1 file changed, 1 insertion(+), 9 deletions(-)
diff --git a/src/Makefile.defs b/src/Makefile.defs
index ea55456..92f2287 100644
index 460a589..607350d 100644
--- a/src/Makefile.defs
+++ b/src/Makefile.defs
@@ -452,15 +452,7 @@ endif

@ -25,7 +25,6 @@ sipwise/tmrec-ical.patch
sipwise/registrar_add_path.patch
sipwise/switch_from_python2_to_python3.patch
## SCA Patches
upstream/sca-clang-format-code.patch
sipwise/sca-line-seize.patch
sipwise/sca-fallback-if-no-contact.patch
sipwise/sca-call-info-unsubscribe.patch
@ -66,7 +65,6 @@ upstream/cfgt-fix-implicit-declaration-of-strcasestr.patch
upstream/core-str-helper-macro-to-set-ending-zero-with-backup.patch
upstream/core-str-fixed-wrong-undo-ed-version-of-STR_ZTOV-mac.patch
upstream/jansson-use-the-core-macros-for-ending-string-value-.patch
upstream/ndb_redis-fix-return-redis_cmd-function.patch
upstream/core-add-case-functions-for-str_hash-get-and-set.patch
upstream/core-xavi-api-like-xavp-but-with-insensitive-case-na.patch
upstream/pv-define-xavi-types.patch
@ -75,8 +73,6 @@ upstream/tm-process-xavi-list-in-transaction-contexts.patch
upstream/pv-xavi-.-config-variables-implementation.patch
upstream/core-PV_IDX_NONE-to-point-that-pv-had-no-index.patch
upstream/pv-fix-for-new-PV_IDX_NONE-value.patch
upstream/sqlops-export-sql_pvquery-to-KEMI.patch
upstream/avpops-export-functions-to-KEMI.patch
## backport from kamailio trunk (5.3)
#
### relevant for upstream

@ -631,7 +631,7 @@ index 5dbf5e0..1f0d0f4 100644
#endif
diff --git a/src/modules/pua/hash.h b/src/modules/pua/hash.h
index cc73d3e..b046e6a 100644
index 454e4bb..9be6f81 100644
--- a/src/modules/pua/hash.h
+++ b/src/modules/pua/hash.h
@@ -41,6 +41,7 @@

@ -7,10 +7,10 @@ Subject: pv_trans_eval_uri
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/modules/pv/pv_trans.c b/src/modules/pv/pv_trans.c
index ea693bf..e24983a 100644
index dfc842a..81299be 100644
--- a/src/modules/pv/pv_trans.c
+++ b/src/modules/pv/pv_trans.c
@@ -1309,8 +1309,8 @@ int tr_eval_uri(struct sip_msg *msg, tr_param_t *tp, int subtype,
@@ -1310,8 +1310,8 @@ int tr_eval_uri(struct sip_msg *msg, tr_param_t *tp, int subtype,
/* parse uri -- params only when requested */
if(parse_uri(_tr_uri.s, _tr_uri.len - dlen, &_tr_parsed_uri)!=0)
{

@ -9,10 +9,10 @@ Subject: [PATCH] avpops: add avp_subst_pv()
1 file changed, 58 insertions(+)
diff --git a/src/modules/avpops/avpops.c b/src/modules/avpops/avpops.c
index 0805407..3d8f949 100644
index 6e49933..06f5f1f 100644
--- a/src/modules/avpops/avpops.c
+++ b/src/modules/avpops/avpops.c
@@ -67,6 +67,8 @@ static int fixup_pushto_avp(void** param, int param_no);
@@ -68,6 +68,8 @@ static int fixup_pushto_avp(void** param, int param_no);
static int fixup_check_avp(void** param, int param_no);
static int fixup_op_avp(void** param, int param_no);
static int fixup_subst(void** param, int param_no);
@ -21,7 +21,7 @@ index 0805407..3d8f949 100644
static int fixup_is_avp_set(void** param, int param_no);
static int w_print_avps(struct sip_msg* msg, char* foo, char *bar);
@@ -81,6 +83,7 @@ static int w_pushto_avps(struct sip_msg* msg, char* destination, char *param);
@@ -82,6 +84,7 @@ static int w_pushto_avps(struct sip_msg* msg, char* destination, char *param);
static int w_check_avps(struct sip_msg* msg, char* param, char *check);
static int w_op_avps(struct sip_msg* msg, char* param, char *op);
static int w_subst(struct sip_msg* msg, char* src, char *subst);
@ -29,7 +29,7 @@ index 0805407..3d8f949 100644
static int w_is_avp_set(struct sip_msg* msg, char* param, char *foo);
/*! \brief
@@ -111,6 +114,9 @@ static cmd_export_t cmds[] = {
@@ -112,6 +115,9 @@ static cmd_export_t cmds[] = {
REQUEST_ROUTE|FAILURE_ROUTE|BRANCH_ROUTE|ONREPLY_ROUTE|LOCAL_ROUTE},
{"avp_subst", (cmd_function)w_subst, 2, fixup_subst, 0,
REQUEST_ROUTE|FAILURE_ROUTE|BRANCH_ROUTE|ONREPLY_ROUTE|LOCAL_ROUTE},
@ -39,7 +39,7 @@ index 0805407..3d8f949 100644
{"is_avp_set", (cmd_function)w_is_avp_set, 1, fixup_is_avp_set, 0,
REQUEST_ROUTE|FAILURE_ROUTE|BRANCH_ROUTE|ONREPLY_ROUTE|LOCAL_ROUTE},
{0, 0, 0, 0, 0, 0}
@@ -708,6 +714,16 @@ static int fixup_check_avp(void** param, int param_no)
@@ -709,6 +715,16 @@ static int fixup_check_avp(void** param, int param_no)
return 0;
}
@ -56,7 +56,7 @@ index 0805407..3d8f949 100644
static int fixup_subst(void** param, int param_no)
{
struct subst_expr* se;
@@ -841,6 +857,14 @@ static int fixup_subst(void** param, int param_no)
@@ -842,6 +858,14 @@ static int fixup_subst(void** param, int param_no)
return 0;
}
@ -71,7 +71,7 @@ index 0805407..3d8f949 100644
static int fixup_op_avp(void** param, int param_no)
{
struct fis_param *ap;
@@ -1054,6 +1078,40 @@ static int w_subst(struct sip_msg* msg, char* src, char *subst)
@@ -1055,6 +1079,40 @@ static int w_subst(struct sip_msg* msg, char* src, char *subst)
return ops_subst(msg, (struct fis_param**)src, (struct subst_expr*)subst);
}

@ -1,192 +0,0 @@
From 64fa29f28a96a57a592e5d267004a3ff08a140b5 Mon Sep 17 00:00:00 2001
From: Victor Seva <linuxmaniac@torreviejawireless.org>
Date: Thu, 11 Jun 2020 10:48:29 +0200
Subject: [PATCH] avpops: export functions to KEMI
* avp_check
* avp_copy
---
src/modules/avpops/avpops.c | 162 ++++++++++++++++++++++++++++++++++++
1 file changed, 162 insertions(+)
diff --git a/src/modules/avpops/avpops.c b/src/modules/avpops/avpops.c
index 3d8f949b39..06f5f1f8fa 100644
--- a/src/modules/avpops/avpops.c
+++ b/src/modules/avpops/avpops.c
@@ -30,6 +30,7 @@
#include "../../core/mem/mem.h"
#include "../../core/parser/parse_hname2.h"
#include "../../core/sr_module.h"
+#include "../../core/kemi.h"
#include "../../core/str.h"
#include "../../core/dprint.h"
#include "../../core/error.h"
@@ -1122,3 +1123,164 @@ static int w_print_avps(struct sip_msg* msg, char* foo, char *bar)
return ops_print_avp();
}
+static int ki_check_avps(struct sip_msg* msg, str* param, str *check)
+{
+ struct fis_param *fparam, *fcheck;
+ regex_t* re = NULL;
+ int res;
+
+ if((fparam = avpops_parse_pvar(param->s)) == NULL)
+ {
+ LM_ERR("unable to get pseudo-variable in param 1\n");
+ return E_OUT_OF_MEM;
+ }
+ /* attr name is mandatory */
+ if (fparam->u.sval->type==PVT_NULL)
+ {
+ LM_ERR("null pseudo-variable in param 1\n");
+ pkg_free(fparam);
+ return E_UNSPEC;
+ }
+
+ if((fcheck = avpops_parse_pvar(check->s)) == NULL)
+ {
+ LM_ERR("failed to parse checked value \n");
+ pkg_free(fparam);
+ return E_UNSPEC;
+ }
+ /* if REGEXP op -> compile the expresion */
+ if(fcheck->ops&AVPOPS_OP_RE)
+ {
+ if( (fcheck->opd&AVPOPS_VAL_STR) != 0 )
+ {
+ if((re = (regex_t*) pkg_malloc(sizeof(regex_t))) == NULL)
+ {
+ PKG_MEM_ERROR;
+ pkg_free(fparam);
+ pkg_free(fcheck);
+ return E_OUT_OF_MEM;
+ }
+ LM_DBG("compiling regexp <%.*s>\n", fcheck->u.s.len, fcheck->u.s.s);
+ if (regcomp(re, fcheck->u.s.s,REG_EXTENDED|REG_ICASE|REG_NEWLINE))
+ {
+ LM_ERR("bad re <%.*s>\n", fcheck->u.s.len, fcheck->u.s.s);
+ pkg_free(fparam);
+ pkg_free(re);
+ pkg_free(fcheck);
+ return E_BAD_RE;
+ }
+ fcheck->u.s.s = (char*)re;
+ }
+ } else if (fcheck->ops&AVPOPS_OP_FM) {
+ if (!( fcheck->opd&AVPOPS_VAL_PVAR ||
+ (!(fcheck->opd&AVPOPS_VAL_PVAR) && fcheck->opd&AVPOPS_VAL_STR) ) )
+ {
+ LM_ERR("fast_match operation requires string value or "
+ "avp name/alias (%d/%d)\n", fcheck->opd, fcheck->ops);
+ pkg_free(fparam);
+ pkg_free(fcheck);
+ return E_UNSPEC;
+ }
+ }
+
+ res = ops_check_avp(msg, fparam, fcheck);
+ pkg_free(fparam);
+ pkg_free(fcheck);
+ if(re) pkg_free(re);
+ return res;
+}
+
+static int ki_copy_avps(struct sip_msg* msg, str *name1, str *name2)
+{
+ struct fis_param *fname1, *fname2;
+ char *p = NULL;
+ int res;
+
+ if((fname1 = avpops_parse_pvar(name1->s)) == NULL)
+ {
+ LM_ERR("unable to get pseudo-variable in param 1\n");
+ return E_OUT_OF_MEM;
+ }
+ /* attr name is mandatory */
+ if (fname1->u.sval->type != PVT_AVP)
+ {
+ LM_ERR("you must specify only AVP as parameter\n");
+ pkg_free(fname1);
+ return E_UNSPEC;
+ }
+
+ /* avp / flags */
+ if ( (p=strchr(name2->s,'/')) != 0 )
+ *(p++) = 0;
+
+ if((fname2 = avpops_parse_pvar(name2->s)) == NULL)
+ {
+ LM_ERR("unable to get pseudo-variable in param 2\n");
+ return E_OUT_OF_MEM;
+ }
+ /* attr name is mandatory */
+ if (fname2->u.sval->type != PVT_AVP)
+ {
+ LM_ERR("you must specify only AVP as parameter\n");
+ pkg_free(fname1);
+ pkg_free(fname2);
+ return E_UNSPEC;
+ }
+
+ /* flags */
+ for( ; p&&*p ; p++ )
+ {
+ switch (*p) {
+ case 'g':
+ case 'G':
+ fname2->ops|=AVPOPS_FLAG_ALL;
+ break;
+ case 'd':
+ case 'D':
+ fname2->ops|=AVPOPS_FLAG_DELETE;
+ break;
+ case 'n':
+ case 'N':
+ fname2->ops|=AVPOPS_FLAG_CASTN;
+ break;
+ case 's':
+ case 'S':
+ fname2->ops|=AVPOPS_FLAG_CASTS;
+ break;
+ default:
+ LM_ERR("bad flag <%c>\n",*p);
+ pkg_free(fname1);
+ pkg_free(fname2);
+ return E_UNSPEC;
+ }
+ }
+
+ res = ops_copy_avp( msg, fname1, fname2);
+ pkg_free(fname1);
+ pkg_free(fname2);
+ return res;
+}
+
+/**
+ *
+ */
+/* clang-format off */
+static sr_kemi_t sr_kemi_rtpengine_exports[] = {
+ { str_init("avpops"), str_init("avp_check"),
+ SR_KEMIP_INT, ki_check_avps,
+ { SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_NONE,
+ SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
+ },
+ { str_init("avpops"), str_init("avp_copy"),
+ SR_KEMIP_INT, ki_copy_avps,
+ { SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_NONE,
+ SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
+ },
+ { {0, 0}, {0, 0}, 0, NULL, { 0, 0, 0, 0, 0, 0 } }
+};
+/* clang-format on */
+
+int mod_register(char *path, int *dlflags, void *p1, void *p2) {
+ sr_kemi_modules_add(sr_kemi_rtpengine_exports);
+ return 0;
+}
\ No newline at end of file
--
2.20.1

@ -8,10 +8,10 @@ Subject: [PATCH] core: KEMI suport for ARRAY and DICT
2 files changed, 44 insertions(+), 1 deletion(-)
diff --git a/src/core/kemi.c b/src/core/kemi.c
index 7a96254..1f22969 100644
index 6a4732e..bd52f77 100644
--- a/src/core/kemi.c
+++ b/src/core/kemi.c
@@ -2373,6 +2373,34 @@ static void sr_kemi_pv_push_valx (sr_kemi_xval_t *xval, int rmode, int vi, str *
@@ -2371,6 +2371,34 @@ void sr_kemi_xval_null(sr_kemi_xval_t *xval, int rmode)
}
}

@ -30,7 +30,7 @@ index 5f71cd8..70d7179 100644
+ return &_ksr_corecb;
+}
diff --git a/src/core/events.h b/src/core/events.h
index 9c4c54a..6282e65 100644
index 239c26b..df8a313 100644
--- a/src/core/events.h
+++ b/src/core/events.h
@@ -79,4 +79,20 @@ int sr_event_enabled(int type);

@ -1,42 +0,0 @@
From: Victor Seva <vseva@sipwise.com>
Date: Wed, 22 Apr 2020 14:12:54 +0200
Subject: ndb_redis: fix return redis_cmd function
return error if command execution fails
---
src/modules/ndb_redis/redis_client.c | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/src/modules/ndb_redis/redis_client.c b/src/modules/ndb_redis/redis_client.c
index a453180..acdc978 100644
--- a/src/modules/ndb_redis/redis_client.c
+++ b/src/modules/ndb_redis/redis_client.c
@@ -953,6 +953,14 @@ int redisc_exec(str *srv, str *res, str *cmd, ...)
goto error_exec;
}
}
+
+ LM_DBG("rpl->rplRedis->type:%d\n", rpl->rplRedis->type);
+ if(rpl->rplRedis->type == REDIS_REPLY_ERROR) {
+ LM_ERR("Redis error:%.*s\n",
+ (int)rpl->rplRedis->len, rpl->rplRedis->str);
+ goto error_exec;
+ }
+
if (check_cluster_reply(rpl->rplRedis, &rsrv)) {
LM_DBG("rsrv->ctxRedis = %p\n", rsrv->ctxRedis);
if(rsrv->ctxRedis==NULL)
@@ -987,6 +995,13 @@ int redisc_exec(str *srv, str *res, str *cmd, ...)
goto error_exec;
}
}
+
+ LM_DBG("rpl->rplRedis->type:%d\n", rpl->rplRedis->type);
+ if(rpl->rplRedis->type == REDIS_REPLY_ERROR) {
+ LM_ERR("Redis error:%.*s\n",
+ (int)rpl->rplRedis->len, rpl->rplRedis->str);
+ goto error_exec;
+ }
}
cmd->s[cmd->len] = c;
rsrv->disable.consecutive_errors = 0;

@ -7,10 +7,10 @@ Subject: [PATCH] pv: add KEMI functions pvx.xavp_get_keys and pvx.xavp_getd
1 file changed, 281 insertions(+)
diff --git a/src/modules/pv/pv.c b/src/modules/pv/pv.c
index 310acf5..54bf38d 100644
index d6a11b6..c53ea16 100644
--- a/src/modules/pv/pv.c
+++ b/src/modules/pv/pv.c
@@ -1225,6 +1225,272 @@ static sr_kemi_xval_t* ki_xavp_getw(sip_msg_t *msg, str *rname)
@@ -1219,6 +1219,272 @@ static sr_kemi_xval_t* ki_xavp_getw(sip_msg_t *msg, str *rname)
return ki_xavp_get_mode(msg, rname, SR_KEMI_XVAL_NULL_PRINT);
}
@ -283,7 +283,7 @@ index 310acf5..54bf38d 100644
/**
*
*/
@@ -1696,6 +1962,21 @@ static sr_kemi_t sr_kemi_pvx_exports[] = {
@@ -1690,6 +1956,21 @@ static sr_kemi_t sr_kemi_pvx_exports[] = {
{ SR_KEMIP_STR, SR_KEMIP_NONE, SR_KEMIP_NONE,
SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
},

@ -7,7 +7,7 @@ Subject: [PATCH] pv: fix for new PV_IDX_NONE value
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/modules/pv/pv_core.c b/src/modules/pv/pv_core.c
index 9087fe0..1e2eb91 100644
index d4ae29b..ca863b4 100644
--- a/src/modules/pv/pv_core.c
+++ b/src/modules/pv/pv_core.c
@@ -1791,7 +1791,7 @@ int pv_get_avp(struct sip_msg *msg, pv_param_t *param, pv_value_t *res)

@ -7,10 +7,10 @@ Subject: [PATCH] pv: fixes for KEMI pvx.xavp_getd
1 file changed, 5 insertions(+), 5 deletions(-)
diff --git a/src/modules/pv/pv.c b/src/modules/pv/pv.c
index 54bf38d..2bbc77b 100644
index c53ea16..b427667 100644
--- a/src/modules/pv/pv.c
+++ b/src/modules/pv/pv.c
@@ -1229,7 +1229,7 @@ sr_kemi_dict_item_t* ki_xavp_dict(sr_xavp_t *xavp);
@@ -1223,7 +1223,7 @@ sr_kemi_dict_item_t* ki_xavp_dict(sr_xavp_t *xavp);
/**
* SR_KEMIP_ARRAY with values of xavp=>name
*/
@ -19,7 +19,7 @@ index 54bf38d..2bbc77b 100644
{
sr_kemi_dict_item_t *ini = NULL;
sr_kemi_dict_item_t *val;
@@ -1243,7 +1243,7 @@ sr_kemi_dict_item_t* ki_xavp_dict_name(sr_xavp_t *xavp, str name)
@@ -1237,7 +1237,7 @@ sr_kemi_dict_item_t* ki_xavp_dict_name(sr_xavp_t *xavp, str name)
}
memset(ini, 0, sizeof(sr_kemi_xval_t));
ini->vtype = SR_KEMIP_ARRAY;
@ -28,7 +28,7 @@ index 54bf38d..2bbc77b 100644
{
avp = avp->next;
}
@@ -1294,8 +1294,8 @@ sr_kemi_dict_item_t* ki_xavp_dict_name(sr_xavp_t *xavp, str name)
@@ -1288,8 +1288,8 @@ sr_kemi_dict_item_t* ki_xavp_dict_name(sr_xavp_t *xavp, str name)
last->next = val;
} else {
ini->v.dict = val;
@ -38,7 +38,7 @@ index 54bf38d..2bbc77b 100644
avp = xavp_get_next(avp);
}
return ini;
@@ -1335,13 +1335,13 @@ sr_kemi_dict_item_t* ki_xavp_dict(sr_xavp_t *xavp) {
@@ -1329,13 +1329,13 @@ sr_kemi_dict_item_t* ki_xavp_dict(sr_xavp_t *xavp) {
val->vtype = SR_KEMIP_DICT;
val->name.s = keys->s.s;
val->name.len = keys->s.len;

@ -10,7 +10,7 @@ same as $xavp but case insensitive for keys
3 files changed, 891 insertions(+), 71 deletions(-)
diff --git a/src/modules/pv/pv.c b/src/modules/pv/pv.c
index 2bbc77b..a92ea5a 100644
index b427667..be79f61 100644
--- a/src/modules/pv/pv.c
+++ b/src/modules/pv/pv.c
@@ -31,6 +31,7 @@
@ -31,7 +31,7 @@ index 2bbc77b..a92ea5a 100644
{{"avp", (sizeof("avp")-1)}, PVT_AVP, pv_get_avp, pv_set_avp,
pv_parse_avp_name, pv_parse_index, 0, 0},
{{"hdr", (sizeof("hdr")-1)}, PVT_HDR, pv_get_hdr, 0, pv_parse_hdr_name,
@@ -549,6 +553,13 @@ static int w_sbranch_reset(sip_msg_t *msg, char p1, char *p2);
@@ -543,6 +547,13 @@ static int w_sbranch_reset(sip_msg_t *msg, char p1, char *p2);
static int w_var_to_xavp(sip_msg_t *msg, char *p1, char *p2);
static int w_xavp_to_var(sip_msg_t *msg, char *p1);
@ -45,7 +45,7 @@ index 2bbc77b..a92ea5a 100644
int pv_evalx_fixup(void** param, int param_no);
int w_pv_evalx(struct sip_msg *msg, char *dst, str *fmt);
@@ -565,6 +576,8 @@ static cmd_export_t cmds[]={
@@ -559,6 +570,8 @@ static cmd_export_t cmds[]={
ANY_ROUTE },
{"pv_xavp_print", (cmd_function)pv_xavp_print, 0, 0, 0,
ANY_ROUTE },
@ -54,7 +54,7 @@ index 2bbc77b..a92ea5a 100644
{"pv_var_to_xavp", (cmd_function)w_var_to_xavp, 2, fixup_spve_spve,
fixup_free_spve_spve, ANY_ROUTE },
{"pv_xavp_to_var", (cmd_function)w_xavp_to_var, 1, fixup_spve_null,
@@ -595,6 +608,18 @@ static cmd_export_t cmds[]={
@@ -589,6 +602,18 @@ static cmd_export_t cmds[]={
{"xavp_child_rm", (cmd_function)w_xavp_child_rm,
2, fixup_spve_spve, fixup_free_spve_spve,
ANY_ROUTE},
@ -73,7 +73,7 @@ index 2bbc77b..a92ea5a 100644
{"sbranch_set_ruri", (cmd_function)w_sbranch_set_ruri, 0, 0, 0,
ANY_ROUTE },
{"sbranch_append", (cmd_function)w_sbranch_append, 0, 0, 0,
@@ -811,6 +836,12 @@ static int ki_xavp_print(sip_msg_t* msg)
@@ -805,6 +830,12 @@ static int ki_xavp_print(sip_msg_t* msg)
return 1;
}
@ -86,7 +86,7 @@ index 2bbc77b..a92ea5a 100644
/**
*
*/
@@ -905,7 +936,7 @@ static int w_xavp_params_implode(sip_msg_t *msg, char *pxname, char *pvname)
@@ -899,7 +930,7 @@ static int w_xavp_params_implode(sip_msg_t *msg, char *pxname, char *pvname)
/**
*
*/
@ -95,7 +95,7 @@ index 2bbc77b..a92ea5a 100644
{
sr_xavp_t *xavp = NULL;
sr_xval_t xval;
@@ -914,15 +945,28 @@ static int ki_xavp_seti(sip_msg_t *msg, str *rname, int ival)
@@ -908,15 +939,28 @@ static int ki_xavp_seti(sip_msg_t *msg, str *rname, int ival)
xval.type = SR_XTYPE_INT;
xval.v.i = ival;
@ -127,7 +127,7 @@ index 2bbc77b..a92ea5a 100644
{
sr_xavp_t *xavp = NULL;
sr_xval_t xval;
@@ -931,29 +975,56 @@ static int ki_xavp_sets(sip_msg_t *msg, str *rname, str *sval)
@@ -925,29 +969,56 @@ static int ki_xavp_sets(sip_msg_t *msg, str *rname, str *sval)
xval.type = SR_XTYPE_STR;
xval.v.s = *sval;
@ -192,7 +192,7 @@ index 2bbc77b..a92ea5a 100644
{
str rname = STR_NULL;
str cname = STR_NULL;
@@ -972,27 +1043,53 @@ static int w_xavp_child_seti(sip_msg_t *msg, char *prname, char *pcname,
@@ -966,27 +1037,53 @@ static int w_xavp_child_seti(sip_msg_t *msg, char *prname, char *pcname,
return -1;
}
@ -253,7 +253,7 @@ index 2bbc77b..a92ea5a 100644
{
str rname;
str cname;
@@ -1011,7 +1108,17 @@ static int w_xavp_child_sets(sip_msg_t *msg, char *prname, char *pcname,
@@ -1005,7 +1102,17 @@ static int w_xavp_child_sets(sip_msg_t *msg, char *prname, char *pcname,
return -1;
}
@ -272,7 +272,7 @@ index 2bbc77b..a92ea5a 100644
}
/**
@@ -1042,19 +1149,32 @@ static int fixup_free_xavp_child_seti(void** param, int param_no)
@@ -1036,19 +1143,32 @@ static int fixup_free_xavp_child_seti(void** param, int param_no)
/**
*
*/
@ -309,7 +309,7 @@ index 2bbc77b..a92ea5a 100644
{
str rname;
@@ -1063,25 +1183,45 @@ static int w_xavp_rm(sip_msg_t *msg, char *prname, char *p2)
@@ -1057,25 +1177,45 @@ static int w_xavp_rm(sip_msg_t *msg, char *prname, char *p2)
return -1;
}
@ -360,7 +360,7 @@ index 2bbc77b..a92ea5a 100644
{
str rname;
str cname;
@@ -1095,17 +1235,28 @@ static int w_xavp_child_rm(sip_msg_t *msg, char *prname, char *pcname)
@@ -1089,17 +1229,28 @@ static int w_xavp_child_rm(sip_msg_t *msg, char *prname, char *pcname)
return -1;
}
@ -393,7 +393,7 @@ index 2bbc77b..a92ea5a 100644
if(xavp==NULL) {
return 1;
}
@@ -1115,6 +1266,13 @@ static int ki_xavp_is_null(sip_msg_t *msg, str *rname)
@@ -1109,6 +1260,13 @@ static int ki_xavp_is_null(sip_msg_t *msg, str *rname)
return -1;
}
@ -407,7 +407,7 @@ index 2bbc77b..a92ea5a 100644
/**
*
*/
@@ -1186,13 +1344,17 @@ static sr_kemi_xval_t* ki_xavp_get_xval(sr_xavp_t *xavp, int rmode)
@@ -1180,13 +1338,17 @@ static sr_kemi_xval_t* ki_xavp_get_xval(sr_xavp_t *xavp, int rmode)
/**
*
*/
@ -428,7 +428,7 @@ index 2bbc77b..a92ea5a 100644
if(xavp==NULL) {
sr_kemi_xval_null(&_sr_kemi_pv_xval, rmode);
return &_sr_kemi_pv_xval;
@@ -1206,7 +1368,15 @@ static sr_kemi_xval_t* ki_xavp_get_mode(sip_msg_t *msg, str *rname, int rmode)
@@ -1200,7 +1362,15 @@ static sr_kemi_xval_t* ki_xavp_get_mode(sip_msg_t *msg, str *rname, int rmode)
*/
static sr_kemi_xval_t* ki_xavp_get(sip_msg_t *msg, str *rname)
{
@ -445,7 +445,7 @@ index 2bbc77b..a92ea5a 100644
}
/**
@@ -1214,7 +1384,15 @@ static sr_kemi_xval_t* ki_xavp_get(sip_msg_t *msg, str *rname)
@@ -1208,7 +1378,15 @@ static sr_kemi_xval_t* ki_xavp_get(sip_msg_t *msg, str *rname)
*/
static sr_kemi_xval_t* ki_xavp_gete(sip_msg_t *msg, str *rname)
{
@ -462,7 +462,7 @@ index 2bbc77b..a92ea5a 100644
}
/**
@@ -1222,14 +1400,22 @@ static sr_kemi_xval_t* ki_xavp_gete(sip_msg_t *msg, str *rname)
@@ -1216,14 +1394,22 @@ static sr_kemi_xval_t* ki_xavp_gete(sip_msg_t *msg, str *rname)
*/
static sr_kemi_xval_t* ki_xavp_getw(sip_msg_t *msg, str *rname)
{
@ -488,7 +488,7 @@ index 2bbc77b..a92ea5a 100644
{
sr_kemi_dict_item_t *ini = NULL;
sr_kemi_dict_item_t *val;
@@ -1243,11 +1429,17 @@ sr_kemi_dict_item_t* ki_xavp_dict_name(sr_xavp_t *xavp, str *name)
@@ -1237,11 +1423,17 @@ sr_kemi_dict_item_t* ki_xavp_dict_name(sr_xavp_t *xavp, str *name)
}
memset(ini, 0, sizeof(sr_kemi_xval_t));
ini->vtype = SR_KEMIP_ARRAY;
@ -510,7 +510,7 @@ index 2bbc77b..a92ea5a 100644
while(avp!=NULL){
switch(avp->val.type) {
case SR_XTYPE_XAVP:
@@ -1282,7 +1474,7 @@ sr_kemi_dict_item_t* ki_xavp_dict_name(sr_xavp_t *xavp, str *name)
@@ -1276,7 +1468,7 @@ sr_kemi_dict_item_t* ki_xavp_dict_name(sr_xavp_t *xavp, str *name)
LM_WARN("XAVP type:%d value not supported\n", avp->val.type);
break;
case SR_XTYPE_XAVP:
@ -519,7 +519,7 @@ index 2bbc77b..a92ea5a 100644
break;
default:
val->vtype = SR_KEMIP_NULL;
@@ -1296,7 +1488,11 @@ sr_kemi_dict_item_t* ki_xavp_dict_name(sr_xavp_t *xavp, str *name)
@@ -1290,7 +1482,11 @@ sr_kemi_dict_item_t* ki_xavp_dict_name(sr_xavp_t *xavp, str *name)
ini->v.dict = val;
}
last = val;
@ -532,7 +532,7 @@ index 2bbc77b..a92ea5a 100644
}
return ini;
error:
@@ -1311,7 +1507,7 @@ error:
@@ -1305,7 +1501,7 @@ error:
/**
* SR_KEMIP_DICT of xavp
*/
@ -541,7 +541,7 @@ index 2bbc77b..a92ea5a 100644
sr_xavp_t *avp = NULL;
struct str_list *keys;
struct str_list *k;
@@ -1324,7 +1520,12 @@ sr_kemi_dict_item_t* ki_xavp_dict(sr_xavp_t *xavp) {
@@ -1318,7 +1514,12 @@ sr_kemi_dict_item_t* ki_xavp_dict(sr_xavp_t *xavp) {
return NULL;
}
avp = xavp->val.v.xavp;
@ -555,7 +555,7 @@ index 2bbc77b..a92ea5a 100644
do {
val = (sr_kemi_dict_item_t*)pkg_malloc(sizeof(sr_kemi_dict_item_t));
if(val==NULL) {
@@ -1335,7 +1536,7 @@ sr_kemi_dict_item_t* ki_xavp_dict(sr_xavp_t *xavp) {
@@ -1329,7 +1530,7 @@ sr_kemi_dict_item_t* ki_xavp_dict(sr_xavp_t *xavp) {
val->vtype = SR_KEMIP_DICT;
val->name.s = keys->s.s;
val->name.len = keys->s.len;
@ -564,7 +564,7 @@ index 2bbc77b..a92ea5a 100644
if(last) {
last->next = val;
} else {
@@ -1366,7 +1567,7 @@ error:
@@ -1360,7 +1561,7 @@ error:
*
*/
static sr_kemi_xval_t*
@ -573,7 +573,7 @@ index 2bbc77b..a92ea5a 100644
{
sr_xavp_t *xavp=NULL;
int xavp_size = 0;
@@ -1383,7 +1584,11 @@ ki_xavp_getd_helper(sip_msg_t *msg, str *rname, int *_indx)
@@ -1377,7 +1578,11 @@ ki_xavp_getd_helper(sip_msg_t *msg, str *rname, int *_indx)
/* we're going to retrive all */
_sr_kemi_pv_xval.vtype = SR_KEMIP_ARRAY;
}
@ -586,7 +586,7 @@ index 2bbc77b..a92ea5a 100644
if(indx<0)
{
if((indx*-1)>xavp_size)
@@ -1394,13 +1599,17 @@ ki_xavp_getd_helper(sip_msg_t *msg, str *rname, int *_indx)
@@ -1388,13 +1593,17 @@ ki_xavp_getd_helper(sip_msg_t *msg, str *rname, int *_indx)
indx = xavp_size + indx;
}
@ -606,7 +606,7 @@ index 2bbc77b..a92ea5a 100644
if(last) {
last->next = val;
} else {
@@ -1411,7 +1620,11 @@ ki_xavp_getd_helper(sip_msg_t *msg, str *rname, int *_indx)
@@ -1405,7 +1614,11 @@ ki_xavp_getd_helper(sip_msg_t *msg, str *rname, int *_indx)
xavp = NULL;
} else {
indx = indx + 1;
@ -619,7 +619,7 @@ index 2bbc77b..a92ea5a 100644
}
} while(xavp!=NULL);
return &_sr_kemi_pv_xval;
@@ -1423,7 +1636,15 @@ ki_xavp_getd_helper(sip_msg_t *msg, str *rname, int *_indx)
@@ -1417,7 +1630,15 @@ ki_xavp_getd_helper(sip_msg_t *msg, str *rname, int *_indx)
static sr_kemi_xval_t*
ki_xavp_getd(sip_msg_t *msg, str *rname)
{
@ -636,7 +636,7 @@ index 2bbc77b..a92ea5a 100644
}
/**
@@ -1432,14 +1653,23 @@ ki_xavp_getd(sip_msg_t *msg, str *rname)
@@ -1426,14 +1647,23 @@ ki_xavp_getd(sip_msg_t *msg, str *rname)
static sr_kemi_xval_t*
ki_xavp_getd_p1(sip_msg_t *msg, str *rname, int indx)
{
@ -662,7 +662,7 @@ index 2bbc77b..a92ea5a 100644
sr_xavp_t *xavp=NULL;
struct str_list *keys, *k;
sr_kemi_dict_item_t *val;
@@ -1447,12 +1677,20 @@ ki_xavp_get_keys(sip_msg_t *msg, str *rname, int indx) {
@@ -1441,12 +1671,20 @@ ki_xavp_get_keys(sip_msg_t *msg, str *rname, int indx) {
memset(&_sr_kemi_pv_xval, 0, sizeof(sr_kemi_xval_t));
@ -685,7 +685,7 @@ index 2bbc77b..a92ea5a 100644
_sr_kemi_pv_xval.vtype = SR_KEMIP_ARRAY;
while(keys!=NULL){
k = keys;
@@ -1494,18 +1732,41 @@ error:
@@ -1488,18 +1726,41 @@ error:
/**
*
*/
@ -731,7 +731,7 @@ index 2bbc77b..a92ea5a 100644
if(xavp==NULL) {
return 1;
}
@@ -1518,14 +1779,34 @@ static int ki_xavp_child_is_null(sip_msg_t *msg, str *rname, str *cname)
@@ -1512,14 +1773,34 @@ static int ki_xavp_child_is_null(sip_msg_t *msg, str *rname, str *cname)
/**
*
*/
@ -769,7 +769,7 @@ index 2bbc77b..a92ea5a 100644
if(xavp==NULL) {
sr_kemi_xval_null(&_sr_kemi_pv_xval, rmode);
return &_sr_kemi_pv_xval;
@@ -1536,7 +1817,11 @@ static sr_kemi_xval_t* ki_xavp_child_get_mode(sip_msg_t *msg, str *rname,
@@ -1530,7 +1811,11 @@ static sr_kemi_xval_t* ki_xavp_child_get_mode(sip_msg_t *msg, str *rname,
return &_sr_kemi_pv_xval;
}
@ -782,7 +782,7 @@ index 2bbc77b..a92ea5a 100644
if(xavp==NULL) {
sr_kemi_xval_null(&_sr_kemi_pv_xval, rmode);
return &_sr_kemi_pv_xval;
@@ -1550,25 +1835,47 @@ static sr_kemi_xval_t* ki_xavp_child_get_mode(sip_msg_t *msg, str *rname,
@@ -1544,25 +1829,47 @@ static sr_kemi_xval_t* ki_xavp_child_get_mode(sip_msg_t *msg, str *rname,
*/
static sr_kemi_xval_t* ki_xavp_child_get(sip_msg_t *msg, str *rname, str *cname)
{
@ -833,7 +833,7 @@ index 2bbc77b..a92ea5a 100644
}
/**
@@ -1927,6 +2234,11 @@ static sr_kemi_t sr_kemi_pvx_exports[] = {
@@ -1921,6 +2228,11 @@ static sr_kemi_t sr_kemi_pvx_exports[] = {
{ SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE,
SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
},
@ -845,7 +845,7 @@ index 2bbc77b..a92ea5a 100644
{ str_init("pvx"), str_init("xavp_params_explode"),
SR_KEMIP_INT, ki_xavp_params_explode,
{ SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_NONE,
@@ -2022,6 +2334,91 @@ static sr_kemi_t sr_kemi_pvx_exports[] = {
@@ -2016,6 +2328,91 @@ static sr_kemi_t sr_kemi_pvx_exports[] = {
{ SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_NONE,
SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
},

@ -7,7 +7,7 @@ Subject: [PATCH] rtpengine: add `flags` field for every command
1 file changed, 2 insertions(+), 6 deletions(-)
diff --git a/src/modules/rtpengine/rtpengine.c b/src/modules/rtpengine/rtpengine.c
index 7be7968..d56e88e 100644
index 60d505c..2d28895 100644
--- a/src/modules/rtpengine/rtpengine.c
+++ b/src/modules/rtpengine/rtpengine.c
@@ -2401,8 +2401,9 @@ static bencode_item_t *rtpp_function_call(bencode_buffer_t *bencbuf, struct sip_

@ -8,7 +8,7 @@ Subject: [PATCH] rtpengine: add play_dtmf() command
2 files changed, 12 insertions(+)
diff --git a/src/modules/rtpengine/rtpengine.c b/src/modules/rtpengine/rtpengine.c
index 8f3c28a..2e09c15 100644
index 8b72e5b..dba5e62 100644
--- a/src/modules/rtpengine/rtpengine.c
+++ b/src/modules/rtpengine/rtpengine.c
@@ -138,6 +138,7 @@ static const char *command_strings[] = {
@ -37,7 +37,7 @@ index 8f3c28a..2e09c15 100644
{"rtpengine_offer", (cmd_function)rtpengine_offer1_f, 0,
0, 0,
ANY_ROUTE},
@@ -3844,6 +3849,12 @@ stop_media_f(struct sip_msg* msg, char *str1, char *str2)
@@ -3845,6 +3850,12 @@ stop_media_f(struct sip_msg* msg, char *str1, char *str2)
return rtpengine_generic_f(msg, str1, OP_STOP_MEDIA);
}

@ -7,7 +7,7 @@ Subject: [PATCH] rtpengine: add support for new T.38 options
1 file changed, 8 insertions(+)
diff --git a/src/modules/rtpengine/rtpengine.c b/src/modules/rtpengine/rtpengine.c
index 6d821ae..7be7968 100644
index edd5899..60d505c 100644
--- a/src/modules/rtpengine/rtpengine.c
+++ b/src/modules/rtpengine/rtpengine.c
@@ -118,6 +118,7 @@ enum {

@ -27,7 +27,7 @@ index cafd6b6..9e31a7d 100644
on the &rtp; proxy. When sending a subsequent <quote>delete</quote> command to
the &rtp; proxy, you can then stop just the session for a specific branch when
diff --git a/src/modules/rtpengine/rtpengine.c b/src/modules/rtpengine/rtpengine.c
index 2e09c15..6d821ae 100644
index dba5e62..edd5899 100644
--- a/src/modules/rtpengine/rtpengine.c
+++ b/src/modules/rtpengine/rtpengine.c
@@ -2268,6 +2268,10 @@ static int parse_flags(struct ng_flags_parse *ng_flags, struct sip_msg *msg, enu

File diff suppressed because it is too large Load Diff

@ -1,85 +0,0 @@
From: Victor Seva <linuxmaniac@torreviejawireless.org>
Date: Tue, 9 Jun 2020 12:02:43 +0200
Subject: sqlops: export sql_pvquery to KEMI
---
src/modules/sqlops/sqlops.c | 59 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 59 insertions(+)
diff --git a/src/modules/sqlops/sqlops.c b/src/modules/sqlops/sqlops.c
index 3943b1b..8727551 100644
--- a/src/modules/sqlops/sqlops.c
+++ b/src/modules/sqlops/sqlops.c
@@ -492,6 +492,60 @@ static int ki_sqlops_query(sip_msg_t *msg, str *scon, str *squery, str *sres)
return sqlops_do_query(scon, squery, sres);
}
+static int ki_sqlops_pvquery(sip_msg_t *msg, str *scon, str *squery, str *sres)
+{
+ pv_elem_t *query = NULL;
+ pvname_list_t *pv_res = NULL;
+ pvname_list_t *pvl = NULL;
+ sql_con_t *con = NULL;
+ int i, res;
+
+ if (scon == NULL || scon->s == NULL || scon->len<=0) {
+ LM_ERR("invalid connection name\n");
+ return -1;
+ }
+
+ con = sql_get_connection(scon);
+ if(con==NULL) {
+ LM_ERR("invalid connection [%.*s]\n", scon->len, scon->s);
+ return -1;
+ }
+
+ if(pv_parse_format(squery, &query)<0)
+ {
+ LM_ERR("invalid query string [%s]\n", squery->s);
+ return -1;
+ }
+
+ /* parse result variables into list of pv_spec_t's */
+ pv_res = parse_pvname_list(sres, 0);
+ if(pv_res==NULL)
+ {
+ LM_ERR("invalid result parameter [%s]\n", sres->s);
+ pv_elem_free_all(query);
+ return -1;
+ }
+ /* check if all result variables are writable */
+ pvl = pv_res;
+ i = 1;
+ while (pvl) {
+ if (pvl->sname.setf == NULL)
+ {
+ LM_ERR("result variable [%d] is read-only\n", i);
+ pv_elem_free_all(query);
+ free_pvname_list(pv_res);
+ return -1;
+ }
+ i++;
+ pvl = pvl->next;
+ }
+ res = sql_do_pvquery(msg, con, query, pv_res);
+
+ pv_elem_free_all(query);
+ free_pvname_list(pv_res);
+ return res;
+}
+
static int ki_sqlops_query_async(sip_msg_t *msg, str *scon, str *squery)
{
sql_con_t *con = NULL;
@@ -561,6 +615,11 @@ static sr_kemi_t sr_kemi_sqlops_exports[] = {
{ SR_KEMIP_STR, SR_KEMIP_INT, SR_KEMIP_INT,
SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
},
+ { str_init("sqlops"), str_init("sql_pvquery"),
+ SR_KEMIP_INT, ki_sqlops_pvquery,
+ { SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_STR,
+ SR_KEMIP_NONE, SR_KEMIP_NONE, SR_KEMIP_NONE }
+ },
{ str_init("sqlops"), str_init("sql_xquery"),
SR_KEMIP_INT, sqlops_do_xquery,
{ SR_KEMIP_STR, SR_KEMIP_STR, SR_KEMIP_STR,

@ -151,10 +151,10 @@ index e0d4423..2decc79 100644
diff --git a/src/modules/tm/t_reply.c b/src/modules/tm/t_reply.c
index 77747d3..f26d42b 100644
index c868e70..c09e168 100644
--- a/src/modules/tm/t_reply.c
+++ b/src/modules/tm/t_reply.c
@@ -691,6 +691,7 @@ typedef struct tm_faked_env {
@@ -695,6 +695,7 @@ typedef struct tm_faked_env {
avp_list_t* backup_uri_from;
avp_list_t* backup_uri_to;
sr_xavp_t **backup_xavps;
@ -162,7 +162,7 @@ index 77747d3..f26d42b 100644
struct socket_info* backup_si;
struct lump *backup_add_rm;
struct lump *backup_body_lumps;
@@ -780,6 +781,8 @@ int faked_env(struct cell *t, struct sip_msg *msg, int is_async_env)
@@ -784,6 +785,8 @@ int faked_env(struct cell *t, struct sip_msg *msg, int is_async_env)
&t->domain_avps_to);
_tm_faked_env[_tm_faked_env_idx].backup_xavps
= xavp_set_list(&t->xavps_list);
@ -171,7 +171,7 @@ index 77747d3..f26d42b 100644
/* set default send address to the saved value */
_tm_faked_env[_tm_faked_env_idx].backup_si = bind_address;
bind_address = t->uac[0].request.dst.send_sock;
@@ -815,6 +818,7 @@ int faked_env(struct cell *t, struct sip_msg *msg, int is_async_env)
@@ -819,6 +822,7 @@ int faked_env(struct cell *t, struct sip_msg *msg, int is_async_env)
set_avp_list(AVP_TRACK_TO | AVP_CLASS_URI,
_tm_faked_env[_tm_faked_env_idx].backup_uri_to);
xavp_set_list(_tm_faked_env[_tm_faked_env_idx].backup_xavps);
@ -179,7 +179,7 @@ index 77747d3..f26d42b 100644
bind_address = _tm_faked_env[_tm_faked_env_idx].backup_si;
/* restore lump lists */
t->uas.request->add_rm
@@ -2203,6 +2207,7 @@ int reply_received( struct sip_msg *p_msg )
@@ -2211,6 +2215,7 @@ int reply_received( struct sip_msg *p_msg )
avp_list_t* backup_domain_from, *backup_domain_to;
avp_list_t* backup_uri_from, *backup_uri_to;
sr_xavp_t **backup_xavps;
@ -187,7 +187,7 @@ index 77747d3..f26d42b 100644
int replies_locked = 0;
#ifdef USE_DNS_FAILOVER
int branch_ret;
@@ -2392,6 +2397,7 @@ int reply_received( struct sip_msg *p_msg )
@@ -2400,6 +2405,7 @@ int reply_received( struct sip_msg *p_msg )
backup_domain_to = set_avp_list(AVP_TRACK_TO | AVP_CLASS_DOMAIN,
&t->domain_avps_to );
backup_xavps = xavp_set_list(&t->xavps_list);
@ -195,7 +195,7 @@ index 77747d3..f26d42b 100644
setbflagsval(0, uac->branch_flags);
if(msg_status>last_uac_status) {
/* current response (msg) status is higher that the last received
@@ -2436,6 +2442,7 @@ int reply_received( struct sip_msg *p_msg )
@@ -2444,6 +2450,7 @@ int reply_received( struct sip_msg *p_msg )
set_avp_list( AVP_TRACK_FROM | AVP_CLASS_DOMAIN, backup_domain_from );
set_avp_list( AVP_TRACK_TO | AVP_CLASS_DOMAIN, backup_domain_to );
xavp_set_list(backup_xavps);

Loading…
Cancel
Save