From 36ec830c32c5b4caf4bca2dbf6536215745dae3b Mon Sep 17 00:00:00 2001 From: Victor Seva Date: Thu, 17 Sep 2020 15:09:50 +0200 Subject: [PATCH] TT#85300 lcr stopper_mode parameter * to control how stopper column is used. 0 => default behavior 1 => stopper will be checked after sort process Change-Id: I2b59111e40a1aedbd6c5446a5906b53c687a8ad4 --- debian/patches/series | 1 + .../sipwise/lcr-stopper_mode-parameter.patch | 134 ++++++++++++++++++ 2 files changed, 135 insertions(+) create mode 100644 debian/patches/sipwise/lcr-stopper_mode-parameter.patch diff --git a/debian/patches/series b/debian/patches/series index 9ab672b72..8a71a22b6 100644 --- a/debian/patches/series +++ b/debian/patches/series @@ -44,6 +44,7 @@ sipwise/pua_dialoginfo-use-lock-when-use_puburi_avps-is-set.patch sipwise/dialplan-don-t-stop-loading-rules-on-error.patch sipwise/cfgt-skip-tm-vars-T_.patch ### active development +sipwise/lcr-stopper_mode-parameter.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/lcr-stopper_mode-parameter.patch b/debian/patches/sipwise/lcr-stopper_mode-parameter.patch new file mode 100644 index 000000000..a445590d5 --- /dev/null +++ b/debian/patches/sipwise/lcr-stopper_mode-parameter.patch @@ -0,0 +1,134 @@ +From: Victor Seva +Date: Thu, 17 Sep 2020 14:48:49 +0200 +Subject: lcr: stopper_mode parameter + +if set to something different from 0 it will get all matches_gws +but will sort them first before stopping +--- + src/modules/lcr/lcr_mod.c | 42 +++++++++++++++++++++++++++++++++++++++--- + src/modules/lcr/lcr_mod.h | 1 + + 2 files changed, 40 insertions(+), 3 deletions(-) + +diff --git a/src/modules/lcr/lcr_mod.c b/src/modules/lcr/lcr_mod.c +index 579ec06..0565044 100644 +--- a/src/modules/lcr/lcr_mod.c ++++ b/src/modules/lcr/lcr_mod.c +@@ -205,6 +205,10 @@ static unsigned int priority_ordering_param = 0; + /* mtree tree name */ + str mtree_param = {"lcr", 3}; + ++/* stopper mode */ ++#define DEF_LCR_STOPPER_MODE 0 ++unsigned int stopper_mode_param = DEF_LCR_STOPPER_MODE; ++ + /* + * Other module types and variables + */ +@@ -351,6 +355,7 @@ static param_export_t params[] = { + {"ping_valid_reply_codes", PARAM_STR, &ping_valid_reply_codes_param}, + {"ping_from", PARAM_STR, &ping_from_param}, + {"ping_socket", PARAM_STR, &ping_socket_param}, ++ {"stopper_mode", PARAM_INT, &stopper_mode_param}, + {0, 0, 0} + }; + +@@ -2201,6 +2206,8 @@ int load_gws_dummy(int lcr_id, str *ruri_user, str *from_uri, str *request_uri, + matched_gws[gw_index].priority = t->priority; + matched_gws[gw_index].weight = t->weight * (kam_rand() >> 8); + matched_gws[gw_index].duplicate = 0; ++ if(stopper_mode_param != 0) ++ matched_gws[gw_index].stopper = rule->stopper; + LM_DBG("added matched_gws[%d]=[%u, %u, %u, %u]\n", gw_index, + t->gw_index, pl->prefix_len, t->priority, + matched_gws[gw_index].weight); +@@ -2208,8 +2215,10 @@ int load_gws_dummy(int lcr_id, str *ruri_user, str *from_uri, str *request_uri, + skip_gw: + t = t->next; + } +- if(rule->stopper == 1) ++ if(stopper_mode_param == 0 && rule->stopper == 1) { ++ LM_DBG("lcr_rule[%d] has stopper\n", rule->rule_id); + goto done; ++ } + + next: + rule = rule->next; +@@ -2236,6 +2245,11 @@ done: + if(matched_gws[i].duplicate == 1) + continue; + gw_indexes[j] = matched_gws[i].gw_index; ++ if(stopper_mode_param != 0 && matched_gws[i].stopper == 1){ ++ LM_DBG("lcr_rule[%d] has stopper, skip the rest\n", ++ matched_gws[i].rule_id); ++ i = -1; ++ } + j++; + } + +@@ -2251,7 +2265,7 @@ static int ki_load_gws_furi( + { + str *request_uri; + int i, j; +- unsigned int gw_index, now, dex; ++ unsigned int gw_index, now, dex, stopper_flag; + int_str val; + struct matched_gw_info matched_gws[MAX_NO_OF_GWS + 1]; + struct rule_info **rules, *rule, *pl; +@@ -2366,6 +2380,8 @@ static int ki_load_gws_furi( + matched_gws[gw_index].priority = t->priority; + matched_gws[gw_index].weight = t->weight * (kam_rand() >> 8); + matched_gws[gw_index].duplicate = 0; ++ if(stopper_mode_param != 0) ++ matched_gws[gw_index].stopper = rule->stopper; + LM_DBG("added matched_gws[%d]=[%u, %u, %u, %u]\n", gw_index, + t->gw_index, pl->prefix_len, t->priority, + matched_gws[gw_index].weight); +@@ -2374,8 +2390,10 @@ static int ki_load_gws_furi( + t = t->next; + } + /* Do not look further if this matching rule was stopper */ +- if(rule->stopper == 1) ++ if(stopper_mode_param == 0 && rule->stopper == 1) { ++ LM_DBG("lcr_rule[%d] has stopper\n", rule->rule_id); + goto done; ++ } + + next: + rule = rule->next; +@@ -2400,6 +2418,24 @@ done: + } + } + ++ if(stopper_mode_param != 0) { ++ /* mark as duplicate any other rule after a stopper rule, ++ this is needed due to avp are stored in backwards order of priority ++ */ ++ stopper_flag = 0; ++ for(i = gw_index - 1; i >= 0; i--) { ++ if(matched_gws[i].duplicate == 1) ++ continue; ++ if(stopper_flag) { ++ matched_gws[i].duplicate = 1; ++ } else if(matched_gws[i].stopper == 1) { ++ stopper_flag = 1; ++ LM_DBG("lcr_rule[%d] has stopper, skip the rest\n", ++ matched_gws[i].rule_id); ++ } ++ } ++ } ++ + /* Add gateways into gw_uris_avp */ + add_gws_into_avps(gws, matched_gws, gw_index, ruri_user); + +diff --git a/src/modules/lcr/lcr_mod.h b/src/modules/lcr/lcr_mod.h +index 421fe68..193e216 100644 +--- a/src/modules/lcr/lcr_mod.h ++++ b/src/modules/lcr/lcr_mod.h +@@ -85,6 +85,7 @@ struct matched_gw_info + unsigned short priority; + unsigned int weight; + unsigned short duplicate; ++ unsigned short stopper; + }; + + struct target