From 31ddf3b7bef2d46a9fae2c55587d175adf0c83a6 Mon Sep 17 00:00:00 2001 From: Mark Stapp Date: Wed, 8 Jan 2020 14:13:42 -0500 Subject: [PATCH] staticd: add debug support Add initial debug support to staticd, using the lib/debug form of debug support. Signed-off-by: Mark Stapp --- staticd/static_debug.c | 124 +++++++++++++++++++++++++++++++++++++++++ staticd/static_debug.h | 73 ++++++++++++++++++++++++ staticd/static_main.c | 2 + staticd/static_vty.c | 36 ++++++++++-- staticd/subdir.am | 2 + 5 files changed, 233 insertions(+), 4 deletions(-) create mode 100644 staticd/static_debug.c create mode 100644 staticd/static_debug.h diff --git a/staticd/static_debug.c b/staticd/static_debug.c new file mode 100644 index 0000000000..9906e805a7 --- /dev/null +++ b/staticd/static_debug.c @@ -0,0 +1,124 @@ +/* + * Staticd debug related functions + * Copyright (C) 2019 Volta Networks Inc. + * Mark Stapp + * + * This file is part of Free Range Routing (FRR). + * + * This program 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. + * + * This program 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 + +#include "lib/command.h" +#include "lib/debug.h" + +#include "static_debug.h" + +/* + * Debug infra: a debug struct for each category, and a corresponding + * string. + */ + +/* clang-format off */ +struct debug static_dbg_events = {0, "Staticd events"}; + +struct debug *static_debug_arr[] = { + &static_dbg_events +}; + +const char *static_debugs_conflines[] = { + "debug static events" +}; +/* clang-format on */ + + +/* + * Set or unset all staticd debugs + * + * flags + * The flags to set + * + * set + * Whether to set or unset the specified flags + */ +static void static_debug_set_all(uint32_t flags, bool set) +{ + for (unsigned int i = 0; i < array_size(static_debug_arr); i++) { + DEBUG_FLAGS_SET(static_debug_arr[i], flags, set); + + /* if all modes have been turned off, don't preserve options */ + if (!DEBUG_MODE_CHECK(static_debug_arr[i], DEBUG_MODE_ALL)) + DEBUG_CLEAR(static_debug_arr[i]); + } +} + +static int static_debug_config_write_helper(struct vty *vty, bool config) +{ + uint32_t mode = DEBUG_MODE_ALL; + + if (config) + mode = DEBUG_MODE_CONF; + + for (unsigned int i = 0; i < array_size(static_debug_arr); i++) + if (DEBUG_MODE_CHECK(static_debug_arr[i], mode)) + vty_out(vty, "%s\n", static_debugs_conflines[i]); + + return 0; +} + +int static_config_write_debug(struct vty *vty) +{ + return static_debug_config_write_helper(vty, true); +} + +int static_debug_status_write(struct vty *vty) +{ + return static_debug_config_write_helper(vty, false); +} + +/* + * Set debugging status. + * + * vtynode + * vty->node + * + * onoff + * Whether to turn the specified debugs on or off + * + * events + * Debug general internal events + * + */ +void static_debug_set(int vtynode, bool onoff, bool events) +{ + uint32_t mode = DEBUG_NODE2MODE(vtynode); + + if (events) + DEBUG_MODE_SET(&static_dbg_events, mode, onoff); +} + +/* + * Debug lib initialization + */ + +struct debug_callbacks static_dbg_cbs = { + .debug_set_all = static_debug_set_all +}; + +void static_debug_init(void) +{ + debug_init(&static_dbg_cbs); +} diff --git a/staticd/static_debug.h b/staticd/static_debug.h new file mode 100644 index 0000000000..6e58118ed0 --- /dev/null +++ b/staticd/static_debug.h @@ -0,0 +1,73 @@ +/* + * Staticd debug related functions + * Copyright (C) 2019 Volta Networks Inc. + * Mark Stapp + * + * This file is part of Free Range Routing (FRR). + * + * 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 + */ + +#ifndef _STATIC_DEBUG_H +#define _STATIC_DEBUG_H + + +#include + +#include "lib/debug.h" + +/* staticd debugging records */ +struct debug static_dbg_events; + +/* + * Initialize staticd debugging. + * + * Installs VTY commands and registers callbacks. + */ +void static_debug_init(void); + +/* + * Print staticd debugging configuration. + * + * vty + * VTY to print debugging configuration to. + */ +int static_config_write_debug(struct vty *vty); + +/* + * Print staticd debugging configuration, human readable form. + * + * vty + * VTY to print debugging configuration to. + */ +int static_debug_status_write(struct vty *vty); + +/* + * Set debugging status. + * + * vtynode + * vty->node + * + * onoff + * Whether to turn the specified debugs on or off + * + * events + * Debug general internal events + * + */ +void static_debug_set(int vtynode, bool onoff, bool events); + + +#endif /* _STATIC_DEBUG_H */ diff --git a/staticd/static_main.c b/staticd/static_main.c index 18cb9638c9..43cb7db51d 100644 --- a/staticd/static_main.c +++ b/staticd/static_main.c @@ -36,6 +36,7 @@ #include "static_vty.h" #include "static_routes.h" #include "static_zebra.h" +#include "static_debug.h" char backup_config_file[256]; @@ -141,6 +142,7 @@ int main(int argc, char **argv, char **envp) master = frr_init(); access_list_init(); + static_debug_init(); static_vrf_init(); static_zebra_init(); diff --git a/staticd/static_vty.c b/staticd/static_vty.c index 8db37589af..6390fd811f 100644 --- a/staticd/static_vty.c +++ b/staticd/static_vty.c @@ -32,9 +32,13 @@ #include "static_memory.h" #include "static_vty.h" #include "static_routes.h" +#include "static_debug.h" #ifndef VTYSH_EXTRACT_PL #include "staticd/static_vty_clippy.c" #endif + +#define STATICD_STR "Static route daemon\n" + static struct static_vrf *static_vty_get_unknown_vrf(struct vty *vty, const char *vrf_name) { @@ -1439,21 +1443,43 @@ DEFPY(ipv6_route_vrf, from_str, gate_str, ifname, flag, tag_str, distance_str, label, table_str, false); } +DEFPY(debug_staticd, + debug_staticd_cmd, + "[no] debug static [{events$events}]", + NO_STR + DEBUG_STR + STATICD_STR + "Debug events\n") +{ + /* If no specific category, change all */ + if (strmatch(argv[argc - 1]->text, "static")) + static_debug_set(vty->node, !no, true); + else + static_debug_set(vty->node, !no, !!events); -DEFUN_NOSH (show_debugging_staticd, - show_debugging_staticd_cmd, + return CMD_SUCCESS; +} + +DEFUN_NOSH (show_debugging_static, + show_debugging_static_cmd, "show debugging [static]", SHOW_STR DEBUG_STR "Static Information\n") { - vty_out(vty, "Static debugging status\n"); + vty_out(vty, "Staticd debugging status\n"); + + static_debug_status_write(vty); return CMD_SUCCESS; } +static struct cmd_node debug_node = {DEBUG_NODE, "", 1}; + void static_vty_init(void) { + install_node(&debug_node, static_config_write_debug); + install_element(CONFIG_NODE, &ip_mroute_dist_cmd); install_element(CONFIG_NODE, &ip_route_blackhole_cmd); @@ -1470,7 +1496,9 @@ void static_vty_init(void) install_element(CONFIG_NODE, &ipv6_route_cmd); install_element(VRF_NODE, &ipv6_route_vrf_cmd); - install_element(VIEW_NODE, &show_debugging_staticd_cmd); + install_element(VIEW_NODE, &show_debugging_static_cmd); + install_element(VIEW_NODE, &debug_staticd_cmd); + install_element(CONFIG_NODE, &debug_staticd_cmd); static_list = list_new(); static_list->cmp = (int (*)(void *, void *))static_list_compare; diff --git a/staticd/subdir.am b/staticd/subdir.am index 17c4536fe9..1e5a7613cb 100644 --- a/staticd/subdir.am +++ b/staticd/subdir.am @@ -11,6 +11,7 @@ man8 += $(MANBUILD)/staticd.8 endif staticd_libstatic_a_SOURCES = \ + staticd/static_debug.c \ staticd/static_memory.c \ staticd/static_nht.c \ staticd/static_routes.c \ @@ -20,6 +21,7 @@ staticd_libstatic_a_SOURCES = \ # end noinst_HEADERS += \ + staticd/static_debug.h \ staticd/static_memory.h \ staticd/static_nht.h \ staticd/static_zebra.h \ -- 2.39.5