]> git.puffer.fish Git - matthieu/frr.git/commitdiff
lib: fix the "set metric" route-map command
authorRenato Westphal <renato@opensourcerouting.org>
Wed, 9 Sep 2020 16:28:47 +0000 (13:28 -0300)
committerIgor Ryzhov <iryzhov@nfware.com>
Tue, 6 Oct 2020 12:54:24 +0000 (15:54 +0300)
The "set metric" command wasn't processing metric additions and
subtractions (using + and -) correctly. Fix those problems.

Also, remove the "+metric" and "-metric" options since they don't
work and don't make any sense (they could be interpreted as unitary
increments/decrements but that was never supported).

Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
lib/routemap_cli.c
lib/routemap_northbound.c
yang/frr-route-map.yang

index 836be38113cd04709dd397f370eec1413ff0747b..920f6c719537e79e3ef4adf9b5f8116fabafd6c4 100644 (file)
@@ -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"));
index 967f3fd4d400e7dbc48d15831c56cf93addacbb3..597a6b1ecfdbfb940dde0907ef62330f78675eb7 100644 (file)
@@ -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(
index c9d35938cbcd88609605b8b1d5ce6f31a13cbde0..b22a96a74053e1aa69030592e50143f365b3a51b 100644 (file)
@@ -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";
+                    }
                   }
                 }