From 0f07d9885a1412869e38f0779b866b05d3c164d9 Mon Sep 17 00:00:00 2001 From: Renato Westphal Date: Wed, 9 Sep 2020 13:28:47 -0300 Subject: [PATCH] lib: fix the "set metric" route-map command 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 --- lib/routemap_cli.c | 25 +++++++++++++------------ lib/routemap_northbound.c | 26 ++++++++++++++++++++++++-- yang/frr-route-map.yang | 12 ++++++++---- 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 c9d35938cb..b22a96a740 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"; + } } } -- 2.39.5