]> git.proxmox.com Git - mirror_frr.git/blob - zebra/debug.c
*: make consistent & update GPLv2 file headers
[mirror_frr.git] / zebra / debug.c
1 /*
2 * Zebra debug related function
3 * Copyright (C) 1999 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 along
18 * with this program; see the file COPYING; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22 #include <zebra.h>
23 #include "command.h"
24 #include "debug.h"
25
26 /* For debug statement. */
27 unsigned long zebra_debug_event;
28 unsigned long zebra_debug_packet;
29 unsigned long zebra_debug_kernel;
30 unsigned long zebra_debug_rib;
31 unsigned long zebra_debug_fpm;
32 unsigned long zebra_debug_nht;
33 unsigned long zebra_debug_mpls;
34
35 DEFUN (show_debugging_zebra,
36 show_debugging_zebra_cmd,
37 "show debugging zebra",
38 SHOW_STR
39 "Debugging information\n"
40 "Zebra configuration\n")
41 {
42 vty_out (vty, "Zebra debugging status:%s", VTY_NEWLINE);
43
44 if (IS_ZEBRA_DEBUG_EVENT)
45 vty_out (vty, " Zebra event debugging is on%s", VTY_NEWLINE);
46
47 if (IS_ZEBRA_DEBUG_PACKET)
48 {
49 if (IS_ZEBRA_DEBUG_SEND && IS_ZEBRA_DEBUG_RECV)
50 {
51 vty_out (vty, " Zebra packet%s debugging is on%s",
52 IS_ZEBRA_DEBUG_DETAIL ? " detail" : "",
53 VTY_NEWLINE);
54 }
55 else
56 {
57 if (IS_ZEBRA_DEBUG_SEND)
58 vty_out (vty, " Zebra packet send%s debugging is on%s",
59 IS_ZEBRA_DEBUG_DETAIL ? " detail" : "",
60 VTY_NEWLINE);
61 else
62 vty_out (vty, " Zebra packet receive%s debugging is on%s",
63 IS_ZEBRA_DEBUG_DETAIL ? " detail" : "",
64 VTY_NEWLINE);
65 }
66 }
67
68 if (IS_ZEBRA_DEBUG_KERNEL)
69 vty_out (vty, " Zebra kernel debugging is on%s", VTY_NEWLINE);
70 if (IS_ZEBRA_DEBUG_KERNEL_MSGDUMP_SEND)
71 vty_out (vty, " Zebra kernel netlink message dumps (send) are on%s", VTY_NEWLINE);
72 if (IS_ZEBRA_DEBUG_KERNEL_MSGDUMP_RECV)
73 vty_out (vty, " Zebra kernel netlink message dumps (recv) are on%s", VTY_NEWLINE);
74
75 /* Check here using flags as the 'macro' does an OR */
76 if (CHECK_FLAG (zebra_debug_rib, ZEBRA_DEBUG_RIB))
77 vty_out (vty, " Zebra RIB debugging is on%s", VTY_NEWLINE);
78 if (CHECK_FLAG (zebra_debug_rib, ZEBRA_DEBUG_RIB_DETAILED))
79 vty_out (vty, " Zebra RIB detailed debugging is on%s", VTY_NEWLINE);
80
81 if (IS_ZEBRA_DEBUG_FPM)
82 vty_out (vty, " Zebra FPM debugging is on%s", VTY_NEWLINE);
83 if (IS_ZEBRA_DEBUG_NHT)
84 vty_out (vty, " Zebra next-hop tracking debugging is on%s", VTY_NEWLINE);
85 if (IS_ZEBRA_DEBUG_MPLS)
86 vty_out (vty, " Zebra MPLS debugging is on%s", VTY_NEWLINE);
87
88 return CMD_SUCCESS;
89 }
90
91 DEFUN (debug_zebra_events,
92 debug_zebra_events_cmd,
93 "debug zebra events",
94 DEBUG_STR
95 "Zebra configuration\n"
96 "Debug option set for zebra events\n")
97 {
98 zebra_debug_event = ZEBRA_DEBUG_EVENT;
99 return CMD_WARNING;
100 }
101
102 DEFUN (debug_zebra_nht,
103 debug_zebra_nht_cmd,
104 "debug zebra nht",
105 DEBUG_STR
106 "Zebra configuration\n"
107 "Debug option set for zebra next hop tracking\n")
108 {
109 zebra_debug_nht = ZEBRA_DEBUG_NHT;
110 return CMD_WARNING;
111 }
112
113 DEFUN (debug_zebra_mpls,
114 debug_zebra_mpls_cmd,
115 "debug zebra mpls",
116 DEBUG_STR
117 "Zebra configuration\n"
118 "Debug option set for zebra MPLS LSPs\n")
119 {
120 zebra_debug_mpls = ZEBRA_DEBUG_MPLS;
121 return CMD_WARNING;
122 }
123
124 DEFUN (debug_zebra_packet,
125 debug_zebra_packet_cmd,
126 "debug zebra packet [<recv|send>] [detail]",
127 DEBUG_STR
128 "Zebra configuration\n"
129 "Debug option set for zebra packet\n"
130 "Debug option set for receive packet\n"
131 "Debug option set for send packet\n"
132 "Debug option set for detailed info\n")
133 {
134 int idx = 0;
135 zebra_debug_packet = ZEBRA_DEBUG_PACKET;
136
137 if (argv_find (argv, argc, "send", &idx))
138 SET_FLAG(zebra_debug_packet, ZEBRA_DEBUG_SEND);
139 idx = 0;
140 if (argv_find (argv, argc, "recv", &idx))
141 SET_FLAG(zebra_debug_packet, ZEBRA_DEBUG_RECV);
142 idx = 0;
143 if (argv_find (argv, argc, "detail", &idx))
144 SET_FLAG(zebra_debug_packet, ZEBRA_DEBUG_DETAIL);
145
146 if (!(zebra_debug_packet & ZEBRA_DEBUG_SEND & ZEBRA_DEBUG_RECV))
147 {
148 SET_FLAG(zebra_debug_packet, ZEBRA_DEBUG_SEND);
149 SET_FLAG(zebra_debug_packet, ZEBRA_DEBUG_RECV);
150 }
151 return CMD_SUCCESS;
152 }
153
154 DEFUN (debug_zebra_kernel,
155 debug_zebra_kernel_cmd,
156 "debug zebra kernel",
157 DEBUG_STR
158 "Zebra configuration\n"
159 "Debug option set for zebra between kernel interface\n")
160 {
161 SET_FLAG(zebra_debug_kernel, ZEBRA_DEBUG_KERNEL);
162 return CMD_SUCCESS;
163 }
164
165 DEFUN (debug_zebra_kernel_msgdump,
166 debug_zebra_kernel_msgdump_cmd,
167 "debug zebra kernel msgdump [<recv|send>]",
168 DEBUG_STR
169 "Zebra configuration\n"
170 "Debug option set for zebra between kernel interface\n"
171 "Dump raw netlink messages, sent and received\n"
172 "Dump raw netlink messages received\n"
173 "Dump raw netlink messages sent\n")
174 {
175 int idx = 0;
176 if (argc == 4 || argv_find (argv, argc, "recv", &idx))
177 SET_FLAG(zebra_debug_kernel, ZEBRA_DEBUG_KERNEL_MSGDUMP_RECV);
178 if (argc == 4 || argv_find (argv, argc, "send", &idx))
179 SET_FLAG(zebra_debug_kernel, ZEBRA_DEBUG_KERNEL_MSGDUMP_SEND);
180
181 return CMD_SUCCESS;
182 }
183
184 DEFUN (debug_zebra_rib,
185 debug_zebra_rib_cmd,
186 "debug zebra rib",
187 DEBUG_STR
188 "Zebra configuration\n"
189 "Debug RIB events\n")
190 {
191 SET_FLAG (zebra_debug_rib, ZEBRA_DEBUG_RIB);
192 return CMD_SUCCESS;
193 }
194
195 DEFUN (debug_zebra_rib_detailed,
196 debug_zebra_rib_detailed_cmd,
197 "debug zebra rib detailed",
198 DEBUG_STR
199 "Zebra configuration\n"
200 "Debug RIB events\n"
201 "Detailed debugs\n")
202 {
203 SET_FLAG (zebra_debug_rib, ZEBRA_DEBUG_RIB_DETAILED);
204 return CMD_SUCCESS;
205 }
206
207 DEFUN (debug_zebra_fpm,
208 debug_zebra_fpm_cmd,
209 "debug zebra fpm",
210 DEBUG_STR
211 "Zebra configuration\n"
212 "Debug zebra FPM events\n")
213 {
214 SET_FLAG (zebra_debug_fpm, ZEBRA_DEBUG_FPM);
215 return CMD_SUCCESS;
216 }
217
218 DEFUN (no_debug_zebra_events,
219 no_debug_zebra_events_cmd,
220 "no debug zebra events",
221 NO_STR
222 DEBUG_STR
223 "Zebra configuration\n"
224 "Debug option set for zebra events\n")
225 {
226 zebra_debug_event = 0;
227 return CMD_SUCCESS;
228 }
229
230 DEFUN (no_debug_zebra_nht,
231 no_debug_zebra_nht_cmd,
232 "no debug zebra nht",
233 NO_STR
234 DEBUG_STR
235 "Zebra configuration\n"
236 "Debug option set for zebra next hop tracking\n")
237 {
238 zebra_debug_nht = 0;
239 return CMD_SUCCESS;
240 }
241
242 DEFUN (no_debug_zebra_mpls,
243 no_debug_zebra_mpls_cmd,
244 "no debug zebra mpls",
245 NO_STR
246 DEBUG_STR
247 "Zebra configuration\n"
248 "Debug option set for zebra MPLS LSPs\n")
249 {
250 zebra_debug_mpls = 0;
251 return CMD_SUCCESS;
252 }
253
254 DEFUN (no_debug_zebra_packet,
255 no_debug_zebra_packet_cmd,
256 "no debug zebra packet [<recv|send>]",
257 NO_STR
258 DEBUG_STR
259 "Zebra configuration\n"
260 "Debug option set for zebra packet\n"
261 "Debug option set for receive packet\n"
262 "Debug option set for send packet\n")
263 {
264 int idx = 0;
265 if (argc == 4 || argv_find (argv, argc, "send", &idx))
266 UNSET_FLAG(zebra_debug_packet, ZEBRA_DEBUG_SEND);
267 if (argc == 4 || argv_find (argv, argc, "recv", &idx))
268 UNSET_FLAG(zebra_debug_packet, ZEBRA_DEBUG_RECV);
269 return CMD_SUCCESS;
270 }
271
272 DEFUN (no_debug_zebra_kernel,
273 no_debug_zebra_kernel_cmd,
274 "no debug zebra kernel",
275 NO_STR
276 DEBUG_STR
277 "Zebra configuration\n"
278 "Debug option set for zebra between kernel interface\n")
279 {
280 UNSET_FLAG(zebra_debug_kernel, ZEBRA_DEBUG_KERNEL);
281 return CMD_SUCCESS;
282 }
283
284 DEFUN (no_debug_zebra_kernel_msgdump,
285 no_debug_zebra_kernel_msgdump_cmd,
286 "no debug zebra kernel msgdump [<recv|send>]",
287 NO_STR
288 DEBUG_STR
289 "Zebra configuration\n"
290 "Debug option set for zebra between kernel interface\n"
291 "Dump raw netlink messages, sent and received\n"
292 "Dump raw netlink messages received\n"
293 "Dump raw netlink messages sent\n")
294 {
295 int idx = 0;
296 if (argc == 5 || argv_find (argv, argc, "recv", &idx))
297 UNSET_FLAG(zebra_debug_kernel, ZEBRA_DEBUG_KERNEL_MSGDUMP_RECV);
298 if (argc == 5 || argv_find (argv, argc, "send", &idx))
299 UNSET_FLAG(zebra_debug_kernel, ZEBRA_DEBUG_KERNEL_MSGDUMP_SEND);
300
301 return CMD_SUCCESS;
302 }
303
304 DEFUN (no_debug_zebra_rib,
305 no_debug_zebra_rib_cmd,
306 "no debug zebra rib",
307 NO_STR
308 DEBUG_STR
309 "Zebra configuration\n"
310 "Debug zebra RIB\n")
311 {
312 zebra_debug_rib = 0;
313 return CMD_SUCCESS;
314 }
315
316 DEFUN (no_debug_zebra_rib_detailed,
317 no_debug_zebra_rib_detailed_cmd,
318 "no debug zebra rib detailed",
319 NO_STR
320 DEBUG_STR
321 "Zebra configuration\n"
322 "Debug zebra RIB\n"
323 "Detailed debugs\n")
324 {
325 UNSET_FLAG (zebra_debug_rib, ZEBRA_DEBUG_RIB_DETAILED);
326 return CMD_SUCCESS;
327 }
328
329 DEFUN (no_debug_zebra_fpm,
330 no_debug_zebra_fpm_cmd,
331 "no debug zebra fpm",
332 NO_STR
333 DEBUG_STR
334 "Zebra configuration\n"
335 "Debug zebra FPM events\n")
336 {
337 zebra_debug_fpm = 0;
338 return CMD_SUCCESS;
339 }
340
341 /* Debug node. */
342 struct cmd_node debug_node =
343 {
344 DEBUG_NODE,
345 "", /* Debug node has no interface. */
346 1
347 };
348
349 static int
350 config_write_debug (struct vty *vty)
351 {
352 int write = 0;
353
354 if (IS_ZEBRA_DEBUG_EVENT)
355 {
356 vty_out (vty, "debug zebra events%s", VTY_NEWLINE);
357 write++;
358 }
359 if (IS_ZEBRA_DEBUG_PACKET)
360 {
361 if (IS_ZEBRA_DEBUG_SEND && IS_ZEBRA_DEBUG_RECV)
362 {
363 vty_out (vty, "debug zebra packet%s%s",
364 IS_ZEBRA_DEBUG_DETAIL ? " detail" : "",
365 VTY_NEWLINE);
366 write++;
367 }
368 else
369 {
370 if (IS_ZEBRA_DEBUG_SEND)
371 vty_out (vty, "debug zebra packet send%s%s",
372 IS_ZEBRA_DEBUG_DETAIL ? " detail" : "",
373 VTY_NEWLINE);
374 else
375 vty_out (vty, "debug zebra packet recv%s%s",
376 IS_ZEBRA_DEBUG_DETAIL ? " detail" : "",
377 VTY_NEWLINE);
378 write++;
379 }
380 }
381 if (IS_ZEBRA_DEBUG_KERNEL)
382 {
383 vty_out (vty, "debug zebra kernel%s", VTY_NEWLINE);
384 write++;
385 }
386 if (IS_ZEBRA_DEBUG_KERNEL_MSGDUMP_RECV)
387 {
388 vty_out (vty, "debug zebra kernel msgdump recv%s", VTY_NEWLINE);
389 write++;
390 }
391 if (IS_ZEBRA_DEBUG_KERNEL_MSGDUMP_SEND)
392 {
393 vty_out (vty, "debug zebra kernel msgdump send%s", VTY_NEWLINE);
394 write++;
395 }
396 /* Check here using flags as the 'macro' does an OR */
397 if (CHECK_FLAG (zebra_debug_rib, ZEBRA_DEBUG_RIB))
398 {
399 vty_out (vty, "debug zebra rib%s", VTY_NEWLINE);
400 write++;
401 }
402 if (CHECK_FLAG (zebra_debug_rib, ZEBRA_DEBUG_RIB_DETAILED))
403 {
404 vty_out (vty, "debug zebra rib detailed%s", VTY_NEWLINE);
405 write++;
406 }
407 if (IS_ZEBRA_DEBUG_FPM)
408 {
409 vty_out (vty, "debug zebra fpm%s", VTY_NEWLINE);
410 write++;
411 }
412 if (IS_ZEBRA_DEBUG_NHT)
413 {
414 vty_out (vty, "debug zebra nht%s", VTY_NEWLINE);
415 write++;
416 }
417 if (IS_ZEBRA_DEBUG_MPLS)
418 {
419 vty_out (vty, "debug zebra mpls%s", VTY_NEWLINE);
420 write++;
421 }
422 return write;
423 }
424
425 void
426 zebra_debug_init (void)
427 {
428 zebra_debug_event = 0;
429 zebra_debug_packet = 0;
430 zebra_debug_kernel = 0;
431 zebra_debug_rib = 0;
432 zebra_debug_fpm = 0;
433 zebra_debug_mpls = 0;
434
435 install_node (&debug_node, config_write_debug);
436
437 install_element (VIEW_NODE, &show_debugging_zebra_cmd);
438
439 install_element (ENABLE_NODE, &debug_zebra_events_cmd);
440 install_element (ENABLE_NODE, &debug_zebra_nht_cmd);
441 install_element (ENABLE_NODE, &debug_zebra_mpls_cmd);
442 install_element (ENABLE_NODE, &debug_zebra_packet_cmd);
443 install_element (ENABLE_NODE, &debug_zebra_kernel_cmd);
444 install_element (ENABLE_NODE, &debug_zebra_kernel_msgdump_cmd);
445 install_element (ENABLE_NODE, &debug_zebra_rib_cmd);
446 install_element (ENABLE_NODE, &debug_zebra_rib_detailed_cmd);
447 install_element (ENABLE_NODE, &debug_zebra_fpm_cmd);
448 install_element (ENABLE_NODE, &no_debug_zebra_events_cmd);
449 install_element (ENABLE_NODE, &no_debug_zebra_nht_cmd);
450 install_element (ENABLE_NODE, &no_debug_zebra_mpls_cmd);
451 install_element (ENABLE_NODE, &no_debug_zebra_packet_cmd);
452 install_element (ENABLE_NODE, &no_debug_zebra_kernel_cmd);
453 install_element (ENABLE_NODE, &no_debug_zebra_kernel_msgdump_cmd);
454 install_element (ENABLE_NODE, &no_debug_zebra_rib_cmd);
455 install_element (ENABLE_NODE, &no_debug_zebra_rib_detailed_cmd);
456 install_element (ENABLE_NODE, &no_debug_zebra_fpm_cmd);
457
458 install_element (CONFIG_NODE, &debug_zebra_events_cmd);
459 install_element (CONFIG_NODE, &debug_zebra_nht_cmd);
460 install_element (CONFIG_NODE, &debug_zebra_mpls_cmd);
461 install_element (CONFIG_NODE, &debug_zebra_packet_cmd);
462 install_element (CONFIG_NODE, &debug_zebra_kernel_cmd);
463 install_element (CONFIG_NODE, &debug_zebra_kernel_msgdump_cmd);
464 install_element (CONFIG_NODE, &debug_zebra_rib_cmd);
465 install_element (CONFIG_NODE, &debug_zebra_rib_detailed_cmd);
466 install_element (CONFIG_NODE, &debug_zebra_fpm_cmd);
467 install_element (CONFIG_NODE, &no_debug_zebra_events_cmd);
468 install_element (CONFIG_NODE, &no_debug_zebra_nht_cmd);
469 install_element (CONFIG_NODE, &no_debug_zebra_mpls_cmd);
470 install_element (CONFIG_NODE, &no_debug_zebra_packet_cmd);
471 install_element (CONFIG_NODE, &no_debug_zebra_kernel_cmd);
472 install_element (CONFIG_NODE, &no_debug_zebra_kernel_msgdump_cmd);
473 install_element (CONFIG_NODE, &no_debug_zebra_rib_cmd);
474 install_element (CONFIG_NODE, &no_debug_zebra_rib_detailed_cmd);
475 install_element (CONFIG_NODE, &no_debug_zebra_fpm_cmd);
476 }