]> git.proxmox.com Git - mirror_frr.git/commitdiff
bgpd: handle vrf aliases in vty API
authorPhilippe Guibert <philippe.guibert@6wind.com>
Thu, 31 May 2018 08:12:11 +0000 (10:12 +0200)
committerPhilippe Guibert <philippe.guibert@6wind.com>
Tue, 28 Aug 2018 14:23:50 +0000 (16:23 +0200)
Because a VRF name can be used for default VRF, or an alias of an
already created VRF can be passed as parameter, the default VRF name
must be found out. This avoids creating double BGP instances for
example.

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

index 2308a32a23dd435c0a626da860e96df457f2bc79..e0834604b2f021369681587bbf91d88dc9ec6bcf 100644 (file)
@@ -266,6 +266,12 @@ static int bgp_vrf_enable(struct vrf *vrf)
 
        bgp = bgp_lookup_by_name(vrf->name);
        if (bgp) {
+               if (bgp->name && strmatch(vrf->name, VRF_DEFAULT_NAME)) {
+                       XFREE(MTYPE_BGP, bgp->name);
+                       bgp->name = NULL;
+                       XFREE(MTYPE_BGP, bgp->name_pretty);
+                       bgp->name_pretty = XSTRDUP(MTYPE_BGP, "VRF default");
+               }
                old_vrf_id = bgp->vrf_id;
                /* We have instance configured, link to VRF and make it "up". */
                bgp_vrf_link(bgp, vrf);
index 1460a26215bbbd66b6ac2e1598e043dee0165a53..99c6f3923004fd02645759eced1018b6dbd2c63b 100644 (file)
@@ -312,10 +312,14 @@ int bgp_vty_find_and_parse_afi_safi_bgp(struct vty *vty,
        if (argv_find(argv, argc, "ip", idx))
                *afi = AFI_IP;
 
-       if (argv_find(argv, argc, "view", idx)
-           || argv_find(argv, argc, "vrf", idx)) {
+       if (argv_find(argv, argc, "view", idx))
                vrf_name = argv[*idx + 1]->arg;
-
+       else if (argv_find(argv, argc, "vrf", idx)) {
+               vrf_name = argv[*idx + 1]->arg;
+               if (strmatch(vrf_name, VRF_DEFAULT_NAME))
+                       vrf_name = NULL;
+       }
+       if (vrf_name) {
                if (strmatch(vrf_name, "all"))
                        *bgp = NULL;
                else {
@@ -910,9 +914,12 @@ DEFUN_NOSH (router_bgp,
                if (argc > 3) {
                        name = argv[idx_vrf]->arg;
 
-                       if (!strcmp(argv[idx_view_vrf]->text, "vrf"))
-                               inst_type = BGP_INSTANCE_TYPE_VRF;
-                       else if (!strcmp(argv[idx_view_vrf]->text, "view"))
+                       if (!strcmp(argv[idx_view_vrf]->text, "vrf")) {
+                               if (strmatch(name, VRF_DEFAULT_NAME))
+                                       name = NULL;
+                               else
+                                       inst_type = BGP_INSTANCE_TYPE_VRF;
+                       } else if (!strcmp(argv[idx_view_vrf]->text, "view"))
                                inst_type = BGP_INSTANCE_TYPE_VIEW;
                }
 
@@ -7144,13 +7151,17 @@ DEFUN (clear_ip_bgp_all,
        if (argv_find(argv, argc, "ip", &idx))
                afi = AFI_IP;
 
-       /* [<view|vrf> VIEWVRFNAME] */
-       if (argv_find(argv, argc, "view", &idx)
-           || argv_find(argv, argc, "vrf", &idx)) {
+       /* [<vrf> VIEWVRFNAME] */
+       if (argv_find(argv, argc, "vrf", &idx)) {
+               vrf = argv[idx + 1]->arg;
+               idx += 2;
+               if (vrf && strmatch(vrf, VRF_DEFAULT_NAME))
+                       vrf = NULL;
+       } else if (argv_find(argv, argc, "view", &idx)) {
+               /* [<view> VIEWVRFNAME] */
                vrf = argv[idx + 1]->arg;
                idx += 2;
        }
-
        /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
        if (argv_find_and_parse_afi(argv, argc, &idx, &afi))
                argv_find_and_parse_safi(argv, argc, &idx, &safi);
@@ -7215,8 +7226,16 @@ DEFUN (clear_ip_bgp_prefix,
        int idx = 0;
 
        /* [<view|vrf> VIEWVRFNAME] */
-       if (argv_find(argv, argc, "VIEWVRFNAME", &idx))
-               vrf = argv[idx]->arg;
+       if (argv_find(argv, argc, "vrf", &idx)) {
+               vrf = argv[idx + 1]->arg;
+               idx += 2;
+               if (vrf && strmatch(vrf, VRF_DEFAULT_NAME))
+                       vrf = NULL;
+       } else if (argv_find(argv, argc, "view", &idx)) {
+               /* [<view> VIEWVRFNAME] */
+               vrf = argv[idx + 1]->arg;
+               idx += 2;
+       }
 
        prefix = argv[argc - 1]->arg;
 
@@ -7258,16 +7277,23 @@ DEFUN (clear_bgp_instance_ipv6_safi_prefix,
        "Clear bestpath and re-advertise\n"
        "IPv6 prefix\n")
 {
-       int idx_word = 3;
        int idx_safi = 0;
+       int idx_vrfview = 0;
        int idx_ipv6_prefix = 0;
        safi_t safi = SAFI_UNICAST;
        char *prefix = argv_find(argv, argc, "X:X::X:X/M", &idx_ipv6_prefix) ?
                argv[idx_ipv6_prefix]->arg : NULL;
-       /* [<view|vrf> VIEWVRFNAME] */
-       char *vrfview = argv_find(argv, argc, "VIEWVRFNAME", &idx_word) ?
-               argv[idx_word]->arg : NULL;
+       char *vrfview = NULL;
 
+       /* [<view|vrf> VIEWVRFNAME] */
+       if (argv_find(argv, argc, "vrf", &idx_vrfview)) {
+               vrfview = argv[idx_vrfview + 1]->arg;
+               if (vrfview && strmatch(vrfview, VRF_DEFAULT_NAME))
+                       vrfview = NULL;
+       } else if (argv_find(argv, argc, "view", &idx_vrfview)) {
+               /* [<view> VIEWVRFNAME] */
+               vrfview = argv[idx_vrfview + 1]->arg;
+       }
        argv_find_and_parse_safi(argv, argc, &idx_safi, &safi);
 
        return bgp_clear_prefix(
@@ -7458,10 +7484,18 @@ DEFUN(show_bgp_martian_nexthop_db, show_bgp_martian_nexthop_db_cmd,
 {
        struct bgp *bgp = NULL;
        int idx = 0;
-
-       if (argv_find(argv, argc, "view", &idx)
-           || argv_find(argv, argc, "vrf", &idx))
-               bgp = bgp_lookup_by_name(argv[idx + 1]->arg);
+       char *name = NULL;
+
+       /* [<vrf> VIEWVRFNAME] */
+       if (argv_find(argv, argc, "vrf", &idx)) {
+               name = argv[idx + 1]->arg;
+               if (name && strmatch(name, VRF_DEFAULT_NAME))
+                       name = NULL;
+       } else if (argv_find(argv, argc, "view", &idx))
+               /* [<view> VIEWVRFNAME] */
+               name = argv[idx + 1]->arg;
+       if (name)
+               bgp = bgp_lookup_by_name(name);
        else
                bgp = bgp_get_default();
 
@@ -8211,10 +8245,14 @@ DEFUN (show_ip_bgp_summary,
        /* show [ip] bgp */
        if (argv_find(argv, argc, "ip", &idx))
                afi = AFI_IP;
-       /* [<view|vrf> VIEWVRFNAME] */
-       if (argv_find(argv, argc, "view", &idx)
-           || argv_find(argv, argc, "vrf", &idx))
-               vrf = argv[++idx]->arg;
+       /* [<vrf> VIEWVRFNAME] */
+       if (argv_find(argv, argc, "vrf", &idx)) {
+               vrf = argv[idx + 1]->arg;
+               if (vrf && strmatch(vrf, VRF_DEFAULT_NAME))
+                       vrf = NULL;
+       } else if (argv_find(argv, argc, "view", &idx))
+               /* [<view> VIEWVRFNAME] */
+               vrf = argv[idx + 1]->arg;
        /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
        if (argv_find_and_parse_afi(argv, argc, &idx, &afi)) {
                argv_find_and_parse_safi(argv, argc, &idx, &safi);
@@ -10888,8 +10926,13 @@ DEFUN (show_ip_bgp_neighbors,
 
        int idx = 0;
 
-       if (argv_find(argv, argc, "view", &idx)
-           || argv_find(argv, argc, "vrf", &idx))
+       /* [<vrf> VIEWVRFNAME] */
+       if (argv_find(argv, argc, "vrf", &idx)) {
+               vrf = argv[idx + 1]->arg;
+               if (vrf && strmatch(vrf, VRF_DEFAULT_NAME))
+                       vrf = NULL;
+       } else if (argv_find(argv, argc, "view", &idx))
+               /* [<view> VIEWVRFNAME] */
                vrf = argv[idx + 1]->arg;
 
        idx++;
@@ -11183,8 +11226,11 @@ DEFUN (show_ip_bgp_route_leak,
                return CMD_WARNING;
        }
 
-       if (argv_find(argv, argc, "vrf", &idx))
-               vrf = argv[++idx]->arg;
+       if (argv_find(argv, argc, "vrf", &idx)) {
+               vrf = argv[idx + 1]->arg;
+               if (vrf && strmatch(vrf, VRF_DEFAULT_NAME))
+                       vrf = NULL;
+       }
        /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
        if (argv_find_and_parse_afi(argv, argc, &idx, &afi)) {
                argv_find_and_parse_safi(argv, argc, &idx, &safi);
@@ -11257,10 +11303,14 @@ DEFUN (show_ip_bgp_updgrps,
        /* show [ip] bgp */
        if (argv_find(argv, argc, "ip", &idx))
                afi = AFI_IP;
-       /* [<view|vrf> VIEWVRFNAME] */
-       if (argv_find(argv, argc, "view", &idx)
-           || argv_find(argv, argc, "vrf", &idx))
-               vrf = argv[++idx]->arg;
+       /* [<vrf> VIEWVRFNAME] */
+       if (argv_find(argv, argc, "vrf", &idx)) {
+               vrf = argv[idx + 1]->arg;
+               if (vrf && strmatch(vrf, VRF_DEFAULT_NAME))
+                       vrf = NULL;
+       } else if (argv_find(argv, argc, "view", &idx))
+               /* [<view> VIEWVRFNAME] */
+               vrf = argv[idx + 1]->arg;
        /* ["BGP_AFI_CMD_STR" ["BGP_SAFI_CMD_STR"]] */
        if (argv_find_and_parse_afi(argv, argc, &idx, &afi)) {
                argv_find_and_parse_safi(argv, argc, &idx, &safi);