summaryrefslogtreecommitdiffstats
path: root/ospfd
diff options
context:
space:
mode:
authordturlupov <dturlupov@factor-ts.ru>2018-02-09 15:10:22 +0100
committerdturlupov <dturlupov@factor-ts.ru>2018-02-09 15:10:22 +0100
commit7a5e6e46da05a1d65c28ffdb2b6c9ade29887cfe (patch)
tree5e47cc6e0695408aba59cf9399f33d77ff4a356b /ospfd
parentMerge pull request #1720 from qlyoung/gitignore-changelog (diff)
downloadfrr-7a5e6e46da05a1d65c28ffdb2b6c9ade29887cfe.tar.xz
frr-7a5e6e46da05a1d65c28ffdb2b6c9ade29887cfe.zip
ospfd: OSPF support the +/- in set metric <+/-metric>
Signed-off-by: Dmitrii Turlupov <dturlupov@factor-rs.ru>
Diffstat (limited to 'ospfd')
-rw-r--r--ospfd/ospf_routemap.c49
1 files changed, 33 insertions, 16 deletions
diff --git a/ospfd/ospf_routemap.c b/ospfd/ospf_routemap.c
index b7a47602d..f2769c6f3 100644
--- a/ospfd/ospf_routemap.c
+++ b/ospfd/ospf_routemap.c
@@ -337,6 +337,7 @@ static struct route_map_rule_cmd route_match_tag_cmd = {
};
struct ospf_metric {
+ enum { metric_increment, metric_decrement, metric_absolute } type;
bool used;
u_int32_t metric;
};
@@ -356,8 +357,19 @@ static route_map_result_t route_set_metric(void *rule, struct prefix *prefix,
ei = object;
/* Set metric out value. */
- if (metric->used)
+ if (!metric->used)
+ return RMAP_OKAY;
+ if (metric->type == metric_increment)
+ ei->route_map_set.metric += metric->metric;
+ if (metric->type == metric_decrement)
+ ei->route_map_set.metric -= metric->metric;
+ if (metric->type == metric_absolute)
ei->route_map_set.metric = metric->metric;
+
+ if ((signed int)ei->route_map_set.metric < 1)
+ ei->route_map_set.metric = -1;
+ if (ei->route_map_set.metric > OSPF_LS_INFINITY)
+ ei->route_map_set.metric = OSPF_LS_INFINITY;
}
return RMAP_OKAY;
}
@@ -370,23 +382,28 @@ static void *route_set_metric_compile(const char *arg)
metric = XCALLOC(MTYPE_ROUTE_MAP_COMPILED, sizeof(u_int32_t));
metric->used = false;
- /* OSPF doesn't support the +/- in
- set metric <+/-metric> check
- Ignore the +/- component */
- if (!all_digit(arg)) {
- if ((arg[0] == '+' || arg[0] == '-') && all_digit(arg + 1)) {
- zlog_warn("OSPF does not support 'set metric +/-'");
- arg++;
- } else {
- if (strmatch(arg, "+rtt") || strmatch(arg, "-rtt"))
- zlog_warn(
- "OSPF does not support 'set metric +rtt / -rtt'");
-
- return metric;
- }
+ if (all_digit(arg))
+ metric->type = metric_absolute;
+
+ if (strmatch(arg, "+rtt") || strmatch(arg, "-rtt")) {
+ zlog_warn("OSPF does not support 'set metric +rtt / -rtt'");
+ return metric;
+ }
+
+ if ((arg[0] == '+') && all_digit(arg + 1)) {
+ metric->type = metric_increment;
+ arg++;
}
+
+ if ((arg[0] == '-') && all_digit(arg + 1)) {
+ metric->type = metric_decrement;
+ arg++;
+ }
+
metric->metric = strtoul(arg, NULL, 10);
- metric->used = true;
+
+ if (metric->metric)
+ metric->used = true;
return metric;
}