From: Dmitrii Turlupov Date: Fri, 29 Mar 2019 11:17:41 +0000 (+0300) Subject: isisd: allow redistribute statements with both the route-map and metric options X-Git-Tag: 7.1_pulled~79^2~1 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=82c25998be1b6580e1b9e7200831a7c3e2e9ce3a;p=matthieu%2Ffrr.git isisd: allow redistribute statements with both the route-map and metric options Fixes #4012. Signed-off-by: Dmitrii Turlupov --- diff --git a/isisd/isis_cli.c b/isisd/isis_cli.c index ab5faf76b6..52f68eff5a 100644 --- a/isisd/isis_cli.c +++ b/isisd/isis_cli.c @@ -1000,7 +1000,7 @@ DEFPY(isis_mpls_te_inter_as, isis_mpls_te_inter_as_cmd, DEFPY(isis_default_originate, isis_default_originate_cmd, "[no] default-information originate $ip" " $level [always]$always" - " []", + " [{metric (0-16777215)$metric|route-map WORD$rmap}]", NO_STR "Control distribution of default information\n" "Distribute a default route\n" @@ -1023,9 +1023,8 @@ DEFPY(isis_default_originate, isis_default_originate_cmd, nb_cli_enqueue_change(vty, "./route-map", rmap ? NB_OP_MODIFY : NB_OP_DESTROY, rmap ? rmap : NULL); - nb_cli_enqueue_change(vty, "./metric", - metric ? NB_OP_MODIFY : NB_OP_DESTROY, - metric ? metric_str : NULL); + nb_cli_enqueue_change(vty, "./metric", NB_OP_MODIFY, + metric_str ? metric_str : NULL); if (strmatch(ip, "ipv6") && !always) { vty_out(vty, "Zebra doesn't implement default-originate for IPv6 yet\n"); @@ -1043,8 +1042,6 @@ static void vty_print_def_origin(struct vty *vty, struct lyd_node *dnode, const char *family, const char *level, bool show_defaults) { - const char *metric; - vty_out(vty, " default-information originate %s %s", family, level); if (yang_dnode_get_bool(dnode, "./always")) vty_out(vty, " always"); @@ -1052,11 +1049,10 @@ static void vty_print_def_origin(struct vty *vty, struct lyd_node *dnode, if (yang_dnode_exists(dnode, "./route-map")) vty_out(vty, " route-map %s", yang_dnode_get_string(dnode, "./route-map")); - else if (yang_dnode_exists(dnode, "./metric")) { - metric = yang_dnode_get_string(dnode, "./metric"); - if (show_defaults || !yang_dnode_is_default(dnode, "./metric")) - vty_out(vty, " metric %s", metric); - } + if (show_defaults || !yang_dnode_is_default(dnode, "./metric")) + vty_out(vty, " metric %s", + yang_dnode_get_string(dnode, "./metric")); + vty_out(vty, "\n"); } @@ -1083,7 +1079,7 @@ DEFPY(isis_redistribute, isis_redistribute_cmd, "[no] redistribute $ip " PROTO_REDIST_STR "$proto" " $level" - " []", + " [{metric (0-16777215)|route-map WORD}]", NO_STR REDIST_STR "Redistribute IPv4 routes\n" "Redistribute IPv6 routes\n" PROTO_REDIST_HELP @@ -1101,9 +1097,8 @@ DEFPY(isis_redistribute, isis_redistribute_cmd, nb_cli_enqueue_change(vty, "./route-map", route_map ? NB_OP_MODIFY : NB_OP_DESTROY, route_map ? route_map : NULL); - nb_cli_enqueue_change(vty, "./metric", - metric ? NB_OP_MODIFY : NB_OP_DESTROY, - metric ? metric_str : NULL); + nb_cli_enqueue_change(vty, "./metric", NB_OP_MODIFY, + metric_str ? metric_str : NULL); } return nb_cli_apply_changes( @@ -1112,16 +1107,16 @@ DEFPY(isis_redistribute, isis_redistribute_cmd, } static void vty_print_redistribute(struct vty *vty, struct lyd_node *dnode, - const char *family) + bool show_defaults, const char *family) { const char *level = yang_dnode_get_string(dnode, "./level"); const char *protocol = yang_dnode_get_string(dnode, "./protocol"); vty_out(vty, " redistribute %s %s %s", family, protocol, level); - if (yang_dnode_exists(dnode, "./metric")) + if (show_defaults || !yang_dnode_is_default(dnode, "./metric")) vty_out(vty, " metric %s", yang_dnode_get_string(dnode, "./metric")); - else if (yang_dnode_exists(dnode, "./route-map")) + if (yang_dnode_exists(dnode, "./route-map")) vty_out(vty, " route-map %s", yang_dnode_get_string(dnode, "./route-map")); vty_out(vty, "\n"); @@ -1130,12 +1125,12 @@ static void vty_print_redistribute(struct vty *vty, struct lyd_node *dnode, void cli_show_isis_redistribute_ipv4(struct vty *vty, struct lyd_node *dnode, bool show_defaults) { - vty_print_redistribute(vty, dnode, "ipv4"); + vty_print_redistribute(vty, dnode, show_defaults, "ipv4"); } void cli_show_isis_redistribute_ipv6(struct vty *vty, struct lyd_node *dnode, bool show_defaults) { - vty_print_redistribute(vty, dnode, "ipv6"); + vty_print_redistribute(vty, dnode, show_defaults, "ipv6"); } /* diff --git a/isisd/isis_northbound.c b/isisd/isis_northbound.c index 2d1d6f5927..8b26a73975 100644 --- a/isisd/isis_northbound.c +++ b/isisd/isis_northbound.c @@ -826,7 +826,7 @@ static void default_info_origin_apply_finish(const struct lyd_node *dnode, if (yang_dnode_exists(dnode, "./metric")) metric = yang_dnode_get_uint32(dnode, "./metric"); - else if (yang_dnode_exists(dnode, "./route-map")) + if (yang_dnode_exists(dnode, "./route-map")) routemap = yang_dnode_get_string(dnode, "./route-map"); isis_redist_set(area, level, family, DEFAULT_ROUTE, metric, routemap, @@ -907,13 +907,6 @@ static int isis_instance_default_information_originate_ipv4_metric_modify( return NB_OK; } -static int isis_instance_default_information_originate_ipv4_metric_destroy( - enum nb_event event, const struct lyd_node *dnode) -{ - /* It's all done by default_info_origin_apply_finish */ - return NB_OK; -} - /* * XPath: /frr-isisd:isis/instance/default-information-originate/ipv6 */ @@ -981,13 +974,6 @@ static int isis_instance_default_information_originate_ipv6_metric_modify( return NB_OK; } -static int isis_instance_default_information_originate_ipv6_metric_destroy( - enum nb_event event, const struct lyd_node *dnode) -{ - /* It's all done by default_info_origin_apply_finish */ - return NB_OK; -} - /* * XPath: /frr-isisd:isis/instance/redistribute/ipv4 */ @@ -1005,7 +991,7 @@ static void redistribute_apply_finish(const struct lyd_node *dnode, int family) if (yang_dnode_exists(dnode, "./metric")) metric = yang_dnode_get_uint32(dnode, "./metric"); - else if (yang_dnode_exists(dnode, "./route-map")) + if (yang_dnode_exists(dnode, "./route-map")) routemap = yang_dnode_get_string(dnode, "./route-map"); isis_redist_set(area, level, family, type, metric, routemap, 0); @@ -1078,14 +1064,6 @@ isis_instance_redistribute_ipv4_metric_modify(enum nb_event event, return NB_OK; } -static int -isis_instance_redistribute_ipv4_metric_destroy(enum nb_event event, - const struct lyd_node *dnode) -{ - /* It's all done by redistribute_apply_finish */ - return NB_OK; -} - /* * XPath: /frr-isisd:isis/instance/redistribute/ipv6 */ @@ -1146,14 +1124,6 @@ isis_instance_redistribute_ipv6_metric_modify(enum nb_event event, return NB_OK; } -static int -isis_instance_redistribute_ipv6_metric_destroy(enum nb_event event, - const struct lyd_node *dnode) -{ - /* It's all done by redistribute_apply_finish */ - return NB_OK; -} - /* * XPath: /frr-isisd:isis/instance/multi-topology/ipv4-multicast */ @@ -2926,7 +2896,6 @@ const struct frr_yang_module_info frr_isisd_info = { { .xpath = "/frr-isisd:isis/instance/default-information-originate/ipv4/metric", .cbs.modify = isis_instance_default_information_originate_ipv4_metric_modify, - .cbs.destroy = isis_instance_default_information_originate_ipv4_metric_destroy, }, { .xpath = "/frr-isisd:isis/instance/default-information-originate/ipv6", @@ -2947,7 +2916,6 @@ const struct frr_yang_module_info frr_isisd_info = { { .xpath = "/frr-isisd:isis/instance/default-information-originate/ipv6/metric", .cbs.modify = isis_instance_default_information_originate_ipv6_metric_modify, - .cbs.destroy = isis_instance_default_information_originate_ipv6_metric_destroy, }, { .xpath = "/frr-isisd:isis/instance/redistribute/ipv4", @@ -2964,7 +2932,6 @@ const struct frr_yang_module_info frr_isisd_info = { { .xpath = "/frr-isisd:isis/instance/redistribute/ipv4/metric", .cbs.modify = isis_instance_redistribute_ipv4_metric_modify, - .cbs.destroy = isis_instance_redistribute_ipv4_metric_destroy, }, { .xpath = "/frr-isisd:isis/instance/redistribute/ipv6", @@ -2981,7 +2948,6 @@ const struct frr_yang_module_info frr_isisd_info = { { .xpath = "/frr-isisd:isis/instance/redistribute/ipv6/metric", .cbs.modify = isis_instance_redistribute_ipv6_metric_modify, - .cbs.destroy = isis_instance_redistribute_ipv6_metric_destroy, }, { .xpath = "/frr-isisd:isis/instance/multi-topology/ipv4-multicast", diff --git a/yang/frr-isisd.yang b/yang/frr-isisd.yang index ad8ef4e290..d0d11c8676 100644 --- a/yang/frr-isisd.yang +++ b/yang/frr-isisd.yang @@ -179,25 +179,23 @@ module frr-isisd { grouping redistribute-attributes { description "Common optional attributes of any redistribute entry."; - choice attribute { - leaf route-map { - type string { - length "1..max"; - } - description - "Applies the conditions of the specified route-map to routes that - are redistributed into this routing instance."; + leaf route-map { + type string { + length "1..max"; } + description + "Applies the conditions of the specified route-map to routes that + are redistributed into this routing instance."; + } - leaf metric { - type uint32 { - range "0..16777215"; - } - default "0"; - description - "Metric used for the redistributed route. If 0, - the default-metric attribute is used instead."; + leaf metric { + type uint32 { + range "0..16777215"; } + default "0"; + description + "Metric used for the redistributed route. If 0, + the default-metric attribute is used instead."; } }