diff --git a/debian/patches/series b/debian/patches/series index 6ea45ab17..9e0850531 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -49,6 +49,7 @@ sipwise/lcr-stats.patch sipwise/dialog-support-profile_get_size-for-all-profiles.patch ### active development sipwise/pv_headers-rework-pvh_remove_header_param-take-two.patch +sipwise/cfgt-route-log.patch # ### Don't just put stuff in any order ### use gbp pq import/export tooling to help maintain patches diff --git a/debian/patches/sipwise/cfgt-route-log.patch b/debian/patches/sipwise/cfgt-route-log.patch new file mode 100644 index 000000000..bd8f9a6cc --- /dev/null +++ b/debian/patches/sipwise/cfgt-route-log.patch @@ -0,0 +1,207 @@ +From: Victor Seva <vseva@sipwise.com> +Date: Wed, 29 Mar 2023 12:12:54 +0200 +Subject: cfgt: route log + +--- + src/modules/cfgt/cfgt_int.c | 39 ++++++++++++++++++++++++++++++++++++- + src/modules/cfgt/cfgt_int.h | 3 ++- + src/modules/cfgt/cfgt_mod.c | 4 +++- + src/modules/cfgt/doc/cfgt_admin.xml | 19 ++++++++++++++++++ + 4 files changed, 62 insertions(+), 3 deletions(-) + +diff --git a/src/modules/cfgt/cfgt_int.c b/src/modules/cfgt/cfgt_int.c +index 683b39f..9470783 100644 +--- a/src/modules/cfgt/cfgt_int.c ++++ b/src/modules/cfgt/cfgt_int.c +@@ -1,6 +1,6 @@ + /** + * +- * Copyright (C) 2015 Victor Seva (sipwise.com) ++ * Copyright (C) 2015-2023 Victor Seva (sipwise.com) + * + * This file is part of Kamailio, a free SIP server. + * +@@ -22,6 +22,7 @@ + #define _GNU_SOURCE + #include <stdio.h> + #include <sys/stat.h> ++#include <sys/time.h> + #include <dirent.h> + #include <string.h> + #include <errno.h> +@@ -45,6 +46,7 @@ str cfgt_hdr_prefix = {"NGCP%", 5}; + str cfgt_basedir = {"/tmp", 4}; + int cfgt_mask = CFGT_DP_ALL; + int cfgt_skip_unknown = 0; ++int cfgt_route_log = 0; + int not_sip = 0; + + int _cfgt_get_filename(int msgid, str uuid, str *dest, int *dir); +@@ -462,6 +464,7 @@ int _cfgt_set_dump(struct sip_msg *msg, cfgt_node_p node, str *flow) + { + int len; + char v; ++ unsigned long int tdiff; + srjson_t *f, *vars; + + if(node == NULL || flow == NULL) +@@ -493,6 +496,17 @@ int _cfgt_set_dump(struct sip_msg *msg, cfgt_node_p node, str *flow) + return -1; + } + ++ if(node->route->duration.tv_usec > 0) { ++ tdiff = (node->route->duration.tv_sec) * 1000000 ++ + (node->route->duration.tv_usec); ++ f = srjson_CreateNumber(&node->jdoc, tdiff); ++ if(f == NULL) { ++ LM_ERR("cannot create json object\n"); ++ return -1; ++ } ++ srjson_AddItemToObject(&node->jdoc, vars, "execution_usec", f); ++ } ++ + f = srjson_CreateObject(&node->jdoc); + if(f == NULL) { + LM_ERR("cannot create json object\n"); +@@ -505,6 +519,21 @@ int _cfgt_set_dump(struct sip_msg *msg, cfgt_node_p node, str *flow) + return 0; + } + ++static void _cfgt_log_route(cfgt_str_list_p route) ++{ ++ unsigned long int tdiff; ++ if(!route) { ++ LM_BUG("empty route\n"); ++ return; ++ } ++ ++ if(route->duration.tv_usec > 0) { ++ tdiff = (route->duration.tv_sec) * 1000000 + (route->duration.tv_usec); ++ LM_WARN("[%.*s] exectime=%lu usec\n", route->s.len, route->s.s, ++ tdiff); ++ } ++} ++ + void _cfgt_set_type(cfgt_str_list_p route, struct action *a) + { + switch(a->type) { +@@ -520,6 +549,8 @@ void _cfgt_set_type(cfgt_str_list_p route, struct action *a) + route->type = CFGT_DROP_E; + LM_DBG("set[%.*s]->CFGT_DROP_E\n", route->s.len, route->s.s); + } ++ gettimeofday(&route->end, NULL); ++ timersub(&route->end, &route->start, &route->duration); + break; + case ROUTE_T: + route->type = CFGT_ROUTE; +@@ -534,6 +565,8 @@ void _cfgt_set_type(cfgt_str_list_p route, struct action *a) + LM_DBG("[%.*s] already set to CFGT_DROP_E[%d]\n", route->s.len, + route->s.s, a->type); + } ++ gettimeofday(&route->end, NULL); ++ timersub(&route->end, &route->start, &route->duration); + break; + } + } +@@ -553,6 +586,7 @@ int _cfgt_add_routename(cfgt_node_p node, struct action *a, str *routename) + memset(node->route, 0, sizeof(cfgt_str_list_t)); + node->flow_head = node->route; + node->route->type = CFGT_ROUTE; ++ gettimeofday(&node->route->start, NULL); + ret = 1; + } else { + LM_DBG("actual routename:[%.*s][%d]\n", node->route->s.len, +@@ -600,6 +634,7 @@ int _cfgt_add_routename(cfgt_node_p node, struct action *a, str *routename) + route->prev = node->route; + node->route->next = route; + node->route = route; ++ gettimeofday(&node->route->start, NULL); + _cfgt_set_type(node->route, a); + } + node->route->s.s = routename->s; +@@ -617,6 +652,8 @@ void _cfgt_del_routename(cfgt_node_p node) + } + LM_DBG("del route[%.*s]\n", node->route->s.len, node->route->s.s); + node->route = node->route->prev; ++ if(cfgt_route_log) ++ _cfgt_log_route(node->route->next); + pkg_free(node->route->next); + node->route->next = NULL; + } +diff --git a/src/modules/cfgt/cfgt_int.h b/src/modules/cfgt/cfgt_int.h +index 197e4bb..1564daa 100644 +--- a/src/modules/cfgt/cfgt_int.h ++++ b/src/modules/cfgt/cfgt_int.h +@@ -1,6 +1,6 @@ + /** + * +- * Copyright (C) 2015 Victor Seva (sipwise.com) ++ * Copyright (C) 2015-2023 Victor Seva (sipwise.com) + * + * This file is part of Kamailio, a free SIP server. + * +@@ -48,6 +48,7 @@ typedef struct _cfgt_str_list + { + str s; + enum _cfgt_action_type type; ++ struct timeval start, end, duration; + struct _cfgt_str_list *next, *prev; + } cfgt_str_list_t, *cfgt_str_list_p; + +diff --git a/src/modules/cfgt/cfgt_mod.c b/src/modules/cfgt/cfgt_mod.c +index 10b0889..1d004ef 100644 +--- a/src/modules/cfgt/cfgt_mod.c ++++ b/src/modules/cfgt/cfgt_mod.c +@@ -1,5 +1,5 @@ + /* +- * Copyright (C) 2015 Victor Seva (sipwise.com) ++ * Copyright (C) 2015-2023 Victor Seva (sipwise.com) + * + * This file is part of Kamailio, a free SIP server. + * +@@ -43,6 +43,7 @@ extern int cfgt_mask; + extern str cfgt_basedir; + extern str cfgt_hdr_prefix; + extern int cfgt_skip_unknown; ++extern int cfgt_route_log; + /* clang-format off */ + /*! \brief + * Exported functions +@@ -60,6 +61,7 @@ static param_export_t params[] = { + {"mask", INT_PARAM, &cfgt_mask}, + {"callid_prefix", PARAM_STR, &cfgt_hdr_prefix}, + {"skip_unknown", INT_PARAM, &cfgt_skip_unknown}, ++ {"route_log", INT_PARAM, &cfgt_route_log}, + {0, 0, 0} + }; + +diff --git a/src/modules/cfgt/doc/cfgt_admin.xml b/src/modules/cfgt/doc/cfgt_admin.xml +index 84d3df6..73f8565 100644 +--- a/src/modules/cfgt/doc/cfgt_admin.xml ++++ b/src/modules/cfgt/doc/cfgt_admin.xml +@@ -163,6 +163,25 @@ modparam("cfgt", "callid_prefix", "TEST-ID%") + ... + modparam("cfgt", "skip_unknown", "1") + ... ++</programlisting> ++ </example> ++ </section> ++ <section id="cfg.p.route_log"> ++ <title><varname>route_log</varname> (int)</title> ++ <para> ++ If enabled, value different from 0, cfgt will log (WARN) the execution time of routes. ++ </para> ++ <para> ++ <emphasis> ++ Default value is <quote>0</quote>, false. ++ </emphasis> ++ </para> ++ <example> ++ <title>Set <varname>route_log</varname> parameter</title> ++ <programlisting format="linespecific"> ++... ++modparam("cfgt", "route_log", "1") ++... + </programlisting> + </example> + </section>