]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: allow table-direct on different VRFs
authorRafael Zalamena <rzalamena@opensourcerouting.org>
Mon, 30 Dec 2024 19:55:12 +0000 (16:55 -0300)
committerRafael Zalamena <rzalamena@opensourcerouting.org>
Thu, 23 Jan 2025 17:37:09 +0000 (14:37 -0300)
Allow table-direct to be configured in different VRFs.

Signed-off-by: Rafael Zalamena <rzalamena@opensourcerouting.org>
bgpd/bgp_vty.c
bgpd/bgp_zebra.c

index 2b3e11929b46f2bcedffa12f3e1c56014eade86a..5b8858b133e94d95e4ff59eb2626d36d31441113 100644 (file)
@@ -17598,12 +17598,6 @@ DEFUN (bgp_redistribute_ipv4_ospf,
        if (strncmp(argv[idx_ospf_table]->arg, "o", 1) == 0)
                protocol = ZEBRA_ROUTE_OSPF;
        else {
-               if (bgp->vrf_id != VRF_DEFAULT) {
-                       vty_out(vty,
-                               "%% Only default BGP instance can use '%s'\n",
-                               argv[idx_ospf_table]->arg);
-                       return CMD_WARNING_CONFIG_FAILED;
-               }
                if (strncmp(argv[idx_ospf_table]->arg, "table-direct",
                            strlen("table-direct")) == 0) {
                        protocol = ZEBRA_ROUTE_TABLE_DIRECT;
@@ -17657,12 +17651,6 @@ DEFUN (bgp_redistribute_ipv4_ospf_rmap,
        if (strncmp(argv[idx_ospf_table]->arg, "o", 1) == 0)
                protocol = ZEBRA_ROUTE_OSPF;
        else {
-               if (bgp->vrf_id != VRF_DEFAULT) {
-                       vty_out(vty,
-                               "%% Only default BGP instance can use '%s'\n",
-                               argv[idx_ospf_table]->arg);
-                       return CMD_WARNING_CONFIG_FAILED;
-               }
                if (strncmp(argv[idx_ospf_table]->arg, "table-direct",
                            strlen("table-direct")) == 0) {
                        protocol = ZEBRA_ROUTE_TABLE_DIRECT;
@@ -17720,12 +17708,6 @@ DEFUN (bgp_redistribute_ipv4_ospf_metric,
        if (strncmp(argv[idx_ospf_table]->arg, "o", 1) == 0)
                protocol = ZEBRA_ROUTE_OSPF;
        else {
-               if (bgp->vrf_id != VRF_DEFAULT) {
-                       vty_out(vty,
-                               "%% Only default BGP instance can use '%s'\n",
-                               argv[idx_ospf_table]->arg);
-                       return CMD_WARNING_CONFIG_FAILED;
-               }
                if (strncmp(argv[idx_ospf_table]->arg, "table-direct",
                            strlen("table-direct")) == 0) {
                        protocol = ZEBRA_ROUTE_TABLE_DIRECT;
@@ -17790,12 +17772,6 @@ DEFUN (bgp_redistribute_ipv4_ospf_rmap_metric,
        if (strncmp(argv[idx_ospf_table]->arg, "o", 1) == 0)
                protocol = ZEBRA_ROUTE_OSPF;
        else {
-               if (bgp->vrf_id != VRF_DEFAULT) {
-                       vty_out(vty,
-                               "%% Only default BGP instance can use '%s'\n",
-                               argv[idx_ospf_table]->arg);
-                       return CMD_WARNING_CONFIG_FAILED;
-               }
                if (strncmp(argv[idx_ospf_table]->arg, "table-direct",
                            strlen("table-direct")) == 0) {
                        protocol = ZEBRA_ROUTE_TABLE_DIRECT;
@@ -17865,13 +17841,7 @@ DEFUN (bgp_redistribute_ipv4_ospf_metric_rmap,
        if (strncmp(argv[idx_ospf_table]->arg, "o", 1) == 0)
                protocol = ZEBRA_ROUTE_OSPF;
        else {
-               if (bgp->vrf_id != VRF_DEFAULT) {
-                       vty_out(vty,
-                               "%% Only default BGP instance can use '%s'\n",
-                               argv[idx_ospf_table]->arg);
-                       return CMD_WARNING_CONFIG_FAILED;
-               } else if (strncmp(argv[idx_ospf_table]->arg, "table-direct",
-                                  strlen("table-direct")) == 0) {
+               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) {
@@ -17934,12 +17904,6 @@ DEFUN (no_bgp_redistribute_ipv4_ospf,
        if (strncmp(argv[idx_ospf_table]->arg, "o", 1) == 0)
                protocol = ZEBRA_ROUTE_OSPF;
        else {
-               if (bgp->vrf_id != VRF_DEFAULT) {
-                       vty_out(vty,
-                               "%% Only default BGP instance can use '%s'\n",
-                               argv[idx_ospf_table]->arg);
-                       return CMD_WARNING_CONFIG_FAILED;
-               }
                if (strncmp(argv[idx_ospf_table]->arg, "table-direct",
                            strlen("table-direct")) == 0) {
                        protocol = ZEBRA_ROUTE_TABLE_DIRECT;
index 8e8616c1557c7caf2d0f130c807c07fe54548fca..3d7481f6302194624456845e0aab4e20f02dc9fb 100644 (file)
@@ -2042,11 +2042,22 @@ int bgp_redistribute_set(struct bgp *bgp, afi_t afi, int type,
 
        /* Return if already redistribute flag is set. */
        if (instance) {
-               if (redist_check_instance(&zclient->mi_redist[afi][type],
-                                         instance))
-                       return CMD_WARNING;
+               if (type == ZEBRA_ROUTE_TABLE_DIRECT) {
+                       struct redist_table_direct table = {
+                               .table_id = instance,
+                               .vrf_id = bgp->vrf_id,
+                       };
+                       if (redist_lookup_table_direct(&zclient->mi_redist[afi][type], &table) !=
+                           NULL)
+                               return CMD_WARNING;
+
+                       redist_add_table_direct(&zclient->mi_redist[afi][type], &table);
+               } else {
+                       if (redist_check_instance(&zclient->mi_redist[afi][type], instance))
+                               return CMD_WARNING;
 
-               redist_add_instance(&zclient->mi_redist[afi][type], instance);
+                       redist_add_instance(&zclient->mi_redist[afi][type], instance);
+               }
        } else {
                if (vrf_bitmap_check(&zclient->redist[afi][type], bgp->vrf_id))
                        return CMD_WARNING;
@@ -2174,10 +2185,22 @@ int bgp_redistribute_unreg(struct bgp *bgp, afi_t afi, int type,
 
        /* Return if zebra connection is disabled. */
        if (instance) {
-               if (!redist_check_instance(&zclient->mi_redist[afi][type],
-                                          instance))
-                       return CMD_WARNING;
-               redist_del_instance(&zclient->mi_redist[afi][type], instance);
+               if (type == ZEBRA_ROUTE_TABLE_DIRECT) {
+                       struct redist_table_direct table = {
+                               .table_id = instance,
+                               .vrf_id = bgp->vrf_id,
+                       };
+                       if (redist_lookup_table_direct(&zclient->mi_redist[afi][type], &table) ==
+                           NULL)
+                               return CMD_WARNING;
+
+                       redist_del_table_direct(&zclient->mi_redist[afi][type], &table);
+               } else {
+                       if (!redist_check_instance(&zclient->mi_redist[afi][type], instance))
+                               return CMD_WARNING;
+
+                       redist_del_instance(&zclient->mi_redist[afi][type], instance);
+               }
        } else {
                if (!vrf_bitmap_check(&zclient->redist[afi][type], bgp->vrf_id))
                        return CMD_WARNING;