]> git.puffer.fish Git - matthieu/frr.git/commitdiff
bgpd: vrf-policy add prefix lists and route-maps on export
authorLou Berger <lberger@labn.net>
Mon, 9 Oct 2017 19:20:19 +0000 (15:20 -0400)
committerLou Berger <lberger@labn.net>
Tue, 31 Oct 2017 15:06:17 +0000 (11:06 -0400)
Signed-off-by: Lou Berger <lberger@labn.net>
bgpd/rfapi/bgp_rfapi_cfg.c

index e82ca3bbbef86b805de8f80bc06c093391212445..9fc3a8af87a03b197a5637ea58d2b3837c234698 100644 (file)
@@ -32,6 +32,7 @@
 #include "bgpd/bgp_route.h"
 #include "bgpd/bgp_mplsvpn.h"
 
+#include "bgpd/bgp_vty.h"
 #include "bgpd/bgp_ecommunity.h"
 #include "bgpd/rfapi/rfapi.h"
 #include "bgpd/rfapi/bgp_rfapi_cfg.h"
@@ -1602,6 +1603,8 @@ DEFUN (vnc_nve_group_export_no_prefixlist,
 {
        VTY_DECLVAR_CONTEXT(bgp, bgp);
        VTY_DECLVAR_CONTEXT_SUB(rfapi_nve_group_cfg, rfg);
+       int idx = 0;
+       int is_bgp = 1;
        afi_t afi;
 
        VNC_VTY_CONFIG_CHECK(bgp);
@@ -1613,17 +1616,15 @@ DEFUN (vnc_nve_group_export_no_prefixlist,
                return CMD_WARNING_CONFIG_FAILED;
        }
 
-       if (strmatch(argv[3]->text, "ipv4")) {
-               afi = AFI_IP;
-       } else {
-               afi = AFI_IP6;
-       }
-
-       if (argv[2]->arg[0] == 'b') {
-               if (((argc > 5) && strmatch(argv[5]->text,
-                                           rfg->plist_export_bgp_name[afi]))
-                   || (argc <= 5)) {
+       argv_find_and_parse_afi(argv, argc, &idx, &afi);
+       if (argv[idx-1]->text[0] == 'z')
+               is_bgp = 0;
+       idx += 2;               /* skip afi and keyword */
 
+       if (is_bgp) {
+               if (idx == argc ||
+                   strmatch(argv[idx]->arg,
+                            rfg->plist_export_bgp_name[afi])) {
                        if (rfg->plist_export_bgp_name[afi])
                                free(rfg->plist_export_bgp_name[afi]);
                        rfg->plist_export_bgp_name[afi] = NULL;
@@ -1632,9 +1633,9 @@ DEFUN (vnc_nve_group_export_no_prefixlist,
                        vnc_direct_bgp_reexport_group_afi(bgp, rfg, afi);
                }
        } else {
-               if (((argc > 5) && strmatch(argv[5]->text,
-                                           rfg->plist_export_zebra_name[afi]))
-                   || (argc <= 5)) {
+               if (idx == argc ||
+                   strmatch(argv[idx]->arg,
+                            rfg->plist_export_zebra_name[afi])) {
                        if (rfg->plist_export_zebra_name[afi])
                                free(rfg->plist_export_zebra_name[afi]);
                        rfg->plist_export_zebra_name[afi] = NULL;
@@ -1646,6 +1647,15 @@ DEFUN (vnc_nve_group_export_no_prefixlist,
        return CMD_SUCCESS;
 }
 
+ALIAS (vnc_nve_group_export_no_prefixlist,
+       vnc_vrf_policy_export_no_prefixlist_cmd,
+       "no export <ipv4|ipv6> prefix-list [NAME]",
+       NO_STR
+       "Export to VRF\n"
+       "IPv4 routes\n"
+       "IPv6 routes\n"
+       "Prefix-list for filtering exported routes\n" "prefix list name\n")
+
 DEFUN (vnc_nve_group_export_prefixlist,
        vnc_nve_group_export_prefixlist_cmd,
        "export <bgp|zebra> <ipv4|ipv6> prefix-list NAME",
@@ -1658,6 +1668,8 @@ DEFUN (vnc_nve_group_export_prefixlist,
 {
        VTY_DECLVAR_CONTEXT(bgp, bgp);
        VTY_DECLVAR_CONTEXT_SUB(rfapi_nve_group_cfg, rfg);
+       int idx = 0;
+       int is_bgp = 1;
        afi_t afi;
 
        VNC_VTY_CONFIG_CHECK(bgp);
@@ -1669,33 +1681,40 @@ DEFUN (vnc_nve_group_export_prefixlist,
                return CMD_WARNING_CONFIG_FAILED;
        }
 
-       if (strmatch(argv[2]->text, "ipv4")) {
-               afi = AFI_IP;
-       } else {
-               afi = AFI_IP6;
-       }
+       argv_find_and_parse_afi(argv, argc, &idx, &afi);
+       if (argv[idx-1]->text[0] == 'z')
+               is_bgp = 0;
+       idx = argc - 1;
 
-       if (argv[1]->arg[0] == 'b') {
+       if (is_bgp) {
                if (rfg->plist_export_bgp_name[afi])
                        free(rfg->plist_export_bgp_name[afi]);
-               rfg->plist_export_bgp_name[afi] = strdup(argv[4]->arg);
+               rfg->plist_export_bgp_name[afi] = strdup(argv[idx]->arg);
                rfg->plist_export_bgp[afi] =
-                       prefix_list_lookup(afi, argv[4]->arg);
+                       prefix_list_lookup(afi, argv[idx]->arg);
 
                vnc_direct_bgp_reexport_group_afi(bgp, rfg, afi);
 
        } else {
                if (rfg->plist_export_zebra_name[afi])
                        free(rfg->plist_export_zebra_name[afi]);
-               rfg->plist_export_zebra_name[afi] = strdup(argv[4]->arg);
+               rfg->plist_export_zebra_name[afi] = strdup(argv[idx]->arg);
                rfg->plist_export_zebra[afi] =
-                       prefix_list_lookup(afi, argv[4]->arg);
+                       prefix_list_lookup(afi, argv[idx]->arg);
 
                vnc_zebra_reexport_group_afi(bgp, rfg, afi);
        }
        return CMD_SUCCESS;
 }
 
+ALIAS (vnc_nve_group_export_prefixlist,
+       vnc_vrf_policy_export_prefixlist_cmd,
+       "export <ipv4|ipv6> prefix-list NAME",
+       "Export to VRF\n"
+       "IPv4 routes\n"
+       "IPv6 routes\n"
+       "Prefix-list for filtering exported routes\n" "prefix list name\n")
+
 DEFUN (vnc_nve_group_export_no_routemap,
        vnc_nve_group_export_no_routemap_cmd,
        "no export <bgp|zebra> route-map [NAME]",
@@ -1707,6 +1726,8 @@ DEFUN (vnc_nve_group_export_no_routemap,
 {
        VTY_DECLVAR_CONTEXT(bgp, bgp);
        VTY_DECLVAR_CONTEXT_SUB(rfapi_nve_group_cfg, rfg);
+       int idx = 2;
+       int is_bgp = 1;
 
        VNC_VTY_CONFIG_CHECK(bgp);
 
@@ -1716,12 +1737,21 @@ DEFUN (vnc_nve_group_export_no_routemap,
                vty_out(vty, "Current NVE group no longer exists\n");
                return CMD_WARNING_CONFIG_FAILED;
        }
+       switch (argv[idx]->text[0]) {
+       case 'z':
+               is_bgp = 0;
+               /* fall thru */
+       case 'b':
+               idx +=2;
+               break;
+       default:                /* route-map */
+               idx++;
+               break;
+       }
 
-       if (argv[2]->arg[0] == 'b') {
-               if (((argc > 4)
-                    && strmatch(argv[4]->text, rfg->routemap_export_bgp_name))
-                   || (argc <= 4)) {
-
+       if (is_bgp) {
+               if (idx == argc ||
+                   strmatch(argv[idx]->arg, rfg->routemap_export_bgp_name)) {
                        if (rfg->routemap_export_bgp_name)
                                free(rfg->routemap_export_bgp_name);
                        rfg->routemap_export_bgp_name = NULL;
@@ -1731,9 +1761,9 @@ DEFUN (vnc_nve_group_export_no_routemap,
                        vnc_direct_bgp_reexport_group_afi(bgp, rfg, AFI_IP6);
                }
        } else {
-               if (((argc > 4) && strmatch(argv[4]->text,
-                                           rfg->routemap_export_zebra_name))
-                   || (argc <= 4)) {
+               if (idx == argc ||
+                   strmatch(argv[idx]->arg,
+                            rfg->routemap_export_zebra_name)) {
                        if (rfg->routemap_export_zebra_name)
                                free(rfg->routemap_export_zebra_name);
                        rfg->routemap_export_zebra_name = NULL;
@@ -1746,6 +1776,13 @@ DEFUN (vnc_nve_group_export_no_routemap,
        return CMD_SUCCESS;
 }
 
+ALIAS (vnc_nve_group_export_no_routemap,
+       vnc_vrf_policy_export_no_routemap_cmd,
+       "no export route-map [NAME]",
+       NO_STR
+       "Export to VRF\n"
+       "Route-map for filtering exported routes\n" "route map name\n")
+
 DEFUN (vnc_nve_group_export_routemap,
        vnc_nve_group_export_routemap_cmd,
        "export <bgp|zebra> route-map NAME",
@@ -1756,6 +1793,8 @@ DEFUN (vnc_nve_group_export_routemap,
 {
        VTY_DECLVAR_CONTEXT(bgp, bgp);
        VTY_DECLVAR_CONTEXT_SUB(rfapi_nve_group_cfg, rfg);
+       int idx = 0;
+       int is_bgp = 1;
 
        VNC_VTY_CONFIG_CHECK(bgp);
 
@@ -1766,26 +1805,36 @@ DEFUN (vnc_nve_group_export_routemap,
                return CMD_WARNING_CONFIG_FAILED;
        }
 
-       if (argv[1]->arg[0] == 'b') {
+       if (argv[1]->text[0] == 'z')
+               is_bgp = 0;
+       idx = argc - 1;
+
+       if (is_bgp) {
                if (rfg->routemap_export_bgp_name)
                        free(rfg->routemap_export_bgp_name);
-               rfg->routemap_export_bgp_name = strdup(argv[3]->arg);
+               rfg->routemap_export_bgp_name = strdup(argv[idx]->arg);
                rfg->routemap_export_bgp =
-                       route_map_lookup_by_name(argv[3]->arg);
+                       route_map_lookup_by_name(argv[idx]->arg);
                vnc_direct_bgp_reexport_group_afi(bgp, rfg, AFI_IP);
                vnc_direct_bgp_reexport_group_afi(bgp, rfg, AFI_IP6);
        } else {
                if (rfg->routemap_export_zebra_name)
                        free(rfg->routemap_export_zebra_name);
-               rfg->routemap_export_zebra_name = strdup(argv[3]->arg);
+               rfg->routemap_export_zebra_name = strdup(argv[idx]->arg);
                rfg->routemap_export_zebra =
-                       route_map_lookup_by_name(argv[3]->arg);
+                       route_map_lookup_by_name(argv[idx]->arg);
                vnc_zebra_reexport_group_afi(bgp, rfg, AFI_IP);
                vnc_zebra_reexport_group_afi(bgp, rfg, AFI_IP6);
        }
        return CMD_SUCCESS;
 }
 
+ALIAS (vnc_nve_group_export_routemap,
+       vnc_vrf_policy_export_routemap_cmd,
+       "export route-map NAME",
+       "Export to VRF\n"
+       "Route-map for filtering exported routes\n" "route map name\n")
+
 DEFUN (vnc_nve_export_no_prefixlist,
        vnc_nve_export_no_prefixlist_cmd,
        "no vnc export <bgp|zebra> <ipv4|ipv6> prefix-list [NAME]",
@@ -3687,6 +3736,14 @@ void bgp_rfapi_cfg_init(void)
        install_element(BGP_VRF_POLICY_NODE, &vnc_vrf_policy_rt_export_cmd);
        install_element(BGP_VRF_POLICY_NODE, &vnc_vrf_policy_rt_both_cmd);
        install_element(BGP_VRF_POLICY_NODE, &vnc_vrf_policy_rd_cmd);
+       install_element(BGP_VRF_POLICY_NODE,
+                       &vnc_vrf_policy_export_prefixlist_cmd);
+       install_element(BGP_VRF_POLICY_NODE,
+                       &vnc_vrf_policy_export_routemap_cmd);
+       install_element(BGP_VRF_POLICY_NODE,
+                       &vnc_vrf_policy_export_no_prefixlist_cmd);
+       install_element(BGP_VRF_POLICY_NODE,
+                       &vnc_vrf_policy_export_no_routemap_cmd);
        install_element(BGP_VRF_POLICY_NODE, &exit_vrf_policy_cmd);
 
        install_element(BGP_VNC_L2_GROUP_NODE, &vnc_l2_group_lni_cmd);
@@ -3880,14 +3937,16 @@ int bgp_rfapi_cfg_write(struct vty *vty, struct bgp *bgp)
 
                                if (rfg->plist_export_bgp_name[afi]) {
                                        vty_out(vty,
-                                               "  export bgp %s prefix-list %s\n",
+                                               "  export %s%s prefix-list %s\n",
+                                               (rfg->type == RFAPI_GROUP_CFG_VRF ? "" : "bgp "),
                                                afistr,
                                                rfg->plist_export_bgp_name
                                                        [afi]);
                                }
                                if (rfg->plist_export_zebra_name[afi]) {
                                        vty_out(vty,
-                                               "  export zebra %s prefix-list %s\n",
+                                               "  export %s%s prefix-list %s\n",
+                                               (rfg->type == RFAPI_GROUP_CFG_VRF ? "" : "zebra "),
                                                afistr,
                                                rfg->plist_export_zebra_name
                                                        [afi]);
@@ -3921,11 +3980,13 @@ int bgp_rfapi_cfg_write(struct vty *vty, struct bgp *bgp)
                        }
 
                        if (rfg->routemap_export_bgp_name) {
-                               vty_out(vty, "  export bgp route-map %s\n",
+                               vty_out(vty, "  export %sroute-map %s\n",
+                                       (rfg->type == RFAPI_GROUP_CFG_VRF ? "" : "bgp "),
                                        rfg->routemap_export_bgp_name);
                        }
                        if (rfg->routemap_export_zebra_name) {
-                               vty_out(vty, "  export zebra route-map %s\n",
+                               vty_out(vty, "  export %sroute-map %s\n",
+                                       (rfg->type == RFAPI_GROUP_CFG_VRF ? "" : "zebra "),
                                        rfg->routemap_export_zebra_name);
                        }
                        if (rfg->routemap_redist_name[ZEBRA_ROUTE_BGP_DIRECT]) {