]> git.puffer.fish Git - mirror/frr.git/commitdiff
bgpd: add redistribute table-direct support
authorPhilippe Guibert <philippe.guibert@6wind.com>
Mon, 28 Aug 2023 07:33:38 +0000 (09:33 +0200)
committerPhilippe Guibert <philippe.guibert@6wind.com>
Fri, 20 Oct 2023 11:28:52 +0000 (13:28 +0200)
Add the 'redistribute table-direct' command under the bgp address-family
node. Handle the table-direct support wherever needed in the BGP code.

Signed-off-by: Philippe Guibert <philippe.guibert@6wind.com>
bgpd/bgp_vty.c
bgpd/bgp_zebra.c

index fca9e2ad8e3c926d2d4548115beb44324be20108..3ce90adb1976e90e46e184071b8e0b05cb0db90a 100644 (file)
@@ -16846,10 +16846,11 @@ ALIAS_HIDDEN(
 
 DEFUN (bgp_redistribute_ipv4_ospf,
        bgp_redistribute_ipv4_ospf_cmd,
-       "redistribute <ospf|table> (1-65535)",
+       "redistribute <ospf|table|table-direct> (1-65535)",
        "Redistribute information from another routing protocol\n"
        "Open Shortest Path First (OSPFv2)\n"
        "Non-main Kernel Routing Table\n"
+       "Non-main Kernel Routing Table - Direct\n"
        "Instance ID/Table ID\n")
 {
        VTY_DECLVAR_CONTEXT(bgp, bgp);
@@ -16869,7 +16870,18 @@ DEFUN (bgp_redistribute_ipv4_ospf,
                                argv[idx_ospf_table]->arg);
                        return CMD_WARNING_CONFIG_FAILED;
                }
-               protocol = ZEBRA_ROUTE_TABLE;
+               if (strncmp(argv[idx_ospf_table]->arg, "table-direct",
+                           strlen("table-direct")) == 0) {
+                       protocol = ZEBRA_ROUTE_TABLE_DIRECT;
+                       if (instance == RT_TABLE_MAIN ||
+                           instance == RT_TABLE_LOCAL) {
+                               vty_out(vty,
+                                       "%% 'table-direct', can not use %u routing table\n",
+                                       instance);
+                               return CMD_WARNING_CONFIG_FAILED;
+                       }
+               } else
+                       protocol = ZEBRA_ROUTE_TABLE;
        }
 
        bgp_redist_add(bgp, AFI_IP, protocol, instance);
@@ -16877,18 +16889,20 @@ DEFUN (bgp_redistribute_ipv4_ospf,
 }
 
 ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf, bgp_redistribute_ipv4_ospf_hidden_cmd,
-            "redistribute <ospf|table> (1-65535)",
+            "redistribute <ospf|table|table-direct> (1-65535)",
             "Redistribute information from another routing protocol\n"
             "Open Shortest Path First (OSPFv2)\n"
             "Non-main Kernel Routing Table\n"
+            "Non-main Kernel Routing Table - Direct\n"
             "Instance ID/Table ID\n")
 
 DEFUN (bgp_redistribute_ipv4_ospf_rmap,
        bgp_redistribute_ipv4_ospf_rmap_cmd,
-       "redistribute <ospf|table> (1-65535) route-map RMAP_NAME",
+       "redistribute <ospf|table|table-direct> (1-65535) route-map RMAP_NAME",
        "Redistribute information from another routing protocol\n"
        "Open Shortest Path First (OSPFv2)\n"
        "Non-main Kernel Routing Table\n"
+       "Non-main Kernel Routing Table - Direct\n"
        "Instance ID/Table ID\n"
        "Route map reference\n"
        "Pointer to route-map entries\n")
@@ -16904,6 +16918,8 @@ DEFUN (bgp_redistribute_ipv4_ospf_rmap,
        struct route_map *route_map =
                route_map_lookup_warn_noexist(vty, argv[idx_word]->arg);
 
+       instance = strtoul(argv[idx_number]->arg, NULL, 10);
+
        if (strncmp(argv[idx_ospf_table]->arg, "o", 1) == 0)
                protocol = ZEBRA_ROUTE_OSPF;
        else {
@@ -16913,10 +16929,20 @@ DEFUN (bgp_redistribute_ipv4_ospf_rmap,
                                argv[idx_ospf_table]->arg);
                        return CMD_WARNING_CONFIG_FAILED;
                }
-               protocol = ZEBRA_ROUTE_TABLE;
+               if (strncmp(argv[idx_ospf_table]->arg, "table-direct",
+                           strlen("table-direct")) == 0) {
+                       protocol = ZEBRA_ROUTE_TABLE_DIRECT;
+                       if (instance == RT_TABLE_MAIN ||
+                           instance == RT_TABLE_LOCAL) {
+                               vty_out(vty,
+                                       "%% 'table-direct', can not use %u routing table\n",
+                                       instance);
+                               return CMD_WARNING_CONFIG_FAILED;
+                       }
+               } else
+                       protocol = ZEBRA_ROUTE_TABLE;
        }
 
-       instance = strtoul(argv[idx_number]->arg, NULL, 10);
        red = bgp_redist_add(bgp, AFI_IP, protocol, instance);
        changed =
                bgp_redistribute_rmap_set(red, argv[idx_word]->arg, route_map);
@@ -16925,20 +16951,22 @@ DEFUN (bgp_redistribute_ipv4_ospf_rmap,
 
 ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf_rmap,
             bgp_redistribute_ipv4_ospf_rmap_hidden_cmd,
-            "redistribute <ospf|table> (1-65535) route-map RMAP_NAME",
+            "redistribute <ospf|table|table-direct> (1-65535) route-map RMAP_NAME",
             "Redistribute information from another routing protocol\n"
             "Open Shortest Path First (OSPFv2)\n"
             "Non-main Kernel Routing Table\n"
+            "Non-main Kernel Routing Table - Direct\n"
             "Instance ID/Table ID\n"
             "Route map reference\n"
             "Pointer to route-map entries\n")
 
 DEFUN (bgp_redistribute_ipv4_ospf_metric,
        bgp_redistribute_ipv4_ospf_metric_cmd,
-       "redistribute <ospf|table> (1-65535) metric (0-4294967295)",
+       "redistribute <ospf|table|table-direct> (1-65535) metric (0-4294967295)",
        "Redistribute information from another routing protocol\n"
        "Open Shortest Path First (OSPFv2)\n"
        "Non-main Kernel Routing Table\n"
+       "Non-main Kernel Routing Table - Direct\n"
        "Instance ID/Table ID\n"
        "Metric for redistributed routes\n"
        "Default metric\n")
@@ -16953,6 +16981,8 @@ DEFUN (bgp_redistribute_ipv4_ospf_metric,
        int protocol;
        bool changed;
 
+       instance = strtoul(argv[idx_number]->arg, NULL, 10);
+
        if (strncmp(argv[idx_ospf_table]->arg, "o", 1) == 0)
                protocol = ZEBRA_ROUTE_OSPF;
        else {
@@ -16962,10 +16992,20 @@ DEFUN (bgp_redistribute_ipv4_ospf_metric,
                                argv[idx_ospf_table]->arg);
                        return CMD_WARNING_CONFIG_FAILED;
                }
-               protocol = ZEBRA_ROUTE_TABLE;
+               if (strncmp(argv[idx_ospf_table]->arg, "table-direct",
+                           strlen("table-direct")) == 0) {
+                       protocol = ZEBRA_ROUTE_TABLE_DIRECT;
+                       if (instance == RT_TABLE_MAIN ||
+                           instance == RT_TABLE_LOCAL) {
+                               vty_out(vty,
+                                       "%% 'table-direct', can not use %u routing table\n",
+                                       instance);
+                               return CMD_WARNING_CONFIG_FAILED;
+                       }
+               } else
+                       protocol = ZEBRA_ROUTE_TABLE;
        }
 
-       instance = strtoul(argv[idx_number]->arg, NULL, 10);
        metric = strtoul(argv[idx_number_2]->arg, NULL, 10);
 
        red = bgp_redist_add(bgp, AFI_IP, protocol, instance);
@@ -16976,20 +17016,22 @@ DEFUN (bgp_redistribute_ipv4_ospf_metric,
 
 ALIAS_HIDDEN(bgp_redistribute_ipv4_ospf_metric,
             bgp_redistribute_ipv4_ospf_metric_hidden_cmd,
-            "redistribute <ospf|table> (1-65535) metric (0-4294967295)",
+            "redistribute <ospf|table|table-direct> (1-65535) metric (0-4294967295)",
             "Redistribute information from another routing protocol\n"
             "Open Shortest Path First (OSPFv2)\n"
             "Non-main Kernel Routing Table\n"
+            "Non-main Kernel Routing Table - Direct\n"
             "Instance ID/Table ID\n"
             "Metric for redistributed routes\n"
             "Default metric\n")
 
 DEFUN (bgp_redistribute_ipv4_ospf_rmap_metric,
        bgp_redistribute_ipv4_ospf_rmap_metric_cmd,
-       "redistribute <ospf|table> (1-65535) route-map RMAP_NAME metric (0-4294967295)",
+       "redistribute <ospf|table|table-direct> (1-65535) route-map RMAP_NAME metric (0-4294967295)",
        "Redistribute information from another routing protocol\n"
        "Open Shortest Path First (OSPFv2)\n"
        "Non-main Kernel Routing Table\n"
+       "Non-main Kernel Routing Table - Direct\n"
        "Instance ID/Table ID\n"
        "Route map reference\n"
        "Pointer to route-map entries\n"
@@ -17009,6 +17051,8 @@ DEFUN (bgp_redistribute_ipv4_ospf_rmap_metric,
        struct route_map *route_map =
                route_map_lookup_warn_noexist(vty, argv[idx_word]->arg);
 
+       instance = strtoul(argv[idx_number]->arg, NULL, 10);
+
        if (strncmp(argv[idx_ospf_table]->arg, "o", 1) == 0)
                protocol = ZEBRA_ROUTE_OSPF;
        else {
@@ -17018,10 +17062,20 @@ DEFUN (bgp_redistribute_ipv4_ospf_rmap_metric,
                                argv[idx_ospf_table]->arg);
                        return CMD_WARNING_CONFIG_FAILED;
                }
-               protocol = ZEBRA_ROUTE_TABLE;
+               if (strncmp(argv[idx_ospf_table]->arg, "table-direct",
+                           strlen("table-direct")) == 0) {
+                       protocol = ZEBRA_ROUTE_TABLE_DIRECT;
+                       if (instance == RT_TABLE_MAIN ||
+                           instance == RT_TABLE_LOCAL) {
+                               vty_out(vty,
+                                       "%% 'table-direct', can not use %u routing table\n",
+                                       instance);
+                               return CMD_WARNING_CONFIG_FAILED;
+                       }
+               } else
+                       protocol = ZEBRA_ROUTE_TABLE;
        }
 
-       instance = strtoul(argv[idx_number]->arg, NULL, 10);
        metric = strtoul(argv[idx_number_2]->arg, NULL, 10);
 
        red = bgp_redist_add(bgp, AFI_IP, protocol, instance);
@@ -17035,10 +17089,11 @@ DEFUN (bgp_redistribute_ipv4_ospf_rmap_metric,
 ALIAS_HIDDEN(
        bgp_redistribute_ipv4_ospf_rmap_metric,
        bgp_redistribute_ipv4_ospf_rmap_metric_hidden_cmd,
-       "redistribute <ospf|table> (1-65535) route-map RMAP_NAME metric (0-4294967295)",
+       "redistribute <ospf|table|table-direct> (1-65535) route-map RMAP_NAME metric (0-4294967295)",
        "Redistribute information from another routing protocol\n"
        "Open Shortest Path First (OSPFv2)\n"
        "Non-main Kernel Routing Table\n"
+        "Non-main Kernel Routing Table - Direct\n"
        "Instance ID/Table ID\n"
        "Route map reference\n"
        "Pointer to route-map entries\n"
@@ -17047,10 +17102,11 @@ ALIAS_HIDDEN(
 
 DEFUN (bgp_redistribute_ipv4_ospf_metric_rmap,
        bgp_redistribute_ipv4_ospf_metric_rmap_cmd,
-       "redistribute <ospf|table> (1-65535) metric (0-4294967295) route-map RMAP_NAME",
+       "redistribute <ospf|table|table-direct> (1-65535) metric (0-4294967295) route-map RMAP_NAME",
        "Redistribute information from another routing protocol\n"
        "Open Shortest Path First (OSPFv2)\n"
        "Non-main Kernel Routing Table\n"
+       "Non-main Kernel Routing Table - Direct\n"
        "Instance ID/Table ID\n"
        "Metric for redistributed routes\n"
        "Default metric\n"
@@ -17070,6 +17126,8 @@ DEFUN (bgp_redistribute_ipv4_ospf_metric_rmap,
        struct route_map *route_map =
                route_map_lookup_warn_noexist(vty, argv[idx_word]->arg);
 
+       instance = strtoul(argv[idx_number]->arg, NULL, 10);
+
        if (strncmp(argv[idx_ospf_table]->arg, "o", 1) == 0)
                protocol = ZEBRA_ROUTE_OSPF;
        else {
@@ -17078,8 +17136,18 @@ DEFUN (bgp_redistribute_ipv4_ospf_metric_rmap,
                                "%% Only default BGP instance can use '%s'\n",
                                argv[idx_ospf_table]->arg);
                        return CMD_WARNING_CONFIG_FAILED;
-               }
-               protocol = ZEBRA_ROUTE_TABLE;
+               } else if (strncmp(argv[idx_ospf_table]->arg, "table-direct",
+                                  strlen("table-direct")) == 0) {
+                       protocol = ZEBRA_ROUTE_TABLE_DIRECT;
+                       if (instance == RT_TABLE_MAIN ||
+                           instance == RT_TABLE_LOCAL) {
+                               vty_out(vty,
+                                       "%% 'table-direct', can not use %u routing table\n",
+                                       instance);
+                               return CMD_WARNING_CONFIG_FAILED;
+                       }
+               } else
+                       protocol = ZEBRA_ROUTE_TABLE;
        }
 
        instance = strtoul(argv[idx_number]->arg, NULL, 10);
@@ -17096,10 +17164,11 @@ DEFUN (bgp_redistribute_ipv4_ospf_metric_rmap,
 ALIAS_HIDDEN(
        bgp_redistribute_ipv4_ospf_metric_rmap,
        bgp_redistribute_ipv4_ospf_metric_rmap_hidden_cmd,
-       "redistribute <ospf|table> (1-65535) metric (0-4294967295) route-map RMAP_NAME",
+       "redistribute <ospf|table|table-direct> (1-65535) metric (0-4294967295) route-map RMAP_NAME",
        "Redistribute information from another routing protocol\n"
        "Open Shortest Path First (OSPFv2)\n"
        "Non-main Kernel Routing Table\n"
+        "Non-main Kernel Routing Table - Direct\n"
        "Instance ID/Table ID\n"
        "Metric for redistributed routes\n"
        "Default metric\n"
@@ -17108,11 +17177,12 @@ ALIAS_HIDDEN(
 
 DEFUN (no_bgp_redistribute_ipv4_ospf,
        no_bgp_redistribute_ipv4_ospf_cmd,
-       "no redistribute <ospf|table> (1-65535) [{metric (0-4294967295)|route-map RMAP_NAME}]",
+       "no redistribute <ospf|table|table-direct> (1-65535) [{metric (0-4294967295)|route-map RMAP_NAME}]",
        NO_STR
        "Redistribute information from another routing protocol\n"
        "Open Shortest Path First (OSPFv2)\n"
        "Non-main Kernel Routing Table\n"
+       "Non-main Kernel Routing Table - Direct\n"
        "Instance ID/Table ID\n"
        "Metric for redistributed routes\n"
        "Default metric\n"
@@ -17125,6 +17195,8 @@ DEFUN (no_bgp_redistribute_ipv4_ospf,
        unsigned short instance;
        int protocol;
 
+       instance = strtoul(argv[idx_number]->arg, NULL, 10);
+
        if (strncmp(argv[idx_ospf_table]->arg, "o", 1) == 0)
                protocol = ZEBRA_ROUTE_OSPF;
        else {
@@ -17134,21 +17206,32 @@ DEFUN (no_bgp_redistribute_ipv4_ospf,
                                argv[idx_ospf_table]->arg);
                        return CMD_WARNING_CONFIG_FAILED;
                }
-               protocol = ZEBRA_ROUTE_TABLE;
+               if (strncmp(argv[idx_ospf_table]->arg, "table-direct",
+                           strlen("table-direct")) == 0) {
+                       protocol = ZEBRA_ROUTE_TABLE_DIRECT;
+                       if (instance == RT_TABLE_MAIN ||
+                           instance == RT_TABLE_LOCAL) {
+                               vty_out(vty,
+                                       "%% 'table-direct', can not use %u routing table\n",
+                                       instance);
+                               return CMD_WARNING_CONFIG_FAILED;
+                       }
+               } else
+                       protocol = ZEBRA_ROUTE_TABLE;
        }
 
-       instance = strtoul(argv[idx_number]->arg, NULL, 10);
        bgp_redistribute_unset(bgp, AFI_IP, protocol, instance);
        return CMD_SUCCESS;
 }
 
 ALIAS_HIDDEN(
        no_bgp_redistribute_ipv4_ospf, no_bgp_redistribute_ipv4_ospf_hidden_cmd,
-       "no redistribute <ospf|table> (1-65535) [{metric (0-4294967295)|route-map RMAP_NAME}]",
+       "no redistribute <ospf|table|table-direct> (1-65535) [{metric (0-4294967295)|route-map RMAP_NAME}]",
        NO_STR
        "Redistribute information from another routing protocol\n"
        "Open Shortest Path First (OSPFv2)\n"
        "Non-main Kernel Routing Table\n"
+       "Non-main Kernel Routing Table - Direct\n"
        "Instance ID/Table ID\n"
        "Metric for redistributed routes\n"
        "Default metric\n"
index 212b7f398b4c3254433110fdbc73dfb19b0479a5..fc0911f0638bf80da009e135196a923bae392883 100644 (file)
@@ -2051,7 +2051,8 @@ void bgp_redistribute_unset(struct bgp *bgp, afi_t afi, int type,
        struct listnode *node, *nnode;
        struct bgp_redist *red;
 
-       if (type != ZEBRA_ROUTE_TABLE || instance != 0)
+       if ((type != ZEBRA_ROUTE_TABLE && type != ZEBRA_ROUTE_TABLE_DIRECT) ||
+           instance != 0)
                return _bgp_redistribute_unset(bgp, afi, type, instance);
 
        /* walk over instance */