summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/routemap_cli.c25
-rw-r--r--lib/routemap_northbound.c26
-rw-r--r--yang/frr-route-map.yang12
3 files changed, 45 insertions, 18 deletions
diff --git a/lib/routemap_cli.c b/lib/routemap_cli.c
index 836be38113..920f6c7195 100644
--- a/lib/routemap_cli.c
+++ b/lib/routemap_cli.c
@@ -719,15 +719,13 @@ DEFPY_YANG(
DEFPY_YANG(
set_metric, set_metric_cmd,
- "set metric <(0-4294967295)$metric|rtt$rtt|+rtt$artt|-rtt$srtt|+metric$ametric|-metric$smetric>",
+ "set metric <(-4294967295-4294967295)$metric|rtt$rtt|+rtt$artt|-rtt$srtt>",
SET_STR
"Metric value for destination routing protocol\n"
- "Metric value\n"
+ "Metric value (use +/- for additions or subtractions)\n"
"Assign round trip time\n"
"Add round trip time\n"
- "Subtract round trip time\n"
- "Add metric\n"
- "Subtract metric\n")
+ "Subtract round trip time\n")
{
const char *xpath = "./set-action[action='metric']";
char xpath_value[XPATH_MAXLEN];
@@ -746,17 +744,17 @@ DEFPY_YANG(
snprintf(xpath_value, sizeof(xpath_value),
"%s/subtract-round-trip-time", xpath);
snprintf(value, sizeof(value), "true");
- } else if (ametric) {
+ } else if (metric_str && metric_str[0] == '+') {
snprintf(xpath_value, sizeof(xpath_value), "%s/add-metric",
xpath);
- snprintf(value, sizeof(value), "true");
- } else if (smetric) {
+ snprintf(value, sizeof(value), "%s", ++metric_str);
+ } else if (metric_str && metric_str[0] == '-') {
snprintf(xpath_value, sizeof(xpath_value), "%s/subtract-metric",
xpath);
- snprintf(value, sizeof(value), "true");
+ snprintf(value, sizeof(value), "%s", ++metric_str);
} else {
snprintf(xpath_value, sizeof(xpath_value), "%s/value", xpath);
- snprintf(value, sizeof(value), "%lu", metric);
+ snprintf(value, sizeof(value), "%s", metric_str);
}
nb_cli_enqueue_change(vty, xpath_value, NB_OP_MODIFY, value);
@@ -831,9 +829,12 @@ void route_map_action_show(struct vty *vty, struct lyd_node *dnode,
} else if (yang_dnode_get(dnode, "./subtract-round-trip-time")) {
vty_out(vty, " set metric -rtt\n");
} else if (yang_dnode_get(dnode, "./add-metric")) {
- vty_out(vty, " set metric +metric\n");
+ vty_out(vty, " set metric +%s\n",
+ yang_dnode_get_string(dnode, "./add-metric"));
} else if (yang_dnode_get(dnode, "./subtract-metric")) {
- vty_out(vty, " set metric -metric\n");
+ vty_out(vty, " set metric -%s\n",
+ yang_dnode_get_string(dnode,
+ "./subtract-metric"));
} else {
vty_out(vty, " set metric %s\n",
yang_dnode_get_string(dnode, "./value"));
diff --git a/lib/routemap_northbound.c b/lib/routemap_northbound.c
index 967f3fd4d4..597a6b1ecf 100644
--- a/lib/routemap_northbound.c
+++ b/lib/routemap_northbound.c
@@ -983,8 +983,19 @@ lib_route_map_entry_set_action_value_destroy(struct nb_cb_destroy_args *args)
static int
lib_route_map_entry_set_action_add_metric_modify(struct nb_cb_modify_args *args)
{
+ char metric_str[16];
+
+ if (args->event == NB_EV_VALIDATE
+ && yang_dnode_get_uint32(args->dnode, NULL) == 0) {
+ snprintf(args->errmsg, args->errmsg_len,
+ "Can't add zero to metric");
+ return NB_ERR_VALIDATION;
+ }
+
+ snprintf(metric_str, sizeof(metric_str), "+%s",
+ yang_dnode_get_string(args->dnode, NULL));
return set_action_modify(args->event, args->dnode, args->resource,
- "+metric");
+ metric_str);
}
static int lib_route_map_entry_set_action_add_metric_destroy(
@@ -999,8 +1010,19 @@ static int lib_route_map_entry_set_action_add_metric_destroy(
static int lib_route_map_entry_set_action_subtract_metric_modify(
struct nb_cb_modify_args *args)
{
+ char metric_str[16];
+
+ if (args->event == NB_EV_VALIDATE
+ && yang_dnode_get_uint32(args->dnode, NULL) == 0) {
+ snprintf(args->errmsg, args->errmsg_len,
+ "Can't subtract zero from metric");
+ return NB_ERR_VALIDATION;
+ }
+
+ snprintf(metric_str, sizeof(metric_str), "-%s",
+ yang_dnode_get_string(args->dnode, NULL));
return set_action_modify(args->event, args->dnode, args->resource,
- "-metric");
+ metric_str);
}
static int lib_route_map_entry_set_action_subtract_metric_destroy(
diff --git a/yang/frr-route-map.yang b/yang/frr-route-map.yang
index b895cd12a4..70a6f4470c 100644
--- a/yang/frr-route-map.yang
+++ b/yang/frr-route-map.yang
@@ -373,15 +373,19 @@ module frr-route-map {
case add-metric {
leaf add-metric {
- description "Add unit to metric.";
- type boolean;
+ description "Add value to metric.";
+ type uint32 {
+ range "0..4294967295";
+ }
}
}
case subtract-metric {
leaf subtract-metric {
- description "Subtract unit from metric.";
- type boolean;
+ description "Subtract value from metric.";
+ type uint32 {
+ range "0..4294967295";
+ }
}
}