]> git.proxmox.com Git - mirror_frr.git/blobdiff - lib/vrf.c
Merge pull request #12798 from donaldsharp/rib_match_multicast
[mirror_frr.git] / lib / vrf.c
index b5f06048b784144852d10018ba06342db3edc027..a60f532f41c3c70db1361e540bbb14e5bedf28e6 100644 (file)
--- a/lib/vrf.c
+++ b/lib/vrf.c
@@ -1,22 +1,7 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
 /*
  * VRF functions.
  * Copyright (C) 2014 6WIND S.A.
- *
- * This file is part of GNU Zebra.
- *
- * GNU Zebra is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published
- * by the Free Software Foundation; either version 2, or (at your
- * option) any later version.
- *
- * GNU Zebra is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; see the file COPYING; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <zebra.h>
@@ -69,7 +54,6 @@ static struct vrf_master {
        int (*vrf_delete_hook)(struct vrf *);
        int (*vrf_enable_hook)(struct vrf *);
        int (*vrf_disable_hook)(struct vrf *);
-       int (*vrf_update_name_hook)(struct vrf *vrf);
 } vrf_master = {
        0,
 };
@@ -176,8 +160,6 @@ struct vrf *vrf_get(vrf_id_t vrf_id, const char *name)
                        name, NS_NAMSIZ);
                strlcpy(vrf->name, name, sizeof(vrf->name));
                RB_INSERT(vrf_name_head, &vrfs_by_name, vrf);
-               if (vrf->vrf_id == VRF_DEFAULT)
-                       vrf_set_default_name(vrf->name, false);
        } else if (name && vrf->name[0] == '\0') {
                strlcpy(vrf->name, name, sizeof(vrf->name));
                RB_INSERT(vrf_name_head, &vrfs_by_name, vrf);
@@ -487,8 +469,7 @@ static const struct cmd_variable_handler vrf_var_handlers[] = {
 
 /* Initialize VRF module. */
 void vrf_init(int (*create)(struct vrf *), int (*enable)(struct vrf *),
-             int (*disable)(struct vrf *), int (*destroy)(struct vrf *),
-             int ((*update)(struct vrf *)))
+             int (*disable)(struct vrf *), int (*destroy)(struct vrf *))
 {
        struct vrf *default_vrf;
 
@@ -501,7 +482,6 @@ void vrf_init(int (*create)(struct vrf *), int (*enable)(struct vrf *),
        vrf_master.vrf_enable_hook = enable;
        vrf_master.vrf_disable_hook = disable;
        vrf_master.vrf_delete_hook = destroy;
-       vrf_master.vrf_update_name_hook = update;
 
        /* The default VRF always exists. */
        default_vrf = vrf_get(VRF_DEFAULT, VRF_DEFAULT_NAME);
@@ -533,6 +513,7 @@ void vrf_init(int (*create)(struct vrf *), int (*enable)(struct vrf *),
 static void vrf_terminate_single(struct vrf *vrf)
 {
        /* Clear configured flag and invoke delete. */
+       vrf_disable(vrf);
        UNSET_FLAG(vrf->status, VRF_CONFIGURED);
        if_terminate(vrf);
        vrf_delete(vrf);
@@ -562,7 +543,8 @@ void vrf_terminate(void)
 
        /* Finally terminate default VRF */
        vrf = vrf_lookup_by_id(VRF_DEFAULT);
-       vrf_terminate_single(vrf);
+       if (vrf)
+               vrf_terminate_single(vrf);
 }
 
 int vrf_socket(int domain, int type, int protocol, vrf_id_t vrf_id,
@@ -613,7 +595,7 @@ int vrf_configure_backend(enum vrf_backend_type backend)
        case VRF_BACKEND_NETNS:
        case VRF_BACKEND_VRF_LITE:
                break;
-       default:
+       case VRF_BACKEND_MAX:
                return -1;
        }
 
@@ -655,7 +637,7 @@ DEFUN_YANG_NOSH (vrf,
        snprintf(xpath_list, sizeof(xpath_list), FRR_VRF_KEY_XPATH, vrfname);
 
        nb_cli_enqueue_change(vty, xpath_list, NB_OP_CREATE, NULL);
-       ret = nb_cli_apply_changes_clear_pending(vty, xpath_list);
+       ret = nb_cli_apply_changes_clear_pending(vty, "%s", xpath_list);
        if (ret == CMD_SUCCESS) {
                VTY_PUSH_XPATH(VRF_NODE, xpath_list);
                vrf = vrf_lookup_by_name(vrfname);
@@ -773,33 +755,9 @@ void vrf_cmd_init(int (*writefunc)(struct vty *vty))
        install_element(VRF_NODE, &vrf_exit_cmd);
 }
 
-void vrf_set_default_name(const char *default_name, bool force)
+void vrf_set_default_name(const char *default_name)
 {
-       struct vrf *def_vrf;
-       static bool def_vrf_forced;
-
-       def_vrf = vrf_lookup_by_id(VRF_DEFAULT);
-       assert(default_name);
-       if (def_vrf && !force && def_vrf_forced) {
-               zlog_debug("VRF: %s, avoid changing name to %s, previously forced (%u)",
-                          def_vrf->name, default_name,
-                          def_vrf->vrf_id);
-               return;
-       }
-       if (strmatch(vrf_default_name, default_name))
-               return;
        snprintf(vrf_default_name, VRF_NAMSIZ, "%s", default_name);
-       if (def_vrf) {
-               if (force)
-                       def_vrf_forced = true;
-               RB_REMOVE(vrf_name_head, &vrfs_by_name, def_vrf);
-               strlcpy(def_vrf->data.l.netns_name,
-                       vrf_default_name, NS_NAMSIZ);
-               strlcpy(def_vrf->name, vrf_default_name, sizeof(def_vrf->name));
-               RB_INSERT(vrf_name_head, &vrfs_by_name, def_vrf);
-               if (vrf_master.vrf_update_name_hook)
-                       (*vrf_master.vrf_update_name_hook)(def_vrf);
-       }
 }
 
 const char *vrf_get_default_name(void)
@@ -1027,8 +985,7 @@ lib_vrf_state_active_get_elem(struct nb_cb_get_elem_args *args)
        struct vrf *vrfp = (struct vrf *)args->list_entry;
 
        if (vrfp->status == VRF_ACTIVE)
-               return yang_data_new_bool(
-                       args->xpath, vrfp->status == VRF_ACTIVE ? true : false);
+               return yang_data_new_bool(args->xpath, true);
 
        return NULL;
 }