From 90a72682fd1f4538d80192b565dedc4c5c17e16e Mon Sep 17 00:00:00 2001 From: Marco Capetta Date: Thu, 4 Oct 2018 09:53:08 +0200 Subject: [PATCH] TT#44855 [WIP] Fix ERROR messages in cfgt module Change-Id: Ie424455817588bc9c26ced708956bdee001dd6db --- debian/patches/series | 1 + .../sipwise/fix_error_in_cfgt_module.patch | 208 ++++++++++++++++++ 2 files changed, 209 insertions(+) create mode 100644 debian/patches/sipwise/fix_error_in_cfgt_module.patch diff --git a/debian/patches/series b/debian/patches/series index 886b92d94..4ebc23d5a 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -51,3 +51,4 @@ sipwise/tt37692.patch sipwise/dtmf-blocking.patch sipwise/media-blocking.patch sipwise/fix_db_redis_reconnect.patch +sipwise/fix_error_in_cfgt_module.patch diff --git a/debian/patches/sipwise/fix_error_in_cfgt_module.patch b/debian/patches/sipwise/fix_error_in_cfgt_module.patch new file mode 100644 index 000000000..f45899e0c --- /dev/null +++ b/debian/patches/sipwise/fix_error_in_cfgt_module.patch @@ -0,0 +1,208 @@ +--- a/src/modules/cfgt/cfgt_int.c ++++ b/src/modules/cfgt/cfgt_int.c +@@ -29,6 +29,11 @@ + #include "../../core/pvar.h" + #include "../../core/rpc.h" + #include "../../core/rpc_lookup.h" ++#include "../../core/parser/msg_parser.h" ++#include "../../core/parser/parse_uri.h" ++#include "../../core/parser/parse_to.h" ++#include "../../core/parser/parse_from.h" ++#include "../../core/parser/parse_cseq.h" + + #include "cfgt_int.h" + #include "cfgt_json.h" +@@ -40,6 +45,7 @@ cfgt_hash_p _cfgt_uuid = NULL; + str cfgt_hdr_prefix = {"NGCP%", 5}; + str cfgt_basedir = {"/tmp", 4}; + int cfgt_mask = CFGT_DP_ALL; ++int not_sip = 0; + + static int shm_str_hash_alloc(struct str_hash_table *ht, int size) + { +@@ -187,7 +193,7 @@ int _cfgt_get_hdr_helper(struct sip_msg + return STR_EQ(tmp, *res); + } + } +- return 1; /* not found */ ++ return 2; /* not found */ + } + + int _cfgt_get_hdr(struct sip_msg *msg, str *res) +@@ -401,15 +407,21 @@ int _cfgt_set_dump(struct sip_msg *msg, + + if(node == NULL || flow == NULL) + return -1; ++ + vars = srjson_CreateObject(&node->jdoc); + if(vars == NULL) { + LM_ERR("cannot create json object\n"); + return -1; + } ++ ++ /* TODO: during cfgt_get_json some errors are generated due to missing ++ values in some routes. Skip the function when node->route->s.s equals ++ 'dialog:failed' partially solve the issue */ + if(cfgt_get_json(msg, 30, &node->jdoc, vars) < 0) { + LM_ERR("cannot get var info\n"); + return -1; + } ++ + f = srjson_CreateObject(&node->jdoc); + if(f == NULL) { + LM_ERR("cannot create json object\n"); +@@ -552,6 +564,31 @@ int _cfgt_node_get_flowname(cfgt_str_lis + return 0; + } + ++int _cfgt_parse_msg(sip_msg_t *msg) ++{ ++ if (parse_msg(msg->buf, msg->len, msg)!=0) { ++ LM_ERR("outbuf buffer parsing failed!"); ++ return 1; ++ } ++ ++ if(msg->first_line.type==SIP_REQUEST) { ++ if(!IS_SIP(msg)) { ++ LM_DBG("non sip request message\n"); ++ return 1; ++ } ++ } else if(msg->first_line.type==SIP_REPLY) { ++ if(!IS_SIP_REPLY(msg)) { ++ LM_DBG("non sip reply message\n"); ++ return 1; ++ } ++ } else { ++ LM_DBG("non sip message\n"); ++ return 1; ++ } ++ ++ return 0; ++} ++ + int cfgt_process_route(struct sip_msg *msg, struct action *a) + { + str routename; +@@ -567,6 +604,10 @@ int cfgt_process_route(struct sip_msg *m + return 0; + } + LM_DBG("route from action:[%s]\n", a->rname); ++ if(not_sip) { ++ LM_DBG("not_sip flag set, not a SIP message, skip it\n"); ++ return 0; ++ } + routename.s = a->rname; + routename.len = strlen(a->rname); + switch(_cfgt_add_routename(_cfgt_node, a, &routename)) { +@@ -612,22 +653,33 @@ int cfgt_process_route(struct sip_msg *m + + /* + TODO: +-- parse first line, check if is SIP + - parse for header cfgtest + */ + int cfgt_msgin(sr_event_param_t *evp) + { + srjson_t *jobj; ++ sip_msg_t msg; + str *buf = (str *)evp->data; ++ + if(buf == NULL) + return 0; ++ LM_DBG("msg in:{%.*s}\n", buf->len, buf->s); ++ ++ // Check if it is a SIP message ++ memset(&msg, 0, sizeof(sip_msg_t)); ++ msg.buf = buf->s; ++ msg.len = buf->len; ++ if(_cfgt_parse_msg(&msg)!=0) { ++ LM_DBG("set 'not_sip' flag\n"); ++ not_sip = 1; ++ } ++ + if(_cfgt_node) { + cfgt_save_node(_cfgt_node); + _cfgt_remove_node(_cfgt_node); + LM_DBG("node removed\n"); + _cfgt_node = NULL; + } +- LM_DBG("msg in:{%.*s}\n", buf->len, buf->s); + _cfgt_node = cfgt_create_node(NULL); + if(_cfgt_node) { + jobj = srjson_CreateStr(&_cfgt_node->jdoc, buf->s, buf->len); +@@ -645,14 +697,23 @@ int cfgt_msgin(sr_event_param_t *evp) + int cfgt_pre(struct sip_msg *msg, unsigned int flags, void *bar) + { + str unknown = {"unknown", 7}; ++ int get_hdr_result = 0; + + if(_cfgt_node) { + if(_cfgt_node->msgid == 0) { + LM_DBG("new node\n"); +- if(_cfgt_get_hdr(msg, &_cfgt_node->uuid) != 0 +- || _cfgt_node->uuid.len == 0) { +- LM_ERR("cannot get value of cfgtest uuid header." +- " Using unknown\n"); ++ get_hdr_result = _cfgt_get_hdr(msg, &_cfgt_node->uuid); ++ if(get_hdr_result != 0 || _cfgt_node->uuid.len == 0) { ++ if(not_sip) { ++ LM_DBG("not_sip flag set, not a SIP message." ++ " Using 'unknown' uuid\n"); ++ } else if(get_hdr_result == 2) { ++ LM_DBG("message not related to the cfgtest scenario." ++ " Using 'unknown' uuid\n"); ++ } else { ++ LM_ERR("cannot get value of cfgtest uuid header." ++ " Using 'unknown' uuid\n"); ++ } + pkg_str_dup(&_cfgt_node->uuid, &unknown); + } + return _cfgt_get_uuid_id(_cfgt_node); +@@ -682,7 +743,9 @@ int cfgt_post(struct sip_msg *msg, unsig + + if(_cfgt_node) { + LM_DBG("dump last flow\n"); +- if(_cfgt_node_get_flowname(_cfgt_node->route, 0, &flowname) < 0) ++ if(_cfgt_node->route == NULL && strncmp(_cfgt_node->uuid.s, "unknown", 7) == 0) ++ LM_DBG("route is NULL and message doesn't belong to cfgtest scenario\n"); ++ else if(_cfgt_node_get_flowname(_cfgt_node->route, 0, &flowname) < 0) + LM_ERR("cannot create flowname\n"); + else + _cfgt_set_dump(msg, _cfgt_node, &flowname); +@@ -696,11 +759,22 @@ int cfgt_post(struct sip_msg *msg, unsig + int cfgt_msgout(sr_event_param_t *evp) + { + srjson_t *jobj; ++ sip_msg_t msg; + str *buf = (str *)evp->data; ++ + if(buf == NULL) + return 0; + LM_DBG("msg out:{%.*s}\n", buf->len, buf->s); + ++ // Check if it is a SIP message ++ memset(&msg, 0, sizeof(sip_msg_t)); ++ msg.buf = buf->s; ++ msg.len = buf->len; ++ if(_cfgt_parse_msg(&msg)!=0) { ++ LM_DBG("set 'not_sip' flag\n"); ++ not_sip = 1; ++ } ++ + if(_cfgt_node) { + jobj = srjson_CreateStr(&_cfgt_node->jdoc, buf->s, buf->len); + if(jobj == NULL) { +@@ -710,6 +784,13 @@ int cfgt_msgout(sr_event_param_t *evp) + srjson_AddItemToArray(&_cfgt_node->jdoc, _cfgt_node->out, jobj); + return 0; + } ++ ++ // Skip OPTION messages internally generated ++ if(buf->len>7 && strcasestr(buf->s, "OPTIONS")) { ++ LM_DBG("OPTIONS message internally generated, skip it\n"); ++ return 0; ++ } ++ + LM_ERR("node empty\n"); + return -1; + }