]> git.proxmox.com Git - mirror_frr.git/commitdiff
isisd: allow redistribute statements with both the route-map and metric options
authorDmitrii Turlupov <dturlupov@factor-ts.ru>
Fri, 29 Mar 2019 11:17:41 +0000 (14:17 +0300)
committerRenato Westphal <renato@opensourcerouting.org>
Tue, 16 Apr 2019 00:49:31 +0000 (21:49 -0300)
Fixes #4012.

Signed-off-by: Dmitrii Turlupov <dturlupov@factor-ts.ru>
isisd/isis_cli.c
isisd/isis_northbound.c
yang/frr-isisd.yang

index ab5faf76b6c11afb5c10e8d131365cae7fb0b0c0..52f68eff5ab693928b554b1459590efbac7d4920 100644 (file)
@@ -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 <ipv4|ipv6>$ip"
       " <level-1|level-2>$level [always]$always"
-      " [<metric (0-16777215)$metric|route-map WORD$rmap>]",
+      " [{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 <ipv4|ipv6>$ip " PROTO_REDIST_STR
       "$proto"
       " <level-1|level-2>$level"
-      " [<metric (0-16777215)|route-map WORD>]",
+      " [{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");
 }
 
 /*
index 2d1d6f592702f757dcb84525f5a46885f911237c..8b26a7397549ff1fea88ff6e9983c532a33cd3ce 100644 (file)
@@ -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",
index ad8ef4e290c8e41bf5f216007c8cb6de4cfc4417..d0d11c867636c36c2344e82ea007e782aadf1075 100644 (file)
@@ -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.";
     }
   }