#include "table.h"
#include "log.h"
#include "memory.h"
+#include "command.h"
+
+/*
+ * Turn on/off debug code
+ * for vrf.
+ */
+int debug_vrf = 0;
/* Holding VRF hooks */
struct vrf_master
if (vrf_list_lookup_by_name (vrf->name) == NULL)
listnode_add_sort (vrf_list, vrf);
}
+ if (debug_vrf)
+ zlog_debug ("VRF(%u) %s Found %p", vrf_id, (name) ? name : "(NULL)",
+ vrf);
}
else
{
if (name)
vrf = vrf_get_by_name(name);
- if (!vrf)
- vrf = XCALLOC (MTYPE_VRF, sizeof (struct vrf));
-
+ if (vrf)
+ {
+ if (debug_vrf)
+ zlog_debug ("VRF(%u) %s lookup by name is successful",
+ vrf_id, (name) ? name : "(NULL)");
+ }
+ else
+ {
+ vrf = XCALLOC (MTYPE_VRF, sizeof (struct vrf));
+ if (debug_vrf)
+ zlog_debug ("VRF(%u) %s is created.",
+ vrf_id, (name) ? name : "(NULL)");
+ }
vrf->vrf_id = vrf_id;
rn->info = vrf;
vrf->node = rn;
if_init (vrf_id, &vrf->iflist);
}
- if (name)
- zlog_info ("VRF %s with id %u is created.", name, vrf_id);
- else
- zlog_info ("VRF %u is created.", vrf_id);
-
if (vrf_master.vrf_new_hook && name) {
(*vrf_master.vrf_new_hook) (vrf_id, name, &vrf->info);
void
vrf_delete (struct vrf *vrf)
{
- zlog_info ("VRF %u is to be deleted.", vrf->vrf_id);
+ if (debug_vrf)
+ zlog_debug ("VRF %u is to be deleted.", vrf->vrf_id);
if (vrf_is_enabled (vrf))
vrf_disable (vrf);
// /* Till now, only the default VRF can be enabled. */
// if (vrf->vrf_id == VRF_DEFAULT)
// {
- zlog_info ("VRF %u is enabled.", vrf->vrf_id);
+ if (debug_vrf)
+ zlog_debug ("VRF %u is enabled.", vrf->vrf_id);
if (vrf_master.vrf_enable_hook)
(*vrf_master.vrf_enable_hook) (vrf->vrf_id, vrf->name, &vrf->info);
{
if (vrf_is_enabled (vrf))
{
- zlog_info ("VRF %u is to be disabled.", vrf->vrf_id);
+ if (debug_vrf)
+ zlog_debug ("VRF %u is to be disabled.", vrf->vrf_id);
/* Till now, nothing to be done for the default VRF. */
//Pending: see why this statement.
void
vrf_add_hook (int type, int (*func)(vrf_id_t, const char *, void **))
{
+ if (debug_vrf)
+ zlog_debug ("%s: Add Hook %d to function %p", __PRETTY_FUNCTION__,
+ type, func);
+
switch (type) {
case VRF_NEW_HOOK:
vrf_master.vrf_new_hook = func;
{
struct vrf *default_vrf;
+ if (debug_vrf)
+ zlog_debug ("%s: Initializing VRF subsystem", __PRETTY_FUNCTION__);
+
vrf_list = list_new ();
vrf_list->cmp = (int (*)(void *, void *))vrf_cmp_func;
struct route_node *rn;
struct vrf *vrf;
+ if (debug_vrf)
+ zlog_debug ("%s: Shutting down vrf subsystem", __PRETTY_FUNCTION__);
+
for (rn = route_top (vrf_table); rn; rn = route_next (rn))
if ((vrf = rn->info) != NULL)
vrf_delete (vrf);
{
int ret = -1;
- ret = socket (domain, type, protocol);
+ ret = socket (domain, type, protocol);
return ret;
}
+/*
+ * Debug CLI for vrf's
+ */
+DEFUN (vrf_debug,
+ vrf_debug_cmd,
+ "debug vrf",
+ DEBUG_STR
+ "VRF Debugging\n")
+{
+ debug_vrf = 1;
+
+ return CMD_SUCCESS;
+}
+
+DEFUN (no_vrf_debug,
+ no_vrf_debug_cmd,
+ "no debug vrf",
+ NO_STR
+ DEBUG_STR
+ "VRF Debugging\n")
+{
+ debug_vrf = 0;
+
+ return CMD_SUCCESS;
+}
+
+static int
+vrf_write_host (struct vty *vty)
+{
+ if (debug_vrf)
+ vty_out (vty, "debug vrf%s", VTY_NEWLINE);
+
+ return 1;
+}
+
+static struct cmd_node vrf_debug_node =
+{
+ VRF_DEBUG_NODE,
+ "",
+ 1
+};
+
+void
+vrf_install_commands (void)
+{
+ install_node (&vrf_debug_node, vrf_write_host);
+
+ install_element (CONFIG_NODE, &vrf_debug_cmd);
+ install_element (ENABLE_NODE, &vrf_debug_cmd);
+ install_element (CONFIG_NODE, &no_vrf_debug_cmd);
+ install_element (ENABLE_NODE, &no_vrf_debug_cmd);
+}
config = config_get (FORWARDING_NODE, line);
else if (strncmp (line, "service", strlen ("service")) == 0)
config = config_get (SERVICE_NODE, line);
+ else if (strncmp (line, "debug vrf", strlen ("debug vrf")) == 0)
+ config = config_get (VRF_DEBUG_NODE, line);
else if (strncmp (line, "debug", strlen ("debug")) == 0)
config = config_get (DEBUG_NODE, line);
else if (strncmp (line, "password", strlen ("password")) == 0
|| (I) == AS_LIST_NODE || (I) == COMMUNITY_LIST_NODE || \
(I) == ACCESS_IPV6_NODE || (I) == PREFIX_IPV6_NODE \
|| (I) == SERVICE_NODE || (I) == FORWARDING_NODE || (I) == DEBUG_NODE \
- || (I) == AAA_NODE)
+ || (I) == AAA_NODE || (I) == VRF_DEBUG_NODE)
/* Display configuration to file pointer. */
void