diff options
| author | Quentin Young <qlyoung@cumulusnetworks.com> | 2019-04-08 17:05:45 +0000 |
|---|---|---|
| committer | Quentin Young <qlyoung@cumulusnetworks.com> | 2019-04-08 17:05:45 +0000 |
| commit | 236e900ca428cfcebfdf07ce27de9afffd24b923 (patch) | |
| tree | 30c5b664e8d3d89b7b5b708855d161e79f7dc252 | |
| parent | 421ac5391f22b0659762b184c33c50ff302256ce (diff) | |
ospfd: fix behavior of +/-metric
OSPFD uses -1 as a sentinel value for uninitialized metrics. When
applying a route map with a +/-metric to redistributed routes, we were
using -1 as our base value to increment or decrement on, which meant
that if you set e.g. +10, you would end up with a redistributed route of
metric 9.
This patch also removes an off-by-one sanity check that would cause a
set metric +1 or set metric 0 to result in a metric value of 20 :-)
Signed-off-by: Quentin Young <qlyoung@cumulusnetworks.com>
| -rw-r--r-- | ospfd/ospf_lsa.c | 6 | ||||
| -rw-r--r-- | ospfd/ospf_lsa.h | 6 | ||||
| -rw-r--r-- | ospfd/ospf_routemap.c | 9 |
3 files changed, 11 insertions, 10 deletions
diff --git a/ospfd/ospf_lsa.c b/ospfd/ospf_lsa.c index c9710e9165..e38193cffc 100644 --- a/ospfd/ospf_lsa.c +++ b/ospfd/ospf_lsa.c @@ -1499,12 +1499,6 @@ struct in_addr ospf_get_nssa_ip(struct ospf_area *area) return fwd; } -#define DEFAULT_DEFAULT_METRIC 20 -#define DEFAULT_DEFAULT_ORIGINATE_METRIC 10 -#define DEFAULT_DEFAULT_ALWAYS_METRIC 1 - -#define DEFAULT_METRIC_TYPE EXTERNAL_METRIC_TYPE_2 - int metric_type(struct ospf *ospf, uint8_t src, unsigned short instance) { struct ospf_redist *red; diff --git a/ospfd/ospf_lsa.h b/ospfd/ospf_lsa.h index 4b4d760f44..a381cf7145 100644 --- a/ospfd/ospf_lsa.h +++ b/ospfd/ospf_lsa.h @@ -24,6 +24,12 @@ #include "stream.h" +/* OSPF LSA Default metric values */ +#define DEFAULT_DEFAULT_METRIC 20 +#define DEFAULT_DEFAULT_ORIGINATE_METRIC 10 +#define DEFAULT_DEFAULT_ALWAYS_METRIC 1 +#define DEFAULT_METRIC_TYPE EXTERNAL_METRIC_TYPE_2 + /* OSPF LSA Range definition. */ #define OSPF_MIN_LSA 1 /* begin range here */ #define OSPF_MAX_LSA 12 diff --git a/ospfd/ospf_routemap.c b/ospfd/ospf_routemap.c index a15e605aca..30b2a50bb3 100644 --- a/ospfd/ospf_routemap.c +++ b/ospfd/ospf_routemap.c @@ -374,15 +374,16 @@ static route_map_result_t route_set_metric(void *rule, /* Set metric out value. */ if (!metric->used) return RMAP_OKAY; + + ei->route_map_set.metric = DEFAULT_DEFAULT_METRIC; + if (metric->type == metric_increment) ei->route_map_set.metric += metric->metric; - if (metric->type == metric_decrement) + else if (metric->type == metric_decrement) ei->route_map_set.metric -= metric->metric; - if (metric->type == metric_absolute) + else 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; } |
