1/*
2 * RIPng debug output routines
3 * Copyright (C) 1998 Kunihiro Ishiguro
4 *
5 * This file is part of GNU Zebra.
6 *
7 * GNU Zebra is free software; you can redistribute it and/or modify it
8 * under the terms of the GNU General Public License as published by the
9 * Free Software Foundation; either version 2, or (at your option) any
10 * later version.
11 *
12 * GNU Zebra is distributed in the hope that it will be useful, but
13 * WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 * General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with GNU Zebra; see the file COPYING.  If not, write to the Free
19 * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
20 * 02111-1307, USA.
21 */
22
23#include <zebra.h>
24#include "command.h"
25#include "ripngd/ripng_debug.h"
26
27/* For debug statement. */
28unsigned long ripng_debug_event = 0;
29unsigned long ripng_debug_packet = 0;
30unsigned long ripng_debug_zebra = 0;
31
32DEFUN (show_debugging_ripng,
33       show_debugging_ripng_cmd,
34       "show debugging ripng",
35       SHOW_STR
36       "RIPng configuration\n"
37       "Debugging information\n")
38{
39  vty_out (vty, "Zebra debugging status:%s", VTY_NEWLINE);
40
41  if (IS_RIPNG_DEBUG_EVENT)
42    vty_out (vty, "  RIPng event debugging is on%s", VTY_NEWLINE);
43
44  if (IS_RIPNG_DEBUG_PACKET)
45    {
46      if (IS_RIPNG_DEBUG_SEND && IS_RIPNG_DEBUG_RECV)
47	{
48	  vty_out (vty, "  RIPng packet%s debugging is on%s",
49		   IS_RIPNG_DEBUG_DETAIL ? " detail" : "",
50		   VTY_NEWLINE);
51	}
52      else
53	{
54	  if (IS_RIPNG_DEBUG_SEND)
55	    vty_out (vty, "  RIPng packet send%s debugging is on%s",
56		     IS_RIPNG_DEBUG_DETAIL ? " detail" : "",
57		     VTY_NEWLINE);
58	  else
59	    vty_out (vty, "  RIPng packet receive%s debugging is on%s",
60		     IS_RIPNG_DEBUG_DETAIL ? " detail" : "",
61		     VTY_NEWLINE);
62	}
63    }
64
65  if (IS_RIPNG_DEBUG_ZEBRA)
66    vty_out (vty, "  RIPng zebra debugging is on%s", VTY_NEWLINE);
67
68  return CMD_SUCCESS;
69}
70
71DEFUN (debug_ripng_events,
72       debug_ripng_events_cmd,
73       "debug ripng events",
74       DEBUG_STR
75       "RIPng configuration\n"
76       "Debug option set for ripng events\n")
77{
78  ripng_debug_event = RIPNG_DEBUG_EVENT;
79  return CMD_WARNING;
80}
81
82DEFUN (debug_ripng_packet,
83       debug_ripng_packet_cmd,
84       "debug ripng packet",
85       DEBUG_STR
86       "RIPng configuration\n"
87       "Debug option set for ripng packet\n")
88{
89  ripng_debug_packet = RIPNG_DEBUG_PACKET;
90  ripng_debug_packet |= RIPNG_DEBUG_SEND;
91  ripng_debug_packet |= RIPNG_DEBUG_RECV;
92  return CMD_SUCCESS;
93}
94
95DEFUN (debug_ripng_packet_direct,
96       debug_ripng_packet_direct_cmd,
97       "debug ripng packet (recv|send)",
98       DEBUG_STR
99       "RIPng configuration\n"
100       "Debug option set for ripng packet\n"
101       "Debug option set for receive packet\n"
102       "Debug option set for send packet\n")
103{
104  ripng_debug_packet |= RIPNG_DEBUG_PACKET;
105  if (strncmp ("send", argv[0], strlen (argv[0])) == 0)
106    ripng_debug_packet |= RIPNG_DEBUG_SEND;
107  if (strncmp ("recv", argv[0], strlen (argv[0])) == 0)
108    ripng_debug_packet |= RIPNG_DEBUG_RECV;
109  ripng_debug_packet &= ~RIPNG_DEBUG_DETAIL;
110  return CMD_SUCCESS;
111}
112
113DEFUN (debug_ripng_packet_detail,
114       debug_ripng_packet_detail_cmd,
115       "debug ripng packet (recv|send) detail",
116       DEBUG_STR
117       "RIPng configuration\n"
118       "Debug option set for ripng packet\n"
119       "Debug option set for receive packet\n"
120       "Debug option set for send packet\n"
121       "Debug option set detaied information\n")
122{
123  ripng_debug_packet |= RIPNG_DEBUG_PACKET;
124  if (strncmp ("send", argv[0], strlen (argv[0])) == 0)
125    ripng_debug_packet |= RIPNG_DEBUG_SEND;
126  if (strncmp ("recv", argv[0], strlen (argv[0])) == 0)
127    ripng_debug_packet |= RIPNG_DEBUG_RECV;
128  ripng_debug_packet |= RIPNG_DEBUG_DETAIL;
129  return CMD_SUCCESS;
130}
131
132DEFUN (debug_ripng_zebra,
133       debug_ripng_zebra_cmd,
134       "debug ripng zebra",
135       DEBUG_STR
136       "RIPng configuration\n"
137       "Debug option set for ripng and zebra communication\n")
138{
139  ripng_debug_zebra = RIPNG_DEBUG_ZEBRA;
140  return CMD_WARNING;
141}
142
143DEFUN (no_debug_ripng_events,
144       no_debug_ripng_events_cmd,
145       "no debug ripng events",
146       NO_STR
147       DEBUG_STR
148       "RIPng configuration\n"
149       "Debug option set for ripng events\n")
150{
151  ripng_debug_event = 0;
152  return CMD_SUCCESS;
153}
154
155DEFUN (no_debug_ripng_packet,
156       no_debug_ripng_packet_cmd,
157       "no debug ripng packet",
158       NO_STR
159       DEBUG_STR
160       "RIPng configuration\n"
161       "Debug option set for ripng packet\n")
162{
163  ripng_debug_packet = 0;
164  return CMD_SUCCESS;
165}
166
167DEFUN (no_debug_ripng_packet_direct,
168       no_debug_ripng_packet_direct_cmd,
169       "no debug ripng packet (recv|send)",
170       NO_STR
171       DEBUG_STR
172       "RIPng configuration\n"
173       "Debug option set for ripng packet\n"
174       "Debug option set for receive packet\n"
175       "Debug option set for send packet\n")
176{
177  if (strncmp ("send", argv[0], strlen (argv[0])) == 0)
178    {
179      if (IS_RIPNG_DEBUG_RECV)
180       ripng_debug_packet &= ~RIPNG_DEBUG_SEND;
181      else
182       ripng_debug_packet = 0;
183    }
184  else if (strncmp ("recv", argv[0], strlen (argv[0])) == 0)
185    {
186      if (IS_RIPNG_DEBUG_SEND)
187       ripng_debug_packet &= ~RIPNG_DEBUG_RECV;
188      else
189       ripng_debug_packet = 0;
190    }
191  return CMD_SUCCESS;
192}
193
194DEFUN (no_debug_ripng_zebra,
195       no_debug_ripng_zebra_cmd,
196       "no debug ripng zebra",
197       NO_STR
198       DEBUG_STR
199       "RIPng configuration\n"
200       "Debug option set for ripng and zebra communication\n")
201{
202  ripng_debug_zebra = 0;
203  return CMD_WARNING;
204}
205
206/* Debug node. */
207struct cmd_node debug_node =
208{
209  DEBUG_NODE,
210  ""				/* Debug node has no interface. */
211};
212
213int
214config_write_debug (struct vty *vty)
215{
216  int write = 0;
217
218  if (IS_RIPNG_DEBUG_EVENT)
219    {
220      vty_out (vty, "debug ripng events%s", VTY_NEWLINE);
221      write++;
222    }
223  if (IS_RIPNG_DEBUG_PACKET)
224    {
225      if (IS_RIPNG_DEBUG_SEND && IS_RIPNG_DEBUG_RECV)
226	{
227	  vty_out (vty, "debug ripng packet%s%s",
228		   IS_RIPNG_DEBUG_DETAIL ? " detail" : "",
229		   VTY_NEWLINE);
230	  write++;
231	}
232      else
233	{
234	  if (IS_RIPNG_DEBUG_SEND)
235	    vty_out (vty, "debug ripng packet send%s%s",
236		     IS_RIPNG_DEBUG_DETAIL ? " detail" : "",
237		     VTY_NEWLINE);
238	  else
239	    vty_out (vty, "debug ripng packet recv%s%s",
240		     IS_RIPNG_DEBUG_DETAIL ? " detail" : "",
241		     VTY_NEWLINE);
242	  write++;
243	}
244    }
245  if (IS_RIPNG_DEBUG_ZEBRA)
246    {
247      vty_out (vty, "debug ripng zebra%s", VTY_NEWLINE);
248      write++;
249    }
250  return write;
251}
252
253void
254ripng_debug_reset ()
255{
256  ripng_debug_event = 0;
257  ripng_debug_packet = 0;
258  ripng_debug_zebra = 0;
259}
260
261void
262ripng_debug_init ()
263{
264  ripng_debug_event = 0;
265  ripng_debug_packet = 0;
266  ripng_debug_zebra = 0;
267
268  install_node (&debug_node, config_write_debug);
269
270  install_element (VIEW_NODE, &show_debugging_ripng_cmd);
271
272  install_element (ENABLE_NODE, &show_debugging_ripng_cmd);
273  install_element (ENABLE_NODE, &debug_ripng_events_cmd);
274  install_element (ENABLE_NODE, &debug_ripng_packet_cmd);
275  install_element (ENABLE_NODE, &debug_ripng_packet_direct_cmd);
276  install_element (ENABLE_NODE, &debug_ripng_packet_detail_cmd);
277  install_element (ENABLE_NODE, &debug_ripng_zebra_cmd);
278  install_element (ENABLE_NODE, &no_debug_ripng_events_cmd);
279  install_element (ENABLE_NODE, &no_debug_ripng_packet_cmd);
280  install_element (ENABLE_NODE, &no_debug_ripng_packet_direct_cmd);
281  install_element (ENABLE_NODE, &no_debug_ripng_zebra_cmd);
282
283  install_element (CONFIG_NODE, &debug_ripng_events_cmd);
284  install_element (CONFIG_NODE, &debug_ripng_packet_cmd);
285  install_element (CONFIG_NODE, &debug_ripng_packet_direct_cmd);
286  install_element (CONFIG_NODE, &debug_ripng_packet_detail_cmd);
287  install_element (CONFIG_NODE, &debug_ripng_zebra_cmd);
288  install_element (CONFIG_NODE, &no_debug_ripng_events_cmd);
289  install_element (CONFIG_NODE, &no_debug_ripng_packet_cmd);
290  install_element (CONFIG_NODE, &no_debug_ripng_packet_direct_cmd);
291  install_element (CONFIG_NODE, &no_debug_ripng_zebra_cmd);
292}
293