+// 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>
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,
};
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);
/* 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;
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);
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);
/* 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,
case VRF_BACKEND_NETNS:
case VRF_BACKEND_VRF_LITE:
break;
- default:
+ case VRF_BACKEND_MAX:
return -1;
}
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);
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)
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;
}