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
mr9.1
Victor Seva 6 years ago
parent 3d41b85239
commit 36ec830c32

@ -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

@ -0,0 +1,134 @@
From: Victor Seva <vseva@sipwise.com>
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
Loading…
Cancel
Save